Browse Source

fix:修复部分场景联动及修复一系列其他模块bug

hear 3 years atrás
parent
commit
3330d24ae3
46 changed files with 471 additions and 172 deletions
  1. 4 1
      src/app.tsx
  2. 3 1
      src/components/FUpload/index.tsx
  3. 6 1
      src/components/ProTableCard/CardItems/device.tsx
  4. 4 0
      src/components/ProTableCard/CardItems/product.tsx
  5. 1 1
      src/components/SearchComponent/index.tsx
  6. 14 5
      src/pages/device/Instance/Detail/Parsing/index.tsx
  7. 1 1
      src/pages/device/Instance/Detail/Running/Property/index.tsx
  8. 14 7
      src/pages/device/Instance/Detail/index.tsx
  9. 23 1
      src/pages/device/Instance/Import/index.tsx
  10. 4 1
      src/pages/device/Instance/Save/index.tsx
  11. 2 1
      src/pages/device/Product/Detail/Access/AccessConfig/index.tsx
  12. 1 1
      src/pages/device/Product/Detail/index.tsx
  13. 11 3
      src/pages/device/components/Metadata/Base/Edit/index.tsx
  14. 8 4
      src/pages/edge/Device/Save/index.tsx
  15. 5 1
      src/pages/edge/Resource/index.tsx
  16. 9 11
      src/pages/home/device/index.tsx
  17. 20 18
      src/pages/media/Device/Save/SaveProduct.tsx
  18. 1 0
      src/pages/notice/Config/index.tsx
  19. 12 15
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx
  20. 16 8
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/WriteProperty.tsx
  21. 45 5
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/functionCall.tsx
  22. 7 2
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/index.tsx
  23. 1 1
      src/pages/rule-engine/Scene/Save/action/DeviceOutput/index.tsx
  24. 3 2
      src/pages/rule-engine/Scene/Save/action/ListItem/FilterCondition.tsx
  25. 3 0
      src/pages/rule-engine/Scene/Save/action/ListItem/FilterGroup.tsx
  26. 2 0
      src/pages/rule-engine/Scene/Save/action/ListItem/Item.tsx
  27. 3 1
      src/pages/rule-engine/Scene/Save/action/ListItem/List.tsx
  28. 5 1
      src/pages/rule-engine/Scene/Save/components/Buttons/Dropdown.tsx
  29. 1 1
      src/pages/rule-engine/Scene/Save/components/Buttons/ParamsDropdown.tsx
  30. 11 6
      src/pages/rule-engine/Scene/Save/components/ShakeLimit/index.tsx
  31. 2 2
      src/pages/rule-engine/Scene/Save/index.tsx
  32. 4 4
      src/pages/rule-engine/Scene/Save/terms/index.tsx
  33. 51 16
      src/pages/rule-engine/Scene/Save/terms/paramsItem.tsx
  34. 5 0
      src/pages/system/Apply/Save/index.less
  35. 7 4
      src/pages/system/Basis/index.tsx
  36. 14 0
      src/pages/system/DataSource/Management/DataTable.tsx
  37. 9 4
      src/pages/system/Department/Assets/deivce/bind.tsx
  38. 7 1
      src/pages/system/Department/Assets/deivce/index.tsx
  39. 26 9
      src/pages/system/Department/Assets/product/bind.tsx
  40. 12 1
      src/pages/system/Department/Assets/product/index.tsx
  41. 2 2
      src/pages/system/Department/Assets/updateModal.tsx
  42. 17 0
      src/pages/system/Menu/Detail/edit.tsx
  43. 1 1
      src/pages/system/Platforms/Api/basePage.tsx
  44. 30 9
      src/pages/system/Platforms/Api/swagger-ui/base.tsx
  45. 39 19
      src/pages/user/Login/index.tsx
  46. 5 0
      src/pages/user/Login/service.ts

+ 4 - 1
src/app.tsx

