From f15c2ea99e9ede2a6e7ee3a206ba08d3172aa36d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 16 五月 2026 10:46:55 +0800
Subject: [PATCH] feat(equipment): 添加设备维保和巡检任务的启用状态功能

---
 src/views/equipmentManagement/upkeep/index.vue                            |   65 +++++++++++++--
 src/api/inspectionManagement/index.js                                     |   11 ++
 src/views/equipmentManagement/inspectionManagement/components/formDia.vue |   13 +++
 src/api/equipmentManagement/upkeep.js                                     |    9 ++
 src/views/equipmentManagement/upkeep/Form/formDia.vue                     |   22 +++-
 src/views/equipmentManagement/inspectionManagement/index.vue              |   66 ++++++++++++++++
 6 files changed, 165 insertions(+), 21 deletions(-)

diff --git a/src/api/equipmentManagement/upkeep.js b/src/api/equipmentManagement/upkeep.js
index 234d2a5..5774654 100644
--- a/src/api/equipmentManagement/upkeep.js
+++ b/src/api/equipmentManagement/upkeep.js
@@ -102,3 +102,12 @@
     data: params,
   });
 };
+
+// 璁惧淇濆吇瀹氭椂浠诲姟鍚敤鐘舵�佸垏鎹�
+export const deviceMaintenanceTaskChangeEnable = (params) => {
+  return request({
+    url: '/deviceMaintenanceTask/changeEnable',
+    method: "post",
+    data: params,
+  });
+};
diff --git a/src/api/inspectionManagement/index.js b/src/api/inspectionManagement/index.js
index d0c444a..0a76c42 100644
--- a/src/api/inspectionManagement/index.js
+++ b/src/api/inspectionManagement/index.js
@@ -58,4 +58,13 @@
         method: 'post',
         data: query
     })
-}
\ No newline at end of file
+}
+
+// 瀹氭椂宸℃浠诲姟鍚敤鐘舵�佸垏鎹�
+export function changeTimingTaskEnable(query) {
+    return request({
+        url: '/timingTask/changeEnable',
+        method: 'post',
+        data: query
+    })
+}
diff --git a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
index f4db821..c535a90 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -77,6 +77,15 @@
               <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
             </el-form-item>
           </el-col>
+          <el-col :span="12">
+            <el-form-item label="鏄惁鍚敤" prop="isEnabled">
+              <el-switch
+                v-model="form.isEnabled"
+                :active-value="1"
+                :inactive-value="0"
+              />
+            </el-form-item>
+          </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
@@ -191,6 +200,7 @@
     inspector: [],
     inspectorIds: "",
     remarks: "",
+    isEnabled: 1,
     frequencyType: "",
     frequencyDetail: "",
     week: "",
@@ -365,6 +375,7 @@
     inspector: [],
     inspectorIds: "",
     remarks: "",
+    isEnabled: 1,
     frequencyType: "",
     frequencyDetail: "",
     week: "",
