Wzyyy98 пре 3 година
родитељ
комит
607e0f89a7

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

@@ -1,18 +1,21 @@
 import ParamsSelect, { ItemProps } from '@/pages/rule-engine/Scene/Save/components/ParamsSelect';
 import { useEffect, useState } from 'react';
-import { DataNode } from 'antd/es/tree';
 import { Input, InputNumber, Select, Tree } from 'antd';
 import MTimePicker from '../../../components/ParamsSelect/components/MTimePicker';
 import moment from 'moment';
 import { EditOutlined, EnvironmentOutlined } from '@ant-design/icons';
 import AMap from '@/components/GeoPoint/AMap';
 import ObjModel from './ObjModel';
+import { FormModel } from '../../..';
+import { BuiltInParamsHandleTreeData } from '@/pages/rule-engine/Scene/Save/components/BuiltInParams';
+import { queryBuiltInParams } from '@/pages/rule-engine/Scene/Save/action/service';
 
 interface Props {
   value: any;
   type: string;
-  onChange: (data: any, source?: any) => void;
+  onChange?: (data: any, source?: any) => void;
   record?: any; //枚举值使用
+  name?: any;
 }
 
 export default (props: Props) => {
@@ -20,37 +23,18 @@ export default (props: Props) => {
   const [visible, setVisible] = useState<boolean>(false);
   const [objVisiable, setObjVisable] = useState<boolean>(false);
   const [source, setSource] = useState<string>('');
-  const treeData: DataNode[] = [
-    {
-      title: 'parent 1',
-      key: '0-0',
-      children: [
-        {
-          title: 'parent 1-0',
-          key: '0-0-0',
-          children: [
-            {
-              title: 'leaf',
-              key: '0-0-0-0',
-            },
-            {
-              title: 'leaf',
-              key: '0-0-0-1',
-            },
-          ],
-        },
-        {
-          title: 'parent 1-1',
-          key: '0-0-1',
-          children: [{ title: 'sss', key: '0-0-1-0' }],
-        },
-      ],
-    },
-  ];
+  const [builtInList, setBuiltInList] = useState<any[]>([]);
 
-  // useEffect(() => {
-  //   setValue(props.value);
-  // }, [props.value]);
+  const sourceChangeEvent = async () => {
+    const params = props?.name - 1 >= 0 ? { action: props?.name - 1 } : undefined;
+    queryBuiltInParams(FormModel, params).then((res: any) => {
+      if (res.status === 200) {
+        const _data = BuiltInParamsHandleTreeData(res.result);
+        console.log(_data);
+        setBuiltInList(_data);
+      }
+    });
+  };
 
   const onChange = (params: any) => {
     setValue(params);
@@ -60,7 +44,12 @@ export default (props: Props) => {
   };
 
   useEffect(() => {
-    props.onChange(value, source);
+    if (props.onChange) {
+      props.onChange(value, source);
+    }
+    if (source === 'upper') {
+      sourceChangeEvent();
+    }
   }, [source, value]);
 
   const renderNode = (type: string) => {
@@ -183,9 +172,10 @@ export default (props: Props) => {
       key: 'upper',
       content: (
         <Tree
-          treeData={treeData}
+          treeData={builtInList}
           height={300}
           defaultExpandAll
+          fieldNames={{ title: 'name', key: 'id' }}
           onSelect={(selectedKeys) => {
             setValue(selectedKeys[0]);
             if (props.onChange) {

+ 2 - 0
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/WriteProperty.tsx

@@ -9,6 +9,7 @@ interface Props {
   id?: string;
   onChange?: (value?: any) => void;
   propertiesChange?: (value?: string) => void;
+  name?: any;
 }
 
 // const item = {
@@ -90,6 +91,7 @@ export default (props: Props) => {
           <TypeModel
             value={propertiesValue}
             type={propertiesType}
+            name={props.name}
             onChange={(value, sources) => {
               setPropertiesValue(value);
               setSource(sources);

+ 2 - 2
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/functionCall.tsx

@@ -15,7 +15,7 @@ interface FunctionCallProps {
   functionData: any[];
   value?: any;
   onChange?: (data: any) => void;
-  name?: string;
+  name?: any;
   productId?: string;
 }
 
@@ -61,7 +61,7 @@ export default (props: FunctionCallProps) => {
 
   const getItemNode = (record: any) => {
     const type = record.type;
-    return <TypeModel value={record.value} type={type} record={record} />;
+    return <TypeModel value={record.value} type={type} record={record} name={props.name} />;
   };
 
   const columns: ProColumns<FunctionTableDataType>[] = [

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

@@ -9,6 +9,7 @@ import WriteProperty from './WriteProperty';
 
 interface Props {
   get: (data: any) => void;
+  name: number;
 }
 
 export default observer((props: Props) => {
@@ -80,7 +81,12 @@ export default observer((props: Props) => {
   return (
     <div>
       <Form form={form} layout={'vertical'}>
-        <Form.Item name="messageType" label="动作类型" required initialValue="WRITE_PROPERTY">
+        <Form.Item
+          name={['device', 'message', 'messageType']}
+          label="动作类型"
+          required
+          initialValue="WRITE_PROPERTY"
+        >
           <TopCard
             typeList={TypeList}
             onChange={(value: string) => {
@@ -115,7 +121,11 @@ export default observer((props: Props) => {
                 name={['device', 'message', 'inputs']}
                 rules={[{ required: true, message: '请输入功能值' }]}
               >
-                <FunctionCall functionData={functionList} productId={DeviceModel.productId[0]} />
+                <FunctionCall
+                  functionData={functionList}
+                  productId={DeviceModel.productId[0]}
+                  name={props.name}
+                />
               </Form.Item>
             )}
           </>
@@ -135,7 +145,7 @@ export default observer((props: Props) => {
             label="设置属性"
             rules={[{ required: true, message: '请选择属性' }]}
           >
-            <WriteProperty properties={properties} />
+            <WriteProperty properties={properties} name={props.name} />
           </Form.Item>
         )}
         {/* {deviceMessageType === 'WRITE_PROPERTY' && <WriteProperty properties={properties} />} */}

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

@@ -21,7 +21,6 @@ const TopCard = (props: Props) => {
   const onSelect = (_type: string) => {
     if (!props.disabled) {
       setType(_type);
-
       if (props.onChange) {
         props.onChange(_type);
       }
@@ -38,6 +37,9 @@ const TopCard = (props: Props) => {
           })}
           onClick={() => {
             onSelect(item.value);
+            if (props.onChange) {
+              props.onChange(item.value);
+            }
           }}
         >
           <div className={'way-item-title'}>

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

@@ -1,7 +1,7 @@
 import { ProTableCard } from '@/components';
 import SearchComponent from '@/components/SearchComponent';
 import type { DeviceInstance } from '@/pages/device/Instance/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/Instance/index';
 import { SceneDeviceCard } from '@/components/ProTableCard/CardItems/device';
@@ -11,16 +11,25 @@ import { service as categoryService } from '@/pages/device/Category';
 import { service as deptService } from '@/pages/system/Department';
 import DeviceModel from '../model';
 import { observer } from '@formily/reactive-react';
-import { Form } from 'antd';
+import { Form, TreeSelect } from 'antd';
 import '../index.less';
 import TopCard from './TopCard';
 import { ExclamationCircleOutlined } from '@ant-design/icons';
+import { FormModel } from '../../..';
+import { BuiltInParamsHandleTreeData } from '@/pages/rule-engine/Scene/Save/components/BuiltInParams';
+import { queryBuiltInParams } from '@/pages/rule-engine/Scene/Save/action/service';
 
-export default observer(() => {
+interface Props {
+  name: number;
+}
+
+export default observer((props: Props) => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
   const [searchParam, setSearchParam] = useState({});
   const [form] = Form.useForm();
+  const [type, setType] = useState<string>('');
+  const [builtInList, setBuiltInList] = useState<any[]>([]);
 
   const TypeList = [
     {
@@ -232,67 +241,137 @@ export default observer(() => {
           }),
     },
   ];
+
+  const isParallel = () => {
+    const array = FormModel.actions.find((item) => 'terms' in item);
+    if (array && builtInList.length > 0) {
+      return true;
+    } else {
+      return false;
+    }
+  };
+
+  const filterTree = (nodes: any[]) => {
+    if (!nodes?.length) {
+      return nodes;
+    }
+    return nodes.filter((it) => {
+      if (it.children.find((item: any) => item.id.indexOf('deviceId') > -1)) {
+        // console.log(it.children.find((item: any) => item.id.indexOf('deviceId') > -1))
+        return true;
+      }
+      return false;
+    });
+  };
+
+  const sourceChangeEvent = async () => {
+    const params = props.name - 1 >= 0 ? { action: props.name - 1 } : undefined;
+    queryBuiltInParams(FormModel, params).then((res: any) => {
+      if (res.status === 200) {
+        const _data = BuiltInParamsHandleTreeData(res.result);
+        const array = filterTree(_data);
+        setBuiltInList(array);
+        // console.log(array)
+      }
+    });
+  };
+
+  useEffect(() => {
+    // console.log(FormModel, isParallel())
+    sourceChangeEvent();
+    setType('custom');
+  }, []);
+
   return (
     <div>
       <div className="device-title">
         <ExclamationCircleOutlined className="device-title-icon" />
         <span>自定义选择当前产品下的任意设备</span>
       </div>
-      <Form form={form} layout={'vertical'}>
-        <Form.Item name="type" label="选择方式" required>
-          <TopCard typeList={TypeList} />
-        </Form.Item>
-      </Form>
-      <SearchComponent
-        field={columns}
-        model={'simple'}
-        enableSave={false}
-        onSearch={async (data) => {
-          actionRef.current?.reset?.();
-          setSearchParam(data);
-        }}
-        target="device"
-        defaultParam={[
-          {
-            terms: [
+      {isParallel() && (
+        <Form form={form} layout={'vertical'}>
+          <Form.Item name="type" label="选择方式" required>
+            <TopCard
+              typeList={TypeList}
+              value={'custom'}
+              onChange={(value) => {
+                setType(value);
+              }}
+            />
+          </Form.Item>
+          {type === 'variable' && (
+            <Form.Item name="deviceId" label="变量" required>
+              <TreeSelect
+                style={{ width: '100%', height: '100%' }}
+                treeData={builtInList}
+                fieldNames={{ label: 'name', value: 'id' }}
+                placeholder={'请选择参数'}
+                onSelect={(value: any, node: any) => {
+                  // console.log(value,node)
+                  DeviceModel.deviceId = [value];
+                  DeviceModel.deviceDetail = node;
+                }}
+              />
+            </Form.Item>
+          )}
+        </Form>
+      )}
+      {type === 'custom' && (
+        <>
+          <SearchComponent
+            field={columns}
+            model={'simple'}
+            enableSave={false}
+            onSearch={async (data) => {
+              actionRef.current?.reset?.();
+              setSearchParam(data);
+            }}
+            target="device"
+            defaultParam={[
               {
-                column: 'productId',
-                value: DeviceModel.productId[0],
+                terms: [
+                  {
+                    column: 'productId',
+                    value: DeviceModel.productId[0],
+                  },
+                ],
               },
-            ],
-          },
-        ]}
-      />
-      <div>
-        <ProTableCard<DeviceInstance>
-          actionRef={actionRef}
-          columns={columns}
-          rowKey="id"
-          search={false}
-          gridColumn={2}
-          columnEmptyText={''}
-          onlyCard={true}
-          tableAlertRender={false}
-          rowSelection={{
-            type: 'radio',
-            selectedRowKeys: DeviceModel.deviceId,
-            onChange: (selectedRowKeys, selectedRows) => {
-              DeviceModel.deviceId = selectedRows.map((item) => item.id);
-            },
-          }}
-          request={(params) =>
-            service.query({
-              ...params,
-              sorts: [{ name: 'createTime', order: 'desc' }],
-            })
-          }
-          params={searchParam}
-          cardRender={(record) => (
-            <SceneDeviceCard showBindBtn={false} showTool={false} {...record} />
-          )}
-          height={'none'}
-        />
-      </div>
+            ]}
+          />
+          <div>
+            <ProTableCard<DeviceInstance>
+              actionRef={actionRef}
+              columns={columns}
+              rowKey="id"
+              search={false}
+              gridColumn={2}
+              columnEmptyText={''}
+              onlyCard={true}
+              tableAlertRender={false}
+              rowSelection={{
+                type: 'radio',
+                selectedRowKeys: DeviceModel.deviceId,
+                onChange: (selectedRowKeys, selectedRows) => (
+                  // console.log(selectedRowKeys)
+                  (DeviceModel.deviceId = selectedRowKeys),
+                  (DeviceModel.deviceDetail = selectedRows?.[0])
+                ),
+              }}
+              request={(params) =>
+                service.query({
+                  ...params,
+                  sorts: [{ name: 'createTime', order: 'desc' }],
+                })
+              }
+              params={searchParam}
+              cardRender={(record) => (
+                <SceneDeviceCard showBindBtn={false} showTool={false} {...record} />
+              )}
+              height={'none'}
+            />
+          </div>
+        </>
+      )}
     </div>
   );
 });

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

@@ -1,18 +1,25 @@
 import { Modal, Button, Steps } from 'antd';
-import { useRef, useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
 import { observer } from '@formily/react';
 import Device from './device';
 import Product from './product';
 import Action from './actions';
 import Service from './service';
-// import { model } from '@formily/reactive';
 import './index.less';
 import DeviceModel from './model';
 import { onlyMessage } from '@/utils/util';
+import { ActionsDeviceProps } from '../../../typings';
 
 export const service = new Service<any>('');
 
-export default observer(() => {
+interface Props {
+  value: Partial<ActionsDeviceProps> | any;
+  save: (data: any) => void;
+  cancel: () => void;
+  name: number;
+}
+
+export default observer((props: Props) => {
   const [open, setOpen] = useState<boolean>(true);
   // const [data, setData] = useState<any>({})
   const formRef = useRef<any>();
@@ -26,13 +33,14 @@ export default observer(() => {
     {
       key: 'device',
       title: '选择设备',
-      content: <Device />,
+      content: <Device name={props.name} />,
     },
     {
       key: 'action',
       title: '执行动作',
       content: (
         <Action
+          name={props.name}
           get={(item: any) => {
             formRef.current = item;
           }}
@@ -60,9 +68,26 @@ export default observer(() => {
 
   const save = async () => {
     const value = await formRef.current?.validateFields();
-    console.log(value);
+    const item = {
+      selector: 'fixed',
+      source: 'fixed',
+      selectorValues: [
+        {
+          value: DeviceModel.deviceDetail.id || DeviceModel.deviceDetail.id[0],
+          name: DeviceModel.deviceDetail.name,
+        },
+      ],
+      productId: DeviceModel.productId[0],
+      message: value,
+    };
+    // console.log('device', item)
+    props.save(item);
   };
 
+  useEffect(() => {
+    console.log(props.value);
+  }, [props.value]);
+
   return (
     <Modal
       title={'执行动作'}

+ 6 - 1
src/pages/rule-engine/Scene/Save/action/DeviceOutput/model.ts

@@ -1,6 +1,7 @@
 // 模型
 import { ProductItem } from '@/pages/device/Product/typings';
 import { model } from '@formily/reactive';
+import { ActionsDeviceProps } from '../../../typings';
 
 type ModelType = {
   steps: {
@@ -10,8 +11,10 @@ type ModelType = {
   }[];
   current: number;
   productId: string[];
-  deviceId: string[];
+  deviceId: any[];
   productDetail: ProductItem | any;
+  device: Partial<ActionsDeviceProps>;
+  deviceDetail: any;
 };
 
 const DeviceModel = model<ModelType>({
@@ -20,6 +23,8 @@ const DeviceModel = model<ModelType>({
   productId: [],
   deviceId: [],
   productDetail: {},
+  device: {},
+  deviceDetail: {},
 });
 
 export default DeviceModel;

+ 13 - 2
src/pages/rule-engine/Scene/Save/action/Modal/add.tsx

@@ -25,10 +25,21 @@ export default (props: Props) => {
   }, [props.data]);
 
   const actionTypeComponent = (type: string) => {
-    console.log(type, '111');
     switch (type) {
       case 'device':
-        return <Device />;
+        return (
+          <Device
+            value={props.data?.device}
+            save={(data: any) => {
+              setActionType('');
+              props.save(data);
+            }}
+            name={props.name}
+            cancel={() => {
+              setActionType('');
+            }}
+          />
+        );
       case 'notify':
         return (
           <Notify