Parcourir la source

fix: 修改协议管理保存按钮无效的问题

sun-chaochao il y a 3 ans
Parent
commit
66fa5e1f06

+ 4 - 4
src/pages/device/Instance/Detail/Config/index.tsx

@@ -7,7 +7,7 @@ import {
   CheckOutlined,
   EditOutlined,
   QuestionCircleOutlined,
-  UndoOutlined,
+  SyncOutlined,
 } from '@ant-design/icons';
 import Edit from './Edit';
 import { PermissionButton } from '@/components';
@@ -66,14 +66,14 @@ const Config = () => {
       if (isExit(item.property)) {
         return (
           <div>
-            <span style={{ marginRight: '10px' }}>{config[item.property]}</span>
+            <span style={{ marginRight: '10px' }}>{config[item.property] || '--'}</span>
             <Tooltip title={`有效值:${config[item.property]}`}>
               <QuestionCircleOutlined />
             </Tooltip>
           </div>
         );
       } else {
-        return <div>{config[item.property]}</div>;
+        return <div>{config[item.property] || '--'}</div>;
       }
     } else {
       return '--';
@@ -132,7 +132,7 @@ const Config = () => {
               type="link"
               isPermission={permission.update}
             >
-              <UndoOutlined />
+              <SyncOutlined />
               恢复默认
               <Tooltip
                 title={`该设备单独编辑过配置信息,点击此将恢复成默认的配置信息,请谨慎操作。`}

+ 64 - 26
src/pages/device/Instance/Detail/MetadataMap/index.tsx

@@ -5,6 +5,7 @@ import EditableTable from './EditableTable';
 import { getMenuPathByParams, MENUS_CODE } from '@/utils/menu';
 import type { ProductItem } from '@/pages/device/Product/typings';
 import { useParams } from 'umi';
+import { PermissionButton } from '@/components';
 interface Props {
   type: 'device' | 'product';
 }
@@ -14,6 +15,7 @@ const MetadataMap = (props: Props) => {
   const [product, setProduct] = useState<Partial<ProductItem>>();
   const [data, setData] = useState<any>({});
   const params = useParams<{ id: string }>();
+  const { permission } = PermissionButton.usePermission('device/Product');
 
   const handleSearch = async () => {
     if (props.type === 'product') {
@@ -45,33 +47,22 @@ const MetadataMap = (props: Props) => {
   };
 
   const renderComponent = () => {
+    const metadata = JSON.parse(product?.metadata || '{}');
+    const dmetadata = JSON.parse(data?.metadata || '{}');
     if (product) {
-      if (!product.accessId) {
-        return (
-          <Empty
-            description={
-              <span>
-                请配置对应产品的
-                <a
-                  onClick={() => {
-                    checkUrl('access');
-                  }}
-                >
-                  设备接入方式
-                </a>
-              </span>
-            }
-          />
-        );
-      } else {
-        const metadata = JSON.parse(product?.metadata || '{}');
-        const dmetadata = JSON.parse(data?.metadata || '{}');
-        if (
-          (type === 'device' &&
-            (metadata?.properties || []).length === 0 &&
-            (dmetadata?.properties || []).length === 0) ||
-          (type === 'product' && (dmetadata?.properties || []).length === 0)
-        ) {
+      const flag =
+        (type === 'device' &&
+          (metadata?.properties || []).length === 0 &&
+          (dmetadata?.properties || []).length === 0) ||
+        (type === 'product' && (dmetadata?.properties || []).length === 0);
+      if (!product.accessId && flag) {
+        if (!permission.update) {
+          return (
+            <Empty
+              description={<span>请联系管理员配置物模型属性,并选择对应产品的设备接入方式</span>}
+            />
+          );
+        } else {
           return (
             <Empty
               description={
@@ -84,11 +75,58 @@ const MetadataMap = (props: Props) => {
                   >
                     物模型属性
                   </a>
+                  ,并选择对应产品的
+                  <a
+                    onClick={() => {
+                      checkUrl('access');
+                    }}
+                  >
+                    设备接入方式
+                  </a>
                 </span>
               }
             />
           );
         }
+      } else if (flag && product.accessId) {
+        return (
+          <Empty
+            description={
+              !permission.update ? (
+                <span>请联系管理员配置物模型属性</span>
+              ) : (
+                <span>
+                  请配置对应产品的
+                  <a
+                    onClick={() => {
+                      checkUrl('metadata');
+                    }}
+                  >
+                    物模型属性
+                  </a>
+                </span>
+              )
+            }
+          />
+        );
+      } else if (!flag && !product.accessId) {
+        return (
+          <Empty
+            description={
+              <span>
+                请选择对应产品的
+                <a
+                  onClick={() => {
+                    checkUrl('access');
+                  }}
+                >
+                  设备接入方式
+                </a>
+              </span>
+            }
+          />
+        );
+      } else {
         return <EditableTable data={data} type={type} />;
       }
     }

+ 3 - 14
src/pages/device/Instance/Detail/Reation/index.tsx

@@ -1,7 +1,7 @@
 import { Descriptions, Tooltip } from 'antd';
 import { InstanceModel, service } from '@/pages/device/Instance';
 import { useEffect, useState } from 'react';
-import { history, useParams } from 'umi';
+import { useParams } from 'umi';
 import { EditOutlined, QuestionCircleOutlined } from '@ant-design/icons';
 import Edit from './Edit';
 import { PermissionButton } from '@/components';
@@ -9,17 +9,6 @@ import _ from 'lodash';
 
 const Reation = () => {
   const params = useParams<{ id: string }>();
-  useEffect(() => {
-    const id = InstanceModel.current?.id || params.id;
-    if (id) {
-      service.getConfigMetadata(id).then((response) => {
-        InstanceModel.config = response?.result;
-      });
-    } else {
-      history.goBack();
-    }
-  }, []);
-
   const [data, setData] = useState<any[]>([]);
   const [visible, setVisible] = useState<boolean>(false);
   const { permission } = PermissionButton.usePermission('device/Instance');
@@ -38,7 +27,7 @@ const Reation = () => {
     if (id) {
       setData(InstanceModel.detail?.relations || []);
     }
-  }, [id]);
+  }, [InstanceModel.detail?.relations]);
 
   return (
     <div style={{ width: '100%', marginTop: '20px' }}>
@@ -68,7 +57,7 @@ const Reation = () => {
       >
         {(data || [])?.map((item: any) => (
           <Descriptions.Item span={1} label={item.relationName} key={item.objectId}>
-            {_.map(item?.related || [], 'name').join(',')}
+            {item?.related ? _.map(item?.related || [], 'name').join(',') : '--'}
           </Descriptions.Item>
         ))}
       </Descriptions>

+ 32 - 25
src/pages/link/Protocol/save/index.tsx

@@ -1,4 +1,4 @@
-import { Button, message } from 'antd';
+import { Button, message, Modal } from 'antd';
 import { createForm, registerValidateRules } from '@formily/core';
 import { createSchemaField } from '@formily/react';
 import React, { useEffect, useState } from 'react';
@@ -6,9 +6,9 @@ import * as ICONS from '@ant-design/icons';
 import { Form, FormGrid, FormItem, Input, Select } from '@formily/antd';
 import type { ISchema } from '@formily/json-schema';
 import { service } from '@/pages/link/Protocol';
-import { Modal } from '@/components';
 import FileUpload from '../FileUpload';
 import type { ProtocolItem } from '@/pages/link/Protocol/typings';
+import { PermissionButton } from '@/components';
 
 interface Props {
   data: ProtocolItem | undefined;
@@ -18,6 +18,7 @@ interface Props {
 
 const Save = (props: Props) => {
   const [data, setData] = useState<ProtocolItem | undefined>(props.data);
+  const { permission } = PermissionButton.usePermission('link/Protocol');
 
   useEffect(() => {
     setData(props.data);
@@ -223,29 +224,35 @@ const Save = (props: Props) => {
       visible
       onCancel={props.close}
       width={700}
-      permissionCode={'link/Protocol'}
-      permission={['add', 'edit']}
-      footer={
-        <>
-          <Button onClick={props.close}>取消</Button>
-          <Button
-            type="primary"
-            onClick={() => {
-              save(false);
-            }}
-          >
-            保存
-          </Button>
-          <Button
-            type="primary"
-            onClick={() => {
-              save(true);
-            }}
-          >
-            保存并发布
-          </Button>
-        </>
-      }
+      footer={[
+        <Button key={1} onClick={props.close}>
+          取消
+        </Button>,
+        <Button
+          type="primary"
+          key={2}
+          onClick={() => {
+            save(false);
+          }}
+          disabled={props.data?.id ? !permission.update : !permission.add}
+        >
+          保存
+        </Button>,
+        <Button
+          key={3}
+          type="primary"
+          onClick={() => {
+            save(true);
+          }}
+          disabled={
+            props.data?.id
+              ? !permission.update && !permission.action
+              : !permission.add && !permission.action
+          }
+        >
+          保存并发布
+        </Button>,
+      ]}
     >
       <Form form={form} layout="vertical">
         <SchemaField schema={schema} />

+ 27 - 23
src/pages/system/Relationship/Save/index.tsx

@@ -41,7 +41,21 @@ const Save = (props: Props) => {
 
   const form = createForm({
     validateFirst: true,
-    initialValues: props.data,
+    initialValues: {
+      ...props.data,
+      object: props.data?.objectType
+        ? JSON.stringify({
+            objectType: props.data.objectType,
+            objectTypeName: props.data.objectTypeName,
+          })
+        : undefined,
+      target: props.data?.targetType
+        ? JSON.stringify({
+            targetType: props.data.targetType,
+            targetTypeName: props.data.targetTypeName,
+          })
+        : undefined,
+    },
   });
 
   const SchemaField = createSchemaField({
@@ -114,28 +128,6 @@ const Save = (props: Props) => {
                 required: true,
                 message: '请输入标识',
               },
-              // {
-              //   triggerType: 'onBlur',
-              //   // validator: (value: string) => {
-              //   //   return new Promise((resolve) => {
-              //   //     service
-              //   //       .validateField('username', value)
-              //   //       .then((resp) => {
-              //   //         if (resp.status === 200) {
-              //   //           if (resp.result.passed) {
-              //   //             resolve('');
-              //   //           } else {
-              //   //             resolve(model === 'edit' ? '' : resp.result.reason);
-              //   //           }
-              //   //         }
-              //   //         resolve('');
-              //   //       })
-              //   //       .catch(() => {
-              //   //         return '验证失败!';
-              //   //       });
-              //   //   });
-              //   // },
-              // },
             ],
             name: 'relation',
             required: true,
@@ -156,6 +148,12 @@ const Save = (props: Props) => {
                 option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
             },
             required: true,
+            'x-validator': [
+              {
+                required: true,
+                message: '请选择关联方',
+              },
+            ],
             'x-reactions': ['{{useAsyncDataSource(getTypes)}}'],
           },
           target: {
@@ -179,6 +177,12 @@ const Save = (props: Props) => {
                 },
               },
             },
+            'x-validator': [
+              {
+                required: true,
+                message: '请选择被关联方',
+              },
+            ],
             required: true,
           },
           description: {