Parcourir la source

fix: 修复物模型相关bug及其他模块bug

修复物模型相关bug及其他模块bug
hear il y a 3 ans
Parent
commit
3e7583db90
31 fichiers modifiés avec 742 ajouts et 336 suppressions
  1. 20 15
      src/components/Metadata/JsonParam/index.tsx
  2. 1 0
      src/components/SearchComponent/index.tsx
  3. 8 5
      src/db.ts
  4. 3 3
      src/pages/DataCollect/Channel/Save/index.tsx
  5. 36 1
      src/pages/device/Instance/Detail/Config/Edit.tsx
  6. 2 2
      src/pages/device/Instance/Detail/Info/index.tsx
  7. 12 4
      src/pages/device/Product/Detail/Access/AccessConfig/index.tsx
  8. 4 4
      src/pages/device/components/Metadata/Base/Edit/index.tsx
  9. 12 3
      src/pages/device/components/Metadata/Base/index.tsx
  10. 1 1
      src/pages/home/components/Body.tsx
  11. 2 2
      src/pages/home/components/Guide.tsx
  12. 4 0
      src/pages/iot-card/CardManagement/Detail/index.tsx
  13. 1 1
      src/pages/iot-card/CardManagement/SaveModal.tsx
  14. 3 0
      src/pages/iot-card/CardManagement/typing.d.ts
  15. 8 0
      src/pages/link/AccessConfig/Detail/Media/index.tsx
  16. 8 1
      src/pages/link/AccessConfig/Detail/components/Finish/index.tsx
  17. 16 0
      src/pages/media/Device/Channel/Save.tsx
  18. 1 1
      src/pages/media/Device/index.tsx
  19. 6 5
      src/pages/media/Home/index.tsx
  20. 1 1
      src/pages/notice/Template/Detail/index.tsx
  21. 35 15
      src/pages/rule-engine/Alarm/Config/Save/output.tsx
  22. 1 0
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx
  23. 14 8
      src/pages/rule-engine/Scene/Save/components/Buttons/Dropdown.tsx
  24. 7 0
      src/pages/system/Apply/Save/index.less
  25. 2 0
      src/pages/system/Apply/Save/index.tsx
  26. 57 12
      src/pages/system/Department/Assets/product/bind.tsx
  27. 3 3
      src/pages/system/Department/Assets/product/index.tsx
  28. 4 1
      src/pages/system/Menu/Detail/edit.tsx
  29. 455 245
      src/pages/system/Menu/Setting/baseMenu.ts
  30. 7 1
      src/pages/user/Login/index.less
  31. 8 2
      src/pages/user/Login/index.tsx

+ 20 - 15
src/components/Metadata/JsonParam/index.tsx

