From aeabb6a019fbb7e60bd3b6c8cf3e4081abdff80c Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期一, 18 五月 2026 20:39:10 +0800
Subject: [PATCH] feat: 设备巡检任务添加启用/停用

---
 src/views/equipmentManagement/inspectionManagement/components/formDia.vue |   40 +++++++++++--
 src/components/PIMTable/PIMTable.vue                                      |    5 +
 src/views/equipmentManagement/inspectionManagement/index.vue              |  109 +++++++++++++++++++++++++----------
 3 files changed, 114 insertions(+), 40 deletions(-)

diff --git a/src/components/PIMTable/PIMTable.vue b/src/components/PIMTable/PIMTable.vue
index 8e22459..1cddb23 100644
--- a/src/components/PIMTable/PIMTable.vue
+++ b/src/components/PIMTable/PIMTable.vue
@@ -146,7 +146,7 @@
               @click.stop="o.clickFun(scope.row)"
               :key="key"
             >
-              {{ o.name }}
+              {{ typeof o.name === 'function' ? o.name(scope.row) : o.name }}
             </el-button>
             <el-upload
               :action="
@@ -426,12 +426,13 @@
 };
 
 const getOperationColor = (operation, row) => {
+  const colorValue = typeof operation?.color === 'function' ? operation.color(row) : operation?.color;
   const baseColor =
     operation?.name === "鍒犻櫎" || operation?.name === "delete"
       ? "#D93025"
       : operation?.name === "璇︽儏"
       ? "#67C23A"
-      : operation?.color || "var(--el-color-primary)";
+      : colorValue || "var(--el-color-primary)";
 
   if (isOperationDisabled(operation, row)) {
     return fadeColor(baseColor, 0.35);
diff --git a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
index a2af3ad..264584f 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -30,6 +30,17 @@
               <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="浠诲姟鐘舵��" prop="isActive">
+              <el-switch
+                v-model="form.isActive"
+                :active-value="1"
+                :inactive-value="0"
+                active-text="鍚敤"
+                inactive-text="鍋滅敤"
+              />
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
@@ -122,7 +133,8 @@
     frequencyType: '',
     frequencyDetail: '',
     week: '',
-    time: ''
+    time: '',
+    isActive: 1  // 榛樿鍚敤
   },
 	rules: {
 		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
@@ -217,8 +229,20 @@
   await loadDeviceName();
   
   if (type === 'edit' && row) {
-    form.value = {...row}
-    form.value.inspector = form.value.inspectorIds.split(',').map(Number)
+    form.value = {
+      ...data.form,  // 鍏堝鍒堕粯璁よ〃鍗�
+      ...row,        // 鍐嶈鐩� row 涓殑鍊�
+    }
+    // 纭繚 inspectorIds 瀛樺湪鎵嶈繘琛� split
+    if (form.value.inspectorIds) {
+      form.value.inspector = form.value.inspectorIds.split(',').map(Number)
+    } else {
+      form.value.inspector = []
+    }
+    // 纭繚 isActive 鏈夊�硷紝榛樿鍚敤
+    if (form.value.isActive === undefined || form.value.isActive === null) {
+      form.value.isActive = 1
+    }
 
     if (row.frequencyDetail) {
       if (row.frequencyType === 'WEEKLY') {
@@ -263,7 +287,8 @@
     frequencyType: '',
     frequencyDetail: '',
     week: '',
-    time: ''
+    time: '',
+    isActive: 1  // 榛樿鍚敤
   }
 }
 
@@ -272,8 +297,11 @@
   proxy.$refs["formRef"].validate(async valid => {
     if (valid) {
       try {
-        form.value.inspectorIds = form.value.inspector.join(',')
-        delete form.value.inspector
+        // 纭繚 inspector 鏄暟缁勬墠杩涜 join
+        if (form.value.inspector && Array.isArray(form.value.inspector)) {
+          form.value.inspectorIds = form.value.inspector.join(',')
+          delete form.value.inspector
+        }
         
         if (form.value.frequencyType === 'WEEKLY') {
           let frequencyDetail = ''
diff --git a/src/views/equipmentManagement/inspectionManagement/index.vue b/src/views/equipmentManagement/inspectionManagement/index.vue
index c7efc7c..1be5ad9 100644
--- a/src/views/equipmentManagement/inspectionManagement/index.vue
+++ b/src/views/equipmentManagement/inspectionManagement/index.vue
@@ -55,8 +55,6 @@
                   :table-style="{ width: '100%', height: 'calc(100vh - 23em)' }">
           <template #inspector="{ row }">
             <div class="person-tags">
-              <!-- 璋冭瘯淇℃伅锛屼笂绾挎椂鍒犻櫎 -->
-              <!-- {{ console.log('inspector data:', row.inspector) }} -->
               <template v-if="row.inspector && row.inspector.length > 0">
                 <el-tag v-for="(person, index) in row.inspector"
                         :key="index"
@@ -69,6 +67,10 @@
               <span v-else
                     class="no-data">--</span>
             </div>
+          </template>
+          <template #statusRef="{ row }">
+            <el-tag v-if="row.isActive === true || row.isActive === 1" type="success">鍚敤</el-tag>
+            <el-tag v-else type="danger">鍋滅敤</el-tag>
           </template>
         </PIMTable>
       </div>
@@ -83,6 +85,7 @@
   import { Delete, Plus } from "@element-plus/icons-vue";
   import { onMounted, ref, reactive, getCurrentInstance, nextTick } from "vue";
   import { ElMessageBox } from "element-plus";
+  import dayjs from "dayjs";
 
   // 缁勪欢寮曞叆
   import PIMTable from "@/components/PIMTable/PIMTable.vue";
@@ -94,6 +97,7 @@
     delTimingTask,
     inspectionTaskList,
     timingTaskList,
+    addOrEditTimingTask,
   } from "@/api/inspectionManagement/index.js";
 
   // 鍏ㄥ眬鍙橀噺
@@ -132,12 +136,6 @@
       prop: "frequencyType",
       label: "棰戞",
       minWidth: 150,
-      // formatter: (_, __, val) => ({
-      //   DAILY: "姣忔棩",
-      //   WEEKLY: "姣忓懆",
-      //   MONTHLY: "姣忔湀",
-      //   QUARTERLY: "瀛e害"
-      // }[val] || "")
       formatData: params => {
         return params === "DAILY"
           ? "姣忔棩"
@@ -175,38 +173,55 @@
       },
     },
     { prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
-    { prop: "createTime", label: "鐧昏鏃ユ湡", minWidth: 100 },
+    { prop: "createTime", label: "鐧昏鏃ユ湡", minWidth: 120, formatData: (cell) => cell ? dayjs(cell).format("YYYY-MM-DD HH:MM:ss") : "-" },
   ]);
+
+  const statusColumn = {
+    prop: "isActive",
+    label: "浠诲姟鐘舵��",
+    minWidth: 100,
+    align: "center",
+    dataType: "slot",
+    slot: "statusRef",
+  };
 
   // 鎿嶄綔鍒楅厤缃�
   const getOperationColumn = operations => {
     if (!operations || operations.length === 0) return null;
 
+    const operationList = operations
+      .map(op => {
+        switch (op) {
+          case "edit":
+            return {
+              name: "缂栬緫",
+              clickFun: handleAdd,
+              color: "#409EFF",
+            };
+          case "viewFile":
+            return {
+              name: "鏌ョ湅闄勪欢",
+              clickFun: viewFile,
+              color: "#67C23A",
+            };
+          case "toggleActive":
+            return {
+              name: (row) => row.isActive === true || row.isActive === 1 ? "鍋滅敤" : "鍚敤",
+              clickFun: handleToggleActive,
+              color: (row) => row.isActive === true || row.isActive === 1 ? "#F56C6C" : "#67C23A",
+            };
+          default:
+            return null;
+        }
+      })
+      .filter(Boolean);
+
     const operationConfig = {
       label: "鎿嶄綔",
-      width: 130,
+      width: 200,
       fixed: "right",
       dataType: "action",
-      operation: operations
-        .map(op => {
-          switch (op) {
-            case "edit":
-              return {
-                name: "缂栬緫",
-                clickFun: handleAdd,
-                color: "#409EFF",
-              };
-            case "viewFile":
-              return {
-                name: "鏌ョ湅闄勪欢",
-                clickFun: viewFile,
-                color: "#67C23A",
-              };
-            default:
-              return null;
-          }
-        })
-        .filter(Boolean),
+      operation: operationList,
     };
 
     return operationConfig;
@@ -219,12 +234,13 @@
   // 鍗曢�夊彉鍖�
   const radioChange = value => {
     if (value === "taskManage") {
-      const operationColumn = getOperationColumn(["edit"]);
+      const operationColumn = getOperationColumn(["edit", "toggleActive"]);
       tableColumns.value = [
         ...columns.value,
+        statusColumn,
         ...(operationColumn ? [operationColumn] : []),
       ];
-      operationsArr.value = ["edit"];
+      operationsArr.value = ["edit", "toggleActive"];
     } else if (value === "task") {
       const operationColumn = getOperationColumn(["viewFile"]);
       tableColumns.value = [
@@ -346,6 +362,35 @@
       .catch(() => {});
   };
 
+  // 鍚敤/鍋滅敤鍒囨崲
+  const handleToggleActive = async (row) => {
+    const newStatus = row.isActive === true || row.isActive === 1 ? 0 : 1;
+    const actionText = newStatus === 1 ? "鍚敤" : "鍋滅敤";
+
+    try {
+      await proxy.$modal.confirm(`鏄惁纭${actionText}璇ヤ换鍔★紵`)
+    } catch {
+      return
+    }
+
+    try {
+      await addOrEditTimingTask({
+        id: row.id,
+        taskId: row.taskId,
+        taskName: row.taskName,
+        inspectorIds: row.inspectorIds,
+        remarks: row.remarks,
+        frequencyType: row.frequencyType,
+        frequencyDetail: row.frequencyDetail,
+        isActive: newStatus,
+      })
+      proxy.$modal.msgSuccess(`${actionText}鎴愬姛`)
+      handleQuery()
+    } catch (error) {
+      console.error(`${actionText}澶辫触:`, error)
+    }
+  };
+
   // 澶氶�夊彉鏇�
   const handleSelectionChange = selection => {
     selectedRows.value = selection;

--
Gitblit v1.9.3