Quellcode durchsuchen

fix: 合并代码

jackhoo_98 vor 3 Jahren
Ursprung
Commit
d5a9db9e5d
26 geänderte Dateien mit 291 neuen und 129 gelöschten Zeilen
  1. 57 1
      public/icons/iconfont.js
  2. 2 2
      src/components/ProTableCard/CardItems/Scene/index.tsx
  3. 3 4
      src/components/SearchComponent/index.tsx
  4. 21 0
      src/global.less
  5. 24 6
      src/pages/device/Instance/Detail/MapChannel/index.tsx
  6. 1 1
      src/pages/device/components/Metadata/Base/index.tsx
  7. 4 1
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx
  8. 2 2
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/WriteProperty.tsx
  9. 2 4
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/index.tsx
  10. 19 9
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/device/index.tsx
  11. 13 5
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/index.tsx
  12. 1 1
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/model.ts
  13. 15 5
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/product/index.tsx
  14. 6 2
      src/pages/rule-engine/Scene/Save/action/ListItem/FilterGroup.tsx
  15. 1 0
      src/pages/rule-engine/Scene/Save/action/ListItem/Item.tsx
  16. 1 0
      src/pages/rule-engine/Scene/Save/action/ListItem/index.less
  17. 4 0
      src/pages/rule-engine/Scene/Save/action/notify/index.tsx
  18. 0 2
      src/pages/rule-engine/Scene/Save/device/device.tsx
  19. 27 22
      src/pages/rule-engine/Scene/Save/device/deviceList.tsx
  20. 15 3
      src/pages/rule-engine/Scene/Save/device/index.tsx
  21. 31 23
      src/pages/rule-engine/Scene/Save/device/product.tsx
  22. 27 22
      src/pages/rule-engine/Scene/Save/device/type.tsx
  23. 1 0
      src/pages/rule-engine/Scene/Save/terms/index.less
  24. 2 0
      src/pages/rule-engine/Scene/Save/terms/term.tsx
  25. 12 13
      src/pages/system/Apply/Save/index.tsx
  26. 0 1
      src/pages/system/Menu/components/Icons/icon.ts

Datei-Diff unterdrückt, da er zu groß ist
+ 57 - 1
public/icons/iconfont.js


+ 2 - 2
src/components/ProTableCard/CardItems/Scene/index.tsx

@@ -126,7 +126,7 @@ const actionFilter = (terms: any, isLast: boolean, index: number) => {
         str += `${handleOptionsLabel(iItem, _isLast ? item.terms[iIndex + 1]?.[3] : undefined)}`;
       });
     }
-    str += iindex < terms.length - 1 ? item.termType : '';
+    str += iindex < terms.length - 1 ? terms[iindex + 1].termType : '';
   });
 
   return str;
@@ -154,7 +154,7 @@ const conditionsRender = (when: any[], index: number) => {
               })
               .join('')
           : '';
-        whenStr += !tLast ? tSer : tSer + termsItem.termType;
+        whenStr += !tLast ? tSer : tSer + terms[tIndex + 1].termType;
       }
     });
     return whenStr;

+ 3 - 4
src/components/SearchComponent/index.tsx

