import { PageContainer } from '@ant-design/pro-layout'; import { Button, Card, Form, Input, InputNumber, Radio, Space, Switch, Tooltip } from 'antd'; import { useIntl } from 'umi'; import { useCallback, useEffect, useRef, useState } from 'react'; import { PermissionButton, TitleComponent } from '@/components'; import ActionItems from './action/action'; import { PlusOutlined, QuestionCircleOutlined } from '@ant-design/icons'; import { TimingTrigger, TriggerWay } from './components'; import { TriggerWayType } from './components/TriggerWay'; import TriggerTerm from '@/pages/rule-engine/Scene/TriggerTerm'; import TriggerDevice from './trigger'; import { service } from '../index'; import './index.less'; import { model } from '@formily/reactive'; import type { FormModelType } from '@/pages/rule-engine/Scene/typings'; import { onlyMessage } from '@/utils/util'; import Explanation from './Explanation'; import { getMenuPathByCode } from '@/utils/menu'; import { useLocation, useHistory } from '@/hooks'; type ShakeLimitType = { enabled: boolean; groupType?: string; time?: number; threshold?: number; alarmFirst?: boolean; }; const DefaultShakeLimit = { enabled: false, alarmFirst: false, }; export let FormModel = model({}); export default () => { const location = useLocation(); const [form] = Form.useForm(); const intl = useIntl(); const triggerRef = useRef(); const history = useHistory(); const { getOtherPermission } = PermissionButton.usePermission('rule-engine/Scene'); const [triggerType, setTriggerType] = useState('device'); const [loading, setLoading] = useState(false); const [parallel, setParallel] = useState(true); // 是否并行 const [shakeLimit, setShakeLimit] = useState(DefaultShakeLimit); const [requestParams, setRequestParams] = useState(undefined); const [triggerValue, setTriggerValue] = useState([]); const [triggerDatas, setTriggerDatas] = useState({}); const [actionParams, setActionParams] = useState(undefined); const [actionDataCount, setActionDataCount] = useState(0); const [actionsData, setActionsData] = useState([]); const [isEdit, setIsEdit] = useState(false); const [view, setView] = useState(false); useEffect(() => { FormModel = {}; }, []); const getDetail = useCallback( async (id: string) => { const resp = await service.detail(id); if (resp.status === 200 && resp.result) { setIsEdit(true); const _data: any = resp.result; FormModel = _data; form.setFieldsValue(_data); setParallel(_data.parallel); setTriggerValue({ trigger: _data.terms || [] }); setTriggerDatas(_data.trigger); setActionParams({ trigger: _data.trigger }); if (_data.trigger?.shakeLimit) { setShakeLimit(_data.trigger?.shakeLimit || DefaultShakeLimit); } if (_data.trigger?.device) { setRequestParams({ trigger: _data.trigger }); } if (_data.actions) { setActionsData(_data.actions); } } }, [triggerRef], ); useEffect(() => { const params = new URLSearchParams(location.search); const id = params.get('id'); if (id) { getDetail(id); } if (location && location.state) { setView(location.state.view); } }, [location]); const saveData = useCallback(async () => { const formData = await form.validateFields(); let triggerData = undefined; // 获取触发条件数据 if (triggerRef.current && formData.trigger) { triggerData = await triggerRef.current.getTriggerForm(); if (triggerData) { formData.terms = triggerData.trigger; } } console.log('save', formData); if (formData) { if (shakeLimit.enabled) { formData.trigger = { ...formData.trigger, shakeLimit: shakeLimit, }; } setLoading(true); const resp = formData.id ? await service.updateScene(formData) : await service.save(formData); // 处理跳转新增 if ((window as any).onTabSaveSuccess) { if (resp.result) { (window as any).onTabSaveSuccess(resp); setTimeout(() => window.close(), 300); } } setLoading(false); if (resp.status === 200) { onlyMessage('操作成功'); history.push(getMenuPathByCode('rule-engine/Scene')); } else { onlyMessage(resp.message); } } }, [shakeLimit]); const AntiShake = ( { const newShake = { ...shakeLimit, enabled: e, }; setShakeLimit(newShake); }} style={{ marginRight: 16 }} /> {shakeLimit.enabled && ( <> { const newShake = { ...shakeLimit, time: e, }; setShakeLimit(newShake); }} /> 秒内发生 { const newShake = { ...shakeLimit, threshold: e, }; setShakeLimit(newShake); }} /> 次及以上时,处理 { const newShake = { ...shakeLimit, alarmFirst: e.target.value, }; setShakeLimit(newShake); }} > )} ); const hasKeyInObject = (keys: string[], obj: any) => { return keys.some((key) => key in obj); }; return (
{ if (changeValue.trigger) { if (changeValue.trigger.device) { if ( changeValue.trigger.device.productId || changeValue.trigger.device.selectorValues || (changeValue.trigger.device.operation && hasKeyInObject( ['operator', 'eventId', 'functionId'], changeValue.trigger.device.operation, )) ) { setTriggerValue([]); setRequestParams({ trigger: allValues.trigger }); setTriggerDatas(allValues.trigger); } if ( hasKeyInObject(['productId'], changeValue.trigger.device) || (changeValue.trigger.device.operation && hasKeyInObject( ['operator', 'eventId', 'functionId'], changeValue.trigger.device.operation, )) ) { setActionParams({ trigger: allValues.trigger }); // 用于内置参数请求 } } else if (['timer', 'manual'].includes(changeValue.trigger.type)) { setActionParams({ trigger: allValues.trigger }); // 用于内置参数请求 } } if (allValues.actions) { setActionsData(allValues.actions); } FormModel = { ...allValues }; }} > } rules={[ { required: true, message: '请输入名称' }, { max: 64, message: intl.formatMessage({ id: 'pages.form.tip.max64', defaultMessage: '最多输入64个字符', }), }, ]} > } required > {triggerType === TriggerWayType.timing && ( )} {triggerType === TriggerWayType.device && ( )} {triggerType === TriggerWayType.device && requestParams && requestParams.trigger?.device?.productId ? ( ) : null} 执行动作} style={{ margin: 0 }} />
串行:按顺序依次执行动作
并行:同时执行所有动作
} > { setParallel(e.target.value); form.setFieldsValue({ parallel: e.target.value }); }} > } > {(fields, { add, remove, move }, { errors }) => ( <>
{fields.map(({ key, name, ...restField }) => ( { remove(name); setActionDataCount(actionDataCount - 1); }} onMove={(type) => { if (type === 'up') { move(name, name - 1); } else { move(name, name + 1); } }} actionItemData={actionsData[name]} isLast={!actionDataCount || actionDataCount - 1 === name} parallel={parallel} isEdit={isEdit} /> ))}
)}
} name={'description'} > {/*{triggerType === TriggerWayType.device &&*/} {/*requestParams &&*/} {/*requestParams.trigger?.device?.productId ? (*/} {/* */} {/*) : null}*/} {!view && ( 保存 )}
); };