Browse Source

fix:流程修改

lupeng 11 months ago
parent
commit
4ec12a0455

+ 44 - 14
src/views/device/allocate/index.vue

@@ -222,15 +222,15 @@ option.value = Object.assign(option.value, {
   viewBtn: false,
   editBtn: false,
   column: [
-    {
+    /*{
       label: "调拨单号",
       prop: "allocateNo",
       display: false,
       width: 130,
       overHidden: true,
-    },
+    },*/
     {
-      label: "设备编号",
+      label: "资产编号",
       prop: "deviceNo",
       width: 130,
       overHidden: true,
@@ -238,7 +238,7 @@ option.value = Object.assign(option.value, {
       rules: [
         {
           required: true,
-          message: "设备编号不能为空",
+          message: "公司资产号不能为空",
           trigger: "trigger",
         },
       ],
@@ -249,7 +249,7 @@ option.value = Object.assign(option.value, {
       },
     },
     {
-      label: "设备名称",
+      label: "名称",
       prop: "deviceName",
       addDisabled: true,
       width: 130,
@@ -257,12 +257,38 @@ option.value = Object.assign(option.value, {
       search: true,
     },
     {
+      label: "型号",
+      prop: "specifications",
+      addDisabled: true,
+      width: 130,
+      overHidden: true,
+      search: true,
+    },
+    {
+      label: "出厂编号",
+      prop: "serialNumber",
+      addDisabled: true,
+      width: 130,
+      overHidden: true,
+      search: true,
+    },
+    {
+      label: "原值",
+      prop: "originalValue",
+      addDisabled: true,
+      width: 130,
+      overHidden: true,
+      search: true,
+    },
+    {
       label: "设备类型",
       prop: "deviceType",
       type: "select",
       width: 100,
       overHidden: true,
       addDisabled: true,
+      display: false,
+      hide: true,
       search: true,
       dicUrl:
         dictDataUtil.request_url +
@@ -280,7 +306,7 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
-      label: "部门",
+      label: "调出部门",
       prop: "oldDept",
       type: "tree",
       width: 130,
@@ -293,7 +319,7 @@ option.value = Object.assign(option.value, {
       }
     },
     {
-      label: "部门",
+      label: "调入部门",
       prop: "applyDept",
       type: "tree",
       width: 130,
@@ -306,7 +332,7 @@ option.value = Object.assign(option.value, {
       rules: [
         {
           required: true,
-          message: "部门不能为空",
+          message: "调入部门不能为空",
           trigger: "trigger",
         },
       ],
@@ -317,16 +343,18 @@ option.value = Object.assign(option.value, {
       width: 100,
       overHidden: true,
       addDisabled: true,
+      display: false,
+      hide: true,
     },
     {
-      label: "新责人",
+      label: "新责人",
       prop: "newHead",
       width: 100,
       overHidden: true,
       rules: [
         {
           required: true,
-          message: "新责人不能为空",
+          message: "新责人不能为空",
           trigger: "trigger",
         },
       ],
@@ -337,21 +365,23 @@ option.value = Object.assign(option.value, {
       prop: "devicePosition",
       width: 130,
       overHidden: true,
+      display: false,
+      hide: true,
     },
     {
-      label: "设备新位置",
+      label: "新安置地点",
       prop: "deviceToPosition",
       width: 130,
       overHidden: true,
       rules: [
         {
           required: true,
-          message: "设备新位置不能为空",
+          message: "新安置地点不能为空",
           trigger: "trigger",
         },
       ],
     },
-    {
+    /*{
       label: "调拨周期(天)",
       prop: "allocateCycle",
       type: "number",
@@ -365,7 +395,7 @@ option.value = Object.assign(option.value, {
           trigger: "trigger",
         },
       ],
-    },
+    },*/
     {
       label: "状态",
       prop: "state",

+ 161 - 0
src/views/device/disable/index.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+      ref="crudRef"
+      v-model:search="search"
+      v-model="form"
+      :data="data"
+      :option="option"
+      v-model:page="page"
+      @row-save="createRow"
+      @row-update="updateRow"
+      @row-del="deleteRow"
+      @search-change="searchChange"
+      @search-reset="resetChange"
+      @size-change="dataList"
+      @current-change="dataList"
+      @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+        >删除</el-button
+        >
+      </template>
+
+    </avue-crud>
+
+  </div>
+  <CommonTable
+    ref="ctableRef"
+    tableTitle="设备选择"
+    tableType="DEVICE"
+    @selected-sure="onSelectedFinish"
+  />
+</template>
+<script setup>
+  import { ref, getCurrentInstance } from "vue";
+  import { useCrud } from "@/hooks/userCrud";
+  import ButtonPermKeys from "@/common/configs/buttonPermission";
+  import { useCommonStoreHook } from "@/store";
+  const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+
+  const test = () => {
+    isShowTable.value = true;
+    tableType.value = tableType.value == 1 ? 2 : 1;
+  };
+
+  // 传入一个url,后面不带/
+  const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+    useCrud({
+      src: "/api/v1/device/disable",
+    });
+  const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } =
+    Methords; //增删改查
+  const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+  const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+
+
+  const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+
+  onMounted(() => {
+    // console.log("crudRef", crudRef)
+    dataList();
+  });
+  const ctableRef=ref(null);
+  const onSelectedFinish=(selectedValue)=>{
+      form.value.deviceName=selectedValue.deviceName;
+      form.value.deviceNo=selectedValue.deviceNo;
+      form.value.specifications=selectedValue.specifications;
+      form.value.manufacturer=selectedValue.manufacturer;
+      form.value.originalValue=selectedValue.originalValue;
+  }
+
+
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    selection: true,
+    column: [
+      {
+        label: "名称",
+        prop: "deviceName",
+        search: true,
+        overHidden: true,
+        rules: [
+          {
+          required: true,
+          message: "请输入名称",
+          trigger: "blur",
+          },
+        ],
+          click: () => {
+              ctableRef.value.startSelect();
+          },
+      },
+    {
+      label: "统一编码",
+      prop: "deviceNo",
+      search: true,
+      disabled: true,
+      overHidden: true,
+    },
+      {
+        label: "型号",
+        prop: "specifications",
+        disabled: true,
+        overHidden: true,
+      },
+      {
+        label: "使用年限",
+        prop: "deviceLife",
+        overHidden: true,
+      },
+      {
+        label: "厂家",
+        prop: "manufacturer",
+        disabled: true,
+        overHidden: true,
+      },
+       {
+        label: "原值",
+        prop: "originalValue",
+        disabled: true,
+         overHidden: true,
+       },
+        {
+            label: "停用时间",
+            prop: "disableTime",
+        },
+        {
+            label: "停用理由",
+            prop: "remark",
+            span:24,
+            type:"textarea",
+            overHidden: true,
+            rules: [
+                {
+                    required: true,
+                    message: "请输入停用理由",
+                    trigger: "blur",
+                },
+            ],
+        },
+      {
+        label: "申请人",
+        prop: "creator",
+        overHidden: true,
+        display:false
+      },
+      {
+        label: "申请时间",
+        prop: "created",
+        overHidden:true,
+        display:false
+      },
+    ],
+  });
+</script>

+ 127 - 67
src/views/device/instance/index.vue

@@ -210,7 +210,7 @@ option.value = Object.assign(option.value, {
   labelWidth: 120,
   column: [
     {
-      label: "设备编号",
+      label: "资产编号",
       prop: "deviceNo",
       search: true,
       editDisabled: true,
@@ -219,7 +219,7 @@ option.value = Object.assign(option.value, {
       rules: [
         {
           required: true,
-          message: "设备编号不能为空",
+          message: "资产编号不能为空",
           trigger: "trigger",
         },
       ],
@@ -239,15 +239,102 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
-      label: "设备类型",
-      prop: "deviceType",
+      label: "型号",
+      prop: "specifications",
+      width: 160,
+      overHidden: true,
+      rules: [
+        {
+          required: true,
+          message: "型号不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "制造厂",
+      width: 100,
+      overHidden: true,
+      prop: "brand",
+    },
+    {
+      label: "购买方",
+      prop: "manufacturer",
+      width: 100,
+      overHidden: true,
+    },
+    {
+      label: "出厂编号",
+      prop: "serialNumber",
+      width: 100,
+      overHidden: true,
+    },
+    {
+      label: "出厂日期",
+      prop: "serialDate",
+      type: "date",
+      width: 100,
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+      overHidden: true,
+    },
+    {
+      label: "启用日期",
+      prop: "activationDate",
+      type: "date",
+      width: 100,
+      format: 'YYYY-MM-DD',
+      valueFormat: 'YYYY-MM-DD',
+      overHidden: true,
+    },
+    {
+      label: "原值",
+      prop: "originalValue",
+      width: 100,
+      overHidden: true,
+    },
+    {
+      label: "所属部门",
+      prop: "deptId",
+      width: 100,
+      overHidden: true,
+      type: "tree",
+      dicUrl: dictDataUtil.dept_tree_url,
+      props: {
+        label: "deptName",
+        value: "id",
+      },
+      rules: [
+        {
+          required: true,
+          message: "所属部门不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "存放位置",
+      prop: "devicePosition",
+      width: 100,
+      overHidden: true,
+      rules: [
+        {
+          required: true,
+          message: "存放位置不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "状态",
+      prop: "state",
       type: "select",
-      width: 130,
+      width: 120,
       overHidden: true,
       search: true,
       dicUrl:
         dictDataUtil.request_url +
-        dictDataUtil.TYPE_CODE.device_type,
+        dictDataUtil.TYPE_CODE.device_status,
       props: {
         label: "dictLabel",
         value: "dictValue",
@@ -255,21 +342,42 @@ option.value = Object.assign(option.value, {
       rules: [
         {
           required: true,
-          message: "设备类型不能为空",
+          message: "状态不能为空",
           trigger: "trigger",
         },
       ],
     },
     {
-      label: "设备状态",
-      prop: "state",
-      type: "select",
+      label: "责任人",
+      prop: "head",
       width: 120,
       overHidden: true,
+      rules: [
+        {
+          required: true,
+          message: "责任人不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "备注",
+      span: 24,
+      overHidden: true,
+      prop: "remark",
+      width: 120,
+      type: "textarea",
+    },
+    {
+      label: "设备类型",
+      prop: "deviceType",
+      type: "select",
+      width: 130,
+      overHidden: true,
       search: true,
       dicUrl:
-          dictDataUtil.request_url +
-          dictDataUtil.TYPE_CODE.device_status,
+        dictDataUtil.request_url +
+        dictDataUtil.TYPE_CODE.device_type,
       props: {
         label: "dictLabel",
         value: "dictValue",
@@ -277,11 +385,12 @@ option.value = Object.assign(option.value, {
       rules: [
         {
           required: true,
-          message: "设备状态不能为空",
+          message: "设备类型不能为空",
           trigger: "trigger",
         },
       ],
     },
+
     {
       label: "在线状态",
       prop: "onlineState",
@@ -311,19 +420,6 @@ option.value = Object.assign(option.value, {
       },
     },
     {
-      label: "负责人",
-      prop: "head",
-      width: 120,
-      overHidden: true,
-      rules: [
-        {
-          required: true,
-          message: "负责人不能为空",
-          trigger: "trigger",
-        },
-      ],
-    },
-    {
       label: "计量有效期",
       prop: "meteringDate",
       type: "date",
@@ -339,7 +435,7 @@ option.value = Object.assign(option.value, {
         },
       ],
     },
-    {
+   /* {
       label: "所属PAC",
       prop: "terminal",
       type: "select",
@@ -350,8 +446,8 @@ option.value = Object.assign(option.value, {
       props: {
         label: "deviceName",
         value: "deviceNo",
-      }
-    },
+      },
+    },*/
     /*{
       label: "是否采集",
       prop: "collect",
@@ -360,25 +456,7 @@ option.value = Object.assign(option.value, {
       slot: true,
       width: 100,
     },*/
-    {
-      label: "供应厂商",
-      prop: "manufacturer",
-      width: 160,
-      overHidden: true,
-    },
-    {
-      label: "所属部门",
-      prop: "deptId",
-      width: 160,
-      overHidden: true,
-      type: "tree",
-      dicUrl: dictDataUtil.dept_tree_url,
-      props: {
-        label: "deptName",
-        value: "id",
-      }
-    },
-    {
+    /*{
       label: "所在车间",
       prop: "workshop",
       width: 160,
@@ -389,25 +467,7 @@ option.value = Object.assign(option.value, {
       prop: "station",
       width: 160,
       overHidden: true,
-    },
-    {
-      label: "设备位置",
-      prop: "devicePosition",
-      width: 160,
-      overHidden: true,
-    },
-    {
-      label: "规格",
-      prop: "specifications",
-      width: 160,
-      overHidden: true,
-    },
-    {
-      label: "品牌",
-      width: 160,
-      overHidden: true,
-      prop: "brand",
-    },
+    },*/
   ],
 });
 

+ 89 - 46
src/views/device/maintenance/index.vue

@@ -68,21 +68,40 @@
       <el-timeline style="max-width: 500px;margin-left: 100px">
         <el-timeline-item center color="#0bbd87" type="success" placement="top">
           <el-card>
-            <h4>维护计划</h4>
+            <h4>保养计划</h4>
             <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
             <p>设备名称:{{maintenanceInfo.deviceName}}</p>
-            <p>维护内容:{{maintenanceInfo.remark}}</p>
+            <p>保养内容:{{maintenanceInfo.remark}}</p>
             <p>计划时间:{{maintenanceInfo.nextTime}}</p>
           </el-card>
         </el-timeline-item>
         <el-timeline-item center placement="top" :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
           <el-card>
-            <h4>设备维护</h4>
+            <h4>设备保养</h4>
             <el-form ref="maintenanceInfoForm" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules">
-              <el-form-item label="维护人员" prop="userName">
+              <el-form-item v-if="maintenanceInfo.result === 0" label="保养项目" prop="maintenanceContent">
+                <el-input v-model="maintenanceInfo.maintenanceContent" type="textarea" />
+              </el-form-item>
+              <el-form-item label="维护人" prop="userName">
+
                 <el-select
                     v-model="maintenanceInfo.userName"
-                    placeholder="维护人员"
+                    placeholder="维护人"
+                    size="large"
+                    style="width: 240px">
+                  <el-option
+                      v-for="item in userList"
+                      :key="item.userName"
+                      :label="item.userName"
+                      :value="item.userName"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="确认人" prop="confirmUser">
+
+                <el-select
+                    v-model="maintenanceInfo.confirmUser"
+                    placeholder="确认人"
                     size="large"
                     style="width: 240px">
                   <el-option
@@ -102,12 +121,14 @@
               <el-form-item v-if="maintenanceInfo.result === 1" label="报故内容">
                 <el-input v-model="maintenanceInfo.maintenanceContent" />
               </el-form-item>
-              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护日期">
-                <el-input v-model="maintenanceInfo.nextTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
-              </el-form-item>
-              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护内容">
+
+
+                <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护日期">
+                    <el-input v-model="maintenanceInfo.nextTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
+                </el-form-item>
+<!--              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护内容">
                 <el-input v-model="maintenanceInfo.maintenanceContent" />
-              </el-form-item>
+              </el-form-item>-->
               <el-form-item style="margin-left: 45%">
                 <el-button type="primary" @click="maintenanceSubmit">保存</el-button>
               </el-form-item>
@@ -154,11 +175,11 @@ const dialog = reactive({
   visible: false,
 });
 const dialog1 = reactive({
-  title: "设备维护",
+  title: "设备保养",
   visible: false,
 });
 const dialog2 = reactive({
-  title: "设备维护记录",
+  title: "设备保养记录",
   visible: false,
 });
 const userList = ref([])
@@ -215,8 +236,22 @@ const rules = reactive({
     // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
     // min此字段的最小长度,max此字段的最大长度
     // pattern 正则表达式
-    { required: true, message: '维护人员不能为空', trigger: 'blur' }
-  ]
+    { required: true, message: '维护人不能为空', trigger: 'blur' }
+  ],
+  confirmUser: [
+    // required是否必填,message不符合此规则时的提示信息,
+    // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
+    // min此字段的最小长度,max此字段的最大长度
+    // pattern 正则表达式
+    { required: true, message: '确认人不能为空', trigger: 'blur' }
+  ],
+  maintenanceContent: [
+  // required是否必填,message不符合此规则时的提示信息,
+  // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
+  // min此字段的最小长度,max此字段的最大长度
+  // pattern 正则表达式
+  { required: true, message: '保养项目不能为空', trigger: 'blur' }
+]
 })
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
@@ -226,23 +261,6 @@ option.value = Object.assign(option.value, {
   viewBtn: false,
   column: [
     {
-      label: "设备编号",
-      prop: "deviceNo",
-      search: true,
-      rules: [
-        {
-          required: true,
-          message: "设备编号不能为空",
-          trigger: "trigger",
-        },
-      ],
-      click: ({ value, column }) => {
-        if(column.boxType){
-          dialog.visible = true
-        }
-      },
-    },
-    {
       label: "设备名称",
       prop: "deviceName",
       display: false,
@@ -253,6 +271,7 @@ option.value = Object.assign(option.value, {
       prop: "deviceType",
       type: "select",
       search: true,
+      hide:true,
       display: false,
       dicUrl:
         dictDataUtil.request_url +
@@ -270,6 +289,44 @@ option.value = Object.assign(option.value, {
       ],
     },
     {
+      label: "型号",
+      prop: "specifications",
+      display: false,
+      search: true,
+    },
+    {
+      label: "编号",
+      prop: "deviceNo",
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "设备编号不能为空",
+          trigger: "trigger",
+        },
+      ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog.visible = true;
+        }
+      },
+    },
+    {
+      label: "保养维护内容",
+      prop: "remark",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
+      overHidden: true,
+      rules: [
+        {
+          required: true,
+          message: "保养维护内容不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
       label: "设备位置",
       prop: "devicePosition",
       display: false,
@@ -357,21 +414,7 @@ option.value = Object.assign(option.value, {
         },
       ],
     },
-    {
-      label: "维护内容",
-      prop: "remark",
-      minRows: 2, //最小行/最小值
-      type: "textarea", //类型为多行文本域框
-      maxlength: 512, //最大输入长度
-      overHidden: true,
-      rules: [
-        {
-          required: true,
-          message: "维护内容不能为空",
-          trigger: "trigger",
-        },
-      ],
-    },
+
   ],
 });
 

+ 402 - 105
src/views/device/metering/index.vue

@@ -26,14 +26,32 @@
           >删除</el-button
         >
       </template>-->
-      <template #menu="{size,row,index}">
+      <template #menu="{size,row,index}" >
         <el-button @click="maintenance(row)"
                    icon="el-icon-setting"
                    text
                    type="primary"
-                   :size="size">计量</el-button>
+                   :size="size" v-if="radio1=='1'">计量</el-button>
+          <PDFView
+                  :need-to-show-pdf="true"
+                  content-type="button"
+                  :is-link="true"
+                  :pdf-source="filePath + row.pdfPath"
+                  v-if="radio1=='2'&&row.pdfPath!=''"
+          />
+          <el-button @click="maintenance(row)"
+                     icon="el-icon-setting"
+                     text
+                     type="primary"
+                     :size="size" v-if="radio1=='2'">更新附件</el-button>
       </template>
-      <template #menu-right="{}">
+        <template #menu-left="{}">
+            <el-radio-group v-model="radio1" size="large" @change="searchChangeState">
+                <el-radio-button label="待计量" value="1" />
+                <el-radio-button label="已计量" value="2" />
+            </el-radio-group>
+        </template>
+      <template #menu-right="{}" v-if="radio1=='2'">
         <el-button
             class="ml-3"
             @click="exportData('/api/v1/device/export')"
@@ -71,29 +89,74 @@
           <el-card>
             <h4>设备计量</h4>
             <el-form ref="maintenanceInfoForm" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules">
-              <el-form-item label="计量人员" prop="userName">
+              <el-form-item label="检测单位" prop="meteringUnit">
                 <el-select
-                    v-model="maintenanceInfo.userName"
-                    placeholder="计量人员"
+                    v-model="maintenanceInfo.meteringUnit"
+                    placeholder="检测单位"
                     size="large"
                     style="width: 240px">
                   <el-option
-                      v-for="item in userList"
-                      :key="item.userName"
-                      :label="item.userName"
-                      :value="item.userName"
+                      v-for="item in unitList"
+                      :key="item.dictLabel"
+                      :label="item.dictLabel"
+                      :value="item.dictLabel"
                   />
                 </el-select>
               </el-form-item>
+                <el-form-item label="ABC类" prop="meteringType">
+                    <el-select
+                            v-model="maintenanceInfo.meteringType"
+                            placeholder="ABC类"
+                            size="large"
+                            style="width: 240px">
+                        <el-option
+                                v-for="item in abc"
+                                :key="item.dictLabel"
+                                :label="item.dictLabel"
+                                :value="item.dictLabel"
+                        />
+                    </el-select>
+                </el-form-item>
+
+                    <!--        <single-upload v-model="form.drawingPath" :generatePdf="true"/>-->
+
+                <el-form-item label="计量周期" prop="cycle">
+                    <el-input v-model="maintenanceInfo.cycle" placeholder="计量周期" size="large" width="240px"/>
+                </el-form-item>
+
               <el-form-item label="计量结果">
                 <el-radio-group v-model="maintenanceInfo.result" class="ml-4">
-                  <el-radio :value="0">已计量</el-radio>
+                    <el-radio :value="0">合格</el-radio>
+                    <el-radio :value="1">不合格</el-radio>
                 </el-radio-group>
               </el-form-item>
 <!--              <el-form-item v-if="maintenanceInfo.result === 1" label="报故内容">
                 <el-input v-model="maintenanceInfo.maintenanceContent" />
               </el-form-item>-->
-              <el-form-item label="下次计量日期" prop="nextTime">
+                <el-form-item label="附件上传">
+                    <el-radio-group v-model="maintenanceInfo.upload" class="ml-4">
+                        <FilesUpload
+                                v-model:src="fileUrl"
+                                v-model:pdf-list="pdfUrlList"
+                                v-model:file-name-list="fileNameList"
+                                :generate-pdf="true"
+                                @finished="testFiles"
+                        />
+                    </el-radio-group>
+                </el-form-item>
+                <el-form-item label="计量日期" prop="maintenanceTime">
+                    <el-date-picker
+                            v-model="maintenanceInfo.maintenanceTime"
+                            type="date"
+                            style="width:240px;"
+                            placeholder="请选择时间"
+                            format="YYYY-MM-DD"
+                            value-format="YYYY-MM-DD"
+                    />
+
+                    <!--                <el-input v-model="maintenanceInfo.nextTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>-->
+                </el-form-item>
+                <el-form-item label="下次计量日期" prop="nextTime">
                 <el-date-picker
                     v-model="maintenanceInfo.nextTime"
                     type="date"
@@ -103,6 +166,7 @@
                     format="YYYY-MM-DD"
                     value-format="YYYY-MM-DD"
                 />
+
 <!--                <el-input v-model="maintenanceInfo.nextTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>-->
               </el-form-item>
 <!--              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护内容">
@@ -132,16 +196,37 @@
 import { ref, getCurrentInstance } from "vue";
 import { useCrud } from "@/hooks/userCrud";
 import ButtonPermKeys from "@/common/configs/buttonPermission";
-import {getUserList} from "@/api/system/user"
+import {getUserList} from "@/api/system/user";
+import { queryDictDataByType } from "@/api/system/dict";
 import {maintenanceUpdate,meteringUpdate} from "@/api/device/index";
 import { useCommonStoreHook } from "@/store";
 import dictDataUtil from "@/common/configs/dictDataUtil";
 import RecordPage from "./components/metering-record.vue";
+import PDFView from "@/components/PDFView/index.vue";
 const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const pdfUrlList = ref([]);
+const fileUrl = ref();
+const fileNameList = ref([]);
+const typeList = ref([]);
+const filePath = import.meta.env.VITE_APP_UPLOAD_URL;
 const test = () => {
   isShowTable.value = true;
   tableType.value = tableType.value == 1 ? 2 : 1;
 };
+const searchChangeState=()=>{
+    search.value.needMetering=radio1.value;
+    if(radio1.value=="1"){
+        crudRef.value.option.column=column1.value;
+    }
+    if(radio1.value=="2"){
+
+        crudRef.value.option.column=column2.value;
+        //crudRef.value.option=option1;
+    }
+    dataList();
+}
+
+const radio1 = ref('1')
 const disabledDate = (time) =>{
   return time.getTime() < Date.now(); // 8.64e7 毫秒数代表一天
 }
@@ -157,11 +242,13 @@ const dialog2 = reactive({
   title: "设备计量记录",
   visible: false,
 });
-const userList = ref([])
+const userList = ref([]);
+const unitList = ref([]);
+const abc = ref([]);
 // 传入一个url,后面不带/
 const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
   useCrud({
-    src: "/api/v1/device",
+    src: "/api/v1/device/metering",
   });
 const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
 const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
@@ -177,6 +264,11 @@ const maintenance = (row)=>{
   maintenanceInfo.value.deviceId = row.id
   maintenanceInfo.value.result = 0
   dialog1.visible = true
+};
+const testFiles =()=>{
+    maintenanceInfo.value.pdfPath = pdfUrlList.value[0];
+    maintenanceInfo.value.filePath = fileUrl.value;
+    maintenanceInfo.value.fileName=fileNameList.value[0];
 }
 const maintenanceList = (row)=>{
   maintenanceInfo.value = row
@@ -186,6 +278,17 @@ const queryUserList = ()=>{
   getUserList({}).then((data)=>{
     userList.value = data.data
   })
+};
+
+const queryUnitList = () => {
+    queryDictDataByType("metering_unit").then((data)=>{
+        unitList.value = data.data
+    })
+}
+const queryAbc = () => {
+    queryDictDataByType("ABC").then((data)=>{
+        abc.value = data.data
+    })
 }
 const maintenanceInfoForm = ref('maintenanceInfoForm')
 const maintenanceSubmit =()=>{
@@ -205,7 +308,7 @@ const maintenanceSubmit =()=>{
   })
 }
 const rules = reactive({
-  userName: [
+    meteringUnit: [
     // required是否必填,message不符合此规则时的提示信息,
     // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
     // min此字段的最小长度,max此字段的最大长度
@@ -213,8 +316,17 @@ const rules = reactive({
     { required: true, message: '计量人员不能为空', trigger: 'blur' }
   ],
   nextTime: [
-    { required: true, message: '计量日期不能为空', trigger: 'blur' }
-  ]
+    { required: true, message: '下次计量日期不能为空', trigger: 'blur' }
+  ],
+    maintenanceTime: [
+        { required: true, message: '计量日期不能为空', trigger: 'blur' }
+    ],
+    meteringType: [
+        { required: true, message: 'ABC类不能为空', trigger: 'blur' }
+    ],
+    cycle: [
+        { required: true, message: '计量周期不能为空', trigger: 'blur' }
+    ],
 })
 // 设置表格列或者其他自定义的option
 option.value = Object.assign(option.value, {
@@ -226,40 +338,69 @@ option.value = Object.assign(option.value, {
   viewBtn: false,
   column: [
     {
-      label: "设备编号",
+      label: "本所编码",
       prop: "deviceNo",
       search: true,
-      width: 160,
       overHidden: true,
     },
     {
       label: "设备名称",
       prop: "deviceName",
       search: true,
-      width: 160,
       overHidden: true,
     },
     {
+      label: "设备型号",
+      prop: "specifications",
+      overHidden: true,
+    },
+    {
+      label: "出厂编号",
+      prop: "serialNumber",
+      overHidden: true,
+    },
+
+      {
+          label: "使用单位",
+          prop: "deptId",
+          width: 100,
+          overHidden: true,
+          type: "tree",
+          dicUrl: dictDataUtil.dept_tree_url,
+          props: {
+              label: "deptName",
+              value: "id",
+          },
+      },
+      {
+          label: "存放位置",
+          prop: "devicePosition",
+          width: 160,
+          overHidden: true,
+      },
+
+
+    {
       label: "计量日期",
       prop: "meteringSearch",
       width: 160,
       type: 'daterange',
       searchRange: true,
-      hide: true,
+        hide: true,
       startPlaceholder: '开始范围',
       endPlaceholder: '结束范围',
       format: 'YYYY-MM-DD',
       valueFormat: 'YYYY-MM-DD',
       overHidden: true,
-      search: true
+      search: true,
     },
     {
       label: "设备类型",
       prop: "deviceType",
       type: "select",
       width: 130,
+      hide: true,
       overHidden: true,
-      search: true,
       dicUrl:
           dictDataUtil.request_url +
           dictDataUtil.TYPE_CODE.device_type,
@@ -268,117 +409,273 @@ option.value = Object.assign(option.value, {
         value: "dictValue",
       },
     },
+
     {
-      label: "设备状态",
-      prop: "state",
-      type: "select",
-      width: 160,
-      overHidden: true,
-      search: true,
-      dicUrl:
-          dictDataUtil.request_url +
-          dictDataUtil.TYPE_CODE.device_status,
-      props: {
-        label: "dictLabel",
-        value: "dictValue",
-      },
-    },
-    /*{
-      label: "在线状态",
-      prop: "onlineState",
-      width: 100,
-      display: false,
-      html: true,
-      formatter: (val) => {
-        if (val.onlineState === "1") {
-          return '<b class="el-tag el-tag--success el-tag--light">在线</b>';
-        } else {
-          return '<b class="el-tag el-tag--warning el-tag--light">离线</b>';
-        }
-      },
-    },*/
-    {
-      label: "负责人",
+      label: "责任人",
       prop: "head",
-      width: 160,
       overHidden: true,
     },
     {
       label: "计量有效期",
       prop: "meteringDate",
       type: "date",
-      width: 160,
       format: 'YYYY-MM-DD',
       valueFormat: 'YYYY-MM-DD',
       overHidden: true,
     },
+
+  ],
+});
+const column1 = ref([
     {
-      label: "所属PAC",
-      prop: "terminal",
-      type: "select",
-      width: 160,
-      overHidden: true,
-      dicUrl:import.meta.env.VITE_APP_BASE_API + "/api/v1/device/pacList",
-      props: {
-        label: "deviceName",
-        value: "deviceNo",
-      }
+        label: "本所编码",
+        prop: "deviceNo",
+        search: true,
+        overHidden: true,
     },
     {
-      label: "供应厂商",
-      prop: "manufacturer",
-      width: 160,
-      overHidden: true,
+        label: "设备名称",
+        prop: "deviceName",
+        search: true,
+        overHidden: true,
     },
     {
-      label: "所属部门",
-      prop: "deptId",
-      width: 160,
-      overHidden: true,
-      type: "tree",
-      dicUrl: dictDataUtil.dept_tree_url,
-      props: {
-        label: "deptName",
-        value: "id",
-      }
+        label: "设备型号",
+        prop: "specifications",
+        overHidden: true,
     },
     {
-      label: "所在车间",
-      prop: "workshop",
-      width: 160,
-      overHidden: true,
+        label: "出厂编号",
+        prop: "serialNumber",
+        overHidden: true,
     },
+
     {
-      label: "所在工位",
-      prop: "station",
-      width: 160,
-      overHidden: true,
+        label: "使用单位",
+        prop: "deptId",
+        overHidden: true,
+        type: "tree",
+        dicUrl: dictDataUtil.dept_tree_url,
+        props: {
+            label: "deptName",
+            value: "id",
+        },
     },
     {
-      label: "设备位置",
-      prop: "devicePosition",
-      width: 160,
-      overHidden: true,
+        label: "存放位置",
+        prop: "devicePosition",
+        width: 160,
+        overHidden: true,
     },
+
+
     {
-      label: "规格",
-      prop: "specifications",
-      width: 160,
-      overHidden: true,
+        label: "计量日期",
+        prop: "meteringSearch",
+        width: 160,
+        type: 'daterange',
+        searchRange: true,
+        hide: true,
+        startPlaceholder: '开始范围',
+        endPlaceholder: '结束范围',
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        overHidden: true,
+        search: true,
     },
     {
-      label: "品牌",
-      width: 160,
-      overHidden: true,
-      prop: "brand",
+        label: "设备类型",
+        prop: "deviceType",
+        type: "select",
+        hide: true,
+        overHidden: true,
+        dicUrl:
+            dictDataUtil.request_url +
+        dictDataUtil.TYPE_CODE.device_type,
+        props: {
+            label: "dictLabel",
+            value: "dictValue",
+        },
     },
-  ],
-});
+
+    {
+        label: "责任人",
+        prop: "head",
+        overHidden: true,
+    },
+    {
+        label: "计量有效期",
+        prop: "meteringDate",
+        type: "date",
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        overHidden: true,
+    },
+]);
+const column2 = ref([
+    {
+        label: "本所编码",
+        prop: "deviceNo",
+        search: true,
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "设备名称",
+        prop: "deviceName",
+        search: true,
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "设备型号",
+        prop: "specifications",
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "出厂编号",
+        prop: "serialNumber",
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "检验单位",
+        prop: "meteringUnit",
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "使用单位",
+        prop: "deptId",
+        width: 100,
+        overHidden: true,
+        type: "tree",
+        dicUrl: dictDataUtil.dept_tree_url,
+        props: {
+            label: "deptName",
+            value: "id",
+        },
+    },
+    {
+        label: "存放位置",
+        prop: "devicePosition",
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "ABC类",
+        prop: "meteringType",
+        width: 160,
+        overHidden: true,
+    },
+
+    {
+        label: "计量日期",
+        prop: "meteringSearch",
+        width: 160,
+        type: 'daterange',
+        hide:true,
+        searchRange: true,
+        startPlaceholder: '开始范围',
+        endPlaceholder: '结束范围',
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        overHidden: true,
+        search: true,
+    },
+  {
+    label: "计量日期",
+    prop: "maintenanceTime",
+    width: 160,
+    searchRange: true,
+    valueFormat: 'YYYY-MM-DD',
+    overHidden: true,
+  },
+    {
+        label: "计量周期",
+        prop: "cycle",
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: '结果',
+        prop: 'result',
+        dicData: [
+            {
+            label: "合格",
+            value: 0,
+            },
+            {
+                label: '不合格',
+                value: 1,
+            }
+          ]
+    },
+    {
+        label: "设备类型",
+        prop: "deviceType",
+        type: "select",
+        width: 130,
+        hide: true,
+        overHidden: true,
+        dicUrl:
+            dictDataUtil.request_url +
+            dictDataUtil.TYPE_CODE.device_type,
+        props: {
+            label: "dictLabel",
+            value: "dictValue",
+        },
+    },
+    {
+        label: "责任人",
+        prop: "head",
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "下次计量时间",
+        prop: "nextTime",
+        type: "date",
+        width: 160,
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        overHidden: true,
+    },
+    {
+        label: "附件",
+        prop: "fileName",
+        width: 160,
+        overHidden: true,
+    },
+    {
+        label: "附件下载",
+        prop: "filePath",
+        width: 120,
+        html: true,
+        formatter: (val) => {
+            if(val.filePath!=""){return '<a class="el-tag el-tag--info el-tag--light" href="'+filePath+ val.filePath + '" >文件下载</a>';}else {
+                return val.filePath;
+            }
+
+        },
+    }
+]);
+// 设置表格列或者其他自定义的option
 
 onMounted(() => {
-  search.value.needMetering = "1"
-  maintenanceInfo.result = "0"
+  search.value.needMetering = "1";
+  maintenanceInfo.result = "0";
   dataList();
-  queryUserList()
+  //queryUserList()
+    queryUnitList();
+    queryAbc();
 });
 </script>
+<style>
+.demo-tabs > .el-tabs__content {
+    color: #6b778c;
+    font-size: 32px;
+    font-weight: 600;
+}
+</style>

+ 46 - 38
src/views/device/repair/index.vue

@@ -58,17 +58,17 @@
       <el-timeline style="max-width: 500px;margin-left: 100px">
         <el-timeline-item center type="success" placement="top">
           <el-card>
-            <h4>设备故</h4>
+            <h4>设备故</h4>
             <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
             <p>设备名称: {{maintenanceInfo.deviceName}}</p>
-            <p>报故人员: {{maintenanceInfo.creator}}</p>
-            <p>故障描述: {{maintenanceInfo.bugRemark}}</p>
-            <p>报故时间: {{maintenanceInfo.created}}</p>
+            <p>使用人: {{maintenanceInfo.creator}}</p>
+            <p>故障现象: {{maintenanceInfo.bugRemark}}</p>
+            <p>日期: {{maintenanceInfo.created}}</p>
           </el-card>
         </el-timeline-item>
         <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
           <el-card v-if="viewPage">
-            <h4>设备维修</h4>
+            <h4>维修情况说明</h4>
             <p>维修人员: {{maintenanceInfo.handleUser}}</p>
             <p>维修内容: {{maintenanceInfo.handleContent}}</p>
             <p>处理结果: {{maintenanceInfo.handleUser ? (maintenanceInfo.handleResult === 0 ? '可正常运行' : '报废') : ''}}</p>
@@ -92,7 +92,7 @@
                   />
                 </el-select>
               </el-form-item>
-              <el-form-item label="维修内容" prop="handleContent">
+              <el-form-item label="维修记录" prop="handleContent">
                 <el-input :disabled="maintenanceInfo.state !== 0" type="textarea" :rows="2" v-model="maintenanceInfo.handleContent" />
               </el-form-item>
               <el-form-item label="处理结果">
@@ -107,7 +107,7 @@
             </el-form>
           </el-card>
         </el-timeline-item>
-        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 1 ? 'primary' : maintenanceInfo.state === 0 ? 'info' : 'success'">
+<!--        <el-timeline-item center placement="top"  :type="maintenanceInfo.state === 1 ? 'primary' : maintenanceInfo.state === 0 ? 'info' : 'success'">
           <el-card v-if="viewPage">
             <h4>设备审批</h4>
             <p>审批人员: {{maintenanceInfo.auditUser}}</p>
@@ -117,7 +117,7 @@
             <h4>设备审批</h4>
             <el-form ref="maintenanceInfoForm2" v-if="maintenanceInfo.state >= 1" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules2">
               <el-form-item label="审批人员" prop="auditUser">
-<!--                <el-input :disabled="maintenanceInfo.state !== 1 && readonly"  v-model="maintenanceInfo.auditUser" />-->
+&lt;!&ndash;                <el-input :disabled="maintenanceInfo.state !== 1 && readonly"  v-model="maintenanceInfo.auditUser" />&ndash;&gt;
                 <el-select
                     v-model="maintenanceInfo.auditUser"
                     placeholder="审批人员"
@@ -143,7 +143,7 @@
               </el-form-item>
             </el-form>
           </el-card>
-        </el-timeline-item>
+        </el-timeline-item>-->
       </el-timeline>
     </el-dialog>
   </div>
@@ -193,6 +193,7 @@ const deviceInfo = (value) => {
   form.value.deviceName =value.deviceName
   form.value.deviceType = value.deviceType
   form.value.devicePosition = value.devicePosition
+  form.value.specifications = value.specifications
   dialog.visible = false
 }
 const maintenanceInfo = ref(null)
@@ -261,7 +262,13 @@ option.value = Object.assign(option.value, {
   editBtn: false,
   column: [
     {
-      label: "设备编号",
+      label: "设备名称",
+      prop: "deviceName",
+      addDisabled: true,
+      search: true,
+    },
+      {
+      label: "编号",
       prop: "deviceNo",
       search: true,
       rules: [
@@ -278,10 +285,34 @@ option.value = Object.assign(option.value, {
       },
     },
     {
-      label: "设备名称",
-      prop: "deviceName",
+      label: "型号",
+      prop: "specifications",
       addDisabled: true,
-      search: true,
+    },
+    {
+      label: "故障现象",
+      prop: "bugRemark",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度,
+      rules: [
+        {
+          required: true,
+          message: "故障描述不能为空",
+          trigger: "trigger",
+        }
+      ]
+    },
+    {
+      label: "使用人",
+      prop: "creator",
+      display: false,
+    },
+    {
+      label: "日期",
+      prop: "created",
+      width: "180",
+      display: false,
     },
     {
       label: "设备类型",
@@ -309,20 +340,7 @@ option.value = Object.assign(option.value, {
       addDisabled: true,
       prop: "devicePosition",
     },
-    {
-      label: "故障描述",
-      prop: "bugRemark",
-      minRows: 2, //最小行/最小值
-      type: "textarea", //类型为多行文本域框
-      maxlength: 512, //最大输入长度,
-      rules: [
-        {
-          required: true,
-          message: "故障描述不能为空",
-          trigger: "trigger",
-        }
-       ]
-    },
+
     {
       label: "维修状态",
       prop: "state",
@@ -330,17 +348,7 @@ option.value = Object.assign(option.value, {
       display: false,
       dicData:[{label: '待维修',value: 0},{label: '待审批 ',value: 1},{label: '已完成',value: 2}],
     },
-    {
-      label: "报故人",
-      prop: "creator",
-      display: false,
-    },
-    {
-      label: "报故日期",
-      prop: "created",
-      width: "180",
-      display: false,
-    },
+
   ],
 });
 

+ 156 - 0
src/views/maintenance/components/record-page.vue

@@ -0,0 +1,156 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        v-model:page="page"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+    >
+    </avue-crud>
+  </div>
+</template>
+<script setup>
+import { ref,defineProps } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/device/maintenanceRecord",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate } = Utils; //按钮权限等工具
+const mType = ref("-1")
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const props = defineProps({
+  maintenance: {
+    type: Object,
+    default: () => {
+      return {};
+    }
+  }
+})
+
+watch?.(
+    () => props.maintenance,
+    (newVal) => {
+      search.value.maintenanceId = newVal.id
+      mType.value = newVal.type
+      handleOption()
+      dataList()
+    }
+);
+const handleOption =()=>{
+  // 设置表格列或者其他自定义的option
+  option.value = Object.assign(option.value, {
+    delBtn: false,
+    selection: false,
+    search: false,
+    editBtn: false,
+    addBtn: false,
+    viewBtn: false,
+    menu: false,
+    column: [
+      /*{
+        label: "设备类型",
+        prop: "deviceType",
+        type: "select",
+        width: '100',
+        dicUrl:
+            dictDataUtil.request_url +
+            dictDataUtil.TYPE_CODE.device_type,
+        props: {
+          label: "dictLabel",
+          value: "dictValue",
+        },
+      },*/
+      /* {
+         label: "设备位置",
+         width: '150',
+         prop: "devicePosition",
+       },*/
+      /*{
+        label: "维护类型",
+        prop: "type",
+        type: "select",
+        editDisplay: false,
+        dicData: [{label: '点检',value:'0'},{label: '保养',value:'1'}]
+      },*/
+      {
+        label: mType.value === "1" ? "保养日期" : "点检时间",
+        width: '180',
+        format: 'YYYY-MM-DD',
+        valueFormat: 'YYYY-MM-DD',
+        prop: "maintenanceTime",
+      },
+      {
+        label: mType.value === "1" ? "保养项目" : "点检内容",
+        prop: "maintenanceContent",
+        minRows: 2, //最小行/最小值
+        maxlength: 512, //最大输入长度
+        overHidden: true
+      },
+      {
+        label: mType.value === "1" ? "维护人" : "点检人员",
+        prop: "maintenanceUser",
+      },
+      {
+        label: "确认人",
+        prop: "confirmUser",
+      },
+      {
+        label: "设备编号",
+        prop: "deviceNo",
+        width: '120',
+        rules: [
+          {
+            required: true,
+            message: "设备编号不能为空",
+            trigger: "trigger",
+          },
+        ],
+      },
+      {
+        label: "设备名称",
+        prop: "deviceName",
+        width: '120',
+        rules: [
+          {
+            required: true,
+            message: "设备名称不能为空",
+            trigger: "trigger",
+          },
+        ],
+      },
+      {
+        label: mType.value === "1" ? "维护结果" : "点检结果",
+        prop: "result",
+        search: true,
+        type: "select",
+        editDisplay: false,
+        dicData: mType.value === "1" ? [{label: '正常',value:"0"},{label: '报故',value:"1"}] : [{label: '合格',value:"0"},{label: '不合格',value:"1"}]
+      },
+
+    ],
+  })
+}
+onMounted?.(() => {
+  search.value.maintenanceId = props.maintenance.id
+  handleOption()
+  dataList();
+});
+</script>

+ 425 - 0
src/views/maintenance/index.vue

@@ -0,0 +1,425 @@
+<template>
+  <div class="mainContentBox">
+    <avue-crud
+        ref="crudRef"
+        v-model:search="search"
+        v-model="form"
+        :data="data"
+        :option="option"
+        :permission="permission"
+        v-model:page="page"
+        @row-save="createRow"
+        @row-update="updateRow"
+        @row-del="deleteRow"
+        @search-change="searchChange"
+        @search-reset="resetChange"
+        @size-change="dataList"
+        @current-change="dataList"
+        @selection-change="selectionChange"
+    >
+      <template #menu-left="{ size }">
+        <el-button
+          :disabled="toDeleteIds.length < 1"
+          type="danger"
+          v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.maintenance_del]"
+          icon="el-icon-delete"
+          :size="size"
+          @click="multipleDelete"
+          >删除</el-button
+        >
+      </template>
+      <template #menu="{size,row,index}">
+        <el-button @click="maintenance(row)"
+                   icon="el-icon-setting"
+                   text
+                   v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.maintenance_handle]"
+                   v-if="row.type === '1' && row.state === 0"
+                   type="primary"
+                   :size="size">维护</el-button>
+        <el-button disabled
+                   icon="el-icon-setting"
+                   text
+                   v-hasPerm="[ButtonPermKeys.DEVICE.BTNS.maintenance_handle]"
+                   v-if="row.type === '1' && row.state === 1"
+                   type="primary"
+                   :size="size">维护</el-button>
+        <el-button @click="maintenanceList(row)"
+                   icon="el-icon-fold"
+                   text
+                   type="primary"
+                   :size="size">记录</el-button>
+      </template>
+    </avue-crud>
+    <el-dialog
+        v-model="dialog.visible"
+        :title="dialog.title"
+        width="850px"
+        @close="dialog.visible = false"
+    >
+      <device-page  @deviceInfo="deviceInfo"/>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog1.visible"
+        :title="dialog1.title"
+        width="750px"
+        height="80%"
+        @close="dialog1.visible = false">
+      <el-timeline style="max-width: 500px;margin-left: 100px">
+        <el-timeline-item center color="#0bbd87" type="success" placement="top">
+          <el-card>
+            <h4>保养计划</h4>
+            <p>设备编号: {{maintenanceInfo.deviceNo}}</p>
+            <p>设备名称:{{maintenanceInfo.deviceName}}</p>
+            <p>保养内容:{{maintenanceInfo.remark}}</p>
+            <p>计划时间:{{maintenanceInfo.nextTime}}</p>
+          </el-card>
+        </el-timeline-item>
+        <el-timeline-item center placement="top" :type="maintenanceInfo.state === 0 ? 'primary' : 'success'">
+          <el-card>
+            <h4>设备保养</h4>
+            <el-form ref="maintenanceInfoForm" :model="maintenanceInfo" label-width="auto" style="max-width: 400px" :rules="rules">
+              <el-form-item v-if="maintenanceInfo.result === 0" label="保养项目" prop="maintenanceContent">
+                <el-input v-model="maintenanceInfo.maintenanceContent" type="textarea" />
+              </el-form-item>
+              <el-form-item label="维护人" prop="userName">
+
+                <el-select
+                    v-model="maintenanceInfo.userName"
+                    placeholder="维护人"
+                    size="large"
+                    style="width: 240px">
+                  <el-option
+                      v-for="item in userList"
+                      :key="item.userName"
+                      :label="item.userName"
+                      :value="item.userName"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="确认人" prop="confirmUser">
+
+                <el-select
+                    v-model="maintenanceInfo.confirmUser"
+                    placeholder="确认人"
+                    size="large"
+                    style="width: 240px">
+                  <el-option
+                      v-for="item in userList"
+                      :key="item.userName"
+                      :label="item.userName"
+                      :value="item.userName"
+                  />
+                </el-select>
+              </el-form-item>
+              <el-form-item label="维护结果">
+                <el-radio-group v-model="maintenanceInfo.result" class="ml-4">
+                  <el-radio :value="0">正常</el-radio>
+                  <el-radio :value="1">报故</el-radio>
+                </el-radio-group>
+              </el-form-item>
+              <el-form-item v-if="maintenanceInfo.result === 1" label="报故内容">
+                <el-input v-model="maintenanceInfo.maintenanceContent" />
+              </el-form-item>
+
+
+                <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护日期">
+                    <el-input v-model="maintenanceInfo.nextTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
+                </el-form-item>
+<!--              <el-form-item v-if="maintenanceInfo.result === 0" label="下次维护内容">
+                <el-input v-model="maintenanceInfo.maintenanceContent" />
+              </el-form-item>-->
+              <el-form-item style="margin-left: 45%">
+                <el-button type="primary" @click="maintenanceSubmit">保存</el-button>
+              </el-form-item>
+            </el-form>
+          </el-card>
+        </el-timeline-item>
+      </el-timeline>
+    </el-dialog>
+
+    <el-dialog
+        v-model="dialog2.visible"
+        :title="dialog2.title"
+        width="60%"
+        height="80%"
+        @close="dialog2.visible = false"
+    >
+      <record-page :maintenance="clickRecord"></record-page>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import { ref, getCurrentInstance } from "vue";
+import { useCrud } from "@/hooks/userCrud";
+import ButtonPermKeys from "@/common/configs/buttonPermission";
+import {getUserList} from "@/api/system/user"
+import {maintenanceUpdate} from "@/api/device/index";
+import { useCommonStoreHook } from "@/store";
+import dictDataUtil from "@/common/configs/dictDataUtil";
+import RecordPage from "./components/record-page.vue";
+import { checkPerm } from "@/directive/permission";
+const { isShowTable, tableType } = toRefs(useCommonStoreHook());
+const test = () => {
+  isShowTable.value = true;
+  tableType.value = tableType.value == 1 ? 2 : 1;
+};
+const permission = reactive({
+  delBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.maintenance_del),
+  addBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.maintenance_add),
+  editBtn: checkPerm(ButtonPermKeys.DEVICE.BTNS.maintenance_edit),
+  menu: true,
+});
+const dialog = reactive({
+  title: "设备选择",
+  visible: false,
+});
+const dialog1 = reactive({
+  title: "设备保养",
+  visible: false,
+});
+const dialog2 = reactive({
+  title: "设备保养记录",
+  visible: false,
+});
+const userList = ref([])
+// 传入一个url,后面不带/
+const { form, data, option, search, page, toDeleteIds, Methords, Utils } =
+  useCrud({
+    src: "/api/v1/device/maintenance",
+  });
+const { dataList, createRow, updateRow, deleteRow, searchChange, resetChange } = Methords; //增删改查
+const { selectionChange, multipleDelete } = Methords; //选中和批量删除事件
+const { checkBtnPerm, downloadTemplate, exportData } = Utils; //按钮权限等工具
+const crudRef = ref(null); //crudRef.value 获取avue-crud对象
+const deviceInfo = (value) => {
+  form.value.deviceNo = value.deviceNo
+  dialog.visible = false
+}
+const maintenanceInfo = ref(null)
+const clickRecord = ref(null)
+const maintenance = (row)=>{
+  maintenanceInfo.value = row
+  maintenanceInfo.value.maintenanceContent = row.remark
+  maintenanceInfo.value.result = 0
+  dialog1.visible = true
+}
+const maintenanceList = (row)=>{
+  clickRecord.value = row
+  dialog2.visible = true
+}
+const queryUserList = ()=>{
+  getUserList({}).then((data)=>{
+    userList.value = data.data
+  })
+}
+const maintenanceInfoForm = ref('maintenanceInfoForm')
+const maintenanceSubmit =()=>{
+  //alert(JSON.stringify(maintenanceInfo.value))
+  maintenanceInfoForm.value.validate((isValid, invalidFields) => {
+    if (isValid) {
+      maintenanceUpdate(maintenanceInfo.value).then((data)=>{
+        ElMessage({
+          message: data.msg,
+          type: "success",
+        });
+        //maintenanceInfo.value = null
+        dialog1.visible = false
+        dataList()
+      })
+    }
+  })
+}
+const rules = reactive({
+  userName: [
+    // required是否必填,message不符合此规则时的提示信息,
+    // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
+    // min此字段的最小长度,max此字段的最大长度
+    // pattern 正则表达式
+    { required: true, message: '维护人不能为空', trigger: 'blur' }
+  ],
+  confirmUser: [
+    // required是否必填,message不符合此规则时的提示信息,
+    // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
+    // min此字段的最小长度,max此字段的最大长度
+    // pattern 正则表达式
+    { required: true, message: '确认人不能为空', trigger: 'blur' }
+  ],
+  maintenanceContent: [
+  // required是否必填,message不符合此规则时的提示信息,
+  // trigger触发此条规则校验的时机,有两个值, blur 或 change,默认就是blur和change都会进行校验
+  // min此字段的最小长度,max此字段的最大长度
+  // pattern 正则表达式
+  { required: true, message: '保养项目不能为空', trigger: 'blur' }
+]
+})
+// 设置表格列或者其他自定义的option
+option.value = Object.assign(option.value, {
+  delBtn: false,
+  selection: true,
+  labelWidth: 150,
+  viewBtn: false,
+  column: [
+    {
+      label: "设备名称",
+      prop: "deviceName",
+      display: false,
+      search: true,
+    },
+    {
+      label: "设备类型",
+      prop: "deviceType",
+      type: "select",
+      search: true,
+      hide:true,
+      display: false,
+      dicUrl:
+        dictDataUtil.request_url +
+        dictDataUtil.TYPE_CODE.device_type,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "设备类型不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "型号",
+      prop: "specifications",
+      display: false,
+      search: true,
+    },
+    {
+      label: "编号",
+      prop: "deviceNo",
+      search: true,
+      rules: [
+        {
+          required: true,
+          message: "设备编号不能为空",
+          trigger: "trigger",
+        },
+      ],
+      click: ({ value, column }) => {
+        if(column.boxType){
+          dialog.visible = true;
+        }
+      },
+    },
+    {
+      label: "保养维护内容",
+      prop: "remark",
+      minRows: 2, //最小行/最小值
+      type: "textarea", //类型为多行文本域框
+      maxlength: 512, //最大输入长度
+      overHidden: true,
+      rules: [
+        {
+          required: true,
+          message: "保养维护内容不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "设备位置",
+      prop: "devicePosition",
+      display: false,
+    },
+    {
+      label: "维护类型",
+      prop: "type",
+      search: true,
+      type: "select",
+      editDisplay: false,
+      dicData: [{label: '点检',value:"0"},{label: '保养',value:"1"}],
+      rules: [
+        {
+          required: true,
+          message: "维护类型不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "维护频次",
+      prop: "cycle",
+      type: "select",
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.TYPE_CODE.device_maintenance_cycle,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "维护频次不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    /*{
+      label: "运行状态",
+      prop: "runState",
+      type: "select",
+      display: false,
+      dicUrl:
+          dictDataUtil.request_url +
+          dictDataUtil.TYPE_CODE.device_run_status,
+      props: {
+        label: "dictLabel",
+        value: "dictValue",
+      },
+      rules: [
+        {
+          required: true,
+          message: "运行状态不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },*/
+    {
+      label: "维护状态",
+      prop: "state",
+      type: "select",
+      addDisplay: false,
+      dicData: [{label: '待维护',value:0},{label: '已维护',value:1}],
+      rules: [
+        {
+          required: true,
+          message: "维护状态不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+    {
+      label: "维护日期",
+      prop: "nextTime",
+      type: "date",
+      width: "120",
+      format: "YYYY-MM-DD", //前端展示格式
+      valueFormat: "YYYY-MM-DD", //设置后端接收的日期格式
+      rules: [
+        {
+          required: true,
+          message: "维护日期不能为空",
+          trigger: "trigger",
+        },
+      ],
+    },
+
+  ],
+});
+
+onMounted(() => {
+  dataList();
+  queryUserList()
+});
+</script>