lind 3 лет назад
Родитель
Сommit
d248efc4bd

+ 6 - 0
src/app.tsx

@@ -7,6 +7,7 @@ import RightContent from '@/components/RightContent';
 import Footer from '@/components/Footer';
 import { BookOutlined, LinkOutlined } from '@ant-design/icons';
 import Service from '@/pages/user/Login/service';
+import { service as SystemConfigService } from '@/pages/system/Config';
 import Token from '@/utils/token';
 import type { RequestOptionsInit } from 'umi-request';
 import ReconnectingWebSocket from 'reconnecting-websocket';
@@ -248,6 +249,11 @@ export function patchRoutes(routes: any) {
 
 export function render(oldRender: any) {
   if (history.location.pathname !== loginPath) {
+    SystemConfigService.getAMapKey().then((res) => {
+      if (res && res.status === 200 && res.result) {
+        localStorage.setItem(SystemConst.AMAP_KEY, res.result.apiKey);
+      }
+    });
     MenuService.queryOwnThree({ paging: false }).then((res) => {
       if (res && res.status === 200) {
         if (isDev) {

+ 12 - 7
src/components/AMapComponent/amap.tsx

@@ -2,11 +2,13 @@ import React, { useState } from 'react';
 import type { MapProps } from 'react-amap';
 import { Map } from 'react-amap';
 import { getAMapUiPromise } from './APILoader';
+import SystemConst from '@/utils/const';
+import { Empty } from 'antd';
 
-interface AMapProps extends MapProps {
+interface AMapProps extends Omit<MapProps, 'amapkey' | 'useAMapUI'> {
   style?: React.CSSProperties;
   className?: string;
-  AMapUI?: string;
+  AMapUI?: string | boolean;
 }
 
 export default (props: AMapProps) => {
@@ -16,6 +18,8 @@ export default (props: AMapProps) => {
 
   const isOpenUi = 'AMapUI' in props || props.AMapUI;
 
+  const amapKey = localStorage.getItem(SystemConst.AMAP_KEY);
+
   const getAMapUI = () => {
     const version = typeof props.AMapUI === 'string' ? props.AMapUI : '1.1';
     getAMapUiPromise(version).then(() => {
@@ -23,19 +27,18 @@ export default (props: AMapProps) => {
     });
   };
 
-  // TODO 后期可以使用页面渲染时获取缓存中的key
-
   return (
     <div style={style || { width: '100%', height: '100%' }} className={className}>
-      {
+      {amapKey ? (
         // @ts-ignore
         <Map
           version={'2.0'}
+          amapkey={amapKey}
+          zooms={[3, 20]}
           onInstanceCreated={(map: any) => {
             if (onInstanceCreated) {
               onInstanceCreated(map);
             }
-            console.log(isOpenUi);
             if (isOpenUi) {
               getAMapUI();
             }
@@ -44,7 +47,9 @@ export default (props: AMapProps) => {
         >
           {isOpenUi ? (uiLoading ? props.children : null) : props.children}
         </Map>
-      }
+      ) : (
+        <Empty description={'请配置高德地图key'} />
+      )}
     </div>
   );
 };

+ 5 - 0
src/pages/Northbound/AliCloud/index.tsx

@@ -0,0 +1,5 @@
+import { PageContainer } from '@ant-design/pro-layout';
+
+export default () => {
+  return <PageContainer>AliCloud</PageContainer>;
+};

+ 133 - 0
src/pages/Northbound/DuerOS/index.tsx

@@ -0,0 +1,133 @@
+import { PageContainer } from '@ant-design/pro-layout';
+import SearchComponent from '@/components/SearchComponent';
+import { useRef, useState } from 'react';
+import type { ActionType, ProColumns } from '@jetlinks/pro-table';
+import { PermissionButton, ProTableCard } from '@/components';
+import { DeleteOutlined, EditOutlined, PlayCircleOutlined, StopOutlined } from '@ant-design/icons';
+import { useIntl } from '@@/plugin-locale/localeExports';
+
+export default () => {
+  const actionRef = useRef<ActionType>();
+  const intl = useIntl();
+  const [searchParams, setSearchParams] = useState<any>({});
+
+  const { permission } = PermissionButton.usePermission('Northbound/DuerOS');
+
+  const Tools = (record: any, type: 'card' | 'table') => {
+    return [
+      <PermissionButton
+        key={'update'}
+        type={'link'}
+        style={{ padding: 0 }}
+        isPermission={permission.update}
+        tooltip={
+          type === 'table'
+            ? {
+                title: intl.formatMessage({
+                  id: 'pages.data.option.edit',
+                  defaultMessage: '编辑',
+                }),
+              }
+            : undefined
+        }
+        onClick={() => {}}
+      >
+        <EditOutlined />
+        {type !== 'table' &&
+          intl.formatMessage({
+            id: 'pages.data.option.edit',
+            defaultMessage: '编辑',
+          })}
+      </PermissionButton>,
+      <PermissionButton
+        key={'started'}
+        type={'link'}
+        style={{ padding: 0 }}
+        isPermission={permission.action}
+        popConfirm={{
+          title: intl.formatMessage({
+            id: `pages.data.option.${
+              record.state.value === 'started' ? 'disabled' : 'enabled'
+            }.tips`,
+            defaultMessage: '确认禁用?',
+          }),
+          onConfirm: async () => {},
+        }}
+        tooltip={
+          type === 'table'
+            ? {
+                title: intl.formatMessage({
+                  id: `pages.data.option.${
+                    record.state.value === 'started' ? 'disabled' : 'enabled'
+                  }`,
+                  defaultMessage: '启用',
+                }),
+              }
+            : undefined
+        }
+      >
+        {record.state.value === 'started' ? <StopOutlined /> : <PlayCircleOutlined />}
+        {type !== 'table' &&
+          intl.formatMessage({
+            id: `pages.data.option.${record.state.value === 'started' ? 'disabled' : 'enabled'}`,
+            defaultMessage: record.state.value === 'started' ? '禁用' : '启用',
+          })}
+      </PermissionButton>,
+      <PermissionButton
+        key={'delete'}
+        type={'link'}
+        style={{ padding: 0 }}
+        isPermission={permission.delete}
+        disabled={record.state.value === 'started'}
+        popConfirm={{
+          title: '确认删除?',
+          disabled: record.state.value === 'started',
+          onConfirm: () => {},
+        }}
+        tooltip={{
+          title:
+            record.state.value === 'started' ? <span>请先禁用,再删除</span> : <span>删除</span>,
+        }}
+      >
+        <DeleteOutlined />
+      </PermissionButton>,
+    ];
+  };
+
+  const columns: ProColumns<DuerOSType>[] = [
+    {
+      dataIndex: 'name',
+    },
+    {
+      title: intl.formatMessage({
+        id: 'pages.data.option',
+        defaultMessage: '操作',
+      }),
+      valueType: 'option',
+      align: 'center',
+      width: 200,
+      render: (text, record) => Tools(record, 'table'),
+    },
+  ];
+
+  return (
+    <PageContainer>
+      <SearchComponent<DuerOSType>
+        field={columns}
+        target="device-instance"
+        onSearch={(data) => {
+          actionRef.current?.reset?.();
+          setSearchParams(data);
+        }}
+      />
+      <ProTableCard<DuerOSType>
+        rowKey="id"
+        search={false}
+        columns={columns}
+        actionRef={actionRef}
+        params={searchParams}
+        options={{ fullScreen: true }}
+      />
+    </PageContainer>
+  );
+};

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

@@ -0,0 +1,4 @@
+type DuerOSType = {
+  id: string;
+  name: string;
+};

+ 6 - 12
src/pages/rule-engine/Scene/Save/trigger/index.tsx

@@ -3,7 +3,7 @@ import type { FormInstance } from 'antd';
 import { Col, Form, Row, Select } from 'antd';
 import { ItemGroup, TimingTrigger } from '@/pages/rule-engine/Scene/Save/components';
 import { getProductList } from '@/pages/rule-engine/Scene/Save/action/device/service';
-import { queryOrgTree, querySelector } from '@/pages/rule-engine/Scene/Save/trigger/service';
+import { queryOrgTree } from '@/pages/rule-engine/Scene/Save/trigger/service';
 import Device from '@/pages/rule-engine/Scene/Save/action/device/deviceModal';
 import FunctionCall from '@/pages/rule-engine/Scene/Save/action/device/functionCall';
 import Operation from './operation';
@@ -40,7 +40,6 @@ export default observer((props: TriggerProps) => {
   const [productId, setProductId] = useState('');
   const [selector, setSelector] = useState('fixed');
 
-  const [selectorOptions, setSelectorOptions] = useState<any[]>([]);
   const [operatorOptions, setOperatorOptions] = useState<any[]>([]);
 
   const [properties, setProperties] = useState<any[]>([]); // 属性
@@ -50,14 +49,6 @@ export default observer((props: TriggerProps) => {
   const [functionItem, setFunctionItem] = useState<any[]>([]); // 单个功能-属性列表
   const [orgTree, setOrgTree] = useState<any>([]);
 
-  const getSelector = () => {
-    querySelector().then((resp) => {
-      if (resp && resp.status === 200) {
-        setSelectorOptions(resp.result);
-      }
-    });
-  };
-
   const getOrgTree = useCallback(() => {
     queryOrgTree(productId).then((resp) => {
       if (resp && resp.status === 200) {
@@ -125,7 +116,6 @@ export default observer((props: TriggerProps) => {
 
   useEffect(() => {
     getProducts();
-    getSelector();
   }, []);
 
   useEffect(() => {
@@ -190,7 +180,11 @@ export default observer((props: TriggerProps) => {
               <ItemGroup>
                 <Form.Item name={['trigger', 'device', 'selector']} initialValue={'fixed'}>
                   <Select
-                    options={selectorOptions}
+                    options={[
+                      { label: '全部设备', value: 'all' },
+                      { label: '固定设备', value: 'fixed' },
+                      { label: '按部门', value: 'org' },
+                    ]}
                     fieldNames={{ label: 'name', value: 'id' }}
                     style={{ width: 120 }}
                   />

+ 4 - 0
src/pages/system/Config/index.tsx

@@ -0,0 +1,4 @@
+import Service from '@/pages/system/Config/service';
+
+export const service = new Service('system');
+export default () => {};

+ 6 - 0
src/pages/system/Config/service.ts

@@ -0,0 +1,6 @@
+import BaseService from '@/utils/BaseService';
+import { request } from '@@/plugin-request/request';
+
+export default class Service extends BaseService<any> {
+  getAMapKey = () => request(`${this.uri}/config/amap`, { method: 'GET' });
+}

+ 2 - 0
src/utils/const.ts

@@ -26,6 +26,8 @@ class SystemConst {
   static GET_METADATA = 'get_metadata';
 
   static REFRESH_DEVICE = 'refresh_device';
+
+  static AMAP_KEY = 'amap_key';
 }
 
 export default SystemConst;

+ 2 - 0
src/utils/menu/router.ts

@@ -109,6 +109,8 @@ export enum MENUS_CODE {
   'system/Menu/Detail' = 'system/Menu/Detail',
   'system/Department/Detail' = 'system/Department/Detail',
   'link/Type/Detail' = 'link/Type/Detail',
+  'Northbound/DuerOS' = 'Northbound/DuerOS',
+  'Northbound/AliCloud' = 'Northbound/AliCloud',
 }
 
 export type MENUS_CODE_TYPE = keyof typeof MENUS_CODE | string;