From 476a9ca89794a830b8a8279b80d9b446624a0641 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期二, 02 六月 2026 17:50:39 +0800
Subject: [PATCH] refactor(equipment): 优化设备台账表单结构并更新质管检验选项

---
 src/views/equipmentManagement/repair/index.vue |  285 +++++++++++++++++++++++++++++----------------------------
 1 files changed, 145 insertions(+), 140 deletions(-)

diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
index a278a5c..ea18062 100644
--- a/src/views/equipmentManagement/repair/index.vue
+++ b/src/views/equipmentManagement/repair/index.vue
@@ -3,60 +3,60 @@
     <el-form :model="filters" :inline="true">
       <el-form-item label="璁惧鍚嶇О">
         <el-input
-            v-model="filters.deviceName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ヨ澶囧悕绉�"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
+          v-model="filters.deviceName"
+          style="width: 240px"
+          placeholder="璇疯緭鍏ヨ澶囧悕绉�"
+          clearable
+          :prefix-icon="Search"
+          @change="getTableData"
         />
       </el-form-item>
       <el-form-item label="瑙勬牸鍨嬪彿">
         <el-input
-            v-model="filters.deviceModel"
-            style="width: 240px"
-            placeholder="璇烽�夋嫨瑙勬牸鍨嬪彿"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
+          v-model="filters.deviceModel"
+          style="width: 240px"
+          placeholder="璇烽�夋嫨瑙勬牸鍨嬪彿"
+          clearable
+          :prefix-icon="Search"
+          @change="getTableData"
         />
       </el-form-item>
       <el-form-item label="鏁呴殰鐜拌薄">
         <el-input
-            v-model="filters.remark"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
+          v-model="filters.remark"
+          style="width: 240px"
+          placeholder="璇疯緭鍏ユ晠闅滅幇璞�"
+          clearable
+          :prefix-icon="Search"
+          @change="getTableData"
         />
       </el-form-item>
       <el-form-item label="缁翠慨浜�">
         <el-input
-            v-model="filters.maintenanceName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ョ淮淇汉"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
+          v-model="filters.maintenanceName"
+          style="width: 240px"
+          placeholder="璇疯緭鍏ョ淮淇汉"
+          clearable
+          :prefix-icon="Search"
+          @change="getTableData"
         />
       </el-form-item>
       <el-form-item label="鎶ヤ慨鏃ユ湡">
         <el-date-picker
-            v-model="filters.repairTimeStr"
-            type="date"
-            placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
-            size="default"
-            @change="(date) => handleDateChange(date,2)"
+          v-model="filters.repairTimeStr"
+          type="date"
+          placeholder="璇烽�夋嫨鎶ヤ慨鏃ユ湡"
+          size="default"
+          @change="(date) => handleDateChange(date, 2)"
         />
       </el-form-item>
       <el-form-item label="缁翠慨鏃ユ湡">
         <el-date-picker
-            v-model="filters.maintenanceTimeStr"
-            type="date"
-            placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
-            size="default"
-            @change="(date) => handleDateChange(date,1)"
+          v-model="filters.maintenanceTimeStr"
+          type="date"
+          placeholder="璇烽�夋嫨缁翠慨鏃ユ湡"
+          size="default"
+          @change="(date) => handleDateChange(date, 1)"
         />
       </el-form-item>
       <el-form-item>
@@ -71,9 +71,7 @@
           <el-button type="success" icon="Van" @click="addRepair">
             鏂板鎶ヤ慨
           </el-button>
-          <el-button @click="handleOut">
-            瀵煎嚭
-          </el-button>
+          <el-button @click="handleOut"> 瀵煎嚭 </el-button>
           <el-button
             type="danger"
             icon="Delete"
@@ -85,17 +83,17 @@
         </div>
       </div>
       <PIMTable
-          rowKey="id"
-          isSelection
-          :column="columns"
-          :tableData="dataList"
-          :page="{
+        rowKey="id"
+        isSelection
+        :column="columns"
+        :tableData="dataList"
+        :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-          @selection-change="handleSelectionChange"
-          @pagination="changePage"
+        @selection-change="handleSelectionChange"
+        @pagination="changePage"
       >
         <template #statusRef="{ row }">
           <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
@@ -111,11 +109,7 @@
           >
             缂栬緫
           </el-button>
-          <el-button
-            type="info"
-            link
-            @click="viewAttachments(row)"
-          >
+          <el-button type="info" link @click="viewAttachments(row)">
             鏌ョ湅闄勪欢
           </el-button>
           <el-button
