Przeglądaj źródła

fix: 修复新增没有执行动作;修复没有属性上报;

xieyonghong 3 lat temu
rodzic
commit
6c4c84babd

+ 1 - 1
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx

@@ -27,7 +27,7 @@ export default (props: Props) => {
 
   const sourceChangeEvent = async () => {
     const params = props?.name - 1 >= 0 ? { action: props?.name - 1 } : undefined;
-    queryBuiltInParams(FormModel, params).then((res: any) => {
+    queryBuiltInParams(FormModel.current, params).then((res: any) => {
       if (res.status === 200) {
         const _data = BuiltInParamsHandleTreeData(res.result);
         console.log(_data);

+ 3 - 3
src/pages/rule-engine/Scene/Save/action/DeviceOutput/device/index.tsx

@@ -260,7 +260,7 @@ export default observer((props: Props) => {
   ];
 
   const isParallel = () => {
-    const array = FormModel.actions.find((item) => 'terms' in item);
+    const array = FormModel.current.actions?.find((item) => 'terms' in item);
     if (array && builtInList.length > 0) {
       return true;
     } else {
@@ -283,7 +283,7 @@ export default observer((props: Props) => {
 
   const sourceChangeEvent = async () => {
     const params = props.name - 1 >= 0 ? { action: props.name - 1 } : undefined;
-    queryBuiltInParams(FormModel, params).then((res: any) => {
+    queryBuiltInParams(FormModel.current, params).then((res: any) => {
       if (res.status === 200) {
         const _data = BuiltInParamsHandleTreeData(res.result);
         const array = filterTree(_data);
@@ -293,7 +293,7 @@ export default observer((props: Props) => {
   };
   const filterType = async () => {
     // console.log('',FormModel);
-    if (FormModel.trigger?.type === 'device') {
+    if (FormModel.current.trigger?.type === 'device') {
       const res = await getRelations();
       if (res.status === 200 && res.result.length === 0) {
         const array = TypeList.filter((item) => item.value !== 'relation');

+ 1 - 1
src/pages/rule-engine/Scene/Save/action/ListItem/FilterCondition.tsx

@@ -89,7 +89,7 @@ export default observer((props: FilterProps) => {
   };
 
   const getParmas = () => {
-    queryBuiltInParams(FormModel, { action: props.thenName }).then((res: any) => {
+    queryBuiltInParams(FormModel.current, { action: props.thenName }).then((res: any) => {
       if (res.status === 200) {
         const params = handleTreeData(res.result);
         setColumnOptions(params);

+ 2 - 2
src/pages/rule-engine/Scene/Save/action/TriggerAlarm/index.tsx

@@ -20,7 +20,7 @@ export default (props: Props) => {
     queryAlarmCount(
       encodeQuery({
         terms: {
-          sceneId: FormModel.id,
+          sceneId: FormModel.current.id,
         },
       }),
     ).then((resp) => {
@@ -161,7 +161,7 @@ export default (props: Props) => {
                 terms: [
                   {
                     column: 'sceneId',
-                    value: FormModel.id,
+                    value: FormModel.current.id,
                   },
                 ],
                 type: 'and',

+ 7 - 7
src/pages/rule-engine/Scene/Save/action/index.tsx

@@ -23,7 +23,7 @@ export default (props: ActionsProps) => {
         {props.openShakeLimit ? (
           <Observer>
             {() => {
-              const data: ShakeLimitType | undefined = get(FormModel.branches, [
+              const data: ShakeLimitType | undefined = get(FormModel.current.branches, [
                 props.name!,
                 'shakeLimit',
               ]);
@@ -77,18 +77,18 @@ export default (props: ActionsProps) => {
                           } else {
                             parallelThens[0].actions.push(actionItem);
                           }
-                          set(FormModel, ['branches', props.name, 'then'], parallelThens);
+                          set(FormModel.current, ['branches', props.name, 'then'], parallelThens);
                         } else {
                           parallelThens.push({
                             parallel: false,
                             actions: [actionItem],
                           });
-                          set(FormModel, ['branches', props.name, 'then'], parallelThens);
+                          set(FormModel.current, ['branches', props.name, 'then'], parallelThens);
                         }
                       }}
                       onDelete={(_index) => {
                         parallelThens[0].actions.splice(_index, 1);
-                        set(FormModel, ['branches', props.name, 'then'], parallelThens);
+                        set(FormModel.current, ['branches', props.name, 'then'], parallelThens);
                       }}
                     />
                   );
@@ -128,18 +128,18 @@ export default (props: ActionsProps) => {
                           } else {
                             parallelThens[0].actions.push(actionItem);
                           }
-                          set(FormModel, ['branches', props.name, 'then'], parallelThens);
+                          set(FormModel.current, ['branches', props.name, 'then'], parallelThens);
                         } else {
                           parallelThens.push({
                             parallel: true,
                             actions: [actionItem],
                           });
-                          set(FormModel, ['branches', props.name, 'then'], parallelThens);
+                          set(FormModel.current, ['branches', props.name, 'then'], parallelThens);
                         }
                       }}
                       onDelete={(_index) => {
                         parallelThens[0].actions.splice(_index, 1);
-                        set(FormModel, ['branches', props.name, 'then'], parallelThens);
+                        set(FormModel.current, ['branches', props.name, 'then'], parallelThens);
                       }}
                     />
                   );

+ 1 - 1
src/pages/rule-engine/Scene/Save/action/notify/components/variableItem/buildIn.tsx

@@ -43,7 +43,7 @@ export default (props: BuiltInProps) => {
 
   const sourceChangeEvent = async () => {
     const params = props.name - 1 >= 0 ? { action: props.name - 1 } : undefined;
-    queryBuiltInParams(FormModel, params).then((res: any) => {
+    queryBuiltInParams(FormModel.current, params).then((res: any) => {
       if (res.status === 200) {
         const _data = BuiltInParamsHandleTreeData(res.result);
         setBuiltInList(_data);

+ 6 - 2
src/pages/rule-engine/Scene/Save/device/addModel.tsx

@@ -26,7 +26,7 @@ export interface DeviceModelProps extends Partial<TriggerDevice> {
     events?: any[];
     functions?: any[];
   };
-  deviceId: string;
+  deviceKeys: string[];
   orgId: string;
   operation?: TriggerDeviceOptions;
   options: any;
@@ -50,7 +50,7 @@ export const DeviceModel = observable<DeviceModelProps>({
   stepNumber: 0,
   productId: '',
   productDetail: {},
-  deviceId: '',
+  deviceKeys: [],
   orgId: '',
   selector: 'custom',
   metadata: {},
@@ -74,6 +74,10 @@ export default observer((props: AddProps) => {
       DeviceModel.selector = props.value.selector;
       DeviceModel.selectorValues = props.value.selectorValues;
       DeviceModel.operation = props.value.operation;
+      DeviceModel.deviceKeys =
+        props.value.selector === 'custom'
+          ? props.value.selectorValues?.map((item) => item.value) || []
+          : [];
       // Object.assign(DeviceModel, props.value);
       console.log('addModel', DeviceModel, props.value);
     }

+ 43 - 44
src/pages/rule-engine/Scene/Save/device/deviceList.tsx

@@ -10,8 +10,9 @@ import { service as deptService } from '@/pages/system/Department';
 import { useIntl } from 'umi';
 import { SceneDeviceCard } from '@/components/ProTableCard/CardItems/device';
 import { DeviceModel } from './addModel';
+import { observer, Observer } from '@formily/reactive-react';
 
-export default () => {
+export default observer(() => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
   const [searchParam, setSearchParam] = useState({});
@@ -235,48 +236,46 @@ export default () => {
           },
         ]}
       />
-      <div>
-        <ProTableCard<DeviceInstance>
-          actionRef={actionRef}
-          columns={columns}
-          rowKey="id"
-          search={false}
-          gridColumn={2}
-          columnEmptyText={''}
-          onlyCard={true}
-          tableAlertRender={false}
-          rowSelection={{
-            selectedRowKeys: DeviceModel.selectorValues
-              ? DeviceModel.selectorValues.map((item) => {
-                  console.log('item', item);
-
-                  return item.value;
-                })
-              : [],
-            onChange(selectedRowKeys, selectedRows) {
-              console.log(selectedRowKeys, DeviceModel.selectorValues);
-              if (!isFirst) {
-                DeviceModel.selectorValues = selectedRows.map((item) => ({
-                  name: item.name,
-                  value: item.id,
-                }));
-                setIsFirst(false);
-              }
-            },
-          }}
-          request={(params) =>
-            service.query({
-              ...params,
-              sorts: [{ name: 'createTime', order: 'desc' }],
-            })
-          }
-          params={searchParam}
-          cardRender={(record) => (
-            <SceneDeviceCard showBindBtn={false} showTool={false} {...record} />
-          )}
-          height={'none'}
-        />
-      </div>
+      <Observer>
+        {() => (
+          <ProTableCard<DeviceInstance>
+            actionRef={actionRef}
+            columns={columns}
+            rowKey="id"
+            search={false}
+            gridColumn={2}
+            columnEmptyText={''}
+            onlyCard={true}
+            tableAlertRender={false}
+            rowSelection={{
+              selectedRowKeys: [...DeviceModel.deviceKeys],
+              onChange(selectedRowKeys, selectedRows) {
+                console.log(selectedRowKeys, DeviceModel.selectorValues, isFirst);
+                if (!isFirst) {
+                  DeviceModel.deviceKeys = selectedRows.map((item) => item.id);
+                  DeviceModel.selectorValues = selectedRows.map((item) => ({
+                    name: item.name,
+                    value: item.id,
+                  }));
+                } else {
+                  setIsFirst(false);
+                }
+              },
+            }}
+            request={(params) =>
+              service.query({
+                ...params,
+                sorts: [{ name: 'createTime', order: 'desc' }],
+              })
+            }
+            params={searchParam}
+            cardRender={(record) => (
+              <SceneDeviceCard showBindBtn={false} showTool={false} {...record} />
+            )}
+            height={'none'}
+          />
+        )}
+      </Observer>
     </>
   );
-};
+});

+ 16 - 6
src/pages/rule-engine/Scene/Save/device/index.tsx

@@ -2,15 +2,23 @@ import type { ReactChild } from 'react';
 import Terms from '@/pages/rule-engine/Scene/Save/terms';
 import { AddButton } from '@/pages/rule-engine/Scene/Save/components/Buttons';
 import { useState } from 'react';
-import { Observer, observer } from '@formily/react';
+import { Observer } from '@formily/react';
 import AddModel from './addModel';
 import { FormModel } from '@/pages/rule-engine/Scene/Save';
 import classNames from 'classnames';
+import { observer } from '@formily/reactive-react';
+
+const defaultDeviceValue = {
+  productId: '',
+  selector: 'custom',
+  selectorValues: [],
+};
 
 export default observer(() => {
   const [visible, setVisible] = useState(false);
 
   const handleLabel = (options: any): ReactChild | ReactChild[] => {
+    console.log('FormModel', options);
     if (!options || !Object.keys(options).length) return '点击配置设备触发';
 
     const _label = [<span className="trigger-options-name">{options.name}</span>];
@@ -37,12 +45,14 @@ export default observer(() => {
     return _label;
   };
 
+  console.log(FormModel.current);
+
   return (
     <div>
       <div style={{ marginBottom: 16 }}>
         <Observer>
           {() => {
-            const label = handleLabel(FormModel.options?.trigger);
+            const label = handleLabel(FormModel.current.options?.trigger);
             return (
               <AddButton
                 style={{ width: '100%' }}
@@ -52,7 +62,7 @@ export default observer(() => {
               >
                 <div
                   className={classNames('trigger-options-content', {
-                    'is-add': !!Object.keys(FormModel.options?.trigger || {}).length,
+                    'is-add': !!Object.keys(FormModel.current.options?.trigger || {}).length,
                   })}
                 >
                   {label}
@@ -65,11 +75,11 @@ export default observer(() => {
       <Terms />
       {visible && (
         <AddModel
-          value={FormModel.trigger?.device}
+          value={FormModel.current.trigger?.device || defaultDeviceValue}
           onSave={(data, options) => {
             setVisible(false);
-            FormModel.options!['trigger'] = options;
-            FormModel.trigger!.device = data;
+            FormModel.current.options!['trigger'] = options;
+            FormModel.current.trigger!.device = data;
           }}
           onCancel={() => {
             setVisible(false);

+ 12 - 0
src/pages/rule-engine/Scene/Save/device/type.tsx

@@ -68,6 +68,7 @@ export default forwardRef((props: Props, ref) => {
 
   const [readProperty, setReadProperty] = useState<any[]>([]);
   const [writeProperty, setWriteProperty] = useState<any[]>([]);
+  // const [reportProperty, setReportProperty] = useState<any[]>([]);
   const [events, setEvents] = useState<any[]>([]);
   const [functions, setFunctions] = useState<any[]>([]);
   const [functionItem, setFunctionItem] = useState<any[]>([]);
@@ -110,14 +111,25 @@ export default forwardRef((props: Props, ref) => {
       const _writeProperty = data.metadata.properties.filter(
         (item) => !!item.expands.type?.includes('write'),
       );
+
+      const _reportProperty = data.metadata.properties.filter(
+        (item) => !!item.expands.type?.includes('report'),
+      );
+
       setReadProperty(_readProperty);
       setWriteProperty(_writeProperty);
+      // setReportProperty(_reportProperty);
+
       if (_readProperty.length) {
         newTypeList.push(TypeEnum.readProperty);
       }
       if (_writeProperty.length) {
         newTypeList.push(TypeEnum.writeProperty);
       }
+      if (_reportProperty.length) {
+        newTypeList.push(TypeEnum.reportProperty);
+      }
+      console.log('data.metadata.properties', data.metadata.properties);
     }
 
     if (data.metadata.functions?.length) {

+ 71 - 48
src/pages/rule-engine/Scene/Save/index.tsx

@@ -15,56 +15,60 @@ import { onlyMessage } from '@/utils/util';
 import { useHistory } from 'umi';
 import { getMenuPathByCode } from '@/utils/menu';
 
-export const FormModel = observable<FormModelType>({
-  trigger: {
-    type: '',
-  },
-  options: {
-    trigger: {},
-    terms: [
+const defaultBranches = [
+  {
+    when: [
       {
-        terms: [],
+        terms: [
+          {
+            column: undefined,
+            value: undefined,
+            termType: undefined,
+            key: 'params_1',
+            type: 'and',
+          },
+        ],
+        type: 'and',
+        key: 'terms_1',
       },
     ],
+    key: 'branckes_1',
+    shakeLimit: {
+      enabled: true,
+      time: 1,
+      threshold: 1,
+      alarmFirst: false,
+    },
+    then: [],
+  },
+  {
+    when: [],
+    key: 'branckes_2',
+    shakeLimit: {
+      enabled: true,
+      time: 1,
+      threshold: 1,
+      alarmFirst: false,
+    },
+    then: [],
   },
-  branches: [
-    {
-      when: [
+];
+
+export const FormModel = observable<{ current: FormModelType }>({
+  current: {
+    trigger: {
+      type: '',
+    },
+    options: {
+      trigger: {},
+      terms: [
         {
-          terms: [
-            {
-              column: undefined,
-              value: undefined,
-              termType: undefined,
-              key: 'params_1',
-              type: 'and',
-            },
-          ],
-          type: 'and',
-          key: 'terms_1',
+          terms: [],
         },
       ],
-      key: 'branckes_1',
-      shakeLimit: {
-        enabled: true,
-        time: 1,
-        threshold: 1,
-        alarmFirst: false,
-      },
-      then: [],
     },
-    {
-      when: [],
-      key: 'branckes_2',
-      shakeLimit: {
-        enabled: true,
-        time: 1,
-        threshold: 1,
-        alarmFirst: false,
-      },
-      then: [],
-    },
-  ],
+    branches: defaultBranches,
+  },
 });
 
 export default observer(() => {
@@ -73,11 +77,29 @@ export default observer(() => {
   const id = location?.query?.id || '';
   const history = useHistory();
 
+  const FormModelInit = () => {
+    FormModel.current = {
+      trigger: {
+        type: '',
+      },
+      options: {
+        trigger: {},
+        terms: [
+          {
+            terms: [],
+          },
+        ],
+      },
+      branches: defaultBranches,
+    };
+  };
+
   useEffect(() => {
+    FormModelInit();
     if (id) {
       service.detail(id).then((resp) => {
         if (resp.status === 200) {
-          let branches = resp.result.branches;
+          let branches = resp.result.branches || defaultBranches;
           // 处理 branches 的 key
           if (branches) {
             branches = branches.map((bItem: ActionBranchesProps, bIndex: number) => {
@@ -108,18 +130,19 @@ export default observer(() => {
               return bItem;
             });
           }
-          Object.assign(FormModel, {
+          FormModel.current = {
             ...resp.result,
+            options: resp.result.options || {},
             branches,
-          });
-          console.log(FormModel, '11111');
+          };
+          console.log('FormModel', FormModel);
         }
       });
     }
   }, [id]);
 
   const triggerRender = (type: string) => {
-    FormModel.trigger!.type = type;
+    FormModel.current.trigger!.type = type;
     switch (type) {
       case 'device':
         return (
@@ -145,7 +168,7 @@ export default observer(() => {
   };
 
   const submit = useCallback(() => {
-    service.updateScene(FormModel).then((res) => {
+    service.updateScene(FormModel.current).then((res) => {
       if (res.status === 200) {
         onlyMessage('操作成功', 'success');
         const url = getMenuPathByCode('rule-engine/Scene');

+ 4 - 1
src/pages/rule-engine/Scene/Save/manual/index.tsx

@@ -7,7 +7,10 @@ export default observer(() => {
     <div>
       <Observer>
         {() => (
-          <Action thenOptions={FormModel.branches ? FormModel.branches[0].then : []} name={0} />
+          <Action
+            thenOptions={FormModel.current.branches ? FormModel.current.branches[0].then : []}
+            name={0}
+          />
         )}
       </Observer>
     </div>

+ 7 - 7
src/pages/rule-engine/Scene/Save/terms/branchItem.tsx

@@ -26,8 +26,8 @@ export default observer((props: BranchesItemProps) => {
   }, [props.data]);
 
   const addWhen = (index: number) => {
-    const lastBranch = FormModel.branches![index].when;
-    FormModel.options?.terms.push({
+    const lastBranch = FormModel.current.branches![index].when;
+    FormModel.current.options?.terms.push({
       terms: [],
     });
     lastBranch.push({
@@ -43,7 +43,7 @@ export default observer((props: BranchesItemProps) => {
     });
     // 增加下一个否则, '当' 排除
     if (index > 0) {
-      FormModel.branches?.push({
+      FormModel.current.branches?.push({
         when: [],
         key: `branch_${new Date().getTime()}`,
         shakeLimit: {
@@ -84,16 +84,16 @@ export default observer((props: BranchesItemProps) => {
                 paramsOptions={props.paramsOptions}
                 isLast={dIndex === when!.length - 1}
                 onValueChange={(data) => {
-                  FormModel.branches![props.name].when[dIndex] = {
-                    ...FormModel.branches![props.name].when[dIndex],
+                  FormModel.current.branches![props.name].when[dIndex] = {
+                    ...FormModel.current.branches![props.name].when[dIndex],
                     ...data,
                   };
                 }}
                 onLabelChange={(options) => {
-                  FormModel.options!.terms[props.name] = options;
+                  FormModel.current.options!.terms[props.name] = options;
                 }}
                 onDelete={() => {
-                  FormModel.branches![props.name].when.splice(dIndex, 1);
+                  FormModel.current.branches![props.name].when.splice(dIndex, 1);
                 }}
               />
             ))

+ 5 - 11
src/pages/rule-engine/Scene/Save/terms/index.tsx

@@ -23,23 +23,17 @@ export default observer(() => {
   };
 
   useEffect(() => {
-    console.log('terms-useEffect', FormModel.trigger?.device);
-
-    if (FormModel.trigger?.device) {
-      queryColumn(FormModel.trigger);
+    if (FormModel.current.trigger?.device) {
+      queryColumn(FormModel.current.trigger);
     }
-  }, [FormModel.trigger?.device]);
-
-  useEffect(() => {
-    console.log('terms-useEffect-branches', FormModel.branches);
-  }, [FormModel.branches]);
+  }, [FormModel.current.trigger?.device]);
 
   return (
     <div className="actions-terms">
       <TitleComponent style={{ fontSize: 14 }} data="触发条件" />
       <Observer>
         {() =>
-          FormModel.branches?.map((item, index) => {
+          FormModel.current.branches?.map((item, index) => {
             const isFrist = index === 0;
             return (
               <BranchItem
@@ -48,7 +42,7 @@ export default observer(() => {
                 name={index}
                 paramsOptions={TermsModel.columnOptions}
                 onDelete={() => {
-                  FormModel.branches?.splice(index, 1);
+                  FormModel.current.branches?.splice(index, 1);
                 }}
               />
             );

+ 5 - 5
src/pages/rule-engine/Scene/Save/terms/term.tsx

@@ -32,8 +32,8 @@ export default observer((props: TermsProps) => {
   }, [props.data.terms]);
 
   const addTerms = () => {
-    const data = get(FormModel.branches, [...props.pName]);
-    FormModel.options!.terms[props.name].terms.push('');
+    const data = get(FormModel.current.branches, [...props.pName]);
+    FormModel.current.options!.terms[props.name].terms.push('');
     const key = `terms_${new Date().getTime()}`;
     const defaultValue = {
       type: 'and',
@@ -100,9 +100,9 @@ export default observer((props: TermsProps) => {
                 });
               }}
               onLableChange={(options) => {
-                console.log(options, FormModel.options!.terms);
-                FormModel.options!.terms[props.name].terms[index] = options;
-                FormModel.options!.terms[props.name].termType =
+                console.log(options, FormModel.current.options!.terms);
+                FormModel.current.options!.terms[props.name].terms[index] = options;
+                FormModel.current.options!.terms[props.name].termType =
                   props.data.type === 'and' ? '并且' : '或者';
               }}
             />

+ 9 - 6
src/pages/rule-engine/Scene/Save/timer/index.tsx

@@ -31,7 +31,7 @@ export default observer(() => {
       <div style={{ marginBottom: 16 }}>
         <Observer>
           {() => {
-            const label = handleLabel(FormModel.options?.trigger);
+            const label = handleLabel(FormModel.current.options?.trigger);
             return (
               <AddButton
                 style={{ width: '100%' }}
@@ -41,7 +41,7 @@ export default observer(() => {
               >
                 <div
                   className={classNames('trigger-options-content', {
-                    'is-add': !!Object.keys(FormModel.options?.trigger || {}).length,
+                    'is-add': !!Object.keys(FormModel.current.options?.trigger || {}).length,
                   })}
                 >
                   {label}
@@ -54,17 +54,20 @@ export default observer(() => {
       <div>
         <Observer>
           {() => (
-            <Action thenOptions={FormModel.branches ? FormModel.branches[0].then : []} name={0} />
+            <Action
+              thenOptions={FormModel.current.branches ? FormModel.current.branches[0].then : []}
+              name={0}
+            />
           )}
         </Observer>
       </div>
       {visible && (
         <TimerTrigger
-          data={FormModel.trigger?.timer}
+          data={FormModel.current.trigger?.timer}
           save={(data, options) => {
             setVisible(false);
-            FormModel.options!['trigger'] = options;
-            FormModel.trigger!.timer = data;
+            FormModel.current.options!['trigger'] = options;
+            FormModel.current.trigger!.timer = data;
           }}
           close={() => {
             setVisible(false);