Quellcode durchsuchen

fix: merge next

wzyyy vor 3 Jahren
Ursprung
Commit
1ede6efbf5

+ 15 - 2
src/components/FIndicators/index.tsx

@@ -13,7 +13,6 @@ const FIndicators = (props: Props) => {
   const { value, onChange, type } = props;
   const DatePicker1: any = DatePicker;
   const [list, setList] = useState<any[]>([]);
-
   useEffect(() => {
     const arr = [];
     if (!!props.enum?.falseText && props.enum?.falseValue !== undefined) {
@@ -119,6 +118,20 @@ const FIndicators = (props: Props) => {
           ))}
         </Select>
       );
+    } else if (type === 'string') {
+      return (
+        <Input
+          style={{ width: '100%' }}
+          value={value?.value}
+          placeholder={'请输入'}
+          onChange={(e) => {
+            onChange({
+              ...value,
+              value: [e.target.value],
+            });
+          }}
+        />
+      );
     } else {
       return (
         <>
@@ -152,7 +165,7 @@ const FIndicators = (props: Props) => {
   return (
     <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
       {renderComponent()}
-      {type !== 'boolean' && (
+      {type !== 'boolean' && type !== 'string' && (
         <Checkbox
           style={{ minWidth: 60, marginLeft: 5 }}
           checked={value?.range}

+ 8 - 0
src/components/Metadata/ArrayParam/index.tsx

@@ -66,6 +66,10 @@ const ArrayParam = () => {
             default: 2,
             'x-validator': [
               {
+                format: 'integer',
+                message: '请输入0-2147483647之间的正整数',
+              },
+              {
                 max: 2147483647,
                 message: '请输入0-2147483647之间的正整数',
               },
@@ -141,6 +145,10 @@ const ArrayParam = () => {
                 },
                 'x-validator': [
                   {
+                    format: 'integer',
+                    message: '请输入1-2147483647之间的正整数',
+                  },
+                  {
                     max: 2147483647,
                     message: '请输入1-2147483647之间的正整数',
                   },

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

@@ -39,6 +39,14 @@ const EnumParam = () => {
             },
           },
         ],
+        'x-reactions': {
+          dependencies: ['.type'],
+          fulfill: {
+            state: {
+              value: [{}],
+            },
+          },
+        },
         items: {
           type: 'void',
           'x-component': 'ArrayItems.Item',

+ 16 - 0
src/components/Metadata/JsonParam/index.tsx

@@ -64,6 +64,14 @@ const JsonParam = observer((props: Props) => {
         type: 'array',
         'x-component': 'ArrayItems',
         'x-decorator': 'FormItem',
+        'x-reactions': {
+          dependencies: ['.type'],
+          fulfill: {
+            state: {
+              value: [{}],
+            },
+          },
+        },
         'x-validator': [
           {
             triggerType: 'onBlur',
@@ -294,6 +302,10 @@ const JsonParam = observer((props: Props) => {
                           },
                           'x-validator': [
                             {
+                              format: 'integer',
+                              message: '请输入1-2147483647之间的正整数',
+                            },
+                            {
                               max: 2147483647,
                               message: '请输入1-2147483647之间的正整数',
                             },
@@ -323,6 +335,10 @@ const JsonParam = observer((props: Props) => {
                   default: 2,
                   'x-validator': [
                     {
+                      format: 'integer',
+                      message: '请输入0-2147483647之间的正整数',
+                    },
+                    {
                       max: 2147483647,
                       message: '请输入0-2147483647之间的正整数',
                     },

+ 10 - 20
src/pages/device/components/Metadata/Base/Edit/index.tsx

@@ -208,21 +208,6 @@ const Edit = observer((props: Props) => {
       const reg = new RegExp('^[0-9a-zA-Z_\\\\-]+$');
       return reg.exec(value) ? '' : 'ID只能由数字、字母、下划线、中划线组成';
     },
-    checkLength(value) {
-      if (String(value).length > 64) {
-        return {
-          type: 'error',
-          message: '最多可输入64个字符',
-        };
-      }
-      if (!(value % 1 === 0)) {
-        return {
-          type: 'error',
-          message: '请输入非0正整数',
-        };
-      }
-      return '';
-    },
   });
   const valueTypeConfig = {
     type: 'object',
@@ -293,6 +278,10 @@ const Edit = observer((props: Props) => {
         default: 2,
         'x-validator': [
           {
+            format: 'integer',
+            message: '请输入0-2147483647之间的正整数',
+          },
+          {
             max: 2147483647,
             message: '请输入0-2147483647之间的正整数',
           },
@@ -387,13 +376,12 @@ const Edit = observer((props: Props) => {
             'x-component-props': {
               min: 1,
             },
-            // 'x-validator': [
-            //   {
-            //     checkLength: true,
-            //   },
-            // ],
             'x-validator': [
               {
+                format: 'integer',
+                message: '请输入1-2147483647之间的正整数',
+              },
+              {
                 max: 2147483647,
                 message: '请输入1-2147483647之间的正整数',
               },
@@ -923,6 +911,8 @@ const Edit = observer((props: Props) => {
                               type: '{{$deps[0]}}',
                               enum: '{{$deps[1]}}',
                             },
+                            selfErrors:
+                              "{{$deps[0] === 'string' && $self?.value?.value?.[0]?.length > 64 ? '最多输入64个字符' : ''}}",
                           },
                         },
                       },

+ 47 - 31
src/pages/device/components/Metadata/Cat/index.tsx

@@ -1,8 +1,8 @@
-import { Button, Drawer, message, Space, Tabs } from 'antd';
+import { Button, Drawer, message, Space, Spin, Tabs } from 'antd';
 import { useEffect, useState } from 'react';
 import { productModel, service } from '@/pages/device/Product';
 import { observer } from '@formily/react';
-import { InstanceModel } from '@/pages/device/Instance';
+import { InstanceModel, service as deviceService } from '@/pages/device/Instance';
 import { useLocation } from 'umi';
 import InstanceService from '@/pages/device/Instance/service';
 import { downloadObject } from '@/utils/util';
@@ -24,14 +24,28 @@ const Cat = observer((props: Props) => {
   };
   const metadata = metadataMap[props.type];
   const [value, setValue] = useState(metadata);
+  const [loading, setLoading] = useState<boolean>(false);
   const _path = location.pathname.split('/');
   const id = _path[_path.length - 1];
 
   useEffect(() => {
     if (props.visible) {
-      setValue(metadata);
+      setLoading(true);
+      if (props.type === 'device') {
+        deviceService.detail(id).then((resp) => {
+          setLoading(false);
+          InstanceModel.current = resp.result;
+          setValue(resp.result.metadata);
+        });
+      } else {
+        service.detail(id).then((resp) => {
+          setLoading(false);
+          productModel.current = resp.result;
+          setValue(resp.result.metadata);
+        });
+      }
     }
-  }, [props.visible]);
+  }, [props.visible, props.type]);
 
   useEffect(() => {
     service.codecs().subscribe({
@@ -97,34 +111,36 @@ const Cat = observer((props: Props) => {
         </Space>
       }
     >
-      <div style={{ background: '#F6F6F6' }}>
-        <p style={{ padding: 10, color: 'rgba(0, 0, 0, 0.55)' }}>
-          物模型是对设备在云端的功能描述,包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型,称之为
-          TSL(即 Thing Specification Language),采用 JSON 格式,您可以根据 TSL
-          组装上报设备的数据。您可以导出完整物模型,用于云端应用开发。
-        </p>
-      </div>
-      <Tabs onChange={convertMetadata}>
-        {codecs?.map((item) => (
-          <Tabs.TabPane tab={item.name} tabKey={item.id} key={item.id}>
-            <div style={{ border: '1px solid #eee', height: 670, width: 650 }}>
-              <JMonacoEditor
-                height={'100%'}
-                theme="vs"
-                language="json"
-                key={item.id}
-                value={value}
-                editorDidMount={(editor: any) => {
-                  editor.getAction('editor.action.formatDocument').run();
-                  editor.onDidScrollChange?.(() => {
+      <Spin spinning={loading}>
+        <div style={{ background: '#F6F6F6' }}>
+          <p style={{ padding: 10, color: 'rgba(0, 0, 0, 0.55)' }}>
+            物模型是对设备在云端的功能描述,包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型,称之为
+            TSL(即 Thing Specification Language),采用 JSON 格式,您可以根据 TSL
+            组装上报设备的数据。您可以导出完整物模型,用于云端应用开发。
+          </p>
+        </div>
+        <Tabs onChange={convertMetadata}>
+          {codecs?.map((item) => (
+            <Tabs.TabPane tab={item.name} tabKey={item.id} key={item.id}>
+              <div style={{ border: '1px solid #eee', height: 670, width: 650 }}>
+                <JMonacoEditor
+                  height={'100%'}
+                  theme="vs"
+                  language="json"
+                  key={item.id}
+                  value={value}
+                  editorDidMount={(editor: any) => {
                     editor.getAction('editor.action.formatDocument').run();
-                  });
-                }}
-              />
-            </div>
-          </Tabs.TabPane>
-        ))}
-      </Tabs>
+                    editor.onDidScrollChange?.(() => {
+                      editor.getAction('editor.action.formatDocument').run();
+                    });
+                  }}
+                />
+              </div>
+            </Tabs.TabPane>
+          ))}
+        </Tabs>
+      </Spin>
     </Drawer>
   );
 });

+ 22 - 20
src/pages/device/components/Metadata/Import/index.tsx

@@ -17,6 +17,7 @@ import { InstanceModel } from '@/pages/device/Instance';
 import _ from 'lodash';
 import type { DeviceMetadata } from '@/pages/device/Product/typings';
 import MetadataAction from '@/pages/device/components/Metadata/DataBaseAction';
+import { useMemo, useState } from 'react';
 interface Props {
   visible: boolean;
   close: () => void;
@@ -25,9 +26,14 @@ interface Props {
 
 const Import = (props: Props) => {
   const param = useParams<{ id: string }>();
-  const form = createForm({
-    initialValues: {},
-  });
+  const form = useMemo(
+    () =>
+      createForm({
+        initialValues: {},
+      }),
+    [props.visible],
+  );
+  const [loading, setLoading] = useState<boolean>(false);
 
   const SchemaField = createSchemaField({
     components: {
@@ -282,32 +288,22 @@ const Import = (props: Props) => {
 
   const handleImport = async () => {
     const data = (await form.submit()) as any;
-    const checkProperties = (metadataJson: string) => {
-      const metadata = JSON.parse(metadataJson.metadata);
-      return (
-        !!metadata &&
-        !!metadata?.properties &&
-        !!metadata?.events &&
-        !!metadata?.functions &&
-        !!metadata?.tags
-      );
-    };
-
+    setLoading(true);
     if (data.metadata === 'alink') {
       service.convertMetadata('from', 'alink', data.import).subscribe({
         next: async (meta) => {
           const metadata = JSON.stringify(operateLimits(meta));
-          // eslint-disable-next-line @typescript-eslint/no-throw-literal
-          if (!checkProperties(metadata)) throw 'error';
           if (props?.type === 'device') {
             await deviceService.saveMetadata(param.id, metadata);
           } else {
             await service.modify(param.id, { metadata: metadata });
           }
+          setLoading(false);
           MetadataAction.insert(JSON.parse(metadata || '{}'));
           onlyMessage('导入成功');
         },
         error: () => {
+          setLoading(false);
           onlyMessage('发生错误!', 'error');
         },
       });
@@ -317,6 +313,13 @@ const Import = (props: Props) => {
     } else {
       try {
         const _object = JSON.parse(data[props?.type === 'device' ? 'import' : data?.type] || '{}');
+        if (
+          !(!!_object?.properties || !!_object?.events || !!_object?.functions || !!_object?.tags)
+        ) {
+          onlyMessage('物模型数据不正确', 'error');
+          setLoading(false);
+          return;
+        }
         const params = {
           id: param.id,
           metadata: JSON.stringify(operateLimits(_object as DeviceMetadata)),
@@ -328,17 +331,14 @@ const Import = (props: Props) => {
         } else {
           resp = await service.modify(param.id, params);
         }
+        setLoading(false);
         if (resp.status === 200) {
           if (props?.type === 'device') {
             const metadata: DeviceMetadata = JSON.parse(paramsDevice || '{}');
-            // eslint-disable-next-line @typescript-eslint/no-throw-literal
-            if (!checkProperties(metadata)) throw 'error';
             MetadataAction.insert(metadata);
             onlyMessage('导入成功');
           } else {
             const metadata: DeviceMetadata = JSON.parse(params?.metadata || '{}');
-            // eslint-disable-next-line @typescript-eslint/no-throw-literal
-            if (!checkProperties(metadata)) throw 'error';
             MetadataAction.insert(metadata);
             onlyMessage('导入成功');
           }
@@ -347,6 +347,7 @@ const Import = (props: Props) => {
         Store.set(SystemConst.REFRESH_METADATA_TABLE, true);
         props.close();
       } catch (e) {
+        setLoading(false);
         onlyMessage(e === 'error' ? '物模型数据不正确' : '上传json格式的物模型文件', 'error');
       }
     }
@@ -359,6 +360,7 @@ const Import = (props: Props) => {
       visible={props.visible}
       onCancel={() => props.close()}
       onOk={handleImport}
+      confirmLoading={loading}
     >
       <div style={{ background: 'rgb(236, 237, 238)' }}>
         <p style={{ padding: 10 }}>

+ 10 - 14
src/pages/media/Device/Save/index.tsx

@@ -53,6 +53,7 @@ const Save = () => {
           form.setFieldsValue({
             ...res.result,
             photoUrl: res.result?.photoUrl || defaultImage,
+            channel: res.result?.provider,
           });
           const _accessType = res.result?.provider || DefaultAccessType;
           setAccessType(_accessType);
@@ -62,7 +63,7 @@ const Save = () => {
       });
     } else {
       form.setFieldsValue({
-        provider: DefaultAccessType,
+        channel: DefaultAccessType,
         photoUrl: defaultImage,
       });
       queryProduct(DefaultAccessType);
@@ -73,20 +74,16 @@ const Save = () => {
   const handleSave = useCallback(async () => {
     const formData = await form.validateFields();
     if (formData) {
-      const { provider, ...extraFormData } = formData;
-      if (formData.password === oldPassword && !id) {
-        delete extraFormData.password;
+      const { channel, ...extraFormData } = formData;
+      if (formData?.others?.access_pwd === oldPassword && !id) {
+        delete extraFormData.others?.access_pwd;
       }
       if (formData.id === '') {
         delete extraFormData.id;
       }
-      // if (formData.password === oldPassword) {
-      //   delete extraFormData.password;
-      // }
-      const resp =
-        provider === DefaultAccessType
-          ? await service.saveGB(extraFormData)
-          : await service.saveFixed(extraFormData);
+      const resp = id
+        ? await service.updateData(channel, id, { ...extraFormData, channel })
+        : await service.saveData(channel, { ...extraFormData, channel });
       if (resp.status === 200) {
         form.resetFields();
         onlyMessage('操作成功');
@@ -140,7 +137,7 @@ const Save = () => {
                 <Row>
                   <Col span={24}>
                     <Form.Item
-                      name={'provider'}
+                      name={'channel'}
                       label={'接入方式'}
                       required
                       rules={[{ required: true, message: '请选择接入方式' }]}
@@ -149,7 +146,6 @@ const Save = () => {
                         model={'singular'}
                         itemStyle={{ width: '50%' }}
                         onSelect={(key) => {
-                          console.log(key);
                           setAccessType(key);
                           queryProduct(key);
                           form.resetFields(['id', 'productId']);
@@ -301,7 +297,7 @@ const Save = () => {
                     <Col span={24}>
                       <Form.Item
                         label={'接入密码'}
-                        name={'password'}
+                        name={['others', 'access_pwd']}
                         required
                         rules={[
                           { required: true, message: '请输入接入密码' },

+ 6 - 0
src/pages/media/Device/service.ts

@@ -4,6 +4,12 @@ import SystemConst from '@/utils/const';
 import type { DeviceItem } from './typings';
 
 class Service extends BaseService<DeviceItem> {
+  saveData = (channelId: string, data?: any) =>
+    request(`${this.uri}/${channelId}`, { method: 'POST', data });
+
+  updateData = (channel: string, deviceId: string, data?: any) =>
+    request(`${this.uri}/${channel}/${deviceId}`, { method: 'PUT', data });
+
   // 新增GB28181接入的设备
   saveGB = (data?: any) => request(`${this.uri}/gb28181`, { method: 'PATCH', data });
 

+ 1 - 1
src/pages/notice/Template/Detail/index.tsx

@@ -335,7 +335,7 @@ const Detail = observer(() => {
           });
           onFieldValueChange('template.body', (field, form1) => {
             const value = (field as Field).value;
-            console.log(value);
+            // console.log(value);
             const idList = value.match(pattern)?.filter((i: string) => i);
             form1.setFieldState('variableDefinitions', (state1) => {
               state1.visible = !!idList && idList.length > 0;

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

@@ -68,7 +68,10 @@ export default (props: BuiltInProps) => {
             });
           }
         } else {
-          if (item.type === type) {
+          if (
+            item.type === type ||
+            (type === 'double' && ['int', 'float', 'double', 'long'].includes(item.type))
+          ) {
             list.push(item);
           }
         }

+ 12 - 12
src/pages/system/DataSource/Save/index.tsx

@@ -112,10 +112,10 @@ const Save = (props: Props) => {
               placeholder: '请输入r2bdc或者jdbc连接地址,示例:r2dbc:mysql://127.0.0.1:3306/test',
             },
             'x-validator': [
-              {
-                max: 64,
-                message: '最多可输入64个字符',
-              },
+              // {
+              //   max: 64,
+              //   message: '最多可输入64个字符',
+              // },
               {
                 required: true,
                 message: '请输入URL',
@@ -144,10 +144,10 @@ const Save = (props: Props) => {
               placeholder: '请输入管理地址,示例:http://localhost:15672',
             },
             'x-validator': [
-              {
-                max: 64,
-                message: '最多可输入64个字符',
-              },
+              // {
+              //   max: 64,
+              //   message: '最多可输入64个字符',
+              // },
               {
                 required: true,
                 message: '请输入管理地址',
@@ -176,10 +176,10 @@ const Save = (props: Props) => {
               placeholder: '请输入链接地址,示例:localhost:5672',
             },
             'x-validator': [
-              {
-                max: 64,
-                message: '最多可输入64个字符',
-              },
+              // {
+              //   max: 64,
+              //   message: '最多可输入64个字符',
+              // },
               {
                 required: true,
                 message: '请输入链接地址',