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

fix: 修复场景联动触发条件无法回显问题

xieyonghong 3 лет назад
Родитель
Сommit
9dde4174f7

+ 4 - 4
config/proxy.ts

@@ -9,11 +9,11 @@
 export default {
   dev: {
     '/jetlinks': {
-      // target: 'http://192.168.32.44:8844/',
-      // ws: 'ws://192.168.32.44:8844/',
+      target: 'http://192.168.32.8:8844/',
+      ws: 'ws://192.168.32.8:8844/',
       // 开发环境
-      target: 'http://120.79.18.123:8844/',
-      ws: 'ws://120.79.18.123:8844/',
+      // target: 'http://120.79.18.123:8844/',
+      // ws: 'ws://120.79.18.123:8844/',
       // 测试环境
       // target: 'http://120.77.179.54:8844/',
       // ws: 'ws://120.77.179.54:8844/',

+ 10 - 1
src/components/SearchComponent/index.tsx

@@ -552,7 +552,16 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
 
   useEffect(() => {
     // 防止页面下多个TabsTabPane中的查询组件共享路由中的参数
-    if (url.q && url.target && props.target && url.target === props.target) {
+    if (url.q) {
+      // if (url.target) {
+      //   if (props.target && url.target === props.target) {
+      //     form.setValues(JSON.parse(url.q));
+      //     handleSearch(false);
+      //   }
+      // } else {
+      //   form.setValues(JSON.parse(url.q));
+      //   handleSearch(false);
+      // }
       form.setValues(JSON.parse(url.q));
       handleSearch(false);
     }

+ 4 - 1
src/pages/link/DashBoard/index.less

@@ -4,14 +4,17 @@
     display: flex;
     gap: 24px;
     margin-bottom: 24px;
+    padding: 24px;
+    background-color: #fff;
 
     .echarts-item {
       display: flex;
       flex-grow: 1;
       width: 0;
-      height: 180px;
+      height: 160px;
       padding: 16px;
       background-color: #fff;
+      border: 1px solid #e0e4e8;
 
       .echarts-item-left {
         display: flex;

+ 17 - 70
src/pages/link/DashBoard/index.tsx

@@ -285,11 +285,11 @@ export default () => {
         {
           type: 'inside',
           start: 0,
-          end: 10,
+          end: 100,
         },
         {
           start: 0,
-          end: 10,
+          end: 100,
         },
       ],
       color: ['#60DFC7'],
@@ -342,11 +342,11 @@ export default () => {
         {
           type: 'inside',
           start: 0,
-          end: 10,
+          end: 100,
         },
         {
           start: 0,
-          end: 10,
+          end: 100,
         },
       ],
       color: ['#2CB6E0'],
@@ -648,14 +648,16 @@ export default () => {
     <PageContainer>
       <div className={'link-dash-board'}>
         {serverNode && serverNode.length ? (
-          <Select
-            value={serverId}
-            options={serverNode}
-            onChange={(value) => {
-              setServerId(value);
-            }}
-            style={{ width: 300, marginBottom: 24 }}
-          />
+          <div style={{ backgroundColor: '#fff', padding: '24px 24px 0 24px' }}>
+            <Select
+              value={serverId}
+              options={serverNode}
+              onChange={(value) => {
+                setServerId(value);
+              }}
+              style={{ width: 300 }}
+            />
+          </div>
         ) : null}
         <div className={'echarts-items'}>
           <TopEchartsItemNode title={'CPU使用率'} value={topValues.cpu} />
@@ -674,69 +676,12 @@ export default () => {
             max={topValues.systemUsageTotal}
             bottom={`系统内存  ${topValues.systemUsageTotal}G`}
           />
-          {/*<div className={'echarts-item'}>*/}
-          {/*  */}
-          {/*  <Progress*/}
-          {/*    type="circle"*/}
-          {/*    strokeWidth={8}*/}
-          {/*    width={160}*/}
-          {/*    percent={topValues.cpu}*/}
-          {/*    format={(percent) => (*/}
-          {/*      <div>*/}
-          {/*        <div className={'echarts-item-title'}>CPU使用率</div>*/}
-          {/*        <div className={'echarts-item-value'}>{percent}%</div>*/}
-          {/*      </div>*/}
-          {/*    )}*/}
-          {/*  />*/}
-          {/*</div>*/}
-          {/*<div className={'echarts-item'}>*/}
-          {/*  <Progress*/}
-          {/*    type="circle"*/}
-          {/*    strokeWidth={8}*/}
-          {/*    width={160}*/}
-          {/*    percent={topValues.jvm}*/}
-          {/*    format={(percent) => (*/}
-          {/*      <div>*/}
-          {/*        <div className={'echarts-item-title'}>JVM内存</div>*/}
-          {/*        <div className={'echarts-item-value'}>{percent}%</div>*/}
-          {/*      </div>*/}
-          {/*    )}*/}
-          {/*  />*/}
-          {/*</div>*/}
-          {/*<div className={'echarts-item'}>*/}
-          {/*  <Progress*/}
-          {/*    type="circle"*/}
-          {/*    strokeWidth={8}*/}
-          {/*    width={160}*/}
-          {/*    percent={topValues.usage}*/}
-          {/*    format={(percent) => (*/}
-          {/*      <div>*/}
-          {/*        <div className={'echarts-item-title'}>磁盘占用率</div>*/}
-          {/*        <div className={'echarts-item-value'}>{percent}%</div>*/}
-          {/*      </div>*/}
-          {/*    )}*/}
-          {/*  />*/}
-          {/*</div>*/}
-          {/*<div className={'echarts-item'}>*/}
-          {/*  <Progress*/}
-          {/*    type="circle"*/}
-          {/*    strokeWidth={8}*/}
-          {/*    width={160}*/}
-          {/*    percent={topValues.systemUsage}*/}
-          {/*    format={(percent) => (*/}
-          {/*      <div>*/}
-          {/*        <div className={'echarts-item-title'}>系统内存</div>*/}
-          {/*        <div className={'echarts-item-value'}>{percent}%</div>*/}
-          {/*      </div>*/}
-          {/*    )}*/}
-          {/*  />*/}
-          {/*</div>*/}
         </div>
         <div style={{ marginBottom: 24 }}>
           <DashBoard
             title={'网络流量'}
             ref={NETWORKRef}
-            initialValues={{ type: 'bytesSent' }}
+            initialValues={{ type: 'bytesRead' }}
             height={400}
             closeInitialParams={true}
             showTimeTool={true}
@@ -756,6 +701,7 @@ export default () => {
         </div>
         <div style={{ display: 'flex', gap: 24 }}>
           <DashBoard
+            showTime
             title={'CPU使用率趋势'}
             closeInitialParams={true}
             ref={CPURef}
@@ -766,6 +712,7 @@ export default () => {
             onParamsChange={getCPUEcharts}
           />
           <DashBoard
+            showTime
             title={'JVM内存使用率趋势'}
             closeInitialParams={true}
             ref={JVMRef}

+ 1 - 1
src/pages/notice/Template/service.ts

@@ -31,7 +31,7 @@ class Service extends BaseService<TemplateItem> {
       data,
     });
 
-  public debug = (id: string, templateId: string, data: Record<string, any>) =>
+  public debug = (id: string, templateId: string, data: Record<string, any> = {}) =>
     request(`${SystemConst.API_BASE}/notifier/${id}/${templateId}/_send`, {
       method: 'POST',
       data,

+ 4 - 4
src/pages/rule-engine/Scene/Save/action/VariableItems/builtIn.tsx

@@ -1,4 +1,4 @@
-import { DatePicker, Input, InputNumber, Select } from 'antd';
+import { DatePicker, Input, InputNumber, Select, TreeSelect } from 'antd';
 import { useCallback, useEffect, useState } from 'react';
 import type { FormInstance } from 'antd';
 import { queryBuiltInParams } from '@/pages/rule-engine/Scene/Save/action/service';
@@ -33,7 +33,7 @@ export default (props: BuiltInProps) => {
   const [builtInList, setBuiltInList] = useState<any[]>([]);
 
   useEffect(() => {
-    console.log(props.trigger);
+    console.log(props.parallel);
     // if (source === 'upper' && props.trigger) {
     //   getBuiltInList({ ...props.trigger });
     // }
@@ -103,9 +103,9 @@ export default (props: BuiltInProps) => {
         }}
       ></Select>
       {source === 'upper' ? (
-        <Select
+        <TreeSelect
           value={upperKey}
-          options={builtInList}
+          treeData={builtInList}
           onChange={(key) => {
             onChange(source, undefined, key);
           }}

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

@@ -131,18 +131,9 @@ export default observer((props: ActionProps) => {
 
       if (data.notify) {
         // 消息通知
-        if (data.notify.notifyType) {
-          setNotifyType(data.notify.notifyType);
-        }
-
-        if (data.notify.notifierId) {
-          setConfigId(data.notify.notifierId);
-        }
-
-        if (data.notify.templateId) {
-          // 通知模板
-          setTemplateId(data.notify.templateId);
-        }
+        setNotifyType(data.notify?.notifyType);
+        setConfigId(data.notify?.notifierId);
+        setTemplateId(data.notify?.templateId);
       }
     }
   }, []);
@@ -166,8 +157,10 @@ export default observer((props: ActionProps) => {
             style={{ width: '100%' }}
             onChange={async () => {
               setTemplateData(undefined);
-              props.form.resetFields([['actions', name, 'notify', 'notifierId']]);
-              props.form.resetFields([['actions', name, 'notify', 'templateId']]);
+              props.form.setFields([
+                { name: ['actions', name, 'notify', 'notifierId'], value: undefined },
+                { name: ['actions', name, 'notify', 'templateId'], value: undefined },
+              ]);
             }}
           />
         </Form.Item>
@@ -184,7 +177,9 @@ export default observer((props: ActionProps) => {
             fieldNames={{ value: 'id', label: 'name' }}
             onChange={() => {
               setTemplateData(undefined);
-              props.form.resetFields([['actions', name, 'notify', 'templateId']]);
+              props.form.setFields([
+                { name: ['actions', name, 'notify', 'templateId'], value: undefined },
+              ]);
             }}
             style={{ width: '100%' }}
             placeholder={'请选择通知配置'}

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

@@ -174,10 +174,12 @@ export default (props: DeviceProps) => {
             style={{ width: '100%' }}
             listHeight={220}
             onChange={() => {
-              props.form?.resetFields([['actions', name, 'device', 'selector']]);
-              props.form?.resetFields([['actions', name, 'device', 'selectorValues']]);
-              props.form?.resetFields([['actions', name, 'device', 'message', 'functionId']]);
               // setMessageType(MessageTypeEnum.WRITE_PROPERTY)
+              props.form?.setFields([
+                { name: ['actions', name, 'device', 'selector'], value: undefined },
+                { name: ['actions', name, 'device', 'selectorValues'], value: undefined },
+                { name: ['actions', name, 'device', 'message', 'functionId'], value: undefined },
+              ]);
             }}
             fieldNames={{ label: 'name', value: 'id' }}
             filterOption={(input: string, option: any) =>

+ 1 - 0
src/pages/rule-engine/Scene/Save/components/BuiltInParams.tsx

@@ -20,6 +20,7 @@ export const BuiltInParamsHandleTreeData = (data: any): any[] => {
   if (data.length > 0) {
     return data.map((item: any) => {
       const name = <BuiltInParamsTitle {...item} />;
+
       if (item.children) {
         return {
           ...item,

+ 23 - 7
src/pages/rule-engine/Scene/Save/components/TimingTrigger/refactor.tsx

@@ -36,7 +36,15 @@ export default (props: TimingTrigger) => {
 
   const onChange = useCallback(() => {
     const formData = props.form.getFieldsValue();
-    setData(formData?.trigger?.timer);
+    let _data = formData;
+    name.forEach((key) => {
+      console.log(_data, key);
+      if (key in _data) {
+        _data = _data[key];
+      }
+    });
+
+    setData(_data.timer);
   }, [props.form]);
 
   const TimeTypeAfter = (
@@ -80,7 +88,15 @@ export default (props: TimingTrigger) => {
                 { label: 'cron表达式', value: TriggerEnum.cron },
               ]}
               style={{ width: '120px' }}
-              onChange={onChange}
+              onChange={() => {
+                props.form.setFields([
+                  {
+                    name: [...name, 'timer', 'when'],
+                    value: undefined,
+                  },
+                ]);
+                onChange();
+              }}
             />
           </Form.Item>
           {data?.trigger !== TriggerEnum.cron ? (
@@ -134,7 +150,7 @@ export default (props: TimingTrigger) => {
           )}
         </ItemGroup>
       </Col>
-      <Col span={12}>
+      <Col span={11}>
         {data?.trigger !== TriggerEnum.cron && (
           <ItemGroup>
             <Form.Item
@@ -177,12 +193,12 @@ export default (props: TimingTrigger) => {
           </ItemGroup>
         )}
       </Col>
-      <Col span={6}>
+      <Col span={7}>
         {data?.trigger !== TriggerEnum.cron && (
           <ItemGroup style={{ gap: 16 }}>
             {data?.mod === PeriodModEnum.period ? (
               <>
-                <div style={{ paddingBottom: 12 }}> 每 </div>
+                <div style={{ paddingBottom: 14 }}> 每 </div>
                 <Form.Item
                   name={[...name, 'timer', 'period', 'every']}
                   rules={[{ required: true, message: '请输入时间' }]}
@@ -190,7 +206,7 @@ export default (props: TimingTrigger) => {
                   <InputNumber
                     placeholder={'请输入时间'}
                     addonAfter={TimeTypeAfter}
-                    style={{ flex: 1 }}
+                    style={{ maxWidth: 170 }}
                     min={0}
                     max={59}
                   />
@@ -204,7 +220,7 @@ export default (props: TimingTrigger) => {
                 </Form.Item>
               </>
             ) : null}
-            <div style={{ flex: 0, flexBasis: 64, paddingBottom: 12 }}> 执行一次 </div>
+            <div style={{ flex: 0, flexBasis: 64, paddingBottom: 14 }}> 执行一次 </div>
           </ItemGroup>
         )}
       </Col>

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

@@ -12,7 +12,7 @@ import {
   Switch,
   Tooltip,
 } from 'antd';
-import { useIntl, useLocation } from 'umi';
+import { useHistory, useIntl, useLocation } from 'umi';
 import { useCallback, useEffect, useRef, useState } from 'react';
 import { PermissionButton, TitleComponent } from '@/components';
 import ActionItems from './action/action';
@@ -27,6 +27,7 @@ import { model } from '@formily/reactive';
 import type { FormModelType } from '@/pages/rule-engine/Scene/typings';
 import { onlyMessage } from '@/utils/util';
 import Explanation from './Explanation';
+import { getMenuPathByCode } from '@/utils/menu';
 
 type ShakeLimitType = {
   enabled: boolean;
@@ -48,6 +49,7 @@ export default () => {
   const [form] = Form.useForm();
   const intl = useIntl();
   const triggerRef = useRef<any>();
+  const history = useHistory();
 
   const { getOtherPermission } = PermissionButton.usePermission('rule-engine/Scene');
   const [triggerType, setTriggerType] = useState('');
@@ -132,7 +134,7 @@ export default () => {
       setLoading(false);
       if (resp.status === 200) {
         onlyMessage('操作成功');
-        history.back();
+        history.push(getMenuPathByCode('rule-engine/Scene'));
       } else {
         onlyMessage(resp.message);
       }

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

@@ -396,7 +396,6 @@ export default observer((props: TriggerProps) => {
           <Col span={6}>
             <Form.Item
               name={['trigger', 'device', 'operation', 'eventId']}
-              noStyle
               rules={[{ required: true, message: '请选择事件' }]}
             >
               <Select

+ 19 - 9
src/pages/rule-engine/Scene/TriggerTerm/index.tsx

@@ -38,7 +38,6 @@ interface Props {
   value?: Record<string, any>;
   onChange?: (value: any) => void;
 }
-
 const TriggerTerm = (props: Props, ref: any) => {
   const parseTermRef = useRef<any>();
   const getParseTerm = () =>
@@ -104,7 +103,7 @@ const TriggerTerm = (props: Props, ref: any) => {
           onFieldReact('trigger.*.terms.*.column', async (field, form1) => {
             const operator = field.query('.termType');
             const value = (field as Field).value;
-
+            const modified = (field as Field).modified;
             // 找到选中的
             const _data = await service.getParseTerm(props.params);
             if (!_data) return;
@@ -133,14 +132,22 @@ const TriggerTerm = (props: Props, ref: any) => {
                       { label: '指标', value: 'metrics' },
                     ]
                   : [{ label: '手动输入', value: 'manual' }];
-              state.value = 'manual';
+              if (modified) {
+                state.value = 'manual';
+              }
             });
             form1.setFieldState(field.query('.value.value[0]'), (state) => {
-              state.value = undefined;
+              if (modified) {
+                state.value = undefined;
+              }
             });
           });
+          onFieldReact('trigger.*.terms.*.value', (field) => {
+            console.log(field);
+          });
           onFieldReact('trigger.*.terms.*.value.source', (field, form1) => {
             const params = field.query('..column').value();
+            const modified = (field as Field).modified;
 
             // 找到选中的
             const _data = Store.get('trigger-parse-term');
@@ -152,9 +159,9 @@ const TriggerTerm = (props: Props, ref: any) => {
               treeValue && treeValue[0] && treeValue[0].children
                 ? treeValue[0]?.children.find((item) => item.column === params)
                 : treeValue[0];
-
             const source = (field as Field).value;
             const value = field.query(source === 'manual' ? '.value.0' : '.metric');
+
             if (target) {
               if (source === 'manual') {
                 // 手动输入
@@ -199,6 +206,7 @@ const TriggerTerm = (props: Props, ref: any) => {
               } else if (source === 'metrics') {
                 const termType = field.query('..termType').value();
                 const tag = ['nbtw', 'btw'].includes(termType);
+                console.log(target);
                 // 指标
                 form1.setFieldState(value, (state) => {
                   state.componentType = Select;
@@ -208,7 +216,9 @@ const TriggerTerm = (props: Props, ref: any) => {
                       label: item.name,
                       value: item.id,
                     }));
-                  state.value = undefined;
+                  if (modified) {
+                    state.value = undefined;
+                  }
                 });
               }
             }
@@ -239,7 +249,7 @@ const TriggerTerm = (props: Props, ref: any) => {
         if (!Array.isArray(_data.trigger)) return;
         _data.trigger?.map((item: { terms: any[] }) =>
           item.terms.map((j) => {
-            if (j.value.value.length === 1) {
+            if (j.value?.value?.length === 1) {
               j.value.value = j.value.value[0];
             }
             return j;
@@ -314,7 +324,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                         'x-decorator': 'FormItem',
                         'x-component': 'TreeSelect',
                         'x-decorator-props': {
-                          gridSpan: 5,
+                          gridSpan: 4,
                         },
                         required: true,
                         'x-component-props': {
@@ -342,7 +352,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                         'x-component': 'FInputGroup',
                         'x-decorator': 'FormItem',
                         'x-decorator-props': {
-                          gridSpan: 4,
+                          gridSpan: 3,
                           style: {
                             width: '100%',
                           },

+ 1 - 1
src/pages/system/Department/Assets/deivce/index.tsx

@@ -54,7 +54,7 @@ export default observer((props: { parentId: string }) => {
         .unBind('device', [
           {
             targetType: 'org',
-            targetId: props.parentId,
+            targetId: AssetsModel.parentId,
             assetType: 'device',
             assetIdList: Models.unBindKeys,
           },

+ 6 - 1
src/pages/system/Department/Assets/index.tsx

@@ -7,6 +7,7 @@ import Member from '@/pages/system/Department/Member';
 import { model } from '@formily/reactive';
 import { observer } from '@formily/react';
 import { ExclamationCircleOutlined } from '@ant-design/icons';
+import { useEffect } from 'react';
 
 interface AssetsProps {
   parentId: string;
@@ -22,9 +23,11 @@ export enum ASSETS_TABS_ENUM {
 export const AssetsModel = model<{
   tabsIndex: string;
   bindModal: boolean;
+  parentId: string;
 }>({
   tabsIndex: ASSETS_TABS_ENUM.Product,
   bindModal: false,
+  parentId: '',
 });
 
 const Assets = observer((props: AssetsProps) => {
@@ -58,7 +61,9 @@ const Assets = observer((props: AssetsProps) => {
     },
   ];
 
-  console.log(AssetsModel.tabsIndex);
+  useEffect(() => {
+    AssetsModel.parentId = props.parentId;
+  }, [props.parentId]);
 
   return (
     <div style={{ position: 'relative', width: '100%' }}>

+ 1 - 1
src/pages/system/Department/Assets/product/bind.tsx

@@ -78,7 +78,7 @@ const Bind = observer((props: Props) => {
     >
       <Modal
         visible={deviceVisible}
-        width={600}
+        width={800}
         onCancel={() => {
           setDeviceVisible(false);
           props.reload();

+ 1 - 1
src/pages/system/Department/Assets/product/index.tsx

@@ -41,7 +41,7 @@ export default observer((props: { parentId: string }) => {
         .unBind('product', [
           {
             targetType: 'org',
-            targetId: props.parentId,
+            targetId: AssetsModel.parentId,
             assetType: 'product',
             assetIdList: Models.unBindKeys,
           },

+ 1 - 1
src/pages/system/Department/Assets/service.ts

@@ -88,7 +88,7 @@ class Service<T> extends BaseService<T> {
       mergeMap((result) => {
         const ids = result?.result?.data?.map((item: any) => item.id) || [];
         return from(
-          request(`${SystemConst.API_BASE}/assets/bindings/device-product/org/${parentId}/_query`, {
+          request(`${SystemConst.API_BASE}/assets/bindings/product/org/${parentId}/_query`, {
             method: 'POST',
             data: ids,
           }),

+ 2 - 1
src/pages/system/User/Save/index.tsx

@@ -422,8 +422,9 @@ const Save = (props: Props) => {
     const temp: any = {};
     temp.id = value.id;
     temp.user = value;
+    temp.user.roleList = [];
     temp.orgIdList = value.orgIdList;
-    temp.roleIdList = value.roleIdList;
+    temp.roleIdList = value.roleIdList?.length ? value.roleIdList : null;
     const response = await service.saveUser(temp, model);
     if (response.status === 200) {
       onlyMessage(