瀏覽代碼

feat: 水处理设备检查记录

Tong 2 年之前
父節點
當前提交
c55ae89a27

+ 16 - 0
src/api/biz/engineer/waterTreatmentApi.ts

@@ -0,0 +1,16 @@
+import { defHttp } from '/@/utils/http/axios';
+import { setParams } from '/@/utils/index';
+
+enum Api {
+  waterTreatmentQueryPage = '/biz/deviceInspect/waterTreatment/query/page',
+  waterTreatmentAdd = '/biz/deviceInspect/waterTreatment/add',
+}
+
+// 查询设备列表
+export const waterTreatmentQueryPage = (params?: object) => {
+  return defHttp.post({ url: Api.waterTreatmentQueryPage, params: setParams(params) });
+};
+// 添加设备
+export const waterTreatmentAdd = (params?: object) => {
+  return defHttp.post({ url: Api.waterTreatmentAdd, params: params });
+};

+ 10 - 0
src/api/sys/sysUserApi.ts

@@ -13,6 +13,8 @@ enum Api {
   userListMenus = '/user/listMenus-',
   userPermCode = '/user/getPermissionInfo',
   validatorUsername = '/sys/user/username/valid',
+
+  sysUserList = '/sys/user/query/list',
 }
 
 /**
@@ -92,3 +94,11 @@ export const userPermCode = (params?: object) => {
 export const validatorUsername = (params?: object) => {
   return defHttp.post({ url: Api.validatorUsername, params: params });
 };
+
+/**
+ * @description: 查询用户列表,不分页
+ * @method: POST
+ */
+export const sysUserList = (params?: object) => {
+  return defHttp.post({ url: Api.sysUserList, params: setParams(params) });
+};

+ 1 - 1
src/views/biz/archives/index/data.ts

