Przeglądaj źródła

feat(firmware): release、create task

Lind 4 lat temu
rodzic
commit
212c284d95

+ 91 - 0
src/pages/device/Firmware/Detail/Task/Release/index.tsx

@@ -0,0 +1,91 @@
+import { message, Modal } from 'antd';
+import { createForm } from '@formily/core';
+import { createSchemaField } from '@formily/react';
+import { Form, FormItem, Select } from '@formily/antd';
+import type { ISchema } from '@formily/json-schema';
+import FSelectDevices from '@/components/FSelectDevices';
+import { service, state } from '@/pages/device/Firmware';
+import { DeviceInstance } from '@/pages/device/Instance/typings';
+
+interface Props {
+  close: () => void;
+  visible: boolean;
+}
+
+const Release = (props: Props) => {
+  const form = createForm({
+    validateFirst: true,
+  });
+
+  const SchemaField = createSchemaField({
+    components: {
+      FormItem,
+      Select,
+      FSelectDevices,
+    },
+  });
+
+  const save = async () => {
+    const values: { releaseType: 'all' | 'part'; part: DeviceInstance[] } = await form.submit();
+    console.log(!(values.part?.length && values.part?.length <= 0), 'lent');
+    if (!(values.part?.length && values.part?.length <= 0)) {
+      values.releaseType = 'all';
+    }
+    const resp = await service.deploy(
+      state.taskItem!.id,
+      values?.releaseType,
+      values?.part?.map((i) => i.id),
+    );
+    if (resp.status === 200) {
+      message.success('操作成功');
+    } else {
+      message.error('操作失败');
+    }
+    props.close();
+  };
+
+  const schema: ISchema = {
+    type: 'object',
+    properties: {
+      releaseType: {
+        title: '发布方式',
+        'x-component': 'Select',
+        'x-decorator': 'FormItem',
+        default: 'all',
+        enum: [
+          { label: '所有设备', value: 'all' },
+          { label: '选择设备', value: 'part' },
+        ],
+      },
+      part: {
+        title: '选择设备',
+        'x-decorator': 'FormItem',
+        'x-component': 'FSelectDevices',
+        'x-visible': false,
+        'x-reactions': {
+          dependencies: ['.releaseType'],
+          fulfill: {
+            state: {
+              visible: '{{$deps[0]==="part"}}',
+            },
+          },
+        },
+      },
+    },
+  };
+  return (
+    <Modal
+      title="发布任务"
+      onOk={save}
+      visible={props.visible}
+      onCancel={() => {
+        props.close();
+      }}
+    >
+      <Form form={form}>
+        <SchemaField schema={schema} />
+      </Form>
+    </Modal>
+  );
+};
+export default Release;

+ 84 - 0
src/pages/device/Firmware/Detail/Task/Save/index.tsx

@@ -0,0 +1,84 @@
+import { message, Modal } from 'antd';
+import { service, state } from '../../..';
+import { createForm } from '@formily/core';
+import { createSchemaField } from '@formily/react';
+import { Form, FormItem, Input, NumberPicker, Select } from '@formily/antd';
+import type { ISchema } from '@formily/json-schema';
+
+interface Props {
+  visible: boolean;
+  close: () => void;
+}
+
+const Save = (props: Props) => {
+  const form = createForm({
+    validateFirst: true,
+  });
+
+  const SchemaField = createSchemaField({
+    components: {
+      FormItem,
+      Input,
+      Select,
+      NumberPicker,
+    },
+  });
+
+  const schema: ISchema = {
+    type: 'object',
+    properties: {
+      name: {
+        title: '名称',
+        'x-component': 'Input',
+        'x-decorator': 'FormItem',
+      },
+      timeoutSeconds: {
+        title: '超时时间',
+        'x-component': 'NumberPicker',
+        'x-decorator': 'FormItem',
+      },
+      mode: {
+        title: '推送方式',
+        'x-component': 'Select',
+        'x-decorator': 'FormItem',
+        enum: [
+          { label: '平台推送', value: 'push' },
+          { label: '设备拉取', value: 'pull' },
+        ],
+      },
+      description: {
+        title: '名称',
+        'x-component': 'Input.TextArea',
+        'x-decorator': 'FormItem',
+      },
+    },
+  };
+
+  const save = async () => {
+    const values: Record<string, unknown> = await form.submit();
+    // 判断current 没有数据应该回退上一页
+    values.productId = state.current?.productId;
+    values.firmwareId = state.current?.id;
+    const resp = await service.saveTask(values);
+    if (resp.status === 200) {
+      message.success('操作成功');
+    } else {
+      message.error('操作失败');
+    }
+    props.close();
+  };
+  return (
+    <Modal
+      onOk={save}
+      width="40vw"
+      visible={props.visible}
+      onCancel={() => props.close()}
+      title="新建任务"
+    >
+      <Form form={form} labelCol={5} wrapperCol={16}>
+        <SchemaField schema={schema} />
+      </Form>
+    </Modal>
+  );
+};
+export default Save;

