Просмотр исходного кода

Merge branch 'next' into next-sc

Lind 3 лет назад
Родитель
Сommit
dc691b1fdf

+ 1 - 1
src/components/TitleComponent/index.tsx

@@ -1,4 +1,4 @@
-import type { ReactNode, CSSProperties } from 'react';
+import type { CSSProperties, ReactNode } from 'react';
 import './index.less';
 import './index.less';
 
 
 interface TitleComponentProps {
 interface TitleComponentProps {

+ 33 - 4
src/pages/rule-engine/Alarm/Config/index.tsx

@@ -53,8 +53,36 @@ const Config = () => {
     [],
     [],
   );
   );
 
 
-  const inputForm = useMemo(() => createForm(), []);
-  const outputForm = useMemo(() => createForm(), []);
+  const inputForm = useMemo(
+    () =>
+      createForm({
+        validateFirst: true,
+        effects() {
+          onFormInit(async () => {
+            const resp = await service.getDataExchange('consume');
+            if (resp.status === 200) {
+              console.log(resp, 'resp');
+            }
+          });
+        },
+      }),
+    [],
+  );
+  const outputForm = useMemo(
+    () =>
+      createForm({
+        validateFirst: true,
+        effects() {
+          onFormInit(async () => {
+            const resp = await service.getDataExchange('producer');
+            if (resp.status === 200) {
+              console.log(resp, 'producer');
+            }
+          });
+        },
+      }),
+    [],
+  );
 
 
   const levelSchema: ISchema = {
   const levelSchema: ISchema = {
     type: 'object',
     type: 'object',
@@ -174,16 +202,17 @@ const Config = () => {
     const outputConfig: IOConfigItem = await outputForm.submit();
     const outputConfig: IOConfigItem = await outputForm.submit();
     const inputResp = await service.saveOutputData({
     const inputResp = await service.saveOutputData({
       config: {
       config: {
-        type: 'kafka',
         config: inputConfig,
         config: inputConfig,
       },
       },
+      sourceType: 'kafka',
       exchangeType: 'producer',
       exchangeType: 'producer',
     });
     });
     const outputResp = await service.saveOutputData({
     const outputResp = await service.saveOutputData({
       config: {
       config: {
-        type: 'kafka',
+        sourceType: 'kafka',
         config: outputConfig,
         config: outputConfig,
       },
       },
+      sourceType: 'kafka',
       exchangeType: 'consume',
       exchangeType: 'consume',
     });
     });
 
 

+ 3 - 0
src/pages/rule-engine/Alarm/Config/service.ts

@@ -21,6 +21,9 @@ class Service extends BaseService<IOConfigItem> {
       method: 'PATCH',
       method: 'PATCH',
       data,
       data,
     });
     });
+
+  getDataExchange = (type: 'consume' | 'producer') =>
+    request(`/${SystemConst.API_BASE}/alarm/config/${type}/data-exchange`, { method: 'GET' });
 }
 }
 
 
 export default Service;
 export default Service;

+ 14 - 4
src/pages/rule-engine/Alarm/Configuration/Save/index.tsx

@@ -60,8 +60,11 @@ const Save = (props: Props) => {
 
 
   const getScene = () => {
   const getScene = () => {
     return service.getScene().then((resp) => {
     return service.getScene().then((resp) => {
-      Store.set('scene-data', resp);
-      return resp;
+      Store.set('scene-data', resp.result);
+      return resp.result.map((item: { id: string; name: string }) => ({
+        label: item.name,
+        value: item.id,
+      }));
     });
     });
   };
   };
   const form = useMemo(
   const form = useMemo(
@@ -89,8 +92,15 @@ const Save = (props: Props) => {
   const handleSave = async () => {
   const handleSave = async () => {
     const data: any = await form.submit();
     const data: any = await form.submit();
     const list = Store.get('scene-data');
     const list = Store.get('scene-data');
-    const scene = list.find((item: any) => item.value === data.sceneId);
-    const resp: any = await service.update({ ...data, sceneName: scene.label, state: 'disable' });
+    const scene = list.find((item: any) => item.id === data.sceneId);
+
+    const resp: any = await service.update({
+      ...data,
+      state: 'disabled',
+      sceneTriggerType: scene.triggerType,
+      sceneName: scene.name,
+    });
+
     if (resp.status === 200) {
     if (resp.status === 200) {
       message.success('操作成功');
       message.success('操作成功');
       props.close();
       props.close();

+ 1 - 0
src/pages/rule-engine/Alarm/Configuration/index.tsx

@@ -132,6 +132,7 @@ const Configuration = () => {
                 record.state?.value === 'disabled' ? 'disabled' : 'enabled'
                 record.state?.value === 'disabled' ? 'disabled' : 'enabled'
               }`,
               }`,
               defaultMessage: record.state?.value === 'disabled' ? '禁用' : '启用',
               defaultMessage: record.state?.value === 'disabled' ? '禁用' : '启用',
+
             }),
             }),
           }}
           }}
           type="link"
           type="link"