@@ -44,7 +44,7 @@ export const siftFormSchema: FormSchema[] = [
   {
     label: '性别',
     field: 'gender',
-    component: 'ApiRadioGroup',
+    component: 'RadioGroup',
     componentProps: {
       api: listDictModel,
       params: {

+ 1 - 0
src/views/biz/engineer/water/detail/data.ts

@@ -2,6 +2,7 @@ export const BasicTab = [
   { key: 'deviceBasic', value: 0, title: '设备信息' },
   { key: 'maintenanceList', value: 1, title: '维修记录' },
   { key: 'upkeepList', value: 2, title: '保养记录' },
+  { key: 'treatmentList', value: 3, title: '检查记录' },
 ];
 
 export const BasicTabActive = BasicTab[0].key;

+ 5 - 0
src/views/biz/engineer/water/detail/index.vue

@@ -23,6 +23,10 @@
           <div v-if="item.value == 2 && info.id">
             <UpkeepList :info="info" />
           </div>
+          <!-- 检查记录 3 -->
+          <div v-if="item.value == 3 && info.id">
+            <TreatmentList :info="info" />
+          </div>
         </a-tab-pane>
       </a-tabs>
     </div>
@@ -35,6 +39,7 @@
   import DeviceBasic from '../deviceBasic/index.vue';
   import MaintenanceList from '../maintenanceList/index.vue';
   import UpkeepList from '../upkeepList/index.vue';
+  import TreatmentList from '../treatmentList/index.vue';
   import { useRoute } from 'vue-router';
   import { XTTitle } from '/@/components/XTTitle/index';
 

+ 7 - 4
src/views/biz/engineer/water/deviceBasic/data.ts

@@ -5,13 +5,16 @@ export const BasicData = [
     type: 'basic',
     data: [
       { field: 'uniqueCode', label: '设备编号', value: '' },
-      { field: 'deviceType', label: '设备类型', value: '', dict: true },
+      { field: 'name', label: '设备名称', value: '' },
       { field: 'manufacturer', label: '厂家', value: '' },
       { field: 'model', label: '型号', value: '' },
-      { field: 'purchaseDate', label: '入账日期', value: '' },
+      { field: 'serialNumber', label: '序列号', value: '' },
+      { field: 'producer', label: '产地', value: '' },
+      { field: 'useDate', label: '使用日期', value: '' },
       { field: 'produceDate', label: '生产日期', value: '' },
-      { field: 'priceYuan', label: '采购金额(元)', value: '' },
-      { field: 'warrantyPeriod', label: '保修期限(年)', value: '' },
+      { field: 'purchaseDate', label: '入账日期', value: '' },
+      { field: 'warrantyPeriod', label: '保修年限(年)', value: '' },
+      { field: 'priceWan', label: '采购金额(万元)', value: '' },
     ],
   },
 ];

+ 2 - 2
src/views/biz/engineer/water/deviceBasic/index.vue

@@ -12,7 +12,7 @@
   import { BasicData } from './data';
   import { onMounted } from 'vue';
   import { formatDictValue } from '/@/utils';
-  import { otherDetail } from '/@/api/biz/engineer/otherApi';
+  import { waterDetail } from '/@/api/biz/engineer/waterApi';
   import { listDictModelBatch } from '/@/api/common';
 
   const props = defineProps({
@@ -36,7 +36,7 @@
   const basicData = ref(BasicData as any);
   // 获取数据
   async function getData() {
-    const res = await otherDetail(props.info?.id);
+    const res = await waterDetail(props.info?.id);
     basicData.value[0].data.forEach(ele => {
       if (ele.dict) {
         ele.value = formatDictValue(bizDictOptions[ele.field], res[ele.field]);

+ 1 - 1
src/views/biz/engineer/water/index.vue

@@ -205,7 +205,7 @@
   function goDetail(record) {
     console.log('record::', record);
     router.push({
-      path: '/bizEngineer/otherDetail',
+      path: '/bizEngineer/waterDetail',
       query: {
         id: record.id,
         name: record.name,

+ 577 - 0
src/views/biz/engineer/water/treatmentList/data.ts

@@ -0,0 +1,577 @@
+import { BasicColumn, FormSchema } from '/@/components/Table';
+import { sysUserList } from '/@/api/sys/sysUserApi';
+
+import { useUserStore } from '@/store/modules/user';
+const useUser = useUserStore();
+export const columns: BasicColumn[] = [
+  {
+    title: '检查日期',
+    dataIndex: 'examinerTime',
+    align: 'center',
+    width: 120,
+  },
+  {
+    title: '检查人',
+    dataIndex: 'examinerName',
+    align: 'center',
+    width: 80,
+  },
+  {
+    title: '进水压力',
+    dataIndex: 'intakePressure',
+    align: 'center',
+    width: 80,
+  },
+  {
+    title: '控制器状态',
+    dataIndex: 'controllerState',
+    align: 'center',
+    width: 90,
+  },
+
+  {
+    title: '砂滤罐压差',
+    dataIndex: 'sandLeachDifferentialPressure',
+    align: 'center',
+    width: 90,
+  },
+  {
+    title: '砂滤罐反冲洗',
+    dataIndex: 'sandLeachBackFlush',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '硬度',
+    dataIndex: 'hardness',
+    align: 'center',
+    width: 80,
+  },
+  {
+    title: '树脂罐压差',
+    dataIndex: 'resinDifferentialPressure',
+    align: 'center',
+    width: 90,
+  },
+  {
+    title: '树脂再生情况',
+    dataIndex: 'resinRegeneration',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '残余氯',
+    dataIndex: 'residualChlorine',
+    align: 'center',
+    width: 60,
+  },
+  {
+    title: '活性炭罐压差',
+    dataIndex: 'activeCarbonDifferentialPressure',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '活性炭罐反冲洗',
+    dataIndex: 'activeCarbonBackFlush',
+    align: 'center',
+    width: 120,
+  },
+  {
+    title: '更换滤器',
+    dataIndex: 'filterReplacement',
+    align: 'center',
+    width: 80,
+  },
+  {
+    title: '水机进水压力',
+    dataIndex: 'waterInletPressure',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '1级膜进水压力',
+    dataIndex: 'membraneInletPressure1',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '1级膜排水压力',
+    dataIndex: 'membraneDrainagePressure1',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '1级膜产水压力',
+    dataIndex: 'membraneContributingWaterPressure1',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '2级膜进水压力',
+    dataIndex: 'membraneInletPressure2',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '2级膜排水压力',
+    dataIndex: 'membraneDrainagePressure2',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '2级膜产水压力',
+    dataIndex: 'membraneContributingWaterPressure2',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '纯水回水压力',
+    dataIndex: 'pureWaterReturnPressure',
+    align: 'center',
+    width: 110,
+  },
+  {
+    title: '进水电导率',
+    dataIndex: 'inletConductivity',
+    align: 'center',
+    width: 90,
+  },
+  {
+    title: '产水电导率',
+    dataIndex: 'contributingWaterConductivity',
+    align: 'center',
+    width: 90,
+  },
+  {
+    title: '进水量',
+    dataIndex: 'waterInflow',
+    align: 'center',
+    width: 60,
+  },
+  {
+    title: '产水量',
+    dataIndex: 'waterYield',
+    align: 'center',
+    width: 60,
+  },
+  {
+    title: '废水量',
+    dataIndex: 'wastewaterQuantity',
+    align: 'center',
+    width: 60,
+  },
+  {
+    title: '回水量',
+    dataIndex: 'waterReclamation',
+    align: 'center',
+    width: 60,
+  },
+  {
+    title: '水温',
+    dataIndex: 'waterTemperature',
+    align: 'center',
+    width: 60,
+  },
+  {
+    title: '系统消毒',
+    dataIndex: 'systemDisinfection',
+    align: 'center',
+    width: 80,
+  },
+];
+
+export const dataFormSchema: FormSchema[] = [
+  {
+    label: '检查日期',
+    field: 'examinerTime',
+    required: true,
+    component: 'DatePicker',
+    componentProps: {
+      format: 'YYYY-MM-DD',
+      placeholder: '请选择检查日期',
+      getPopupContainer: () => document.body,
+      valueFormat: 'YYYY-MM-DD',
+    },
+  },
+  {
+    label: '检查人',
+    field: 'examinerId',
+    required: true,
+    component: 'ApiSelect',
+    componentProps: ({ formModel }) => {
+      return {
+        api: sysUserList,
+        params: {
+          name: formModel.patientBasicName,
+          pageSize: 999,
+        },
+        labelField: 'nickname',
+        valueField: 'id',
+        resultField: 'data',
+        placeholder: '请输入患者姓名',
+        getPopupContainer: () => document.body,
+        showSearch: true,
+        filterOption: false,
+        onSearch: e => {
+          formModel.patientBasicName = e;
+        },
+      };
+    },
+    defaultValue: useUser.getUserInfo.userId,
+  },
+  {
+    label: '进水压力',
+    field: 'intakePressure',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '控制器状态',
+    field: 'controllerState',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '砂滤罐压差',
+    field: 'sandLeachDifferentialPressure',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '砂滤罐反向冲洗',
+    field: 'sandLeachBackFlush',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '硬度',
+    field: 'hardness',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '树脂罐压差',
+    field: 'resinDifferentialPressure',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '树脂再生情况',
+    field: 'resinRegeneration',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '残余氯',
+    field: 'residualChlorine',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '活性炭罐压差',
+    field: 'activeCarbonDifferentialPressure',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '活性炭罐反向冲洗',
+    field: 'activeCarbonBackFlush',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '更换滤器',
+    field: 'filterReplacement',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '是', value: 1 },
+        { label: '否', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '水机进水压力',
+    field: 'waterInletPressure',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '1级膜进水压力',
+    field: 'membraneInletPressure1',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '1级膜排水压力',
+    field: 'membraneDrainagePressure1',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '1级膜产水压力',
+    field: 'membraneContributingWaterPressure1',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '2级膜进水压力',
+    field: 'membraneInletPressure2',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '2级膜排水压力',
+    field: 'membraneDrainagePressure2',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '2级膜产水压力',
+    field: 'membraneContributingWaterPressure2',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '纯水回水压力',
+    field: 'pureWaterReturnPressure',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '进水电导率',
+    field: 'inletConductivity',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '产水电导率',
+    field: 'contributingWaterConductivity',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '进水量',
+    field: 'waterInflow',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '产水量',
+    field: 'waterYield',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '废水量',
+    field: 'wastewaterQuantity',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '回水量',
+    field: 'waterReclamation',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '水温(℃)',
+    field: 'waterTemperature',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '合格', value: 1 },
+        { label: '不合格', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+  {
+    label: '系统消毒',
+    field: 'systemDisinfection',
+    component: 'RadioGroup',
+    componentProps: {
+      options: [
+        { label: '是', value: 1 },
+        { label: '否', value: 0 },
+      ],
+    },
+    defaultValue: 1,
+  },
+];
+
+export const dataFiled = [
+  'intakePressure',
+  'controllerState',
+  'sandLeachDifferentialPressure',
+  'sandLeachBackFlush',
+  'hardness',
+  'resinDifferentialPressure',
+  'resinRegeneration',
+  'residualChlorine',
+  'activeCarbonDifferentialPressure',
+  'activeCarbonBackFlush',
+  'filterReplacement',
+  'waterInletPressure',
+  'membraneInletPressure1',
+  'membraneDrainagePressure1',
+  'membraneContributingWaterPressure1',
+  'membraneInletPressure2',
+  'membraneDrainagePressure2',
+  'membraneContributingWaterPressure2',
+  'pureWaterReturnPressure',
+  'inletConductivity',
+  'contributingWaterConductivity',
+  'waterInflow',
+  'waterYield',
+  'wastewaterQuantity',
+  'waterReclamation',
+  'waterTemperature',
+  'systemDisinfection',
+];

+ 112 - 0
src/views/biz/engineer/water/treatmentList/formDrawer.vue

@@ -0,0 +1,112 @@
+<template>
+  <BasicDrawer
+    v-bind="$attrs"
+    destroyOnClose
+    @register="registerDrawer"
+    :title="getTitle"
+    :width="width"
+    @ok="handleSubmit"
+    :showFooter="true"
+  >
+    <BasicForm @register="registerForm" layout="vertical"
+  /></BasicDrawer>
+</template>
+<script lang="ts" setup>
+  import { ref, computed, unref } from 'vue';
+  import { BasicDrawer, useDrawerInner } from '/@/components/Drawer';
+  import { BasicForm, useForm } from '/@/components/Form';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { dataFormSchema } from './data';
+
+  import { waterTreatmentAdd } from '/@/api/biz/engineer/waterTreatmentApi';
+  const emit = defineEmits(['success', 'register']);
+  const getTitle = computed(() => '新增检查记录');
+  const width = '35%';
+  const isUpdate = ref(false);
+  const rowId = ref();
+  const { createMessage } = useMessage();
+  const [registerForm, { validate }] = useForm({
+    labelWidth: 120,
+    schemas: dataFormSchema,
+    showActionButtonGroup: false,
+    actionColOptions: {
+      span: 23,
+    },
+    baseColProps: {
+      span: 12,
+    },
+    wrapperCol: {
+      span: 24,
+    },
+  });
+  const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async data => {
+    console.log('data::::::::', data);
+    rowId.value = data.record?.id;
+  });
+
+  // 提交按钮事件
+  async function handleSubmit() {
+    try {
+      const values = await validate();
+      setDrawerProps({ confirmLoading: true });
+      const params = {
+        deviceId: rowId.value,
+        examinerId: values.examinerId,
+        examinerTime: values.examinerTime,
+        checkContent: {} as any,
+      };
+      delete values.examinerId;
+      delete values.examinerTime;
+      params.checkContent = values;
+      console.log('params::::::::::', params);
+
+      await waterTreatmentAdd({ ...params });
+      createMessage.success('新增成功!');
+      closeDrawer();
+      emit('success', {
+        isUpdate: unref(isUpdate),
+        values: { ...values, id: rowId.value },
+      });
+    } finally {
+      setDrawerProps({ confirmLoading: false });
+    }
+  }
+</script>
+<style lang="less" scoped>
+  .device-info {
+    width: 100%;
+    max-height: 520px;
+    margin-top: -30px;
+    overflow: auto;
+
+    .device-card {
+      display: inline-block;
+      width: 270px;
+      height: 40px;
+      margin: 10px 20px;
+      background: #f4f6f9;
+      border-radius: 4px;
+      font-size: 14px;
+      font-weight: 500;
+      color: #000a18;
+      text-align: center;
+      line-height: 40px;
+      cursor: pointer;
+    }
+
+    .card-select {
+      background: #fff;
+      border-radius: 4px;
+      border: 1px solid #006dff;
+      color: #006dff;
+    }
+
+    .card-disable {
+      background: #fff;
+      border-radius: 4px;
+      border: 1px solid #a5a5a5;
+      color: #a5a5a5;
+      cursor: default;
+    }
+  }
+</style>

+ 170 - 0
src/views/biz/engineer/water/treatmentList/index.vue

@@ -0,0 +1,170 @@
+<template>
+  <div>
+    <div class="flex justify-between mb-4">
+      <div>
+        <a-button type="primary" size="large" class="btn-add" @click="handleCreate"
+          ><template #icon> <Icon icon="icon-xt-add_default|iconfont" /> </template
+          >新增检查</a-button
+        >
+      </div>
+      <div>
+        <XTForm :form-data="formData" @change="callForm" />
+      </div>
+    </div>
+    <BasicTable @register="registerTable">
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'examinerTime'">
+          {{ dayjs(record.examinerTime).format('YYYY-MM-DD') }}
+        </template>
+        <template v-for="item in dataFiled" :key="item">
+          <template v-if="item === 'systemDisinfection' || item === 'filterReplacement'">
+            <template v-if="column.key === item">
+              <span>{{ record.checkContent[item] === 1 ? '是' : '否' }}</span>
+            </template>
+          </template>
+          <template v-else>
+            <template v-if="column.key === item">
+              <span>{{ record.checkContent[item] === 1 ? '合格' : '不合格' }}</span>
+            </template>
+          </template>
+        </template>
+      </template>
+    </BasicTable>
+    <FormDrawer @register="registerDrawer" @success="callSuccess" />
+    <!--  @cancel="handleCancel"  -->
+  </div>
+</template>
+<script lang="ts" setup>
+  import { onBeforeMount, reactive, ref } from 'vue';
+  import { XTForm } from '/@/components/XTForm/index';
+  import { useDrawer } from '/@/components/Drawer';
+  import FormDrawer from './formDrawer.vue';
+  import { BasicTable, useTable } from '/@/components/Table';
+  import Icon from '/@/components/Icon/index';
+  import { columns, dataFiled } from './data';
+  import { waterTreatmentQueryPage } from '/@/api/biz/engineer/waterTreatmentApi';
+  import dayjs from 'dayjs';
+
+  const props = defineProps({
+    info: {
+      type: Object,
+      default: () => {},
+    },
+  });
+  const [registerDrawer, { openDrawer }] = useDrawer();
+  const tableSort = ref([
+    {
+      field: 'create_time',
+      direction: 'DESC',
+    },
+  ]) as any;
+
+  // formdata
+  const formData = [
+    {
+      name: 'patrolTime',
+      label: '保养时间',
+      componentType: 'RangePicker',
+      placeholder: '请选择保养时间',
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+    },
+  ];
+  const formValue = reactive({
+    patrolTime: [],
+    maintainCompany: '',
+  });
+
+  const [registerTable, { reload }] = useTable({
+    api: waterTreatmentQueryPage,
+    rowKey: 'id',
+    columns,
+    showIndexColumn: false,
+    bordered: true,
+    striped: false,
+    // actionColumn: {
+    //   width: 100,
+    //   title: '操作',
+    //   dataIndex: 'action',
+    // },
+    beforeFetch: handleBeforeFetch,
+  });
+  onBeforeMount(async () => {});
+  // 新增按钮事件
+  function handleCreate() {
+    openDrawer(true, {
+      isUpdate: false,
+      record: { id: props.info.id },
+    });
+  }
+
+  // 表格请求之前,对参数进行处理, 添加默认 排序
+  function handleBeforeFetch(params) {
+    return {
+      ...params,
+      orders: tableSort.value,
+      deviceId: props.info?.id,
+      maintainTime:
+        formValue.patrolTime && formValue.patrolTime.length > 0
+          ? [
+              formValue.patrolTime[0],
+              dayjs(formValue.patrolTime[1]).add(1, 'day').format('YYYY-MM-DD'),
+            ]
+          : undefined,
+      maintainCompany: formValue.maintainCompany,
+    };
+  }
+
+  // 弹窗回调事件
+  async function callSuccess() {
+    await reload();
+  }
+
+  // 查询回调
+  async function callForm(data) {
+    formValue.maintainCompany = data.maintainCompany || '';
+    formValue.patrolTime = data.patrolTime || [];
+    await reload();
+  }
+</script>
+<style lang="less" scoped>
+  ::v-deep(.ant-btn-link) {
+    color: rgb(61 65 85 / 100%);
+  }
+
+  ::v-deep(.ant-input) {
+    border-color: #c2ccd4;
+    border-radius: 4px;
+  }
+
+  ::v-deep(.ant-input-affix-wrapper) {
+    border-color: #c2ccd4;
+    border-radius: 4px;
+  }
+
+  ::v-deep(.ant-picker) {
+    border-color: #c2ccd4;
+    border-radius: 4px;
+  }
+
+  ::v-deep(.ant-table-tbody > tr > td) {
+    border-right: 0 !important;
+    border-left: 0 !important;
+    border-bottom: 1px solid #f0f0f0;
+  }
+
+  ::v-deep(.ant-table-wrapper table) {
+    border: 0;
+  }
+
+  ::v-deep(.ant-table-cell-fix-right-first::after, .ant-table-cell-fix-right-last::after) {
+    content: '';
+    top: auto;
+    width: 0;
+  }
+
+  .btn-add {
+    width: 120px;
+    border-radius: 4px;
+  }
+</style>