Explorar el Código

fix: bug#8694、8649、8599

xieyonghong hace 3 años
padre
commit
25aa3e581f

+ 14 - 14
config/config.ts

@@ -29,9 +29,9 @@ export default defineConfig({
   locale: {
     // default zh-CN
     default: 'zh-CN',
-    antd: true,
+    antd: false,
     // default true, when it is true, will use `navigator.language` overwrite default
-    baseNavigator: true,
+    baseNavigator: false,
   },
   dynamicImport: {
     loading: '@ant-design/pro-layout/es/PageLoading',
@@ -62,18 +62,18 @@ export default defineConfig({
   // Fast Refresh 热更新
   fastRefresh: {},
   openAPI: [
-    {
-      requestLibPath: "import { request } from 'umi'",
-      // 或者使用在线的版本
-      // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json"
-      schemaPath: join(__dirname, 'oneapi.json'),
-      mock: false,
-    },
-    {
-      requestLibPath: "import { request } from 'umi'",
-      schemaPath: 'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json',
-      projectName: 'swagger',
-    },
+    // {
+    //   requestLibPath: "import { request } from 'umi'",
+    //   // 或者使用在线的版本
+    //   // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json"
+    //   schemaPath: join(__dirname, 'oneapi.json'),
+    //   mock: false,
+    // },
+    // {
+    //   requestLibPath: "import { request } from 'umi'",
+    //   schemaPath: 'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json',
+    //   projectName: 'swagger',
+    // },
   ],
   nodeModulesTransform: { type: 'none' },
   // mfsu: {},

+ 2 - 2
src/global.less

@@ -154,8 +154,8 @@ input[type='tel'] {
 #driver-page-overlay {
   opacity: 0.35 !important;
 }
-.ant-pagination.mini .ant-pagination-jump-prev,
-.ant-pagination.mini .ant-pagination-jump-next {
+.ant-pagination-mini .ant-pagination-jump-prev,
+.ant-pagination-mini .ant-pagination-jump-next {
   display: none;
 }
 

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

@@ -105,7 +105,8 @@ export default observer((props: FilterProps) => {
     queryBuiltInParams(FormModel.current, _params).then((res: any) => {
       if (res.status === 200) {
         const params = handleTreeData(
-          res.result.filter((item: any) => !item.id.includes(`action_${props.action}`)),
+          // res.result.filter((item: any) => !item.id.includes(`action_${props.action}`)),
+          res.result
         );
         setColumnOptions(params);
         setBuiltInOptions(params);

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

@@ -72,6 +72,7 @@ export default (props: ParamsDropdownProps) => {
         value: value,
         source: activeKey,
       };
+      setOpen(false)
       props.onChange?.(changeValue, _label);
     },
     [activeKey],
@@ -112,6 +113,7 @@ export default (props: ParamsDropdownProps) => {
               options={_options}
               onChange={(v, l) => {
                 onValueChange(v === 'true' ? true : false, l);
+                setOpen(false)
               }}
             />
           );
@@ -122,6 +124,7 @@ export default (props: ParamsDropdownProps) => {
               onChange={(_: any, timeString: string) => {
                 console.log('timeString', timeString);
                 onValueChange(timeString, timeString);
+                setOpen(false)
               }}
             />
           );
@@ -136,6 +139,7 @@ export default (props: ParamsDropdownProps) => {
                     titleKey = props.showLabelKey;
                   }
                   onValueChange(selectedKeys[0], e.node[titleKey]);
+                  setOpen(false)
                 }}
                 style={{ width: 300 }}
                 treeData={props.BuiltInOptions}

+ 4 - 2
src/pages/rule-engine/Scene/Save/device/TopCard.tsx

@@ -1,6 +1,8 @@
 import classNames from 'classnames';
 import { useEffect, useState } from 'react';
 import './index.less';
+import {QuestionCircleOutlined} from "@ant-design/icons";
+import { Popover } from 'antd'
 
 interface Props {
   typeList: any[];
@@ -43,8 +45,8 @@ const TopCard = (props: Props) => {
           }}
         >
           <div className={'way-item-title'}>
-            <p>{item.label}</p>
-            {item.tip && <span>{item.tip}</span>}
+            <span className={'way-item-label'}>{item.label}</span>
+            { item.tip && <Popover content={item.tip}><QuestionCircleOutlined className={'way-item-icon'} /></Popover> }
           </div>
           <div className={'way-item-image'}>
             <img width={48} src={item.image} />

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

@@ -247,7 +247,7 @@ export default observer((props: AddProps) => {
     <Modal
       visible
       title="执行规则"
-      width={800}
+      width={810}
       onCancel={() => {
         props.onCancel?.();
         TriggerDeviceModel.stepNumber = 0;

+ 21 - 11
src/pages/rule-engine/Scene/Save/device/deviceList.tsx

@@ -18,7 +18,6 @@ export default observer(() => {
     pageIndex: TriggerDeviceModel.devicePage,
     pageSize: TriggerDeviceModel.devicePageSize,
   });
-  const [isFirst, setIsFirst] = useState(true);
 
   const [loading, setLoading] = useState(true);
 
@@ -212,6 +211,8 @@ export default observer(() => {
       <Observer>
         {() => (
           <ProTableCard<DeviceInstance>
+            noPadding
+            cardScrollY={400}
             actionRef={actionRef}
             columns={columns}
             rowKey="id"
@@ -222,18 +223,27 @@ export default observer(() => {
             tableAlertRender={false}
             rowSelection={{
               selectedRowKeys: [...TriggerDeviceModel.deviceKeys],
-              onChange(selectedRowKeys, selectedRows) {
-                console.log(selectedRowKeys);
-                if (!isFirst) {
-                  TriggerDeviceModel.deviceKeys = selectedRows.map((item) => item.id);
-                  TriggerDeviceModel.selectorValues = selectedRows.map((item) => ({
-                    name: item.name,
-                    value: item.id,
-                  }));
+              onSelect: (record, selected, selectedRows) => {
+                console.log(record)
+                if (selected) {
+                  TriggerDeviceModel.deviceKeys.push(record.id)
+                  if (TriggerDeviceModel.selectorValues) {
+                    TriggerDeviceModel.selectorValues?.push({
+                      name: record.name,
+                      value: record.id
+                    })
+                  } else {
+                    TriggerDeviceModel.selectorValues = [{
+                      name: record.name,
+                      value: record.id
+                    }]
+                  }
                 } else {
-                  setIsFirst(false);
+                  const newArray = TriggerDeviceModel.selectorValues?.filter((item) => item.value !== record.id);
+                  TriggerDeviceModel.deviceKeys = newArray?.map(item => item.value) || []
+                  TriggerDeviceModel.selectorValues = newArray || []
                 }
-              },
+              }
             }}
             onPageChange={(page, size) => {
               TriggerDeviceModel.devicePage = page;

+ 25 - 35
src/pages/rule-engine/Scene/Save/device/index.less

@@ -23,38 +23,44 @@
     justify-content: space-between;
     width: 237px;
     //width: 100%;
-    padding: 16px;
-    border: 1px solid #e0e4e8;
+    padding: 12px 16px;
+    border: 1px solid rgba(#e0e4e8, .6);
     border-radius: 2px;
     cursor: pointer;
-    opacity: 0.6;
     transition: all 0.3s;
+    align-items: center;
 
     .way-item-title {
-      p {
-        margin-bottom: 8px;
-        font-weight: bold;
+      span {
         font-size: 16px;
       }
+      .way-item-label {
+        padding-right: 6px;
+        color: rgba(#000, .64);
+      }
 
-      span {
-        color: rgba(#000, 0.35);
-        font-size: 12px;
+      .way-item-icon {
+        color: rgba(#000, .5);
       }
     }
 
     .way-item-image {
       margin: 0 !important;
+      opacity: 0.6;
     }
 
     &:hover {
-      color: @primary-color-hover;
-      opacity: 0.8;
+      //color: @primary-color-hover;
+      .way-item-image {
+        opacity: 0.8;
+      }
     }
 
     &.active {
       border-color: @primary-color-active;
-      opacity: 1;
+      .way-item-image {
+        opacity: 1;
+      }
     }
 
     &.labelBottom {
@@ -104,30 +110,14 @@
 
 .trigger-options-content {
   .trigger-options-name {
+    .ellipsisFn(1, 30%);
+  }
+
+  .trigger-options-type {
     .ellipsisFn(1, 10%);
   }
 
-  //.trigger-options-type {
-  //
-  //}
-  //
-  //.trigger-options-when {
-  //
-  //}
-  //
-  //.trigger-options-time {
-  //
-  //}
-  //
-  //.trigger-options-extraTime {
-  //
-  //}
-  //
-  //.trigger-options-action {
-  //
-  //}
-  //
-  //.trigger-options-type {
-  //
-  //}
+  .trigger-options-when {
+    .ellipsisFn(1, 15%);
+  }
 }

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

@@ -48,6 +48,10 @@ export default observer(() => {
         actionRef={actionRef}
         columnEmptyText={''}
         tableAlertRender={false}
+        options={false}
+        scroll={{
+          y: 350
+        }}
         rowSelection={{
           type: 'radio',
           selectedRowKeys: [TriggerDeviceModel.orgId],

+ 44 - 49
src/pages/rule-engine/Scene/Save/device/product.tsx

@@ -176,7 +176,7 @@ export default observer(() => {
           .queryOrgThree({
             paging: false,
           })
-          .then((resp) => {
+          .then((resp: any) => {
             const formatValue = (list: any[]) => {
               const _list: any[] = [];
               list.forEach((item) => {
@@ -224,55 +224,50 @@ export default observer(() => {
         }}
         target="department-assets-product"
       />
-      <div
-        style={{
-          height: 'calc(100vh - 440px)',
-          overflowY: 'auto',
-        }}
-      >
-        <ProTableCard<ProductItem>
-          actionRef={actionRef}
-          columns={columns}
-          rowKey="id"
-          search={false}
-          gridColumn={2}
-          columnEmptyText={''}
-          onlyCard={true}
-          tableAlertRender={false}
-          rowSelection={{
-            type: 'radio',
-            selectedRowKeys: [TriggerDeviceModel.productId],
-            onChange: (_, selectedRows) => {
-              console.log(selectedRows);
-              TriggerDeviceModel.productId = selectedRows.map((item) => item.id)[0];
-              TriggerDeviceModel.productDetail = selectedRows?.[0];
-              handleMetadata(TriggerDeviceModel.productDetail.metadata);
-              // 初始化选择设备类型以及触发类型
-              TriggerDeviceModel.deviceKeys = [];
-              TriggerDeviceModel.orgId = '';
-              TriggerDeviceModel.selector = 'fixed';
-              TriggerDeviceModel.operation = {
-                operator: 'online',
-              };
-            },
-          }}
-          onPageChange={(page, size) => {
-            TriggerDeviceModel.productPage = page;
-            TriggerDeviceModel.productPageSize = size;
-          }}
-          request={(params) =>
-            service.query({
-              ...params,
-              sorts: [{ name: 'createTime', order: 'desc' }],
-            })
+      <ProTableCard<ProductItem>
+        noPadding
+        cardScrollY={460}
+        actionRef={actionRef}
+        columns={columns}
+        rowKey="id"
+        search={false}
+        gridColumn={2}
+        columnEmptyText={''}
+        onlyCard={true}
+        tableAlertRender={false}
+        rowSelection={{
+          type: 'radio',
+          selectedRowKeys: [TriggerDeviceModel.productId],
+          onChange: (_, selectedRows) => {
+            console.log('onChange',selectedRows);
+            TriggerDeviceModel.productId = selectedRows.map((item) => item.id)[0];
+            TriggerDeviceModel.productDetail = selectedRows?.[0];
+            handleMetadata(TriggerDeviceModel.productDetail.metadata);
+            // 初始化选择设备类型以及触发类型
+            TriggerDeviceModel.deviceKeys = [];
+            TriggerDeviceModel.orgId = '';
+            TriggerDeviceModel.selector = 'fixed';
+            TriggerDeviceModel.operation = {
+              operator: 'online',
+            };
           }
-          params={searchParam}
-          cardRender={(record) => (
-            <SceneProductCard showBindBtn={false} showTool={false} {...record} />
-          )}
-          height={'none'}
-        />
-      </div>
+        }}
+        onPageChange={(page, size) => {
+          TriggerDeviceModel.productPage = page;
+          TriggerDeviceModel.productPageSize = size;
+        }}
+        request={(params) =>
+          service.query({
+            ...params,
+            sorts: [{ name: 'createTime', order: 'desc' }],
+          })
+        }
+        params={searchParam}
+        cardRender={(record) => (
+          <SceneProductCard showBindBtn={false} showTool={false} {...record} />
+        )}
+        height={'none'}
+      />
     </div>
   );
 });

+ 7 - 1
src/pages/rule-engine/Scene/Save/device/type.tsx

@@ -162,7 +162,13 @@ export default forwardRef((props: Props, ref) => {
   }));
 
   return (
-    <div>
+    <div
+      style={{
+        maxHeight: 'calc(100vh - 350px)',
+        overflowY: 'auto',
+        overflowX: 'hidden'
+      }}
+    >
       <Form form={form} layout={'vertical'}>
         <Form.Item name="operator" label="触发类型" required initialValue={'online'}>
           <TopCard typeList={TypeList} labelBottom={true} />

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

@@ -16,7 +16,7 @@ import { useHistory } from 'umi';
 import { getMenuPathByCode } from '@/utils/menu';
 import { cloneDeep } from 'lodash';
 
-const defaultBranches = [
+export const defaultBranches = [
   {
     when: [
       {
@@ -72,6 +72,7 @@ export default observer(() => {
   const triggerType = location?.query?.triggerType || '';
   const id = location?.query?.id || '';
   const history = useHistory();
+  const [form] = Form.useForm()
 
   const FormModelInit = () => {
     FormModel.current = {
@@ -116,8 +117,9 @@ export default observer(() => {
             branches = branches.map((bItem: ActionBranchesProps, bIndex: number) => {
               if (!bItem.key) {
                 bItem.key = `branches_${new Date().getTime() + bIndex}`;
-                if (bItem.then && bItem.then) {
-                  bItem.then = bItem.then.map((tItem) => {
+                if (bItem.then && bItem.then.length) {
+                  bItem.then = bItem.then.map((tItem,tIndex) => {
+                    tItem.key = `then_${new Date().getTime() + tIndex}`;
                     if (tItem.actions) {
                       tItem.actions = tItem.actions.map((aItem, index) => {
                         aItem.key = `${aItem.executor}_${new Date().getTime() + index}`;
@@ -127,7 +129,7 @@ export default observer(() => {
                     return tItem;
                   });
                 }
-                if (bItem.when) {
+                if (bItem.when && bItem.when.length) {
                   bItem.when = bItem.when.map((wItem, index) => {
                     wItem.key = `when_${new Date().getTime() + index}`;
                     if (wItem.terms) {
@@ -143,27 +145,31 @@ export default observer(() => {
               return bItem;
             });
           }
-          branches.push({
-            when: [],
-            key: 'branckes_2',
-            shakeLimit: {
-              enabled: false,
-              time: 0,
-              threshold: 0,
-              alarmFirst: false,
-            },
-            then: [],
-          });
+          if (branches[0]?.when?.length) {
+            branches.push({
+              when: [],
+              key: 'branckes_2',
+              shakeLimit: {
+                enabled: false,
+                time: 0,
+                threshold: 0,
+                alarmFirst: false,
+              },
+              then: [],
+            });
+          }
           FormModel.current = {
             ...resp.result,
           };
           FormModel.current.options = { ...defaultOptions, ...resp.result.options };
           FormModel.current.trigger = resp.result.trigger || {};
           FormModel.current.branches = branches;
+
+          form.setFieldValue('description', resp.result.description)
         }
       });
     }
-  }, [id]);
+  }, [id, form]);
 
   const triggerRender = (type: string) => {
     FormModel.current.trigger!.type = type;
@@ -192,6 +198,7 @@ export default observer(() => {
   };
 
   const submit = useCallback(() => {
+    const baseData = form.getFieldsValue()
     const FormData = cloneDeep(FormModel.current);
     const { options, branches } = FormData;
     if (options?.terms) {
@@ -207,6 +214,11 @@ export default observer(() => {
     if (branches) {
       FormData.branches = branches.filter((item) => !!item.then.length || !!item.when.length);
     }
+
+    if (baseData) {
+      FormData.description = baseData.description
+    }
+
     service.updateScene(FormData).then((res) => {
       if (res.status === 200) {
         onlyMessage('操作成功', 'success');
@@ -219,7 +231,7 @@ export default observer(() => {
   return (
     <PageContainer>
       <Card>
-        <Form name="timer" layout={'vertical'}>
+        <Form name="timer" layout={'vertical'} form={form}>
           {triggerRender(triggerType)}
           <Form.Item
             label={<TitleComponent style={{ fontSize: 14 }} data={'说明'} />}

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

@@ -1,11 +1,14 @@
-import { useEffect } from 'react';
+import { useEffect, useState } from 'react';
 import { TitleComponent } from '@/components';
 import { observer, Observer } from '@formily/react';
 import { model } from '@formily/reactive';
-import { FormModel } from '@/pages/rule-engine/Scene/Save';
+import { FormModel, defaultBranches } from '@/pages/rule-engine/Scene/Save';
 import BranchItem from './branchItem';
 import { service } from '@/pages/rule-engine/Scene/index';
+import { Switch } from 'antd'
 import type { TriggerType } from '@/pages/rule-engine/Scene/typings';
+import Actions from '@/pages/rule-engine/Scene/Save/action';
+import {cloneDeep} from "lodash";
 
 interface TermsModelProps {
   columnOptions: any[];
@@ -16,12 +19,57 @@ export const TermsModel = model<TermsModelProps>({
 });
 
 export default observer(() => {
+
+  const [open, setOpen] = useState(true)
+
+  useEffect(() => {
+    console.log('terms-effect',FormModel.current.branches)
+    if (FormModel.current.branches && FormModel.current.branches.length === 1) {
+      setOpen(false)
+    }
+  }, [FormModel.current.branches])
+
   const queryColumn = (data: TriggerType) => {
     service.getParseTerm({ trigger: data }).then((res: any) => {
       TermsModel.columnOptions = res;
     });
   };
 
+  const openChange = (checked: boolean) => {
+    console.log('terms-effect-change')
+    setOpen(checked)
+    if (checked) {
+      FormModel.current.branches = cloneDeep([
+        ...defaultBranches,
+        {
+          when: [],
+          key: 'branches_2',
+          shakeLimit: {
+            enabled: false,
+            time: 0,
+            threshold: 0,
+            alarmFirst: false,
+          },
+          then: [],
+        },
+      ])
+    } else {
+      FormModel.current.branches = [
+        {
+          when: [],
+          key: 'branches_'+new Date().getTime(),
+          shakeLimit: {
+            enabled: false,
+            time: 0,
+            threshold: 0,
+            alarmFirst: false,
+          },
+          then: [],
+        }
+      ]
+    }
+  }
+
   useEffect(() => {
     if (FormModel.current.trigger?.device) {
       queryColumn(FormModel.current.trigger);
@@ -30,26 +78,37 @@ export default observer(() => {
 
   return (
     <div className="actions-terms">
-      <TitleComponent style={{ fontSize: 14 }} data="触发条件" />
-      <Observer>
-        {() =>
-          FormModel.current.branches?.map((item, index) => {
-            const isFrist = index === 0;
-            return (
-              <BranchItem
-                data={item}
-                isFrist={isFrist}
-                name={index}
-                paramsOptions={TermsModel.columnOptions}
-                onDelete={() => {
-                  FormModel.current.branches?.splice(index, 1);
-                  FormModel.current.options?.when?.splice(index, 1);
-                }}
-              />
-            );
-          })
+      <TitleComponent
+        style={{ fontSize: 14 }}
+        data={
+          <span>
+            触发条件 <Switch checked={open} onChange={openChange} checkedChildren={'开'} unCheckedChildren={'关'}/>
+          </span>
         }
-      </Observer>
+      />
+      {
+        open ?
+        <Observer>
+          {() =>
+            FormModel.current.branches?.map((item, index) => {
+              const isFrist = index === 0;
+              return (
+                <BranchItem
+                  data={item}
+                  isFrist={isFrist}
+                  name={index}
+                  paramsOptions={TermsModel.columnOptions}
+                  onDelete={() => {
+                    FormModel.current.branches?.splice(index, 1);
+                    FormModel.current.options?.when?.splice(index, 1);
+                  }}
+                />
+              );
+            })
+          }
+        </Observer> :
+          <Actions openShakeLimit={true} name={0} thenOptions={FormModel.current.branches ? FormModel.current.branches[0].then : []} />
+      }
     </div>
   );
 });