Explorar o código

fix: #4504、4515、4499、4491、4496

xieyonghong %!s(int64=3) %!d(string=hai) anos
pai
achega
da267b80b9

+ 4 - 1
src/components/ProTableCard/CardItems/scene.tsx

@@ -4,6 +4,7 @@ import { TableCard } from '@/components';
 import '@/style/common.less';
 import '../index.less';
 import type { SceneItem } from '@/pages/rule-engine/Scene/typings';
+import { Tooltip } from 'antd';
 
 export interface DeviceCardProps extends SceneItem {
   tools: React.ReactNode[];
@@ -36,7 +37,9 @@ export default (props: DeviceCardProps) => {
         </div>
         <div className={'card-item-body'}>
           <div className={'card-item-header'}>
-            <span className={'card-item-header-name ellipsis'}>{props.name}</span>
+            <span className={'card-item-header-name ellipsis'}>
+              <Tooltip title={props.name}>{props.name}</Tooltip>
+            </span>
           </div>
           <div className={'card-item-content'}>
             <div>

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

@@ -217,7 +217,7 @@ export default observer((props: ActionProps) => {
                 { label: '设备输出', value: 'device' },
                 { label: '延迟执行', value: 'delay' },
               ]}
-              placeholder={'请选择动作方式'}
+              placeholder={'请选择执行条件'}
               style={{ width: '100%' }}
             />
           </Form.Item>

+ 4 - 0
src/pages/rule-engine/Scene/Save/action/device/deviceModal.tsx

@@ -115,6 +115,10 @@ export default (props: DeviceModelProps) => {
           title={'设备'}
           width={880}
           onOk={() => {
+            if (!selectKeys.length) {
+              message.warning('请勾选设备');
+              return;
+            }
             if (props.onChange) {
               props.onChange(selectKeys);
             }

+ 22 - 1
src/pages/rule-engine/Scene/Save/action/messageContent.tsx

@@ -30,6 +30,7 @@ export default (props: MessageContentProps) => {
                 const type = item.expands?.businessType || item.type;
                 const _name = [props.name, 'notify', 'variables', item.id];
                 let initialValue = undefined;
+                const rules = [];
                 if (type === 'user') {
                   initialValue = {
                     source: 'relation',
@@ -41,9 +42,29 @@ export default (props: MessageContentProps) => {
                     value: undefined,
                   };
                 }
+                if (item.required) {
+                  rules.push({
+                    validator: async (_: any, value: any) => {
+                      if (!value.value) {
+                        if (['date'].includes(type)) {
+                          return Promise.reject(new Error('请选择' + item.name));
+                        } else {
+                          return Promise.reject(new Error('请输入' + item.name));
+                        }
+                      }
+                      return Promise.resolve();
+                    },
+                  });
+                }
                 return (
                   <Col span={12} key={`${item.id}_${index}`}>
-                    <Form.Item name={_name} label={item.name} initialValue={initialValue}>
+                    <Form.Item
+                      name={_name}
+                      label={item.name}
+                      initialValue={initialValue}
+                      required={!!item.required}
+                      rules={rules}
+                    >
                       {type === 'user' ? (
                         <UserList
                           notifyType={props.notifyType}

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

@@ -99,16 +99,6 @@ export default (props: TimingTrigger) => {
     [data],
   );
 
-  const cronChange = useCallback(
-    (e: any) => {
-      onChange({
-        trigger: data.trigger,
-        cron: e.target.value,
-      });
-    },
-    [data],
-  );
-
   const TimeTypeAfter = (
     <Select
       value={data.period?.unit || 'seconds'}
@@ -171,10 +161,15 @@ export default (props: TimingTrigger) => {
             />
           ) : (
             <Input
-              value={data.cron}
+              value={props.value?.cron}
               placeholder={'请输入cron表达式'}
               style={{ width: 400 }}
-              onChange={cronChange}
+              onChange={(e) => {
+                onChange({
+                  trigger: data.trigger,
+                  cron: e.target.value,
+                });
+              }}
             />
           )}
         </ItemGroup>

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 51 - 3
src/pages/rule-engine/Scene/Save/index.tsx


+ 25 - 22
src/pages/rule-engine/Scene/index.tsx

@@ -33,6 +33,18 @@ const Scene = () => {
   const [searchParams, setSearchParams] = useState<any>({});
   const history = useHistory();
 
+  const deleteById = async (id: string) => {
+    const alarmResp = await service.sceneByAlarm(id);
+    if (alarmResp.status === 200 && !alarmResp.result) {
+      const resp: any = await service.remove(id);
+      if (resp.status === 200) {
+        actionRef.current?.reload();
+      }
+    } else {
+      message.warning('该场景已绑定告警,不可删除');
+    }
+  };
+
   const Tools = (record: any, type: 'card' | 'table'): React.ReactNode[] => {
     return [
       <PermissionButton
@@ -125,33 +137,24 @@ const Scene = () => {
         type={'link'}
         style={{ padding: 0 }}
         isPermission={permission.delete}
+        disabled={record.state.value === 'started'}
         popConfirm={{
-          title: intl.formatMessage({
-            id:
-              record.state.value === 'started'
-                ? 'pages.data.option.remove.tips'
-                : 'pages.device.instance.deleteTip',
-          }),
+          title: '确认删除?',
           disabled: record.state.value === 'started',
-          onConfirm: async () => {},
+          onConfirm: () => {
+            deleteById(record.id);
+          },
+        }}
+        tooltip={{
+          title:
+            record.state.value === 'started' ? (
+              <span>请先禁用该场景,再删除</span>
+            ) : (
+              <span>删除</span>
+            ),
         }}
-        tooltip={
-          type === 'table'
-            ? {
-                title: intl.formatMessage({
-                  id: 'pages.device.instance.deleteTip',
-                  defaultMessage: '删除',
-                }),
-              }
-            : undefined
-        }
       >
         <DeleteOutlined />
-        {type === 'table' &&
-          intl.formatMessage({
-            id: 'pages.data.option.edit',
-            defaultMessage: '编辑',
-          })}
       </PermissionButton>,
     ];
   };

+ 6 - 41
src/pages/rule-engine/Scene/service.ts

@@ -1,6 +1,7 @@
 import { request } from '@@/plugin-request/request';
 import BaseService from '@/utils/BaseService';
 import type { SceneItem } from '@/pages/rule-engine/Scene/typings';
+import SystemConst from '@/utils/const';
 // import { defer, from, lastValueFrom, shareReplay } from 'rxjs';
 // import { filter, map } from 'rxjs/operators';
 
@@ -16,48 +17,12 @@ class Service extends BaseService<SceneItem> {
       method: 'POST',
       data,
     }).then((resp) => resp.result);
-  // getParseTerm = (data: Record<string, any>) => {
-  //   const oldParams = Store.get('request-params-parse-term');
-  //   const list = Store.get('parse-term');
-  //   const f = list && _.isEqual(oldParams, data);
-  //   console.log(oldParams, list, f, data, 'request');
-  //   return f ? new Promise(resolve => {
-  //     resolve(list);
-  //   }) : request(`${this.uri}/parse-term-column`, {
-  //     method: 'POST',
-  //     data,
-  //   }).then((resp) => {
-  //     Store.set('parse-term', resp.result);
-  //     console.log(Store.get('parse-term'), 'then-resp')
-  //     return resp.result
-  //   }).finally(() => {
-  //     Store.set('request-params-parse-term', data);
-  //   });
-  // };
 
-  // private cacheTerm$: Promise<any> | undefined;
-
-  // getParseTerm = (data: Record<string, any>) => {
-  //   if (!this.cacheTerm$) {
-  //     this.cacheTerm$ = lastValueFrom(
-  //       defer(() =>
-  //         from(
-  //           request(`${this.uri}/parse-term-column`, {
-  //             method: 'POST',
-  //             data,
-  //           }),
-  //         ),
-  //       ).pipe(
-  //         filter((item) => item.status === 200),
-  //         map((item) => {
-  //           return item.result;
-  //         }),
-  //         // shareReplay(1, 100),
-  //       ),
-  //     );
-  //   }
-  //   return this.cacheTerm$;
-  // };
+  sceneByAlarm = (id: string) =>
+    request(`${SystemConst.API_BASE}/alarm/config/_count`, {
+      method: 'POST',
+      data: { terms: [{ column: 'sceneId', value: id }] },
+    });
 }
 
 export default Service;