소스 검색

fix: 修改设备触发参数值

xieyonghong 3 년 전
부모
커밋
928fe89fea

+ 11 - 19
src/pages/rule-engine/Scene/Save/components/TimingTrigger/RangePicker.tsx

@@ -1,5 +1,6 @@
 import { TimePicker } from 'antd';
 import moment from 'moment';
+import type { FormInstance } from 'antd';
 
 type RangePickerValue = {
   from: string;
@@ -12,7 +13,8 @@ interface RangePickerProps {
   value?: RangePickerValue;
   onChange?: (value: RangePickerValue) => void;
   id?: string;
-  form?: any;
+  form?: FormInstance<any>;
+  name: (string | number)[];
 }
 export default (props: RangePickerProps) => {
   return (
@@ -26,24 +28,14 @@ export default (props: RangePickerProps) => {
       ]}
       onChange={(_, dateString) => {
         if (props.onChange) {
-          if (props.form.getFieldsValue().trigger.type === 'timer') {
-            const { every, unit } = props.form.getFieldsValue().trigger?.timer?.period;
-            props.onChange({
-              from: dateString[0],
-              to: dateString[1],
-              every: every,
-              unit: unit,
-            });
-          } else {
-            const { every, unit } =
-              props.form.getFieldsValue().trigger?.device?.operation?.timer?.period;
-            props.onChange({
-              from: dateString[0],
-              to: dateString[1],
-              every: every,
-              unit: unit,
-            });
-          }
+          const { every, unit } = props.form?.getFieldValue([...props.name]);
+          console.log(every, unit);
+          props.onChange({
+            from: dateString[0],
+            to: dateString[1],
+            every: every,
+            unit: unit,
+          });
         }
       }}
     />

+ 2 - 1
src/pages/rule-engine/Scene/Save/components/TimingTrigger/index.less

@@ -1,7 +1,7 @@
 .timer-when-warp {
   display: flex;
   flex-wrap: wrap;
-  gap: 16px;
+  gap: 8px 16px;
   padding: 16px;
   background: #fafafa;
 }
@@ -10,6 +10,7 @@
   width: 76px;
   padding: 6px 0;
   text-align: center;
+  background: #fff;
   border: 1px solid #e6e6e6;
   border-radius: 2px;
   cursor: pointer;

+ 1 - 1
src/pages/rule-engine/Scene/Save/components/TimingTrigger/index.tsx

@@ -129,7 +129,7 @@ export default (props: TimmingTriggerProps) => {
                 to: moment(new Date()).format('HH:mm:ss'),
               }}
             >
-              <RangePicker form={form} />
+              <RangePicker name={[...name, 'period']} form={form} />
             </Form.Item>
             <Form.Item> 每 </Form.Item>
             <Form.Item

+ 29 - 14
src/pages/rule-engine/Scene/Save/device/addModel.tsx

@@ -9,6 +9,9 @@ import Device from './device';
 import Type from './type';
 import { numberToString } from '../components/TimingTrigger/whenOption';
 import { timeUnitEnum } from '../components/TimingTrigger';
+import { Store } from 'jetlinks-store';
+import { FormModel } from '@/pages/rule-engine/Scene/Save';
+import { isEqual } from 'lodash';
 
 interface AddProps {
   options?: any;
@@ -43,7 +46,7 @@ const defaultModelData: Omit<DeviceModelProps, 'steps'> = {
   productDetail: {},
   deviceKeys: [],
   orgId: '',
-  selector: 'custom',
+  selector: 'fixed',
   metadata: {},
   operation: {
     operator: 'online',
@@ -80,12 +83,19 @@ export default observer((props: AddProps) => {
     TriggerDeviceModel.stepNumber = 0;
     return () => {
       Object.keys(defaultModelData).forEach((key) => {
-        TriggerDeviceModel[key] = defaultModelData[key];
+        if (
+          ['selector', 'productId', 'selectorValues', 'operation', 'deviceKeys', 'orgId'].includes(
+            key,
+          )
+        ) {
+          TriggerDeviceModel[key] = defaultModelData[key];
+        }
       });
     };
   }, []);
 
   useEffect(() => {
+    console.log('productPage', props.value);
     if (props.value) {
       TriggerDeviceModel.selector = props.value.selector;
       TriggerDeviceModel.productId = props.value.productId;
@@ -93,9 +103,11 @@ export default observer((props: AddProps) => {
       TriggerDeviceModel.selectorValues = props.value.selectorValues;
       TriggerDeviceModel.operation = props.value.operation;
       TriggerDeviceModel.deviceKeys =
-        props.value.selector === 'custom'
+        props.value.selector === 'fixed'
           ? props.value.selectorValues?.map((item) => item.value) || []
           : [];
+      TriggerDeviceModel.orgId =
+        props.value.selector === 'org' ? props.value.selectorValues?.[0].value : [];
     }
   }, [props.value]);
 
@@ -128,7 +140,7 @@ export default observer((props: AddProps) => {
       extraTime: undefined,
       action: TriggerDeviceModel.options.action,
     };
-    if (TriggerDeviceModel.selector === 'custom') {
+    if (TriggerDeviceModel.selector === 'fixed') {
       _options.name = TriggerDeviceModel.selectorValues?.map((item) => item.name).join(',');
     } else if (TriggerDeviceModel.selector === 'org') {
       _options.name = TriggerDeviceModel.selectorValues?.[0].name + '的';
@@ -184,7 +196,7 @@ export default observer((props: AddProps) => {
         onlyMessage('请选择产品', 'error');
       }
     } else if (TriggerDeviceModel.stepNumber === 1) {
-      if (TriggerDeviceModel.selector === 'custom' && !TriggerDeviceModel.selectorValues?.length) {
+      if (TriggerDeviceModel.selector === 'fixed' && !TriggerDeviceModel.selectorValues?.length) {
         onlyMessage('请选择设备', 'error');
         return;
       } else if (
@@ -204,15 +216,18 @@ export default observer((props: AddProps) => {
         _options.productPageSize = TriggerDeviceModel.productPageSize;
         _options.devicePage = TriggerDeviceModel.devicePage;
         _options.devicePageSize = TriggerDeviceModel.devicePageSize;
-        props.onSave?.(
-          {
-            operation: operationData,
-            selectorValues: TriggerDeviceModel.selectorValues,
-            selector: TriggerDeviceModel.selector!,
-            productId: TriggerDeviceModel.productId,
-          },
-          _options,
-        );
+        const saveData = {
+          operation: operationData,
+          selectorValues: TriggerDeviceModel.selectorValues,
+          selector: TriggerDeviceModel.selector!,
+          productId: TriggerDeviceModel.productId,
+        };
+        const isUpdate = isEqual(saveData, FormModel.current.trigger?.device);
+        Store.set('TriggerDeviceModel', {
+          update: !isUpdate,
+        });
+        console.log('isUpdate', isUpdate);
+        props.onSave?.(saveData, _options);
       }
     }
   };

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

@@ -9,7 +9,7 @@ import OrgList from './org';
 const TypeList = [
   {
     label: '自定义',
-    value: 'custom',
+    value: 'fixed',
     image: require('/public/images/scene/device-custom.png'),
     tip: '自定义选择当前产品下的任意设备',
   },
@@ -51,7 +51,7 @@ export default observer(() => {
           <TopCard typeList={TypeList} />
         </Form.Item>
       </Form>
-      {selector === 'custom' ? <DeviceList /> : selector === 'org' ? <OrgList /> : null}
+      {selector === 'fixed' ? <DeviceList /> : selector === 'org' ? <OrgList /> : null}
     </div>
   );
 });

+ 21 - 2
src/pages/rule-engine/Scene/Save/device/index.tsx

@@ -1,4 +1,4 @@
-import type { ReactChild } from 'react';
+import { ReactChild, useEffect } 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';
@@ -7,16 +7,35 @@ import AddModel from './addModel';
 import { FormModel } from '@/pages/rule-engine/Scene/Save';
 import classNames from 'classnames';
 import { observer } from '@formily/reactive-react';
+import { service } from '@/pages/device/Product/index';
+import { Store } from 'jetlinks-store';
+import { TriggerDeviceModel } from './addModel';
+import { handleMetadata } from './product';
 
 const defaultDeviceValue = {
   productId: '',
-  selector: 'custom',
+  selector: 'fixed',
   selectorValues: [],
 };
 
 export default observer(() => {
   const [visible, setVisible] = useState(false);
 
+  useEffect(() => {
+    if (FormModel.current.trigger!.device?.productId) {
+      service.detail(FormModel.current.trigger!.device?.productId).then((res) => {
+        if (res.status === 200) {
+          TriggerDeviceModel.productDetail = res.result;
+          handleMetadata(res.result.metadata);
+        } else {
+          Store.set('TriggerDeviceModel', {
+            update: true,
+          });
+        }
+      });
+    }
+  }, [FormModel.current.trigger!.device?.productId]);
+
   const handleLabel = (options: any): ReactChild | ReactChild[] => {
     console.log('FormModel', options);
     if (!options || !Object.keys(options).length) return '点击配置设备触发';

+ 10 - 21
src/pages/rule-engine/Scene/Save/device/product.tsx

@@ -1,7 +1,7 @@
 import { ProTableCard } from '@/components';
 import SearchComponent from '@/components/SearchComponent';
 import type { ProductItem } from '@/pages/device/Product/typings';
-import { useEffect, useRef, useState } from 'react';
+import { useRef, useState } from 'react';
 import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { service } from '@/pages/device/Product/index';
 import { SceneProductCard } from '@/components/ProTableCard/CardItems/product';
@@ -12,6 +12,14 @@ import { service as deptService } from '@/pages/system/Department';
 import { TriggerDeviceModel } from './addModel';
 import { observer } from '@formily/reactive-react';
 
+export const handleMetadata = (metadata?: string) => {
+  try {
+    TriggerDeviceModel.metadata = JSON.parse(metadata || '{}');
+  } catch (error) {
+    TriggerDeviceModel.metadata = {};
+  }
+};
+
 export default observer(() => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
@@ -22,25 +30,6 @@ export default observer(() => {
 
   const [loading, setLoading] = useState(true);
 
-  const handleMetadata = (metadata?: string) => {
-    try {
-      TriggerDeviceModel.metadata = JSON.parse(metadata || '{}');
-    } catch (error) {
-      TriggerDeviceModel.metadata = {};
-    }
-  };
-
-  useEffect(() => {
-    if (TriggerDeviceModel.productId && !TriggerDeviceModel.productDetail.id) {
-      service.detail(TriggerDeviceModel.productId).then((res) => {
-        if (res.status === 200) {
-          TriggerDeviceModel.productDetail = res.result;
-          handleMetadata(res.result.metadata);
-        }
-      });
-    }
-  }, [TriggerDeviceModel.productId]);
-
   const columns: ProColumns<ProductItem>[] = [
     {
       title: 'ID',
@@ -260,7 +249,7 @@ export default observer(() => {
               // 初始化选择设备类型以及触发类型
               TriggerDeviceModel.deviceKeys = [];
               TriggerDeviceModel.orgId = '';
-              TriggerDeviceModel.selector = 'custom';
+              TriggerDeviceModel.selector = 'all';
               TriggerDeviceModel.operation = {
                 operator: 'online',
               };

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

@@ -7,7 +7,7 @@ import Term from './term';
 import Actions from '@/pages/rule-engine/Scene/Save/action';
 import classNames from 'classnames';
 import { set } from 'lodash';
-
+import { Store } from 'jetlinks-store';
 interface BranchesItemProps {
   name: number;
   data: ActionBranchesProps;
@@ -18,6 +18,16 @@ interface BranchesItemProps {
 
 export default observer((props: BranchesItemProps) => {
   const [when, setWhen] = useState<TermsType[]>([]);
+  const [error, setError] = useState(false);
+
+  useEffect(() => {
+    Store.subscribe('TriggerDeviceModel', (data) => {
+      console.log('Store', data);
+      if (data.update) {
+        setError(true);
+      }
+    });
+  }, []);
 
   useEffect(() => {
     if (props.data.when) {
@@ -62,7 +72,9 @@ export default observer((props: BranchesItemProps) => {
   return (
     <div className="actions-terms-warp">
       <div className="actions-terms-title">{props.isFrist ? '当' : '否则'}</div>
-      <div className={classNames('actions-terms-options', { border: !props.isFrist })}>
+      <div
+        className={classNames('actions-terms-options', { border: !props.isFrist, error: error })}
+      >
         {!props.isFrist && props.data.when.length ? (
           <div className={classNames('terms-params-delete denger show')} onClick={props.onDelete}>
             <DeleteOutlined />