@@ -129,7 +123,7 @@
           <el-button
             type="danger"
             link
-            :disabled="row.status === 1"
+            :disabled="row.status === 1 && !isAdmin"
             @click="delRepairByIds(row.id)"
           >
             鍒犻櫎
@@ -137,8 +131,8 @@
         </template>
       </PIMTable>
     </div>
-    <RepairModal ref="repairModalRef" @ok="getTableData"/>
-    <MaintainModal ref="maintainModalRef" @ok="getTableData"/>
+    <RepairModal ref="repairModalRef" @ok="getTableData" />
+    <MaintainModal ref="maintainModalRef" @ok="getTableData" />
     <FileListDialog
       ref="fileListDialogRef"
       v-model="fileDialogVisible"
@@ -152,19 +146,26 @@
 
 <script setup>
 import { onMounted, getCurrentInstance, computed } from "vue";
-import {usePaginationApi} from "@/hooks/usePaginationApi";
-import {getRepairPage, delRepair, getRepairById} from "@/api/equipmentManagement/repair";
+import { usePaginationApi } from "@/hooks/usePaginationApi";
+import {
+  getRepairPage,
+  delRepair,
+  getRepairById,
+} from "@/api/equipmentManagement/repair";
 import RepairModal from "./Modal/RepairModal.vue";
-import {ElMessageBox, ElMessage} from "element-plus";
+import { ElMessageBox, ElMessage } from "element-plus";
 import dayjs from "dayjs";
 import MaintainModal from "./Modal/MaintainModal.vue";
 import FileListDialog from "@/components/Dialog/FileListDialog.vue";
+import useUserStore from "@/store/modules/user";
+import auth from "@/plugins/auth";
 
 defineOptions({
   name: "璁惧鎶ヤ慨",
 });
 
-const {proxy} = getCurrentInstance();
+const { proxy } = getCurrentInstance();
+const userStore = useUserStore();
 
 // 妯℃�佹瀹炰緥
 const repairModalRef = ref();
@@ -217,80 +218,80 @@
   resetFilters,
   onCurrentChange,
 } = usePaginationApi(
-    getRepairPage,
+  getRepairPage,
+  {
+    deviceName: undefined,
+    deviceModel: undefined,
+    remark: undefined,
+    maintenanceName: undefined,
+    repairTimeStr: undefined,
+    maintenanceTimeStr: undefined,
+  },
+  [
     {
-      deviceName: undefined,
-      deviceModel: undefined,
-      remark: undefined,
-      maintenanceName: undefined,
-      repairTimeStr: undefined,
-      maintenanceTimeStr: undefined,
+      label: "璁惧鍚嶇О",
+      align: "center",
+      prop: "deviceName",
     },
-    [
-      {
-        label: "璁惧鍚嶇О",
-        align: "center",
-        prop: "deviceName",
-      },
-      {
-        label: "瑙勬牸鍨嬪彿",
-        align: "center",
-        prop: "deviceModel",
-      },
-      {
-        label: "鎶ヤ慨鏃ユ湡",
-        align: "center",
-        prop: "repairTime",
-        formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
-      },
-      {
-        label: "鎶ヤ慨浜�",
-        align: "center",
-        prop: "repairName",
-      },
-      {
-        label: "鏁呴殰鐜拌薄",
-        align: "center",
-        prop: "remark",
-      },
-      {
-        label: "缁翠慨浜�",
-        align: "center",
-        prop: "maintenanceName",
-      },
-      {
-        label: "缁翠慨缁撴灉",
-        align: "center",
-        prop: "maintenanceResult",
-      },
-      {
-        label: "缁翠慨鏃ユ湡",
-        align: "center",
-        prop: "maintenanceTime",
-        formatData: (cell) => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
-      },
-      {
-        label: "鐘舵��",
-        align: "center",
-        prop: "status",
-        dataType: "slot",
-        slot: "statusRef",
-      },
-      {
-        fixed: "right",
-        label: "鎿嶄綔",
-        dataType: "slot",
-        slot: "operation",
-        align: "center",
-        width: "360px",
-      },
-    ]
+    {
+      label: "瑙勬牸鍨嬪彿",
+      align: "center",
+      prop: "deviceModel",
+    },
+    {
+      label: "鎶ヤ慨鏃ユ湡",
+      align: "center",
+      prop: "repairTime",
+      formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
+    },
+    {
+      label: "鎶ヤ慨浜�",
+      align: "center",
+      prop: "repairName",
+    },
+    {
+      label: "鏁呴殰鐜拌薄",
+      align: "center",
+      prop: "remark",
+    },
+    {
+      label: "缁翠慨浜�",
+      align: "center",
+      prop: "maintenanceName",
+    },
+    {
+      label: "缁翠慨缁撴灉",
+      align: "center",
+      prop: "maintenanceResult",
+    },
+    {
+      label: "缁翠慨鏃ユ湡",
+      align: "center",
+      prop: "maintenanceTime",
+      formatData: (cell) => (cell ? dayjs(cell).format("YYYY-MM-DD") : ""),
+    },
+    {
+      label: "鐘舵��",
+      align: "center",
+      prop: "status",
+      dataType: "slot",
+      slot: "statusRef",
+    },
+    {
+      fixed: "right",
+      label: "鎿嶄綔",
+      dataType: "slot",
+      slot: "operation",
+      align: "center",
+      width: "360px",
+    },
+  ]
 );
 
 // type === 1 缁翠慨 2鎶ヤ慨闂�
 const handleDateChange = (value, type) => {
-  filters.maintenanceTimeStr = null
-  filters.c = null
+  filters.maintenanceTimeStr = null;
+  filters.c = null;
   if (type === 1) {
     if (value) {
       filters.maintenanceTimeStr = dayjs(value).format("YYYY-MM-DD");
@@ -308,10 +309,14 @@
   multipleList.value = selectionList;
 };
 
-// 妫�鏌ラ�変腑鐨勮褰曚腑鏄惁鏈夊畬缁撶姸鎬佺殑
+// 鏄惁鏄鐞嗗憳
+const isAdmin = computed(() => auth.hasRole("admin"));
+
+// 妫�鏌ラ�変腑鐨勮褰曚腑鏄惁鏈夊畬缁撶姸鎬佺殑锛堢鐞嗗憳鍙互鍒犻櫎瀹岀粨鐘舵�佺殑璁板綍锛�
 const hasFinishedStatus = computed(() => {
-  return multipleList.value.some(item => item.status === 1)
-})
+  if (isAdmin.value) return false;
+  return multipleList.value.some((item) => item.status === 1);
+});
 
 // 鏂板鎶ヤ慨
 const addRepair = () => {
@@ -328,7 +333,7 @@
   maintainModalRef.value.open(row.id, row);
 };
 
