wzyyy 3 лет назад
Родитель
Сommit
340afc68f0

+ 4 - 4
config/proxy.ts

@@ -12,11 +12,11 @@ export default {
       // target: 'http://192.168.32.28:8844/',
       // ws: 'ws://192.168.32.28:8844/',
       // 开发环境
-      target: 'http://120.79.18.123:8844/',
-      ws: 'ws://120.79.18.123:8844/',
+      // target: 'http://120.79.18.123:8844/',
+      // ws: 'ws://120.79.18.123:8844/',
       // 测试环境
-      // target: 'http://120.77.179.54:8844/',
-      // ws: 'ws://120.77.179.54:8844/',
+      target: 'http://120.77.179.54:8844/',
+      ws: 'ws://120.77.179.54:8844/',
       // target: 'http://192.168.66.5:8844/',
       // ws: 'ws://192.168.66.5:8844/',
       // ws: 'ws://demo.jetlinks.cn/jetlinks',

+ 1 - 2
src/app.tsx

@@ -314,6 +314,7 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => {
         ]
       : [],
     menuHeaderRender: undefined,
+    ...initialState?.settings,
     // 自定义 403 页面
     // unAccessible: <div>unAccessible</div>,
     pageTitleRender: (_props, _, info) => {
@@ -336,8 +337,6 @@ export const layout: RunTimeLayoutConfig = ({ initialState }) => {
         {initialState?.settings?.title}
       </div>
     ),
-    ...initialState?.settings,
-    // logo:''
   };
 };
 

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

@@ -9,11 +9,15 @@ import {
 } from '@formily/antd';
 import { createSchemaField, observer } from '@formily/react';
 import type { ISchema } from '@formily/json-schema';
-import { DataTypeList, DateTypeList } from '@/pages/device/data';
+import { DataTypeList, DateTypeList, FileTypeList } from '@/pages/device/data';
 import { Store } from 'jetlinks-store';
 import { useAsyncDataSource } from '@/utils/util';
 import { service } from '@/pages/device/components/Metadata';
 import MetadataModel from '@/pages/device/components/Metadata/Base/model';