@@ -387,6 +398,7 @@
     form.value = {
       ...form.value,
       ...row,
+      isEnabled: Number(row.isEnabled ?? row.status ?? 1),
       inspector: row.inspectorIds
         ? String(row.inspectorIds)
             .split(",")
@@ -447,6 +459,7 @@
       payload.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(",");
       payload.taskName = form.value.taskName;
       payload.deviceModel = form.value.deviceModel || "-";
+      payload.isEnabled = Number(form.value.isEnabled ?? 1);
 
       await addOrEditTimingTask(payload);
       cancel();
diff --git a/src/views/equipmentManagement/inspectionManagement/index.vue b/src/views/equipmentManagement/inspectionManagement/index.vue
index cd7369d..b0f4f58 100644
--- a/src/views/equipmentManagement/inspectionManagement/index.vue
+++ b/src/views/equipmentManagement/inspectionManagement/index.vue
@@ -23,6 +23,17 @@
           style="width: 220px"
         />
       </el-form-item>
+      <el-form-item v-show="activeRadio === 'taskManage'" label="鏄惁鍚敤">
+        <el-select
+          v-model="queryParams.isEnabled"
+          placeholder="璇烽�夋嫨"
+          clearable
+          style="width: 140px"
+        >
+          <el-option label="鍚敤" :value="1" />
+          <el-option label="绂佺敤" :value="0" />
+        </el-select>
+      </el-form-item>
       <el-form-item v-show="activeRadio === 'task'" label="鎵ц鏃ユ湡">
         <el-date-picker
           v-model="queryDate"
@@ -90,6 +101,15 @@
             <span v-else class="no-data">--</span>
           </div>
         </template>
+        <template #isEnabledSwitch="{ row }">
+          <el-switch
+            v-model="row.isEnabled"
+            :active-value="1"
+            :inactive-value="0"
+            :loading="row.enableSwitchLoading"
+            :before-change="() => handleTimingTaskEnableBeforeChange(row)"
+          />
+        </template>
       </PIMTable>
     </el-card>
     <form-dia ref="formDia" @closeDia="handleQuery" />
@@ -99,13 +119,14 @@
 
 <script setup>
 import { Delete, Plus } from "@element-plus/icons-vue";
-import { ElMessageBox } from "element-plus";
+import { ElMessage, ElMessageBox } from "element-plus";
 import { getCurrentInstance, nextTick, onMounted, reactive, ref } from "vue";
 import dayjs from "dayjs";
 import PIMTable from "@/components/PIMTable/PIMTable.vue";
 import FormDia from "@/views/equipmentManagement/inspectionManagement/components/formDia.vue";
 import ViewFiles from "@/views/equipmentManagement/inspectionManagement/components/viewFiles.vue";
 import {
+  changeTimingTaskEnable,
   delTimingTask,
   inspectionTaskList,
   timingTaskList,
@@ -119,6 +140,7 @@
 const queryParams = reactive({
   taskName: "",
   areaId: undefined,
+  isEnabled: undefined,
   createTimeStart: undefined,
   createTimeEnd: undefined,
 });
@@ -190,6 +212,14 @@
   { prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
   { prop: "createTime", label: "鐧昏鏃ユ湡", width: 130 },
 ]);
+
+const isEnabledColumn = {
+  prop: "isEnabled",
+  label: "鏄惁鍚敤",
+  minWidth: 110,
+  dataType: "slot",
+  slot: "isEnabledSwitch",
+};
 
 // 宸℃鐘舵�佸垪锛堜粎瀹氭椂浠诲姟璁板綍鏄剧ず锛�
 const inspectionStatusColumn = {
@@ -271,13 +301,14 @@
 const radioChange = (value) => {
   if (value === "taskManage") {
     const operationColumn = getOperationColumn(["edit"]);
-    tableColumns.value = [...columns.value, ...(operationColumn ? [operationColumn] : [])];
+    tableColumns.value = [...columns.value, isEnabledColumn, ...(operationColumn ? [operationColumn] : [])];
   } else {
     const operationColumn = getOperationColumn(["viewFile"]);
     // 瀹氭椂浠诲姟璁板綍娣诲姞宸℃鐘舵�佸垪
     tableColumns.value = [...columns.value, inspectionStatusColumn, inspectionResultColumn, ...(operationColumn ? [operationColumn] : [])];
     // 鍒囨崲鍒板畾鏃朵换鍔¤褰曟椂锛岄粯璁ゆ煡璇㈠綋澶�
     queryDate.value = dayjs().format("YYYY-MM-DD");
+    queryParams.isEnabled = undefined;
   }
   pageNum.value = 1;
   pageSize.value = 10;
@@ -319,6 +350,12 @@
       const rawData = res?.data?.records || [];
       tableData.value = rawData.map((item) => {
         const processedItem = { ...item };
+        if (activeRadio.value === "taskManage") {
+          processedItem.isEnabled = Number(
+            processedItem.isEnabled ?? processedItem.status ?? 1
+          );
+          processedItem.enableSwitchLoading = false;
+        }
         if (processedItem.inspector) {
           if (typeof processedItem.inspector === "string") {
             processedItem.inspector = processedItem.inspector
@@ -343,6 +380,7 @@
 const resetQuery = () => {
   queryParams.taskName = "";
   queryParams.areaId = undefined;
+  queryParams.isEnabled = undefined;
   queryParams.createTimeStart = undefined;
   queryParams.createTimeEnd = undefined;
   // 瀹氭椂浠诲姟璁板綍鏃堕噸缃负褰撳ぉ
@@ -383,6 +421,30 @@
   selectedRows.value = selection;
 };
 
+const handleTimingTaskEnableBeforeChange = async (row) => {
+  if (row.enableSwitchLoading) {
+    return false;
+  }
+  const nextValue = Number(row.isEnabled) === 1 ? 0 : 1;
+  row.enableSwitchLoading = true;
+  try {
+    const res = await changeTimingTaskEnable({
+      id: row.id,
+      isEnabled: nextValue,
+    });
+    if (res?.code !== 200) {
+      throw new Error(res?.msg || "鏇存柊澶辫触");
+    }
+    ElMessage.success("鍚敤鐘舵�佸凡鏇存柊");
+    return true;
+  } catch (error) {
+    proxy.$modal.msgError(error?.message || "鍚敤鐘舵�佹洿鏂板け璐�");
+    return false;
+  } finally {
+    row.enableSwitchLoading = false;
+  }
+};
+
 const handleOut = () => {
   ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
     confirmButtonText: "纭",
diff --git a/src/views/equipmentManagement/upkeep/Form/formDia.vue b/src/views/equipmentManagement/upkeep/Form/formDia.vue
index 01a2d6e..1460686 100644
--- a/src/views/equipmentManagement/upkeep/Form/formDia.vue
+++ b/src/views/equipmentManagement/upkeep/Form/formDia.vue
@@ -173,6 +173,17 @@
       </el-row>
       <el-row>
         <el-col :span="12">
+          <el-form-item label="鏄惁鍚敤" prop="isEnabled">
+            <el-switch
+              v-model="form.isEnabled"
+              :active-value="1"
+              :inactive-value="0"
+            />
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col :span="12">
           <el-form-item label="澶囨敞" prop="remarks">
             <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
           </el-form-item>
@@ -219,6 +230,7 @@
     deviceLedgerIds: [],
     deviceLedgerIdsStr: undefined,
     taskName: undefined,
+    isEnabled: 1,
     inspector: undefined,
     remarks: "",
     frequencyType: "",
@@ -368,6 +380,7 @@
     deviceLedgerIds: [],
     deviceLedgerIdsStr: undefined,
     taskName: undefined,
+    isEnabled: 1,
     inspector: undefined,
     remarks: "",
     frequencyType: "",
@@ -394,6 +407,7 @@
     form.value = {
       ...form.value,
       ...row,
+      isEnabled: Number(row.isEnabled ?? row.status ?? 1),
       inspector: row.registrantId || row.inspector,
     };
     form.value.deviceLedgerIds = normalizeIdList(
@@ -451,13 +465,7 @@
         payload.frequencyDetail = `${payload.week},${payload.time}`;
       }
 
-      if (
-        payload.status === undefined ||
-        payload.status === null ||
-        payload.status === ""
-      ) {
-        payload.status = "0";
-      }
+      payload.isEnabled = Number(form.value.isEnabled ?? 1);
 
       payload.deviceLedgerIds = [...form.value.deviceLedgerIds];
       payload.deviceLedgerIdsStr = form.value.deviceLedgerIds.join(",");
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index 765a5c9..419e9aa 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -15,10 +15,10 @@
                   @change="getScheduledTableData"
               />
             </el-form-item>
-            <el-form-item label="浠诲姟鐘舵��">
-              <el-select v-model="scheduledFilters.status" placeholder="璇烽�夋嫨浠诲姟鐘舵��" clearable style="width: 200px">
-                <el-option label="鍚敤" value="1" />
-                <el-option label="鍋滅敤" value="0" />
+            <el-form-item label="鏄惁鍚敤">
+              <el-select v-model="scheduledFilters.isEnabled" placeholder="璇烽�夋嫨鏄惁鍚敤" clearable style="width: 200px">
+                <el-option label="鍚敤" :value="1" />
+                <el-option label="绂佺敤" :value="0" />
               </el-select>
             </el-form-item>
             <el-form-item>
@@ -57,9 +57,14 @@
             @selection-change="handleScheduledSelectionChange"
             @pagination="changeScheduledPage"
           >
-            <template #statusRef="{ row }">
-              <el-tag v-if="row.status === 1" type="success">鍚敤</el-tag>
-              <el-tag v-if="row.status === 0" type="danger">鍋滅敤</el-tag>
+            <template #isEnabledRef="{ row }">
+              <el-switch
+                v-model="row.isEnabled"
+                :active-value="1"
+                :inactive-value="0"
+                :loading="row.enableSwitchLoading"
+                :before-change="() => handleScheduledEnableBeforeChange(row)"
+              />
             </template>
             <template #operation="{ row }">
               <el-button
@@ -243,6 +248,7 @@
   delUpkeep,
   deviceMaintenanceTaskList,
   deviceMaintenanceTaskDel,
+  deviceMaintenanceTaskChangeEnable,
 } from '@/api/equipmentManagement/upkeep'
 import {
   listMaintenanceTaskFiles,
@@ -286,7 +292,7 @@
 // 瀹氭椂浠诲姟绠$悊tab鐩稿叧鍙橀噺
 const scheduledFilters = reactive({
   taskName: '',
-  status: '',
+  isEnabled: undefined,
 })
 
 const scheduledDataList = ref([])
@@ -344,6 +350,14 @@
 	},
 	{ prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
 	{ prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 },
+	{
+		label: "鏄惁鍚敤",
+		prop: "isEnabled",
+		dataType: "slot",
+		slot: "isEnabledRef",
+		align: "center",
+		width: "120px",
+	},
 	{
 		fixed: "right",
 		label: "鎿嶄綔",
@@ -440,11 +454,16 @@
       current: scheduledPagination.currentPage,
       size: scheduledPagination.pageSize,
       taskName: scheduledFilters.taskName || undefined,
-      status: scheduledFilters.status || undefined,
+      isEnabled: scheduledFilters.isEnabled,
     }
     const { code, data } = await deviceMaintenanceTaskList(params)
     if (code === 200) {
-      scheduledDataList.value = data?.records || []
+      const records = data?.records || []
+      scheduledDataList.value = records.map((item) => ({
+        ...item,
+        isEnabled: Number(item.isEnabled ?? item.status ?? 1),
+        enableSwitchLoading: false,
+      }))
       scheduledPagination.total = data?.total || 0
     }
   } catch (error) {
@@ -454,7 +473,7 @@
 
 const resetScheduledFilters = () => {
   scheduledFilters.taskName = ''
-  scheduledFilters.status = ''
+  scheduledFilters.isEnabled = undefined
   getScheduledTableData()
 }
 
@@ -496,6 +515,30 @@
   }
 }
 
+const handleScheduledEnableBeforeChange = async (row) => {
+  if (row.enableSwitchLoading) {
+    return false
+  }
+  const nextValue = Number(row.isEnabled) === 1 ? 0 : 1
+  row.enableSwitchLoading = true
+  try {
+    const res = await deviceMaintenanceTaskChangeEnable({
+      id: row.id,
+      isEnabled: nextValue,
+    })
+    if (res?.code !== 200) {
+      throw new Error(res?.msg || '鏇存柊澶辫触')
+    }
+    ElMessage.success('鍚敤鐘舵�佸凡鏇存柊')
+    return true
+  } catch (error) {
+    ElMessage.error(error?.message || '鍚敤鐘舵�佹洿鏂板け璐�')
+    return false
+  } finally {
+    row.enableSwitchLoading = false
+  }
+}
+
 const handleScheduledOut = () => {
   ElMessage.info('瀵煎嚭瀹氭椂浠诲姟鍔熻兘寰呭疄鐜�')
 }

--
Gitblit v1.9.3