sun-chaochao 3 лет назад
Родитель
Сommit
bbce2017e8

+ 53 - 19
src/pages/Northbound/AliCloud/Detail/index.tsx

@@ -11,20 +11,21 @@ import {
   Select,
 } from '@formily/antd';
 import type { Field } from '@formily/core';
+import { onFieldChange } from '@formily/core';
+import { FormPath } from '@formily/core';
 import { createForm, onFieldValueChange } from '@formily/core';
 import { createSchemaField, observer } from '@formily/react';
 import { Card, Col, Image, message, Row } from 'antd';
-import { useEffect, useMemo, useState } from 'react';
+import { useEffect, useMemo } from 'react';
 import { useParams } from 'umi';
 import { useAsyncDataSource } from '@/utils/util';
 import './index.less';
 import { service } from '@/pages/Northbound/AliCloud';
 import usePermissions from '@/hooks/permission';
+import { Store } from 'jetlinks-store';
 
 const Detail = observer(() => {
   const params = useParams<{ id: string }>();
-  const [dataList, setDataList] = useState<any[]>([]);
-  const [productList, setProductList] = useState<any[]>([]);
 
   const form = useMemo(
     () =>
@@ -35,20 +36,47 @@ const Detail = observer(() => {
             const regionId = field.query('accessConfig.regionId').value();
             const accessKeyId = field.query('accessConfig.accessKeyId').value();
             const accessSecret = field.query('accessConfig.accessSecret').value();
+            let response: any[] = [];
             if (regionId && accessKeyId && accessSecret) {
-              const response = await service.getAliyunProductsList({
+              response = await service.getAliyunProductsList({
                 regionId,
                 accessKeyId,
                 accessSecret,
               });
-              f.setFieldState(field.query('bridgeProductKey'), (state) => {
-                state.dataSource = response;
-                setDataList(response);
+            }
+            f.setFieldState(field.query('bridgeProductKey'), (state) => {
+              state.dataSource = response;
+              Store.set('datalist', response);
+            });
+          });
+
+          onFieldChange('mappings.*.productKey', async (field, f) => {
+            const propertyPath = FormPath.transform(
+              field.path,
+              /\d+/,
+              (index) => `mappings.${index}`,
+            );
+            const value = field.query('.productKey').value();
+            if ((Store.get('datalist') || [])?.length > 0) {
+              f.setFieldState(propertyPath, (state) => {
+                state.componentProps = {
+                  header:
+                    (Store.get('datalist') || []).find((item: any) => item.value === value || '')
+                      ?.label || `产品映射`,
+                };
               });
             } else {
-              f.setFieldState(field.query('bridgeProductKey'), (state) => {
-                state.dataSource = [];
-                setDataList([]);
+              const accessConfig = field.query('accessConfig').value();
+              let response: any[] = [];
+              if (Object.keys(accessConfig).length >= 3) {
+                response = await service.getAliyunProductsList(accessConfig);
+              }
+              f.setFieldState(propertyPath, (state) => {
+                Store.set('datalist', response);
+                state.componentProps = {
+                  header:
+                    response.find((item: any) => item.value === value || '')?.label || `产品映射`,
+                };
               });
             }
           });
@@ -85,35 +113,39 @@ const Detail = observer(() => {
     const checked = [...items];
     const index = checked.findIndex((i) => i === f.value);
     checked.splice(index, 1);
-    if (productList?.length > 0) {
+    if (Store.get('productList')?.length > 0) {
       return new Promise((resolve) => {
-        const list = productList.filter((j: any) => !checked.includes(j.value));
+        const list = Store.get('productList').filter((j: any) => !checked.includes(j.value));
         resolve(list);
       });
     } else {
       return service.getProductsList({ paging: false }).then((resp) => {
-        setProductList(resp);
+        Store.set('productList', resp);
         return resp.filter((j: any) => !checked.includes(j.value));
       });
     }
   };
 
   const queryAliyunProductList = (f: Field) => {
+    const accessConfig = form.getValuesIn('accessConfig') || {};
     const items = form.getValuesIn('mappings')?.map((i: any) => i?.productKey) || [];
     const checked = [...items];
     const index = checked.findIndex((i) => i === f.value);
     checked.splice(index, 1);
-    if (dataList?.length > 0) {
+    if ((Store.get('datalist') || [])?.length > 0) {
       return new Promise((resolve) => {
-        const list = dataList.filter((j: any) => !checked.includes(j.value));
+        const list = (Store.get('datalist') || []).filter((j: any) => !checked.includes(j.value));
         resolve(list);
       });
-    } else {
-      const accessConfig = form.getValuesIn('accessConfig') || {};
+    } else if (Object.keys(accessConfig).length >= 3) {
       return service.getAliyunProductsList(accessConfig).then((resp) => {
-        setDataList(resp);
+        Store.set('datalist', resp);
         return resp.filter((j: any) => !checked.includes(j.value));
       });
+    } else {
+      return new Promise((resolve) => {
+        resolve([]);
+      });
     }
   };
 
@@ -343,7 +375,9 @@ const Detail = observer(() => {
 
   const handleSave = async () => {
     const data: any = await form.submit();
-    const product = dataList.find((item) => item?.value === data?.bridgeProductKey);
+    const product = (Store.get('datalist') || []).find(
+      (item: any) => item?.value === data?.bridgeProductKey,
+    );
     data.bridgeProductName = product?.label || '';
     const response: any = data.id ? await service.update(data) : await service.save(data);
     if (response.status === 200) {

+ 25 - 17
src/pages/device/Instance/Detail/MetadataLog/Property/AMap.tsx

@@ -1,4 +1,5 @@
 import { AMap, PathSimplifier } from '@/components';
+import useDistance from '@/components/AMapComponent/hooks/Distance';
 import { Button, Space } from 'antd';
 import { useEffect, useRef, useState } from 'react';
 
@@ -8,20 +9,28 @@ interface Props {
 }
 
 export default (props: Props) => {
-  const [speed] = useState(1000000);
+  const { distance, onDistance } = useDistance();
+  const [speed, setSpeed] = useState<number>(1000000);
   const PathNavigatorRef = useRef<PathNavigator | null>(null);
-  const [dataSource, setDataSource] = useState<any>({});
+  const [dataSource, setDataSource] = useState<any[]>([]);
 
   useEffect(() => {
     const list: any[] = [];
     (props?.value?.data || []).forEach((item: any) => {
       list.push([item.value.lon, item.value.lat]);
     });
-    setDataSource({
-      name: props?.name || '',
-      path: [...list],
-    });
+    setDataSource([
+      {
+        name: props?.name || '',
+        path: [...list],
+      },
+    ]);
   }, [props.value]);
+
+  useEffect(() => {
+    setSpeed((distance / 5) * 3.6);
+  }, [distance]);
+
   return (
     <div style={{ position: 'relative' }}>
       <div style={{ position: 'absolute', right: 0, top: 5, zIndex: 999 }}>
@@ -55,17 +64,16 @@ export default (props: Props) => {
           width: '100%',
         }}
       >
-        {(dataSource?.path || []).length > 0 ? (
-          <PathSimplifier pathData={[dataSource]}>
-            <PathSimplifier.PathNavigator
-              speed={speed}
-              isAuto={false}
-              onCreate={(nav) => {
-                PathNavigatorRef.current = nav;
-              }}
-            />
-          </PathSimplifier>
-        ) : null}
+        <PathSimplifier pathData={dataSource}>
+          <PathSimplifier.PathNavigator
+            speed={speed}
+            isAuto={false}
+            onCreate={(nav) => {
+              onDistance(dataSource[0]?.path);
+              PathNavigatorRef.current = nav;
+            }}
+          />
+        </PathSimplifier>
       </AMap>
     </div>
   );

+ 4 - 2
src/pages/device/Instance/Detail/MetadataLog/Property/index.tsx

@@ -149,6 +149,7 @@ const PropertyLog = (props: Props) => {
           type: 'and',
         },
       ],
+      sorts: [{ name: 'timestamp', order: 'asc' }],
     });
     if (resp.status === 200) {
       const dataList: any[] = [];
@@ -174,7 +175,7 @@ const PropertyLog = (props: Props) => {
           type: data?.name || '',
         });
       });
-      setChartsList(dataList);
+      setChartsList(dataList.reverse());
     }
   };
 
@@ -214,6 +215,7 @@ const PropertyLog = (props: Props) => {
             dataSource={dataSource?.data || []}
             columns={data?.valueType?.type === 'geoPoint' ? geoColumns : columns}
             pagination={{
+              current: dataSource?.pageIndex + 1,
               pageSize: dataSource?.pageSize || 10,
               showSizeChanger: true,
               total: dataSource?.total || 0,
@@ -231,7 +233,7 @@ const PropertyLog = (props: Props) => {
                   style={{ width: 120 }}
                   onChange={(value: string) => {
                     setCycle(value);
-                    if (cycle === '*') {
+                    if (value === '*') {
                       queryChartsList(start, end);
                     } else {
                       queryChartsAggList({

+ 2 - 6
src/pages/device/Instance/Detail/Running/Property/FileComponent/index.tsx

@@ -1,7 +1,7 @@
 import type { PropertyMetadata } from '@/pages/device/Product/typings';
 import styles from './index.less';
 import Detail from './Detail';
-import { useEffect, useState } from 'react';
+import { useState } from 'react';
 import { message, Tooltip } from 'antd';
 
 interface Props {
@@ -31,12 +31,8 @@ const FileComponent = (props: Props) => {
   const isHttps = document.location.protocol === 'https:';
   const [temp, setTemp] = useState<boolean>(false);
 
-  useEffect(() => {
-    setTemp(false);
-  }, [props.value]);
-
   const renderValue = () => {
-    if (!value?.formatValue) {
+    if (value?.formatValue !== 0 && !value?.formatValue) {
       return <div className={props.type === 'card' ? styles.other : {}}>--</div>;
     } else if (data?.valueType?.type === 'file') {
       if (

+ 2 - 2
src/pages/link/AccessConfig/Detail/Cloud/Protocol/index.tsx

@@ -15,8 +15,8 @@ ProcotoleMapping.set('mqtt-client-gateway', 'MQTT');
 ProcotoleMapping.set('mqtt-server-gateway', 'MQTT');
 ProcotoleMapping.set('tcp-server-gateway', 'TCP');
 ProcotoleMapping.set('child-device', '');
-ProcotoleMapping.set('OneNet', 'OneNet');
-ProcotoleMapping.set('Ctwing', 'Ctwing');
+ProcotoleMapping.set('OneNet', 'HTTP');
+ProcotoleMapping.set('Ctwing', 'HTTP');
 ProcotoleMapping.set('modbus-tcp', 'MODBUS_TCP');
 ProcotoleMapping.set('opc-ua', 'OPC_UA');