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';
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'));
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;
}
enum TriggerWayType {
manual = '手动触发',
timer = '定时触发',
device = '设备触发',
}
enum UnitEnum {
seconds = '秒',
minutes = '分',
hours = '小时',
}
const selectorRender = (obj: any) => {
switch (obj?.selector) {
case 'all':
return (
所有的{obj?.productId}
);
case 'fixed':
return (
设备
{(obj?.selectorValues || '').map((item: any) => item?.name).join(',')}
);
case 'org':
return (
部门
{(obj?.selectorValues || '').map((item: any) => item?.name).join(',')}
);
default:
return '';
}
};
const timerRender = (timer: any) => {
if (timer?.trigger && timer?.mod) {
const trigger = timer?.trigger;
const mod = timer?.mod;
const str: string = trigger === 'week' ? '星期' : trigger === 'month' ? '月' : timer?.cron;
if (mod === 'once') {
return `,每${str}${timer.when.join('/')},${timer?.once.time}执行一次`;
} else {
return `每${str}${timer.when.join('/')},${timer?.period?.from}-${timer?.period.to},每${
timer?.period.every
}${UnitEnum[timer?.period?.unit]}执行一次`;
}
}
return '';
};
const operatorRender = (operation: any) => {
switch (operation?.operator) {
case 'online':
return '上线';
case 'offline':
return '离线';
case 'reportEvent':
return `上报事件${operation?.options?.eventName}`;
case 'reportProperty':
return `上报属性${(operation?.options?.propertiesName || []).join(',')}`;
case 'readProperty':
return `读取属性${(operation?.options?.propertiesName || []).join(',')}`;
case 'writeProperty':
return `修改属性${(operation?.options?.propertiesName || []).join(',')}`;
case 'invokeFunction':
return `调用功能${operation?.options?.functionName}`;
default:
return '';
}
};
const notifyRender = (data: ActionsType | undefined) => {
switch (data?.notify?.notifyType) {
case 'dingTalk':
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?.calledNumber || ''}
通过语音发送
{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) => {
console.log(data);
switch (data?.device?.selector) {
case 'relation':
return (
{data?.options?.type || ''}
与【触发设备】具有相同【关系名称】的【产品名称】设备的【属性/功能】
);
case 'tag': //`【读取/设置/执行】【标签名称】为【标签值】【并且/或者】【标签名称】为【标签值】的【产品名称】【属性/功能】`
return (
{data?.options?.type || ''}
{data?.options?.deviceName || ''}
为
{data?.options?.productName || ''}
{data?.options?.propertyName || data?.options?.functionName || ''}
);
default:
return (
{data?.options?.type || ''}
{data?.options?.deviceName || ''}
{data?.options?.propertyName || data?.options?.functionName || ''}
);
}
};
const actionRender = (action: ActionsType, index: number) => {
switch (action?.executor) {
case 'notify':
return (
);
case 'delay':
return (
{action?.delay?.time}
{UnitEnum[action?.delay?.unit || '']}
后执行后续动作
);
case 'device':
return (
);
case 'alarm':
return (
);
default:
return null;
}
};
const conditionsRender = (when: any[], index: number) => {
if (when.length) {
return when[index];
}
return '';
};
const branchesActionRender = (actions: any[]) => {
if (actions && actions?.length) {
const list: any[] = [];
actions.map((item, index) => {
list.push(actionRender(item, index));
});
return list.map((item, index) => (
));
}
return '';
};
const ContentRender = (data: SceneCardProps) => {
const [visible, setVisible] = useState(false);
const type = data.triggerType;
if (
type === 'device' &&
(data.branches || [])?.length &&
Object.keys(data?.trigger?.device || {}).length
) {
const obj = data.trigger.device;
const operation: any = data.trigger.device?.operation;
return (
{selectorRender(obj)}
{operation ? (
{timerRender(operation?.timer)}
{operatorRender(operation)}
) : (
''
)}
{(visible ? data.branches || [] : (data?.branches || []).slice(0, 2)).map(
(item: any, index) => {
return (
{index === 0 ? '当' : '否则'}
{conditionsRender(data.options?.terms || [], index)}
{item.shakeLimit?.enabled && (
({item.shakeLimit?.time}秒内发生{item.shakeLimit?.threshold}
次以上时执行一次)
)}
{(item?.then || []).map((i: BranchesThen, _index: number) => (
{i.parallel ? '并行执行' : '串行执行'}
{branchesActionRender(Array.isArray(i?.actions) ? i?.actions : [])}
))}
);
},
)}
{(data?.branches || []).length > 1 && (
{
e.stopPropagation();
setVisible(!visible);
}}
>
展开更多{!visible ? : }
)}
);
} else if (type !== 'device' && data.actions?.length) {
return (
{data.actions?.length && (
执行
{(data?.actions || []).map((item: any, index) => {
return actionRender(item, index);
})}
)}
);
} else {
return 未配置规则
;
}
};
export const ExtraSceneCard = (props: SceneCardProps) => {
return (
})
{TriggerWayType[props.triggerType]}
);
};
export default (props: SceneCardProps) => {
return (
})
{TriggerWayType[props.triggerType]}
);
};