فهرست منبع

fix: 设备输出及边缘端映射

hear 3 سال پیش
والد
کامیت
2c60b3c3eb

+ 1 - 1
src/pages/device/Instance/Detail/EdgeMap/mapTable/index.tsx

@@ -453,7 +453,7 @@ const MapTable = (props: Props) => {
               const array = value.requestList.filter((item: any) => item.channelId);
               const submitData = {
                 deviceId: deviceId,
-                provider: array[0].provider,
+                provider: array[0]?.provider,
                 requestList: array,
               };
               save(submitData);

+ 14 - 10
src/pages/device/Instance/Detail/EdgeMap/mapTree/index.tsx

@@ -81,17 +81,21 @@ const MapTree = (props: Props) => {
         onlyMessage('暂无属性映射', 'warning');
       }
     } else {
-      const res = await service.addDevice(props.addDevice);
-      if (res.status === 200) {
-        const resp = await service.saveMap(edgeId, {
-          deviceId: res.result.id,
-          provider: filterParms[0].provider,
-          requestList: filterParms,
-        });
-        if (resp.status === 200) {
-          onlyMessage('保存成功');
-          close();
+      if (filterParms && filterParms.length !== 0) {
+        const res = await service.addDevice(props.addDevice);
+        if (res.status === 200) {
+          const resp = await service.saveMap(edgeId, {
+            deviceId: res.result.id,
+            provider: filterParms[0]?.provider,
+            requestList: filterParms,
+          });
+          if (resp.status === 200) {
+            onlyMessage('保存成功');
+            close();
+          }
         }
+      } else {
+        onlyMessage('暂无属性映射', 'warning');
       }
     }
   };

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

@@ -22,7 +22,7 @@ export default (props: Props) => {
   const [value, setValue] = useState<any>(props.value || '');
   const [visible, setVisible] = useState<boolean>(false);
   const [objVisiable, setObjVisable] = useState<boolean>(false);
-  const [source, setSource] = useState<string>('');
+  const [source, setSource] = useState<string>('fixed');
   const [builtInList, setBuiltInList] = useState<any[]>([]);
 
   const sourceChangeEvent = async () => {
@@ -39,7 +39,7 @@ export default (props: Props) => {
   const onChange = (params: any) => {
     setValue(params);
     if (props.onChange) {
-      props.onChange(params);
+      props.onChange(params, source);
     }
   };
 
@@ -70,7 +70,7 @@ export default (props: Props) => {
           <Select
             value={value}
             style={{ width: '100%', textAlign: 'left' }}
-            options={props.record.options || []}
+            options={props.record?.options || []}
             fieldNames={{ label: 'text', value: 'value' }}
             placeholder={'请选择'}
             mode="multiple"
@@ -150,7 +150,7 @@ export default (props: Props) => {
             onChange={(e) => {
               setValue(e.target.value);
               if (props.onChange) {
-                props.onChange(e.target.value);
+                props.onChange(e.target.value, source);
               }
             }}
           />
@@ -161,7 +161,7 @@ export default (props: Props) => {
   const itemList: ItemProps[] = [
     {
       label: `手动输入`,
-      key: 'manual',
+      key: 'fixed',
       content: renderNode(props.type),
     },
     {
@@ -191,7 +191,7 @@ export default (props: Props) => {
         inputProps={{
           placeholder: '请选择',
         }}
-        tabKey={'manual'}
+        tabKey={'fixed'}
         itemList={itemList}
         value={value}
         onChange={(val: any, tabKey: any) => {

+ 6 - 7
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/WriteProperty.tsx

@@ -23,20 +23,20 @@ export default (props: Props) => {
   const [propertiesId, setPropertiesId] = useState<string | undefined>(undefined);
   const [propertiesValue, setPropertiesValue] = useState(undefined);
   const [propertiesType, setPropertiesType] = useState('');
-  const [source, setSource] = useState<string>('');
+  const [source, setSource] = useState<string>('fixed');
 
   useEffect(() => {
-    console.log(props.value);
+    // console.log(props.value);
     if (props.value) {
       if (props.properties && props.properties.length) {
         if (0 in props.value) {
           setPropertiesValue(props.value[0]);
         } else if ('undefined' in props.value) {
-          // setPropertiesKey(undefined);
           setPropertiesValue(undefined);
         } else {
+          console.log(Object.keys(props.value));
           Object.keys(props.value).forEach((key: string) => {
-            // setPropertiesKey(key);
+            setPropertiesId(key);
             setPropertiesValue(props.value[key].value);
             const propertiesItem = props.properties.find((item: any) => item.id === key);
             if (propertiesItem) {
@@ -46,13 +46,11 @@ export default (props: Props) => {
         }
       }
     } else {
-      // setPropertiesKey(undefined);
       setPropertiesValue(undefined);
     }
   }, [props.value, props.properties]);
 
   useEffect(() => {
-    // console.log(propertiesValue)
     if (props.onChange && propertiesValue) {
       const obj = {
         [propertiesId || 0]: {
@@ -69,7 +67,7 @@ export default (props: Props) => {
       <Col span={12}>
         <Select
           id={props.id}
-          value={props.value ? props.value[0] : undefined}
+          value={props.value ? propertiesId : undefined}
           options={props.properties?.filter((item) => {
             if (item.expands && item.expands.type) {
               return item.expands.type.includes('write');
@@ -93,6 +91,7 @@ export default (props: Props) => {
             type={propertiesType}
             name={props.name}
             onChange={(value, sources) => {
+              console.log(value, sources);
               setPropertiesValue(value);
               setSource(sources);
             }}

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

@@ -14,7 +14,7 @@ interface Props {
 
 export default observer((props: Props) => {
   const [form] = Form.useForm();
-  const [deviceMessageType, setDeviceMessageType] = useState('WRITE_PROPERTY');
+  const [deviceMessageType, setDeviceMessageType] = useState('');
   const [properties, setProperties] = useState([]); // 物模型-属性
   const [propertiesId, setPropertiesId] = useState<string | undefined>(''); // 物模型-属性ID,用于串行
   const [functionList, setFunctionList] = useState<any>([]); // 物模型-功能
@@ -43,6 +43,8 @@ export default observer((props: Props) => {
   ];
 
   useEffect(() => {
+    // console.log(DeviceModel.message)
+    setDeviceMessageType(DeviceModel.message.messageType);
     if (DeviceModel.productDetail) {
       const metadata = JSON.parse(DeviceModel.productDetail?.metadata || '{}');
       setProperties(metadata.properties);
@@ -84,14 +86,14 @@ export default observer((props: Props) => {
         form={form}
         layout={'vertical'}
         initialValues={{
-          message: DeviceModel.message || {},
+          message: DeviceModel.message,
         }}
       >
         <Form.Item
           name={['message', 'messageType']}
           label="动作类型"
           required
-          initialValue="WRITE_PROPERTY"
+          // initialValue="WRITE_PROPERTY"
         >
           <TopCard
             typeList={TypeList}

+ 16 - 8
src/pages/rule-engine/Scene/Save/action/DeviceOutput/index.tsx

@@ -1,5 +1,5 @@
 import { Modal, Button, Steps } from 'antd';
-import { useEffect, useRef, useState } from 'react';
+import { useEffect, useRef } from 'react';
 import { observer } from '@formily/react';
 import Device from './device';
 import Product from './product';
@@ -9,7 +9,6 @@ import './index.less';
 import DeviceModel from './model';
 import { onlyMessage } from '@/utils/util';
 import { ActionsDeviceProps } from '../../../typings';
-// import { FormModel } from '../..';
 
 export const service = new Service<any>('');
 
@@ -22,15 +21,13 @@ interface Props {
 }
 
 export default observer((props: Props) => {
-  const [open, setOpen] = useState<boolean>(true);
-  // const [data, setData] = useState<any>({})
   const formRef = useRef<any>();
 
   DeviceModel.steps = [
     {
       key: 'product',
       title: '选择产品',
-      content: <Product />,
+      content: <Product productId={props.value?.productId} />,
     },
     {
       key: 'device',
@@ -111,6 +108,7 @@ export default observer((props: Props) => {
       }));
       // console.log(_options.taglist, 'taglist')
     }
+    console.log(item);
     props.save(item, _options);
     DeviceModel.current = 0;
   };
@@ -133,15 +131,25 @@ export default observer((props: Props) => {
   return (
     <Modal
       title={'执行动作'}
-      open={open}
+      open
       width={800}
       onCancel={() => {
-        setOpen(false);
+        props.cancel();
+        DeviceModel.current = 0;
       }}
       maskClosable={false}
       footer={
         <div className="steps-action">
-          {DeviceModel.current === 0 && <Button onClick={() => {}}>取消</Button>}
+          {DeviceModel.current === 0 && (
+            <Button
+              onClick={() => {
+                props.cancel();
+                DeviceModel.current = 0;
+              }}
+            >
+              取消
+            </Button>
+          )}
           {DeviceModel.current > 0 && (
             <Button style={{ margin: '0 8px' }} onClick={() => prev()}>
               上一步

+ 18 - 4
src/pages/rule-engine/Scene/Save/action/DeviceOutput/product/index.tsx

@@ -1,7 +1,7 @@
 import { ProTableCard } from '@/components';
 import SearchComponent from '@/components/SearchComponent';
 import { ProductItem } from '@/pages/device/Product/typings';
-import { useRef, useState } from 'react';
+import { useEffect, 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,7 +12,11 @@ import { service as deptService } from '@/pages/system/Department';
 import DeviceModel from '../model';
 import { observer } from '@formily/reactive-react';
 
-export default observer(() => {
+interface Props {
+  productId: string;
+}
+
+export default observer((props: Props) => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
   const [searchParam, setSearchParam] = useState({});
@@ -189,6 +193,17 @@ export default observer(() => {
           }),
     },
   ];
+
+  useEffect(() => {
+    if (props.productId) {
+      service.detail(props.productId).then((res) => {
+        if (res.status === 200) {
+          DeviceModel.productDetail = res.result;
+        }
+      });
+    }
+  }, []);
+
   return (
     <div>
       <SearchComponent
@@ -219,8 +234,7 @@ export default observer(() => {
           rowSelection={{
             type: 'radio',
             selectedRowKeys: [DeviceModel.productId],
-            onChange: (selectedRowKeys, selectedRows) => {
-              // console.log(selectedRowKeys,selectedRows)
+            onChange: (_, selectedRows) => {
               DeviceModel.productId = selectedRows.map((item) => item.id)?.[0];
               DeviceModel.productDetail = selectedRows?.[0];
             },