-const changePage = ({page, limit}) => {
+const changePage = ({ page, limit }) => {
   pagination.currentPage = page;
   pagination.pageSize = limit;
   onCurrentChange(page);
@@ -336,15 +341,15 @@
 
 // 鍗曡鍒犻櫎
 const delRepairByIds = async (ids) => {
-  // 妫�鏌ユ槸鍚︽湁瀹岀粨鐘舵�佺殑璁板綍
+  // 妫�鏌ユ槸鍚︽湁瀹岀粨鐘舵�佺殑璁板綍锛堢鐞嗗憳鍙互鍒犻櫎锛�
   const idsArray = Array.isArray(ids) ? ids : [ids];
-  const hasFinished = idsArray.some(id => {
-    const record = dataList.value.find(item => item.id === id);
+  const hasFinished = idsArray.some((id) => {
+    const record = dataList.value.find((item) => item.id === id);
     return record && record.status === 1;
   });
 
-  if (hasFinished) {
-    ElMessage.warning('涓嶈兘鍒犻櫎鐘舵�佷负瀹岀粨鐨勮褰�');
+  if (hasFinished && !isAdmin.value) {
+    ElMessage.warning("涓嶈兘鍒犻櫎鐘舵�佷负瀹岀粨鐨勮褰�");
     return;
   }
 
@@ -353,7 +358,7 @@
     cancelButtonText: "鍙栨秷",
     type: "warning",
   }).then(async () => {
-    const {code} = await delRepair(ids);
+    const { code } = await delRepair(ids);
     if (code === 200) {
       ElMessage.success("鍒犻櫎鎴愬姛");
       getTableData();
@@ -368,12 +373,12 @@
     cancelButtonText: "鍙栨秷",
     type: "warning",
   })
-      .then(() => {
-        proxy.download("/device/repair/export", {}, "璁惧鎶ヤ慨.xlsx");
-      })
-      .catch(() => {
-        ElMessage.info("宸插彇娑�");
-      });
+    .then(() => {
+      proxy.download("/device/repair/export", {}, "璁惧鎶ヤ慨.xlsx");
+    })
+    .catch(() => {
+      ElMessage.info("宸插彇娑�");
+    });
 };
 
 onMounted(() => {

--
Gitblit v1.9.3