Sfoglia il codice sorgente

fix: 修改数据采集

100011797 3 anni fa
parent
commit
282ce20211

+ 2 - 1
src/components/ProTableCard/CardItems/DataCollect/channel.tsx

@@ -30,7 +30,8 @@ export default (props: ChannelCardProps) => {
       showMask={false}
       statusNames={{
         enabled: StatusColorEnum.success,
-        disabled: StatusColorEnum.error,
+        disabled: StatusColorEnum.default,
+        error: StatusColorEnum.error,
       }}
     >
       <div className={'pro-table-card-item'}>

+ 2 - 2
src/pages/device/Instance/Detail/Diagnose/Status/DiagnosticAdvice.tsx

@@ -53,7 +53,7 @@ const DiagnosticAdvice = (props: Props) => {
                 title={
                   <div className="serverItem">
                     {(data?.info?.address || []).map((i: any) => (
-                      <div key={i.address} className="eellipsiss">
+                      <div key={i.address} className="ellipsis">
                         <Badge color={i.health === -1 ? 'red' : 'green'} />
                         {i.address}
                       </div>
@@ -63,7 +63,7 @@ const DiagnosticAdvice = (props: Props) => {
               >
                 <div className="serverItem">
                   {(data?.info?.address || []).slice(0, 1).map((i: any) => (
-                    <div key={i.address} className="eellipsiss">
+                    <div key={i.address} className="ellipsis">
                       <Badge color={i.health === -1 ? 'red' : 'green'} />
                       {i.address}
                     </div>

+ 1 - 1
src/pages/device/Instance/Save/index.tsx

@@ -16,7 +16,7 @@ interface Props {
   data?: Partial<DeviceInstance>;
 }
 
-const defaultImage = '/images/device-product.png';
+const defaultImage = '/images/device-type-3-big.png';
 
 const Save = (props: Props) => {
   const { visible, close, data } = props;

+ 2 - 2
src/pages/device/Product/Detail/Access/index.tsx

@@ -283,7 +283,7 @@ const Access = () => {
     const driver = new Driver({
       allowClose: false,
       doneBtnText: '我知道了',
-      closeBtnText: '不提示',
+      closeBtnText: '不提示',
       nextBtnText: '下一步',
       prevBtnText: '上一步',
       onNext: () => {
@@ -305,7 +305,7 @@ const Access = () => {
     const driver1 = new Driver({
       allowClose: false,
       doneBtnText: '我知道了',
-      closeBtnText: '不提示',
+      closeBtnText: '不提示',
       nextBtnText: '下一步',
       prevBtnText: '上一步',
       onNext: () => {

+ 16 - 1
src/pages/link/DataCollect/DataGathering/index.tsx

@@ -13,20 +13,34 @@ const DataCollectModel = model<{
   type: 'channel' | 'device';
   provider: 'OPC_UA' | 'MODBUS_TCP';
   data: any;
+  reload: boolean;
 }>({
   type: 'channel',
   id: '',
   provider: 'MODBUS_TCP',
   data: {},
+  reload: false,
 });
 
 export default observer(() => {
+  const onReload = () => {
+    DataCollectModel.reload = !DataCollectModel.reload;
+  };
+
   const obj = {
-    channel: <Device type={false} id={DataCollectModel.id} provider={DataCollectModel.provider} />,
+    channel: (
+      <Device
+        reload={onReload}
+        type={false}
+        id={DataCollectModel.id}
+        provider={DataCollectModel.provider}
+      />
+    ),
     device: (
       <Point type={false} provider={DataCollectModel.provider} data={DataCollectModel.data} />
     ),
   };
+
   return (
     <PageContainer>
       <Card bordered={false}>
@@ -39,6 +53,7 @@ export default observer(() => {
                 DataCollectModel.provider = provider;
                 DataCollectModel.data = data || {};
               }}
+              reload={DataCollectModel.reload}
             />
           </div>
           {DataCollectModel?.id ? (

+ 51 - 13
src/pages/link/DataCollect/components/Channel/index.tsx

@@ -29,7 +29,7 @@ export default observer((props: Props) => {
   const intl = useIntl();
   const { minHeight } = useDomFullHeight(`.data-collect-channel`, 24);
   const [param, setParam] = useState({ pageSize: 12, terms: [] });
-  const { permission } = PermissionButton.usePermission('device/Instance');
+  const { permission } = PermissionButton.usePermission('link/DataCollect/DataGathering');
   const [loading, setLoading] = useState<boolean>(true);
   const [dataSource, setDataSource] = useState<any>({
     data: [],
@@ -38,6 +38,12 @@ export default observer((props: Props) => {
     total: 0,
   });
 
+  const test = (value: string) => {
+    // (value) => ({ name$LIKE: value })
+    console.log(value);
+    return { runningState: value };
+  };
+
   const columns: ProColumns<ChannelItem>[] = [
     {
       title: '名称',
@@ -60,18 +66,25 @@ export default observer((props: Props) => {
     },
     {
       title: '状态',
-      dataIndex: 'state',
+      dataIndex: 'runningState',
       valueType: 'select',
       valueEnum: {
         enabled: {
           text: '正常',
-          status: 'enabled',
+          status: 'running',
         },
         disabled: {
+          text: '禁用',
+          status: 'stopped',
+        },
+        error: {
           text: '异常',
-          status: 'disabled',
+          status: 'error',
         },
       },
+      search: {
+        transform: test,
+      },
     },
     {
       title: '说明',
@@ -96,6 +109,30 @@ export default observer((props: Props) => {
     handleSearch(param);
   }, []);
 
+  const getState = (record: Partial<ChannelItem>) => {
+    if (record) {
+      if (record?.state?.value === 'enabled') {
+        if (record?.runningState?.value === 'running') {
+          return {
+            text: '正常',
+            value: 'enabled',
+          };
+        } else {
+          return {
+            text: '异常',
+            value: 'error',
+          };
+        }
+      } else {
+        return {
+          text: '禁用',
+          value: 'disabled',
+        };
+      }
+    } else {
+      return {};
+    }
+  };
   return (
     <div>
       <SearchComponent<ChannelItem>
@@ -103,7 +140,7 @@ export default observer((props: Props) => {
         target="data-collect-channel"
         onSearch={(data) => {
           const dt = {
-            pageSize: 10,
+            pageSize: 12,
             terms: [...data?.terms],
           };
           handleSearch(dt);
@@ -119,6 +156,7 @@ export default observer((props: Props) => {
                     <Col key={record.id} span={props.type ? 8 : 12}>
                       <ChannelCard
                         {...record}
+                        status={getState(record)}
                         actions={[
                           <PermissionButton
                             type={'link'}
@@ -140,14 +178,14 @@ export default observer((props: Props) => {
                             isPermission={permission.delete}
                             type={'link'}
                             style={{ padding: 0 }}
-                            disabled={record?.state?.value !== 'disabled'}
-                            tooltip={
-                              record?.state?.value !== 'disabled'
-                                ? {
-                                    title: '正常的通道不能删除',
-                                  }
-                                : undefined
-                            }
+                            // disabled={record?.state?.value !== 'disabled'}
+                            // tooltip={
+                            //   record?.state?.value !== 'disabled'
+                            //     ? {
+                            //         title: '正常的通道不能删除',
+                            //       }
+                            //     : undefined
+                            // }
                             popConfirm={{
                               title: intl.formatMessage({
                                 id: 'pages.data.option.remove.tips',

+ 7 - 3
src/pages/link/DataCollect/components/Device/index.tsx

@@ -17,6 +17,7 @@ interface Props {
   type: boolean; // true: 综合查询  false: 数据采集
   id?: any;
   provider?: 'OPC_UA' | 'MODBUS_TCP';
+  reload?: () => void;
 }
 
 const CollectorModel = model<{
@@ -32,7 +33,7 @@ export default observer((props: Props) => {
   const [param, setParam] = useState({ pageSize: 12, terms: [] });
   const [loading, setLoading] = useState<boolean>(true);
   const intl = useIntl();
-  const { permission } = PermissionButton.usePermission('device/Instance');
+  const { permission } = PermissionButton.usePermission('link/DataCollect/DataGathering');
   const [dataSource, setDataSource] = useState<any>({
     data: [],
     pageSize: 12,
@@ -109,7 +110,7 @@ export default observer((props: Props) => {
         target="data-collect-collector"
         onSearch={(data) => {
           const dt = {
-            pageSize: 10,
+            pageSize: 12,
             terms: [...data?.terms],
           };
           handleSearch(dt);
@@ -206,7 +207,7 @@ export default observer((props: Props) => {
                             tooltip={
                               record?.state?.value !== 'disabled'
                                 ? {
-                                    title: '正常的采集器不能删除',
+                                    title: '已启用的采集器不能删除',
                                   }
                                 : undefined
                             }
@@ -292,6 +293,9 @@ export default observer((props: Props) => {
           reload={() => {
             CollectorModel.visible = false;
             handleSearch(param);
+            if (props?.reload) {
+              props.reload();
+            }
           }}
         />
       )}

+ 2 - 2
src/pages/link/DataCollect/components/Point/CollectorCard/index.less

@@ -55,8 +55,8 @@
         flex-direction: row-reverse;
         align-items: flex-start;
         justify-content: space-around;
-        min-width: calc(50% - 40px);
-        max-width: calc(50% - 20px);
+        //min-width: calc(50% - 40px);
+        width: calc(50% - 20px);
 
         .card-item-content-item-empty {
           margin-top: 10px;

+ 21 - 16
src/pages/link/DataCollect/components/Point/CollectorCard/index.tsx

@@ -1,14 +1,8 @@
 import { useState } from 'react';
-import { Ellipsis } from '@/components';
+import { Ellipsis, PermissionButton } from '@/components';
 import './index.less';
-import { Badge, Popconfirm, Spin } from 'antd';
-import {
-  DeleteOutlined,
-  EditOutlined,
-  FormOutlined,
-  MinusOutlined,
-  RedoOutlined,
-} from '@ant-design/icons';
+import { Badge, Popconfirm, Spin, Tooltip } from 'antd';
+import { DeleteOutlined, EditOutlined, FormOutlined, RedoOutlined } from '@ant-design/icons';
 import OpcSave from '../Save/opc-ua';
 import ModbusSave from '../Save/modbus';
 import service from '@/pages/link/DataCollect/service';
@@ -30,6 +24,7 @@ export default (props: PointCardProps) => {
   const [editVisible, setEditVisible] = useState<boolean>(false);
   const [spinning, setSpinning] = useState<boolean>(false);
   const [writeVisible, setWriteVisible] = useState<boolean>(false);
+  const { permission } = PermissionButton.usePermission('link/DataCollect/DataGathering');
 
   const read = async () => {
     if (item?.collectorId && item?.id) {
@@ -61,6 +56,7 @@ export default (props: PointCardProps) => {
         close={() => {
           setEditVisible(false);
         }}
+        collector={{}}
         reload={() => {
           setEditVisible(false);
         }}
@@ -98,6 +94,7 @@ export default (props: PointCardProps) => {
               <div className={'card-item-right-action'}>
                 <Popconfirm
                   title={'确认删除'}
+                  disabled={!permission.delete}
                   onConfirm={async () => {
                     if (item.id) {
                       const resp = await service.removePoint(item.id);
@@ -108,13 +105,19 @@ export default (props: PointCardProps) => {
                     }
                   }}
                 >
-                  <DeleteOutlined style={{ marginRight: 10 }} />
+                  <Tooltip title={!permission.delete ? '暂无权限,请联系管理员' : ''}>
+                    <DeleteOutlined style={{ marginRight: 10 }} />
+                  </Tooltip>
                 </Popconfirm>
-                <FormOutlined
-                  onClick={() => {
-                    setEditVisible(true);
-                  }}
-                />
+                <Tooltip title={!permission.update ? '暂无权限,请联系管理员' : ''}>
+                  <FormOutlined
+                    onClick={() => {
+                      if (permission.update) {
+                        setEditVisible(true);
+                      }
+                    }}
+                  />
+                </Tooltip>
               </div>
             </div>
             <div className={'card-item-content'}>
@@ -154,7 +157,9 @@ export default (props: PointCardProps) => {
               ) : (
                 <div className={'card-item-content-item'}>
                   <div className={'card-item-content-item-empty'}>
-                    <MinusOutlined className={'action'} />
+                    <span className={'action'} style={{ fontWeight: 600, color: '#000' }}>
+                      --
+                    </span>
                     <EditOutlined
                       className={'action'}
                       style={{ margin: '0 15px' }}

+ 7 - 3
src/pages/link/DataCollect/components/Point/Save/modbus.tsx

@@ -23,6 +23,7 @@ interface Props {
   data: Partial<PointItem>;
   close: () => void;
   reload: () => void;
+  collector: Partial<CollectorItem>;
 }
 
 export default (props: Props) => {
@@ -136,7 +137,7 @@ export default (props: Props) => {
               placeholder: '请选择功能码',
             },
             enum: [
-              { label: '离散输入寄存器', value: 'DiscreteInputs' },
+              { label: '线圈寄存器', value: 'Coils' },
               { label: '保存寄存器', value: 'HoldingRegisters' },
               { label: '输入寄存器', value: 'InputRegisters' },
             ],
@@ -367,10 +368,13 @@ export default (props: Props) => {
 
   const save = async () => {
     const value = await form.submit<PointItem>();
-    console.log(value);
+    const obj = {
+      provider: props?.collector?.provider || 'MODBUS_TCP',
+      collectorId: props?.collector?.id,
+    };
     const response: any = props.data?.id
       ? await service.updatePoint(props.data?.id, { ...props.data, ...value })
-      : await service.savePoint({ ...props.data, ...value });
+      : await service.savePoint({ ...obj, ...props.data, ...value });
     if (response && response?.status === 200) {
       onlyMessage('操作成功');
       props.reload();

+ 18 - 18
src/pages/link/DataCollect/components/Point/Save/opc-ua.tsx

@@ -126,24 +126,24 @@ export default (props: Props) => {
               },
             ],
           },
-          'configuration.codec.provider': {
-            title: '数据类型',
-            'x-component': 'Select',
-            'x-decorator': 'FormItem',
-            'x-decorator-props': {
-              gridSpan: 2,
-            },
-            'x-component-props': {
-              placeholder: '请选择数据类型',
-            },
-            'x-reactions': '{{useAsyncDataSource(getCodecProvider)}}',
-            'x-validator': [
-              {
-                required: true,
-                message: '请选择数据类型',
-              },
-            ],
-          },
+          // 'configuration.codec.provider': {
+          //   title: '数据类型',
+          //   'x-component': 'Select',
+          //   'x-decorator': 'FormItem',
+          //   'x-decorator-props': {
+          //     gridSpan: 2,
+          //   },
+          //   'x-component-props': {
+          //     placeholder: '请选择数据类型',
+          //   },
+          //   'x-reactions': '{{useAsyncDataSource(getCodecProvider)}}',
+          //   'x-validator': [
+          //     {
+          //       required: true,
+          //       message: '请选择数据类型',
+          //     },
+          //   ],
+          // },
           accessModes: {
             title: '访问类型',
             type: 'array',

+ 8 - 5
src/pages/link/DataCollect/components/Point/index.tsx

@@ -34,7 +34,7 @@ export default observer((props: Props) => {
   const { minHeight } = useDomFullHeight(`.data-collect-point`, 24);
   const [param, setParam] = useState({ pageSize: 12, terms: [] });
   const [loading, setLoading] = useState<boolean>(true);
-  const { permission } = PermissionButton.usePermission('device/Instance');
+  const { permission } = PermissionButton.usePermission('link/DataCollect/DataGathering');
   const [propertyValue, setPropertyValue] = useState<any>({});
   const [dataSource, setDataSource] = useState<any>({
     data: [],
@@ -83,8 +83,10 @@ export default observer((props: Props) => {
   const subRef = useRef<any>(null);
 
   const subscribeProperty = (list: any) => {
-    const id = `collector-${props.data?.channelId}-${props.data?.id}-data-${list.join('-')}`;
-    const topic = `/collector/${props.data?.channelId}/${props.data?.id}/data`;
+    const id = `collector-${props.data?.channelId || 'channel'}-${
+      props.data?.id || 'point'
+    }-data-${list.join('-')}`;
+    const topic = `/collector/${props.data?.channelId || '*'}/${props.data?.id || '*'}/data`;
     subRef.current = subscribeTopic!(id, topic, {
       pointId: list.join(','),
     })
@@ -111,6 +113,7 @@ export default observer((props: Props) => {
       .then((resp) => {
         if (resp.status === 200) {
           setDataSource(resp.result);
+          console.log(resp.result);
           subscribeProperty((resp.result?.data || []).map((item: any) => item.id));
         }
         setLoading(false);
@@ -135,7 +138,7 @@ export default observer((props: Props) => {
         target="data-collect-point"
         onSearch={(data) => {
           const dt = {
-            pageSize: 10,
+            pageSize: 12,
             terms: [...data?.terms],
           };
           handleSearch(dt);
@@ -221,7 +224,7 @@ export default observer((props: Props) => {
       {PointModel.m_visible && (
         <ModbusSave
           data={PointModel.current}
-          // channelId={props.id}
+          collector={props?.data || {}}
           close={() => {
             PointModel.m_visible = false;
           }}

+ 18 - 10
src/pages/link/DataCollect/components/Tree/index.tsx

@@ -1,8 +1,8 @@
 import { DownOutlined, PlusOutlined, FormOutlined, DeleteOutlined } from '@ant-design/icons';
-import { Button, Input, Tree, Space, Popconfirm, Badge } from 'antd';
+import { Button, Input, Tree, Space, Popconfirm, Badge, Tooltip } from 'antd';
 import { observer } from '@formily/react';
 import { model } from '@formily/reactive';
-import { Empty } from '@/components';
+import { Empty, PermissionButton } from '@/components';
 import styles from './index.less';
 import service from '@/pages/link/DataCollect/service';
 import { useEffect } from 'react';
@@ -31,11 +31,13 @@ interface Props {
     provider: 'OPC_UA' | 'MODBUS_TCP',
     data?: any,
   ) => void;
+  reload?: boolean;
 }
 
 export default observer((props: Props) => {
   const channelImg = require('/public/images/DataCollect/tree-channel.png');
   const deviceImg = require('/public/images/DataCollect/tree-device.png');
+  const { permission } = PermissionButton.usePermission('link/DataCollect/DataGathering');
 
   const handleSearch = (params: any) => {
     TreeModel.loading = true;
@@ -56,7 +58,7 @@ export default observer((props: Props) => {
 
   useEffect(() => {
     handleSearch(TreeModel.param);
-  }, [TreeModel.param]);
+  }, [TreeModel.param, props.reload]);
 
   return (
     <div>
@@ -109,12 +111,16 @@ export default observer((props: Props) => {
                       </div>
                       <div>
                         <Space className={styles.iconColor}>
-                          <FormOutlined
-                            onClick={() => {
-                              TreeModel.current = item;
-                              TreeModel.visible = true;
-                            }}
-                          />
+                          <Tooltip title={!permission.edit ? '暂无权限,请联系管理员' : ''}>
+                            <FormOutlined
+                              onClick={() => {
+                                if (permission.edit) {
+                                  TreeModel.current = item;
+                                  TreeModel.visible = true;
+                                }
+                              }}
+                            />
+                          </Tooltip>
                           <Popconfirm
                             title={'确认删除?'}
                             onConfirm={async () => {
@@ -126,7 +132,9 @@ export default observer((props: Props) => {
                               }
                             }}
                           >
-                            <DeleteOutlined />
+                            <Tooltip title={!permission.delete ? '暂无权限,请联系管理员' : ''}>
+                              <DeleteOutlined />
+                            </Tooltip>
                           </Popconfirm>
                         </Space>
                       </div>

+ 84 - 2
src/pages/system/Menu/Setting/baseMenu.ts

@@ -1402,7 +1402,48 @@ export default [
                   'things-collector',
                 ],
                 permissions: [],
-                buttons: [],
+                buttons: [
+                  {
+                    id: 'add',
+                    name: '新增',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['save'],
+                      },
+                    ],
+                  },
+                  {
+                    id: 'update',
+                    name: '编辑',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['add', 'query'],
+                      },
+                    ],
+                  },
+                  {
+                    id: 'action',
+                    name: '禁用/启用',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['save', 'query'],
+                      },
+                    ],
+                  },
+                  {
+                    id: 'delete',
+                    name: '删除',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['delete'],
+                      },
+                    ],
+                  },
+                ],
               },
               {
                 code: 'link/DataCollect/IntegratedQuery',
@@ -1418,7 +1459,48 @@ export default [
                   'things-collector',
                 ],
                 permissions: [],
-                buttons: [],
+                buttons: [
+                  {
+                    id: 'add',
+                    name: '新增',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['save'],
+                      },
+                    ],
+                  },
+                  {
+                    id: 'update',
+                    name: '编辑',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['add', 'query'],
+                      },
+                    ],
+                  },
+                  {
+                    id: 'action',
+                    name: '禁用/启用',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['save', 'query'],
+                      },
+                    ],
+                  },
+                  {
+                    id: 'delete',
+                    name: '删除',
+                    permissions: [
+                      {
+                        permission: 'data-collect-channel',
+                        actions: ['delete'],
+                      },
+                    ],
+                  },
+                ],
               },
             ],
           },