@@ -14,7 +14,8 @@ import Editable from '../EditTable';
 // 不算是自定义组件。只是抽离了JSONSchema
 interface Props {
   keys?: string;
-  isFunction?: boolean;
+  // isFunction?: boolean;
+  isFilter?: string;
 }
 
 const JsonParam = observer((props: Props) => {
@@ -203,11 +204,18 @@ const JsonParam = observer((props: Props) => {
                       required: true,
                       'x-decorator': 'FormItem',
                       'x-component': 'Select',
-                      enum: DataTypeList.filter((item) =>
-                        ['int', 'long', 'float', 'double', 'string', 'boolean', 'date'].includes(
-                          item.value,
-                        ),
-                      ),
+                      // enum: DataTypeList.filter((item) =>
+                      //   ['int', 'long', 'float', 'double', 'string', 'boolean', 'date'].includes(
+                      //     item.value,
+                      //   ),
+                      // ),
+                      enum:
+                        props.isFilter === 'yes'
+                          ? DataTypeList.filter(
+                              (item) => item.value !== 'array' && item.value !== 'object',
+                            )
+                          : DataTypeList,
+                      // enum: DataTypeList,
                       'x-validator': [
                         {
                           required: true,
@@ -254,7 +262,7 @@ const JsonParam = observer((props: Props) => {
                       'x-decorator': 'FormItem',
                       'x-component': 'ArrayParam',
                       'x-component-props': {
-                        isFunction: props.isFunction,
+                        // isFunction: props.isFunction,
                       },
                       'x-reactions': {
                         dependencies: ['..valueType.type'],
@@ -301,9 +309,7 @@ const JsonParam = observer((props: Props) => {
                           dependencies: ['..valueType.type'],
                           fulfill: {
                             state: {
-                              visible:
-                                !props.isFunction &&
-                                "{{['int','float','long','double'].includes($deps[0])}}",
+                              visible: "{{['int','float','long','double'].includes($deps[0])}}",
                             },
                           },
                         },
@@ -367,9 +373,7 @@ const JsonParam = observer((props: Props) => {
                             dependencies: ['..type'],
                             fulfill: {
                               state: {
-                                visible:
-                                  !props.isFunction &&
-                                  "{{['string','password'].includes($deps[0])}}",
+                                visible: "{{['string','password'].includes($deps[0])}}",
                               },
                             },
                           },
@@ -405,7 +409,7 @@ const JsonParam = observer((props: Props) => {
                     dependencies: ['..valueType.type'],
                     fulfill: {
                       state: {
-                        visible: !props.isFunction && "{{['float','double'].includes($deps[0])}}",
+                        visible: "{{['float','double'].includes($deps[0])}}",
                       },
                     },
                   },
@@ -417,7 +421,8 @@ const JsonParam = observer((props: Props) => {
                   'x-decorator': 'FormItem',
                   'x-component': 'JsonParam',
                   'x-component-props': {
-                    isFunction: props.isFunction,
+                    // isFunction: props.isFunction,
+                    isFilter: 'yes',
                   },
                   'x-reactions': {
                     dependencies: ['.valueType.type'],

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

@@ -778,6 +778,7 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
         }}
         type="primary"
         overlay={historyDom}
+        overlayStyle={{ maxHeight: 350, overflow: 'auto' }}
         htmlType={'submit'}
       >
         搜索

+ 8 - 5
src/db.ts

@@ -3,6 +3,7 @@ import SystemConst from '@/utils/const';
 
 class DexieDB {
   public db: Dexie;
+  public id: string | undefined;
 
   constructor() {
     this.db = new Dexie(SystemConst.API_BASE);
@@ -15,15 +16,17 @@ class DexieDB {
       functions: 'id,name',
       tags: 'id,name',
     });
+    this.id = undefined;
   }
 
-  getDB() {
+  getDB(id?: string) {
+    this.id = id;
     if (this.db && this.db?.verno === 0) {
       // 考虑优化
       // 获取不到真实的数据库版本
       // 所以当获取到的数据库版本号为0则删除数据库重新初始化
       this.db.delete();
-      this.db = new Dexie(SystemConst.API_BASE);
+      this.db = new Dexie(`${SystemConst.API_BASE}_${id}`);
       this.db.version(1);
       return this.db;
     }
@@ -36,11 +39,11 @@ class DexieDB {
    * @param extendedSchema
    */
   updateSchema = async (extendedSchema: Record<string, string | null>) => {
-    await this.getDB().close();
-    await this.getDB()
+    await this.getDB(this.id!).close();
+    await this.getDB(this.id!)
       .version(this.db.verno + 1)
       .stores(extendedSchema);
-    return this.getDB().open();
+    return this.getDB(this.id!).open();
   };
 }
 

+ 3 - 3
src/pages/DataCollect/Channel/Save/index.tsx

@@ -196,11 +196,11 @@ export default (props: Props) => {
               },
               {
                 max: 65535,
-                message: '请输入0-65535之间的正整数',
+                message: '请输入1-65535之间的正整数',
               },
               {
-                min: 0,
-                message: '请输入0-65535之间的正整数',
+                min: 1,
+                message: '请输入1-65535之间的正整数',
               },
             ],
             'x-reactions': {

+ 36 - 1
src/pages/device/Instance/Detail/Config/Edit.tsx

@@ -1,4 +1,4 @@
-import { createForm } from '@formily/core';
+import { createForm, onFormInit } from '@formily/core';
 import { createSchemaField } from '@formily/react';
 import { InstanceModel, service } from '@/pages/device/Instance';
 import type { ISchema } from '@formily/json-schema';
@@ -21,12 +21,47 @@ interface Props {
 
 const Edit = (props: Props) => {
   const { metadata } = props;
+  console.log(metadata);
   const params = useParams<{ id: string }>();
   const id = InstanceModel.detail?.id || params?.id;
 
   const form = createForm({
     validateFirst: true,
     initialValues: InstanceModel.detail?.configuration,
+    effects: () => {
+      onFormInit((f) => {
+        if (InstanceModel.detail.accessProvider === 'OneNet') {
+          metadata?.[0].properties?.forEach((item: any) => {
+            f.setFieldState(item.property, (state) => {
+              state.validator = [
+                {
+                  required: true,
+                  message: `请输入${item.name}`,
+                },
+              ];
+            });
+          });
+        }
+        if (InstanceModel.detail.accessProvider === 'Ctwing') {
+          f.setFieldState('ctwing_imei', (state) => {
+            state.validator = [
+              {
+                required: true,
+                message: `请输入IMEI`,
+              },
+            ];
+          });
+          f.setFieldState('ctwing_sn', (state) => {
+            state.validator = [
+              {
+                required: true,
+                message: `请输入SN`,
+              },
+            ];
+          });
+        }
+      });
+    },
   });
 
   const SchemaField = createSchemaField({

+ 2 - 2
src/pages/device/Instance/Detail/Info/index.tsx

@@ -123,7 +123,7 @@ const Info = observer(() => {
               defaultMessage: '连接协议',
             })}
           >
-            {InstanceModel.detail?.protocolName}
+            {InstanceModel.detail?.transport}
           </Descriptions.Item>
           <Descriptions.Item
             label={intl.formatMessage({
@@ -131,7 +131,7 @@ const Info = observer(() => {
               defaultMessage: '消息协议',
             })}
           >
-            {InstanceModel.detail?.transport}
+            {InstanceModel.detail?.protocolName}
           </Descriptions.Item>
           <Descriptions.Item
             label={intl.formatMessage({

+ 12 - 4
src/pages/device/Product/Detail/Access/AccessConfig/index.tsx

@@ -82,10 +82,18 @@ const AccessConfig = (props: Props) => {
               // },
             ],
     };
-    service.queryList({ ...temp, sorts: [{ name: 'createTime', order: 'desc' }] }).then((resp) => {
-      setDataSource(resp?.result);
-      setCurrent(resp?.result?.data?.[0]);
-    });
+    service
+      .queryList({
+        ...temp,
+        sorts: [
+          { name: 'id', value: productModel.current?.accessId },
+          { name: 'createTime', order: 'desc' },
+        ],
+      })
+      .then((resp) => {
+        setDataSource(resp?.result);
+        // setCurrent(resp?.result?.data?.[0]);
+      });
   };
 
   const columns: ProColumns<any>[] = [

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

@@ -798,7 +798,7 @@ const Edit = observer((props: Props) => {
                     'x-validator': [
                       {
                         // triggerType: 'onBlur',
-                        validator: (value: any[]) => {
+                        validator: (value: any) => {
                           return new Promise((resolve) => {
                             const number = Number(value);
                             if (number <= 0 || value.length > 64 || /[.]/.test(value)) {
@@ -1240,9 +1240,9 @@ const Edit = observer((props: Props) => {
         }),
         'x-decorator': 'FormItem',
         'x-component': 'JsonParam',
-        'x-component-props': {
-          isFunction: true,
-        },
+        // 'x-component-props': {
+        //   isFunction: true,
+        // },
         'x-reactions': (field) => {
           field.setComponentProps({ keys: 'inputs' });
         },

+ 12 - 3
src/pages/device/components/Metadata/Base/index.tsx

@@ -21,6 +21,7 @@ import { PermissionButton } from '@/components';
 import { onlyMessage } from '@/utils/util';
 import { message } from 'antd';
 import { InstanceModel, service as instanceService } from '@/pages/device/Instance';
+import { service as productService } from '@/pages/device/Product';
 
 interface Props {
   type: MetadataType;
@@ -129,9 +130,17 @@ const BaseMetadata = observer((props: Props) => {
   ];
 
   const initData = useCallback(async () => {
-    const result = await DB.getDB().table(`${type}`).toArray();
-    console.log(result);
-    setData(result.sort((a, b) => b?.sortsIndex - a?.sortsIndex));
+    // const result = await DB.getDB().table(`${type}`).toArray();
+    const resp =
+      target === 'product'
+        ? await productService.detail(param.id)
+        : await instanceService.detail(param.id);
+    if (resp.status === 200) {
+      InstanceModel.detail = resp?.result || [];
+      const item = JSON.parse(resp.result?.metadata || '{}');
+      // console.log(item)
+      setData(item[type]?.sort((a: any, b: any) => b?.sortsIndex - a?.sortsIndex));
+    }
   }, [param.id, type]);
 
   useEffect(() => {

+ 1 - 1
src/pages/home/components/Body.tsx

@@ -9,7 +9,7 @@ interface BodyProps {
   url?: string;
 }
 
-const defaultUrl = require('/public/images/home/content.png');
+const defaultUrl = require('/public/images/home/content1.svg');
 export default (props: BodyProps) => {
   return (
     <div className={classNames('home-body', props.className)}>

+ 2 - 2
src/pages/home/components/Guide.tsx

@@ -1,7 +1,7 @@
 import './index.less';
-import { message } from 'antd';
 import useHistory from '@/hooks/route/useHistory';
 import Title from './Title';
+import { onlyMessage } from '@/utils/util';
 
 const Image = {
   1: require('/public/images/home/1.png'),
@@ -31,7 +31,7 @@ const GuideItem = (props: GuideItemProps) => {
     if (props.url && props.auth) {
       history.push(`${props.url}`, props.param);
     } else {
-      message.warning('暂无权限,请联系管理员');
+      onlyMessage('暂无权限,请联系管理员', 'warning');
     }
   };
 

+ 4 - 0
src/pages/iot-card/CardManagement/Detail/index.tsx

@@ -328,6 +328,10 @@ const CardDetail = () => {
               <Descriptions.Item label={'卡号'}>{detail.id}</Descriptions.Item>
               <Descriptions.Item label={'ICCID'}>{detail.iccId}</Descriptions.Item>
               <Descriptions.Item label={'绑定设备'}>{detail.deviceName}</Descriptions.Item>
+              <Descriptions.Item label={'平台类型'}>
+                {detail.operatorPlatformType?.text}
+              </Descriptions.Item>
+              <Descriptions.Item label={'平台名称'}>{detail.platformConfigName}</Descriptions.Item>
               <Descriptions.Item label={'运营商'}>{detail.operatorName}</Descriptions.Item>
               <Descriptions.Item label={'类型'}>{detail.cardType?.text}</Descriptions.Item>
               <Descriptions.Item label={'激活日期'}>

+ 1 - 1
src/pages/iot-card/CardManagement/SaveModal.tsx

@@ -88,7 +88,7 @@ const Save = (props: SaveType) => {
             () => ({
               async validator(_, value) {
                 if (value) {
-                  const validateId = await isValidateId(value);
+                  const validateId = props.type === 'add' ? await isValidateId(value) : '';
                   if (validateId === '') {
                     return Promise.resolve();
                   } else {

+ 3 - 0
src/pages/iot-card/CardManagement/typing.d.ts

@@ -13,5 +13,8 @@ export type CardManagement = {
   activationDate: string;
   updateTime: string;
   cardStateType: any;
+  cardState: any;
   describe: string;
+  platformConfigName: string;
+  operatorPlatformType: any;
 };

+ 8 - 0
src/pages/link/AccessConfig/Detail/Media/index.tsx

@@ -247,6 +247,10 @@ const Media = (props: Props) => {
                   required: true,
                   message: '请输入SIP域',
                 },
+                {
+                  max: 64,
+                  message: '最大可输入64个字符',
+                },
               ],
             },
             'configuration.sipId': {
@@ -265,6 +269,10 @@ const Media = (props: Props) => {
                   required: true,
                   message: '请输入SIP ID',
                 },
+                {
+                  max: 64,
+                  message: '最大可输入64个字符',
+                },
               ],
             },
             'configuration.shareCluster': {

+ 8 - 1
src/pages/link/AccessConfig/Detail/components/Finish/index.tsx

@@ -294,7 +294,14 @@ const Finish = (props: Props) => {
         <div>
           <TitleComponent data={'基本信息'} />
           <Form name="basic" layout="vertical" form={form}>
-            <Form.Item label="名称" name="name" rules={[{ required: true, message: '请输入名称' }]}>
+            <Form.Item
+              label="名称"
+              name="name"
+              rules={[
+                { required: true, message: '请输入名称' },
+                { max: 64, message: '最多可输入64字符' },
+              ]}
+            >
               <Input placeholder="请输入名称" />
             </Form.Item>
             <Form.Item name="description" label="说明">

+ 16 - 0
src/pages/media/Device/Channel/Save.tsx

@@ -88,6 +88,12 @@ const Save = (props: SaveModalProps) => {
               gridSpan: 1,
               tooltip: '若不填写,系统将自动生成唯一ID',
             },
+            'x-validator': [
+              {
+                max: 64,
+                message: '最多可输入64个字符',
+              },
+            ],
           },
           name: {
             type: 'string',
@@ -147,6 +153,10 @@ const Save = (props: SaveModalProps) => {
                 message: '请输入视频地址',
               },
               {
+                max: 128,
+                message: '最多可输入128个字符',
+              },
+              {
                 validator: (value: string) => {
                   const reg = /(http|https|rtsp|rtmp):\/\/([\w.]+\/?)\S*/;
                   return new Promise((resolve) => {
@@ -198,6 +208,12 @@ const Save = (props: SaveModalProps) => {
             'x-decorator-props': {
               gridSpan: 1,
             },
+            'x-validator': [
+              {
+                max: 64,
+                message: '最多可输入64个字符',
+              },
+            ],
           },
           address: {
             type: 'string',

+ 1 - 1
src/pages/media/Device/index.tsx

@@ -285,7 +285,7 @@ const Device = () => {
                           ? '设备已禁用'
                           : '',
                     }
-                  : undefined
+                  : { title: '更新通道' }
               }
               key={'updateChannel'}
               isPermission={permission.update}

+ 6 - 5
src/pages/media/Home/index.tsx

@@ -1,5 +1,5 @@
 import { PageContainer } from '@ant-design/pro-layout';
-import { Col, message, Row, Tooltip } from 'antd';
+import { Col, Row, Tooltip } from 'antd';
 import { PermissionButton } from '@/components';
 import { getMenuPathByCode } from '@/utils/menu';
 import useHistory from '@/hooks/route/useHistory';
@@ -11,6 +11,7 @@ import DeviceModal from './deviceModal';
 import './index.less';
 import { Body, Guide, Statistics } from '@/pages/home/components';
 import Steps from '@/pages/home/components/Steps';
+import { onlyMessage } from '@/utils/util';
 
 const permissionTip = '暂无权限,请联系管理员';
 
@@ -44,7 +45,7 @@ export default () => {
         save: true,
       });
     } else {
-      message.warning(permissionTip);
+      onlyMessage(permissionTip, 'warning');
     }
   };
 
@@ -52,7 +53,7 @@ export default () => {
     if (splitScreenUrl) {
       history.push(splitScreenUrl);
     } else {
-      message.warning(permissionTip);
+      onlyMessage(permissionTip, 'warning');
     }
   };
 
@@ -60,7 +61,7 @@ export default () => {
     if (channelUrl) {
       setVisible(true);
     } else {
-      message.warning(permissionTip);
+      onlyMessage(permissionTip, 'warning');
     }
   };
 
@@ -124,7 +125,7 @@ export default () => {
                     if (!!dashBoardUrl) {
                       history.push(`${dashBoardUrl}`);
                     } else {
-                      message.warning('暂无权限,请联系管理员');
+                      onlyMessage('暂无权限,请联系管理员', 'warning');
                     }
                   }}
                 >

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

@@ -557,7 +557,7 @@ const Detail = observer(() => {
 
   registerValidateRules({
     batchCheckEmail(value) {
-      const regEmail = /^([A-Za-z0-9_\-\.])+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/;
+      const regEmail = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
       let error;
       if (value) {
         value.some((item: string) => {

+ 35 - 15
src/pages/rule-engine/Alarm/Config/Save/output.tsx

@@ -1,7 +1,7 @@
 import { Modal } from 'antd';
 import { createSchemaField } from '@formily/react';
 import { Form, FormGrid, FormItem, Input, Switch } from '@formily/antd';
-import { createForm, onFormInit } from '@formily/core';
+import { createForm, Field, onFieldChange, onFormInit } from '@formily/core';
 import type { ISchema } from '@formily/json-schema';
 import { service } from '@/pages/rule-engine/Alarm/Config';
 import { onlyMessage } from '@/utils/util';
@@ -21,6 +21,7 @@ const OutputSave = (props: Props) => {
     effects() {
       onFormInit(async (f) => {
         if (data) {
+          console.log(data);
           f.setInitialValues({
             // ...data?.data?.config?.config,
             address: data?.data?.config?.config?.address,
@@ -29,6 +30,25 @@ const OutputSave = (props: Props) => {
           });
         }
       });
+      onFieldChange('state', (field, form1) => {
+        const value = (field as Field).value;
+        console.log(value);
+        if (value) {
+          form1.setFieldState('address', (state) => {
+            state.visible = true;
+          });
+          form1.setFieldState('topic', (state) => {
+            state.visible = true;
+          });
+        } else {
+          form1.setFieldState('address', (state) => {
+            state.visible = false;
+          });
+          form1.setFieldState('topic', (state) => {
+            state.visible = false;
+          });
+        }
+      });
     },
   });
 
@@ -68,10 +88,22 @@ const OutputSave = (props: Props) => {
   const outputSchema: ISchema = {
     type: 'object',
     properties: {
+      state: {
+        title: '状态',
+        type: 'string',
+        // required: true,
+        'x-decorator': 'FormItem',
+        'x-component': 'Switch',
+        default: false,
+        'x-component-props': {
+          checkedChildren: '禁用',
+          unCheckedChildren: '启用',
+        },
+      },
       address: {
         title: 'kafka地址',
         type: 'string',
-        // required: true,
+        required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Input',
         'x-component-props': {
@@ -87,7 +119,7 @@ const OutputSave = (props: Props) => {
       topic: {
         title: 'topic',
         type: 'string',
-        // required: true,
+        required: true,
         'x-decorator': 'FormItem',
         'x-component': 'Input',
         'x-component-props': {
@@ -100,18 +132,6 @@ const OutputSave = (props: Props) => {
           },
         ],
       },
-      state: {
-        title: '状态',
-        type: 'string',
-        // required: true,
-        'x-decorator': 'FormItem',
-        'x-component': 'Switch',
-        default: false,
-        'x-component-props': {
-          checkedChildren: '禁用',
-          unCheckedChildren: '启用',
-        },
-      },
       // layout2: {
       //   type: 'void',
       //   'x-decorator': 'FormGrid',

+ 1 - 0
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx

@@ -103,6 +103,7 @@ export default observer((props: Props) => {
 
   useEffect(() => {
     setLabelValue(props.label);
+    console.log('-------', props.label);
   }, []);
 
   const renderNode = (type: string) => {

+ 14 - 8
src/pages/rule-engine/Scene/Save/components/Buttons/Dropdown.tsx

@@ -4,6 +4,7 @@ import classNames from 'classnames';
 import styles from './index.less';
 import { onlyMessage } from '@/utils/util';
 import { useOption } from '@/pages/rule-engine/Scene/Save/components/Buttons/index';
+import { FormModel } from '../..';
 
 type DropdownButtonOptions = {
   title: string;
@@ -92,13 +93,17 @@ const DropdownButton = (props: DropdownButtonProps) => {
 
   const DropdownRender = useMemo(() => {
     return (
-      <div className={styles['dropdown-content']}>
-        <Tree
-          selectedKeys={myValue ? [myValue] : []}
-          onSelect={treeSelect}
-          treeData={props.options}
-          fieldNames={props.fieldNames}
-        />
+      <div className={styles['dropdown-content']} style={{ background: '#fff', padding: '0 16px' }}>
+        {props.options.length !== 0 ? (
+          <Tree
+            selectedKeys={myValue ? [myValue] : []}
+            onSelect={treeSelect}
+            treeData={props.options}
+            fieldNames={props.fieldNames}
+          />
+        ) : (
+          <Empty image={Empty.PRESENTED_IMAGE_SIMPLE} />
+        )}
       </div>
     );
   }, [props.options, myValue]);
@@ -142,7 +147,8 @@ const DropdownButton = (props: DropdownButtonProps) => {
       <div
         className={classNames(styles['dropdown-button'], props.className, typeClassName)}
         onClick={() => {
-          if (props.options.length === 0 && props.type !== 'termType') {
+          console.log(props.options, myValue, FormModel.current.trigger?.device);
+          if (!FormModel.current.trigger?.device && props.type !== 'termType') {
             onlyMessage('请先配置设备触发规则', 'warning');
           }
           if (props.options.length === 0 && props.type === 'termType') {

+ 7 - 0
src/pages/system/Apply/Save/index.less

@@ -42,5 +42,12 @@
       height: 100%;
       margin: 5px 20px 0 0;
     }
+
+    .ant-radio-button-wrapper-disabled.ant-radio-button-wrapper-checked {
+      color: rgba(0, 0, 0, 0.25);
+      background-color: #fff;
+      border-color: #1d39c4;
+      box-shadow: none;
+    }
   }
 }

+ 2 - 0
src/pages/system/Apply/Save/index.tsx

@@ -1144,8 +1144,10 @@ const Save = () => {
         'x-component-props': {
           optionType: 'button',
           placeholder: '请选择应用',
+          disabled: !!id,
         },
         required: true,
+
         // 'x-reactions': '{{useAsyncDataSource(getProvidersAll)}}',
         'x-decorator-props': {
           gridSpan: 1,

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

@@ -37,7 +37,7 @@ const Bind = observer((props: Props) => {
   const [isAll, setIsAll] = useState<boolean>(false);
   const bindChecks = useRef(new Map());
 
-  const columns: ProColumns<ProductItem>[] = [
+  const columns: ProColumns<any>[] = [
     {
       dataIndex: 'id',
       title: 'ID',
@@ -54,6 +54,49 @@ const Bind = observer((props: Props) => {
       // },
     },
     {
+      title: '资产权限',
+      render: (_, record) => {
+        let disabled = true;
+        let disabledAll = true;
+        const assetsOptions =
+          props.assetsType && record.permissionInfoList
+            ? props.assetsType.filter((item: any) =>
+                record.permissionInfoList!.some((pItem: any) => pItem.id === item.value),
+              )
+            : [];
+        if (isAll && Models.bindKeys.includes(record.id)) {
+          disabled = true;
+          disabledAll = true;
+        } else if (!isAll && Models.bindKeys.includes(record.id)) {
+          disabled = false;
+          disabledAll = false;
+        } else {
+          disabled = true;
+          disabledAll = true;
+        }
+
+        return (
+          <Checkbox.Group
+            options={assetsOptions?.map((item: any) => {
+              return {
+                ...item,
+                disabled: item.disabled !== true ? disabled : item.disabled,
+              };
+            })}
+            value={checkAssets}
+            onChange={(e: any) => {
+              setCheckAssets(e);
+              if (!disabledAll) {
+                if (bindChecks.current.has(record.id)) {
+                  bindChecks.current.set(record.id, e);
+                }
+              }
+            }}
+          />
+        );
+      },
+    },
+    {
       dataIndex: 'describe',
       title: intl.formatMessage({
         id: 'pages.system.description',
@@ -61,6 +104,7 @@ const Bind = observer((props: Props) => {
       }),
       hideInSearch: true,
     },
+
     {
       title: '状态',
       dataIndex: 'state',
@@ -126,8 +170,8 @@ const Bind = observer((props: Props) => {
     AssetsModel.params = {};
   };
 
-  const getSelectedRowsKey = (selectedRows) => {
-    return selectedRows.map((item) => item?.id).filter((item2) => !!item2 !== false);
+  const getSelectedRowsKey = (selectedRows: any) => {
+    return selectedRows.map((item: any) => item?.id).filter((item2: any) => !!item2 !== false);
   };
 
   useEffect(() => {
@@ -308,15 +352,16 @@ const Bind = observer((props: Props) => {
                   resp.result.data.map((item: any) => item.id),
                 );
                 if (assetsResp.status === 200) {
-                  newData = newData.map((item: any) => {
-                    const assetsItem = assetsResp.result.find(
-                      (aItem: any) => (aItem.assetId = item.id),
-                    );
-                    return {
-                      ...item,
-                      ...assetsItem,
-                    };
-                  });
+                  newData = newData?.reduce((x: any, y: any) => {
+                    const id = assetsResp.result.find((item: any) => item.assetId === y.id);
+                    if (id) {
+                      Object.assign(id, y);
+                    } else {
+                      x.push(y);
+                    }
+                    return x;
+                  }, assetsResp.result);
+                  console.log('--------', newData);
                 }
               }
 

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

@@ -119,7 +119,7 @@ export default observer((props: { parentId: string }) => {
       dataIndex: 'grantedPermissions',
       hideInSearch: true,
       render: (_, row) => {
-        return handlePermissionsMap(row.grantedPermissions, assetsType);
+        return handlePermissionsMap(row.grantedPermissions);
       },
       width: 80,
     },
@@ -241,8 +241,8 @@ export default observer((props: { parentId: string }) => {
     Models.bindKeys = [];
     Models.unBindKeys = [];
   };
-  const getSelectedRowsKey = (selectedRows) => {
-    return selectedRows.map((item) => item?.id).filter((item2) => !!item2 !== false);
+  const getSelectedRowsKey = (selectedRows: any) => {
+    return selectedRows.map((item: any) => item?.id).filter((item2: any) => !!item2 !== false);
   };
 
   useEffect(() => {

+ 4 - 1
src/pages/system/Menu/Detail/edit.tsx

@@ -164,7 +164,10 @@ export default (props: EditProps) => {
                       defaultMessage: '编码',
                     })}
                     required={true}
-                    rules={[{ required: true, message: '请输入编码' }]}
+                    rules={[
+                      { required: true, message: '请输入编码' },
+                      { max: 64, message: '最多可输入64个字符' },
+                    ]}
                   >
                     <Input placeholder={'请输入编码'} />
                   </Form.Item>

Fichier diff supprimé car celui-ci est trop grand
+ 455 - 245
src/pages/system/Menu/Setting/baseMenu.ts


+ 7 - 1
src/pages/user/Login/index.less

@@ -152,7 +152,13 @@
     line-height: 110px;
     letter-spacing: 0.03em;
   }
-
+  .records {
+    position: absolute;
+    top: 96%;
+    left: 35%;
+    color: rgba(0, 0, 0, 0.35);
+    font-size: 14px;
+  }
   .systemDesc {
     width: 513px;
     height: 17px;

+ 8 - 2
src/pages/user/Login/index.tsx

@@ -320,8 +320,14 @@ const Login: React.FC = () => {
             src={basis.backgroud || require('/public/images/login.png')}
             style={{ width: '100%', height: '100%' }}
           />
-          {/*<div className={styles.systemName}>{SystemConst.SYSTEM_NAME}</div>*/}
-          {/*<div className={styles.systemDesc}>OPEN SOURCE INTERNET OF THINGS BASIC PLATFORM</div>*/}
+          <a
+            href={'https://beian.miit.gov.cn/#/Integrated/index'}
+            target="_blank"
+            rel="noopener noreferrer"
+            className={styles.records}
+          >
+            备案:渝ICP备19017719号-1
+          </a>
         </div>
       </div>
     </Spin>