@@ -285,7 +285,10 @@ const MenuItemIcon = (
     // @ts-ignore
     const menuItem = React.cloneElement(defaultDom, {
       // @ts-ignore
-      children: [<AIcon type={menuItemProps.icon as string} />, defaultDom.props.children[1]],
+      children: [
+        <AIcon type={menuItemProps.icon as string} size={16} />,
+        defaultDom.props.children[1],
+      ],
       ...props,
     });
     return menuItem;

+ 3 - 1
src/components/FUpload/index.tsx

@@ -43,7 +43,9 @@ const FUpload = connect((props: Props) => {
       }}
       multiple={false}
       onChange={handleChange}
-      progress={{}}
+      progress={{
+        format: (percent) => percent && `${parseFloat(percent.toFixed(2))}%`,
+      }}
       showUploadList={{
         removeIcon: (
           <DeleteOutlined

+ 6 - 1
src/components/ProTableCard/CardItems/device.tsx

@@ -57,13 +57,18 @@ export const ExtraDeviceCard = (props: DeviceCardProps) => {
 
   useEffect(() => {
     Store.subscribe('assets-device', (data: any) => {
+      if (data.delete && data.id === 'rest') {
+        setAssetKeys(['read']);
+      }
       if (data.isAll && data.bindKeys.includes(props.id)) {
         setAssetKeys(data.assets);
         setDisabled(true);
         disabledRef.current = true;
-      } else if (!data.isAll && data.bindKeys.includes(props.id)) {
+      } else if (!data.isAll && data.bindKeys?.includes(props.id)) {
         setDisabled(false);
         disabledRef.current = false;
+      } else if (!data.isAll && data.delete && props.id === data.id) {
+        setAssetKeys(['read']);
       } else {
         setDisabled(true);
         disabledRef.current = true;

+ 4 - 0
src/components/ProTableCard/CardItems/product.tsx

@@ -117,6 +117,10 @@ export const ExtraProductCard = (props: ProductCardProps) => {
 
   useEffect(() => {
     Store.subscribe('assets-product', (data: any) => {
+      // console.log('-------',data)
+      if (data.delete && data.id === 'rest') {
+        setAssetKeys(['read']);
+      }
       if (data.isAll && data.bindKeys.includes(props.id)) {
         setAssetKeys(data.assets);
         setDisabled(true);

+ 1 - 1
src/components/SearchComponent/index.tsx

@@ -683,7 +683,7 @@ const SearchComponent = <T extends Record<string, any>>(props: Props<T>) => {
                 {item.name}
               </Typography.Text>
               <Popconfirm
-                title="确定删除"
+                title="确定删除"
                 onConfirm={async (e) => {
                   e?.stopPropagation();
                   const response = await service.history.remove(`${target}-search`, item.key);

File diff suppressed because it is too large
+ 14 - 5
src/pages/device/Instance/Detail/Parsing/index.tsx


+ 1 - 1
src/pages/device/Instance/Detail/Running/Property/index.tsx

@@ -130,7 +130,7 @@ const Property = (props: Props) => {
               <PermissionButton
                 type={'link'}
                 onClick={() => {
-                  setVisible(true);
+                  setIndicatorVisible(true);
                   setCurrentInfo(record);
                 }}
                 tooltip={{

+ 14 - 7
src/pages/device/Instance/Detail/index.tsx

@@ -29,6 +29,7 @@ import { onlyMessage } from '@/utils/util';
 import Parsing from './Parsing';
 import EdgeMap from './EdgeMap';
 import MapChannel from './MapChannel';
+import { service as api } from '../../Product/index';
 
 export const deviceStatus = new Map();
 deviceStatus.set('online', <Badge status="success" text={'在线'} />);
@@ -327,13 +328,19 @@ const InstanceDetail = observer(() => {
                 placement: 'topLeft',
               }}
               isPermission={!!getMenuPathByCode(MENUS_CODE['device/Product'])}
-              onClick={() => {
-                const url = getMenuPathByParams(
-                  MENUS_CODE['device/Product/Detail'],
-                  InstanceModel.detail?.productId,
-                );
-                if (url) {
-                  history.replace(url);
+              onClick={async () => {
+                if (InstanceModel.detail?.productId) {
+                  //为了判断资产权限
+                  const res = await api.detail(InstanceModel.detail?.productId);
+                  if (res.status === 200) {
+                    const url = getMenuPathByParams(
+                      MENUS_CODE['device/Product/Detail'],
+                      InstanceModel.detail?.productId,
+                    );
+                    if (url) {
+                      history.replace(url);
+                    }
+                  }
                 }
               }}
             >

+ 23 - 1
src/pages/device/Instance/Import/index.tsx

@@ -64,6 +64,10 @@ const FileFormat = (props: any) => {
 };
 
 const NormalUpload = (props: any) => {
+  // console.log(props.fileType)
+  // console.log('-----', props.fileType.fileType)
+  // const { fileType } = props?.fileType
+
   const [importLoading, setImportLoading] = useState(false);
   const [flag, setFlag] = useState<boolean>(true);
   const [count, setCount] = useState<number>(0);
@@ -108,10 +112,26 @@ const NormalUpload = (props: any) => {
       <Space>
         <Upload
           action={`/${SystemConst.API_BASE}/file/static`}
-          accept={'.xlsx, .csv'}
+          // accept={'.xlsx, .csv'}
+          accept={props?.fileType?.fileType === 'csv' ? '.csv' : '.xlsx'}
           headers={{
             'X-Access-Token': Token.get(),
           }}
+          beforeUpload={(file) => {
+            console.log('-----', file);
+            const fileType = props?.fileType?.fileType === 'csv' ? 'csv' : 'xlsx';
+
+            const isCsv = file.type === 'text/csv';
+            const isXlsx =
+              file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
+            if (!isCsv && fileType !== 'xlsx') {
+              onlyMessage('请上传.csv格式文件', 'warning');
+            }
+            if (!isXlsx && fileType !== 'csv') {
+              onlyMessage('请上传.xlsx格式文件', 'warning');
+            }
+            return (isCsv && fileType !== 'xlsx') || (isXlsx && fileType !== 'csv');
+          }}
           onChange={async (info) => {
             if (info.file.status === 'done') {
               const resp: any = info.file.response || { result: '' };
@@ -216,6 +236,8 @@ const Import = (props: Props) => {
             product,
           };
         });
+        const value = field.value;
+        console.log('-----', value);
       });
       onFieldValueChange('upload', (field) => {
         if (!field.value) {

+ 4 - 1
src/pages/device/Instance/Save/index.tsx

@@ -92,7 +92,10 @@ const Save = (props: Props) => {
         delete values.id;
       }
       setLoading(true);
-      const resp = (await service.update(values)) as any;
+      const resp =
+        props.model === 'add'
+          ? await service.update(values)
+          : await service.modify(values.id, values);
       setLoading(false);
       if (resp.status === 200) {
         onlyMessage('保存成功');

+ 2 - 1
src/pages/device/Product/Detail/Access/AccessConfig/index.tsx

@@ -159,7 +159,8 @@ const AccessConfig = (props: Props) => {
       width={1200}
       title={'设备接入配置'}
       onOk={async () => {
-        if (!!current) {
+        if (current.id) {
+          console.log(current);
           const obj: any = {
             ...productModel.current,
             transportProtocol: current?.transport,

+ 1 - 1
src/pages/device/Product/Detail/index.tsx

@@ -331,7 +331,7 @@ const ProductDetail = observer(() => {
         // </Tooltip>
       }
       subTitle={
-        permission.update ? (
+        permission.action ? (
           <Popconfirm
             title={productModel.current?.state === 1 ? '确认禁用' : '确认启用'}
             onConfirm={() => {

+ 11 - 3
src/pages/device/components/Metadata/Base/Edit/index.tsx

@@ -800,15 +800,23 @@ const Edit = observer((props: Props) => {
                         // triggerType: 'onBlur',
                         validator: (value: any) => {
                           return new Promise((resolve) => {
-                            const number = Number(value);
-                            if (number <= 0 || value.length > 64 || /[.]/.test(value)) {
-                              resolve('请输入非0正整数,最多可输入64个字符');
+                            if (value) {
+                              const number = Number(value);
+                              if (number <= 0 || value.length > 64 || /[.]/.test(value)) {
+                                resolve('请输入非0正整数,最多可输入64个字符');
+                              } else {
+                                resolve('');
+                              }
                             } else {
                               resolve('');
                             }
                           });
                         },
                       },
+                      {
+                        required: true,
+                        message: `请输入步长`,
+                      },
                     ],
                     'x-reactions': [
                       {

+ 8 - 4
src/pages/edge/Device/Save/index.tsx

@@ -2,7 +2,7 @@ import { Col, Form, Input, Modal, Row, Select } from 'antd';
 import { service } from '@/pages/device/Instance';
 import { useEffect, useState } from 'react';
 import { useIntl } from '@@/plugin-locale/localeExports';
-import { UploadImage } from '@/components';
+import { PermissionButton, UploadImage } from '@/components';
 import { debounce } from 'lodash';
 import encodeQuery from '@/utils/encodeQuery';
 import { onlyMessage } from '@/utils/util';
@@ -25,6 +25,7 @@ const Save = (props: Props) => {
   const [loading, setLoading] = useState(false);
   const [visible, setVisible] = useState(false);
   const [form] = Form.useForm();
+  const { permission } = PermissionButton.usePermission('device/Product');
 
   useEffect(() => {
     if (data && Object.keys(data).length) {
@@ -243,14 +244,16 @@ const Save = (props: Props) => {
             </Form.Item>
           </Col>
           <Col span={2} style={{ margin: '35px 0 0 0' }}>
-            <a
-              style={{ marginLeft: 10 }}
+            <PermissionButton
+              isPermission={permission.add}
+              type="link"
+              disabled={!!data?.id}
               onClick={() => {
                 setVisible(true);
               }}
             >
               <PlusOutlined />
-            </a>
+            </PermissionButton>
           </Col>
         </Row>
         <Row>
@@ -276,6 +279,7 @@ const Save = (props: Props) => {
         close={() => {
           setVisible(false);
         }}
+        deviceType={'gateway'}
         reload={(productId: string, name: string) => {
           form.setFieldsValue({ productId });
           productList.push({

+ 5 - 1
src/pages/edge/Resource/index.tsx

@@ -49,12 +49,16 @@ export default () => {
     </PermissionButton>,
     <PermissionButton
       type={'link'}
+      disabled={record.state.value === 'disabled'}
       onClick={() => {
         setCurrent(record);
         setIssueVisible(true);
       }}
       tooltip={{
-        title: type !== 'list' ? '' : '下发',
+        title:
+          type !== 'list'
+            ? `${record.state.value === 'disabled' ? '请先启用,再下发' : undefined}`
+            : '下发',
       }}
       style={{ padding: 0 }}
       isPermission={permission.setting}

+ 9 - 11
src/pages/home/device/index.tsx

@@ -17,9 +17,7 @@ const Device = () => {
   const rulePermission = PermissionButton.usePermission('rule-engine/Instance').permission;
 
   const [productCount, setProductCount] = useState<number>(0);
-  const [productMessage, setProductMessage] = useState<string>();
   const [deviceCount, setDeviceCount] = useState<number>(0);
-  const [deviceMessage, setDeviceMessage] = useState<string>();
 
   const [productVisible, setProductVisible] = useState<boolean>(false);
   const [deviceVisible, setDeviceVisible] = useState<boolean>(false);
@@ -29,9 +27,9 @@ const Device = () => {
     if (resp.status === 200) {
       setProductCount(resp.result);
     }
-    if (resp.status === 403) {
-      setProductMessage('暂无权限');
-    }
+    // if (resp.status === 403) {
+    //   setProductMessage('暂无权限');
+    // }
   };
 
   const getDeviceCount = async () => {
@@ -39,9 +37,9 @@ const Device = () => {
     if (resp.status === 200) {
       setDeviceCount(resp.result);
     }
-    if (resp.status === 403) {
-      setDeviceMessage('暂无权限');
-    }
+    // if (resp.status === 403) {
+    //   setDeviceMessage('暂无权限');
+    // }
   };
 
   useEffect(() => {
@@ -84,7 +82,7 @@ const Device = () => {
       },
     },
   ];
-
+  console.log(!!productPermission.view);
   return (
     <Row gutter={24}>
       <Col span={14}>
@@ -103,13 +101,13 @@ const Device = () => {
               name: '产品数量',
               value: productCount,
               children: require('/public/images/home/top-2.svg'),
-              permission: productMessage,
+              permission: !!productPermission.view ? '' : '暂无权限',
             },
             {
               name: '设备数量',
               value: deviceCount,
               children: '',
-              permission: deviceMessage,
+              permission: !!devicePermission.view ? '' : '暂无权限',
             },
           ]}
           title="设备统计"

+ 20 - 18
src/pages/media/Device/Save/SaveProduct.tsx

@@ -9,6 +9,7 @@ interface SaveProps {
   reload: (id: string, data: any) => void;
   type: string;
   close?: () => void;
+  deviceType?: string;
 }
 
 export default (props: SaveProps) => {
@@ -50,7 +51,7 @@ export default (props: SaveProps) => {
   const onSubmit = async () => {
     const formData = await form.validateFields();
     if (formData) {
-      formData.deviceType = 'device';
+      formData.deviceType = props.deviceType ? props.deviceType : 'device';
       setLoading(true);
       const resp = await service.saveProduct(formData);
       if (resp.status === 200) {
@@ -112,23 +113,24 @@ export default (props: SaveProps) => {
         >
           <Input placeholder={'请输入产品名称'} />
         </Form.Item>
-        {extendFormItem.map((item: any) => {
-          let messageType = '请输入';
-          if (item.type === 'enum') {
-            messageType = '请选择';
-          }
-          return (
-            <Form.Item
-              name={item.name}
-              label={item.label}
-              required={item.required}
-              rules={[{ required: true, message: `${messageType}${item.label}` }]}
-              initialValue={item.value}
-            >
-              {handlerItem(item.type, item.label, item.options)}
-            </Form.Item>
-          );
-        })}
+        {props.deviceType !== 'gateway' &&
+          extendFormItem.map((item: any) => {
+            let messageType = '请输入';
+            if (item.type === 'enum') {
+              messageType = '请选择';
+            }
+            return (
+              <Form.Item
+                name={item.name}
+                label={item.label}
+                required={item.required}
+                rules={[{ required: true, message: `${messageType}${item.label}` }]}
+                initialValue={item.value}
+              >
+                {handlerItem(item.type, item.label, item.options)}
+              </Form.Item>
+            );
+          })}
         <Form.Item
           name={'accessId'}
           label={'接入网关'}

+ 1 - 0
src/pages/notice/Config/index.tsx

@@ -177,6 +177,7 @@ const Config = observer(() => {
         <PermissionButton
           style={{ padding: 0 }}
           type="link"
+          isPermission={configPermission.delete}
           popConfirm={{
             onConfirm: async () => {
               await service.remove(record.id);

+ 12 - 15
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/TypeModel.tsx

@@ -1,5 +1,5 @@
 import ParamsSelect, { ItemProps } from '@/pages/rule-engine/Scene/Save/components/ParamsSelect';
-import { useEffect, useState } from 'react';
+import { useEffect, useRef, useState } from 'react';
 import { Input, InputNumber, Select, Tree } from 'antd';
 import MTimePicker from '../../../components/ParamsSelect/components/MTimePicker';
 import moment from 'moment';
@@ -36,14 +36,8 @@ export default observer((props: Props) => {
   const [builtInList, setBuiltInList] = useState<any[]>([]);
   const [labelValue, setLabelValue] = useState<any>('');
   const [open, setOpen] = useState<boolean>(false);
+  const optionMap = useRef<Map<string, any>>(new Map());
 
-  const filterLabel = (nodes: any[]) => {
-    let lable: any;
-    nodes.forEach((item) => {
-      lable = item.children?.find((it: any) => it.id === props.value);
-    });
-    return lable?.description;
-  };
   const filterParamsData = (type?: string, data?: any[]): any[] => {
     if (type && data) {
       return data.filter((item) => {
@@ -52,6 +46,7 @@ export default observer((props: Props) => {
           item.children = _children;
           return _children.length ? true : false;
         } else if (item.type === type) {
+          optionMap.current.set(item.id, item);
           return true;
         }
         return false;
@@ -69,14 +64,14 @@ export default observer((props: Props) => {
     };
     queryBuiltInParams(FormModel.current, _params).then((res: any) => {
       if (res.status === 200) {
+        optionMap.current.clear();
         const _data = BuiltInParamsHandleTreeData(res.result);
         const filterData = filterParamsData(props.type, _data);
-        // console.log('_data', _data);
-        // console.log('filterData', filterData);
-        // console.log('type',props.type)
         setBuiltInList(filterData);
-        const label = filterLabel(filterData);
-        setLabelValue(label);
+        if (props.value) {
+          const label = optionMap.current.get(props.value);
+          setLabelValue(label?.description);
+        }
       }
     });
   };
@@ -98,14 +93,16 @@ export default observer((props: Props) => {
   useEffect(() => {
     setValue(props.value);
     // setLabelValue(props.label);
-    // console.log('typemodel', props.value);
   }, [props.value]);
 
   useEffect(() => {
     setLabelValue(props.label);
-    console.log('-------', props.label);
   }, []);
 
+  useEffect(() => {
+    DeviceModel.actionName = labelValue;
+  }, [labelValue]);
+
   const renderNode = (type: string) => {
     switch (type) {
       case 'int':

+ 16 - 8
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/WriteProperty.tsx

@@ -28,7 +28,7 @@ export default (props: Props) => {
   const ref = useRef<any>('');
 
   useEffect(() => {
-    // console.log(props.value);
+    // console.log('props.value----', props.value);
     if (props.value) {
       if (props.properties && props.properties.length) {
         if (0 in props.value) {
@@ -37,11 +37,14 @@ export default (props: Props) => {
           setPropertiesValue(undefined);
         } else {
           Object.keys(props.value).forEach((key: string) => {
+            const it =
+              props.value[key].source === 'fixed'
+                ? props.value[key]?.value
+                : props.value[key]?.upperKey;
             setPropertiesId(key);
-            setPropertiesValue(props.value[key].value);
+            setPropertiesValue(it);
             setSource(props.value[key].source);
             const propertiesItem = props.properties.find((item: any) => item.id === key);
-            // console.log(propertiesItem,'11111111')
             if (propertiesItem) {
               setPropertiesType(propertiesItem.valueType.type);
               if (propertiesItem.valueType.type === 'enum') {
@@ -51,7 +54,6 @@ export default (props: Props) => {
                   (item: any) => item.value === props.value[key].value,
                 )?.text;
                 setLabel(text);
-                // console.log(text);
               }
             }
           });
@@ -63,18 +65,24 @@ export default (props: Props) => {
   }, [props.properties]);
 
   useEffect(() => {
-    if (props.onChange) {
+    if (props.onChange && propertiesValue) {
       const obj = {
         [propertiesId || 0]: {
           value: propertiesValue,
           source: source,
         },
       };
+      const upperObj = {
+        [propertiesId || 0]: {
+          upperKey: propertiesValue,
+          source: source,
+        },
+      };
       //处理枚举外部回显
       if (ref.current) {
-        props.onChange(obj, textRef.current, ref.current);
+        props.onChange(source === 'upper' ? upperObj : obj, textRef.current, ref.current);
       } else {
-        props.onChange(obj, textRef.current);
+        props.onChange(source === 'upper' ? upperObj : obj, textRef.current);
       }
     }
   }, [propertiesValue, source]);
@@ -135,7 +143,7 @@ export default (props: Props) => {
               }
             }}
             onChange={(value, sources, text) => {
-              // console.log(value, sources);
+              console.log(value, sources);
               // console.log(text);
               ref.current = text;
               setPropertiesValue(value);

+ 45 - 5
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/functionCall.tsx

@@ -23,9 +23,10 @@ interface FunctionCallProps {
 export default (props: FunctionCallProps) => {
   const [editableKeys, setEditableRowKeys] = useState<React.Key[]>([]);
   const formRef = useRef<ProFormInstance<any>>();
+  const [data, setData] = useState<any>([]);
 
   useEffect(() => {
-    console.log(props.value, props.functionData);
+    // console.log('----props', props.value);
     if (props.functionData && props.functionData.length) {
       setEditableRowKeys(props.functionData.map((d) => d.id));
       if (props.value) {
@@ -35,17 +36,22 @@ export default (props: FunctionCallProps) => {
             return {
               ...item,
               value: oldValue.value,
+              source: oldValue?.source,
+              upperKey: oldValue?.upperKey,
             };
           }
           return item;
         });
+        // console.log('----tableData',tableData)
         formRef.current?.setFieldsValue({
           table: tableData,
         });
+        setData(tableData);
       } else {
         formRef.current?.setFieldsValue({
           table: props.functionData,
         });
+        setData(props.functionData);
       }
     } else {
       formRef.current?.setFieldsValue({
@@ -65,11 +71,24 @@ export default (props: FunctionCallProps) => {
         branchGroup={props.branchGroup}
         thenName={props.thenName}
         format={record?.format}
+        source={record?.source}
+        onChange={(value, source) => {
+          record.source = source;
+          record.value = value;
+          record.upperKey = value;
+
+          const arr = data.filter((item: any) => item.id !== record.id);
+          if (value && source) {
+            formRef.current?.setFieldsValue({
+              table: [...arr, record],
+            });
+          }
+        }}
       />
     );
   };
 
-  const columns: ProColumns<FunctionTableDataType>[] = [
+  const columns: ProColumns<any>[] = [
     {
       dataIndex: 'name',
       title: '参数名称',
@@ -98,17 +117,38 @@ export default (props: FunctionCallProps) => {
       formRef={formRef}
       name={props.name || 'proForm'}
       submitter={false}
-      onValuesChange={() => {
-        const values = formRef.current?.getFieldsValue();
-        // console.log(values, 'values');
+      onValuesChange={async () => {
+        const values = await formRef.current?.validateFields();
+        console.log('------values', values.table);
+        const arr = values.table.map((item: any) => {
+          if (item.source === 'fixed') {
+            return {
+              name: item.id,
+              value: item.value,
+              source: item.source,
+            };
+          } else {
+            return {
+              name: item.id,
+              upperKey: item.value,
+              source: item.source,
+            };
+          }
+        });
+        console.log('------arr', arr);
         if (props.onChange) {
           props.onChange(
             values.table.map((item: any) => ({
               name: item.id,
               value: item.value,
+              upperKey: item.value,
+              source: item.source,
             })),
           );
         }
+        // if (props.onChange) {
+        //   props.onChange(arr);
+        // }
       }}
     >
       <EditableProTable

+ 7 - 2
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/index.tsx

@@ -80,6 +80,8 @@ export default observer((props: Props) => {
             format: datum.valueType ? datum.valueType.format : undefined,
             options: datum.valueType ? datum.valueType.elements : undefined,
             value: undefined,
+            source: undefined,
+            upperKey: undefined,
           });
         }
         setFunctionList(array);
@@ -187,6 +189,7 @@ export default observer((props: Props) => {
           <Form.Item
             name={['message', 'properties']}
             label="设置属性"
+            required
             rules={[
               // { required: true, message: '请选择属性' },
               () => ({
@@ -212,12 +215,14 @@ export default observer((props: Props) => {
               }}
               onChange={(value, text, valueLable) => {
                 const item = value[Object.keys(value)?.[0]]?.value;
-                console.log(item);
+                const item1 = value[Object.keys(value)?.[0]]?.upperKey;
+                const source = value[Object.keys(value)?.[0]]?.source;
+                console.log(value);
                 DeviceModel.propertiesName = text;
                 if (valueLable) {
                   DeviceModel.propertiesValue = valueLable;
                 } else {
-                  DeviceModel.propertiesValue = item;
+                  DeviceModel.propertiesValue = source === 'fixed' ? item : item1;
                 }
               }}
               onRest={(value: any) => {

+ 1 - 1
src/pages/rule-engine/Scene/Save/action/DeviceOutput/index.tsx

@@ -166,7 +166,7 @@ export default observer((props: Props) => {
     if (_options.selector === 'variable') {
       _options.name = DeviceModel.selectorValues?.[0]?.name;
     }
-    console.log('----------', item, _options, DeviceModel.propertiesValue);
+    // console.log('----------', item, _options, DeviceModel.propertiesValue);
     props.save(item, _options);
     init();
   };

+ 3 - 2
src/pages/rule-engine/Scene/Save/action/ListItem/FilterCondition.tsx

@@ -364,7 +364,7 @@ export default observer((props: FilterProps) => {
               setValue({
                 ...v,
               });
-
+              console.log('node.column-----', node, v);
               if (v.source === 'upper') {
                 if (!node.metadata) {
                   columnsRef.current[1] = node.column;
@@ -372,8 +372,9 @@ export default observer((props: FilterProps) => {
                   columnsRef.current.splice(1, 1);
                 }
               } else {
-                columnsRef.current.length = 1;
+                columnsRef.current = [];
               }
+
               props.onColumns(columnsRef.current);
               labelCache.current[2] = { 0: lb };
               labelCache.current[3] = props.data.type;

+ 3 - 0
src/pages/rule-engine/Scene/Save/action/ListItem/FilterGroup.tsx

@@ -91,6 +91,7 @@ export default observer((props: TermsProps) => {
                   rules={[
                     {
                       validator(_, v) {
+                        // console.log('-----v',v)
                         if (v !== undefined) {
                           if (!Object.keys(v).length) {
                             return Promise.reject(new Error('该数据已发生变更,请重新配置'));
@@ -162,6 +163,7 @@ export default observer((props: TermsProps) => {
                       });
                     }}
                     onValueChange={(data) => {
+                      // console.log('----data',data)
                       const newList = [...listRef.current];
                       newList[index] = {
                         ...item,
@@ -173,6 +175,7 @@ export default observer((props: TermsProps) => {
                       });
                     }}
                     onColumns={(_columns) => {
+                      console.log('_columns-----', _columns);
                       set(optionsColumnsRef.current, [props.name, index], _columns);
                       props.onColumnsChange(optionsColumnsRef.current);
                     }}

+ 2 - 0
src/pages/rule-engine/Scene/Save/action/ListItem/Item.tsx

@@ -409,6 +409,8 @@ export default (props: ItemProps) => {
                   label={props.options?.terms?.[index]}
                   actionColumns={props.options?.otherColumns}
                   onColumnsChange={(columns) => {
+                    console.log('-----', columns);
+
                     const filterColumns = new Set(flattenDeep(columns)); // 平铺去重
                     let newColumns = [...filterColumns.values()];
                     if (optionsRef.current?.otherColumns) {

+ 3 - 1
src/pages/rule-engine/Scene/Save/action/ListItem/List.tsx

@@ -9,6 +9,7 @@ import { pick } from 'lodash';
 import { Button } from 'antd';
 import { PlusOutlined } from '@ant-design/icons';
 import classNames from 'classnames';
+import { randomString } from '@/utils/util';
 
 interface ListProps {
   branchesName: number;
@@ -87,7 +88,8 @@ export default (props: ListProps) => {
           branchGroup={props.parallel ? 1 : 0}
           branchesName={props.branchesName}
           data={{
-            key: `${props.type}_${props.actions.length}`,
+            // key: `${props.type}_${props.actions.length}`,
+            key: randomString(),
           }}
           close={() => {
             setVisible(false);

+ 5 - 1
src/pages/rule-engine/Scene/Save/components/Buttons/Dropdown.tsx

@@ -148,7 +148,11 @@ const DropdownButton = (props: DropdownButtonProps) => {
         className={classNames(styles['dropdown-button'], props.className, typeClassName)}
         onClick={() => {
           console.log(props.options, myValue, FormModel.current.trigger?.device);
-          if (!FormModel.current.trigger?.device && props.type !== 'termType') {
+          if (
+            FormModel.current.trigger?.type === 'device' &&
+            !FormModel.current.trigger?.device &&
+            props.type !== 'termType'
+          ) {
             onlyMessage('请先配置设备触发规则', 'warning');
           }
           if (props.options.length === 0 && props.type === 'termType') {

+ 1 - 1
src/pages/rule-engine/Scene/Save/components/Buttons/ParamsDropdown.tsx

@@ -279,7 +279,7 @@ export default (props: ParamsDropdownProps) => {
     if (props.metricsOptions) {
       let _value = props.value?.value;
       if ('name' in props) {
-        _value = props.value?.value[props.name!];
+        _value = props.value?.value?.[props.name!];
       }
       findLabel(_value, props.metricsOptions || [], 'name');
     }

+ 11 - 6
src/pages/rule-engine/Scene/Save/components/ShakeLimit/index.tsx

@@ -40,13 +40,18 @@ export default (props: ShakeLimitProps) => {
   };
 
   const timeChange = (value: number | null) => {
-    setTime(value);
-    props.onChange?.('time', value);
+    if (value) {
+      setTime(value);
+      props.onChange?.('time', value);
+      console.log(value);
+    }
   };
 
   const thresholdChange = (value: number | null) => {
-    setThreshold(value);
-    props.onChange?.('threshold', value);
+    if (value) {
+      setThreshold(value);
+      props.onChange?.('threshold', value);
+    }
   };
 
   const alarmFirstChange = (value: boolean) => {
@@ -66,7 +71,7 @@ export default (props: ShakeLimitProps) => {
       {enabled ? (
         <>
           <InputNumber
-            min={0}
+            min={1}
             max={100}
             precision={0}
             value={time}
@@ -76,7 +81,7 @@ export default (props: ShakeLimitProps) => {
           />
           <span>秒内发送</span>
           <InputNumber
-            min={0}
+            min={1}
             max={100}
             precision={0}
             value={threshold}

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

@@ -37,8 +37,8 @@ export const defaultBranches = [
     key: 'branches_1',
     shakeLimit: {
       enabled: false,
-      time: 0,
-      threshold: 0,
+      time: 1,
+      threshold: 1,
       alarmFirst: false,
     },
     then: [],

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

@@ -73,8 +73,8 @@ export default observer((props: Props) => {
             key: 'branches_' + key,
             shakeLimit: {
               enabled: false,
-              time: 0,
-              threshold: 0,
+              time: 1,
+              threshold: 1,
               alarmFirst: false,
             },
             then: [],
@@ -96,8 +96,8 @@ export default observer((props: Props) => {
       key: key,
       shakeLimit: {
         enabled: false,
-        time: 0,
-        threshold: 0,
+        time: 1,
+        threshold: 1,
         alarmFirst: false,
       },
       then: [],

+ 51 - 16
src/pages/rule-engine/Scene/Save/terms/paramsItem.tsx

@@ -63,6 +63,7 @@ export const handleOptionsLabel = (data: any, type?: string) => {
       const c = data[0];
       const t = data[1];
       const v = data[2];
+      const range = data[4];
       const termsTypeKey = {
         eq: '等于_value',
         neq: '不等于_value',
@@ -85,12 +86,16 @@ export const handleOptionsLabel = (data: any, type?: string) => {
       };
       const _value = isObject(v) ? Object.values(v) : [v];
       const typeStr = type ? typeKey[type] : '';
-      if (DoubleFilter.includes(t)) {
+      if (DoubleFilter.includes(t) && !range) {
         const str = termsTypeKey[t].replace('_value', _value[0]).replace('_value2', _value[1]);
         return `${c} ${str} ${typeStr} `;
+      } else if (DoubleFilter.includes(t) && !!range) {
+        const str = termsTypeKey[t].replace('_value和_value2', _value[0]);
+        return `${c} ${str} ${typeStr} `;
+      } else {
+        const str = termsTypeKey[t].replace('_value', _value[0]);
+        return `${c} ${str} ${typeStr} `;
       }
-      const str = termsTypeKey[t].replace('_value', _value[0]);
-      return `${c} ${str} ${typeStr} `;
     } catch (e) {
       return data;
     }
@@ -104,6 +109,7 @@ const ParamsItem = observer((props: ParamsItemProps) => {
   const [valueOptions] = useState<any>(undefined);
   const [metricsOptions, setMetricsOptions] = useState<any[]>([]);
   const [valueType, setValueType] = useState('');
+  const [isRange, setIsRange] = useState<boolean>(false);
 
   const { paramOptions, valueOptions: paramsValueOptions } = useOption(props.options, 'column');
 
@@ -176,7 +182,11 @@ const ParamsItem = observer((props: ParamsItemProps) => {
   useEffect(() => {
     setTermType(props.data.termType || '');
     setValue(props.data.value);
+    // console.log(props.data.value,'-----')
     setColumn(props.data.column || '');
+    // if(props.data.value?.source === 'metric'){
+    //   setIsRange(true)
+    // }
     ValueRef.current = props.data || {};
     convertLabelValue(props.data.column);
     if (!firstLockRef.current) {
@@ -191,9 +201,19 @@ const ParamsItem = observer((props: ParamsItemProps) => {
   }, [props.options]);
 
   useEffect(() => {
-    labelCache.current = props.label || [undefined, undefined, {}, 'and'];
+    labelCache.current = props.label || [undefined, undefined, {}, 'and', ''];
   }, [props.label]);
 
+  useEffect(() => {
+    if (props.data.value?.source === 'metric') {
+      const arr = metricsOptions.filter((item: any) => item.range);
+      // console.log(arr)
+      if (arr.length !== 0) {
+        setIsRange(true);
+      }
+    }
+  }, [metricsOptions]);
+
   return (
     <div className="terms-params-item">
       {!props.isFirst && (
@@ -293,11 +313,11 @@ const ParamsItem = observer((props: ParamsItemProps) => {
             });
           }}
         />
-        {DoubleFilter.includes(termType) && !metricsOptions.length ? (
+        {DoubleFilter.includes(termType) && !isRange ? (
           <>
             <ParamsDropdown
               options={valueOptions}
-              metricsOptions={metricsOptions.filter((mItem) => {
+              metricsOptions={metricsOptions?.filter((mItem) => {
                 if (ValueRef.current.termType && DoubleFilter.includes(ValueRef.current.termType)) {
                   return mItem.range;
                 } else {
@@ -315,6 +335,13 @@ const ParamsItem = observer((props: ParamsItemProps) => {
                   value: [v.value, ValueRef.current.value?.value?.[1]],
                   source: v.source,
                 };
+                // console.log('-----',v.source,v.value)
+                if (v.source === 'metric' && v.value) {
+                  setIsRange(true);
+                  _myValue.value = v.value;
+                } else {
+                  setIsRange(false);
+                }
                 ValueRef.current.value = _myValue;
                 setValue(_myValue);
                 labelCache.current[2] = { ...labelCache.current[2], 0: lb };
@@ -326,14 +353,14 @@ const ParamsItem = observer((props: ParamsItemProps) => {
             />
             <ParamsDropdown
               options={valueOptions}
-              metricsOptions={metricsOptions.filter((mItem) => {
-                if (ValueRef.current.termType && DoubleFilter.includes(ValueRef.current.termType)) {
-                  return mItem.range;
-                } else {
-                  return !mItem.range;
-                }
-              })}
-              isMetric={!!metricsOptions.length}
+              // metricsOptions={metricsOptions?.filter((mItem) => {
+              //   if (ValueRef.current.termType && DoubleFilter.includes(ValueRef.current.termType)) {
+              //     return mItem.range;
+              //   } else {
+              //     return !mItem.range;
+              //   }
+              // })}
+              // isMetric={!!metricsOptions.length}
               type="value"
               placeholder="参数值"
               valueType={valueType}
@@ -370,22 +397,30 @@ const ParamsItem = observer((props: ParamsItemProps) => {
             valueType={valueType}
             value={value}
             onChange={(v, lb, item) => {
+              console.log('-----', v, lb, item);
               const _value = { ...v };
               if (item) {
                 _value.metric = item.id;
               }
               setValue(_value);
+              if (v.source === 'metric' && v.value) {
+                setIsRange(true);
+              } else {
+                setIsRange(false);
+              }
               ValueRef.current.value = v;
               if (!!metricsOptions.length) {
-                if (DoubleFilter.includes(termType)) {
-                  labelCache.current[2] = { 0: v?.value[0], 1: v?.value[1] };
+                if (DoubleFilter.includes(termType) && !isRange) {
+                  labelCache.current[2] = { 0: v?.value?.[0], 1: v?.value?.[1] };
                 } else {
                   labelCache.current[2] = { 0: lb };
+                  labelCache.current[4] = 'range';
                 }
               } else {
                 labelCache.current[2] = { 0: lb };
               }
               labelCache.current[3] = props.data.type;
+              console.log('labelCache------', [...labelCache.current]);
               props.onLabelChange?.([...labelCache.current]);
               valueEventChange(_value);
             }}

+ 5 - 0
src/pages/system/Apply/Save/index.less

@@ -48,6 +48,11 @@
       background-color: #fff;
       border-color: #1d39c4;
       box-shadow: none;
+      opacity: 1;
+    }
+
+    .ant-radio-button-wrapper-disabled {
+      opacity: 0.5;
     }
   }
 }

+ 7 - 4
src/pages/system/Basis/index.tsx

@@ -1,5 +1,5 @@
 import { UploadImage } from '@/components';
-import { Card, Col, Form, Input, Row, Select } from 'antd';
+import { Card, Col, Form, Input, Row, Select, Switch } from 'antd';
 import Service from './service';
 import { useModel } from '@@/plugin-model/useModel';
 import usePermissions from '@/hooks/permission';
@@ -60,9 +60,6 @@ const Basis = () => {
           properties: {
             'base-path': formData['base-path'],
           },
-          // properties: {
-          //   basePath: formData.basePath,
-          // },
         },
       ];
       const res = await service.save(item);
@@ -119,6 +116,12 @@ const Basis = () => {
               >
                 <Input placeholder="请输入" />
               </Form.Item>
+              <Form.Item label="备案信息" name="record" hidden>
+                <Input placeholder="请输入" />
+              </Form.Item>
+              <Form.Item label="首页推荐" name="recommend" valuePropName="checked" hidden>
+                <Switch />
+              </Form.Item>
               <Row gutter={[24, 24]}>
                 <Col>
                   <Form.Item

+ 14 - 0
src/pages/system/DataSource/Management/DataTable.tsx

@@ -61,6 +61,20 @@ const DataTable = (props: Props) => {
           {
             validateId: true,
           },
+          {
+            validator: (value: any) => {
+              return new Promise((resolve) => {
+                if (value) {
+                  const first = value.slice(0, 1);
+                  if (typeof Number(first) === 'number' && !isNaN(Number(first))) {
+                    resolve('不能以数字开头');
+                  } else {
+                    resolve('');
+                  }
+                }
+              });
+            },
+          },
         ],
         required: true,
       },

+ 9 - 4
src/pages/system/Department/Assets/deivce/bind.tsx

@@ -143,6 +143,10 @@ const Bind = observer((props: Props) => {
   const unSelect = () => {
     Models.bindKeys = [];
     AssetsModel.params = {};
+    Store.set('assets-device', {
+      delete: true,
+      id: 'rest',
+    });
   };
 
   const getSelectedRowsKey = (selectedRows: any) => {
@@ -211,6 +215,7 @@ const Bind = observer((props: Props) => {
         <Switch
           checkedChildren="开"
           unCheckedChildren="关"
+          defaultChecked={true}
           onChange={(e) => {
             setIsAll(e);
             Store.set('assets-device', {
@@ -334,7 +339,7 @@ const Bind = observer((props: Props) => {
               } else {
                 Models.bindKeys = Models.bindKeys.filter((item) => item !== record.id);
                 bindChecks.current.set(record.id, ['read']);
-                Store.set('assets-product', {
+                Store.set('assets-device', {
                   isAll: false,
                   id: record.id,
                   delete: true,
@@ -390,9 +395,9 @@ const Bind = observer((props: Props) => {
               code: resp.message,
               result: {
                 data: newData as DeviceItem[],
-                pageIndex: 0,
-                pageSize: 0,
-                total: 0,
+                pageIndex: resp.result.pageIndex,
+                pageSize: resp.result.pageIndex,
+                total: resp.result.total,
               },
               status: resp.status,
             };

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

@@ -300,7 +300,13 @@ export default observer((props: { parentId: string }) => {
         <PermissionButton
           icon={<DisconnectOutlined />}
           key="unBind"
-          onClick={handleUnBind}
+          popConfirm={{
+            title: intl.formatMessage({
+              id: 'pages.system.role.option.unBindUser',
+              defaultMessage: '是否批量解除绑定',
+            }),
+            onConfirm: handleUnBind,
+          }}
           isPermission={permission.bind}
         >
           {intl.formatMessage({

+ 26 - 9
src/pages/system/Department/Assets/product/bind.tsx

@@ -36,6 +36,8 @@ const Bind = observer((props: Props) => {
   const [checkAssets, setCheckAssets] = useState<string[]>(['read']);
   const [isAll, setIsAll] = useState<boolean>(true);
   const bindChecks = useRef(new Map());
+  const recordRef = useRef<any>([]);
+  const recordMap = new Map();
 
   const columns: ProColumns<any>[] = [
     {
@@ -139,7 +141,7 @@ const Bind = observer((props: Props) => {
 
   const handleBind = () => {
     if (Models.bindKeys.length) {
-      setLoading(true);
+      // setLoading(true);
       const _data: any[] = [];
       bindChecks.current.forEach((value, key) => {
         _data.push({
@@ -150,6 +152,7 @@ const Bind = observer((props: Props) => {
           permission: value,
         });
       });
+      // console.log(_data)
       service.bind('product', _data).subscribe({
         next: () => onlyMessage('操作成功'),
         error: () => onlyMessage('操作失败', 'error'),
@@ -168,6 +171,10 @@ const Bind = observer((props: Props) => {
   const unSelect = () => {
     Models.bindKeys = [];
     AssetsModel.params = {};
+    Store.set('assets-product', {
+      id: 'rest',
+      delete: true,
+    });
   };
 
   const getSelectedRowsKey = (selectedRows: any) => {
@@ -217,13 +224,21 @@ const Bind = observer((props: Props) => {
               options={props.assetsType}
               value={checkAssets}
               onChange={(e: any) => {
+                recordRef.current?.forEach((it: any) => {
+                  recordMap.set(it.id, it.permissionInfoList);
+                });
+                // console.log(recordMap)
                 Store.set('assets-product', {
                   isAll: isAll,
                   assets: e,
                   bindKeys: Models.bindKeys,
                 });
                 bindChecks.current.forEach((_, key) => {
-                  bindChecks.current.set(key, e);
+                  const arr = recordMap
+                    .get(key)
+                    .filter?.((item: any) => e.includes(item.id))
+                    .map((it: any) => it.id);
+                  bindChecks.current.set(key, arr);
                 });
                 setCheckAssets(e);
               }}
@@ -270,7 +285,6 @@ const Bind = observer((props: Props) => {
           // onReset={() => {
           //   // 重置分页及搜索参数
           //   actionRef.current?.reset?.();
-          //   setSearchParam({});
           // }}
           target="department-assets-product"
         />
@@ -311,7 +325,9 @@ const Bind = observer((props: Props) => {
               // },
               onSelect: (record: any, selected, selectedRows) => {
                 if (selected) {
-                  // console.log('---------',record.permissionInfoList)
+                  const arr = record.permissionInfoList
+                    .map((it: any) => it.id)
+                    .filter?.((item: any) => checkAssets.includes(item));
                   const isShare = record.permissionInfoList.find(
                     (item: any) => item.id === 'share',
                   );
@@ -319,7 +335,8 @@ const Bind = observer((props: Props) => {
                     Models.bindKeys = [
                       ...new Set([...Models.bindKeys, ...getSelectedRowsKey(selectedRows)]),
                     ];
-                    bindChecks.current.set(record.id, checkAssets);
+                    bindChecks.current.set(record.id, arr);
+                    console.log('checkAssets----', arr);
                   } else {
                     onlyMessage('该资产不支持共享', 'warning');
                   }
@@ -385,14 +402,14 @@ const Bind = observer((props: Props) => {
                   console.log('--------', newData);
                 }
               }
-
+              recordRef.current = newData;
               return {
                 code: resp.message,
                 result: {
                   data: newData as ProductItem[],
-                  pageIndex: 0,
-                  pageSize: 0,
-                  total: 0,
+                  pageIndex: resp.result.pageIndex,
+                  pageSize: resp.result.pageIndex,
+                  total: resp.result.total,
                 },
                 status: resp.status,
               };

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

@@ -37,6 +37,7 @@ export default observer((props: { parentId: string }) => {
   const [updateId, setUpdateId] = useState<string | string[]>('');
   const [permissions, setPermissions] = useState<string[]>(['read']);
   const [assetsType, setAssetsType] = useState([]);
+  const recordRef = useRef<any>([]);
 
   // 资产类型的权限定义
   const getAssetsType = () => {
@@ -304,6 +305,14 @@ export default observer((props: { parentId: string }) => {
           key="update"
           isPermission={permission.assert}
           onClick={() => {
+            const arr = recordRef.current.map((item: any) => item.grantedPermissions);
+            console.log(arr);
+            //求权限交集
+            const list = arr.reduce((total: any, next: any) => {
+              return [...total].filter((item) => new Set(next).has(item));
+            });
+            setPermissions(list);
+            // console.log(list)
             if (Models.unBindKeys.length) {
               setUpdateId([...Models.unBindKeys]);
               setUpdateVisible(true);
@@ -440,9 +449,11 @@ export default observer((props: { parentId: string }) => {
         rowSelection={{
           selectedRowKeys: Models.unBindKeys,
           // onChange: (selectedRowKeys, selectedRows) => {
-          //   Models.unBindKeys = selectedRows.map((item) => item.id);
+          //   console.log(selectedRows)
           // },
           onSelect: (record, selected, selectedRows) => {
+            recordRef.current = selectedRows;
+            // console.log('selectedRows',selectedRows)
             if (selected) {
               Models.unBindKeys = [
                 ...new Set([...Models.unBindKeys, ...getSelectedRowsKey(selectedRows)]),

+ 2 - 2
src/pages/system/Department/Assets/updateModal.tsx

@@ -60,8 +60,8 @@ export default (props: UpdateModalProps) => {
         permissions: props.permissions,
       });
     }
-    // console.log('1------------', props.assetsType)
-    // console.log('2------------', props.permissions)
+    console.log('1------------', props.assetsType);
+    console.log('2------------', props.permissions);
     const item = props.assetsType.filter((it: any) => props.permissions.indexOf(it.value) > -1);
     setOptions(item);
   }, [props.permissions, form]);

+ 17 - 0
src/pages/system/Menu/Detail/edit.tsx

@@ -167,6 +167,23 @@ export default (props: EditProps) => {
                     rules={[
                       { required: true, message: '请输入编码' },
                       { max: 64, message: '最多可输入64个字符' },
+
+                      () => ({
+                        async validator(_, value) {
+                          if (value) {
+                            const res = await service.isCode({ code: value, owner: 'iot' });
+                            if (res.result.passed) {
+                              return Promise.resolve();
+                            } else {
+                              if (props.data && props.data.code === value) {
+                                return Promise.resolve();
+                              } else {
+                                return Promise.reject(new Error('该编码重复'));
+                              }
+                            }
+                          }
+                        },
+                      }),
                     ]}
                   >
                     <Input placeholder={'请输入编码'} />

+ 1 - 1
src/pages/system/Platforms/Api/basePage.tsx

@@ -159,8 +159,8 @@ export default (props: TableProps) => {
                   style={{ padding: 0, width: '100%', textAlign: 'left' }}
                   onClick={() => {
                     console.log(record);
-                    ApiModel.swagger = record;
                     ApiModel.showTable = false;
+                    ApiModel.swagger = record;
                   }}
                 >
                   <span className={'ellipsis'}>{text}</span>

+ 30 - 9
src/pages/system/Platforms/Api/swagger-ui/base.tsx

@@ -29,6 +29,7 @@ export default observer(() => {
         return false;
       });
     }
+    // console.log('-----value',value)
     return value;
   };
 
@@ -130,21 +131,36 @@ export default observer(() => {
     return newEntity;
   };
 
-  const getResult = (name: string, oldName: string = '') => {
-    if (name === oldName) {
+  const getResult = (name: string, level = 1) => {
+    if (!ApiModel.components[name]) {
+      return [];
+    }
+    // console.log('level-------',level,name,oldName)
+
+    if (level >= 10) {
       // 禁止套娃
       return [];
     }
+    // debugger;
     const entity = cloneDeep(ApiModel.components[name].properties);
+    // console.log('entity---',entity,ApiModel.components[name])
+
     Object.keys(entity).forEach((key) => {
       const type = entity[key].type;
+      console.log('key', key);
+      // if(name===oldName) return;
+
       if ((entity[key].items && entity[key].items.$ref) || entity[key].$ref) {
         const _ref = entity[key].$ref || entity[key].items.$ref;
         const refName = _ref.split('/').pop();
+        // console.log('refName-----',refName,name,type)
+
         if (type === 'array') {
-          entity[key] = [getResult(refName, name)];
+          // console.log(entity[key])
+          entity[key] = [getResult(refName, level + 1)];
         } else {
-          entity[key] = getResult(refName, name);
+          entity[key] = getResult(refName, level + 1);
+          // console.log(entity[key])
         }
       } else if (type) {
         if (type.includes('integer')) {
@@ -156,6 +172,7 @@ export default observer(() => {
         }
       }
     });
+
     return entity;
   };
 
@@ -184,7 +201,7 @@ export default observer(() => {
         const refName = _ref.split('/').pop();
         if (refName) {
           obj.type = refName;
-          obj.children = handleResponseParam(refName, name);
+          // obj.children = handleResponseParam(refName, name);
         }
       }
       newArr.push(obj);
@@ -194,18 +211,22 @@ export default observer(() => {
 
   const handleResponse = () => {
     const newArr: any[] = [];
+    console.log('----', Object.keys(ApiModel.swagger.responses));
     Object.keys(ApiModel.swagger.responses).forEach((key) => {
       const refUrl = ObjectFindValue('$ref', ApiModel.swagger.responses[key]);
-      const entityName = refUrl.split('/').pop();
+      // console.log('1-----', refUrl, ApiModel.swagger.responses[key]);
+      const _entityName = refUrl.split('/').pop();
 
+      // console.log('2-------', _entityName);
       newArr.push({
         code: key,
         description: ApiModel.swagger.responses[key].description,
-        schema: key !== '400' ? entityName : '',
-        entityName: entityName,
-        result: key !== '400' ? getResult(entityName) : {},
+        schema: key !== '400' ? _entityName : '',
+        entityName: _entityName,
+        result: key !== '400' ? getResult(_entityName) : {},
       });
     });
+    // console.log(newArr);
     setResponseData(newArr);
   };
 

+ 39 - 19
src/pages/user/Login/index.tsx

@@ -106,7 +106,7 @@ const Login: React.FC = () => {
         const ico: any = document.querySelector('link[rel="icon"]');
         ico.href = res.result.ico;
         setBasis(res.result);
-        console.log(res.result);
+        // console.log(res.result);
         if (res.result.title) {
           document.title = res.result.title;
         } else {
@@ -114,6 +114,21 @@ const Login: React.FC = () => {
         }
       }
     });
+
+    //备案配置
+    // Service.detail(['record']).then((res) => {
+    //   if (res.status === 200) {
+    //     console.log(res.result);
+    //     const item = res.result?.filter((item: any) => item.scope === 'record');
+    //     setRecord(item?.[0].properties.record);
+    //   }
+    // })
+    // Service.settingDetail('amap').then((res) => {
+    //   if (res.status === 200) {
+    //     console.log(res.result);
+    //     setRecord(res.result)
+    //   }
+    // });
   }, []);
 
   const SchemaField = createSchemaField({
@@ -302,32 +317,37 @@ const Login: React.FC = () => {
               </div>
             </div>
           </div>
-
-          <div className={styles.bottom}>
-            <div className={styles.view}>JETLINKS团队全新力作可视化大屏系统</div>
-            <div className={styles.url}>
-              <div style={{ height: 33 }}>
-                <img src={viewLogo} />
+          {basis.recommend ? (
+            <div className={styles.bottom}>
+              <div className={styles.view}>JETLINKS团队全新力作可视化大屏系统</div>
+              <div className={styles.url}>
+                <div style={{ height: 33 }}>
+                  <img src={viewLogo} />
+                </div>
+                <a href={'https://view.jetlinks.cn/'} target="_blank" rel="noopener noreferrer">
+                  体验DEMO
+                </a>
               </div>
-              <a href={'https://view.jetlinks.cn/'} target="_blank" rel="noopener noreferrer">
-                体验DEMO
-              </a>
             </div>
-          </div>
+          ) : (
+            <div style={{ height: '8%' }}></div>
+          )}
         </div>
         <div className={styles.right}>
           <img
             src={basis.backgroud || require('/public/images/login.png')}
             style={{ width: '100%', height: '100%' }}
           />
-          <a
-            href={'https://beian.miit.gov.cn/#/Integrated/index'}
-            target="_blank"
-            rel="noopener noreferrer"
-            className={styles.records}
-          >
-            备案:渝ICP备19017719号-1
-          </a>
+          {basis.record && (
+            <a
+              href={'https://beian.miit.gov.cn/#/Integrated/index'}
+              target="_blank"
+              rel="noopener noreferrer"
+              className={styles.records}
+            >
+              {basis.record}
+            </a>
+          )}
         </div>
       </div>
     </Spin>

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

@@ -80,6 +80,11 @@ const Service = {
     request(`/${SystemConst.API_BASE}/application/${clientId}/info`, {
       method: 'GET',
     }),
+  detail: (data?: any) =>
+    request(`/${SystemConst.API_BASE}/system/config/scopes`, {
+      method: 'POST',
+      data,
+    }),
 };
 
 export default Service;