@@ -244,7 +244,6 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
                   }
 
                   f.setFieldState(typeFiled.query('.value'), async (state) => {
-                    console.log(state.value);
                     state.componentType = 'Select';
                     state.dataSource = __option;
                     state.componentProps = {
@@ -485,7 +484,6 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
     // 合并初始化的值
 
     //expand false 6组条件 true 1组条件
-
     if (initParam && initParam[0].terms && initParam[0].terms.length > 1) {
       handleExpand();
     }
@@ -572,7 +570,7 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
     uiParamRef.current = ui2Server(value);
     if (
       (_terms.terms1 && _terms.terms1.length > 1) ||
-      (_terms.terms2 && _terms.terms2.length > 1)
+      (_terms.terms2 && _terms.terms2.length >= 1)
     ) {
       // 展开高级搜索
       setExpand(false);
@@ -615,7 +613,8 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
     if (q && props.model !== 'simple' && value && !value.terms1?.[0].value && !value.terms2) {
       // 表单有值的情况下,不改变表单
       if (_target && tar && _target === tar) {
-        form.setInitialValues(JSON.parse(q));
+        const _qJson: any = JSON.parse(q);
+        form.setInitialValues(_qJson);
         handleSearch(false);
         return;
       }

+ 21 - 0
src/global.less

@@ -160,6 +160,7 @@ input[type='tel'] {
 #driver-page-overlay {
   opacity: 0.35 !important;
 }
+
 .ant-pagination-mini .ant-pagination-jump-prev,
 .ant-pagination-mini .ant-pagination-jump-next {
   display: none;
@@ -169,3 +170,23 @@ input[type='tel'] {
   display: flex;
   justify-content: flex-end;
 }
+
+.ant-formily-array-table
+  .ant-table
+  td
+  .ant-formily-item:not(.ant-formily-item-feedback-layout-popover)
+  .ant-formily-item-help {
+  position: inherit;
+  top: 100%;
+  z-index: 1;
+  width: 100%;
+  margin-top: 3px;
+  padding: 3px;
+  font-size: 12px;
+  background: #fff;
+  border-radius: 3px;
+  box-shadow: 0 0 10px #eee;
+  transform: translateY(0);
+  opacity: 1;
+  animation: none;
+}

+ 24 - 6
src/pages/device/Instance/Detail/MapChannel/index.tsx

@@ -1,7 +1,7 @@
 import useDomFullHeight from '@/hooks/document/useDomFullHeight';
 import { createForm, Field, FormPath, onFieldReact } from '@formily/core';
 import { FormProvider, createSchemaField } from '@formily/react';
-import { Badge, Button, Card, Tooltip } from 'antd';
+import { Badge, Button, Card, Spin, Tooltip } from 'antd';
 import { useEffect, useState } from 'react';
 import { FormItem, ArrayTable, Editable, Select } from '@formily/antd';
 import PermissionButton from '@/components/PermissionButton';
@@ -28,6 +28,7 @@ const MapChannel = (props: Props) => {
   const [properties, setProperties] = useState<any>([]);
   const [channelList, setChannelList] = useState<any>([]);
   const [visible, setVisible] = useState<boolean>(false);
+  const [loading, setLoading] = useState<boolean>(false);
 
   const Render = (propsName: any) => {
     const text = properties.find((item: any) => item.metadataId === propsName.value);
@@ -62,6 +63,7 @@ const MapChannel = (props: Props) => {
           title: '确认解绑',
           disabled: !record(index)?.id,
           onConfirm: async () => {
+            setLoading(true);
             remove(record(index)?.id);
           },
         }}
@@ -369,6 +371,7 @@ const MapChannel = (props: Props) => {
   };
 
   useEffect(() => {
+    setLoading(true);
     service
       .getChannel({
         paging: false,
@@ -418,14 +421,23 @@ const MapChannel = (props: Props) => {
           //删除物模型
           const items = array.filter((item: any) => item.metadataName);
           setProperties(items);
+          setTimeout(() => {
+            setLoading(false);
+          }, 500);
           const delList = array.filter((a: any) => !a.metadataName).map((b: any) => b.id);
           //删除后解绑
           if (delList && delList.length !== 0) {
             service.removeMap('device', data.id, delList);
+            setTimeout(() => {
+              setLoading(false);
+            }, 500);
           }
         }
       });
     } else {
+      setTimeout(() => {
+        setLoading(false);
+      }, 500);
       setEmpty(true);
     }
   }, [reload]);
@@ -448,6 +460,7 @@ const MapChannel = (props: Props) => {
             <Button
               type="primary"
               onClick={async () => {
+                setLoading(true);
                 const value: any = await form.submit();
                 const arr = value.requestList.filter((i: any) => i.channelId);
                 if (arr && arr.length !== 0) {
@@ -459,11 +472,16 @@ const MapChannel = (props: Props) => {
               保存
             </Button>
           </div>
-          <div className="array-table">
-            <FormProvider form={form}>
-              <SchemaField schema={schema} scope={{ useAsyncDataSource, getCollector, getPoint }} />
-            </FormProvider>
-          </div>
+          <Spin spinning={loading}>
+            <div className="array-table">
+              <FormProvider form={form}>
+                <SchemaField
+                  schema={schema}
+                  scope={{ useAsyncDataSource, getCollector, getPoint }}
+                />
+              </FormProvider>
+            </div>
+          </Spin>
         </>
       )}
       {visible && (

+ 1 - 1
src/pages/device/components/Metadata/Base/index.tsx

@@ -179,7 +179,7 @@ const BaseMetadata = observer((props: Props) => {
         }}
         toolbar={{
           search: {
-            placeholder: '请输入标识',
+            placeholder: '请输入名称',
             allowClear: true,
             onSearch: handleSearch,
           },

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

@@ -132,7 +132,6 @@ export default observer((props: Props) => {
             fieldNames={{ label: 'text', value: 'value' }}
             placeholder={'请选择'}
             onChange={(e, options: any) => {
-              console.log(options?.text);
               setValue(e);
               setLabelValue(options?.text);
               // DeviceModel.propertiesValue = options?.text
@@ -162,6 +161,10 @@ export default observer((props: Props) => {
         return (
           <Input
             value={value}
+            readOnly
+            onClick={() => {
+              setVisible(true);
+            }}
             style={{ width: '100%', textAlign: 'left' }}
             addonAfter={
               <EnvironmentOutlined

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

@@ -63,7 +63,7 @@ export default (props: Props) => {
   }, [props.properties]);
 
   useEffect(() => {
-    if (props.onChange && propertiesValue) {
+    if (props.onChange) {
       const obj = {
         [propertiesId || 0]: {
           value: propertiesValue,
@@ -127,7 +127,7 @@ export default (props: Props) => {
             }}
             onChange={(value, sources, text) => {
               // console.log(value, sources);
-              console.log(text);
+              // console.log(text);
               ref.current = text;
               setPropertiesValue(value);
               setSource(sources);

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

@@ -174,6 +174,7 @@ export default observer((props: Props) => {
               () => ({
                 validator(_, value) {
                   const isValue = Object.values(value)?.[0];
+                  // console.log('-------',isValue,value)
                   if (isValue) {
                     return Promise.resolve();
                   }
@@ -188,19 +189,16 @@ export default observer((props: Props) => {
               branchGroup={props.branchGroup}
               thenName={props.thenName}
               onColumns={(col, text) => {
-                // console.log('col',col,[col])
                 DeviceModel.columns = [col];
                 DeviceModel.actionName = text;
-                // console.log(text)
               }}
               onChange={(value, text, valueLable) => {
                 const item = value[Object.keys(value)?.[0]]?.value;
-                // console.log(`valueLable`,valueLable)
                 DeviceModel.propertiesName = text;
                 if (valueLable) {
                   DeviceModel.propertiesValue = valueLable;
                 } else {
-                  DeviceModel.propertiesValue = item;
+                  DeviceModel.propertiesValue = `${item}`;
                 }
               }}
               onRest={(value: any) => {

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

@@ -39,6 +39,7 @@ export default observer((props: Props) => {
   const [tagList, setTagList] = useState([]);
   const [list, setList] = useState<any>([]);
   const [isFirst, setIsFirst] = useState(true);
+  const [oldRowKey] = useState(DeviceModel.deviceId);
 
   const TypeList = [
     {
@@ -270,10 +271,9 @@ export default observer((props: Props) => {
     return nodes.filter((it) => {
       if (
         it.children.find(
-          (item: any) =>
-            item.id.indexOf('deviceId' || 'device_id' || 'device_Id') > -1 &&
-            item.type === 'string',
-        )
+          (item: any) => item.id.indexOf('deviceId' || 'device_id' || 'device_Id') > -1,
+        ) &&
+        !it.children.find((item: any) => item.id.indexOf('bolaen') > -1)
       ) {
         return true;
       }
@@ -292,6 +292,7 @@ export default observer((props: Props) => {
       if (res.status === 200) {
         const _data = BuiltInParamsHandleTreeData(res.result);
         const array = filterTree(_data);
+        console.log('--------', array);
         setBuiltInList(array);
       }
     });
@@ -387,12 +388,21 @@ export default observer((props: Props) => {
                     }
                   },
                 }}
-                request={(params) =>
-                  service.query({
+                request={(params) => {
+                  const sorts: any = [{ name: 'createTime', order: 'desc' }];
+
+                  if (oldRowKey) {
+                    sorts.push({
+                      name: 'id',
+                      value: oldRowKey,
+                    });
+                  }
+
+                  return service.query({
                     ...params,
-                    sorts: [{ name: 'createTime', order: 'desc' }],
-                  })
-                }
+                    sorts: sorts,
+                  });
+                }}
                 params={searchParam}
                 cardRender={(record) => (
                   <SceneDeviceCard showBindBtn={false} showTool={false} {...record} />

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

@@ -9,6 +9,7 @@ import './index.less';
 import DeviceModel from './model';
 import { onlyMessage } from '@/utils/util';
 import { ActionsDeviceProps } from '../../../typings';
+import { service as api } from '@/pages/device/Instance/index';
 
 export const service = new Service<any>('');
 
@@ -112,17 +113,14 @@ export default observer((props: Props) => {
     const _type = value.message.messageType;
     if (_type === 'INVOKE_FUNCTION') {
       _options.type = '执行';
-      // _options.properties = value.message.functionId;
       _options.properties = DeviceModel.propertiesName;
     }
     if (_type === 'READ_PROPERTY') {
       _options.type = '读取';
       _options.properties = DeviceModel.propertiesName;
-      // _options.name = DeviceModel.selectorValues[0].name;
     }
     if (_type === 'WRITE_PROPERTY') {
       _options.type = '设置';
-      // _options.properties = Object.keys(value.message.properties)?.[0];
       _options.properties = DeviceModel.propertiesName;
       _options.propertiesValue = DeviceModel.propertiesValue;
       _options.columns = DeviceModel.columns;
@@ -140,13 +138,13 @@ export default observer((props: Props) => {
       }));
       // console.log(_options.taglist, 'taglist')
     }
-    // console.log(DeviceModel.propertiesValue,_options);
+    console.log(DeviceModel.propertiesValue, _options);
     props.save(item, _options);
     init();
   };
 
   useEffect(() => {
-    console.log(props.value);
+    // console.log(props.value);
     if (props.value) {
       DeviceModel.selector = props.value.selector;
       DeviceModel.productId = props.value.productId;
@@ -158,6 +156,9 @@ export default observer((props: Props) => {
           ? props.value.selectorValues?.map((item: any) => item.value)[0]
           : 'deviceId';
     }
+    return () => {
+      init();
+    };
   }, [props.value]);
 
   return (
@@ -216,6 +217,13 @@ export default observer((props: Props) => {
                 ? (DeviceModel.current = 1)
                 : onlyMessage('请选择产品', 'error');
             } else if (value === 2) {
+              if (DeviceModel.deviceId) {
+                api.detail(DeviceModel.deviceId).then((res) => {
+                  if (res.status === 200) {
+                    DeviceModel.deviceDetail = res.result || {};
+                  }
+                });
+              }
               return DeviceModel.deviceId
                 ? (DeviceModel.current = 2)
                 : onlyMessage('请选择设备', 'error');

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

@@ -23,7 +23,7 @@ type ModelType = {
   relationName: string;
   message: any;
   propertiesName: string;
-  propertiesValue: string;
+  propertiesValue: string | any;
   columns: string[];
   actionName: string;
 };

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

@@ -20,6 +20,7 @@ export default observer((props: Props) => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
   const [searchParam, setSearchParam] = useState({});
+  const [oldRowKey] = useState(props.productId);
 
   const columns: ProColumns<ProductItem>[] = [
     {
@@ -239,12 +240,21 @@ export default observer((props: Props) => {
               DeviceModel.deviceId = '';
             },
           }}
-          request={(params) =>
-            service.query({
+          request={(params) => {
+            const sorts: any = [{ name: 'createTime', order: 'desc' }];
+
+            if (oldRowKey) {
+              sorts.push({
+                name: 'id',
+                value: oldRowKey,
+              });
+            }
+
+            return service.query({
               ...params,
-              sorts: [{ name: 'createTime', order: 'desc' }],
-            })
-          }
+              sorts: sorts,
+            });
+          }}
           params={searchParam}
           cardRender={(record) => (
             <SceneProductCard showBindBtn={false} showTool={false} {...record} />

+ 6 - 2
src/pages/rule-engine/Scene/Save/action/ListItem/FilterGroup.tsx

@@ -66,6 +66,9 @@ export default observer((props: TermsProps) => {
               value={props.data.type}
               onChange={(v) => {
                 props.data.type = v;
+                const typeLabel = v === 'and' ? '并且' : '或者';
+                labelRef.current.termType = typeLabel;
+                props.onLabelChange(labelRef.current);
               }}
             />
           </div>
@@ -174,10 +177,11 @@ export default observer((props: TermsProps) => {
                       props.onColumnsChange(optionsColumnsRef.current);
                     }}
                     onLabelChange={(options) => {
-                      let newLabel: any = [];
+                      let newLabel: any = {};
                       const typeLabel = props.data.type === 'and' ? '并且' : '或者';
                       if (labelRef.current?.terms) {
                         labelRef.current?.terms.splice(index, 1, options);
+                        labelRef.current.termType = typeLabel;
                         newLabel = labelRef.current;
                       } else {
                         newLabel = {
@@ -204,7 +208,7 @@ export default observer((props: TermsProps) => {
             </div>
           </Popconfirm>
         </div>
-        {!props.isLast && (
+        {props.isLast && (
           <div className="terms-group-add" onClick={props.onAddGroup}>
             <div className="terms-content">
               <PlusOutlined style={{ fontSize: 12, paddingRight: 4 }} />

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

@@ -402,6 +402,7 @@ export default (props: ItemProps) => {
                   data={termsItem}
                   columns={optionsColumns}
                   isLast={index === thenTerms.length - 1}
+                  isFirst={index === 0}
                   paramsOptions={paramsOptions}
                   label={props.options?.terms?.[index]}
                   actionColumns={props.options?.otherColumns}

+ 1 - 0
src/pages/rule-engine/Scene/Save/action/ListItem/index.less

@@ -263,6 +263,7 @@
       }
 
       .ant-form-item {
+        margin-bottom: 8px;
         &:not(:first-child) {
           .ant-form-item-explain-error {
             padding-left: 80px !important;

+ 4 - 0
src/pages/rule-engine/Scene/Save/action/notify/index.tsx

@@ -63,6 +63,10 @@ export default observer((props: Props) => {
       ...props.value,
       options: { ...props.options },
     };
+    return () => {
+      NotifyModel.current = 0;
+      NotifyModel.notify = {};
+    };
   }, [props.value, props.options]);
 
   const renderComponent = (type: string) => {

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

@@ -34,8 +34,6 @@ export default observer(() => {
 
   useEffect(() => {
     if (form) {
-      console.log('TriggerDeviceModel.selector', TriggerDeviceModel.selector);
-
       form.setFieldsValue({ selector: TriggerDeviceModel.selector });
     }
   }, []);

+ 27 - 22
src/pages/rule-engine/Scene/Save/device/deviceList.tsx

@@ -10,16 +10,16 @@ import { useIntl } from 'umi';
 import { SceneDeviceCard } from '@/components/ProTableCard/CardItems/device';
 import { TriggerDeviceModel } from './addModel';
 import { observer, Observer } from '@formily/reactive-react';
+import { isArray } from 'lodash';
 
 export default observer(() => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
-  const [searchParam, setSearchParam] = useState<any>({
-    pageIndex: TriggerDeviceModel.devicePage,
-    pageSize: TriggerDeviceModel.devicePageSize,
-  });
+  const [searchParam, setSearchParam] = useState<any>({});
 
-  const [loading, setLoading] = useState(true);
+  const [oldRowKey] = useState(TriggerDeviceModel.deviceKeys);
+
+  // const [loading, setLoading] = useState(true);
 
   const columns: ProColumns<DeviceInstance>[] = [
     {
@@ -184,17 +184,14 @@ export default observer(() => {
         enableSave={false}
         bodyStyle={{ padding: 0, paddingBottom: 16 }}
         onSearch={async (data) => {
-          if (loading) {
-            setSearchParam({
-              pageIndex: TriggerDeviceModel.devicePage,
-              pageSize: TriggerDeviceModel.devicePageSize,
-              ...data,
-            });
-            setLoading(true);
-          } else {
-            actionRef.current?.reset?.();
-            setSearchParam(data);
-          }
+          // if (loading) {
+          //   setSearchParam(data);
+          //   setLoading(true);
+          // } else {
+          //
+          // }
+          actionRef.current?.reset?.();
+          setSearchParam(data);
         }}
         target="scene-trugger-device"
         defaultParam={[
@@ -224,7 +221,6 @@ export default observer(() => {
             rowSelection={{
               selectedRowKeys: [...TriggerDeviceModel.deviceKeys],
               onSelect: (record, selected) => {
-                console.log(record);
                 if (selected) {
                   TriggerDeviceModel.deviceKeys.push(record.id);
                   if (TriggerDeviceModel.selectorValues) {
@@ -253,12 +249,21 @@ export default observer(() => {
               TriggerDeviceModel.devicePage = page;
               TriggerDeviceModel.devicePageSize = size;
             }}
-            request={(params) =>
-              service.query({
+            request={(params) => {
+              const sorts: any[] = [{ name: 'createTime', order: 'desc' }];
+              if (oldRowKey && isArray(oldRowKey)) {
+                oldRowKey.forEach((v) => {
+                  sorts.push({
+                    name: 'id',
+                    value: v,
+                  });
+                });
+              }
+              return service.query({
                 ...params,
-                sorts: [{ name: 'createTime', order: 'desc' }],
-              })
-            }
+                sorts: sorts,
+              });
+            }}
             params={searchParam}
             cardRender={(record) => (
               <SceneDeviceCard showBindBtn={false} showTool={false} {...record} />

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

@@ -48,14 +48,21 @@ export default observer((props: Props) => {
 
     const _label = [
       <div style={{ display: 'flex', alignItems: 'center' }}>
-        {options.selectorIcon ? <AIcon type={options.selectorIcon} /> : null}
+        {options.selectorIcon ? (
+          <AIcon type={options.selectorIcon} style={{ paddingRight: 4 }} />
+        ) : null}
         <span className="trigger-options-name">{options.name}</span>
         {options.extraName ? <span>{options.extraName}</span> : null}
       </div>,
     ];
     if (!options.onlyName) {
       if (options.productName) {
-        _label.push(<span className="trigger-options-type">{options.productName}</span>);
+        _label.push(
+          <div style={{ display: 'flex', alignItems: 'center' }}>
+            <AIcon type={'icon-chanpin1'} style={{ paddingRight: 4 }} />
+            <span className="trigger-options-type">{options.productName}</span>
+          </div>,
+        );
       }
       if (options.when) {
         _label.push(<span className="trigger-options-when">{options.when}</span>);
@@ -70,7 +77,12 @@ export default observer((props: Props) => {
         _label.push(<span className="trigger-options-action">{options.action}</span>);
       }
       if (options.type) {
-        _label.push(<span className="trigger-options-type">{options.type}</span>);
+        _label.push(
+          <div style={{ display: 'flex', alignItems: 'center' }}>
+            <AIcon type={options.typeIcon} style={{ paddingRight: 4 }} />
+            <span className="trigger-options-type">{options.type}</span>
+          </div>,
+        );
       }
     }
     return _label;

+ 31 - 23
src/pages/rule-engine/Scene/Save/device/product.tsx

@@ -23,12 +23,10 @@ export const handleMetadata = (metadata?: string) => {
 export default observer(() => {
   const actionRef = useRef<ActionType>();
   const intl = useIntl();
-  const [searchParam, setSearchParam] = useState<any>({
-    pageIndex: TriggerDeviceModel.productPage,
-    pageSize: TriggerDeviceModel.productPageSize,
-  });
+  const [searchParam, setSearchParam] = useState<any>({});
+  const [oldRowKey] = useState(TriggerDeviceModel.productId);
 
-  const [loading, setLoading] = useState(true);
+  // const [loading, setLoading] = useState(true);
 
   const columns: ProColumns<ProductItem>[] = [
     {
@@ -210,17 +208,19 @@ export default observer(() => {
         enableSave={false}
         bodyStyle={{ padding: 0, paddingBottom: 16 }}
         onSearch={async (data) => {
-          if (loading) {
-            setSearchParam({
-              pageIndex: TriggerDeviceModel.devicePage,
-              pageSize: TriggerDeviceModel.devicePageSize,
-              ...data,
-            });
-            setLoading(true);
-          } else {
-            actionRef.current?.reset?.();
-            setSearchParam(data);
-          }
+          // if (loading) {
+          //   setSearchParam({
+          //     pageIndex: TriggerDeviceModel.devicePage,
+          //     pageSize: TriggerDeviceModel.devicePageSize,
+          //     ...data,
+          //   });
+          //   setLoading(true);
+          // } else {
+          //   actionRef.current?.reset?.();
+          //   setSearchParam(data);
+          // }
+          actionRef.current?.reset?.();
+          setSearchParam(data);
         }}
         target="department-assets-product"
       />
@@ -239,10 +239,9 @@ export default observer(() => {
           type: 'radio',
           selectedRowKeys: [TriggerDeviceModel.productId],
           onChange: (_, selectedRows) => {
-            console.log('onChange', selectedRows);
             TriggerDeviceModel.productId = selectedRows.map((item) => item.id)[0];
             TriggerDeviceModel.productDetail = selectedRows?.[0];
-            handleMetadata(TriggerDeviceModel.productDetail.metadata);
+            handleMetadata(TriggerDeviceModel.productDetail?.metadata);
             // 初始化选择设备类型以及触发类型
             TriggerDeviceModel.deviceKeys = [];
             TriggerDeviceModel.orgId = '';
@@ -257,12 +256,21 @@ export default observer(() => {
           TriggerDeviceModel.productPage = page;
           TriggerDeviceModel.productPageSize = size;
         }}
-        request={(params) =>
-          service.query({
+        request={(params) => {
+          const sorts: any = [{ name: 'createTime', order: 'desc' }];
+
+          if (oldRowKey) {
+            sorts.push({
+              name: 'id',
+              value: oldRowKey,
+            });
+          }
+
+          return service.query({
             ...params,
-            sorts: [{ name: 'createTime', order: 'desc' }],
-          })
-        }
+            sorts: sorts,
+          });
+        }}
         params={searchParam}
         cardRender={(record) => (
           <SceneProductCard showBindBtn={false} showTool={false} {...record} />

+ 27 - 22
src/pages/rule-engine/Scene/Save/device/type.tsx

@@ -92,12 +92,31 @@ export default forwardRef((props: Props, ref) => {
     OperatorType.invokeFunction,
   ];
 
+  const handleFunction = (fcItem: any) => {
+    if (fcItem) {
+      const _properties = fcItem.valueType ? fcItem.valueType.properties : fcItem.inputs;
+      const array = [];
+      for (const datum of _properties) {
+        array.push({
+          id: datum.id,
+          name: datum.name,
+          type: datum.valueType ? datum.valueType.type : '-',
+          format: datum.valueType ? datum.valueType.format : undefined,
+          options: datum.valueType ? datum.valueType.elements : undefined,
+          value: undefined,
+        });
+      }
+      setFunctionItem(array);
+    }
+  };
+
   const handleInit = (data: DeviceModelProps) => {
     form.setFieldsValue({
       ...data.operation,
     });
 
     const newTypeList = [...TypeList];
+    console.log('handleInit', data);
 
     if (data.metadata.events?.length) {
       newTypeList.push(TypeEnum.reportEvent);
@@ -129,12 +148,18 @@ export default forwardRef((props: Props, ref) => {
       if (_reportProperty.length) {
         newTypeList.push(TypeEnum.reportProperty);
       }
-      console.log('data.metadata.properties', data.metadata.properties);
     }
 
     if (data.metadata.functions?.length) {
       newTypeList.push(TypeEnum.invokeFunction);
       setFunctions(data.metadata.functions);
+
+      if (data.operation?.functionId) {
+        const fcItem = data.metadata.functions.find(
+          (item) => item.id === data.operation!.functionId,
+        );
+        handleFunction(fcItem);
+      }
     }
 
     setTypeList(newTypeList);
@@ -191,7 +216,6 @@ export default forwardRef((props: Props, ref) => {
                   style={{ width: '100%' }}
                   fieldNames={{ label: 'name', value: 'id' }}
                   onSelect={(v: any, propertyItem: any) => {
-                    console.log(v);
                     TriggerDeviceModel.options.action = '读取' + propertyItem.name;
                   }}
                 />
@@ -207,7 +231,6 @@ export default forwardRef((props: Props, ref) => {
             <Operation
               propertiesList={writeProperty}
               onSelect={(a, item) => {
-                console.log(a);
                 TriggerDeviceModel.options.action = '修改' + item.name;
               }}
             />
@@ -221,7 +244,6 @@ export default forwardRef((props: Props, ref) => {
               style={{ width: '100%' }}
               fieldNames={{ label: 'name', value: 'id' }}
               onSelect={(v: any, evenItem: any) => {
-                console.log(v);
                 TriggerDeviceModel.options.action = evenItem.name + '上报';
               }}
             />
@@ -245,25 +267,8 @@ export default forwardRef((props: Props, ref) => {
                     option.name.toLowerCase().indexOf(input.toLowerCase()) >= 0
                   }
                   onSelect={(v: any, fcItem: any) => {
-                    console.log(v);
                     TriggerDeviceModel.options.action = '执行' + fcItem.name;
-                    if (fcItem) {
-                      const _properties = fcItem.valueType
-                        ? fcItem.valueType.properties
-                        : fcItem.inputs;
-                      const array = [];
-                      for (const datum of _properties) {
-                        array.push({
-                          id: datum.id,
-                          name: datum.name,
-                          type: datum.valueType ? datum.valueType.type : '-',
-                          format: datum.valueType ? datum.valueType.format : undefined,
-                          options: datum.valueType ? datum.valueType.elements : undefined,
-                          value: undefined,
-                        });
-                      }
-                      setFunctionItem(array);
-                    }
+                    handleFunction(fcItem);
                   }}
                 />
               </Form.Item>

+ 1 - 0
src/pages/rule-engine/Scene/Save/terms/index.less

@@ -135,6 +135,7 @@
     }
 
     .ant-form-item {
+      margin-bottom: 8px;
       &:not(:first-child) {
         .ant-form-item-explain-error {
           padding-left: 80px !important;

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

@@ -65,6 +65,8 @@ export default observer((props: TermsProps) => {
               value={props.data.type}
               onChange={(v) => {
                 props.data.type = v;
+                FormModel.current.options!.when[props.whenName].terms[props.name].termType =
+                  v === 'and' ? '并且' : '或者';
               }}
             />
           </div>

+ 12 - 13
src/pages/system/Apply/Save/index.tsx

@@ -248,22 +248,18 @@ const Save = () => {
       });
       onFieldReact('apiServer.ipWhiteList', (field: any) => {
         const value = (field as Field).value;
-        console.log(value);
         const pattern =
           /((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(\.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}/;
         if (value) {
           const str = value?.split(/[\n,]/g).filter((i: any) => i && i.trim());
-          console.log(str);
-          str.forEach((item: any) => {
-            const ip = pattern.test(item);
-            console.log(ip);
-            if (!ip) {
-              field.selfErrors = `[${item}]不是正确的IP地址`;
-              return;
-            } else {
-              field.selfErrors = '';
-            }
-          });
+          // console.log(str);
+          const NoIP = str.find((item: any) => !pattern.test(item));
+          console.log(NoIP);
+          if (NoIP) {
+            field.selfErrors = `[${NoIP}]不是正确的IP地址`;
+          } else {
+            field.selfErrors = '';
+          }
         } else {
           field.selfErrors = '';
         }
@@ -675,6 +671,9 @@ const Save = () => {
         labelAlign: 'left',
       },
       'x-component': 'UploadImage',
+      'x-component-props': {
+        errorMessage: '请上传.jpg.png.jfif.pjp.pjpeg.jpeg格式的图片',
+      },
     },
     'sso.configuration.oauth2.userInfoUrl': {
       type: 'string',
@@ -1625,7 +1624,7 @@ const Save = () => {
                 default: [{}],
                 title: '参数',
                 'x-decorator': 'FormItem',
-                required: true,
+                // required: true,
                 'x-component': 'ArrayTable',
                 'x-reactions': {
                   dependencies: ['provider'],

+ 0 - 1
src/pages/system/Menu/components/Icons/icon.ts

@@ -38,7 +38,6 @@ export default [
   'icon-Vector',
   'icon-Union',
   'icon-shebeigaojing',
-  'icon-chanpinfenlei1',
   'icon-bianyuanwangguan',
   'icon-wuguanli',
   'icon-yunyunjieru',