+ 54 - 21
src/pages/device/Firmware/Detail/Task/index.tsx

@@ -1,12 +1,20 @@
 import type { ProColumns } from '@jetlinks/pro-table';
 import ProTable from '@jetlinks/pro-table';
 import type { TaskItem } from '@/pages/device/Firmware/typings';
-import { service } from '@/pages/device/Firmware';
+import { service, state } from '@/pages/device/Firmware';
 import { Button, Tooltip } from 'antd';
-import { DeleteOutlined, EyeOutlined, PlusOutlined } from '@ant-design/icons';
+import {
+  CloudDownloadOutlined,
+  DeleteOutlined,
+  EyeOutlined,
+  PlusOutlined,
+} from '@ant-design/icons';
 import { useIntl, useParams } from 'umi';
+import Save from '@/pages/device/Firmware/Detail/Task/Save';
+import { observer } from '@formily/react';
+import Release from '@/pages/device/Firmware/Detail/Task/Release';
 
-const Task = () => {
+const Task = observer(() => {
   const intl = useIntl();
   const param = useParams<{ id: string }>();
   const columns: ProColumns<TaskItem>[] = [
@@ -46,13 +54,24 @@ const Task = () => {
         <a
           key="cat"
           onClick={() => {
-            console.log(record);
+            state.task = true;
           }}
         >
           <Tooltip title="查看">
             <EyeOutlined />
           </Tooltip>
         </a>,
+        <a
+          key="task"
+          onClick={() => {
+            state.release = true;
+            state.taskItem = record;
+          }}
+        >
+          <Tooltip title="下发任务">
+            <CloudDownloadOutlined />
+          </Tooltip>
+        </a>,
         <a key="remove">
           <Tooltip title="删除">
             <DeleteOutlined />
@@ -62,22 +81,36 @@ const Task = () => {
     },
   ];
   return (
-    <ProTable
-      columns={columns}
-      rowKey="id"
-      defaultParams={{
-        firmwareId: param.id,
-      }}
-      toolBarRender={() => [
-        <Button onClick={() => {}} key="button" icon={<PlusOutlined />} type="primary">
-          {intl.formatMessage({
-            id: 'pages.data.option.add',
-            defaultMessage: '新增',
-          })}
-        </Button>,
-      ]}
-      request={async (params) => service.task(params)}
-    />
+    <>
+      <ProTable
+        columns={columns}
+        rowKey="id"
+        defaultParams={{
+          firmwareId: param.id,
+        }}
+        toolBarRender={() => [
+          <Button onClick={() => {}} key="button" icon={<PlusOutlined />} type="primary">
+            {intl.formatMessage({
+              id: 'pages.data.option.add',
+              defaultMessage: '新增',
+            })}
+          </Button>,
+        ]}
+        request={async (params) => service.task(params)}
+      />
+      <Save
+        close={() => {
+          state.task = false;
+        }}
+        visible={state.task}
+      />
+      <Release
+        close={() => {
+          state.release = false;
+        }}
+        visible={state.release}
+      />
+    </>
   );
-};
+});
 export default Task;

+ 7 - 2
src/pages/device/Firmware/index.tsx

@@ -9,7 +9,7 @@ import { Link } from 'umi';
 import { model } from '@formily/reactive';
 import ProTable from '@jetlinks/pro-table';
 import { observer } from '@formily/react';
-import type { FirmwareItem } from '@/pages/device/Firmware/typings';
+import type { FirmwareItem, TaskItem } from '@/pages/device/Firmware/typings';
 import Service from '@/pages/device/Firmware/service';
 import Save from '@/pages/device/Firmware/Save';
 
@@ -18,8 +18,13 @@ export const service = new Service('firmware');
 export const state = model<{
   current?: FirmwareItem;
   visible: boolean;
+  task: boolean;
+  release: boolean;
+  taskItem?: TaskItem;
 }>({
-  visible: true,
+  visible: false,
+  task: false,
+  release: false,
 });
 const Firmware = observer(() => {
   const actionRef = useRef<ActionType>();

+ 15 - 0
src/pages/device/Firmware/service.ts

@@ -10,6 +10,21 @@ class Service extends BaseService<FirmwareItem> {
       params,
     });
 
+  saveTask = (data: Record<string, unknown>) =>
+    request(`/${SystemConst.API_BASE}/firmware/upgrade/task`, {
+      method: 'POST',
+      data,
+    });
+
+  deploy = (id: string, type?: 'all' | 'part', deviceId?: string[]) =>
+    request(
+      `/${SystemConst.API_BASE}/firmware/upgrade/task/${id}${type === 'all' ? '/all' : ''}/_deploy`,
+      {
+        method: 'POST',
+        data: deviceId,
+      },
+    );
+
   history = (params: Record<string, unknown>) =>
     request(`/${SystemConst.API_BASE}/firmware/upgrade/history/_query`, {
       method: 'GET',