+import BooleanEnum from '@/components/Metadata/BooleanParam';
+import EnumParam from '@/components/Metadata/EnumParam';
+import ArrayParam from '@/components/Metadata/ArrayParam';
+import { useIntl } from '@/.umi/plugin-locale/localeExports';
 
 // 不算是自定义组件。只是抽离了JSONSchema
 interface Props {
@@ -21,6 +25,7 @@ interface Props {
 }
 
 const JsonParam = observer((props: Props) => {
+  const intl = useIntl();
   const SchemaField = createSchemaField({
     components: {
       FormItem,
@@ -31,6 +36,9 @@ const JsonParam = observer((props: Props) => {
       Editable,
       FormLayout,
       NumberPicker,
+      BooleanEnum,
+      EnumParam,
+      ArrayParam,
     },
   });
   const getUnit = () =>
@@ -113,6 +121,71 @@ const JsonParam = observer((props: Props) => {
                           ? DataTypeList.filter((item) => item.value !== 'file')
                           : DataTypeList,
                     },
+                    booleanConfig: {
+                      title: '布尔值',
+                      type: 'void',
+                      'x-decorator': 'FormItem',
+                      'x-component': 'BooleanEnum',
+                      'x-reactions': {
+                        dependencies: ['..valueType.type'],
+                        fulfill: {
+                          state: {
+                            visible: "{{['boolean'].includes($deps[0])}}",
+                          },
+                        },
+                      },
+                    },
+                    enumConfig: {
+                      title: intl.formatMessage({
+                        id: 'pages.device.productDetail.metadata.enum',
+                        defaultMessage: '枚举项',
+                      }),
+                      type: 'void',
+                      'x-decorator': 'FormItem',
+                      'x-component': 'EnumParam',
+                      'x-reactions': {
+                        dependencies: ['..valueType.type'],
+                        fulfill: {
+                          state: {
+                            visible: "{{['enum'].includes($deps[0])}}",
+                          },
+                        },
+                      },
+                    },
+                    elementType: {
+                      title: intl.formatMessage({
+                        id: 'pages.device.productDetail.metadata.elementConfiguration',
+                        defaultMessage: '元素配置',
+                      }),
+                      'x-decorator': 'FormItem',
+                      'x-component': 'ArrayParam',
+                      'x-reactions': {
+                        dependencies: ['..valueType.type'],
+                        fulfill: {
+                          state: {
+                            visible: "{{['array'].includes($deps[0])}}",
+                          },
+                        },
+                      },
+                    },
+                    fileType: {
+                      title: intl.formatMessage({
+                        id: 'pages.device.productDetail.metadata.fileType',
+                        defaultMessage: '文件类型',
+                      }),
+                      'x-decorator': 'FormItem',
+                      'x-component': 'Select',
+                      'x-visible': false,
+                      enum: FileTypeList,
+                      'x-reactions': {
+                        dependencies: ['..valueType.type'],
+                        fulfill: {
+                          state: {
+                            visible: "{{['file'].includes($deps[0])}}",
+                          },
+                        },
+                      },
+                    },
                     unit: {
                       title: '单位',
                       'x-decorator': 'FormItem',
@@ -160,11 +233,17 @@ const JsonParam = observer((props: Props) => {
                           title: '最大长度',
                           'x-decorator': 'FormItem',
                           'x-component': 'NumberPicker',
+                          'x-decorator-props': {
+                            tooltip: intl.formatMessage({
+                              id: 'pages.device.productDetail.metadata.maxLength.byte',
+                              defaultMessage: '字节',
+                            }),
+                          },
                           'x-reactions': {
                             dependencies: ['..type'],
                             fulfill: {
                               state: {
-                                visible: "{{['string'].includes($deps[0])}}",
+                                visible: "{{['string','password'].includes($deps[0])}}",
                               },
                             },
                           },

+ 11 - 2
src/pages/Log/System/index.tsx

@@ -5,13 +5,14 @@ import ProTable from '@jetlinks/pro-table';
 import type { SystemLogItem } from '@/pages/Log/System/typings';
 import { Tag, Tooltip } from 'antd';
 import moment from 'moment';
-import BaseService from '@/utils/BaseService';
+// import BaseService from '@/utils/BaseService';
+import Service from '../service';
 import { EyeOutlined } from '@ant-design/icons';
 import SearchComponent from '@/components/SearchComponent';
 import Detail from '@/pages/Log/System/Detail';
 import { useDomFullHeight } from '@/hooks';
 
-const service = new BaseService<SystemLogItem>('logger/system');
+const service = new Service('logger/system');
 const System = () => {
   const intl = useIntl();
   const actionRef = useRef<ActionType>();
@@ -71,7 +72,15 @@ const System = () => {
       dataIndex: 'context.server',
       width: 150,
       ellipsis: true,
+      valueType: 'select',
       render: (text, record) => record?.context?.server || '',
+      request: async () => {
+        const res = await service.getServer();
+        if (res.status === 200) {
+          return res.result.map((item: any) => ({ label: item.name, value: item.id }));
+        }
+        return [];
+      },
     },
     {
       title: intl.formatMessage({

+ 12 - 0
src/pages/Log/service.ts

@@ -0,0 +1,12 @@
+import { request } from 'umi';
+import BaseService from '@/utils/BaseService';
+import SystemConst from '@/utils/const';
+
+class Service extends BaseService<any> {
+  public getServer = () =>
+    request(`/${SystemConst.API_BASE}/network/resources/clusters`, {
+      method: 'GET',
+    });
+}
+
+export default Service;

+ 3 - 3
src/pages/Northbound/DuerOS/index.tsx

@@ -141,16 +141,16 @@ export default () => {
     {
       title: intl.formatMessage({
         id: 'page.cloud.duerOS.productName',
-        defaultMessage: '产品',
+        defaultMessage: '产品名称',
       }),
       dataIndex: 'productName',
-      hideInSearch: true,
+      // hideInSearch: true,
       ellipsis: true,
       valueType: 'select',
       request: async () => {
         const res = await service.getProduct();
         if (res.status === 200) {
-          return res.result.map((pItem: any) => ({ label: pItem.name, value: pItem.id }));
+          return res.result.map((pItem: any) => ({ label: pItem.name, value: pItem.name }));
         }
         return [];
       },

+ 2 - 6
src/pages/device/Category/index.tsx

@@ -70,13 +70,9 @@ const Category = observer(() => {
     {
       title: '分类排序',
       dataIndex: 'sortIndex',
-      // valueType: 'digit',
+      valueType: 'digit',
       sorter: true,
-      // render: (text) => (
-      //   <Space>{text}<EditOutlined onClick={() => {
-
-      //   }} /></Space>
-      // )
+      render: (_, record) => <>{record.sortIndex}</>,
     },
     {
       title: intl.formatMessage({

+ 8 - 6
src/pages/home/index.tsx

@@ -24,7 +24,7 @@ const Home = () => {
 
   const adminView = () => {
     service
-      .setView({
+      .setViews({
         name: 'view',
         content: 'comprehensive',
       })
@@ -38,6 +38,7 @@ const Home = () => {
   useEffect(() => {
     service.userDetail().then((res) => {
       if (res.status === 200) {
+        //三方用户
         service
           .apiDetail({
             terms: [
@@ -50,17 +51,18 @@ const Home = () => {
           .then((response) => {
             if (response.status === 200) {
               setDetail(response.result?.data);
-              service.queryView().then((resp) => {
+              service.queryViews().then((resp) => {
                 setLoading(false);
                 if (resp.status === 200) {
-                  if (resp.result.length == 0) {
-                    if (response.result.username === 'admin') {
+                  if (resp.result) {
+                    setCurrent(resp.result?.content);
+                  } else {
+                    if (res.result.username === 'admin') {
+                      setCurrent('comprehensive');
                       adminView();
                     } else {
                       setCurrent('init');
                     }
-                  } else {
-                    setCurrent(resp.result[0]?.content);
                   }
                 }
               });

+ 3 - 3
src/pages/home/init/accountInit.tsx

@@ -26,9 +26,9 @@ const AccountInit = () => {
     },
   ];
   useEffect(() => {
-    service.queryView().then((res) => {
+    service.queryViews().then((res) => {
       if (res.status === 200) {
-        setValue(res.result[0]?.content);
+        setValue(res.result?.content);
       }
     });
   }, []);
@@ -56,7 +56,7 @@ const AccountInit = () => {
           type="primary"
           onClick={() => {
             service
-              .setView({
+              .setViews({
                 name: 'view',
                 content: value,
               })

+ 9 - 1
src/pages/home/service.ts

@@ -6,12 +6,20 @@ class Service {
     request(`/${SystemConst.API_BASE}/user/settings/view`, {
       method: 'GET',
     });
-
+  public queryViews = () =>
+    request(`/${SystemConst.API_BASE}/user/settings/view/user`, {
+      method: 'GET',
+    });
   public setView = (data: Record<string, any>) =>
     request(`/${SystemConst.API_BASE}/user/settings/view`, {
       method: 'POST',
       data,
     });
+  public setViews = (data: Record<string, any>) =>
+    request(`/${SystemConst.API_BASE}/user/settings/view/user`, {
+      method: 'PATCH',
+      data,
+    });
   // 设备数量
   deviceCount = (data?: any) =>
     request(`/${SystemConst.API_BASE}/device/instance/_count`, { methods: 'GET', params: data });

+ 35 - 34
src/pages/link/Channel/Modbus/index.tsx

@@ -94,22 +94,29 @@ const NewModbus = () => {
     },
     {
       title: '功能码',
-      render: (record: any) => <>{record.function?.text}</>,
+      valueType: 'select',
+      dataIndex: 'function',
+      valueEnum: {
+        Coils: { text: '线圈寄存器', status: 'Coils' },
+        HoldingRegisters: { text: '保存寄存器', status: 'HoldingRegisters' },
+        InputRegisters: { text: '输入寄存器', status: 'InputRegisters' },
+      },
+      render: (_, record: any) => <>{record.function?.text}</>,
     },
     {
       title: '从站ID',
+      valueType: 'digit',
       dataIndex: 'unitId',
-      search: false,
     },
     {
       title: '寄存器数量',
       search: false,
-      render: (record: any) => <>{record.parameter?.quantity}</>,
+      render: (_, record: any) => <>{record.parameter?.quantity}</>,
     },
     {
       title: '地址',
       dataIndex: 'address',
-      search: false,
+      valueType: 'digit',
     },
     {
       title: '当前数据',
@@ -142,29 +149,29 @@ const NewModbus = () => {
     },
     {
       title: '采集状态',
-      search: false,
-      render: (record: any) => (
+      dataIndex: 'collectState',
+      valueType: 'select',
+      valueEnum: {
+        running: { text: '采集中', status: 'running' },
+        error: { text: '失败', status: 'error' },
+        stopped: { text: '已停止', status: 'stopped' },
+      },
+      render: (_, record: any) => (
         <>
-          {record.state.value === 'disabled' ? (
-            ''
-          ) : (
-            <>
-              <Badge
-                status={collectMap.get(record.collectState?.value)}
-                text={record.collectState?.text}
-              />
-              {record.collectState?.value === 'error' && (
-                <SearchOutlined
-                  style={{ color: '#1d39c4', marginLeft: 3 }}
-                  onClick={() => {
-                    Modal.error({
-                      title: '失败原因',
-                      content: <div>{record.errorReason}</div>,
-                    });
-                  }}
-                />
-              )}
-            </>
+          <Badge
+            status={collectMap.get(record.collectState?.value)}
+            text={record.collectState?.text}
+          />
+          {record.collectState?.value === 'error' && (
+            <SearchOutlined
+              style={{ color: '#1d39c4', marginLeft: 3 }}
+              onClick={() => {
+                Modal.error({
+                  title: '失败原因',
+                  content: <div>{record.errorReason}</div>,
+                });
+              }}
+            />
           )}
         </>
       ),
@@ -229,15 +236,9 @@ const NewModbus = () => {
             }),
             onConfirm: async () => {
               if (record.state.value === 'disabled') {
-                await service.editPoint(record.id, {
-                  ...record,
-                  state: 'enabled',
-                });
+                await service.enablePoint([record.id]);
               } else {
-                await service.editPoint(record.id, {
-                  ...record,
-                  state: 'disabled',
-                });
+                await service.disablePoint([record.id]);
               }
               onlyMessage(
                 intl.formatMessage({

+ 10 - 0
src/pages/link/Channel/Modbus/service.ts

@@ -37,6 +37,16 @@ class Service extends BaseService<any> {
       method: 'PUT',
       data,
     });
+  enablePoint = (data: any) =>
+    request(`/${SystemConst.API_BASE}/modbus/point/_enable`, {
+      method: 'POST',
+      data,
+    });
+  disablePoint = (data: any) =>
+    request(`/${SystemConst.API_BASE}/modbus/point/_disable`, {
+      method: 'POST',
+      data,
+    });
   deletePoint = (id: string) =>
     request(`/${SystemConst.API_BASE}/modbus/point/${id}`, {
       method: 'DELETE',

+ 120 - 11
src/pages/rule-engine/Alarm/Log/TabComponent/index.tsx

@@ -70,6 +70,57 @@ const TabComponent = observer((props: Props) => {
       },
     },
   ];
+  const productCol: ProColumns<any>[] = [
+    ...columns,
+    {
+      title: '产品名称',
+      dataIndex: 'targetName',
+      width: 200,
+      ellipsis: true,
+      valueType: 'select',
+      request: async () => {
+        const res = await service.getProductList();
+        if (res.status === 200) {
+          return res.result.map((item: any) => ({ label: item.name, value: item.name }));
+        }
+        return [];
+      },
+    },
+  ];
+  const deviceCol: ProColumns<any>[] = [
+    ...columns,
+    {
+      title: '设备名称',
+      dataIndex: 'targetName',
+      width: 200,
+      ellipsis: true,
+      valueType: 'select',
+      request: async () => {
+        const res = await service.getDeviceList();
+        if (res.status === 200) {
+          return res.result.map((item: any) => ({ label: item.name, value: item.name }));
+        }
+        return [];
+      },
+    },
+  ];
+  const orgCol: ProColumns<any>[] = [
+    ...columns,
+    {
+      title: '部门名称',
+      dataIndex: 'targetName',
+      width: 200,
+      ellipsis: true,
+      valueType: 'select',
+      request: async () => {
+        const res = await service.getOrgList();
+        if (res.status === 200) {
+          return res.result.map((item: any) => ({ label: item.name, value: item.name }));
+        }
+        return [];
+      },
+    },
+  ];
 
   const [param, setParam] = useState<any>({ pageSize: 10, terms: [] });
   const history = useHistory<Record<string, string>>();
@@ -107,6 +158,9 @@ const TabComponent = observer((props: Props) => {
 
   useEffect(() => {
     handleSearch(param);
+    if (props.type === 'prodcut') {
+    }
+    console.log(props.type);
   }, [props.type]);
 
   const tools = (record: any) => [
@@ -182,17 +236,72 @@ const TabComponent = observer((props: Props) => {
 
   return (
     <div className="alarm-log-card">
-      <SearchComponent<any>
-        field={columns}
-        target="alarm-log"
-        onSearch={(data) => {
-          const dt = {
-            pageSize: 10,
-            terms: [...data?.terms],
-          };
-          handleSearch(dt);
-        }}
-      />
+      {props.type === 'all' && (
+        <SearchComponent<any>
+          field={columns}
+          target="alarm-log"
+          onSearch={(data) => {
+            const dt = {
+              pageSize: 10,
+              terms: [...data?.terms],
+            };
+            handleSearch(dt);
+          }}
+        />
+      )}
+      {props.type === 'product' && (
+        <SearchComponent<any>
+          field={productCol}
+          target="alarm-log"
+          onSearch={(data) => {
+            const dt = {
+              pageSize: 10,
+              terms: [...data?.terms],
+            };
+            handleSearch(dt);
+          }}
+        />
+      )}
+      {props.type === 'device' && (
+        <SearchComponent<any>
+          field={deviceCol}
+          target="alarm-log"
+          onSearch={(data) => {
+            const dt = {
+              pageSize: 10,
+              terms: [...data?.terms],
+            };
+            handleSearch(dt);
+          }}
+        />
+      )}
+      {props.type === 'org' && (
+        <SearchComponent<any>
+          field={orgCol}
+          target="alarm-log"
+          onSearch={(data) => {
+            const dt = {
+              pageSize: 10,
+              terms: [...data?.terms],
+            };
+            handleSearch(dt);
+          }}
+        />
+      )}
+      {props.type === 'other' && (
+        <SearchComponent<any>
+          field={productCol}
+          target="alarm-log"
+          onSearch={(data) => {
+            const dt = {
+              pageSize: 10,
+              terms: [...data?.terms],
+            };
+            handleSearch(dt);
+          }}
+        />
+      )}
+
       <Card>
         <div className="alarmLog" style={{ minHeight, position: 'relative' }}>
           <div style={{ height: '100%', paddingBottom: 48 }}>

+ 6 - 6
src/pages/rule-engine/Alarm/Log/model.ts

@@ -19,19 +19,19 @@ export const AlarmLogModel = model<{
   defaultLevel: [],
   columns: [
     {
+      dataIndex: 'alarmConfigName',
+      title: '告警名称',
+      // hideInSearch: true,
+    },
+    {
       dataIndex: 'alarmTime',
       title: '告警时间',
       valueType: 'dateTime',
     },
     {
-      dataIndex: 'alarmConfigName',
-      title: '告警名称',
-      hideInSearch: true,
-    },
-    {
       dataIndex: 'description',
       title: '说明',
-      hideInSearch: true,
+      // hideInSearch: true,
     },
     {
       dataIndex: 'action',

+ 15 - 0
src/pages/rule-engine/Alarm/Log/service.ts

@@ -30,6 +30,21 @@ class Service extends BaseService<AlarmLogItem> {
       method: 'POST',
       data,
     });
+  getProductList = (params?: any) =>
+    request(`/${SystemConst.API_BASE}/device/product/_query/no-paging?paging=false`, {
+      method: 'GET',
+      params,
+    });
+  getDeviceList = (params?: any) =>
+    request(`/${SystemConst.API_BASE}/device-instance/_query/no-paging?paging=false`, {
+      method: 'GET',
+      params,
+    });
+  getOrgList = (params?: any) =>
+    request(`/${SystemConst.API_BASE}/organization/_query/no-paging?paging=false`, {
+      method: 'GET',
+      params,
+    });
 }
 
 export default Service;