100011797 3 лет назад
Родитель
Сommit
a40f15cae3

+ 9 - 1
src/components/Metadata/ArrayParam/index.tsx

@@ -27,6 +27,9 @@ const ArrayParam = () => {
 
   registerValidateRules({
     checkLength(value) {
+      if (value === undefined) {
+        return '';
+      }
       if (String(value).length > 64) {
         return {
           type: 'error',
@@ -66,8 +69,13 @@ const ArrayParam = () => {
             'x-decorator': 'FormItem',
             'x-component': 'Select',
             enum: DataTypeList.filter((item) => item.value !== 'array'),
+            'x-validator': [
+              {
+                required: true,
+                message: '请选择元素类型',
+              },
+            ],
           },
-
           scale: {
             title: '精度',
             'x-decorator': 'FormItem',

+ 19 - 0
src/components/Metadata/EnumParam/index.tsx

@@ -20,6 +20,25 @@ const EnumParam = () => {
       elements: {
         type: 'array',
         'x-component': 'ArrayItems',
+        'x-decorator': 'FormItem',
+        'x-validator': [
+          {
+            triggerType: 'onBlur',
+            validator: (value: any[]) => {
+              return new Promise((resolve) => {
+                if (value.length === 0) resolve('请配置枚举项');
+                const flag = value.every((item: any) => {
+                  return item.value && item.text;
+                });
+                if (!!flag) {
+                  resolve('');
+                } else {
+                  resolve('请配置枚举项');
+                }
+              });
+            },
+          },
+        ],
         items: {
           type: 'void',
           'x-component': 'ArrayItems.Item',

+ 31 - 2
src/components/Metadata/JsonParam/index.tsx

@@ -48,6 +48,7 @@ const JsonParam = observer((props: Props) => {
 
   registerValidateRules({
     checkLength(value) {
+      if (value === undefined) return '';
       if (String(value).length > 64) {
         return {
           type: 'error',
@@ -64,6 +65,18 @@ const JsonParam = observer((props: Props) => {
     },
   });
 
+  const checkArray: any = (arr: any) => {
+    if (Array.isArray(arr) && arr.length) {
+      return arr.every((item: any) => {
+        if (item.valueType?.type === 'object') {
+          return item.id && item.name && checkArray(item.json?.properties);
+        }
+        return item.id && item.name && item.valueType;
+      });
+    }
+    return false;
+  };
+
   const schema: ISchema = {
     type: 'object',
     properties: {
@@ -71,6 +84,24 @@ const JsonParam = observer((props: Props) => {
         type: 'array',
         'x-component': 'ArrayItems',
         'x-decorator': 'FormItem',
+        'x-validator': [
+          {
+            triggerType: 'onBlur',
+            validator: (value: any[]) => {
+              return new Promise((resolve) => {
+                if (props.keys === 'inputs' && value.length === 0) {
+                  resolve('');
+                }
+                const flag = checkArray(value);
+                if (!!flag) {
+                  resolve('');
+                } else {
+                  resolve('请配置参数');
+                }
+              });
+            },
+          },
+        ],
         items: {
           type: 'object',
           'x-decorator': 'ArrayItems.Item',
@@ -282,7 +313,6 @@ const JsonParam = observer((props: Props) => {
                     },
                   },
                 },
-
                 'valueType.scale': {
                   title: '精度',
                   'x-decorator': 'FormItem',
@@ -305,7 +335,6 @@ const JsonParam = observer((props: Props) => {
                     },
                   },
                 },
-
                 json: {
                   type: 'string',
                   title: 'JSON对象',

+ 1 - 1
src/components/ProTableCard/CardItems/Scene/index.less

@@ -50,7 +50,7 @@
       }
       .card-item-content-action-item-right {
         width: calc(100% - 48px);
-        padding: 5px;
+        padding: 5px 16px;
         border: 1px solid rgba(0, 0, 0, 0.08);
         .card-item-content-action-item-right-item {
           display: flex;

+ 14 - 0
src/pages/device/components/Metadata/Base/Edit/index.tsx

@@ -398,6 +398,20 @@ const Edit = observer((props: Props) => {
             },
           },
         },
+        'x-validator': [
+          {
+            triggerType: 'onBlur',
+            validator: (value: any[]) => {
+              return new Promise((resolve) => {
+                if (!!value) {
+                  resolve('');
+                } else {
+                  resolve('请输入配置元素');
+                }
+              });
+            },
+          },
+        ],
       },
       jsonConfig: {
         title: intl.formatMessage({

+ 7 - 0
src/pages/device/components/Metadata/Cat/index.tsx

@@ -28,6 +28,12 @@ const Cat = observer((props: Props) => {
   const id = _path[_path.length - 1];
 
   useEffect(() => {
+    if (props.visible) {
+      setValue(metadata);
+    }
+  }, [props.visible]);
+
+  useEffect(() => {
     service.codecs().subscribe({
       next: (data) => {
         setCodecs([{ id: 'jetlinks', name: 'jetlinks' }].concat(data));
@@ -65,6 +71,7 @@ const Cat = observer((props: Props) => {
       width={700}
       onClose={() => props.close()}
       visible={props.visible}
+      destroyOnClose
       extra={
         <Space>
           <Button

+ 2 - 1
src/pages/link/Certificate/Detail/components/CertificateFile/index.tsx

@@ -9,6 +9,7 @@ import { useEffect, useState } from 'react';
 interface Props {
   value?: string;
   onChange?: (type: any) => void;
+  placeholder?: string;
 }
 
 const CertificateFile = (props: Props) => {
@@ -46,7 +47,7 @@ const CertificateFile = (props: Props) => {
         }}
         value={keystoreBase64}
         rows={4}
-        placeholder='证书格式以"-----BEGIN CERTIFICATE-----"开头,以"-----END CERTIFICATE-----"结尾。'
+        placeholder={props.placeholder}
       />
       <Upload
         accept=".pem"

+ 2 - 2
src/pages/link/Certificate/Detail/index.tsx

@@ -95,7 +95,7 @@ const Detail = observer(() => {
         'x-component-props': {
           rows: 3,
           placeholder:
-            '证书私钥格式以"-----BEGIN (RSA|EC) PRIVATE KEY-----"开头,以"-----END(RSA|EC) PRIVATE KEY-----"结尾。',
+            '证书格式以"-----BEGIN CERTIFICATE-----"开头,以"-----END CERTIFICATE-----"结尾。',
         },
         'x-validator': [
           {
@@ -117,7 +117,7 @@ const Detail = observer(() => {
         'x-validator': [
           {
             required: true,
-            message: '请输入证书私钥',
+            message: '请上传证书私钥',
           },
         ],
       },

+ 4 - 2
src/pages/link/DataCollect/components/Point/index.tsx

@@ -400,7 +400,7 @@ export default observer((props: Props) => {
         },
         {
           title: '访问类型',
-          dataIndex: 'accessModes',
+          dataIndex: 'accessModes$in$any',
           valueType: 'select',
           valueEnum: {
             read: {
@@ -416,6 +416,7 @@ export default observer((props: Props) => {
               status: 'subscribe',
             },
           },
+          renderText: (_, record) => record.accessModes,
         },
         // {
         //   title: '状态',
@@ -467,8 +468,9 @@ export default observer((props: Props) => {
         },
         {
           title: '访问类型',
-          dataIndex: 'accessModes',
+          dataIndex: 'accessModes$in$any',
           valueType: 'select',
+          renderText: (_, record) => record.accessModes,
           valueEnum:
             props?.provider === 'MODBUS_TCP'
               ? {

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

@@ -310,7 +310,7 @@ const Config = () => {
   const level = (
     <Row>
       <Col span={14}>
-        <Card style={{ height: 650 }}>
+        <Card style={{ height: 780 }}>
           <TitleComponent data={'告警级别配置'} />
           <Form form={levelForm}>
             <SchemaField schema={levelSchema} />
@@ -327,7 +327,7 @@ const Config = () => {
         </Card>
       </Col>
       <Col span={10}>
-        <div style={{ marginLeft: 20, height: 650 }} className={styles.doc}>
+        <div style={{ marginLeft: 20, height: 780 }} className={styles.doc}>
           <h1>功能说明</h1>
           <div>1、告警级别用于描述告警的严重程度,请根据业务管理方式进行自定义。</div>
           <div>2、告警级别将会在告警配置中被引用。</div>
@@ -340,7 +340,7 @@ const Config = () => {
     <Row>
       <Col span={14}>
         <div>
-          <Card style={{ height: 650 }}>
+          <Card style={{ height: 780 }}>
             <TitleComponent
               data={
                 <span>
@@ -458,7 +458,7 @@ const Config = () => {
         </div>
       </Col>
       <Col span={10}>
-        <div style={{ height: 650, marginLeft: 20, paddingBottom: 24, backgroundColor: '#fff' }}>
+        <div style={{ height: 780, marginLeft: 20, paddingBottom: 24, backgroundColor: '#fff' }}>
           <div className={styles.doc}>
             <h1>功能图示</h1>
             <div className={styles.image}>

+ 12 - 4
src/pages/rule-engine/Scene/Save/action/notify/VariableDefinitions.tsx

@@ -38,7 +38,6 @@ export default forwardRef((props: Props, ref) => {
       const rules: any[] = [];
       rules.push({
         validator: async (_: any, value: any) => {
-          console.log(value, type);
           if ((type === 'file' || type === 'link') && !value) {
             return Promise.reject(new Error('请输入' + item.name));
           } else if (type === 'tag' && !value) {
@@ -80,13 +79,22 @@ export default forwardRef((props: Props, ref) => {
         if (NotifyModel.notify?.notifyType === 'email') {
           rules.push({
             validator: async (_: any, value: any) => {
-              if (value.value) {
+              if (Array.isArray(value.value)) {
+                if (!value.value.length) {
+                  return Promise.reject(new Error('请输入收件人'));
+                }
                 const reg = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
-                if (!reg.test(value.value)) {
+                const flag = value.value.every((it: string) => {
+                  return reg.test(it);
+                });
+                if (!flag) {
                   return Promise.reject(new Error('请输入正确的邮箱地址'));
+                } else {
+                  return Promise.resolve();
                 }
+              } else {
+                return Promise.resolve();
               }
-              return Promise.resolve();
             },
           });
         }

+ 43 - 1
src/pages/rule-engine/Scene/Save/action/notify/components/variableItem/buildIn.tsx

@@ -41,11 +41,53 @@ export default (props: BuiltInProps) => {
     }
   };
 
+  // const treeDataChildrenFilter: any = (arr: any[], type: string) => {
+  //   if(Array.isArray(arr) && arr.length) {
+  //      const list = arr.map(item => {
+  //        if(item.children) {
+  //          return treeDataChildrenFilter(item.children, type)
+  //        }
+  //        return item.type === type ? item : false
+  //     })
+  //     return list
+  //   } else {
+  //     return []
+  //   }
+  // }
+
+  const treeDataFilter = (arr: any[], type: string) => {
+    if (Array.isArray(arr) && arr.length) {
+      const list: any[] = [];
+      arr.map((item: any) => {
+        if (item.children) {
+          const children = treeDataFilter(item.children, type);
+          if (children.length) {
+            list.push({
+              ...item,
+              children,
+            });
+          }
+        } else {
+          if (item.type === type) {
+            list.push(item);
+          }
+        }
+      });
+      return list;
+    } else {
+      return [];
+    }
+  };
+
   const sourceChangeEvent = async () => {
     const params = props.name - 1 >= 0 ? { action: props.name - 1 } : undefined;
     queryBuiltInParams(FormModel.current, params).then((res: any) => {
       if (res.status === 200) {
-        const _data = BuiltInParamsHandleTreeData(res.result);
+        const arr = treeDataFilter(
+          res.result,
+          props.data.expands?.businessType || props.data?.type,
+        );
+        const _data = BuiltInParamsHandleTreeData(arr);
         setBuiltInList(_data);
       }
     });

+ 24 - 12
src/pages/rule-engine/Scene/Save/action/notify/components/variableItem/user.tsx

@@ -145,7 +145,7 @@ export default observer((props: UserProps) => {
     },
   ];
 
-  const getObj = (_source: string = 'fixed', _value?: string, isRelation?: boolean) => {
+  const getObj = (_source: string = 'fixed', _value?: string | string[], isRelation?: boolean) => {
     const obj: any = {
       source: _source,
     };
@@ -183,13 +183,17 @@ export default observer((props: UserProps) => {
     let _values: any = undefined;
     const _names: string[] = [_name || ''];
     if (Array.isArray(_value)) {
-      if (NotifyModel?.notify?.notifyType === 'email' && Array.isArray(_value)) {
-        const arr = _value.map((item) => {
-          const _item = labelMap.get(item);
-          _names.push(_item?.name || '');
-          return getObj('relation', item, _item?.relation);
-        });
-        _values = arr;
+      if (NotifyModel?.notify?.notifyType === 'email') {
+        if (isRelation) {
+          const arr = _value.map((item) => {
+            const _item = labelMap.get(item);
+            _names.push(_item?.name || '');
+            return getObj('relation', item, _item?.relation);
+          });
+          _values = arr;
+        } else {
+          _values = getObj(_source, _value, false);
+        }
       }
     } else {
       _values = getObj(_source, _value, isRelation);
@@ -288,11 +292,19 @@ export default observer((props: UserProps) => {
         {createTreeNode(treeData)}
       </TreeSelect>
     ) : (
-      <Input
+      // <Input
+      //   value={value}
+      //   placeholder={'请输入固定邮箱'}
+      //   onChange={(e) => {
+      //     onchange(source, e.target.value, false, e.target.value);
+      //   }}
+      // />
+      <Select
         value={value}
-        placeholder={'请输入固定邮箱'}
-        onChange={(e) => {
-          onchange(source, e.target.value, false, e.target.value);
+        mode={'tags'}
+        placeholder={'请输入收件人邮箱,多个收件人用换行分隔'}
+        onChange={(val) => {
+          onchange(source, val, false, Array.isArray(val) ? val.join(',') : val);
         }}
       />
     );

+ 8 - 8
src/pages/rule-engine/Scene/index.tsx

@@ -32,15 +32,15 @@ const Scene = () => {
   const history = useHistory();
 
   const deleteById = async (id: string) => {
-    const alarmResp = await service.sceneByAlarm(id);
-    if (alarmResp.status === 200 && !alarmResp.result) {
-      const resp: any = await service.remove(id);
-      if (resp.status === 200) {
-        actionRef.current?.reload();
-      }
-    } else {
-      onlyMessage('该场景已绑定告警,不可删除', 'warning');
+    // const alarmResp = await service.sceneByAlarm(id);
+    // if (alarmResp.status === 200 && !alarmResp.result) {
+    const resp: any = await service.remove(id);
+    if (resp.status === 200) {
+      actionRef.current?.reload();
     }
+    // } else {
+    //   onlyMessage('该场景已绑定告警,不可删除', 'warning');
+    // }
   };
 
   const Tools = (record: SceneItem): React.ReactNode[] => {