Просмотр исходного кода

fix: bug#5889、6062、6100、5619、6052

xieyonghong 3 лет назад
Родитель
Сommit
a03421fb6e

+ 3 - 3
src/components/AMapComponent/hooks/Distance.tsx

@@ -4,9 +4,9 @@ const useDistance = () => {
   const [distance, setDistance] = useState(0);
 
   const onDistance = (data: number[][]) => {
-    if (window.AMap && data && data.length >= 2) {
-      const pointArr = data.map((point) => new window.AMap.LngLat(point[0], point[1]));
-      const distanceOfLine = AMap.GeometryUtil.distanceOfLine(pointArr);
+    if ((window as any).AMap && data && data.length >= 2) {
+      const pointArr = data.map((point) => new (window as any).AMap.LngLat(point[0], point[1]));
+      const distanceOfLine = (window as any).AMap.GeometryUtil.distanceOfLine(pointArr);
       setDistance(Math.round(distanceOfLine));
     }
   };

+ 1 - 1
src/components/ProTableCard/CardItems/duerOs.tsx

@@ -2,7 +2,7 @@ import React from 'react';
 import { Ellipsis, TableCard } from '@/components';
 import '@/style/common.less';
 import '../index.less';
-import { DuerOSItem } from '@/pages/cloud/DuerOS/typings';
+import { DuerOSItem } from '@/pages/Northbound/DuerOS/types';
 import { StatusColorEnum } from '@/components/BadgeStatus';
 
 export interface DuerOSProps extends DuerOSItem {

+ 1 - 0
src/hooks/websocket/useSendWebsocketMessage.ts

@@ -30,6 +30,7 @@ export const useSendWebsocketMessage = () => {
     if (data.type === 'error') {
       notification.error({ key: 'websocket-error', message: data.message });
     }
+
     if (subscribeList[data.requestId]) {
       if (data.type === 'complete') {
         subscribeList[data.requestId].forEach((element: any) => {

+ 16 - 8
src/hooks/websocket/useWebSocket.ts

@@ -46,7 +46,8 @@ export default function useWebSocket(socketUrl: string, options: Options = {}):
   const reconnectTimerRef = useRef<NodeJS.Timeout>(); // 计时器
   const websocketRef = useRef<WebSocket>();
   const lockReconnect = useRef(false); // 避免重复连接
-  const isReconnect = useRef(false);
+  const isReconnect = useRef(false); //
+  const readyStateRef = useRef<number>(ReadyState.Closed);
 
   const [latestMessage, setLatestMessage] = useState<WebSocketEventMap['message']>();
   const [readyState, setReadyState] = useState<ReadyState>(ReadyState.Closed);
@@ -55,6 +56,7 @@ export default function useWebSocket(socketUrl: string, options: Options = {}):
     const ws = Store.get(SystemConst.GLOBAL_WEBSOCKET) as WebSocket;
     if (ws) {
       setReadyState(ws?.readyState);
+      readyStateRef.current = ws?.readyState;
     } else {
       // if (reconnectTimerRef.current) clearTimeout(reconnectTimerRef.current);
 
@@ -73,16 +75,18 @@ export default function useWebSocket(socketUrl: string, options: Options = {}):
           reconnect();
           onError?.(event);
           setReadyState(websocketRef.current?.readyState || ReadyState.Closed);
+          readyStateRef.current = websocketRef.current?.readyState || ReadyState.Closed;
         };
         websocketRef.current.onopen = (event) => {
           if (isReconnect.current && onReconnect) {
             // 是否为重连
             onReconnect();
-            return
+            return;
           }
           onOpen?.(event);
           reconnectTimesRef.current = 0;
           setReadyState(websocketRef.current?.readyState || ReadyState.Closed);
+          readyStateRef.current = websocketRef.current?.readyState || ReadyState.Closed;
         };
         websocketRef.current.onmessage = (message: WebSocketEventMap['message']) => {
           onMessage?.(message);
@@ -94,6 +98,7 @@ export default function useWebSocket(socketUrl: string, options: Options = {}):
           reconnect();
           onClose?.(event);
           setReadyState(websocketRef.current?.readyState || ReadyState.Closed);
+          readyStateRef.current = websocketRef.current?.readyState || ReadyState.Closed;
           Store.set(SystemConst.GLOBAL_WEBSOCKET, null);
         };
         Store.set(SystemConst.GLOBAL_WEBSOCKET, websocketRef.current);
@@ -143,16 +148,19 @@ export default function useWebSocket(socketUrl: string, options: Options = {}):
   const sendMessage: WebSocket['send'] = usePersistFn((message) => {
     const ws = Store.get(SystemConst.GLOBAL_WEBSOCKET) as WebSocket;
     setReadyState(ws?.readyState);
-    if (readyState === ReadyState.Open) {
+    readyStateRef.current = ws?.readyState;
+
+    if (readyStateRef.current === ReadyState.Open) {
       ws.send(message);
     } else if (ws) {
+      isReconnect.current = true;
       connectWs();
       // todo 考虑重写
-      setTimeout(() => {
-        if (readyState === ReadyState.Open) {
-          ws.send(message);
-        }
-      }, 3000);
+      // setTimeout(() => {
+      //   if (readyStateRef.current === ReadyState.Open) {
+      //     ws.send(message);
+      //   }
+      // }, 3000);
       // throw new Error('WebSocket disconnected');
     }
   });

+ 5 - 0
src/pages/Northbound/DuerOS/types.d.ts

@@ -17,6 +17,11 @@ type DuerOSItem = {
   version: number;
   manufacturerName: string;
   autoReportProperty: boolean;
+  state?: {
+    text: string;
+    value: string | number;
+  };
+  productName?: string;
   applianceType: {
     text: string;
     value: string;

+ 3 - 7
src/pages/notice/Template/Detail/doc/DingTalk.tsx

@@ -22,9 +22,7 @@ const DingTalk = () => {
       <h1>1. 概述</h1>
       <div>
         通知模板结合通知配置为告警消息通知提供支撑。通知模板只能调用同一类型的通知配置服务。
-        <div>
-          使用钉钉消息通知时需在钉钉开放平台中创建好对应的应用
-        </div>
+        <div>使用钉钉消息通知时需在钉钉开放平台中创建好对应的应用</div>
       </div>
       <h1> 2.模板配置说明</h1>
       <h2> 1、绑定配置</h2>
@@ -35,10 +33,8 @@ const DingTalk = () => {
       <div className="image">
         <Image width="100%" src={agentId} />
       </div>
-      <h2> 3、收信人ID、收信部门ID</h2>
-      <div>
-        若不填写收信人,则在模板调试和配置告警通知时手动填写。
-      </div>
+      <h2> 3、收信人、收信部门</h2>
+      <div>若不填写收信人,则在模板调试和配置告警通知时手动填写。</div>
       {/*<div> 收信人ID获取路径:“钉钉管理后台”--“通讯录”--“查看用户”</div>*/}
       {/*<div> 收信部门ID获取路径:“钉钉管理后台”--“通讯录”--“编辑部门”</div>*/}
       {/*<div className="image">*/}

+ 1 - 1
src/pages/rule-engine/DashBoard/index.tsx

@@ -126,7 +126,7 @@ const Dashboard = observer(() => {
         series: [
           {
             name: '告警数',
-            data: fifteenData.sort((a,b) => b.timestamp - a.timestamp).map((item) => item.value),
+            data: fifteenData.sort((a, b) => b.timestamp - a.timestamp).map((item) => item.value),
             type: 'bar',
             itemStyle: {
               color: '#2F54EB',

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

@@ -149,7 +149,7 @@ export default observer((props: { parentId: string }) => {
             <Tooltip
               title={intl.formatMessage({
                 id: 'pages.system.role.option.unBindUser',
-                defaultMessage: '删除',
+                defaultMessage: '解绑',
               })}
             >
               <DisconnectOutlined />

+ 1 - 8
src/pages/system/Department/Member/bind.tsx

@@ -35,9 +35,6 @@ const Bind = observer((props: Props) => {
         id: 'pages.system.name',
         defaultMessage: '姓名',
       }),
-      search: {
-        transform: (value) => ({ name$LIKE: value }),
-      },
     },
     {
       dataIndex: 'username',
@@ -73,11 +70,7 @@ const Bind = observer((props: Props) => {
       visible={props.visible}
       onOk={handleBind}
       onCancel={props.onCancel}
-      width={'800'}
-      bodyStyle={{
-        height: 'calc(100vh - 240px);',
-        overflowY: 'auto',
-      }}
+      width={'75vw'}
       title="绑定"
     >
       <SearchComponent<UserItem>

+ 0 - 3
src/pages/system/Department/Member/index.tsx

@@ -49,9 +49,6 @@ const Member = observer((props: { parentId: string }) => {
         id: 'pages.system.name',
         defaultMessage: '姓名',
       }),
-      search: {
-        transform: (value) => ({ name$LIKE: value }),
-      },
       width: 120,
       fixed: 'left',
     },

+ 2 - 3
src/pages/system/Menu/Detail/buttons.tsx

@@ -272,8 +272,7 @@ export default (props: ButtonsProps) => {
           </PermissionButton>,
         ]}
       />
-      {
-        visible &&
+      {visible && (
         <Modal
           maskClosable={false}
           width={660}
@@ -370,7 +369,7 @@ export default (props: ButtonsProps) => {
             </Form.Item>
           </Form>
         </Modal>
-      }
+      )}
     </>
   );
 };

+ 0 - 1
src/pages/system/Menu/Setting/baseMenu.ts

@@ -1267,7 +1267,6 @@ export default [
         url: '/system/Department',
         icon: 'icon-bumenguanli',
         permissions: [
-
           { permission: 'assets-bind', actions: ['bind', 'unbind', 'query', 'permission'] },
           { permission: 'role', actions: ['query', 'save', 'delete'] },
           { permission: 'device-category', actions: ['query', 'save', 'delete'] },

+ 4 - 4
src/pages/system/Menu/Setting/index.tsx

@@ -7,7 +7,7 @@ import {
 } from '@ant-design/icons';
 import Tree from './tree';
 import './index.less';
-import {Button, message, Modal, Tooltip} from 'antd';
+import { Button, message, Modal, Tooltip } from 'antd';
 import BaseTreeData from './baseMenu';
 import { useEffect, useState } from 'react';
 import { HTML5Backend } from 'react-dnd-html5-backend';
@@ -186,10 +186,10 @@ export default observer(() => {
         visible={visible}
         onOk={() => {
           MenuSettingModel.menuData = cloneDeep(baseMenu);
-          setVisible(false)
+          setVisible(false);
         }}
         onCancel={() => {
-          setVisible(false)
+          setVisible(false);
         }}
       >
         源数据将会覆盖当前的系统菜单数据,确定要一键拷贝吗?
@@ -213,7 +213,7 @@ export default observer(() => {
                   type={'primary'}
                   ghost
                   onClick={() => {
-                    setVisible(true)
+                    setVisible(true);
                   }}
                 >
                   一键拷贝

+ 26 - 17
src/pages/system/Menu/Setting/tree.tsx

@@ -2,7 +2,7 @@ import { Input, Tree } from 'antd';
 import { SearchOutlined } from '@ant-design/icons';
 import DragItem from '@/pages/system/Menu/Setting/dragItem';
 import { useDrop } from 'react-dnd';
-import {useEffect, useState} from 'react';
+import { useEffect, useState } from 'react';
 import type { TreeProps } from 'antd';
 import { cloneDeep, debounce } from 'lodash';
 import './DragItem.less';
@@ -21,7 +21,17 @@ export const DragType = 'DragBox';
 
 const { TreeNode } = Tree;
 
-const defaultExpandedKeys = ['iot', 'media', 'system', 'device', 'link', 'link/Channel', 'rule-engine/Alarm', 'Northbound', 'rule-engine']
+const defaultExpandedKeys = [
+  'iot',
+  'media',
+  'system',
+  'device',
+  'link',
+  'link/Channel',
+  'rule-engine/Alarm',
+  'Northbound',
+  'rule-engine',
+];
 
 export default (props: TreeBodyProps) => {
   const [newData, setNewData] = useState(props.treeData);
@@ -35,9 +45,9 @@ export default (props: TreeBodyProps) => {
 
   useEffect(() => {
     setTimeout(() => {
-      setExpandedKeys(defaultExpandedKeys)
-    }, 300)
-  }, [])
+      setExpandedKeys(defaultExpandedKeys);
+    }, 300);
+  }, []);
 
   const [, drop] = useDrop(() => ({
     accept: DragType,
@@ -105,15 +115,15 @@ export default (props: TreeBodyProps) => {
     data.forEach((item: any) => {
       if (item.children) {
         if (item.children.some((cItem: any) => cItem.code === key)) {
-          parentKey = item.code
+          parentKey = item.code;
         } else if (!!getParentKey(key, item.children)) {
-          parentKey = getParentKey(key, item.children)
+          parentKey = getParentKey(key, item.children);
         }
       }
-    })
+    });
     // @ts-ignore
-    return parentKey
-  }
+    return parentKey;
+  };
 
   const findAllItem = (data: any[], value: string): string[] => {
     return data.reduce((pre, next) => {
@@ -128,17 +138,16 @@ export default (props: TreeBodyProps) => {
     const value = e.target.value;
 
     if (value) {
-
       const newKeys = findAllItem(props.treeData, value);
-      const newExpandedKeys = newKeys.map(key => {
-        return getParentKey(key, props.treeData)
-      })
+      const newExpandedKeys = newKeys.map((key) => {
+        return getParentKey(key, props.treeData);
+      });
       setSearchKeys(newKeys);
       setExpandedKeys(newExpandedKeys);
     } else {
       setSearchKeys([]);
     }
-    setAutoExpandParent(true)
+    setAutoExpandParent(true);
   };
 
   return (
@@ -157,7 +166,7 @@ export default (props: TreeBodyProps) => {
             expandedKeys={expandedKeys}
             onExpand={(_expandedKeys) => {
               setExpandedKeys(_expandedKeys);
-              setAutoExpandParent(false)
+              setAutoExpandParent(false);
             }}
             autoExpandParent={autoExpandParent}
           >
@@ -170,7 +179,7 @@ export default (props: TreeBodyProps) => {
             expandedKeys={expandedKeys}
             onExpand={(_expandedKeys) => {
               setExpandedKeys(_expandedKeys);
-              setAutoExpandParent(false)
+              setAutoExpandParent(false);
             }}
             autoExpandParent={autoExpandParent}
             draggable={{

+ 8 - 1
src/pages/system/Menu/index.tsx

@@ -108,6 +108,9 @@ export default observer(() => {
       width: 80,
       dataIndex: 'sortIndex',
       valueType: 'digit',
+      render: (_, record) => {
+        return record.sortIndex;
+      },
     },
     {
       title: intl.formatMessage({
@@ -261,7 +264,11 @@ export default observer(() => {
         search={false}
         params={param}
         request={async (params) => {
-          const response = await service.queryMenuThree({ ...params, sorts: [{ name: 'sortIndex', order: 'asc'}], paging: false });
+          const response = await service.queryMenuThree({
+            ...params,
+            sorts: [{ name: 'sortIndex', order: 'asc' }],
+            paging: false,
+          });
           return {
             code: response.message,
             result: {

+ 9 - 5
src/pages/user/Login/index.tsx

@@ -160,17 +160,21 @@ const Login: React.FC = () => {
 
   const doLogin = async (data: LoginParam) => {
     setLoading(true);
-    const res = await Service.login2({ expires: loginRef.current.expires, verifyKey: captcha.key, ...data })
-    setLoading(false)
+    const res = await Service.login2({
+      expires: loginRef.current.expires,
+      verifyKey: captcha.key,
+      ...data,
+    });
+    setLoading(false);
     if (res.status === 200) {
-      const userInfo = res.result
+      const userInfo = res.result;
       Token.set(userInfo.token);
       const userRef: any = await fetchUserInfo();
       if (userRef?.user?.username === 'admin') {
-        const initRef = await Service.initPage()
+        const initRef = await Service.initPage();
         if (initRef.status === 200 && !initRef.result.length) {
           window.location.href = '/#/init-home';
-          return
+          return;
         }
       }
       window.location.href = '/';

+ 5 - 4
src/pages/user/Login/service.ts

@@ -37,10 +37,11 @@ const Service = {
         map((resp) => resp.result),
       ),
     ),
-  login2: (data: LoginParam) => request(`/${SystemConst.API_BASE}/authorize/login`, {
-    method: 'POST',
-    data,
-  }),
+  login2: (data: LoginParam) =>
+    request(`/${SystemConst.API_BASE}/authorize/login`, {
+      method: 'POST',
+      data,
+    }),
 
   queryCurrent: () =>
     request(`/${SystemConst.API_BASE}/authorize/me`, {