hear před 3 roky
rodič
revize
6ebd888222

+ 9 - 8
src/components/Metadata/ArrayParam/index.tsx

@@ -126,14 +126,15 @@ const ArrayParam = (props: Props) => {
                 message: '请选择时间格式',
               },
             ],
-            'x-reactions': {
-              dependencies: ['.type'],
-              fulfill: {
-                state: {
-                  visible: "{{['date'].includes($deps[0])}}",
-                },
-              },
-            },
+            'x-visible': false,
+            // 'x-reactions': {
+            //   dependencies: ['.type'],
+            //   fulfill: {
+            //     state: {
+            //       visible: "{{['date'].includes($deps[0])}}",
+            //     },
+            //   },
+            // },
           },
           expands: {
             type: 'object',

+ 10 - 9
src/components/Metadata/JsonParam/index.tsx

@@ -264,21 +264,22 @@ const JsonParam = observer((props: Props) => {
                       'x-component': 'Select',
                       enum: DateTypeList,
                       'x-visible': false,
-                      default: 'string',
+                      default: 'yyyy-MM-DD HH:mm:ss',
                       'x-validator': [
                         {
                           required: true,
                           message: '请选择时间格式',
                         },
                       ],
-                      'x-reactions': {
-                        dependencies: ['..valueType.type'],
-                        fulfill: {
-                          state: {
-                            visible: "{{['date'].includes($deps[0])}}",
-                          },
-                        },
-                      },
+                      // "x-hidden":true,
+                      // 'x-reactions': {
+                      //   dependencies: ['..valueType.type'],
+                      //   fulfill: {
+                      //     state: {
+                      //       visible: "{{['date'].includes($deps[0])}}",
+                      //     },
+                      //   },
+                      // },
                     },
                     expands: {
                       type: 'object',

+ 1 - 5
src/pages/device/Instance/Detail/Functions/form.tsx

@@ -78,11 +78,7 @@ export default (props: FunctionProps) => {
           //   }
           // </>
           // @ts-ignore
-          <DatePicker
-            format={record.format || 'YYYY-MM-DD HH:mm:ss'}
-            style={{ width: '100%' }}
-            showTime
-          />
+          <DatePicker format={'YYYY-MM-DD HH:mm:ss'} style={{ width: '100%' }} showTime />
         );
       default:
         return <Input placeholder={'请输入' + name} />;

+ 32 - 0
src/pages/device/components/InputSelect/index.tsx

@@ -0,0 +1,32 @@
+import { Select } from 'antd';
+import { connect, mapProps } from '@formily/react';
+import { useState } from 'react';
+import { LoadingOutlined } from '@ant-design/icons';
+
+const InputSelect = connect(
+  Select,
+  mapProps(
+    {
+      dataSource: 'options',
+      loading: true,
+    },
+    (props, field) => {
+      const [value, setValue] = useState(props.value);
+      return {
+        ...props,
+        value: value,
+        onChange: (item: any) => {
+          if (item.length > 1) {
+            setValue(item.slice(item.length - 1));
+          } else {
+            setValue(item);
+          }
+        },
+        suffixIcon:
+          field?.['loading'] || field?.['validating'] ? <LoadingOutlined /> : props.suffixIcon,
+      };
+    },
+  ),
+  // mapReadPretty(PreviewText.Input),
+);
+export default InputSelect;

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

@@ -47,13 +47,16 @@ import { lastValueFrom } from 'rxjs';
 import SystemConst from '@/utils/const';
 import DB from '@/db';
 import _ from 'lodash';
-import { InstanceModel } from '@/pages/device/Instance';
+// import { InstanceModel } from '@/pages/device/Instance';
 import FRuleEditor from '@/components/FRuleEditor';
 import FIndicators from '@/components/FIndicators';
 import { action } from '@formily/reactive';
 import { asyncUpdateMedata, updateMetadata } from '../../metadata';
 import { onlyMessage } from '@/utils/util';
 import Editable from '@/components/Metadata/EditTable';
+import InputSelect from '../../../InputSelect';
+import { InstanceModel, service as instanceService } from '@/pages/device/Instance';
+import { useParams } from 'umi';
 
 interface Props {
   type: 'product' | 'device';
@@ -63,6 +66,7 @@ interface Props {
 const Edit = observer((props: Props) => {
   const intl = useIntl();
   const [loading, setLoading] = useState<boolean>(false);
+  const param = useParams<{ id: string }>();
   const form = useMemo(
     () =>
       createForm({
@@ -173,6 +177,7 @@ const Edit = observer((props: Props) => {
       DatePicker,
       Switch,
       FIndicators,
+      InputSelect,
     },
     scope: {
       async asyncOtherConfig(field: Field) {
@@ -249,12 +254,13 @@ const Edit = observer((props: Props) => {
           defaultMessage: '单位',
         }),
         'x-decorator': 'FormItem',
-        'x-component': 'Select',
+        'x-component': 'InputSelect',
         'x-visible': false,
         'x-component-props': {
           showSearch: true,
           showArrow: true,
           allowClear: true,
+          mode: 'tags',
           filterOption: (input: string, option: any) =>
             option.label.toLowerCase().indexOf(input.toLowerCase()) >= 0,
         },
@@ -326,21 +332,22 @@ const Edit = observer((props: Props) => {
         'x-decorator': 'FormItem',
         'x-component': 'Select',
         enum: DateTypeList,
-        default: 'string',
+        // default: 'yyyy-MM-DD HH:mm:ss',
+        'x-visible': false,
         'x-validator': [
           {
             required: true,
             message: '请选择时间格式',
           },
         ],
-        'x-reactions': {
-          dependencies: ['.type'],
-          fulfill: {
-            state: {
-              visible: "{{['date'].includes($deps[0])}}",
-            },
-          },
-        },
+        // 'x-reactions': {
+        //   dependencies: ['.type'],
+        //   fulfill: {
+        //     state: {
+        //       visible: "{{['date'].includes($deps[0])}}",
+        //     },
+        //   },
+        // },
       },
       enumConfig: {
         title: intl.formatMessage({
@@ -1330,6 +1337,12 @@ const Edit = observer((props: Props) => {
   typeMap.set('device', InstanceModel.detail);
   const { type } = MetadataModel;
 
+  const resetMetadata = async () => {
+    const resp = await instanceService.detail(param.id);
+    if (resp.status === 200) {
+      InstanceModel.detail = resp?.result || [];
+    }
+  };
   const saveMetadata = async (deploy?: boolean) => {
     setLoading(true);
     let params;
@@ -1381,6 +1394,7 @@ const Edit = observer((props: Props) => {
         if (deploy) {
           Store.set('product-deploy', deploy);
         } else {
+          resetMetadata();
           message.success({
             key: 'metadata',
             content: '操作成功!',

+ 10 - 1
src/pages/device/components/Metadata/Base/index.tsx

@@ -14,12 +14,13 @@ import SystemConst from '@/utils/const';
 import { useIntl } from '@@/plugin-locale/localeExports';
 // import PropertyImport from '@/pages/device/Product/Detail/PropertyImport';
 import { productModel } from '@/pages/device/Product';
-import { InstanceModel } from '@/pages/device/Instance';
+// import { InstanceModel } from '@/pages/device/Instance';
 import { asyncUpdateMedata, removeMetadata } from '../metadata';
 import type { permissionType } from '@/hooks/permission';
 import { PermissionButton } from '@/components';
 import { onlyMessage } from '@/utils/util';
 import { message } from 'antd';
+import { InstanceModel, service as instanceService } from '@/pages/device/Instance';
 
 interface Props {
   type: MetadataType;
@@ -39,6 +40,13 @@ const BaseMetadata = observer((props: Props) => {
   typeMap.set('product', productModel.current);
   typeMap.set('device', InstanceModel.detail);
 
+  const resetMetadata = async () => {
+    const resp = await instanceService.detail(param.id);
+    if (resp.status === 200) {
+      InstanceModel.detail = resp?.result || [];
+    }
+  };
+
   const removeItem = async (record: MetadataItem) => {
     const removeDB = () => {
       return DB.getDB().table(`${type}`).delete(record.id!);
@@ -50,6 +58,7 @@ const BaseMetadata = observer((props: Props) => {
       Store.set(SystemConst.REFRESH_METADATA_TABLE, true);
       MetadataModel.edit = false;
       MetadataModel.item = {};
+      resetMetadata();
     } else {
       onlyMessage('操作失败!', 'error');
     }

+ 4 - 0
src/pages/device/components/Metadata/index.tsx

@@ -36,6 +36,10 @@ const Metadata = observer((props: Props) => {
   const resetMetadata = async () => {
     const resp = await instanceService.deleteMetadata(params.id);
     if (resp.status === 200) {
+      const res = await instanceService.detail(params.id);
+      if (res.status === 200) {
+        InstanceModel.detail = res?.result || [];
+      }
       onlyMessage('操作成功');
       Store.set(SystemConst.REFRESH_DEVICE, true);
       setTimeout(() => {

+ 2 - 2
src/pages/device/data.ts

@@ -121,8 +121,8 @@ export const DateTypeList = [
     value: 'yyyy-MM-dd',
   },
   {
-    label: 'yyyy-MM-dd HH:mm:ss',
-    value: 'yyyy-MM-dd HH:mm:ss',
+    label: 'yyyy-MM-DD HH:mm:ss',
+    value: 'yyyy-MM-DD HH:mm:ss',
   },
   // {
   //   label: 'yyyy-MM-dd HH:mm:ss EE',

+ 2 - 2
src/pages/iot-card/CardManagement/SaveModal.tsx

@@ -83,7 +83,7 @@ const Save = (props: SaveType) => {
           name={'id'}
           required
           rules={[
-            { required: true, message: '请输入卡号' },
+            // { required: true, message: '请输入卡号' },
             { max: 64, message: '最多可输入64个字符' },
             () => ({
               async validator(_, value) {
@@ -95,7 +95,7 @@ const Save = (props: SaveType) => {
                     return Promise.reject(new Error(`${validateId}`));
                   }
                 } else {
-                  return Promise.reject(new Error('请输入输入正确的卡号'));
+                  return Promise.reject(new Error('请输入卡号'));
                 }
               },
             }),

+ 5 - 4
src/pages/rule-engine/Scene/Save/action/DeviceOutput/actions/index.tsx

@@ -27,19 +27,19 @@ export default observer((props: Props) => {
       label: '功能调用',
       value: 'INVOKE_FUNCTION',
       image: require('/public/images/scene/invoke-function.png'),
-      tip: '-',
+      tip: '',
     },
     {
       label: '读取属性',
       value: 'READ_PROPERTY',
       image: require('/public/images/scene/read-property.png'),
-      tip: '-',
+      tip: '',
     },
     {
       label: '设置属性',
       value: 'WRITE_PROPERTY',
       image: require('/public/images/scene/write-property.png'),
-      tip: '-',
+      tip: '',
     },
   ];
 
@@ -208,11 +208,12 @@ export default observer((props: Props) => {
               }}
               onChange={(value, text, valueLable) => {
                 const item = value[Object.keys(value)?.[0]]?.value;
+                console.log(item);
                 DeviceModel.propertiesName = text;
                 if (valueLable) {
                   DeviceModel.propertiesValue = valueLable;
                 } else {
-                  DeviceModel.propertiesValue = `${item}`;
+                  DeviceModel.propertiesValue = item;
                 }
               }}
               onRest={(value: any) => {

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

@@ -103,7 +103,7 @@ export default observer((props: Props) => {
   const save = async () => {
     const value = await formRef.current?.validateFields();
 
-    const item = {
+    const item: any = {
       selector: DeviceModel.selector,
       source: DeviceModel.source,
       selectorValues: DeviceModel.selectorValues,
@@ -114,6 +114,9 @@ export default observer((props: Props) => {
     if (DeviceModel.selector === 'variable') {
       item.selector = 'fixed';
     }
+    if (DeviceModel.selector === 'relation') {
+      item.upperKey = 'deviceId';
+    }
     // console.log(item, value);
 
     const _options: any = {
@@ -154,11 +157,6 @@ export default observer((props: Props) => {
       }
     }
     if (_options.selector === 'tag') {
-      // _options.taglist = DeviceModel.selectorValues?.[0]?.value.map((it: any) => ({
-      //   name: it.column || it.name,
-      //   type: it.type ? (it.type === 'and' ? '并且' : '或者') : '',
-      //   value: it.value,
-      // }));
       _options.taglist = DeviceModel.tagList.map((it) => ({
         name: it.column || it.name,
         type: it.type ? (it.type === 'and' ? '并且' : '或者') : '',
@@ -168,7 +166,7 @@ export default observer((props: Props) => {
     if (_options.selector === 'variable') {
       _options.name = DeviceModel.selectorValues?.[0]?.name;
     }
-    console.log('----------', item, _options);
+    console.log('----------', item, _options, DeviceModel.propertiesValue);
     props.save(item, _options);
     init();
   };

+ 59 - 0
src/pages/rule-engine/Scene/Save/action/device/TypeTime.tsx

@@ -0,0 +1,59 @@
+import { TimePicker, DatePicker } from 'antd';
+import type { TimePickerProps } from 'antd/lib/time-picker';
+import moment from 'moment';
+import { useEffect, useState } from 'react';
+
+interface DatePickerFormat extends Omit<TimePickerProps, 'onChange'> {
+  onChange?: (dateString: string, date: moment.Moment | null) => void;
+}
+type Props = DatePickerFormat & {
+  type?: string;
+};
+
+export default (props: Props) => {
+  const [myValue, setMyValue] = useState<any>(props.value || undefined);
+
+  useEffect(() => {
+    setMyValue(props.value);
+    console.log('moment', props.value);
+  }, [props.value]);
+
+  return (
+    <div>
+      {props.type === 'time' ? (
+        <div>
+          <TimePicker
+            // {...props}
+            // value={myValue}
+            value={myValue ? moment(myValue, 'HH:mm:ss') : null}
+            onChange={(value, timeString) => {
+              setMyValue(value);
+              props.onChange?.(timeString, value);
+            }}
+            // @ts-ignore
+            getPopupContainer={(trigger) => {
+              return trigger && trigger?.parentNode ? trigger.parentNode : document.body;
+            }}
+          />
+        </div>
+      ) : (
+        <div>
+          {/* @ts-ignore */}
+          <DatePicker
+            showTime
+            // @ts-ignore
+            getPopupContainer={(trigger) => {
+              return trigger && trigger?.parentNode ? trigger.parentNode : document.body;
+            }}
+            // value={myValue}
+            value={myValue ? moment(myValue, 'yyyy-MM-DD HH:mm:ss') : ''}
+            onChange={(value, timeString) => {
+              setMyValue(value);
+              props.onChange?.(timeString, value);
+            }}
+          />
+        </div>
+      )}
+    </div>
+  );
+};

+ 1 - 1
src/pages/rule-engine/Scene/Save/action/device/functionCall.tsx

@@ -109,7 +109,7 @@ export default (props: FunctionCallProps) => {
           //   format={record.format || 'YYYY-MM-DD HH:mm:ss'}
           //   style={{ width: '100%' }}
           // />
-          <TypeTime type={record.type === 'yyyy-MM-dd' ? 'time' : 'date'} value={record.value} />
+          <TypeTime type={'date'} value={record.value} />
         );
       case 'object':
         return <ObjInput value={record.value} />;

+ 20 - 4
src/pages/system/Apply/Save/index.tsx

@@ -573,7 +573,7 @@ const Save = () => {
         gridSpan: 2,
         layout: 'vertical',
         labelAlign: 'left',
-        tooltip: '限制应用程序对用户账号的访问',
+        tooltip: '限制用户访问应用程序的权限',
       },
       'x-component': 'Input',
       'x-component-props': {
@@ -818,6 +818,22 @@ const Save = () => {
         placeholder: '请输入授权地址',
       },
     },
+    'apiClient.authConfig.oauth2.tokenUrl': {
+      type: 'string',
+      title: 'token地址',
+      'x-decorator': 'FormItem',
+      'x-decorator-props': {
+        gridSpan: 2,
+        layout: 'vertical',
+        labelAlign: 'left',
+        tooltip: '设置token令牌的地址',
+      },
+      required: true,
+      'x-component': 'Input',
+      'x-component-props': {
+        placeholder: '请输入token地址',
+      },
+    },
     'apiClient.authConfig.oauth2.redirectUri': {
       type: 'string',
       title: '回调地址',
@@ -1238,7 +1254,7 @@ const Save = () => {
                   gridSpan: 2,
                   layout: 'vertical',
                   labelAlign: 'left',
-                  tooltip: '授权知道后跳转到具体页面的回调地址',
+                  tooltip: '授权完成后跳转到具体页面的回调地址',
                 },
                 // required: true,
                 'x-component': 'Input',
@@ -1271,7 +1287,7 @@ const Save = () => {
                   gridSpan: 2,
                   layout: 'vertical',
                   labelAlign: 'left',
-                  tooltip: '为第三方应用用户分配角色,根据绑定的角色,进行系统菜单赋权',
+                  tooltip: '为应用用户分配角色,根据绑定的角色,进行系统菜单赋权',
                   addonAfter: (
                     <PermissionButton
                       type="link"
@@ -1319,7 +1335,7 @@ const Save = () => {
                   gridSpan: 2,
                   layout: 'vertical',
                   labelAlign: 'left',
-                  tooltip: '为第三方应用用户分配所属组织,根据绑定的组织,进行数据隔离',
+                  tooltip: '为应用用户分配所属组织,根据绑定的组织,进行数据隔离',
                   addonAfter: (
                     <PermissionButton
                       type="link"