瀏覽代碼

fix: bug#8574、8804、8646、8696、8752、8753、8759、8776、8796

xieyonghong 3 年之前
父節點
當前提交
6aa8a74eb0

+ 8 - 0
src/global.less

@@ -124,6 +124,14 @@ ol {
   text-overflow: ellipsis;
 }
 
+.ellipsisFn(@num: 1, @width: 100%) {
+  display: -webkit-box;
+  max-width: @width;
+  overflow: hidden;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: @num;
+}
+
 .ellipsis-70 {
   width: 70%;
   overflow: hidden;

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

@@ -1,7 +1,7 @@
 import type { TermsType, TermsVale } from '@/pages/rule-engine/Scene/typings';
 import { DropdownButton, ParamsDropdown } from '@/pages/rule-engine/Scene/Save/components/Buttons';
 import { DeleteOutlined, PlusOutlined } from '@ant-design/icons';
-import { useEffect, useState, useCallback } from 'react';
+import { useEffect, useState, useCallback, useRef } from 'react';
 import classNames from 'classnames';
 import { observer } from '@formily/react';
 import { queryBuiltInParams } from '@/pages/rule-engine/Scene/Save/action/service';
@@ -11,9 +11,11 @@ import { Space } from 'antd';
 
 interface FilterProps {
   thenName: number;
+  branchGroup?: number;
+  action?: number;
   data?: TermsType;
   onChange: (value: TermsType) => void;
-  onLableChange: (lb: string) => void;
+  onLabelChange: (lb: string) => void;
   onAdd: () => void;
   onDelete: () => void;
 }
@@ -26,11 +28,17 @@ export default observer((props: FilterProps) => {
 
   const [BuiltInOptions, setBuiltInOptions] = useState<any[]>([]);
   const [columnOptions, setColumnOptions] = useState<any[]>([]);
-  const [ttOptions, setTtOptions] = useState<any[]>([]);
+  const [ttOptions, setTtOptions] = useState<any>([]);
   const [valueOptions] = useState<any[]>([]);
   const [valueType, setValueType] = useState('');
   const [label, setLabel] = useState<any[]>([undefined, undefined, {}]);
 
+  const ValueRef = useRef<Partial<TermsType>>({
+    column: '',
+    termType: '',
+    value: undefined,
+  });
+
   const valueChange = useCallback(
     (_value: any) => {
       props.onChange?.({ ..._value });
@@ -41,8 +49,8 @@ export default observer((props: FilterProps) => {
   const valueEventChange = useCallback(
     (_v: any) => {
       valueChange({
-        column,
-        termType,
+        column: ValueRef.current.column,
+        termType: ValueRef.current.termType,
         value: _v,
       });
     },
@@ -54,7 +62,7 @@ export default observer((props: FilterProps) => {
     const _termTypeOptions: any[] =
       node.termTypes?.map((tItem: any) => ({ title: tItem.name, key: tItem.id })) || [];
     setTtOptions(_termTypeOptions);
-    setValueType(node.dataType);
+    setValueType(node.dataType || node.type);
   };
 
   const handleName = (data: any) => {
@@ -88,10 +96,17 @@ export default observer((props: FilterProps) => {
     return [];
   };
 
-  const getParmas = () => {
-    queryBuiltInParams(FormModel.current, { action: props.thenName }).then((res: any) => {
+  const getParams = () => {
+    const _params = {
+      branch: props.thenName,
+      branchGroup: props.branchGroup,
+      action: props.action,
+    };
+    queryBuiltInParams(FormModel.current, _params).then((res: any) => {
       if (res.status === 200) {
-        const params = handleTreeData(res.result);
+        const params = handleTreeData(
+          res.result.filter((item: any) => !item.id.includes(`action_${props.action}`)),
+        );
         setColumnOptions(params);
         setBuiltInOptions(params);
       }
@@ -124,7 +139,7 @@ export default observer((props: FilterProps) => {
     const _v = Object.values(label[2]);
     if (_v.length && label[1]) {
       const _l = handleOptionsLabel(label[0], label[1], _v.length > 1 ? _v : _v[0]);
-      props.onLableChange?.(_l);
+      props.onLabelChange?.(_l);
     }
   }, [label]);
 
@@ -132,13 +147,15 @@ export default observer((props: FilterProps) => {
     if (props.data) {
       setColumn(props.data.column || '');
       setTermType(props.data.termType || '');
+      console.log('valueChange-filter-effect', props.data.value);
       setValue(props.data.value);
+      ValueRef.current = props.data || {};
     }
   }, [props.data]);
 
   useEffect(() => {
     if (props.data) {
-      getParmas();
+      getParams();
     }
   }, []);
 
@@ -162,7 +179,7 @@ export default observer((props: FilterProps) => {
             onChange={(_value, item) => {
               setValue({
                 value: undefined,
-                source: 'manual',
+                source: 'fixed',
               });
               paramChange(item);
               setColumn(_value!);
@@ -177,15 +194,17 @@ export default observer((props: FilterProps) => {
                 label[1] = _termTypeValue;
                 setTermType(_termTypeValue);
               } else {
+                label[1] = '';
                 setTermType('');
               }
+              ValueRef.current.column = _value!;
               label[0] = node.fullName;
               setLabel([...label]);
               valueChange({
                 column: _value,
                 value: {
                   value: undefined,
-                  source: 'manual',
+                  source: 'fixed',
                 },
                 termType: _termTypeValue,
               });
@@ -210,7 +229,7 @@ export default observer((props: FilterProps) => {
 
               label[1] = v;
               setLabel([...label]);
-
+              ValueRef.current.termType = v;
               valueChange({
                 column: props.data!.column,
                 value: value as TermsVale,
@@ -267,6 +286,7 @@ export default observer((props: FilterProps) => {
               BuiltInOptions={BuiltInOptions}
               showLabelKey="fullName"
               onChange={(v, lb) => {
+                console.log('valueChange4', v);
                 setValue({
                   ...v,
                 });
@@ -282,7 +302,7 @@ export default observer((props: FilterProps) => {
           className="filter-add-button"
           onClick={() => {
             props.onAdd();
-            getParmas();
+            getParams();
           }}
         >
           <PlusOutlined style={{ paddingRight: 16 }} /> 添加过滤条件

+ 13 - 4
src/pages/rule-engine/Scene/Save/action/ListItem/Item.tsx

@@ -1,4 +1,4 @@
-import { useEffect, useState } from 'react';
+import { useEffect, useState, useRef } from 'react';
 import Modal from '../Modal/add';
 import type { ActionsType } from '@/pages/rule-engine/Scene/typings';
 import { DeleteOutlined } from '@ant-design/icons';
@@ -15,6 +15,7 @@ export enum ParallelEnum {
 export type ParallelType = keyof typeof ParallelEnum;
 interface ItemProps {
   thenName: number;
+  branchGroup?: number;
   name: number;
   data: ActionsType;
   type: ParallelType;
@@ -43,6 +44,7 @@ export default (props: ItemProps) => {
   const [visible, setVisible] = useState<boolean>(false);
   const [triggerVisible, setTriggerVisible] = useState<boolean>(false);
   const [op, setOp] = useState<any>(props.options);
+  const cacheValueRef = useRef<any>({});
 
   useEffect(() => {
     setOp(props.options);
@@ -261,6 +263,10 @@ export default (props: ItemProps) => {
     );
   };
 
+  useEffect(() => {
+    cacheValueRef.current = props.data;
+  }, [props.data]);
+
   return (
     <div className="actions-item-warp">
       <div className="actions-item">
@@ -282,6 +288,8 @@ export default (props: ItemProps) => {
       </div>
       {props.parallel ? null : (
         <FilterCondition
+          action={props.name}
+          branchGroup={props.branchGroup}
           thenName={props.thenName}
           data={props.data.terms?.[0]}
           onAdd={() => {
@@ -291,6 +299,7 @@ export default (props: ItemProps) => {
                 ..._data,
                 terms: [{}],
               };
+              cacheValueRef.current = _data;
               props.onUpdate(_data, op);
             }
           }}
@@ -298,14 +307,14 @@ export default (props: ItemProps) => {
             const _data = props.data;
             if (_data.terms) {
               _data.terms = [termsData];
+              cacheValueRef.current = _data;
               props.onUpdate(_data, {
                 ...op,
               });
             }
           }}
-          onLableChange={(lb) => {
-            const _data = props.data;
-            props.onUpdate(_data, {
+          onLabelChange={(lb) => {
+            props.onUpdate(cacheValueRef.current, {
               ...op,
               terms: lb,
             });

+ 4 - 3
src/pages/rule-engine/Scene/Save/action/ListItem/List.tsx

@@ -20,6 +20,7 @@ export default (props: ListProps) => {
 
   useEffect(() => {
     setActions(props.actions);
+    console.log('list-change', props.actions);
   }, [props.actions]);
 
   return (
@@ -27,6 +28,7 @@ export default (props: ListProps) => {
       {actions.map((item, index) => (
         <Item
           thenName={props.thenName}
+          branchGroup={props.parallel ? 1 : 0}
           name={index}
           data={item}
           type={props.type}
@@ -37,8 +39,6 @@ export default (props: ListProps) => {
             props.onDelete(index);
           }}
           onUpdate={(data, options) => {
-            console.log('addItem', options);
-
             props.onAdd({
               ...item,
               ...data,
@@ -57,7 +57,8 @@ export default (props: ListProps) => {
       </AddButton>
       {visible && (
         <Modal
-          type={props.type}
+          // type={props.type}
+          parallel={props.parallel}
           name={props.actions.length + 1}
           data={{
             key: `${props.type}_${props.actions.length}`,

+ 4 - 5
src/pages/rule-engine/Scene/Save/components/Buttons/Dropdown.tsx

@@ -77,7 +77,6 @@ const DropdownButton = (props: DropdownButtonProps) => {
           onSelect={treeSelect}
           treeData={props.options}
           fieldNames={props.fieldNames}
-          height={500}
         />
       </div>
     );
@@ -85,7 +84,7 @@ const DropdownButton = (props: DropdownButtonProps) => {
 
   const _options = !props.isTree ? { menu: menuOptions } : { dropdownRender: () => DropdownRender };
 
-  const findLable = (value: string, data: DropdownButtonOptions[]): boolean => {
+  const findLabel = (value: string, data: DropdownButtonOptions[]): boolean => {
     let isLabel = false;
     return data.some((item) => {
       if (item.key === value) {
@@ -97,7 +96,7 @@ const DropdownButton = (props: DropdownButtonProps) => {
         setLoading(false);
         isLabel = true;
       } else if (item.children) {
-        isLabel = findLable(value, item.children);
+        isLabel = findLabel(value, item.children);
       }
       return isLabel;
     });
@@ -109,13 +108,13 @@ const DropdownButton = (props: DropdownButtonProps) => {
       setLabel('');
     } else {
       setLoading(true);
-      findLable(props.value, props.options);
+      findLabel(props.value, props.options);
     }
   }, [props.value]);
 
   useEffect(() => {
     if (props.value) {
-      findLable(props.value, props.options);
+      findLabel(props.value, props.options);
       setLoading(true);
     }
   }, [props.options]);

+ 22 - 19
src/pages/rule-engine/Scene/Save/components/Buttons/ParamsDropdown.tsx

@@ -65,6 +65,7 @@ export default (props: ParamsDropdownProps) => {
 
   const onValueChange = useCallback(
     (value: any, _label: any) => {
+      console.log('valueChange-activeKey', activeKey);
       setMyValue(value);
       setLabel(_label);
       const changeValue = {
@@ -126,19 +127,20 @@ export default (props: ParamsDropdownProps) => {
           );
         case 'tree':
           return (
-            <Tree
-              selectedKeys={_value ? [_value] : []}
-              onSelect={(selectedKeys, e) => {
-                let titleKey = 'title';
-                if (props.showLabelKey) {
-                  titleKey = props.showLabelKey;
-                }
-                onValueChange(selectedKeys[0], e.node[titleKey]);
-              }}
-              style={{ width: 300 }}
-              treeData={props.BuiltInOptions}
-              height={500}
-            />
+            <div style={{ overflowY: 'auto', maxHeight: 400 }}>
+              <Tree
+                selectedKeys={_value ? [_value] : []}
+                onSelect={(selectedKeys, e) => {
+                  let titleKey = 'title';
+                  if (props.showLabelKey) {
+                    titleKey = props.showLabelKey;
+                  }
+                  onValueChange(selectedKeys[0], e.node[titleKey]);
+                }}
+                style={{ width: 300 }}
+                treeData={props.BuiltInOptions}
+              />
+            </div>
           );
         default:
           return (
@@ -153,10 +155,10 @@ export default (props: ParamsDropdownProps) => {
           );
       }
     },
-    [props],
+    [props, activeKey],
   );
 
-  const findLable = (value: string, data: any[]): boolean => {
+  const findLabel = (value: string, data: any[]): boolean => {
     let isLabel = false;
     return data.some((item) => {
       if (item.key === value) {
@@ -167,7 +169,7 @@ export default (props: ParamsDropdownProps) => {
         setLabel(item[titleKey]);
         isLabel = true;
       } else if (item.children) {
-        isLabel = findLable(value, item.children);
+        isLabel = findLabel(value, item.children);
       }
       return isLabel;
     });
@@ -197,10 +199,11 @@ export default (props: ParamsDropdownProps) => {
     } else if (['enum', 'boolean'].includes(props.valueType)) {
       setLabel(props.name ? props.value.value[props.name] : props.value.value);
     } else if (props.BuiltInOptions) {
-      findLable(props.value?.value, props.BuiltInOptions || []);
+      findLabel(props.value?.value, props.BuiltInOptions || []);
     } else {
       setLabel(props.value?.value);
     }
+    console.log('valueChange-params-effect', props.value?.source, props.value?.value);
     setMyValue(props.value?.value);
     if (props.value?.source) {
       setActiveKey(props.value?.source);
@@ -211,7 +214,7 @@ export default (props: ParamsDropdownProps) => {
 
   useEffect(() => {
     if (props.BuiltInOptions) {
-      findLable(props.value?.value, props.BuiltInOptions || []);
+      findLabel(props.value?.value, props.BuiltInOptions || []);
     }
   }, [props.BuiltInOptions]);
 
@@ -252,7 +255,7 @@ export default (props: ParamsDropdownProps) => {
     <ParamsSelect
       value={myValue}
       onChange={(value, source) => {
-        console.log(value);
+        console.log(value, source);
         setActiveKey(source);
         // props.onChange?.({
         //   value,

+ 2 - 0
src/pages/rule-engine/Scene/Save/components/Buttons/index.less

@@ -74,6 +74,8 @@
 }
 
 .dropdown-content {
+  max-height: 400px;
   padding-top: 4px;
+  overflow-y: auto;
   box-shadow: 0 4px 18px #f3f3f3;
 }

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

@@ -112,7 +112,7 @@ export default (props: TimmingTriggerProps) => {
         <ItemGroup style={{ gap: 16 }}>
           <Form.Item
             name={[...name, 'once']}
-            initialValue={{ time: moment(new Date()).format('HH:mm:ss') }}
+            // initialValue={{ time: moment(new Date()).format('HH:mm:ss') }}
           >
             <TimePicker />
           </Form.Item>

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

@@ -6,7 +6,6 @@ import type { ActionType, ProColumns } from '@jetlinks/pro-table';
 import { service } from '@/pages/device/Instance/index';
 import { isNoCommunity } from '@/utils/util';
 import { service as categoryService } from '@/pages/device/Category';
-import { service as deptService } from '@/pages/system/Department';
 import { useIntl } from 'umi';
 import { SceneDeviceCard } from '@/components/ProTableCard/CardItems/device';
 import { TriggerDeviceModel } from './addModel';
@@ -176,47 +175,6 @@ export default observer(() => {
         },
       },
     },
-    {
-      dataIndex: 'id$dim-assets',
-      title: '所属组织',
-      valueType: 'treeSelect',
-      hideInTable: true,
-      fieldProps: {
-        fieldNames: {
-          label: 'name',
-          value: 'value',
-        },
-      },
-      request: () =>
-        deptService
-          .queryOrgThree({
-            paging: false,
-          })
-          .then((resp) => {
-            const formatValue = (list: any[]) => {
-              const _list: any[] = [];
-              list.forEach((item) => {
-                if (item.children) {
-                  item.children = formatValue(item.children);
-                }
-                _list.push({
-                  ...item,
-                  value: JSON.stringify({
-                    assetType: 'device',
-                    targets: [
-                      {
-                        type: 'org',
-                        id: item.id,
-                      },
-                    ],
-                  }),
-                });
-              });
-              return _list;
-            };
-            return formatValue(resp.result);
-          }),
-    },
   ];
 
   return (

+ 31 - 0
src/pages/rule-engine/Scene/Save/device/index.less

@@ -1,4 +1,5 @@
 @import '~antd/es/style/themes/default.less';
+@import '~@/global.less';
 
 .steps-steps {
   width: 100%;
@@ -100,3 +101,33 @@
     color: #fab247;
   }
 }
+
+.trigger-options-content {
+  .trigger-options-name {
+    .ellipsisFn(1, 10%);
+  }
+
+  //.trigger-options-type {
+  //
+  //}
+  //
+  //.trigger-options-when {
+  //
+  //}
+  //
+  //.trigger-options-time {
+  //
+  //}
+  //
+  //.trigger-options-extraTime {
+  //
+  //}
+  //
+  //.trigger-options-action {
+  //
+  //}
+  //
+  //.trigger-options-type {
+  //
+  //}
+}

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

@@ -11,6 +11,7 @@ import { service } from '@/pages/device/Product/index';
 import { Store } from 'jetlinks-store';
 import { TriggerDeviceModel } from './addModel';
 import { handleMetadata } from './product';
+import { set } from 'lodash';
 
 const defaultDeviceValue = {
   productId: '',
@@ -96,8 +97,9 @@ export default observer(() => {
           options={FormModel.current.options?.trigger}
           onSave={(data, options) => {
             setVisible(false);
-            FormModel.current.options!['trigger'] = options;
-            FormModel.current.trigger!.device = data;
+            console.log('FormModel.current.options', data);
+            set(FormModel.current, ['options', 'trigger'], options);
+            set(FormModel.current, ['trigger', 'device'], data);
           }}
           onCancel={() => {
             setVisible(false);

+ 28 - 25
src/pages/rule-engine/Scene/Save/index.tsx

@@ -83,7 +83,7 @@ export default observer(() => {
         ...defaultBranches,
         {
           when: [],
-          key: 'branckes_2',
+          key: 'branches_2',
           shakeLimit: {
             enabled: false,
             time: 0,
@@ -109,33 +109,36 @@ export default observer(() => {
     if (id) {
       service.detail(id).then((resp) => {
         if (resp.status === 200) {
-          let branches = resp.result.branches || defaultBranches;
+          console.log('defaultBranches', defaultBranches);
+          let branches = resp.result.branches || cloneDeep(defaultBranches);
           // 处理 branches 的 key
           if (branches) {
             branches = branches.map((bItem: ActionBranchesProps, bIndex: number) => {
-              bItem.key = `branches_${new Date().getTime() + bIndex}`;
-              if (bItem.then && bItem.then) {
-                bItem.then = bItem.then.map((tItem) => {
-                  if (tItem.actions) {
-                    tItem.actions = tItem.actions.map((aItem, index) => {
-                      aItem.key = `${aItem.executor}_${new Date().getTime() + index}`;
-                      return aItem;
-                    });
-                  }
-                  return tItem;
-                });
-              }
-              if (bItem.when) {
-                bItem.when = bItem.when.map((wItem, index) => {
-                  wItem.key = `when_${new Date().getTime() + index}`;
-                  if (wItem.terms) {
-                    wItem.terms = wItem.terms.map((wtItem, wtIndex) => {
-                      wtItem.key = `terms_${new Date().getTime() + wtIndex}`;
-                      return wtItem;
-                    });
-                  }
-                  return wItem;
-                });
+              if (!bItem.key) {
+                bItem.key = `branches_${new Date().getTime() + bIndex}`;
+                if (bItem.then && bItem.then) {
+                  bItem.then = bItem.then.map((tItem) => {
+                    if (tItem.actions) {
+                      tItem.actions = tItem.actions.map((aItem, index) => {
+                        aItem.key = `${aItem.executor}_${new Date().getTime() + index}`;
+                        return aItem;
+                      });
+                    }
+                    return tItem;
+                  });
+                }
+                if (bItem.when) {
+                  bItem.when = bItem.when.map((wItem, index) => {
+                    wItem.key = `when_${new Date().getTime() + index}`;
+                    if (wItem.terms) {
+                      wItem.terms = wItem.terms.map((wtItem, wtIndex) => {
+                        wtItem.key = `terms_${new Date().getTime() + wtIndex}`;
+                        return wtItem;
+                      });
+                    }
+                    return wItem;
+                  });
+                }
               }
               return bItem;
             });

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

@@ -17,7 +17,7 @@ export const TermsModel = model<TermsModelProps>({
 
 export default observer(() => {
   const queryColumn = (data: TriggerType) => {
-    service.getParseTerm({ trigger: data }).then((res) => {
+    service.getParseTerm({ trigger: data }).then((res: any) => {
       TermsModel.columnOptions = res;
     });
   };

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

@@ -15,13 +15,13 @@ interface ParamsItemProps {
   isDelete: boolean;
   options: any[];
   onValueChange?: (value: TermsType) => void;
-  onLableChange?: (label: string) => void;
+  onLabelChange?: (label: string) => void;
   onAdd: () => void;
   onDelete: () => void;
 }
 
 const DoubleFilter = ['nbtw', 'btw'];
-const ParasmItem = observer((props: ParamsItemProps) => {
+const ParamsItem = observer((props: ParamsItemProps) => {
   const [deleteVisible, setDeleteVisible] = useState(false);
   const [paramOptions, setParamOptions] = useState<any[]>([]);
   const [ttOptions, setTtOptions] = useState<any[]>([]);
@@ -180,7 +180,7 @@ const ParasmItem = observer((props: ParamsItemProps) => {
     const _v = Object.values(label[2]);
     if (_v.length && label[1]) {
       const _l = handleOptionsLabel(label[0], label[1], _v.length > 1 ? _v : _v[0]);
-      props.onLableChange?.(_l);
+      props.onLabelChange?.(_l);
     }
   }, [label]);
 
@@ -316,7 +316,6 @@ const ParasmItem = observer((props: ParamsItemProps) => {
                 ...v,
               });
               label[2] = { 0: lb };
-              console.log('onchange', ValueRef.current, termType, props.data.column);
 
               setLabel([...label]);
               valueEventChange(v);
@@ -357,4 +356,4 @@ const ParasmItem = observer((props: ParamsItemProps) => {
   );
 });
 
-export default ParasmItem;
+export default ParamsItem;

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

@@ -107,7 +107,7 @@ export default observer((props: TermsProps) => {
                       terms: terms,
                     });
                   }}
-                  onLableChange={(options) => {
+                  onLabelChange={(options) => {
                     FormModel.current.options!.when[props.whenName].terms[props.name].terms[index] =
                       options;
                     FormModel.current.options!.when[props.whenName].terms[props.name].termType =

+ 1 - 0
src/pages/rule-engine/Scene/typings.d.ts

@@ -20,6 +20,7 @@ export type ParallelType = keyof typeof ParallelEnum;
 export enum Source {
   'manual' = 'manual',
   'metric' = 'metric',
+  'fixed' = 'fixed',
 }
 
 export enum ActionDeviceSelector {