import React, { useState } from 'react'; import { StatusColorEnum } from '@/components/BadgeStatus'; import { Ellipsis, TableCard } from '@/components'; import '@/style/common.less'; import '../../index.less'; import styles from './index.less'; import type { SceneItem } from '@/pages/rule-engine/Scene/typings'; import { CheckOutlined, DownOutlined, UpOutlined } from '@ant-design/icons'; import classNames from 'classnames'; import { ActionsType, BranchesThen } from '@/pages/rule-engine/Scene/typings'; import MyTooltip from './MyTooltip'; import { handleOptionsLabel } from '@/pages/rule-engine/Scene/Save/terms/paramsItem'; import { isArray } from 'lodash'; const imageMap = new Map(); imageMap.set('timer', require('/public/images/scene/scene-timer.png')); imageMap.set('manual', require('/public/images/scene/scene-hand.png')); imageMap.set('device', require('/public/images/scene/scene-device.png')); export const iconMap = new Map(); iconMap.set('timer', require('/public/images/scene/trigger-type-icon/timing.png')); iconMap.set('manual', require('/public/images/scene/trigger-type-icon/manual.png')); iconMap.set('device', require('/public/images/scene/trigger-type-icon/device.png')); // @ts-ignore export interface SceneCardProps extends SceneItem { detail?: React.ReactNode; tools?: React.ReactNode[]; avatarSize?: number; className?: string; onUnBind?: (e: any) => void; showBindBtn?: boolean; cardType?: 'bind' | 'unbind'; showTool?: boolean; onClick?: () => void; } export enum TriggerWayType { manual = '手动触发', timer = '定时触发', device = '设备触发', } enum UnitEnum { seconds = '秒', minutes = '分', hours = '小时', } const notifyRender = (data: ActionsType | undefined) => { switch (data?.notify?.notifyType) { case 'dingTalk': if (data?.options?.provider === 'dingTalkRobotWebHook') { return `通过群机器人消息发送${data?.options?.templateName || data?.notify?.templateId}`; } return `通过钉钉向${data?.options?.notifierName || data?.notify?.notifierId}发送${ data?.options?.templateName || data?.notify?.templateId }`; case 'weixin': return `通过微信向${data?.options?.sendTo || ''}${data?.options?.orgName || ''}${ data?.options?.tagName || '' }发送${data?.options?.templateName || data?.notify?.templateId}`; case 'email': return `通过邮件向${data?.options?.sendTo || ''}发送${ data?.options?.templateName || data?.notify?.templateId }`; case 'voice': return `通过语音向${data?.options?.sendTo || ''}发送 ${ data?.options?.templateName || data?.notify?.templateId }`; case 'sms': return `通过短信向${data?.options?.sendTo || ''}发送${ data?.options?.templateName || data?.notify?.templateId }`; case 'webhook': return `通过webhook发送${data?.options?.templateName || data?.notify?.templateId}`; default: return null; } }; const deviceRender = (data: ActionsType | undefined) => { switch (data?.device?.selector) { case 'fixed': return `${data?.options?.type}${data?.options?.name}${data?.options?.properties}`; case 'tag': let tags: string = ''; data.options?.taglist?.map((item: any) => { tags += item.type || '' + item.name || '' + item.value || ''; }); return `${ data?.options?.type + tags + data?.options?.productName + data?.options?.properties }`; case 'relation': return `${data?.options?.type}与${data?.options?.triggerName}具有相同${data?.options?.relationName}的${data?.options?.productName}设备的${data?.options?.properties}`; default: return null; } }; const actionRender = (action: ActionsType) => { switch (action?.executor) { case 'notify': return notifyRender(action); case 'delay': return `${action?.delay?.time}${UnitEnum[action?.delay?.unit || '']}后执行后续动作`; case 'device': return deviceRender(action); case 'alarm': if (action?.alarm?.mode === 'relieve') { return '满足条件后将解除关联此场景的告警'; } return '满足条件后将触发关联此场景的告警'; default: return null; } }; // 过滤器 const actionFilter = (terms: any, isLast: boolean, index: number) => { if (!Array.isArray(terms)) return ''; let str = `动作${index + 1} `; terms?.forEach((item: any, iindex: number) => { if (isArray(item.terms)) { item.terms.map((iItem: number, iIndex: number) => { const _isLast = iIndex < item.terms.length - 1; str += `${handleOptionsLabel(iItem, _isLast ? item.terms[iIndex + 1]?.[3] : undefined)}`; }); } str += iindex < terms.length - 1 ? terms[iindex + 1].termType : ''; }); return str; }; const conditionsRender = (when: any[], index: number) => { let whenStr: string = ''; if ( when.length && when[index] && (when[index]?.terms).length && when[index]?.terms[0]?.terms?.length ) { const terms = when[index]?.terms || []; const termsLength = terms.length; terms.map((termsItem: any, tIndex: number) => { const tLast = tIndex < termsLength - 1; let tSer = ''; if (termsItem.terms) { tSer = isArray(termsItem.terms) ? termsItem.terms .map((bTermItem: any, bIndex: number) => { const bLast = bIndex < termsItem.terms.length - 1; return handleOptionsLabel(bTermItem, bLast ? termsItem.terms[bIndex + 1]?.[3] : ''); }) .join('') : ''; whenStr += !tLast ? tSer : tSer + terms[tIndex + 1].termType; } }); return whenStr; } return whenStr; }; const branchesActionRender = (actions: any[]) => { if (actions && actions?.length) { const list = actions.slice(0, 3); return list.map((item, index) => { const isLast = index < actions.length - 1; return (