Pārlūkot izejas kodu

fix: 合并冲突

sun-chaochao 3 gadi atpakaļ
vecāks
revīzija
e2548a4bb0

+ 15 - 9
src/pages/Northbound/AliCloud/Detail/index.tsx

@@ -240,21 +240,25 @@ const Detail = observer(() => {
         type: 'array',
         type: 'array',
         required: true,
         required: true,
         'x-component': 'ArrayCollapse',
         'x-component': 'ArrayCollapse',
-        title: '产品映射',
+        'x-decorator': 'FormItem',
         items: {
         items: {
           type: 'object',
           type: 'object',
-          required: true,
           'x-component': 'ArrayCollapse.CollapsePanel',
           'x-component': 'ArrayCollapse.CollapsePanel',
           'x-component-props': {
           'x-component-props': {
             header: '产品映射',
             header: '产品映射',
           },
           },
           properties: {
           properties: {
-            grid: {
+            index: {
+              type: 'void',
+              'x-component': 'ArrayCollapse.Index',
+            },
+            layout: {
               type: 'void',
               type: 'void',
-              'x-component': 'FormGrid',
-              'x-component-props': {
-                minColumns: [24],
-                maxColumns: [24],
+              'x-decorator': 'FormGrid',
+              'x-decorator-props': {
+                maxColumns: 2,
+                minColumns: 2,
+                columnGap: 24,
               },
               },
               properties: {
               properties: {
                 type: 'object',
                 type: 'object',
@@ -271,7 +275,8 @@ const Detail = observer(() => {
                       option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
                       option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
                   },
                   },
                   'x-decorator-props': {
                   'x-decorator-props': {
-                    gridSpan: 12,
+                    layout: 'vertical',
+                    labelAlign: 'left',
                     tooltip: '阿里云物联网平台产品标识',
                     tooltip: '阿里云物联网平台产品标识',
                   },
                   },
                   'x-reactions': ['{{useAsyncDataSource(queryAliyunProductList)}}'],
                   'x-reactions': ['{{useAsyncDataSource(queryAliyunProductList)}}'],
@@ -289,7 +294,8 @@ const Detail = observer(() => {
                   'x-decorator': 'FormItem',
                   'x-decorator': 'FormItem',
                   'x-component': 'Select',
                   'x-component': 'Select',
                   'x-decorator-props': {
                   'x-decorator-props': {
-                    gridSpan: 12,
+                    layout: 'vertical',
+                    labelAlign: 'left',
                   },
                   },
                   'x-component-props': {
                   'x-component-props': {
                     placeholder: '请选择平台产品',
                     placeholder: '请选择平台产品',

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

@@ -1,5 +1,5 @@
 import LivePlayer from '@/components/Player';
 import LivePlayer from '@/components/Player';
-import { Image, Modal } from 'antd';
+import { Modal, Image } from 'antd';
 
 
 interface Props {
 interface Props {
   close: () => void;
   close: () => void;
@@ -11,7 +11,7 @@ const Detail = (props: Props) => {
   const { value, type } = props;
   const { value, type } = props;
 
 
   const renderValue = () => {
   const renderValue = () => {
-    if (['.jpg', '.png', '.tiff', '.swf'].includes(type)) {
+    if (['.jpg', '.png'].includes(type)) {
       return <Image src={value?.formatValue} />;
       return <Image src={value?.formatValue} />;
     } else if (['.flv', '.m3u8', '.mp4'].includes(type)) {
     } else if (['.flv', '.m3u8', '.mp4'].includes(type)) {
       return <LivePlayer live={false} url={value?.formatValue} />;
       return <LivePlayer live={false} url={value?.formatValue} />;

+ 11 - 5
src/pages/device/Instance/Detail/Running/Property/FileComponent/index.tsx

@@ -1,7 +1,7 @@
 import type { PropertyMetadata } from '@/pages/device/Product/typings';
 import type { PropertyMetadata } from '@/pages/device/Product/typings';
 import styles from './index.less';
 import styles from './index.less';
 import Detail from './Detail';
 import Detail from './Detail';
-import { useState } from 'react';
+import { useEffect, useState } from 'react';
 import { message, Tooltip } from 'antd';
 import { message, Tooltip } from 'antd';
 
 
 interface Props {
 interface Props {
@@ -29,6 +29,11 @@ const FileComponent = (props: Props) => {
   const [type, setType] = useState<string>('other');
   const [type, setType] = useState<string>('other');
   const [visible, setVisible] = useState<boolean>(false);
   const [visible, setVisible] = useState<boolean>(false);
   const isHttps = document.location.protocol === 'https:';
   const isHttps = document.location.protocol === 'https:';
+  const [temp, setTemp] = useState<boolean>(false);
+
+  useEffect(() => {
+    setTemp(false);
+  }, [props.value]);
 
 
   const renderValue = () => {
   const renderValue = () => {
     if (!value?.formatValue) {
     if (!value?.formatValue) {
@@ -46,7 +51,7 @@ const FileComponent = (props: Props) => {
           </div>
           </div>
         );
         );
       }
       }
-      if (['.jpg', '.png', '.tiff', '.swf'].some((item) => value?.formatValue.includes(item))) {
+      if (['.jpg', '.png', '.swf', '.tiff'].some((item) => value?.formatValue.includes(item))) {
         // 图片
         // 图片
         return (
         return (
           <div
           <div
@@ -54,11 +59,11 @@ const FileComponent = (props: Props) => {
             onClick={() => {
             onClick={() => {
               if (isHttps && value?.formatValue.indexOf('http:') !== -1) {
               if (isHttps && value?.formatValue.indexOf('http:') !== -1) {
                 message.error('域名为https时,不支持访问http地址');
                 message.error('域名为https时,不支持访问http地址');
+              } else if (temp) {
+                message.error('该图片无法访问');
               } else {
               } else {
                 const flag =
                 const flag =
-                  ['.jpg', '.png', '.tiff', '.swf'].find((item) =>
-                    value?.formatValue.includes(item),
-                  ) || '';
+                  ['.jpg', '.png'].find((item) => value?.formatValue.includes(item)) || '';
                 setType(flag);
                 setType(flag);
                 setVisible(true);
                 setVisible(true);
               }
               }
@@ -68,6 +73,7 @@ const FileComponent = (props: Props) => {
               src={value?.formatValue}
               src={value?.formatValue}
               onError={(e: any) => {
               onError={(e: any) => {
                 e.target.src = imgMap.get('error');
                 e.target.src = imgMap.get('error');
+                setTemp(true);
               }}
               }}
             />
             />
           </div>
           </div>

+ 1 - 0
src/pages/device/Instance/service.ts

@@ -279,6 +279,7 @@ class Service extends BaseService<DeviceInstance> {
       method: 'POST',
       method: 'POST',
       data: {
       data: {
         paging: false,
         paging: false,
+        sorts: [{ name: 'name', order: 'asc' }],
       },
       },
     });
     });
   // 保存设备的物模型指标
   // 保存设备的物模型指标

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

@@ -91,7 +91,7 @@ const TabComponent = observer((props: Props) => {
             type: 'and',
             type: 'and',
           },
           },
         ],
         ],
-        sorts: [{ name: 'alarmDate', order: 'desc' }],
+        sorts: [{ name: 'alarmTime', order: 'desc' }],
       })
       })
       .then((resp) => {
       .then((resp) => {
         if (resp.status === 200) {
         if (resp.status === 200) {

+ 3 - 3
src/pages/rule-engine/Scene/Save/components/TimingTrigger/index.tsx

@@ -193,8 +193,8 @@ export default (props: TimingTrigger) => {
                 <TimePicker.RangePicker
                 <TimePicker.RangePicker
                   format={'HH:mm:ss'}
                   format={'HH:mm:ss'}
                   value={[
                   value={[
-                    moment(data.period?.from, 'HH:mm:ss'),
-                    moment(data.period?.to, 'hh:mm:ss'),
+                    moment(data.period?.from || new Date(), 'HH:mm:ss'),
+                    moment(data.period?.to || new Date(), 'hh:mm:ss'),
                   ]}
                   ]}
                   onChange={(_, dateString) => {
                   onChange={(_, dateString) => {
                     onChange({
                     onChange({
@@ -210,7 +210,7 @@ export default (props: TimingTrigger) => {
               ) : (
               ) : (
                 <TimePicker
                 <TimePicker
                   format={'HH:mm:ss'}
                   format={'HH:mm:ss'}
-                  value={moment(data.once?.time, 'HH:mm:ss')}
+                  value={moment(data.once?.time || new Date(), 'HH:mm:ss')}
                   onChange={(_, dateString) => {
                   onChange={(_, dateString) => {
                     onChange({
                     onChange({
                       ...data,
                       ...data,

+ 9 - 5
src/pages/rule-engine/Scene/Save/index.tsx

@@ -60,6 +60,7 @@ export default () => {
 
 
   const [requestParams, setRequestParams] = useState<any>(undefined);
   const [requestParams, setRequestParams] = useState<any>(undefined);
   const [triggerValue, setTriggerValue] = useState<any>([]);
   const [triggerValue, setTriggerValue] = useState<any>([]);
+  const [triggerDatas, setTriggerDatas] = useState<any>({});
   const [actionParams, setActionParams] = useState<any>(undefined);
   const [actionParams, setActionParams] = useState<any>(undefined);
 
 
   const [actionsData, setActionsData] = useState<any[]>([]);
   const [actionsData, setActionsData] = useState<any[]>([]);
@@ -76,6 +77,7 @@ export default () => {
         setParallel(_data.parallel);
         setParallel(_data.parallel);
 
 
         setTriggerValue({ trigger: _data.terms || [] });
         setTriggerValue({ trigger: _data.terms || [] });
+        setTriggerDatas(_data.terms);
         if (_data.trigger?.shakeLimit) {
         if (_data.trigger?.shakeLimit) {
           setShakeLimit(_data.trigger?.shakeLimit || DefaultShakeLimit);
           setShakeLimit(_data.trigger?.shakeLimit || DefaultShakeLimit);
         }
         }
@@ -214,6 +216,12 @@ export default () => {
                 if (changeValue.trigger.device.productId) {
                 if (changeValue.trigger.device.productId) {
                   setTriggerValue([]);
                   setTriggerValue([]);
                   setRequestParams({ trigger: allValues.trigger });
                   setRequestParams({ trigger: allValues.trigger });
+                } else if (
+                  changeValue.trigger.device.selectorValues ||
+                  (changeValue.trigger.device.operation &&
+                    changeValue.trigger.device.operation.operator)
+                ) {
+                  setTriggerDatas(allValues.trigger);
                 }
                 }
               } else if (['timer', 'manual'].includes(changeValue.trigger.type)) {
               } else if (['timer', 'manual'].includes(changeValue.trigger.type)) {
                 setActionParams({ trigger: allValues.trigger });
                 setActionParams({ trigger: allValues.trigger });
@@ -317,11 +325,7 @@ export default () => {
               // >
               // >
               //   <TriggerDevice className={'trigger-type-content'} />
               //   <TriggerDevice className={'trigger-type-content'} />
               // </Form.Item>
               // </Form.Item>
-              <TriggerDevice
-                value={requestParams && requestParams.trigger}
-                className={'trigger-type-content'}
-                form={form}
-              />
+              <TriggerDevice value={triggerDatas} className={'trigger-type-content'} form={form} />
             )}
             )}
           </Form.Item>
           </Form.Item>
           {triggerType === TriggerWayType.device &&
           {triggerType === TriggerWayType.device &&

+ 4 - 1
src/pages/rule-engine/Scene/Save/trigger/index.tsx

@@ -142,6 +142,8 @@ export default observer((props: TriggerProps) => {
     getProducts();
     getProducts();
   }, []);
   }, []);
 
 
+  console.log('triggerModel', FormModel);
+
   useEffect(() => {
   useEffect(() => {
     const triggerData = props.value;
     const triggerData = props.value;
     console.log('triggerData', triggerData);
     console.log('triggerData', triggerData);
@@ -174,7 +176,7 @@ export default observer((props: TriggerProps) => {
               onChange={(key: any, node: any) => {
               onChange={(key: any, node: any) => {
                 props.form?.resetFields([['trigger', 'device', 'selector']]);
                 props.form?.resetFields([['trigger', 'device', 'selector']]);
                 props.form?.resetFields([['trigger', 'device', 'selectorValues']]);
                 props.form?.resetFields([['trigger', 'device', 'selectorValues']]);
-                props.form?.resetFields([['trigger', 'device', 'operation', 'operator']]);
+                props.form?.resetFields([['trigger', 'device', 'operation']]);
                 productIdChange(key, node.metadata);
                 productIdChange(key, node.metadata);
                 props.form?.setFieldsValue({
                 props.form?.setFieldsValue({
                   trigger: {
                   trigger: {
@@ -207,6 +209,7 @@ export default observer((props: TriggerProps) => {
                     ]}
                     ]}
                     // fieldNames={{ label: 'name', value: 'id' }}
                     // fieldNames={{ label: 'name', value: 'id' }}
                     onSelect={(key: string) => {
                     onSelect={(key: string) => {
+                      props.form?.resetFields([['trigger', 'device', 'selectorValues']]);
                       setSelector(key);
                       setSelector(key);
                     }}
                     }}
                     style={{ width: 120 }}
                     style={{ width: 120 }}

+ 15 - 5
src/pages/rule-engine/Scene/Save/trigger/operation.tsx

@@ -25,12 +25,22 @@ export default (props: OperatorProps) => {
       if (props.propertiesList) {
       if (props.propertiesList) {
         return _key.map((item) => {
         return _key.map((item) => {
           const proItem = props.propertiesList!.find((a: any) => a.id === item);
           const proItem = props.propertiesList!.find((a: any) => a.id === item);
+          if (proItem) {
+            return {
+              id: proItem.id,
+              name: proItem.name,
+              type: proItem.valueType ? proItem.valueType.type : '-',
+              format: proItem.valueType ? proItem.valueType.format : undefined,
+              options: proItem.valueType ? proItem.valueType.elements : undefined,
+              value: value[item],
+            };
+          }
           return {
           return {
-            id: proItem.id,
-            name: proItem.name,
-            type: proItem.valueType ? proItem.valueType.type : '-',
-            format: proItem.valueType ? proItem.valueType.format : undefined,
-            options: proItem.valueType ? proItem.valueType.elements : undefined,
+            id: item,
+            name: item,
+            type: '',
+            format: undefined,
+            options: undefined,
             value: value[item],
             value: value[item],
           };
           };
         });
         });

+ 17 - 11
src/pages/rule-engine/Scene/TriggerTerm/index.tsx

@@ -154,7 +154,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                 : treeValue[0];
                 : treeValue[0];
 
 
             const source = (field as Field).value;
             const source = (field as Field).value;
-            const value = field.query(source === 'manual' ? '.value' : '.metric');
+            const value = field.query(source === 'manual' ? '.value.0' : '.metric');
             if (target) {
             if (target) {
               if (source === 'manual') {
               if (source === 'manual') {
                 // 手动输入
                 // 手动输入
@@ -178,7 +178,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                     };
                     };
                   }
                   }
                 });
                 });
-                form1.setFieldState(field.query('.value2'), (state) => {
+                form1.setFieldState(field.query('.value.1'), (state) => {
                   state.componentType = valueTypeMap[valueType];
                   state.componentType = valueTypeMap[valueType];
                   if (valueType === 'date') {
                   if (valueType === 'date') {
                     state.componentProps = {
                     state.componentProps = {
@@ -187,13 +187,18 @@ const TriggerTerm = (props: Props, ref: any) => {
                   }
                   }
                 });
                 });
               } else if (source === 'metrics') {
               } else if (source === 'metrics') {
+                const termType = field.query('..termType').value();
+                const tag = ['nbtw', 'btw'].includes(termType);
                 // 指标
                 // 指标
                 form1.setFieldState(value, (state) => {
                 form1.setFieldState(value, (state) => {
                   state.componentType = Select;
                   state.componentType = Select;
-                  state.dataSource = target?.metrics.map((item: any) => ({
-                    label: item.name,
-                    value: item.id,
-                  }));
+                  state.dataSource = target?.metrics
+                    ?.filter((i: { range: boolean }) => i.range === tag)
+                    .map((item: any) => ({
+                      label: item.name,
+                      value: item.id,
+                    }));
+                  state.value = undefined;
                 });
                 });
               }
               }
             }
             }
@@ -324,7 +329,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                               },
                               },
                             },
                             },
                           },
                           },
-                          value: {
+                          'value[0]': {
                             type: 'string',
                             type: 'string',
                             'x-component': 'Input',
                             'x-component': 'Input',
                             'x-decorator': 'FormItem',
                             'x-decorator': 'FormItem',
@@ -336,7 +341,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                             required: true,
                             required: true,
                             'x-reactions': [
                             'x-reactions': [
                               {
                               {
-                                dependencies: ['.source'],
+                                dependencies: ['..source'],
                                 fulfill: {
                                 fulfill: {
                                   state: {
                                   state: {
                                     visible: '{{$deps[0]==="manual"}}',
                                     visible: '{{$deps[0]==="manual"}}',
@@ -344,7 +349,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                                 },
                                 },
                               },
                               },
                               {
                               {
-                                dependencies: ['..termType'],
+                                dependencies: ['...termType'],
                                 when: '{{["nbtw","btw"].includes($deps[0])}}',
                                 when: '{{["nbtw","btw"].includes($deps[0])}}',
                                 fulfill: {
                                 fulfill: {
                                   state: {
                                   state: {
@@ -367,7 +372,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                               },
                               },
                             ],
                             ],
                           },
                           },
-                          value2: {
+                          'value[1]': {
                             type: 'string',
                             type: 'string',
                             'x-component': 'Input',
                             'x-component': 'Input',
                             'x-decorator': 'FormItem',
                             'x-decorator': 'FormItem',
@@ -378,7 +383,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                             },
                             },
                             required: true,
                             required: true,
                             'x-reactions': {
                             'x-reactions': {
-                              dependencies: ['.source', '..termType'],
+                              dependencies: ['..source', '...termType'],
                               fulfill: {
                               fulfill: {
                                 state: {
                                 state: {
                                   visible:
                                   visible:
@@ -387,6 +392,7 @@ const TriggerTerm = (props: Props, ref: any) => {
                               },
                               },
                             },
                             },
                           },
                           },
+
                           metric: {
                           metric: {
                             type: 'string',
                             type: 'string',
                             'x-component': 'Select',
                             'x-component': 'Select',

+ 35 - 9
src/pages/system/Platforms/Api/basePage.tsx

@@ -1,5 +1,5 @@
 import { Button, message, Table } from 'antd';
 import { Button, message, Table } from 'antd';
-import { useCallback, useEffect, useState } from 'react';
+import { useCallback, useEffect, useState, useRef } from 'react';
 import { useLocation } from 'umi';
 import { useLocation } from 'umi';
 import { service } from '../index';
 import { service } from '../index';
 import { ApiModel } from '@/pages/system/Platforms/Api/base';
 import { ApiModel } from '@/pages/system/Platforms/Api/base';
@@ -15,6 +15,9 @@ export default (props: TableProps) => {
   const [selectKeys, setSelectKeys] = useState<string[]>([]);
   const [selectKeys, setSelectKeys] = useState<string[]>([]);
   const [dataSource, setDataSource] = useState<any[]>([]);
   const [dataSource, setDataSource] = useState<any[]>([]);
   const [loading, setLoading] = useState(false);
   const [loading, setLoading] = useState(false);
+
+  const grantCache = useRef<string[]>([]);
+
   const location = useLocation();
   const location = useLocation();
 
 
   const getApiGrant = useCallback(() => {
   const getApiGrant = useCallback(() => {
@@ -23,6 +26,7 @@ export default (props: TableProps) => {
 
 
     service.getApiGranted(code!).then((resp: any) => {
     service.getApiGranted(code!).then((resp: any) => {
       if (resp.status === 200) {
       if (resp.status === 200) {
+        grantCache.current = resp.result;
         setSelectKeys(resp.result);
         setSelectKeys(resp.result);
       }
       }
     });
     });
@@ -30,9 +34,6 @@ export default (props: TableProps) => {
 
 
   const getOperations = async (apiData: any[], operations: string[]) => {
   const getOperations = async (apiData: any[], operations: string[]) => {
     // 过滤只能授权的接口,当isShowGranted为true时,过滤为已赋权的接口
     // 过滤只能授权的接口,当isShowGranted为true时,过滤为已赋权的接口
-    console.log(
-      apiData.filter((item) => item && item.operationId && operations.includes(item.operationId)),
-    );
     setDataSource(
     setDataSource(
       apiData.filter((item) => item && item.operationId && operations.includes(item.operationId)),
       apiData.filter((item) => item && item.operationId && operations.includes(item.operationId)),
     );
     );
@@ -65,7 +66,23 @@ export default (props: TableProps) => {
   const save = useCallback(async () => {
   const save = useCallback(async () => {
     const param = new URLSearchParams(location.search);
     const param = new URLSearchParams(location.search);
     const code = param.get('code');
     const code = param.get('code');
-    const operations = selectKeys.map((a: string) => {
+    // 和原有已授权数据进行对比
+    const addGrant = selectKeys.filter((key) => {
+      if (grantCache.current.includes(key)) {
+        return false;
+      }
+      return true;
+    });
+
+    // 获取删除的数据
+    const removeGrant = grantCache.current.filter((key) => {
+      if (selectKeys.includes(key)) {
+        return false;
+      }
+      return true;
+    });
+
+    const addOperations = addGrant.map((a: string) => {
       const item = dataSource.find((b) => b.operationId === a);
       const item = dataSource.find((b) => b.operationId === a);
       return {
       return {
         id: a,
         id: a,
@@ -73,16 +90,25 @@ export default (props: TableProps) => {
       };
       };
     });
     });
 
 
+    const removeOperations = removeGrant.map((a: string) => {
+      const item = dataSource.find((b) => b.operationId === a);
+      return {
+        id: a,
+        permissions: item.security,
+      };
+    });
+
+    grantCache.current = addGrant;
+
     setLoading(true);
     setLoading(true);
-    const resp = await service.saveApiGrant(code!, { operations });
+    const resp = await service.addApiGrant(code!, { operations: addOperations });
+    const resp2 = await service.removeApiGrant(code!, { operations: removeOperations });
     setLoading(false);
     setLoading(false);
-    if (resp.status === 200) {
+    if (resp.status === 200 || resp2.status === 200) {
       message.success('操作成功');
       message.success('操作成功');
     }
     }
   }, [selectKeys, location, dataSource]);
   }, [selectKeys, location, dataSource]);
 
 
-  console.log(dataSource);
-
   return (
   return (
     <div className={'platforms-api-table'}>
     <div className={'platforms-api-table'}>
       <Table<any>
       <Table<any>

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

@@ -48,6 +48,12 @@ class Service extends BaseService<platformsType> {
   saveApiGrant = (id: string, data: any) =>
   saveApiGrant = (id: string, data: any) =>
     request(`/${SystemConst.API_BASE}/api-client/${id}/grant`, { method: 'POST', data });
     request(`/${SystemConst.API_BASE}/api-client/${id}/grant`, { method: 'POST', data });
 
 
+  addApiGrant = (id: string, data: any) =>
+    request(`/${SystemConst.API_BASE}/api-client/${id}/grant/_add`, { method: 'POST', data });
+
+  removeApiGrant = (id: string, data: any) =>
+    request(`/${SystemConst.API_BASE}/api-client/${id}/grant/_delete`, { method: 'POST', data });
+
   /**
   /**
    * 获取已授权的接口ID
    * 获取已授权的接口ID
    * @param id 第三方平台的ID
    * @param id 第三方平台的ID