+ 0 - 5
src/pages/rule-engine/Alarm/Configuration/service.ts

@@ -16,11 +16,6 @@ class Service extends BaseService<ConfigItem> {
   public getScene = () =>
   public getScene = () =>
     request(`/${SystemConst.API_BASE}/scene/_query/no-paging?paging=false`, {
     request(`/${SystemConst.API_BASE}/scene/_query/no-paging?paging=false`, {
       method: 'GET',
       method: 'GET',
-    }).then((resp) => {
-      return resp.result.map((item: { id: string; name: string }) => ({
-        label: item.name,
-        value: item.id,
-      }));
     });
     });
 
 
   public _enable = (id: string) =>
   public _enable = (id: string) =>

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

@@ -1,5 +1,5 @@
-import { Button, Select, Form } from 'antd';
 import type { FormInstance } from 'antd';
 import type { FormInstance } from 'antd';
+import { Button, Form, Select } from 'antd';
 import { useCallback, useEffect, useState } from 'react';
 import { useCallback, useEffect, useState } from 'react';
 import { useRequest } from 'umi';
 import { useRequest } from 'umi';
 import {
 import {

+ 31 - 0
src/pages/rule-engine/Scene/Save/action/device/AllDevice.tsx

@@ -0,0 +1,31 @@
+import { Input } from 'antd';
+import { useEffect } from 'react';
+import { queryAllDevice } from '@/pages/rule-engine/Scene/Save/action/device/service';
+
+interface AllDeviceProps {
+  productId?: string;
+  value?: any;
+  onChange?: (value: any) => void;
+}
+
+export default (props: AllDeviceProps) => {
+  useEffect(() => {
+    console.log(props.productId);
+    queryAllDevice({
+      terms: [{ column: 'productId', value: props.productId }],
+      paging: false,
+    }).then((resp) => {
+      if (resp.status === 200 && props.onChange) {
+        props.onChange(resp.result.map((item: any) => ({ id: item.id, name: item.name })));
+      }
+    });
+  }, [props.productId]);
+
+  return (
+    <Input
+      style={{ width: 300 }}
+      value={props.value ? props.value.map((item: any) => item.name).toString() : undefined}
+      readOnly
+    />
+  );
+};

+ 1 - 1
src/pages/rule-engine/Scene/Save/action/device/functionCall.tsx

@@ -3,8 +3,8 @@ import { EditableProTable } from '@jetlinks/pro-table';
 import { Input, InputNumber, Select } from 'antd';
 import { Input, InputNumber, Select } from 'antd';
 import React, { useEffect, useRef, useState } from 'react';
 import React, { useEffect, useRef, useState } from 'react';
 import type { ProFormInstance } from '@ant-design/pro-form';
 import type { ProFormInstance } from '@ant-design/pro-form';
-import { DatePickerFormat } from '@/pages/rule-engine/Scene/Save/components';
 import ProForm from '@ant-design/pro-form';
 import ProForm from '@ant-design/pro-form';
+import { DatePickerFormat } from '@/pages/rule-engine/Scene/Save/components';
 
 
 type FunctionTableDataType = {
 type FunctionTableDataType = {
   id: string;
   id: string;

+ 1 - 0
src/pages/rule-engine/Scene/Save/action/device/index.tsx

@@ -17,6 +17,7 @@ interface DeviceProps {
 }
 }
 
 
 enum SourceEnum {
 enum SourceEnum {
+  'all' = 'all',
   'fixed' = 'fixed',
   'fixed' = 'fixed',
   'tag' = 'tag',
   'tag' = 'tag',
   'relation' = '',
   'relation' = '',

+ 7 - 0
src/pages/rule-engine/Scene/Save/action/device/service.ts

@@ -8,6 +8,13 @@ export const queryDevice = (data: any) =>
     data: data,
     data: data,
   });
   });
 
 
+// 获取设备
+export const queryAllDevice = (data: any) =>
+  request(`${SystemConst.API_BASE}/device-instance/_query/no-paging`, {
+    method: 'POST',
+    data: data,
+  });
+
 // 获取产品
 // 获取产品
 export const getProductList = (params?: any) =>
 export const getProductList = (params?: any) =>
   request(`/${SystemConst.API_BASE}/device/product/_query/no-paging`, { method: 'GET', params });
   request(`/${SystemConst.API_BASE}/device/product/_query/no-paging`, { method: 'GET', params });

+ 24 - 15
src/pages/rule-engine/Scene/Save/components/TimeSelect/index.tsx

@@ -1,37 +1,46 @@
 import { TreeSelect } from 'antd';
 import { TreeSelect } from 'antd';
 import React, { useCallback, useEffect, useState } from 'react';
 import React, { useCallback, useEffect, useState } from 'react';
 
 
-type OptionsItemType = {
-  label: string;
-  value: string | number;
-};
-
 interface TimeSelectProps {
 interface TimeSelectProps {
-  options?: OptionsItemType[];
-  value?: number[];
-  onChange?: (value: number[]) => void;
+  options?: any[];
+  value?: any[];
+  onChange?: (value: any[]) => void;
   style?: React.CSSProperties;
   style?: React.CSSProperties;
 }
 }
 
 
 export default (props: TimeSelectProps) => {
 export default (props: TimeSelectProps) => {
   const [checkedKeys, setCheckedKeys] = useState<any[]>([]);
   const [checkedKeys, setCheckedKeys] = useState<any[]>([]);
 
 
+  const propsChange = (keys: number[]) => {
+    if (props.onChange) {
+      props.onChange(keys);
+    }
+  };
+
   const onChange = useCallback(
   const onChange = useCallback(
-    (keys: string[], _, extra) => {
+    (keys: any[], _, extra) => {
       if (extra.triggerValue === 'all') {
       if (extra.triggerValue === 'all') {
-        const newKeys = extra.checked ? ['all', ...props.options!.map((item) => item.value)] : [];
-        setCheckedKeys(newKeys);
+        propsChange(extra.checked ? props.options!.map((item: any) => item.value) : []);
       } else {
       } else {
         const noAllKeys = keys.filter((key) => key !== 'all');
         const noAllKeys = keys.filter((key) => key !== 'all');
-        const newKeys = noAllKeys.length === props.options!.length ? ['all', ...keys] : noAllKeys;
-
-        setCheckedKeys(newKeys);
+        propsChange(noAllKeys);
       }
       }
     },
     },
     [checkedKeys, props.options],
     [checkedKeys, props.options],
   );
   );
 
 
-  useEffect(() => {}, [checkedKeys]);
+  useEffect(() => {
+    setCheckedKeys(props.value || []);
+    if (props.value && props.options) {
+      if (props.value.length >= props.options.length) {
+        setCheckedKeys([...props.value, 'all']);
+      } else {
+        setCheckedKeys(props.value);
+      }
+    } else {
+      setCheckedKeys([]);
+    }
+  }, [props.value, props.options]);
 
 
   return (
   return (
     <TreeSelect
     <TreeSelect

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

@@ -48,6 +48,7 @@ export default (props: TimingTrigger) => {
   const [data, setData] = useState<TimerType>(DefaultValue);
   const [data, setData] = useState<TimerType>(DefaultValue);
 
 
   useEffect(() => {
   useEffect(() => {
+    console.log('timing-trigger', props.value);
     setData(props.value || DefaultValue);
     setData(props.value || DefaultValue);
   }, [props.value]);
   }, [props.value]);
 
 
@@ -57,6 +58,8 @@ export default (props: TimingTrigger) => {
     }
     }
   };
   };
 
 
+  console.log('timing-trigger-data', data);
+
   const type1Select = async (key: string) => {
   const type1Select = async (key: string) => {
     if (key !== TriggerEnum.cron) {
     if (key !== TriggerEnum.cron) {
       onChange({
       onChange({
@@ -144,8 +147,9 @@ export default (props: TimingTrigger) => {
         <span> 每 </span>
         <span> 每 </span>
         <InputNumber
         <InputNumber
           value={data.period?.every}
           value={data.period?.every}
+          placeholder={'请输入时间'}
           addonAfter={TimeTypeAfter}
           addonAfter={TimeTypeAfter}
-          style={{ width: 150 }}
+          style={{ width: 180 }}
           min={0}
           min={0}
           max={9999}
           max={9999}
           onChange={(e) => {
           onChange={(e) => {
@@ -191,7 +195,7 @@ export default (props: TimingTrigger) => {
         ]}
         ]}
         value={data.trigger}
         value={data.trigger}
         onSelect={type1Select}
         onSelect={type1Select}
-        style={{ width: 120 }}
+        style={{ width: 100 }}
       />
       />
       {data.trigger !== TriggerEnum.cron ? (
       {data.trigger !== TriggerEnum.cron ? (
         <>
         <>
@@ -226,7 +230,7 @@ export default (props: TimingTrigger) => {
               { label: '执行一次', value: PeriodModEnum.once },
               { label: '执行一次', value: PeriodModEnum.once },
             ]}
             ]}
             value={data.mod}
             value={data.mod}
-            style={{ width: 150 }}
+            style={{ width: 120 }}
             onSelect={type2Select}
             onSelect={type2Select}
           />
           />
           {implementNode}
           {implementNode}

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

@@ -19,6 +19,7 @@
         font-weight: bold;
         font-weight: bold;
         font-size: 16px;
         font-size: 16px;
       }
       }
+
       span {
       span {
         color: rgba(#000, 0.24);
         color: rgba(#000, 0.24);
         font-size: 12px;
         font-size: 12px;

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

@@ -209,7 +209,11 @@ export default () => {
               </Form.Item>
               </Form.Item>
             )}
             )}
             {triggerType === TriggerWayType.device && (
             {triggerType === TriggerWayType.device && (
-              <TriggerDevice className={'trigger-type-content'} form={form} />
+              <TriggerDevice
+                className={'trigger-type-content'}
+                form={form}
+                triggerData={FormModel.trigger}
+              />
             )}
             )}
           </Form.Item>
           </Form.Item>
           {triggerType === TriggerWayType.device &&
           {triggerType === TriggerWayType.device &&

+ 20 - 5
src/pages/rule-engine/Scene/Save/trigger/index.tsx

@@ -10,10 +10,12 @@ import Operation from './operation';
 import classNames from 'classnames';
 import classNames from 'classnames';
 import { observer } from '@formily/reactive-react';
 import { observer } from '@formily/reactive-react';
 import { FormModel } from '../index';
 import { FormModel } from '../index';
+import AllDevice from '@/pages/rule-engine/Scene/Save/action/device/AllDevice';
 
 
 interface TriggerProps {
 interface TriggerProps {
   value?: string;
   value?: string;
   onChange?: (type: string) => void;
   onChange?: (type: string) => void;
+  triggerData?: any;
   form?: FormInstance;
   form?: FormInstance;
   className?: string;
   className?: string;
 }
 }
@@ -123,8 +125,10 @@ export default observer((props: TriggerProps) => {
   }, []);
   }, []);
 
 
   useEffect(() => {
   useEffect(() => {
-    if (FormModel.trigger && FormModel.trigger.device) {
-      const _device = FormModel.trigger.device;
+    const triggerData = props.triggerData;
+    console.log('trigger', triggerData);
+    if (triggerData && triggerData.device) {
+      const _device = triggerData.device;
 
 
       if (_device.selector) {
       if (_device.selector) {
         if (_device.selector === 'org') {
         if (_device.selector === 'org') {
@@ -133,12 +137,11 @@ export default observer((props: TriggerProps) => {
         setSelector(_device.selector);
         setSelector(_device.selector);
       }
       }
 
 
-      console.log(_device.operation && _device.operation.operator);
       if (_device.operation && _device.operation.operator) {
       if (_device.operation && _device.operation.operator) {
         setOperation(_device.operation.operator);
         setOperation(_device.operation.operator);
       }
       }
     }
     }
-  }, [FormModel.trigger]);
+  }, [props.triggerData]);
 
 
   return (
   return (
     <div className={classNames(props.className)}>
     <div className={classNames(props.className)}>
@@ -162,13 +165,25 @@ export default observer((props: TriggerProps) => {
                 fieldNames={{ label: 'name', value: 'id' }}
                 fieldNames={{ label: 'name', value: 'id' }}
               />
               />
             </Form.Item>
             </Form.Item>
-            <Form.Item name={['trigger', 'device', 'selector']} initialValue={'fixed'}>
+            <Form.Item
+              name={['trigger', 'device', 'selector']}
+              initialValue={
+                props.triggerData && props.triggerData.device && props.triggerData.device.selector
+                  ? props.triggerData.device.selector
+                  : 'fixed'
+              }
+            >
               <Select
               <Select
                 options={selectorOptions}
                 options={selectorOptions}
                 fieldNames={{ label: 'name', value: 'id' }}
                 fieldNames={{ label: 'name', value: 'id' }}
                 style={{ width: 120 }}
                 style={{ width: 120 }}
               />
               />
             </Form.Item>
             </Form.Item>
+            {selector === 'all' && (
+              <Form.Item name={['trigger', 'device', 'selectorValues']}>
+                <AllDevice productId={productId} />
+              </Form.Item>
+            )}
             {selector === 'fixed' && (
             {selector === 'fixed' && (
               <Form.Item name={['trigger', 'device', 'selectorValues']}>
               <Form.Item name={['trigger', 'device', 'selectorValues']}>
                 <Device productId={productId} />
                 <Device productId={productId} />

+ 1 - 1
src/pages/rule-engine/Scene/Save/trigger/operation.tsx

@@ -50,7 +50,7 @@ export default (props: OperatorProps) => {
       setPropertiesItem(findProperties(_key, props.value[_key]));
       setPropertiesItem(findProperties(_key, props.value[_key]));
     } else {
     } else {
       setData({});
       setData({});
-      setKey('');
+      setKey(undefined);
     }
     }
   }, [props.value, props.propertiesList]);
   }, [props.value, props.propertiesList]);
 
 

+ 123 - 20
src/pages/rule-engine/Scene/TriggerTerm/index.tsx

@@ -14,8 +14,8 @@ import {
   TreeSelect,
   TreeSelect,
 } from '@formily/antd';
 } from '@formily/antd';
 import { ISchema } from '@formily/json-schema';
 import { ISchema } from '@formily/json-schema';
-import { createForm, onFieldValueChange, onFormValuesChange } from '@formily/core';
-import { forwardRef, useImperativeHandle, useMemo } from 'react';
+import { createForm, Field, onFieldReact, onFormValuesChange } from '@formily/core';
+import { forwardRef, useImperativeHandle, useMemo, useRef } from 'react';
 import FTermArrayCards from '@/components/FTermArrayCards';
 import FTermArrayCards from '@/components/FTermArrayCards';
 import FTermTypeSelect from '@/components/FTermTypeSelect';
 import FTermTypeSelect from '@/components/FTermTypeSelect';
 import styles from './index.less';
 import styles from './index.less';
@@ -34,27 +34,138 @@ interface Props {
 }
 }
 
 
 const TriggerTerm = (props: Props, ref: any) => {
 const TriggerTerm = (props: Props, ref: any) => {
+  const requestParams = {
+    trigger: {
+      type: 'device',
+      device: {
+        productId: '0412-zj',
+        selector: 'device',
+        selectorValue: [
+          {
+            id: '0412-zj',
+            name: '0412-zj',
+          },
+        ],
+        operation: {
+          operator: 'reportProperty',
+          timer: {
+            trigger: 'week',
+            cron: '',
+            when: [1, 3, 5],
+            mod: 'period',
+            period: {
+              from: '09:30',
+              to: '14:30',
+              every: 1,
+              unit: 'hours',
+            },
+            once: {
+              time: '',
+            },
+          },
+          eventId: '',
+          readProperties: ['temparature', 'temperature-k', 'test-zhibioa'],
+          writeProperties: {},
+          functionId: '',
+          functionParameters: [
+            {
+              name: '',
+              value: {},
+            },
+          ],
+        },
+        defaultVariable: [],
+      },
+      timer: {},
+      defaultVariable: [],
+    },
+  };
+
+  const parseTermRef = useRef<any>();
+  const getParseTerm = () =>
+    service.getParseTerm(requestParams || props.params).then((data) => {
+      Store.set('trigger-parse-term', data);
+      parseTermRef.current = data;
+      return data.map((item: any) => ({
+        column: item.column,
+        name: item.name,
+        children: item.children,
+      }));
+    });
+
   const form = useMemo(
   const form = useMemo(
     () =>
     () =>
       createForm({
       createForm({
         validateFirst: true,
         validateFirst: true,
-        initialValues: props.value,
+        initialValues:
+          {
+            trigger: [
+              {
+                terms: [
+                  {
+                    column: 'properties.temprature.current',
+                    termType: 'gt',
+                    source: 'manual',
+                    value: 123,
+                  },
+                  {
+                    column: 'properties.test-zhibioa.recent',
+                    termType: 'gt',
+                    source: 'metrics',
+                    value: '123',
+                  },
+                  {
+                    column: 'properties.test-zhibioa.current',
+                    termType: 'lte',
+                    source: 'manual',
+                    value: 223,
+                  },
+                ],
+              },
+              {
+                terms: [
+                  {
+                    column: 'properties.temprature.current',
+                    termType: 'btw',
+                    source: 'manual',
+                    value: 23,
+                  },
+                  {
+                    column: 'properties.temperature-k.current',
+                    termType: 'gt',
+                    source: 'manual',
+                    value: 123,
+                  },
+                  {
+                    column: '_now',
+                    termType: 'eq',
+                    source: 'manual',
+                    value: '2022-04-29 00:00:07',
+                  },
+                ],
+              },
+            ],
+          } || props.value,
+
         effects() {
         effects() {
           onFormValuesChange(async (f) => {
           onFormValuesChange(async (f) => {
             if (props.onChange) {
             if (props.onChange) {
               props.onChange(await f.submit());
               props.onChange(await f.submit());
             }
             }
           });
           });
-          onFieldValueChange('trigger.*.terms.*.column', (field, form1) => {
+          onFieldReact('trigger.*.terms.*.column', async (field, form1) => {
             const operator = field.query('.termType');
             const operator = field.query('.termType');
+            const value = (field as Field).value;
+
             // 找到选中的
             // 找到选中的
-            const _data = Store.get('trigger-parse-term');
+            const _data = await service.getParseTerm(requestParams || props.params);
+            if (!_data) return;
             // 树形搜索
             // 树形搜索
-            const treeValue = treeFilter(_data, field.value, 'column');
+            const treeValue = treeFilter(_data, value, 'column');
             // 找到
             // 找到
             const target =
             const target =
               treeValue && treeValue[0].children
               treeValue && treeValue[0].children
-                ? treeValue[0]?.children.find((item) => item.column === field.value)
+                ? treeValue[0]?.children.find((item) => item.column === value)
                 : treeValue[0];
                 : treeValue[0];
 
 
             form1.setFieldState(operator, (state) => {
             form1.setFieldState(operator, (state) => {
@@ -73,11 +184,12 @@ const TriggerTerm = (props: Props, ref: any) => {
                   : [{ label: '手动输入', value: 'manual' }];
                   : [{ label: '手动输入', value: 'manual' }];
             });
             });
           });
           });
-          onFieldValueChange('trigger.*.terms.*.source', (field, form1) => {
+          onFieldReact('trigger.*.terms.*.source', (field, form1) => {
             const params = field.query('.column').value();
             const params = field.query('.column').value();
             const value = field.query('.value');
             const value = field.query('.value');
             // 找到选中的
             // 找到选中的
             const _data = Store.get('trigger-parse-term');
             const _data = Store.get('trigger-parse-term');
+            if (!_data) return;
             // 树形搜索
             // 树形搜索
             const treeValue = treeFilter(_data, params, 'column');
             const treeValue = treeFilter(_data, params, 'column');
             // 找到
             // 找到
@@ -86,8 +198,9 @@ const TriggerTerm = (props: Props, ref: any) => {
                 ? treeValue[0]?.children.find((item) => item.column === params)
                 ? treeValue[0]?.children.find((item) => item.column === params)
                 : treeValue[0];
                 : treeValue[0];
 
 
+            const source = (field as Field).value;
             if (target) {
             if (target) {
-              if (field.value === 'manual') {
+              if (source === 'manual') {
                 // 手动输入
                 // 手动输入
                 const valueType = target.dataType;
                 const valueType = target.dataType;
 
 
@@ -109,7 +222,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                     };
                     };
                   }
                   }
                 });
                 });
-              } else if (field.value === 'metrics') {
+              } else if (source === 'metrics') {
                 // 指标
                 // 指标
                 form1.setFieldState(value, (state) => {
                 form1.setFieldState(value, (state) => {
                   state.componentType = Select;
                   state.componentType = Select;
@@ -144,16 +257,6 @@ const TriggerTerm = (props: Props, ref: any) => {
     },
     },
   });
   });
 
 
-  const getParseTerm = () =>
-    service.getParseTerm(props.params).then((data) => {
-      Store.set('trigger-parse-term', data);
-      return data.map((item: any) => ({
-        column: item.column,
-        name: item.name,
-        children: item.children,
-      }));
-    });
-
   const schema: ISchema = {
   const schema: ISchema = {
     type: 'object',
     type: 'object',
     properties: {
     properties: {

+ 49 - 5
src/pages/rule-engine/Scene/service.ts

@@ -1,6 +1,8 @@
 import { request } from '@@/plugin-request/request';
 import { request } from '@@/plugin-request/request';
 import BaseService from '@/utils/BaseService';
 import BaseService from '@/utils/BaseService';
 import type { SceneItem } from '@/pages/rule-engine/Scene/typings';
 import type { SceneItem } from '@/pages/rule-engine/Scene/typings';
+import { defer, from, lastValueFrom, shareReplay } from 'rxjs';
+import { filter, map } from 'rxjs/operators';
 
 
 class Service extends BaseService<SceneItem> {
 class Service extends BaseService<SceneItem> {
   startScene = (id: string) => request(`${this.uri}/${id}/_enable`, { method: 'PUT' });
   startScene = (id: string) => request(`${this.uri}/${id}/_enable`, { method: 'PUT' });
@@ -9,11 +11,53 @@ class Service extends BaseService<SceneItem> {
 
 
   updateScene = (data: any) => request(`${this.uri}/${data.id}`, { method: 'PUT', data });
   updateScene = (data: any) => request(`${this.uri}/${data.id}`, { method: 'PUT', data });
 
 
-  getParseTerm = (data: Record<string, any>) =>
-    request(`${this.uri}/parse-term-column`, {
-      method: 'POST',
-      data,
-    }).then((resp) => resp.result);
+  // getParseTerm = (data: Record<string, any>) =>
+  //   request(`${this.uri}/parse-term-column`, {
+  //     method: 'POST',
+  //     data,
+  //   }).then((resp) => resp.result);
+  // getParseTerm = (data: Record<string, any>) => {
+  //   const oldParams = Store.get('request-params-parse-term');
+  //   const list = Store.get('parse-term');
+  //   const f = list && _.isEqual(oldParams, data);
+  //   console.log(oldParams, list, f, data, 'request');
+  //   return f ? new Promise(resolve => {
+  //     resolve(list);
+  //   }) : request(`${this.uri}/parse-term-column`, {
+  //     method: 'POST',
+  //     data,
+  //   }).then((resp) => {
+  //     Store.set('parse-term', resp.result);
+  //     console.log(Store.get('parse-term'), 'then-resp')
+  //     return resp.result
+  //   }).finally(() => {
+  //     Store.set('request-params-parse-term', data);
+  //   });
+  // };
+
+  private cacheTerm$: Promise<any> | undefined;
+
+  getParseTerm = (data: Record<string, any>) => {
+    if (!this.cacheTerm$) {
+      this.cacheTerm$ = lastValueFrom(
+        defer(() =>
+          from(
+            request(`${this.uri}/parse-term-column`, {
+              method: 'POST',
+              data,
+            }),
+          ),
+        ).pipe(
+          filter((item) => item.status === 200),
+          map((item) => {
+            return item.result;
+          }),
+          shareReplay(1, 100),
+        ),
+      );
+    }
+    return this.cacheTerm$;
+  };
 }
 }
 
 
 export default Service;
 export default Service;