瀏覽代碼

fix: 修改bug10.21_下午

100011797 3 年之前
父節點
當前提交
f7a49ef57d

+ 51 - 16
src/components/FIndicators/index.tsx

@@ -1,15 +1,29 @@
-import { Checkbox, InputNumber, Space, DatePicker, Input } from 'antd';
+import { Checkbox, InputNumber, DatePicker, Input, Select } from 'antd';
 import moment from 'moment';
+import { useEffect, useState } from 'react';
 
 interface Props {
   value: any;
   type: any;
+  enum: any;
   onChange: (value: any) => void;
 }
 
 const FIndicators = (props: Props) => {
   const { value, onChange, type } = props;
   const DatePicker1: any = DatePicker;
+  const [list, setList] = useState<any[]>([]);
+
+  useEffect(() => {
+    const arr = [];
+    if (!!props.enum?.falseText && props.enum?.falseValue !== undefined) {
+      arr.push({ text: props.enum?.falseText, value: props.enum?.falseValue });
+    }
+    if (!!props.enum?.trueText && props.enum?.trueValue !== undefined) {
+      arr.push({ text: props.enum?.trueText, value: props.enum?.trueValue });
+    }
+    setList(arr);
+  }, [props.enum]);
 
   const renderComponent = () => {
     if (['int', 'long', 'double', 'float'].includes(type)) {
@@ -82,6 +96,25 @@ const FIndicators = (props: Props) => {
           />
         );
       }
+    } else if (type === 'boolean') {
+      return (
+        <Select
+          style={{ width: '100%' }}
+          placeholder={'请选择'}
+          value={value?.value}
+          onChange={(val) => {
+            const obj = {
+              ...value,
+              value: [val],
+            };
+            onChange(obj);
+          }}
+        >
+          {list.map((item) => (
+            <Select.Option value={item.value}>{item.text}</Select.Option>
+          ))}
+        </Select>
+      );
     } else {
       return (
         <>
@@ -113,22 +146,24 @@ const FIndicators = (props: Props) => {
     }
   };
   return (
-    <Space align="baseline">
+    <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
       {renderComponent()}
-      <Checkbox
-        style={{ minWidth: 60 }}
-        checked={value?.range}
-        onChange={(e) => {
-          onChange({
-            ...value,
-            value: e.target.checked ? [undefined, undefined] : [undefined],
-            range: e.target.checked,
-          });
-        }}
-      >
-        范围
-      </Checkbox>
-    </Space>
+      {type !== 'boolean' && (
+        <Checkbox
+          style={{ minWidth: 60, marginLeft: 5 }}
+          checked={value?.range}
+          onChange={(e) => {
+            onChange({
+              ...value,
+              value: e.target.checked ? [undefined, undefined] : [undefined],
+              range: e.target.checked,
+            });
+          }}
+        >
+          范围
+        </Checkbox>
+      )}
+    </div>
   );
 };
 export default FIndicators;

+ 35 - 0
src/components/Metadata/ArrayParam/index.tsx

@@ -7,6 +7,7 @@ import { Store } from 'jetlinks-store';
 import JsonParam from '@/components/Metadata/JsonParam';
 import EnumParam from '@/components/Metadata/EnumParam';
 import BooleanEnum from '@/components/Metadata/BooleanParam';
+import { registerValidateRules } from '@formily/core';
 
 const ArrayParam = () => {
   const SchemaField = createSchemaField({
@@ -24,6 +25,24 @@ const ArrayParam = () => {
     },
   });
 
+  registerValidateRules({
+    checkLength(value) {
+      if (String(value).length > 64) {
+        return {
+          type: 'error',
+          message: '最多可输入64个字符',
+        };
+      }
+      if (!(value % 1 === 0)) {
+        return {
+          type: 'error',
+          message: '请输入非0正整数',
+        };
+      }
+      return '';
+    },
+  });
+
   const schema: ISchema = {
     type: 'object',
     properties: {
@@ -53,6 +72,14 @@ const ArrayParam = () => {
             title: '精度',
             'x-decorator': 'FormItem',
             'x-component': 'NumberPicker',
+            'x-component-props': {
+              min: 1,
+            },
+            'x-validator': [
+              {
+                checkLength: true,
+              },
+            ],
             'x-reactions': {
               dependencies: ['.type'],
               fulfill: {
@@ -105,9 +132,17 @@ const ArrayParam = () => {
                 title: '最大长度',
                 'x-decorator': 'FormItem',
                 'x-component': 'NumberPicker',
+                'x-component-props': {
+                  min: 1,
+                },
                 'x-decorator-props': {
                   tooltip: '字节',
                 },
+                'x-validator': [
+                  {
+                    checkLength: true,
+                  },
+                ],
                 'x-reactions': {
                   dependencies: ['..type'],
                   fulfill: {

+ 35 - 0
src/components/Metadata/JsonParam/index.tsx

@@ -11,6 +11,7 @@ import EnumParam from '@/components/Metadata/EnumParam';
 import ArrayParam from '@/components/Metadata/ArrayParam';
 import { useIntl } from '@/.umi/plugin-locale/localeExports';
 import Editable from '../EditTable';
+import { registerValidateRules } from '@formily/core';
 
 // 不算是自定义组件。只是抽离了JSONSchema
 interface Props {
@@ -45,6 +46,24 @@ const JsonParam = observer((props: Props) => {
       return _data;
     });
 
+  registerValidateRules({
+    checkLength(value) {
+      if (String(value).length > 64) {
+        return {
+          type: 'error',
+          message: '最多可输入64个字符',
+        };
+      }
+      if (!(value % 1 === 0)) {
+        return {
+          type: 'error',
+          message: '请输入非0正整数',
+        };
+      }
+      return '';
+    },
+  });
+
   const schema: ISchema = {
     type: 'object',
     properties: {
@@ -242,6 +261,14 @@ const JsonParam = observer((props: Props) => {
                               defaultMessage: '字节',
                             }),
                           },
+                          'x-component-props': {
+                            min: 1,
+                          },
+                          'x-validator': [
+                            {
+                              checkLength: true,
+                            },
+                          ],
                           'x-reactions': {
                             dependencies: ['..type'],
                             fulfill: {
@@ -261,6 +288,14 @@ const JsonParam = observer((props: Props) => {
                   'x-decorator': 'FormItem',
                   'x-component': 'NumberPicker',
                   'x-visible': false,
+                  'x-validator': [
+                    {
+                      checkLength: true,
+                    },
+                  ],
+                  'x-component-props': {
+                    min: 1,
+                  },
                   'x-reactions': {
                     dependencies: ['..valueType.type'],
                     fulfill: {

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

@@ -212,12 +212,7 @@ const Save = (props: Props) => {
               rules={[
                 {
                   required: true,
-                  message: intlFormat(
-                    'pages.form.tip.select.props',
-                    '请选择所属产品',
-                    'pages.device.instanceDetail.deviceType',
-                    '设备类型',
-                  ),
+                  message: '请选择所属产品',
                 },
               ]}
               tooltip={'只能选择“正常”状态的产品'}

+ 21 - 5
src/pages/device/Product/index.tsx

@@ -22,7 +22,7 @@ import SearchComponent from '@/components/SearchComponent';
 import { getMenuPathByParams, MENUS_CODE } from '@/utils/menu';
 import { PermissionButton, ProTableCard } from '@/components';
 import ProductCard from '@/components/ProTableCard/CardItems/product';
-import { downloadObject, onlyMessage } from '@/utils/util';
+import { downloadObject, isNoCommunity, onlyMessage } from '@/utils/util';
 import { service as categoryService } from '@/pages/device/Category';
 import { service as deptService } from '@/pages/system/Department';
 import { omit } from 'lodash';
@@ -267,10 +267,26 @@ const Product = observer(() => {
       hideInTable: true,
       request: () =>
         service.getProviders().then((resp: any) => {
-          return (resp?.result || []).map((item: any) => ({
-            label: item.name,
-            value: item.id,
-          }));
+          if (isNoCommunity) {
+            return (resp?.result || []).map((item: any) => ({
+              label: item.name,
+              value: item.id,
+            }));
+          } else {
+            return (resp?.result || [])
+              .filter((i: any) =>
+                [
+                  'mqtt-server-gateway',
+                  'http-server-gateway',
+                  'mqtt-client-gateway',
+                  'tcp-server-gateway',
+                ].includes(i.id),
+              )
+              .map((item: any) => ({
+                label: item.name,
+                value: item.id,
+              }));
+          }
         }),
     },
     {

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

@@ -13,7 +13,6 @@ import {
   ArrayItems,
   Checkbox,
   DatePicker,
-  Editable,
   Form,
   FormGrid,
   FormItem,
@@ -37,7 +36,6 @@ import { productModel } from '@/pages/device/Product';
 import { service } from '@/pages/device/components/Metadata';
 import { Store } from 'jetlinks-store';
 import type { MetadataItem } from '@/pages/device/Product/typings';
-
 import JsonParam from '@/components/Metadata/JsonParam';
 import ArrayParam from '@/components/Metadata/ArrayParam';
 import EnumParam from '@/components/Metadata/EnumParam';
@@ -54,6 +52,7 @@ 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';
 
 interface Props {
   type: 'product' | 'device';
@@ -209,6 +208,21 @@ const Edit = observer((props: Props) => {
       const reg = new RegExp('^[0-9a-zA-Z_\\\\-]+$');
       return reg.exec(value) ? '' : 'ID只能由数字、字母、下划线、中划线组成';
     },
+    checkLength(value) {
+      if (String(value).length > 64) {
+        return {
+          type: 'error',
+          message: '最多可输入64个字符',
+        };
+      }
+      if (!(value % 1 === 0)) {
+        return {
+          type: 'error',
+          message: '请输入非0正整数',
+        };
+      }
+      return '';
+    },
   });
   const valueTypeConfig = {
     type: 'object',
@@ -216,7 +230,12 @@ const Edit = observer((props: Props) => {
     properties: {
       type: {
         title: schemaTitleMapping[MetadataModel.type].title,
-        required: true,
+        'x-validator': [
+          {
+            required: true,
+            message: `请选择${schemaTitleMapping[MetadataModel.type].title}`,
+          },
+        ],
         'x-decorator': 'FormItem',
         'x-component': 'Select',
         default: MetadataModel.type === 'events' ? 'object' : null,
@@ -342,6 +361,14 @@ const Edit = observer((props: Props) => {
                 defaultMessage: '字节',
               }),
             },
+            'x-component-props': {
+              min: 1,
+            },
+            'x-validator': [
+              {
+                checkLength: true,
+              },
+            ],
             'x-reactions': {
               dependencies: ['..type'],
               fulfill: {
@@ -448,7 +475,7 @@ const Edit = observer((props: Props) => {
         },
         {
           required: true,
-          message: '请输入名',
+          message: '请输入名',
         },
       ],
     },
@@ -483,7 +510,12 @@ const Edit = observer((props: Props) => {
               defaultMessage: '来源',
             }),
             'x-disabled': MetadataModel.action === 'edit',
-            required: true,
+            'x-validator': [
+              {
+                required: true,
+                message: `请选择来源`,
+              },
+            ],
             'x-decorator': 'FormItem',
             'x-component': 'Select',
             enum: PropertySource,
@@ -666,7 +698,12 @@ const Edit = observer((props: Props) => {
           },
           type: {
             title: MetadataModel.type === 'tags' ? '标签类型' : '读写类型',
-            required: true,
+            'x-validator': [
+              {
+                required: true,
+                message: `请输入${MetadataModel.type === 'tags' ? '标签类型' : '读写类型'}`,
+              },
+            ],
             'x-decorator': 'FormItem',
             'x-component': 'Select',
             'x-component-props': {
@@ -720,7 +757,7 @@ const Edit = observer((props: Props) => {
             'x-decorator-props': {
               tooltip: '场景联动页面可引用指标配置作为触发条件',
             },
-            'x-visible': props.type === 'product',
+            // 'x-visible': props.type === 'product',
             items: {
               type: 'object',
               'x-decorator': 'ArrayItems.Item',
@@ -808,11 +845,12 @@ const Edit = observer((props: Props) => {
                         layout: 'vertical',
                       },
                       'x-reactions': {
-                        dependencies: ['valueType.type'],
+                        dependencies: ['valueType.type', 'valueType'],
                         fulfill: {
                           state: {
                             componentProps: {
                               type: '{{$deps[0]}}',
+                              enum: '{{$deps[1]}}',
                             },
                           },
                         },
@@ -829,7 +867,7 @@ const Edit = observer((props: Props) => {
                                 return Promise.reject(new Error('请输入指标值'));
                               }
                             } else {
-                              if (value?.value && !value?.value[0]) {
+                              if (value?.value !== undefined && value?.value[0] === undefined) {
                                 return Promise.reject(new Error('请输入指标值'));
                               }
                             }
@@ -1050,7 +1088,12 @@ const Edit = observer((props: Props) => {
               id: 'pages.device.productDetail.metadata.level',
               defaultMessage: 'level',
             }),
-            required: true,
+            'x-validator': [
+              {
+                required: true,
+                message: '请选择级别',
+              },
+            ],
             'x-decorator': 'FormItem',
             'x-component': 'Select',
             enum: EventLevel,

+ 9 - 1
src/pages/link/DashBoard/index.tsx

@@ -10,6 +10,7 @@ import './index.less';
 import useSendWebsocketMessage from '@/hooks/websocket/useSendWebsocketMessage';
 import { map } from 'rxjs/operators';
 import Echarts, { echarts } from '@/components/DashBoard/echarts';
+import { isNoCommunity } from '@/utils/util';
 
 type RefType = {
   getValues: Function;
@@ -193,8 +194,9 @@ export default () => {
 
   const [subscribeTopic] = useSendWebsocketMessage();
 
-  const { data: serverNode } = useRequest(service.serverNode, {
+  const { data: serverNode, run: serverNodeRun } = useRequest(service.serverNode, {
     formatResult: (res) => res.result.map((item: any) => ({ label: item.name, value: item.id })),
+    manual: true,
   });
 
   const arrayReverse = (data: any[]): any[] => {
@@ -660,6 +662,12 @@ export default () => {
   }, [serverId]);
 
   useEffect(() => {
+    if (isNoCommunity) {
+      serverNodeRun();
+    }
+  }, []);
+
+  useEffect(() => {
     if (serverNode && serverNode.length) {
       setServerId(serverNode[0].value);
     }

+ 25 - 3
src/pages/notice/Template/Detail/index.tsx

@@ -34,7 +34,7 @@ import { Card, Col, Row, Tooltip } from 'antd';
 import { typeList } from '@/pages/notice';
 import { configService, service, state } from '@/pages/notice/Template';
 import FBraftEditor from '@/components/FBraftEditor';
-import { onlyMessage, useAsyncDataSource } from '@/utils/util';
+import { onlyMessage, phoneRegEx, useAsyncDataSource } from '@/utils/util';
 import WeixinCorp from '@/pages/notice/Template/Detail/doc/WeixinCorp';
 import WeixinApp from '@/pages/notice/Template/Detail/doc/WeixinApp';
 import DingTalk from '@/pages/notice/Template/Detail/doc/DingTalk';
@@ -982,7 +982,7 @@ const Detail = observer(() => {
                           placeholder: '请输入模版ID',
                         },
                       },
-                      calledShowNumbers: {
+                      calledNumber: {
                         title: '被叫号码',
                         'x-component': 'Input',
                         'x-decorator': 'FormItem',
@@ -998,11 +998,22 @@ const Detail = observer(() => {
                             max: 64,
                             message: '最多可输入64个字符',
                           },
+                          {
+                            validator: (value: string) => {
+                              return new Promise((resolve) => {
+                                if (!value) resolve('');
+                                if (!phoneRegEx(value)) {
+                                  resolve('请输入有效号码');
+                                }
+                                resolve('');
+                              });
+                            },
+                          },
                         ],
                       },
                     },
                   },
-                  calledNumber: {
+                  calledShowNumbers: {
                     title: '被叫显号',
                     'x-component': 'Input',
                     'x-decorator': 'FormItem',
@@ -1017,6 +1028,17 @@ const Detail = observer(() => {
                         max: 64,
                         message: '最多可输入64个字符',
                       },
+                      {
+                        validator: (value: string) => {
+                          return new Promise((resolve) => {
+                            if (!value) resolve('');
+                            if (!phoneRegEx(value)) {
+                              resolve('请输入有效号码');
+                            }
+                            resolve('');
+                          });
+                        },
+                      },
                     ],
                   },
                   PlayTimes: {

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

@@ -237,7 +237,6 @@ const Template = observer(() => {
               isPermission={templatePermission.add}
               onClick={() => {
                 state.current = undefined;
-                console.log(id);
                 history.push(getMenuPathByParams(MENUS_CODE['notice/Template/Detail'], id));
               }}
               key="button"

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

@@ -5,6 +5,7 @@ import { AlarmLogModel } from './model';
 import TabComponent from './TabComponent';
 import Service from './service';
 import { Store } from 'jetlinks-store';
+import { isNoCommunity } from '@/utils/util';
 
 export const service = new Service('alarm/record');
 
@@ -31,6 +32,24 @@ const Log = observer(() => {
       tab: '其他',
     },
   ];
+  const noList = [
+    {
+      key: 'all',
+      tab: '全部',
+    },
+    {
+      key: 'product',
+      tab: '产品',
+    },
+    {
+      key: 'device',
+      tab: '设备',
+    },
+    {
+      key: 'other',
+      tab: '其他',
+    },
+  ];
 
   useEffect(() => {
     service.queryDefaultLevel().then((resp) => {
@@ -46,7 +65,7 @@ const Log = observer(() => {
       onTabChange={(key: string) => {
         AlarmLogModel.tab = key;
       }}
-      tabList={list}
+      tabList={isNoCommunity ? list : noList}
       tabActiveKey={AlarmLogModel.tab}
     >
       <TabComponent type={AlarmLogModel.tab} />

+ 15 - 6
src/pages/rule-engine/DashBoard/index.tsx

@@ -14,6 +14,7 @@ import encodeQuery from '@/utils/encodeQuery';
 import useHistory from '@/hooks/route/useHistory';
 import { getMenuPathByCode } from '@/utils/menu';
 import { Empty } from '@/components';
+import { isNoCommunity } from '@/utils/util';
 
 const service = new Service();
 export const state = model<{
@@ -494,12 +495,20 @@ const Dashboard = observer(() => {
             key: 'targetType',
             Children: (
               <Select
-                options={[
-                  { label: '设备', value: 'device' },
-                  { label: '产品', value: 'product' },
-                  { label: '组织', value: 'org' },
-                  { label: '其它', value: 'other' },
-                ]}
+                options={
+                  isNoCommunity
+                    ? [
+                        { label: '设备', value: 'device' },
+                        { label: '产品', value: 'product' },
+                        { label: '组织', value: 'org' },
+                        { label: '其它', value: 'other' },
+                      ]
+                    : [
+                        { label: '设备', value: 'device' },
+                        { label: '产品', value: 'product' },
+                        { label: '其它', value: 'other' },
+                      ]
+                }
               />
             ),
           }}

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

@@ -117,6 +117,7 @@ export enum MENUS_CODE {
   'device/Product/Detail/BaseInfo' = 'device/Product/Detail/BaseInfo',
   'device/Product/Detail' = 'device/Product/Detail',
   'link/AccessConfig/Detail' = 'link/AccessConfig/Detail',
+  'link/DashBoard' = 'link/DashBoard',
   'system/Menu/Detail' = 'system/Menu/Detail',
   'system/Department/Detail' = 'system/Department/Detail',
   'link/Type/Detail' = 'link/Type/Detail',
@@ -215,6 +216,7 @@ export const CommunityCodeList = [
   'link/AccessConfig',
   'link/AccessConfig/Detail',
   'link/Protocol',
+  'link/DashBoard',
   'Log',
   'link/Type',
   'link/Type/Detail',

+ 12 - 0
src/utils/util.ts

@@ -130,3 +130,15 @@ export const onlyMessage = (
   });
 
 export const isNoCommunity = !(localStorage.getItem(SystemConst.Version_Code) === 'community');
+/**
+ * 座机号+手机号校验
+ * @param value
+ * @returns {boolean}
+ */
+export const phoneRegEx = (value: string) => {
+  const phone = new RegExp(
+    '^(((\\+86)|(\\+86-))|((86)|(86\\-))|((0086)|(0086\\-)))?1[3|5|7|8]\\d{9}$',
+  );
+  const mobile = /(0[0-9]{2,3})([2-9][0-9]{6,7})+([0-9]{8,11})?$/;
+  return phone.test(value) || mobile.test(value);
+};