From 352a465a32764eabfc550fad7d35da44b588a03d Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 05 一月 2026 19:39:46 +0800
Subject: [PATCH] 海川开心: 1.销售管理、仓储物流一些字段赋默认值 2.生产报工改成可以多个报工 酒泉改造 1.设备管理从新疆迁移过来 2.开发、联调备件管理页面

---
 src/views/equipmentManagement/measurementEquipment/components/formDia.vue        |   14 
 src/views/equipmentManagement/inspectionManagement/components/formDia.vue        |  382 ++++----
 src/api/equipmentManagement/upkeep.js                                            |   32 
 src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue                    |   16 
 src/views/equipmentManagement/calibration/index.vue                              |   37 
 src/views/equipmentManagement/ledger/index.vue                                   |   59 -
 src/views/equipmentManagement/upkeep/Modal/PlanModal.vue                         |    3 
 src/views/equipmentManagement/upkeep/index.vue                                   |  744 +++++++++++-----
 src/views/equipmentManagement/spareParts/index.vue                               |  353 +++----
 src/views/equipmentManagement/repair/Modal/MaintainModal.vue                     |    2 
 src/views/equipmentManagement/repair/Modal/RepairModal.vue                       |    4 
 src/views/equipmentManagement/repair/index.vue                                   |    3 
 src/views/equipmentManagement/repair/Form/RepairForm.vue                         |   22 
 src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue                  |    2 
 src/views/equipmentManagement/inspectionManagement/index.vue                     |  509 +++++-----
 src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue |   14 
 src/api/equipmentManagement/ledger.js                                            |    8 
 src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue      |    4 
 src/views/equipmentManagement/measurementEquipment/index.vue                     |   20 
 src/views/equipmentManagement/repair/Form/MaintainForm.vue                       |    8 
 src/views/equipmentManagement/upkeep/Modal/formDia.vue                           |  304 ++++++
 src/views/equipmentManagement/ledger/Modal.vue                                   |    2 
 src/utils/index.js                                                               |   13 
 src/views/equipmentManagement/upkeep/Form/PlanForm.vue                           |   40 
 src/api/equipmentManagement/calibration.js                                       |    8 
 25 files changed, 1,636 insertions(+), 967 deletions(-)

diff --git a/src/api/equipmentManagement/calibration.js b/src/api/equipmentManagement/calibration.js
index 54b99f9..b0a9844 100644
--- a/src/api/equipmentManagement/calibration.js
+++ b/src/api/equipmentManagement/calibration.js
@@ -24,4 +24,12 @@
     method: "post",
     data: query,
   });
+}
+// 鍒犻櫎璁板綍
+export function ledgerRecordDelete(ids) {
+  return request({
+    url: "/measuringInstrumentLedgerRecord/delete",
+    method: "delete",
+    data: ids,
+  });
 }
\ No newline at end of file
diff --git a/src/api/equipmentManagement/ledger.js b/src/api/equipmentManagement/ledger.js
index 7e8d8d8..d1b65b0 100644
--- a/src/api/equipmentManagement/ledger.js
+++ b/src/api/equipmentManagement/ledger.js
@@ -42,11 +42,3 @@
     method: "get",
   });
 };
-// 璁惧鍙拌处鍥捐〃
-export const getAssetInfo = (params) => {
-    return request({
-        url: "/device/ledger/report/forms",
-        method: "get",
-        params
-    });
-}
\ No newline at end of file
diff --git a/src/api/equipmentManagement/upkeep.js b/src/api/equipmentManagement/upkeep.js
index c091670..234d2a5 100644
--- a/src/api/equipmentManagement/upkeep.js
+++ b/src/api/equipmentManagement/upkeep.js
@@ -70,3 +70,35 @@
     method: "delete",
   });
 };
+// 娣诲姞璁惧淇濆吇瀹氭椂浠诲姟
+export const deviceMaintenanceTaskAdd = (params) => {
+  return request({
+    url: '/deviceMaintenanceTask/add',
+    method: "post",
+    data: params,
+  });
+};
+// 淇敼璁惧淇濆吇瀹氭椂浠诲姟
+export const deviceMaintenanceTaskEdit = (params) => {
+  return request({
+    url: '/deviceMaintenanceTask/update',
+    method: "post",
+    data: params,
+  });
+};
+// 璁惧淇濆吇瀹氭椂浠诲姟鍒楄〃
+export const deviceMaintenanceTaskList = (params) => {
+  return request({
+    url: '/deviceMaintenanceTask/listPage',
+    method: "get",
+    params: params,
+  });
+};
+// 璁惧淇濆吇瀹氭椂浠诲姟鍒楄〃
+export const deviceMaintenanceTaskDel = (params) => {
+  return request({
+    url: '/deviceMaintenanceTask/delete',
+    method: "delete",
+    data: params,
+  });
+};
diff --git a/src/utils/index.js b/src/utils/index.js
index e522c3c..809593f 100644
--- a/src/utils/index.js
+++ b/src/utils/index.js
@@ -396,3 +396,16 @@
 export function isEqual(obj1, obj2) {
   return JSON.stringify(obj1) === JSON.stringify(obj2);
 }
+
+/**
+ * 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
+ * @returns {string} 鏍煎紡鍖栫殑鏃ユ湡瀛楃涓�
+ */
+export function getCurrentDate() {
+  const today = new Date();
+  const year = today.getFullYear();
+  const month = String(today.getMonth() + 1).padStart(2, '0'); // 鏈堜唤浠�0寮�濮�
+  const day = String(today.getDate()).padStart(2, '0');
+  return `${year}-${month}-${day}`;
+}
+
diff --git a/src/views/equipmentManagement/calibration/index.vue b/src/views/equipmentManagement/calibration/index.vue
index affce9d..3ace389 100644
--- a/src/views/equipmentManagement/calibration/index.vue
+++ b/src/views/equipmentManagement/calibration/index.vue
@@ -57,10 +57,10 @@
 
 <script setup>
 import {onMounted, ref} from "vue";
-import {ElMessageBox} from "element-plus";
+import {ElMessageBox, ElMessage} from "element-plus";
 import useUserStore from "@/store/modules/user.js";
 import CalibrationDia from "@/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue";
-import {ledgerRecordListPage} from "@/api/equipmentManagement/calibration.js";
+import {ledgerRecordListPage, ledgerRecordDelete} from "@/api/equipmentManagement/calibration.js";
 const { proxy } = getCurrentInstance();
 const userStore = useUserStore()
 
@@ -134,6 +134,7 @@
 	{
 		dataType: "action",
 		label: "鎿嶄綔",
+		width: 140,
 		align: "center",
 		fixed: 'right',
 		operation: [
@@ -142,7 +143,17 @@
 				type: "text",
 				clickFun: (row) => {
 					openCalibrationDia("edit", row);
-				}
+				},
+			},
+			{
+				name: "鍒犻櫎",
+				type: "text",
+				style: {
+					color: "#F56C6C"
+				},
+				clickFun: (row) => {
+					handleDelete(row);
+				},
 			},
 		],
 	},
@@ -191,6 +202,26 @@
 	})
 }
 
+// 鍒犻櫎璁板綍
+const handleDelete = (row) => {
+	ElMessageBox.confirm(`纭鍒犻櫎璁¢噺鍣ㄥ叿缂栧彿涓�"${row.code}"鐨勬瀹氳褰曞悧锛焋, "鍒犻櫎纭", {
+		confirmButtonText: "纭",
+		cancelButtonText: "鍙栨秷",
+		type: "warning",
+	})
+		.then(() => {
+			ledgerRecordDelete([row.id]).then(() => {
+				ElMessage.success("鍒犻櫎鎴愬姛");
+				getList();
+			}).catch(() => {
+				ElMessage.error("鍒犻櫎澶辫触");
+			});
+		})
+		.catch(() => {
+			proxy.$modal.msg("宸插彇娑堝垹闄�");
+		});
+};
+
 // 瀵煎嚭
 const handleOut = () => {
 	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
diff --git a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
index 79ff5b0..82837af 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -1,102 +1,116 @@
 <template>
-  <div>
-    <el-dialog :title="operationType === 'add' ? '鏂板宸℃浠诲姟' : '缂栬緫宸℃浠诲姟'"
-               v-model="dialogVisitable" width="800px" @close="cancel">
-      <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="璁惧鍚嶇О" prop="taskId">
-              <el-select v-model="form.taskId" @change="setDeviceModel">
-                <el-option
-                  v-for="(item, index) in deviceOptions"
-                  :key="index"
-                  :label="item.deviceName"
-                  :value="item.id"
-                ></el-option>
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="宸℃浜�" prop="inspector">
-              <el-select v-model="form.inspector" placeholder="璇烽�夋嫨" multiple clearable>
-                <el-option v-for="item in userList" :label="item.nickName" :value="item.userId" :key="item.userId"/>
-              </el-select>
-            </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>
-          </el-col>
-        </el-row>
-        <el-row>
-          <el-col :span="12">
-            <el-form-item label="浠诲姟棰戠巼" prop="frequencyType">
-              <el-select v-model="form.frequencyType" placeholder="璇烽�夋嫨" clearable>
-                <el-option label="姣忔棩" value="DAILY"/>
-                <el-option label="姣忓懆" value="WEEKLY"/>
-                <el-option label="姣忔湀" value="MONTHLY"/>
-                <!-- <el-option label="瀛e害" value="QUARTERLY"/> -->
-              </el-select>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'DAILY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-time-picker v-model="form.frequencyDetail" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
-                              value-format="HH:mm" />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
-                <el-option label="鍛ㄤ竴" value="MON"/>
-                <el-option label="鍛ㄤ簩" value="TUE"/>
-                <el-option label="鍛ㄤ笁" value="WED"/>
-                <el-option label="鍛ㄥ洓" value="THU"/>
-                <el-option label="鍛ㄤ簲" value="FRI"/>
-                <el-option label="鍛ㄥ叚" value="SAT"/>
-                <el-option label="鍛ㄦ棩" value="SUN"/>
-              </el-select>
-              <el-time-picker v-model="form.time" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
-                              value-format="HH:mm"  style="width: 50%"/>
-            </el-form-item>
-          </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-date-picker
-                  v-model="form.frequencyDetail"
-                  type="datetime"
-                  clearable
-                  placeholder="閫夋嫨寮�濮嬫棩鏈�"
-                  format="DD,HH:mm"
-                  value-format="DD,HH:mm"
-              />
-            </el-form-item>
-          </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'QUARTERLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-date-picker
-                  v-model="form.frequencyDetail"
-                  type="datetime"
-                  clearable
-                  placeholder="閫夋嫨寮�濮嬫棩鏈�"
-                  format="MM,DD,HH:mm"
-                  value-format="MM,DD,HH:mm"
-              />
-            </el-form-item>
-          </el-col>
-        </el-row>
-      </el-form>
-      <template #footer>
-        <div class="dialog-footer">
-          <el-button @click="cancel">鍙栨秷</el-button>
-          <el-button type="primary" @click="submitForm">淇濆瓨</el-button>
-        </div>
-      </template>
-    </el-dialog>
-  </div>
+	<div>
+		<el-dialog :title="operationType === 'add' ? '鏂板宸℃浠诲姟' : '缂栬緫宸℃浠诲姟'"
+							 v-model="dialogVisitable" width="800px" @close="cancel">
+			<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="璁惧鍚嶇О" prop="taskId">
+							<el-select v-model="form.taskId" @change="setDeviceModel" filterable>
+								<el-option
+									v-for="(item, index) in deviceOptions"
+									:key="index"
+									:label="item.deviceName"
+									:value="item.id"
+								></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="宸℃浜�" prop="inspector">
+							<el-select v-model="form.inspector"                 filterable
+												 default-first-option
+												 :reserve-keyword="false" placeholder="璇烽�夋嫨" multiple clearable>
+								<el-option v-for="item in userList" :label="item.nickName" :value="item.userId" :key="item.userId"/>
+							</el-select>
+						</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>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鐧昏鏃堕棿" prop="dateStr">
+							<el-date-picker
+								v-model="form.dateStr"
+								type="date"
+								placeholder="閫夋嫨鐧昏鏃ユ湡"
+								format="YYYY-MM-DD"
+								value-format="YYYY-MM-DD"
+								style="width: 100%"
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="浠诲姟棰戠巼" prop="frequencyType">
+							<el-select v-model="form.frequencyType" placeholder="璇烽�夋嫨" clearable>
+								<el-option label="姣忔棩" value="DAILY"/>
+								<el-option label="姣忓懆" value="WEEKLY"/>
+								<el-option label="姣忔湀" value="MONTHLY"/>
+								<!-- <el-option label="瀛e害" value="QUARTERLY"/> -->
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'DAILY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-time-picker v-model="form.frequencyDetail" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
+															value-format="HH:mm" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
+								<el-option label="鍛ㄤ竴" value="MON"/>
+								<el-option label="鍛ㄤ簩" value="TUE"/>
+								<el-option label="鍛ㄤ笁" value="WED"/>
+								<el-option label="鍛ㄥ洓" value="THU"/>
+								<el-option label="鍛ㄤ簲" value="FRI"/>
+								<el-option label="鍛ㄥ叚" value="SAT"/>
+								<el-option label="鍛ㄦ棩" value="SUN"/>
+							</el-select>
+							<el-time-picker v-model="form.time" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
+															value-format="HH:mm"  style="width: 50%"/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-date-picker
+								v-model="form.frequencyDetail"
+								type="datetime"
+								clearable
+								placeholder="閫夋嫨寮�濮嬫棩鏈�"
+								format="DD,HH:mm"
+								value-format="DD,HH:mm"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'QUARTERLY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-date-picker
+								v-model="form.frequencyDetail"
+								type="datetime"
+								clearable
+								placeholder="閫夋嫨寮�濮嬫棩鏈�"
+								format="MM,DD,HH:mm"
+								value-format="MM,DD,HH:mm"
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button @click="cancel">鍙栨秷</el-button>
+					<el-button type="primary" @click="submitForm">淇濆瓨</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</div>
 </template>
 
 <script setup>
@@ -113,115 +127,117 @@
 const operationType = ref('add');
 const deviceOptions = ref([]);
 const data = reactive({
-  form: {
-    taskId: undefined,
-    taskName: undefined,
-    inspector: '',
-    inspectorIds: '',
-    remarks: '',
-    frequencyType: '',
-    frequencyDetail: '',
-    week: '',
-    time: ''
-  },
-  rules: {
-    taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
-    inspector: [{ required: true, message: "璇疯緭鍏ュ贰妫�浜�", trigger: "blur" },],
-  }
+	form: {
+		taskId: undefined,
+		taskName: undefined,
+		inspector: '',
+		inspectorIds: '',
+		remarks: '',
+		frequencyType: '',
+		frequencyDetail: '',
+		week: '',
+		time: '',
+		dateStr: ''
+	},
+	rules: {
+		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
+		inspector: [{ required: true, message: "璇疯緭鍏ュ贰妫�浜�", trigger: "blur" },],
+		dateStr: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }]
+	}
 })
 const { form, rules } = toRefs(data)
 const userList = ref([])
 
 const loadDeviceName = async () => {
-  const { data } = await getDeviceLedger();
-  deviceOptions.value = data;
+	const { data } = await getDeviceLedger();
+	deviceOptions.value = data;
 };
 
 const setDeviceModel = (id) => {
-  const option = deviceOptions.value.find((item) => item.id === id);
-  if (option) {
-    form.value.taskName = option.deviceName;
-  }
+	const option = deviceOptions.value.find((item) => item.id === id);
+	if (option) {
+		form.value.taskName = option.deviceName;
+	}
 }
 
 // 鎵撳紑寮规
 const openDialog = async (type, row) => {
-  dialogVisitable.value = true
-  operationType.value = type
-  
-  // 閲嶇疆琛ㄥ崟
-  resetForm();
-  
-  // 鍔犺浇鐢ㄦ埛鍒楄〃
-  userListNoPageByTenantId().then((res) => {
-    userList.value = res.data;
-  });
-  
-  // 鍔犺浇璁惧鍒楄〃
-  await loadDeviceName();
-  
-  if (type === 'edit' && row) {
-    form.value = {...row}
-    form.value.inspector = form.value.inspectorIds.split(',').map(Number)
-    
-    // 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
-    if (form.value.taskId) {
-      setDeviceModel(form.value.taskId);
-    }
-  }
+	dialogVisitable.value = true
+	operationType.value = type
+	
+	// 閲嶇疆琛ㄥ崟
+	resetForm();
+	
+	// 鍔犺浇鐢ㄦ埛鍒楄〃
+	userListNoPageByTenantId().then((res) => {
+		userList.value = res.data;
+	});
+	
+	// 鍔犺浇璁惧鍒楄〃
+	await loadDeviceName();
+	
+	if (type === 'edit' && row) {
+		form.value = {...row}
+		form.value.inspector = form.value.inspectorIds.split(',').map(Number)
+		
+		// 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
+		if (form.value.taskId) {
+			setDeviceModel(form.value.taskId);
+		}
+	}
 }
 
 // 鍏抽棴瀵硅瘽妗�
 const cancel = () => {
-  resetForm()
-  dialogVisitable.value = false
-  emit('closeDia')
+	resetForm()
+	dialogVisitable.value = false
+	emit('closeDia')
 }
 
 // 閲嶇疆琛ㄥ崟鍑芥暟
 const resetForm = () => {
-  if (proxy.$refs.formRef) {
-    proxy.$refs.formRef.resetFields()
-  }
-  // 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
-  form.value = {
-    taskId: undefined,
-    taskName: undefined,
-    inspector: '',
-    inspectorIds: '',
-    remarks: '',
-    frequencyType: '',
-    frequencyDetail: '',
-    week: '',
-    time: ''
-  }
+	if (proxy.$refs.formRef) {
+		proxy.$refs.formRef.resetFields()
+	}
+	// 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
+	form.value = {
+		taskId: undefined,
+		taskName: undefined,
+		inspector: '',
+		inspectorIds: '',
+		remarks: '',
+		frequencyType: '',
+		frequencyDetail: '',
+		week: '',
+		time: ''
+	}
 }
 
 // 鎻愪氦琛ㄥ崟
 const submitForm = () => {
-  proxy.$refs["formRef"].validate(async valid => {
-    if (valid) {
-      try {
-        form.value.inspectorIds = form.value.inspector.join(',')
-        delete form.value.inspector
-        
-        if (form.value.frequencyType === 'WEEKLY') {
-          let frequencyDetail = ''
-          frequencyDetail = form.value.week + ',' + form.value.time
-          form.value.frequencyDetail = frequencyDetail
-        }
-        
-        let res = await userStore.getInfo()
-        form.value.registrantId = res.user.userId
-        
-        await addOrEditTimingTask(form.value)
-        cancel()
-        proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
-      } catch (error) {
-        proxy.$modal.msgError('鎻愪氦澶辫触锛岃閲嶈瘯')
-      }
-    }
-  })
+	proxy.$refs["formRef"].validate(async valid => {
+		if (valid) {
+			try {
+				form.value.inspectorIds = form.value.inspector.join(',')
+				delete form.value.inspector
+				
+				if (form.value.frequencyType === 'WEEKLY') {
+					let frequencyDetail = ''
+					frequencyDetail = form.value.week + ',' + form.value.time
+					form.value.frequencyDetail = frequencyDetail
+				}
+				
+				let res = await userStore.getInfo()
+				form.value.registrantId = res.user.userId
+				
+				await addOrEditTimingTask(form.value)
+				cancel()
+				proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
+			} catch (error) {
+				proxy.$modal.msgError('鎻愪氦澶辫触锛岃閲嶈瘯')
+			}
+		}
+	})
 }
 defineExpose({ openDialog })
 </script>
diff --git a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
index d1c9d8d..f0deddb 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
@@ -32,7 +32,7 @@
         
         <!-- 鐢熶骇鍚� -->
         <div class="form-container">
-          <div class="title">鐢熶骇鍚�</div>
+          <div class="title">鐢熶骇涓�</div>
           
           <!-- 鍥剧墖鍒楄〃 -->
           <div style="display: flex; flex-wrap: wrap;">
@@ -59,7 +59,7 @@
         
         <!-- 鐢熶骇闂 -->
         <div class="form-container">
-          <div class="title">鐢熶骇闂</div>
+          <div class="title">鐢熶骇鍚�</div>
           
           <!-- 鍥剧墖鍒楄〃 -->
           <div style="display: flex; flex-wrap: wrap;">
diff --git a/src/views/equipmentManagement/inspectionManagement/index.vue b/src/views/equipmentManagement/inspectionManagement/index.vue
index 3e4e31e..381fc69 100644
--- a/src/views/equipmentManagement/inspectionManagement/index.vue
+++ b/src/views/equipmentManagement/inspectionManagement/index.vue
@@ -1,80 +1,78 @@
 <template>
-  <div class="app-container">
-    <el-form :inline="true" :model="queryParams" class="search-form">
-      <el-form-item label="鎼滅储">
-        <el-input
-            v-model="queryParams.searchAll"
-            placeholder="璇疯緭鍏ュ叧閿瓧"
-            clearable
-            :style="{ width: '100%' }"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
-        <el-button @click="resetQuery">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-    <el-card>
-      <div style="display: flex;flex-direction: row;justify-content: space-between;margin-bottom: 10px;">
-        <el-radio-group v-model="activeRadio" @change="radioChange">
-          <el-radio-button v-for="tab in radios"
-                           :key="tab.name"
-                           :label="tab.label"
-                           :value="tab.name"/>
-        </el-radio-group>
-        <!-- 鎿嶄綔鎸夐挳鍖� -->
-        <el-space v-if="activeRadio !== 'task'">
-          <el-button type="primary" :icon="Plus" @click="handleAdd(undefined)">鏂板缓</el-button>
-          <el-button type="danger" :icon="Delete" @click="handleDelete">鍒犻櫎</el-button>
-          <el-button @click="handleOut">瀵煎嚭</el-button>
-        </el-space>
-        <el-space v-else>
-          <el-button @click="handleOut">瀵煎嚭</el-button>
-        </el-space>
-      </div>
-      <div>
-        <div>
-          <PIMTable :table-loading="tableLoading"
-                  :table-data="tableData"
-                  :column="tableColumns"
-                  @selection-change="handleSelectionChange"
-                  :is-selection="true"
-                  :border="true"
-                  :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"
-                  size="small"
-                  type="primary"
-                  class="person-tag"
-                >
-                  {{ person }}
-                </el-tag>
-              </template>
-              <span v-else class="no-data">--</span>
-            </div>
-          </template>
-            </PIMTable>
-        </div>
-        <pagination
-            v-if="total>0"
-            :page="pageNum"
-            :limit="pageSize"
-            :total="total"
-            @pagination="handlePagination"
-            :layout="'total, prev, pager, next, jumper'"
-        />
-      </div>
-    </el-card>
-    <form-dia ref="formDia" @closeDia="handleQuery"></form-dia>
-    <view-files ref="viewFiles"></view-files>
-  </div>
+	<div class="app-container">
+		<el-form :inline="true" :model="queryParams" class="search-form">
+			<el-form-item label="鎼滅储">
+				<el-input
+					v-model="queryParams.searchAll"
+					placeholder="璇疯緭鍏ュ叧閿瓧"
+					clearable
+					:style="{ width: '100%' }"
+				/>
+			</el-form-item>
+			<el-form-item>
+				<el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
+				<el-button @click="resetQuery">閲嶇疆</el-button>
+			</el-form-item>
+		</el-form>
+		<el-card>
+			<div style="display: flex;flex-direction: row;justify-content: space-between;margin-bottom: 10px;">
+				<el-radio-group v-model="activeRadio" @change="radioChange">
+					<el-radio-button v-for="tab in radios"
+													 :key="tab.name"
+													 :label="tab.label"
+													 :value="tab.name"/>
+				</el-radio-group>
+				<!-- 鎿嶄綔鎸夐挳鍖� -->
+				<el-space v-if="activeRadio !== 'task'">
+					<el-button type="primary" :icon="Plus" @click="handleAdd(undefined)">鏂板缓</el-button>
+					<el-button type="danger" :icon="Delete" @click="handleDelete">鍒犻櫎</el-button>
+					<el-button @click="handleOut">瀵煎嚭</el-button>
+				</el-space>
+				<el-space v-else>
+					<el-button @click="handleOut">瀵煎嚭</el-button>
+				</el-space>
+			</div>
+			<div>
+				<div>
+					<PIMTable :table-loading="tableLoading"
+										:table-data="tableData"
+										:column="tableColumns"
+										@selection-change="handleSelectionChange"
+										:is-selection="true"
+										:border="true"
+										:table-style="{ width: '100%', height: 'calc(100vh - 23em)' }"
+										:page="{
+          current: pageNum,
+          size: pageSize,
+          total: total,
+        }"
+										@pagination="pagination"
+					>
+						<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"
+										size="small"
+										type="primary"
+										class="person-tag"
+									>
+										{{ person }}
+									</el-tag>
+								</template>
+								<span v-else class="no-data">--</span>
+							</div>
+						</template>
+					</PIMTable>
+				</div>
+			</div>
+		</el-card>
+		<form-dia ref="formDia" @closeDia="handleQuery"></form-dia>
+		<view-files ref="viewFiles"></view-files>
+	</div>
 </template>
 
 <script setup>
@@ -90,9 +88,9 @@
 
 // 鎺ュ彛寮曞叆
 import {
-  delTimingTask,
-  inspectionTaskList,
-  timingTaskList
+	delTimingTask,
+	inspectionTaskList,
+	timingTaskList
 } from "@/api/inspectionManagement/index.js";
 
 // 鍏ㄥ眬鍙橀噺
@@ -102,14 +100,14 @@
 
 // 鏌ヨ鍙傛暟
 const queryParams = reactive({
-  searchAll: "",
+	searchAll: "",
 });
 
 // 鍗曢�夋閰嶇疆
 const activeRadio = ref("taskManage");
 const radios = reactive([
-  { name: "taskManage", label: "瀹氭椂浠诲姟绠$悊" },
-  { name: "task", label: "瀹氭椂浠诲姟璁板綍" },
+	{ name: "taskManage", label: "瀹氭椂浠诲姟绠$悊" },
+	{ name: "task", label: "瀹氭椂浠诲姟璁板綍" },
 ]);
 
 // 琛ㄦ牸鏁版嵁
@@ -124,234 +122,233 @@
 
 // 鍒楅厤缃�
 const columns = ref([
-  { prop: "taskName", label: "宸℃浠诲姟鍚嶇О", minWidth: 160 },
-  { prop: "remarks", label: "澶囨敞", minWidth: 150 },
-  { prop: "inspector", label: "鎵ц宸℃浜�", minWidth: 150, slot: "inspector" },
-  {
-    prop: "frequencyType",
-    label: "棰戞",
-    minWidth: 150,
-    formatter: (_, __, val) => ({
-      DAILY: "姣忔棩",
-      WEEKLY: "姣忓懆",
-      MONTHLY: "姣忔湀",
-      QUARTERLY: "瀛e害"
-    }[val] || "")
-  },
-  {
-    prop: "frequencyDetail",
-    label: "寮�濮嬫棩鏈熶笌鏃堕棿",
-    minWidth: 150,
-    formatter: (row, column, cellValue) => {
-      // 鍏堝垽鏂槸鍚︽槸瀛楃涓�
-      if (typeof cellValue !== 'string') return '';
-      let val = cellValue;
-      const replacements = {
-        MON: '鍛ㄤ竴',
-        TUE: '鍛ㄤ簩',
-        WED: '鍛ㄤ笁',
-        THU: '鍛ㄥ洓',
-        FRI: '鍛ㄤ簲',
-        SAT: '鍛ㄥ叚',
-        SUN: '鍛ㄦ棩'
-      };
-      // 浣跨敤姝e垯涓�娆℃�ф浛鎹㈡墍鏈夊尮閰嶉」
-      return val.replace(/MON|TUE|WED|THU|FRI|SAT|SUN/g, match => replacements[match]);
-    }
-  },
-  { prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
-  { prop: "createTime", label: "鐧昏鏃ユ湡", minWidth: 100 },
+	{ prop: "taskName", label: "宸℃浠诲姟鍚嶇О", minWidth: 160 },
+	{ prop: "remarks", label: "澶囨敞", minWidth: 150 },
+	{ prop: "inspector", label: "鎵ц宸℃浜�", minWidth: 150, slot: "inspector" },
+	{
+		prop: "frequencyType",
+		label: "棰戞",
+		minWidth: 150,
+		formatData: (cell) => ({
+			DAILY: "姣忔棩",
+			WEEKLY: "姣忓懆",
+			MONTHLY: "姣忔湀",
+			QUARTERLY: "瀛e害"
+		}[cell] || "")
+	},
+	{
+		prop: "frequencyDetail",
+		label: "寮�濮嬫棩鏈熶笌鏃堕棿",
+		minWidth: 150,
+		formatter: (row, column, cellValue) => {
+			// 鍏堝垽鏂槸鍚︽槸瀛楃涓�
+			if (typeof cellValue !== 'string') return '';
+			let val = cellValue;
+			const replacements = {
+				MON: '鍛ㄤ竴',
+				TUE: '鍛ㄤ簩',
+				WED: '鍛ㄤ笁',
+				THU: '鍛ㄥ洓',
+				FRI: '鍛ㄤ簲',
+				SAT: '鍛ㄥ叚',
+				SUN: '鍛ㄦ棩'
+			};
+			// 浣跨敤姝e垯涓�娆℃�ф浛鎹㈡墍鏈夊尮閰嶉」
+			return val.replace(/MON|TUE|WED|THU|FRI|SAT|SUN/g, match => replacements[match]);
+		}
+	},
+	{ prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
+	{ prop: "dateStr", label: "鐧昏鏃ユ湡", minWidth: 100 },
 ]);
 
 // 鎿嶄綔鍒楅厤缃�
 const getOperationColumn = (operations) => {
-  if (!operations || operations.length === 0) return null;
-  
-  const operationConfig = {
-    label: "鎿嶄綔",
-    width: 130,
-    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)
-  };
-  
-  return operationConfig;
+	if (!operations || operations.length === 0) return null;
+	
+	const operationConfig = {
+		label: "鎿嶄綔",
+		width: 130,
+		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)
+	};
+	
+	return operationConfig;
 };
 
 onMounted(() => {
-  radioChange('taskManage');
+	radioChange('taskManage');
 });
 
 // 鍗曢�夊彉鍖�
 const radioChange = (value) => {
-  if (value === "taskManage") {
-    const operationColumn = getOperationColumn(['edit']);
-    tableColumns.value = [...columns.value, ...(operationColumn ? [operationColumn] : [])];
-    operationsArr.value = ['edit'];
-  } else if (value === "task") {
-    const operationColumn = getOperationColumn(['viewFile']);
-    tableColumns.value = [...columns.value, ...(operationColumn ? [operationColumn] : [])];
-    operationsArr.value = ['viewFile'];
-  }
-  pageNum.value = 1;
-  pageSize.value = 10;
-  getList();
+	if (value === "taskManage") {
+		const operationColumn = getOperationColumn(['edit']);
+		tableColumns.value = [...columns.value, ...(operationColumn ? [operationColumn] : [])];
+		operationsArr.value = ['edit'];
+	} else if (value === "task") {
+		const operationColumn = getOperationColumn(['viewFile']);
+		tableColumns.value = [...columns.value, ...(operationColumn ? [operationColumn] : [])];
+		operationsArr.value = ['viewFile'];
+	}
+	pageNum.value = 1;
+	pageSize.value = 10;
+	getList();
 };
 
 // 鏌ヨ鎿嶄綔
 const handleQuery = () => {
-  pageNum.value = 1;
-  pageSize.value = 10;
-  getList();
+	pageNum.value = 1;
+	pageSize.value = 10;
+	getList();
 };
-// 鍒嗛〉澶勭悊
-const handlePagination = (val) => {
-	pageNum.value = val.page;
-	pageSize.value = val.size;
+const pagination = (obj) => {
+	pageNum.value = obj.page;
+	pageSize.value = obj.limit;
 	getList();
 };
 // 鑾峰彇鍒楄〃鏁版嵁
 const getList = () => {
-  tableLoading.value = true;
-  
-  const params = { ...queryParams, size: pageSize.value, current: pageNum.value };
-  
-  let apiCall;
-  if (activeRadio.value === "task") {
-    apiCall = inspectionTaskList(params);
-  } else {
-    apiCall = timingTaskList(params);
-  }
-  
-  apiCall.then(res => {
-    const rawData = res.data.records || [];
-    // 澶勭悊 inspector 瀛楁锛屽皢瀛楃涓茶浆鎹负鏁扮粍锛堥�傜敤浜庢墍鏈夋儏鍐碉級
-    tableData.value = rawData.map(item => {
-      const processedItem = { ...item };
-      
-      // 澶勭悊 inspector 瀛楁
-      if (processedItem.inspector) {
-        if (typeof processedItem.inspector === 'string') {
-          // 瀛楃涓叉寜閫楀彿鍒嗗壊
-          processedItem.inspector = processedItem.inspector.split(',').map(s => s.trim()).filter(s => s);
-        } else if (!Array.isArray(processedItem.inspector)) {
-          // 闈炴暟缁勮浆涓烘暟缁�
-          processedItem.inspector = [processedItem.inspector];
-        }
-      } else {
-        // 绌哄�艰涓虹┖鏁扮粍
-        processedItem.inspector = [];
-      }
-      
-      return processedItem;
-    });
-    total.value = res.data.total || 0;
-  }).finally(() => {
-    tableLoading.value = false;
-  });
+	tableLoading.value = true;
+	
+	const params = { ...queryParams, size: pageSize.value, current: pageNum.value };
+	
+	let apiCall;
+	if (activeRadio.value === "task") {
+		apiCall = inspectionTaskList(params);
+	} else {
+		apiCall = timingTaskList(params);
+	}
+	
+	apiCall.then(res => {
+		const rawData = res.data.records || [];
+		// 澶勭悊 inspector 瀛楁锛屽皢瀛楃涓茶浆鎹负鏁扮粍锛堥�傜敤浜庢墍鏈夋儏鍐碉級
+		tableData.value = rawData.map(item => {
+			const processedItem = { ...item };
+			
+			// 澶勭悊 inspector 瀛楁
+			if (processedItem.inspector) {
+				if (typeof processedItem.inspector === 'string') {
+					// 瀛楃涓叉寜閫楀彿鍒嗗壊
+					processedItem.inspector = processedItem.inspector.split(',').map(s => s.trim()).filter(s => s);
+				} else if (!Array.isArray(processedItem.inspector)) {
+					// 闈炴暟缁勮浆涓烘暟缁�
+					processedItem.inspector = [processedItem.inspector];
+				}
+			} else {
+				// 绌哄�艰涓虹┖鏁扮粍
+				processedItem.inspector = [];
+			}
+			
+			return processedItem;
+		});
+		total.value = res.data.total || 0;
+	}).finally(() => {
+		tableLoading.value = false;
+	});
 };
 
 // 閲嶇疆鏌ヨ
 const resetQuery = () => {
-  for (const key in queryParams) {
-    if (!["pageNum", "pageSize"].includes(key)) {
-      queryParams[key] = "";
-    }
-  }
-  handleQuery();
+	for (const key in queryParams) {
+		if (!["pageNum", "pageSize"].includes(key)) {
+			queryParams[key] = "";
+		}
+	}
+	handleQuery();
 };
 
 // 鏂板 / 缂栬緫
 const handleAdd = (row) => {
-  const type = row ? 'edit' : 'add';
-  nextTick(() => {
-    formDia.value?.openDialog(type, row);
-  });
+	const type = row ? 'edit' : 'add';
+	nextTick(() => {
+		formDia.value?.openDialog(type, row);
+	});
 };
 
 // 鏌ョ湅闄勪欢
 const viewFile = (row) => {
-  nextTick(() => {
-    viewFiles.value?.openDialog(row);
-  });
+	nextTick(() => {
+		viewFiles.value?.openDialog(row);
+	});
 };
 
 // 鍒犻櫎鎿嶄綔
 const handleDelete = () => {
-  if (!selectedRows.value.length) {
-    proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
-    return;
-  }
-  
-  const deleteIds = selectedRows.value.map(item => item.id);
-  
-  proxy.$modal.confirm('鏄惁纭鍒犻櫎鎵�閫夋暟鎹」锛�').then(() => {
-    return delTimingTask(deleteIds);
-  }).then(() => {
-    proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-    handleQuery();
-  }).catch(() => {});
+	if (!selectedRows.value.length) {
+		proxy.$modal.msgWarning("璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁");
+		return;
+	}
+	
+	const deleteIds = selectedRows.value.map(item => item.id);
+	
+	proxy.$modal.confirm('鏄惁纭鍒犻櫎鎵�閫夋暟鎹」锛�').then(() => {
+		return delTimingTask(deleteIds);
+	}).then(() => {
+		proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+		handleQuery();
+	}).catch(() => {});
 };
 
 // 澶氶�夊彉鏇�
 const handleSelectionChange = (selection) => {
-  selectedRows.value = selection;
+	selectedRows.value = selection;
 };
 
 // 瀵煎嚭
 const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  })
-    .then(() => {
-      // 鏍规嵁褰撳墠閫変腑鐨勬爣绛鹃〉璋冪敤涓嶅悓鐨勫鍑烘帴鍙�
-      if (activeRadio.value === "taskManage") {
-        // 瀹氭椂浠诲姟绠$悊
-        proxy.download("/timingTask/export", {}, "瀹氭椂浠诲姟绠$悊.xlsx");
-      } else if (activeRadio.value === "task") {
-        // 瀹氭椂浠诲姟璁板綍
-        proxy.download("/inspectionTask/export", {}, "瀹氭椂浠诲姟璁板綍.xlsx");
-      }
-    })
-    .catch(() => {
-      proxy.$modal.msg("宸插彇娑�");
-    });
+	ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+		confirmButtonText: "纭",
+		cancelButtonText: "鍙栨秷",
+		type: "warning",
+	})
+		.then(() => {
+			// 鏍规嵁褰撳墠閫変腑鐨勬爣绛鹃〉璋冪敤涓嶅悓鐨勫鍑烘帴鍙�
+			if (activeRadio.value === "taskManage") {
+				// 瀹氭椂浠诲姟绠$悊
+				proxy.download("/timingTask/export", {}, "瀹氭椂浠诲姟绠$悊.xlsx");
+			} else if (activeRadio.value === "task") {
+				// 瀹氭椂浠诲姟璁板綍
+				proxy.download("/inspectionTask/export", {}, "瀹氭椂浠诲姟璁板綍.xlsx");
+			}
+		})
+		.catch(() => {
+			proxy.$modal.msg("宸插彇娑�");
+		});
 };
 </script>
 
 <style scoped>
 .person-tags {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 4px;
+	display: flex;
+	flex-wrap: wrap;
+	gap: 4px;
 }
 
 .person-tag {
-  margin-right: 4px;
-  margin-bottom: 2px;
+	margin-right: 4px;
+	margin-bottom: 2px;
 }
 
 .no-data {
-  color: #909399;
-  font-size: 14px;
+	color: #909399;
+	font-size: 14px;
 }
 </style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/ledger/Modal.vue b/src/views/equipmentManagement/ledger/Modal.vue
index 0cea56c..16166c6 100644
--- a/src/views/equipmentManagement/ledger/Modal.vue
+++ b/src/views/equipmentManagement/ledger/Modal.vue
@@ -1,5 +1,5 @@
 <template>
-  <el-dialog :title="modalOptions.title" v-model="visible" @close="close">
+  <el-dialog :title="modalOptions.title" v-model="visible" @close="close" draggable>
     <Form ref="formRef"></Form>
     <template #footer>
 			<el-button type="primary" @click="sendForm" :loading="loading">
diff --git a/src/views/equipmentManagement/ledger/index.vue b/src/views/equipmentManagement/ledger/index.vue
index 6af5543..8cdbf32 100644
--- a/src/views/equipmentManagement/ledger/index.vue
+++ b/src/views/equipmentManagement/ledger/index.vue
@@ -82,15 +82,14 @@
       </PIMTable>
     </div>
     <Modal ref="modalRef" @success="getTableData"></Modal>
-		<el-dialog v-model="qrDialogVisible" title="浜岀淮鐮�" width="300px">
-			<div style="text-align:center;">
-				<img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
-				<div style="margin-top:6px;font-size:14px;color:#333;">{{ qrRowData?.deviceName }}</div>
-				<div style="margin:10px 0;">
-					<el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
-				</div>
-			</div>
-		</el-dialog>
+    <el-dialog v-model="qrDialogVisible" title="浜岀淮鐮�" width="300px" draggable>
+      <div style="text-align:center;">
+        <img :src="qrCodeUrl" alt="浜岀淮鐮�" style="width:200px;height:200px;" />
+        <div style="margin:10px 0;">
+          <el-button type="primary" @click="downloadQRCode">涓嬭浇浜岀淮鐮佸浘鐗�</el-button>
+        </div>
+      </div>
+    </el-dialog>
   </div>
 </template>
 
@@ -300,44 +299,10 @@
 };
 
 const downloadQRCode = () => {
-	const name = qrRowData.value?.deviceName || "浜岀淮鐮�";
-	const img = new Image();
-	img.src = qrCodeUrl.value;
-	img.onload = () => {
-		const padding = 10;
-		const qrSize = 200;
-		const textHeight = 24; // space for text
-		const width = qrSize + padding * 2;
-		const height = qrSize + padding * 2 + textHeight;
-		const canvas = document.createElement("canvas");
-		canvas.width = width;
-		canvas.height = height;
-		const ctx = canvas.getContext("2d");
-		// background
-		ctx.fillStyle = "#ffffff";
-		ctx.fillRect(0, 0, width, height);
-		// draw QR centered
-		ctx.drawImage(img, padding, padding, qrSize, qrSize);
-		// draw name centered below
-		ctx.fillStyle = "#333";
-		ctx.font = "14px Arial";
-		ctx.textAlign = "center";
-		ctx.textBaseline = "middle";
-		const maxTextWidth = width - padding * 2;
-		let displayName = name;
-		// ellipsis if too long
-		while (ctx.measureText(displayName).width > maxTextWidth && displayName.length > 0) {
-			displayName = displayName.slice(0, -1);
-		}
-		if (displayName !== name) displayName = displayName + "鈥�";
-		ctx.fillText(displayName, width / 2, qrSize + padding + textHeight / 2);
-		
-		const dataUrl = canvas.toDataURL("image/png");
-		const a = document.createElement("a");
-		a.href = dataUrl;
-		a.download = `${name}.png`;
-		a.click();
-	};
+  const a = document.createElement("a");
+  a.href = qrCodeUrl.value;
+  a.download = `${qrRowData.value.deviceName || "浜岀淮鐮�"}.png`;
+  a.click();
 };
 
 onMounted(() => {
diff --git a/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue b/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
index 8987485..d4ac2e1 100644
--- a/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
+++ b/src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
@@ -4,6 +4,7 @@
 			v-model="dialogFormVisible"
 			title="璁¢噺鍣ㄥ叿"
 			width="50%"
+			draggable
 			@close="closeDia"
 		>
 			<el-form
@@ -67,7 +68,9 @@
 							<el-select
 								v-model="form.userId"
 								placeholder="璇烽�夋嫨"
-								disabled
+                filterable
+                default-first-option
+                :reserve-keyword="false"
 								clearable
 							>
 								<el-option
@@ -129,6 +132,7 @@
 import {getToken} from "@/utils/auth.js";
 import {ledgerRecordUpdate, ledgerRecordVerifying} from "@/api/equipmentManagement/calibration.js";
 import {delLedgerFile} from "@/api/salesManagement/salesLedger.js";
+import { getCurrentDate } from "@/utils/index.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 const dialogFormVisible = ref(false);
@@ -248,14 +252,6 @@
 	dialogFormVisible.value = false;
 	emit('close')
 };
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
-	const today = new Date();
-	const year = today.getFullYear();
-	const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
-	const day = String(today.getDate()).padStart(2, "0");
-	return `${year}-${month}-${day}`;
-}
 defineExpose({
 	openDialog,
 });
diff --git a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue b/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
index 891316d..7b6097b 100644
--- a/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
+++ b/src/views/equipmentManagement/measurementEquipment/components/formDia.vue
@@ -4,6 +4,7 @@
         v-model="dialogFormVisible"
         title="璁¢噺鍣ㄥ叿"
         width="50%"
+				draggable
         @close="closeDia"
     >
 			<el-form
@@ -64,7 +65,9 @@
 								v-model="form.userId"
 								placeholder="璇烽�夋嫨"
 								clearable
-								disabled
+                filterable
+                default-first-option
+                :reserve-keyword="false"
 							>
 								<el-option
 									v-for="item in userList"
@@ -124,6 +127,7 @@
 import {afterSalesServiceAdd, afterSalesServiceUpdate} from "@/api/customerService/index.js";
 import {getToken} from "@/utils/auth.js";
 import {measuringInstrumentAdd, measuringInstrumentUpdate} from "@/api/equipmentManagement/measurementEquipment.js";
+import { getCurrentDate } from "@/utils/index.js";
 const { proxy } = getCurrentInstance()
 const emit = defineEmits(['close'])
 const dialogFormVisible = ref(false);
@@ -234,14 +238,6 @@
   dialogFormVisible.value = false;
   emit('close')
 };
-// 鑾峰彇褰撳墠鏃ユ湡骞舵牸寮忓寲涓� YYYY-MM-DD
-function getCurrentDate() {
-	const today = new Date();
-	const year = today.getFullYear();
-	const month = String(today.getMonth() + 1).padStart(2, "0"); // 鏈堜唤浠�0寮�濮�
-	const day = String(today.getDate()).padStart(2, "0");
-	return `${year}-${month}-${day}`;
-}
 defineExpose({
   openDialog,
 });
diff --git a/src/views/equipmentManagement/measurementEquipment/index.vue b/src/views/equipmentManagement/measurementEquipment/index.vue
index e983a99..363a85a 100644
--- a/src/views/equipmentManagement/measurementEquipment/index.vue
+++ b/src/views/equipmentManagement/measurementEquipment/index.vue
@@ -148,13 +148,13 @@
 					openCalibrationDia("verifying", row);
 				},
 			},
-			{
-				name: "闄勪欢",
-				type: "text",
-				clickFun: (row) => {
-          openFilesFormDia(row);
-				},
-			},
+			// {
+			// 	name: "闄勪欢",
+			// 	type: "text",
+			// 	clickFun: (row) => {
+      //     openFilesFormDia(row);
+			// 	},
+			// },
 		],
 	},
 ]);
@@ -221,12 +221,6 @@
 const handleDelete = () => {
 	let ids = [];
 	if (selectedRows.value.length > 0) {
-		// 妫�鏌ユ槸鍚︽湁浠栦汉缁存姢鐨勬暟鎹�
-		const unauthorizedData = selectedRows.value.filter(item => item.userId !== userStore.id);
-		if (unauthorizedData.length > 0) {
-			proxy.$modal.msgWarning("涓嶅彲鍒犻櫎浠栦汉缁存姢鐨勬暟鎹�");
-			return;
-		}
 		ids = selectedRows.value.map((item) => item.id);
 	} else {
 		proxy.$modal.msgWarning("璇烽�夋嫨鏁版嵁");
diff --git a/src/views/equipmentManagement/repair/Form/MaintainForm.vue b/src/views/equipmentManagement/repair/Form/MaintainForm.vue
index bbb25c1..2a64d3f 100644
--- a/src/views/equipmentManagement/repair/Form/MaintainForm.vue
+++ b/src/views/equipmentManagement/repair/Form/MaintainForm.vue
@@ -6,6 +6,13 @@
     <el-form-item label="缁翠慨缁撴灉">
       <el-input v-model="form.maintenanceResult" placeholder="璇疯緭鍏ョ淮淇粨鏋�" />
     </el-form-item>
+    <el-form-item label="鎶ヤ慨鐘舵��">
+      <el-select v-model="form.status">
+        <el-option label="寰呮姤淇�" :value="0"></el-option>
+        <el-option label="瀹岀粨" :value="1"></el-option>
+        <el-option label="澶辫触" :value="2"></el-option>
+      </el-select>
+    </el-form-item>
     <el-form-item label="缁翠慨鏃ユ湡">
       <el-date-picker
         v-model="form.maintenanceTime"
@@ -34,6 +41,7 @@
   maintenanceName: undefined, // 缁翠慨鍚嶇О
   maintenanceResult: undefined, // 缁翠慨缁撴灉
   maintenanceTime: undefined, // 缁翠慨鏃ユ湡
+  status: 0,
 });
 
 const setForm = (data) => {
diff --git a/src/views/equipmentManagement/repair/Form/RepairForm.vue b/src/views/equipmentManagement/repair/Form/RepairForm.vue
index 1fadde4..6697906 100644
--- a/src/views/equipmentManagement/repair/Form/RepairForm.vue
+++ b/src/views/equipmentManagement/repair/Form/RepairForm.vue
@@ -3,7 +3,7 @@
     <el-row>
       <el-col :span="12">
         <el-form-item label="璁惧鍚嶇О">
-          <el-select v-model="form.deviceLedgerId" @change="setDeviceModel">
+          <el-select v-model="form.deviceLedgerId" @change="setDeviceModel" filterable>
             <el-option
               v-for="(item, index) in deviceOptions"
               :key="index"
@@ -40,6 +40,19 @@
           <el-input v-model="form.repairName" placeholder="璇疯緭鍏ユ姤淇汉" />
         </el-form-item>
       </el-col>
+    </el-row>
+    <el-row v-if="id">
+      <el-col :span="12">
+        <el-form-item label="鎶ヤ慨鐘舵��">
+          <el-select v-model="form.status">
+            <el-option label="寰呯淮淇�" :value="0"></el-option>
+            <el-option label="瀹岀粨" :value="1"></el-option>
+            <el-option label="澶辫触" :value="2"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row>
       <el-col :span="24">
         <el-form-item label="鏁呴殰鐜拌薄">
           <el-input
@@ -55,9 +68,12 @@
 </template>
 
 <script setup>
+import dayjs from "dayjs";
 import useFormData from "@/hooks/useFormData";
 import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
 import useUserStore from "@/store/modules/user";
+
+const { id } = defineProps(["id"])
 
 defineOptions({
   name: "璁惧鎶ヤ慨琛ㄥ崟",
@@ -75,9 +91,10 @@
   deviceLedgerId: undefined, // 璁惧Id
   deviceName: undefined, // 璁惧鍚嶇О
   deviceModel: undefined, // 瑙勬牸鍨嬪彿
-  repairTime: undefined, // 鎶ヤ慨鏃ユ湡
+  repairTime: dayjs().format("YYYY-MM-DD"), // 鎶ヤ慨鏃ユ湡锛岄粯璁ゅ綋澶�
   repairName: userStore.nickName, // 鎶ヤ慨浜�
   remark: undefined, // 鏁呴殰鐜拌薄
+  status: 0, // 鎶ヤ慨鐘舵��
 });
 
 const setDeviceModel = (id) => {
@@ -96,6 +113,7 @@
   form.repairTime = data.repairTime;
   form.repairName = data.repairName;
   form.remark = data.remark;
+  form.status = data.status;
 };
 
 // onMounted(() => {
diff --git a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
index 309be0e..a578a58 100644
--- a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
@@ -1,5 +1,5 @@
 <template>
-  <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr">
+  <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr" draggable>
     <MaintainForm ref="maintainFormRef" />
     <template #footer>
 			<el-button type="primary" @click="sendForm" :loading="loading">
diff --git a/src/views/equipmentManagement/repair/Modal/RepairModal.vue b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
index 8441da2..c21b47a 100644
--- a/src/views/equipmentManagement/repair/Modal/RepairModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/RepairModal.vue
@@ -1,6 +1,6 @@
 <template>
-  <el-dialog v-model="visible" :title="modalOptions.title" @close="close">
-    <RepairForm ref="repairFormRef" />
+  <el-dialog v-model="visible" :title="modalOptions.title" @close="close" draggable>
+    <RepairForm ref="repairFormRef" :id="id" />
     <template #footer>
 			<el-button type="primary" @click="sendForm" :loading="loading">
 				{{ modalOptions.confirmText }}
diff --git a/src/views/equipmentManagement/repair/index.vue b/src/views/equipmentManagement/repair/index.vue
index 1a2ff1e..08cbcc2 100644
--- a/src/views/equipmentManagement/repair/index.vue
+++ b/src/views/equipmentManagement/repair/index.vue
@@ -106,8 +106,9 @@
         @pagination="changePage"
       >
         <template #statusRef="{ row }">
+          <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
           <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
-          <el-tag v-if="row.status === 0" type="danger">寰呯淮淇�</el-tag>
+          <el-tag v-if="row.status === 0" type="warning">寰呯淮淇�</el-tag>
         </template>
         <template #operation="{ row }">
           <el-button
diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
index f91d76f..f18c84c 100644
--- a/src/views/equipmentManagement/spareParts/index.vue
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -1,48 +1,55 @@
 <template>
   <div class="spare-part-category">
+		<div class="search_form">
+			<el-form :inline="true" :model="queryParams" class="search-form">
+				<el-form-item label="澶囦欢鍚嶇О">
+					<el-input
+						v-model="queryParams.name"
+						placeholder="璇疯緭鍏ュ浠跺悕绉�"
+						clearable
+						style="width: 240px"
+					/>
+				</el-form-item>
+				<el-form-item>
+					<el-button type="primary" @click="handleQuery">鏌ヨ</el-button>
+					<el-button @click="resetQuery">閲嶇疆</el-button>
+				</el-form-item>
+			</el-form>
+			<div>
+				<el-button type="primary" @click="addCategory" >鏂板</el-button>
+			</div>
+		</div>
+    
     <div class="table_list">
-      <div class="actions">
-        <el-text class="mx-1" size="large">璁惧鍒嗙被</el-text>
-        <div>
-          <el-button @click="fetchTreeData" :loading="loading">鍒锋柊</el-button>
-          <el-button type="primary" @click="addCategory" >鏂板</el-button>
-        </div>
-      </div>
       <el-table
         v-loading="loading"
         :data="renderTableData"
         style="width: 100%; margin-top: 10px;"
         border
         row-key="id"
-        :tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
       >
-        <el-table-column prop="name" label="鍒嗙被鍚嶇О" width="450">
-          <template #default="{ row }">
-            <span :style="{ paddingLeft: getIndentation(row) + 'px' }">
-              {{ row.name }}
-            </span>
-          </template>
-        </el-table-column>
-        <el-table-column prop="sparePartsNo" label="鍒嗙被缂栧彿" width="200"></el-table-column>
+      <el-table-column prop="deviceNameStr" label="璁惧鍚嶇О"  width="300"></el-table-column>
+        <el-table-column prop="name" label="澶囦欢鍚嶇О" width="200"></el-table-column>
+        <el-table-column prop="sparePartsNo" label="澶囦欢缂栧彿" width="200"></el-table-column>
         <el-table-column prop="status" label="鐘舵��" width="100">
           <template #default="{ row }">
             <el-tag type="success" size="small">{{ row.status }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="description" label="鎻忚堪" win-width="330"></el-table-column>
-        <el-table-column label="鎿嶄綔" width="180" fixed="right">
+        <el-table-column prop="price" label="浠锋牸" width="140"></el-table-column>
+        <el-table-column prop="description" label="鎻忚堪" width="150"></el-table-column>
+        <el-table-column label="鎿嶄綔" width="150" fixed="right" align="center">
           <template #default="{ row }">
             <el-button
-              type="text"
-              size="small"
+              link
+							type="primary"
               @click="() => editCategory(row)"
               :disabled="loading"
             >
               缂栬緫
             </el-button>
             <el-button
-              type="text"
-              size="small"
+							link
               @click="() => deleteCategory(row.id)"
               style="color: #f56c6c;"
               :disabled="loading"
@@ -55,10 +62,28 @@
     </div>
     <el-dialog title="鍒嗙被绠$悊" v-model="dialogVisible" width="60%">
       <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
-        <el-form-item label="鍒嗙被鍚嶇О" prop="name">
+        <el-form-item label="璁惧" prop="deviceLedgerIds">
+          <el-select
+            v-model="form.deviceLedgerIds"
+            placeholder="璇烽�夋嫨璁惧"
+            filterable
+            default-first-option
+            :reserve-keyword="false"
+            multiple
+            style="width: 100%"
+          >
+            <el-option
+              v-for="(item, index) in deviceOptions"
+              :key="index"
+              :label="item.deviceName"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="澶囦欢鍚嶇О" prop="name">
           <el-input v-model="form.name"></el-input>
         </el-form-item>
-        <el-form-item label="鍒嗙被缂栧彿" prop="sparePartsNo">
+        <el-form-item label="澶囦欢缂栧彿" prop="sparePartsNo">
           <el-input v-model="form.sparePartsNo"></el-input>
         </el-form-item>
         <el-form-item label="鐘舵��" prop="status">
@@ -70,17 +95,15 @@
         <el-form-item label="鎻忚堪" prop="description">
           <el-input v-model="form.description"></el-input>
         </el-form-item>
-        <el-form-item label="涓婄骇鍒嗙被" prop="parentId">
-          <el-select v-model="form.parentId" placeholder="璇烽�夋嫨涓婄骇鍒嗙被">
-            <el-option label="鏃犱笂绾у垎绫�" :value="null"></el-option>
-            <el-option
-              v-for="(item, index) in categories"
-              :key="index"
-              :label="item.name"
-              :value="item.id"
-              
-            ></el-option>
-          </el-select>
+        <el-form-item label="浠锋牸" prop="price">
+          <el-input-number
+            v-model="form.price"
+            placeholder="璇疯緭鍏ヤ环鏍�"
+            :min="0"
+            :step="0.01"
+            :precision="2"
+            style="width: 100%"
+          ></el-input-number>
         </el-form-item>
       </el-form>
       <template #footer>
@@ -96,7 +119,8 @@
 <script setup>
 import { ref, computed, onMounted, reactive, watch } from 'vue';
 import { ElMessage, ElMessageBox } from 'element-plus';
-import { getSparePartsList, addSparePart, editSparePart, delSparePart,getSparePartsTree } from "@/api/equipmentManagement/spareParts";
+import { getSparePartsList, addSparePart, editSparePart, delSparePart } from "@/api/equipmentManagement/spareParts";
+import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
 
 // 鍔犺浇鐘舵��
 const loading = ref(false);
@@ -111,8 +135,14 @@
 // const renderTableData = computed(() => buildTree(categories.value));
 const renderTableData = ref([]);
 const operationType = ref('add')
+// 璁惧閫夐」
+const deviceOptions = ref([]);
 // 琛ㄥ崟寮曠敤
 const formRef = ref(null);
+// 鏌ヨ鍙傛暟
+const queryParams = reactive({
+  name: ''
+});
 // 琛ㄥ崟鏁版嵁
 const form = reactive({
   id:'',
@@ -120,19 +150,34 @@
   sparePartsNo: '',
   status: '',
   description: '',
-  parentId: null
+  deviceLedgerIds: [],
+  price: null
 });
 
 // 琛ㄥ崟楠岃瘉瑙勫垯
 const rules = reactive({
   name: [
-    { required: true, message: '璇疯緭鍏ュ垎绫诲悕绉�', trigger: 'blur' }
+    { required: true, message: '璇疯緭鍏ュ浠跺悕绉�', trigger: 'blur' }
   ],
   sparePartsNo: [
-    { required: true, message: '璇疯緭鍏ュ垎绫荤紪鍙�', trigger: 'blur' }
+    { required: true, message: '璇疯緭鍏ュ浠剁紪鍙�', trigger: 'blur' }
   ],
   status: [
     { required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }
+  ],
+  deviceLedgerIds: [
+    { 
+      required: true, 
+      message: '璇烽�夋嫨璁惧', 
+      trigger: 'change',
+      validator: (rule, value, callback) => {
+        if (operationType.value === 'add' && (!value || value.length === 0)) {
+          callback(new Error('璇烽�夋嫨璁惧'));
+        } else {
+          callback();
+        }
+      }
+    }
   ]
 });
 // 鑾峰彇缂╄繘閲�
@@ -159,54 +204,80 @@
   });
   return result;
 };
-//鑾峰彇鏍戝舰缁撴瀯
-const fetchTreeData = async () => {
-  fetchCategories();
+// 鑾峰彇鍒楄〃鏁版嵁
+const fetchListData = async () => {
+  loading.value = true;
   try {
-    const res = await getSparePartsTree();
-    if (res.code === 200) {
-      renderTableData.value = res.data;
-    } else {
-      ElMessage.error(res.message || '鑾峰彇鍒嗙被鍒楄〃澶辫触');
+    const params = {};
+    if (queryParams.name) {
+      params.name = queryParams.name;
     }
-  }catch (error) {
-    ElMessage.error('鑾峰彇鍒嗙被鍒楄〃澶辫触');
+    const res = await getSparePartsList(params);
+    if (res.code === 200) {
+      renderTableData.value = res.data.records || [];
+      categories.value = res.data.records || [];
+    }
+  } catch (error) {
+		loading.value = false;
+  } finally {
+    loading.value = false;
   }
 }
 
-// 鑾峰彇鍒嗙被鍒楄〃
-const fetchCategories = async () => {
-  loading.value = true;
+// 鏌ヨ
+const handleQuery = () => {
+  fetchListData();
+}
+
+// 閲嶇疆鏌ヨ
+const resetQuery = () => {
+  queryParams.name = '';
+  fetchListData();
+}
+
+// 鍔犺浇璁惧鍒楄〃锛堝湪鎵撳紑寮规鏃惰皟鐢級
+const loadDeviceName = async () => {
   try {
-    const res = await getSparePartsList();
-    if (res.code === 200) {
-      categories.value = res.data.records;
-    } else {
-      ElMessage.error(res.message || '鑾峰彇鍒嗙被鍒楄〃澶辫触');
-    }
+    const { data } = await getDeviceLedger();
+    deviceOptions.value = data || [];
   } catch (error) {
-    ElMessage.error('鑾峰彇鍒嗙被鍒楄〃澶辫触');
-  } finally {
-    loading.value = false;
+    ElMessage.error('鑾峰彇璁惧鍒楄〃澶辫触');
   }
 };
 
 // 鏂板鍒嗙被
-const addCategory = () => {
+const addCategory = async () => {
+  await loadDeviceName();
   form.id = '';
   form.name = '';
   form.sparePartsNo = '';
   form.status = '';
   form.description = '';
-  form.parentId = null;
+  form.deviceLedgerIds = [];
+  form.price = null;
   operationType.value = 'add'
   dialogVisible.value = true;
-  console.log('dialogVisible 鏇存柊涓�', dialogVisible.value);
 };
 
 // 缂栬緫鍒嗙被
-const editCategory = (row) => {
+const editCategory = async (row) => {
+  await loadDeviceName();
   Object.assign(form, row);
+  // 濡傛灉鍚庣杩斿洖鐨勬槸 deviceIds 瀛楃涓诧紝闇�瑕佽浆鎹负鏁扮粍
+  if (row.deviceIds && typeof row.deviceIds === 'string') {
+    // 纭繚ID绫诲瀷涓庤澶囬�夐」涓殑ID绫诲瀷涓�鑷�
+    const deviceIdsArray = row.deviceIds.split(',').map(id => id.trim()).filter(id => id);
+    // 濡傛灉璁惧閫夐」涓殑ID鏄暟瀛楃被鍨嬶紝鍒欒浆鎹负鏁板瓧
+    if (deviceOptions.value.length > 0 && typeof deviceOptions.value[0].id === 'number') {
+      form.deviceLedgerIds = deviceIdsArray.map(id => Number(id)).filter(id => !isNaN(id));
+    } else {
+      form.deviceLedgerIds = deviceIdsArray;
+    }
+  } else if (row.deviceIds && Array.isArray(row.deviceIds)) {
+    form.deviceLedgerIds = row.deviceIds;
+  } else {
+    form.deviceLedgerIds = [];
+  }
   operationType.value = 'edit'
   dialogVisible.value = true;
 };
@@ -223,7 +294,7 @@
     const res = await delSparePart(id);
     if (res.code === 200) {
       ElMessage.success('鍒犻櫎鎴愬姛');
-      fetchTreeData();
+      fetchListData();
     } else {
       ElMessage.error(res.message || '鍒犻櫎澶辫触');
     }
@@ -242,19 +313,31 @@
   try {
     await formRef.value.validate();
     formLoading.value = true;
+    
+    // 鏋勫缓鎻愪氦鏁版嵁
+    const submitData = {
+      ...form,
+      deviceIds: form.deviceLedgerIds && form.deviceLedgerIds.length > 0 
+        ? form.deviceLedgerIds.join(',') 
+        : ''
+    };
+    
+    // 鍒犻櫎涓嶉渶瑕佺殑瀛楁
+    delete submitData.deviceLedgerIds;
+    
     if (operationType.value === 'edit') {
-      let res = await editSparePart(form);
+      let res = await editSparePart(submitData);
       if (res.code === 200) {
-      ElMessage.success('缂栬緫鎴愬姛');
-      dialogVisible.value = false;
-      fetchTreeData();
-    }
-    } else {
-      let res = await addSparePart(form);
-        if (res.code === 200) {
         ElMessage.success('缂栬緫鎴愬姛');
         dialogVisible.value = false;
-        fetchTreeData();
+        fetchListData();
+      }
+    } else {
+      let res = await addSparePart(submitData);
+      if (res.code === 200) {
+        ElMessage.success('鏂板鎴愬姛');
+        dialogVisible.value = false;
+        fetchListData();
       }
     }
   } catch (error) {
@@ -264,10 +347,9 @@
   }
 };
 
-// 缁勪欢鎸傝浇鏃惰幏鍙栧垎绫诲垪琛�
+// 缁勪欢鎸傝浇鏃惰幏鍙栧垪琛ㄦ暟鎹�
 onMounted(() => {
-  fetchCategories();
-  fetchTreeData();
+  fetchListData();
 });
 </script>
 
@@ -275,43 +357,13 @@
 .spare-part-category {
   padding: 20px;
 }
+.search_form {
+	display: flex;
+	align-items: flex-start;
+	justify-content: space-between;
+}
 .table_list {
   margin-top: unset;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-  align-items: center;
-}
-
-/* 宓屽鏍戝舰缁撴瀯鏍峰紡 */
-.nested-tree-node {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-  width: 100%;
-  padding: 0 4px;
-  height: 30px;
-  line-height: 30px;
-}
-
-.category-code {
-  color: #606266;
-  font-size: 12px;
-  margin-left: 8px;
-}
-
-.tree-actions {
-  display: flex;
-  align-items: center;
-  gap: 8px;
-  margin-left: auto;
-}
-
-/* 琛ㄦ牸鏍峰紡璋冩暣 */
-.el-table {
-  font-size: 14px;
 }
 
 .el-table__header-wrapper th {
@@ -321,22 +373,6 @@
 
 .el-table__row:hover > td {
   background-color: #fafafa;
-}
-
-/* 宓屽鏍戝舰缁撴瀯鐗瑰畾鏍峰紡 */
-.nested-tree {
-  background-color: transparent;
-}
-
-.nested-tree .el-tree-node__content {
-  height: auto;
-  background-color: transparent;
-}
-
-/* 鎼滅储妗嗘牱寮忚皟鏁� */
-.actions .el-input {
-  margin-right: 10px;
-  width: 200px;
 }
 
 /* 鎸夐挳缁勬牱寮� */
@@ -354,64 +390,5 @@
 .nested-tree .el-tree-node__expand-icon {
   font-size: 12px;
   margin-right: 4px;
-}
-
-/* 绌虹姸鎬佹牱寮� */
-.el-table .cell:empty::before {
-  content: '-';
-  color: #c0c4cc;
-}
-
-/* 灞曞紑/鎶樺彔鍔熻兘鏍峰紡 */
-.expand-icon {
-  display: inline-block;
-  width: 20px;
-  height: 20px;
-  text-align: center;
-  line-height: 20px;
-  cursor: pointer;
-  font-size: 12px;
-  color: #909399;
-}
-
-.expand-icon.expanded {
-  color: #409eff;
-}
-
-/* 灞曞紑鍐呭鏍峰紡 */
-.expand-content {
-  padding: 10px 20px;
-}
-
-/* 瀛愮骇鍐呭鏍峰紡 */
-.child-content {
-  padding-left: 40px;
-}
-
-/* 鏃犲瓙鍒嗙被鎻愮ず鏍峰紡 */
-.no-children {
-  padding: 10px 20px;
-  color: #909399;
-  font-size: 14px;
-}
-
-/* 纭繚灞曞紑鐨勮〃鏍兼牱寮忔纭� */
-.el-table .el-table__expanded-cell {
-  background-color: #fafafa;
-}
-
-/* 灞曞紑鐨勫瓙琛ㄦ牸鏍峰紡 */
-.el-table .el-table {
-  border-top: none;
-  border-bottom: none;
-}
-
-/* 灞曞紑鐨勫瓙琛ㄦ牸鍗曞厓鏍兼牱寮� */
-.expand-content .el-table__body-wrapper .el-table__row {
-  background-color: #ffffff;
-}
-
-.expand-content .el-table__body-wrapper .el-table__row:hover > td {
-  background-color: #fafafa;
 }
 </style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue b/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue
index bc3db70..3aa0867 100644
--- a/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue
+++ b/src/views/equipmentManagement/upkeep/Form/MaintenanceForm.vue
@@ -17,11 +17,22 @@
         style="width: 100%"
       />
     </el-form-item>
+    <el-form-item label="淇濆吇鐘舵��">
+      <el-select v-model="form.status">
+        <el-option label="寰呬繚鍏�" :value="0"></el-option>
+        <el-option label="瀹岀粨" :value="1"></el-option>
+        <el-option label="澶辫触" :value="2"></el-option>
+      </el-select>
+    </el-form-item>
     <el-form-item label="淇濆吇缁撴灉">
-      <el-select v-model="form.maintenanceResult" placeholder="璇烽�夋嫨淇濆吇缁撴灉">
+      <!-- <el-select v-model="form.maintenanceResult" placeholder="璇烽�夋嫨淇濆吇缁撴灉">
         <el-option label="瀹屽ソ" :value="1"></el-option>
         <el-option label="缁翠慨" :value="0"></el-option>
-      </el-select>
+      </el-select> -->
+      <el-input
+        v-model="form.maintenanceResult"
+        placeholder="璇疯緭鍏ヤ繚鍏荤粨鏋�"
+        type="text" />
     </el-form-item>
   </el-form>
 </template>
@@ -40,6 +51,7 @@
   maintenanceActuallyName: undefined, // 瀹為檯淇濆吇浜�
   maintenanceActuallyTime: undefined, // 瀹為檯淇濆吇鏃ユ湡
   maintenanceResult: undefined, // 淇濆吇缁撴灉
+  status: 0, // 淇濆吇鐘舵��
 });
 
 const setForm = (data) => {
diff --git a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue b/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
index 1d94b68..2822e2c 100644
--- a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
+++ b/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
@@ -5,6 +5,9 @@
         v-model="form.deviceLedgerId"
         @change="setDeviceModel"
         placeholder="璇烽�夋嫨璁惧"
+        filterable
+        default-first-option
+        :reserve-keyword="false"
       >
         <el-option
           v-for="(item, index) in deviceOptions"
@@ -20,6 +23,30 @@
         placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
         disabled
       />
+    </el-form-item>
+    <el-form-item label="褰曞叆浜�">
+      <el-select
+        v-model="form.createUser"
+        placeholder="璇烽�夋嫨"
+        filterable
+        default-first-option
+        :reserve-keyword="false"
+        clearable
+      >
+        <el-option
+          v-for="item in userList"
+          :key="item.userId"
+          :label="item.nickName"
+          :value="item.userId"
+        />
+      </el-select>
+    </el-form-item>
+    <el-form-item v-if="id" label="淇濅慨鐘舵��">
+      <el-select v-model="form.status">
+        <el-option label="寰呬繚淇�" :value="0"></el-option>
+        <el-option label="瀹岀粨" :value="1"></el-option>
+        <el-option label="澶辫触" :value="2"></el-option>
+      </el-select>
     </el-form-item>
     <el-form-item label="璁″垝淇濆吇鏃ユ湡">
       <el-date-picker
@@ -40,6 +67,7 @@
 import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
 import { onMounted } from "vue";
 import dayjs from "dayjs";
+import { userListNoPage } from "@/api/system/user.js";
 
 defineOptions({
   name: "璁″垝琛ㄥ崟",
@@ -51,11 +79,15 @@
   deviceOptions.value = data;
 };
 
+const { id } = defineProps(['id']);
+
 const { form, resetForm } = useFormData({
   deviceLedgerId: undefined, // 璁惧Id
   deviceName: undefined, // 璁惧鍚嶇О
   deviceModel: undefined, // 瑙勬牸鍨嬪彿
   maintenancePlanTime: undefined, // 璁″垝淇濆吇鏃ユ湡
+  createUser: undefined, // 褰曞叆浜�
+  status: 0, //淇濅慨鐘舵��
 });
 
 const setDeviceModel = (id) => {
@@ -75,15 +107,23 @@
   form.deviceLedgerId = data.deviceLedgerId;
   form.deviceName = data.deviceName;
   form.deviceModel = data.deviceModel;
+  form.createUser = Number(data.createUser);
+  form.status = data.status;
   form.maintenancePlanTime = dayjs(data.maintenancePlanTime).format(
     "YYYY-MM-DD HH:mm:ss"
   );
 };
 
+// 鐢ㄦ埛鍒楄〃
+const userList = ref([]);
+
 const loadForm = () => {};
 
 onMounted(() => {
   loadDeviceName();
+  userListNoPage().then((res) => {
+    userList.value = res.data;
+  });
 });
 
 defineExpose({
diff --git a/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue b/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue
index 0afd512..0b44221 100644
--- a/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue
+++ b/src/views/equipmentManagement/upkeep/Modal/MaintenanceModal.vue
@@ -1,5 +1,5 @@
 <template>
-  <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr">
+  <el-dialog v-model="visible" :title="modalOptions.title" direction="ltr" draggable>
     <MaintenanceForm ref="maintenanceFormRef" />
     <template #footer>
 			<el-button type="primary" @click="sendForm" :loading="loading">
diff --git a/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue b/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue
index d9cf246..249c9c3 100644
--- a/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue
+++ b/src/views/equipmentManagement/upkeep/Modal/PlanModal.vue
@@ -3,9 +3,10 @@
     v-model="visible"
     :title="modalOptions.title"
     width="30%"
+		draggable
     @close="close"
   >
-    <PlanForm ref="planFormRef"></PlanForm>
+    <PlanForm ref="planFormRef" :id="id"></PlanForm>
     <template #footer>
 			<el-button type="primary" @click="sendForm" :loading="loading">
 				{{ modalOptions.confirmText }}
diff --git a/src/views/equipmentManagement/upkeep/Modal/formDia.vue b/src/views/equipmentManagement/upkeep/Modal/formDia.vue
new file mode 100644
index 0000000..a484d23
--- /dev/null
+++ b/src/views/equipmentManagement/upkeep/Modal/formDia.vue
@@ -0,0 +1,304 @@
+<template>
+	<div>
+		<el-dialog :title="operationType === 'add' ? '鏂板淇濆吇浠诲姟' : '缂栬緫淇濆吇浠诲姟'"
+							 v-model="dialogVisitable" width="800px" @close="cancel">
+			<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="璁惧鍚嶇О" prop="taskId">
+							<el-select v-model="form.taskId" @change="setDeviceModel" filterable>
+								<el-option
+									v-for="(item, index) in deviceOptions"
+									:key="index"
+									:label="item.deviceName"
+									:value="item.id"
+								></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="瑙勬牸鍨嬪彿">
+							<el-input
+								v-model="form.deviceModel"
+								placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
+								disabled
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="褰曞叆浜�" prop="inspector">
+							<el-select
+								v-model="form.inspector"
+								filterable
+								default-first-option
+								:reserve-keyword="false"
+								placeholder="璇烽�夋嫨"
+								clearable
+							>
+								<el-option
+									v-for="item in userList"
+									:label="item.nickName"
+									:value="item.userId"
+									:key="item.userId"
+								/>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12">
+						<el-form-item label="鐧昏鏃堕棿" prop="registrationDate">
+							<el-date-picker
+								v-model="form.registrationDate"
+								type="date"
+								placeholder="閫夋嫨鐧昏鏃ユ湡"
+								format="YYYY-MM-DD"
+								value-format="YYYY-MM-DD"
+								style="width: 100%"
+							/>
+						</el-form-item>
+					</el-col>
+				</el-row>
+				<el-row>
+					<el-col :span="12">
+						<el-form-item label="浠诲姟棰戠巼" prop="frequencyType">
+							<el-select v-model="form.frequencyType" placeholder="璇烽�夋嫨" clearable>
+								<el-option label="姣忔棩" value="DAILY"/>
+								<el-option label="姣忓懆" value="WEEKLY"/>
+								<el-option label="姣忔湀" value="MONTHLY"/>
+								<el-option label="瀛e害" value="QUARTERLY"/>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'DAILY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-time-picker v-model="form.frequencyDetail" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
+															value-format="HH:mm" />
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
+								<el-option label="鍛ㄤ竴" value="MON"/>
+								<el-option label="鍛ㄤ簩" value="TUE"/>
+								<el-option label="鍛ㄤ笁" value="WED"/>
+								<el-option label="鍛ㄥ洓" value="THU"/>
+								<el-option label="鍛ㄤ簲" value="FRI"/>
+								<el-option label="鍛ㄥ叚" value="SAT"/>
+								<el-option label="鍛ㄦ棩" value="SUN"/>
+							</el-select>
+							<el-time-picker v-model="form.time" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
+															value-format="HH:mm"  style="width: 50%"/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-date-picker
+								v-model="form.frequencyDetail"
+								type="datetime"
+								clearable
+								placeholder="閫夋嫨寮�濮嬫棩鏈�"
+								format="DD,HH:mm"
+								value-format="DD,HH:mm"
+							/>
+						</el-form-item>
+					</el-col>
+					<el-col :span="12" v-if="form.frequencyType === 'QUARTERLY' && form.frequencyType">
+						<el-form-item label="鏃ユ湡" prop="frequencyDetail">
+							<el-date-picker
+								v-model="form.frequencyDetail"
+								type="datetime"
+								clearable
+								placeholder="閫夋嫨寮�濮嬫棩鏈�"
+								format="MM,DD,HH:mm"
+								value-format="MM,DD,HH:mm"
+							/>
+						</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>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<div class="dialog-footer">
+					<el-button type="primary" @click="submitForm">淇濆瓨</el-button>
+					<el-button @click="cancel">鍙栨秷</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script setup>
+import { reactive, ref, getCurrentInstance, toRefs } from "vue";
+import {userListNoPageByTenantId} from "@/api/system/user.js";
+import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+import { deviceMaintenanceTaskAdd, deviceMaintenanceTaskEdit } from "@/api/equipmentManagement/upkeep";
+import { getCurrentDate } from "@/utils/index.js";
+import useUserStore from "@/store/modules/user.js";
+
+const { proxy } = getCurrentInstance()
+const emit = defineEmits()
+const dialogVisitable = ref(false);
+const operationType = ref('add');
+const deviceOptions = ref([]);
+const userStore = useUserStore();
+const data = reactive({
+	form: {
+		taskId: undefined,
+		taskName: undefined,
+		// 褰曞叆浜猴細鍗曢�変竴涓敤鎴� id
+		inspector: undefined,
+		remarks: '',
+		frequencyType: '',
+		frequencyDetail: '',
+		week: '',
+		time: '',
+		deviceModel: undefined, // 瑙勬牸鍨嬪彿
+		registrationDate: ''
+	},
+	rules: {
+		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
+		inspector: [{ required: true, message: "璇烽�夋嫨褰曞叆浜�", trigger: "blur" },],
+		registrationDate: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }]
+	}
+})
+const { form, rules } = toRefs(data)
+const userList = ref([])
+
+const loadDeviceName = async () => {
+	const { data } = await getDeviceLedger();
+	deviceOptions.value = data;
+};
+
+// 閫夋嫨璁惧鏃讹紝鍥炲~璁惧鍚嶇О(taskName)鍜岃鏍煎瀷鍙�(deviceModel)
+const setDeviceModel = (id) => {
+	const option = deviceOptions.value.find((item) => item.id === id);
+	if (option) {
+		form.value.taskId = option.id;
+		form.value.taskName = option.deviceName;
+		form.value.deviceModel = option.deviceModel;
+	}
+}
+
+// 鎵撳紑寮规
+const openDialog = async (type, row) => {
+	dialogVisitable.value = true
+	operationType.value = type
+	
+	// 閲嶇疆琛ㄥ崟
+	resetForm();
+	
+	// 鍔犺浇鐢ㄦ埛鍒楄〃
+	userListNoPageByTenantId().then((res) => {
+		userList.value = res.data;
+	});
+	
+	// 鍔犺浇璁惧鍒楄〃
+	await loadDeviceName();
+	
+	if (type === 'edit' && row) {
+		form.value = { ...row }
+		// 缂栬緫鏃剁敤鎺ュ彛杩斿洖鐨� registrantId 鍥炴樉褰曞叆浜�
+		if (row.registrantId) {
+			form.value.inspector = row.registrantId
+		}
+
+		// 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
+		if (form.value.taskId) {
+			setDeviceModel(form.value.taskId);
+		}
+	} else if (type === 'add') {
+		// 鏂板鏃惰缃櫥璁版棩鏈熶负褰撳ぉ
+		form.value.registrationDate = getCurrentDate();
+		// 鏂板鏃惰缃綍鍏ヤ汉涓哄綋鍓嶇櫥褰曡处鎴�
+		form.value.inspector = userStore.id;
+	}
+}
+
+// 鍏抽棴瀵硅瘽妗�
+const cancel = () => {
+	resetForm()
+	dialogVisitable.value = false
+	emit('closeDia')
+}
+
+// 閲嶇疆琛ㄥ崟鍑芥暟
+const resetForm = () => {
+	if (proxy.$refs.formRef) {
+		proxy.$refs.formRef.resetFields()
+	}
+	// 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
+	form.value = {
+		taskId: undefined,
+		taskName: undefined,
+		inspector: undefined,
+		inspector: undefined,
+		remarks: '',
+		frequencyType: '',
+		frequencyDetail: '',
+		week: '',
+		time: '',
+		deviceModel: undefined,
+		registrationDate: ''
+	}
+}
+
+// 鎻愪氦琛ㄥ崟
+const submitForm = () => {
+	proxy.$refs["formRef"].validate(async valid => {
+		if (valid) {
+			try {
+				const payload = { ...form.value }
+				// 涓嶅啀鍚戝悗绔紶淇濆吇浜哄瓧娈碉紝浠呬娇鐢ㄦ帴鍙h姹傜殑 registrant / registrantId
+				// 鏍规嵁閫夋嫨鐨勨�滃綍鍏ヤ汉鈥濊缃� registrant / registrantId
+				if (payload.inspector) {
+					const selectedUser = userList.value.find(
+						(u) => String(u.userId) === String(payload.inspector)
+					)
+					if (selectedUser) {
+						payload.registrantId = selectedUser.userId
+						payload.registrant = selectedUser.nickName
+					}
+				}
+				delete payload.inspector
+				delete payload.inspectorIds
+				
+				if (payload.frequencyType === 'WEEKLY') {
+					let frequencyDetail = ''
+					frequencyDetail = payload.week + ',' + payload.time
+					payload.frequencyDetail = frequencyDetail
+				}
+				
+				// 褰曞叆鏃ユ湡锛氱洿鎺ヤ娇鐢ㄨ〃鍗曢噷鐨� registrationDate 瀛楁
+				// 涓�浜涢粯璁ょ姸鎬佸瓧娈�
+				if (payload.status === undefined || payload.status === null || payload.status === '') {
+					payload.status = '0' // 榛樿鐘舵�侊紝鍙寜瀹為檯鏋氫妇璋冩暣
+				}
+				payload.active = true
+				payload.deleted = 0
+				
+				if (operationType.value === 'edit') {
+					await deviceMaintenanceTaskEdit(payload)
+				} else {
+					await deviceMaintenanceTaskAdd(payload)
+				}
+				cancel()
+				proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
+			} catch (error) {
+				proxy.$modal.msgError('鎻愪氦澶辫触锛岃閲嶈瘯')
+			}
+		}
+	})
+}
+defineExpose({ openDialog })
+</script>
+
+<style scoped>
+
+</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index 5612bb6..9b13b47 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -1,78 +1,165 @@
 <template>
   <div class="app-container">
-    <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"
-        />
-      </el-form-item>
-      <el-form-item label="璁″垝淇濆吇鏃ユ湡">
-        <el-date-picker
-            v-model="filters.maintenancePlanTime"
-            type="date"
-            placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡"
-            size="default"
-            @change="(date) => handleDateChange(date,2)"
-        />
-      </el-form-item>
-      <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
-        <el-date-picker
-            v-model="filters.maintenanceActuallyTime"
-            type="date"
-            placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
-            size="default"
-            @change="(date) => handleDateChange(date,1)"
-        />
-      </el-form-item>
-      <el-form-item label="瀹為檯淇濆吇浜�">
-        <el-input
-            v-model="filters.maintenanceActuallyName"
-            style="width: 240px"
-            placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
-            clearable
-            :prefix-icon="Search"
-            @change="getTableData"
-        />
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="getTableData">鎼滅储</el-button>
-        <el-button @click="resetFilters">閲嶇疆</el-button>
-      </el-form-item>
-    </el-form>
-    <div class="table_list">
-      <div class="actions">
-        <el-text class="mx-1" size="large">璁惧淇濆吇</el-text>
-        <div>
-          <el-button
-            type="primary"
-            icon="Plus"
-            :disabled="multipleList.length !== 1"
-            @click="addMaintain"
-          >
-            鏂板淇濆吇
-          </el-button>
-          <el-button type="success" icon="Van" @click="addPlan">
-            鏂板璁″垝
-          </el-button>
-          <el-button @click="handleOut">
-            瀵煎嚭
-          </el-button>
-          <el-button
-            type="danger"
-            icon="Delete"
-            :disabled="multipleList.length <= 0"
-            @click="delRepairByIds(multipleList.map((item) => item.id))"
-          >
-            鎵归噺鍒犻櫎
-          </el-button>
+    <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+      <!-- 瀹氭椂浠诲姟绠$悊tab -->
+      <el-tab-pane label="瀹氭椂浠诲姟绠$悊" name="scheduled">
+        <div class="search_form">
+          <el-form :model="scheduledFilters" :inline="true">
+            <el-form-item label="浠诲姟鍚嶇О">
+              <el-input
+                  v-model="scheduledFilters.taskName"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
+                  clearable
+                  :prefix-icon="Search"
+                  @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-select>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="getScheduledTableData">鎼滅储</el-button>
+              <el-button @click="resetScheduledFilters">閲嶇疆</el-button>
+            </el-form-item>
+          </el-form>
         </div>
-      </div>
-      <PIMTable
+        <div class="table_list">
+          <div class="actions">
+            <el-text class="mx-1" size="large">瀹氭椂浠诲姟绠$悊</el-text>
+            <div>
+              <el-button type="primary" icon="Plus" @click="addScheduledTask">
+                鏂板浠诲姟
+              </el-button>
+              <el-button
+                type="danger"
+                icon="Delete"
+                :disabled="scheduledMultipleList.length <= 0"
+                @click="delScheduledTaskByIds(scheduledMultipleList.map((item) => item.id))"
+              >
+                鎵归噺鍒犻櫎
+              </el-button>
+            </div>
+          </div>
+          <PIMTable
+            rowKey="id"
+            isSelection
+            :column="scheduledColumns"
+            :tableData="scheduledDataList"
+            :page="{
+              current: scheduledPagination.currentPage,
+              size: scheduledPagination.pageSize,
+              total: scheduledPagination.total,
+            }"
+            @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>
+            <template #operation="{ row }">
+              <el-button
+                type="primary"
+                text
+                icon="editPen"
+                @click="editScheduledTask(row)"
+              >
+                缂栬緫
+              </el-button>
+              <el-button
+                type="danger"
+                text
+                icon="delete"
+                @click="delScheduledTaskByIds(row.id)"
+              >
+                鍒犻櫎
+              </el-button>
+            </template>
+          </PIMTable>
+        </div>
+      </el-tab-pane>
+
+      <!-- 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛� -->
+      <el-tab-pane label="浠诲姟璁板綍" name="record">
+        <div class="search_form">
+          <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"
+              />
+            </el-form-item>
+            <el-form-item label="璁″垝淇濆吇鏃ユ湡">
+              <el-date-picker
+                  v-model="filters.maintenancePlanTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡"
+                  size="default"
+                  @change="(date) => handleDateChange(date,2)"
+              />
+            </el-form-item>
+            <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
+              <el-date-picker
+                  v-model="filters.maintenanceActuallyTime"
+                  type="date"
+                  placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
+                  size="default"
+                  @change="(date) => handleDateChange(date,1)"
+              />
+            </el-form-item>
+            <el-form-item label="瀹為檯淇濆吇浜�">
+              <el-input
+                  v-model="filters.maintenanceActuallyName"
+                  style="width: 240px"
+                  placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
+                  clearable
+                  :prefix-icon="Search"
+                  @change="getTableData"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+              <el-button @click="resetFilters">閲嶇疆</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="table_list">
+          <div class="actions">
+            <el-text class="mx-1" size="large">浠诲姟璁板綍</el-text>
+            <div>
+              <el-button
+                type="primary"
+                icon="Plus"
+                :disabled="multipleList.length !== 1"
+                @click="addMaintain"
+              >
+                鏂板淇濆吇
+              </el-button>
+              <el-button type="success" icon="Van" @click="addPlan">
+                鏂板璁″垝
+              </el-button>
+              <el-button @click="handleOut">
+                瀵煎嚭
+              </el-button>
+              <el-button
+                type="danger"
+                icon="Delete"
+                :disabled="multipleList.length <= 0"
+                @click="delRepairByIds(multipleList.map((item) => item.id))"
+              >
+                鎵归噺鍒犻櫎
+              </el-button>
+            </div>
+          </div>
+         <PIMTable
         rowKey="id"
         isSelection
         :column="columns"
@@ -86,16 +173,12 @@
         @pagination="changePage"
       >
         <template #maintenanceResultRef="{ row }">
-          <el-tag v-if="row.maintenanceResult === 1" type="success">
-            瀹屽ソ
-          </el-tag>
-          <el-tag v-if="row.maintenanceResult === 0" type="danger">
-            缁翠慨
-          </el-tag>
+          <div>{{ row.maintenanceResult || '-' }}</div>
         </template>
         <template #statusRef="{ row }">
+          <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
           <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
-          <el-tag v-if="row.status === 0" type="danger">寰呬繚鍏�</el-tag>
+          <el-tag v-if="row.status === 0" type="warning">寰呬繚鍏�</el-tag>
         </template>
         <template #operation="{ row }">
           <el-button
@@ -116,189 +199,369 @@
           </el-button>
         </template>
       </PIMTable>
-    </div>
+        </div>
+      </el-tab-pane>
+    </el-tabs>
     <PlanModal ref="planModalRef" @ok="getTableData" />
-    <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
+        <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
+        <FormDia ref="formDiaRef" @closeDia="getScheduledTableData" />
   </div>
 </template>
 
 <script setup>
-import { usePaginationApi } from "@/hooks/usePaginationApi";
-import { getUpkeepPage, delUpkeep } from "@/api/equipmentManagement/upkeep";
-import { onMounted, getCurrentInstance } from "vue";
-import PlanModal from "./Modal/PlanModal.vue";
-import MaintenanceModal from "./Modal/MaintenanceModal.vue";
-import dayjs from "dayjs";
-import { ElMessageBox, ElMessage } from "element-plus";
+import { ref, onMounted, reactive, getCurrentInstance, nextTick } from 'vue'
+import { Search } from '@element-plus/icons-vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import PlanModal from './Modal/PlanModal.vue'
+import MaintenanceModal from './Modal/MaintenanceModal.vue'
+import FormDia from './Modal/formDia.vue'
+import {
+  getUpkeepPage,
+  delUpkeep,
+  deviceMaintenanceTaskList,
+  deviceMaintenanceTaskDel,
+} from '@/api/equipmentManagement/upkeep'
+import dayjs from 'dayjs'
 
-defineOptions({
-  name: "璁惧淇濆吇",
-});
+const { proxy } = getCurrentInstance()
 
-const { proxy } = getCurrentInstance();
+// Tab鐩稿叧
+const activeTab = ref('scheduled')
 
 // 璁″垝寮圭獥鎺у埗鍣�
-const planModalRef = ref();
+const planModalRef = ref()
 // 淇濆吇寮圭獥鎺у埗鍣�
-const maintainModalRef = ref();
+const maintainModalRef = ref()
+// 瀹氭椂浠诲姟寮圭獥鎺у埗鍣�
+const formDiaRef = ref()
 
-// 琛ㄦ牸澶氶�夋閫変腑椤�
-const multipleList = ref([]);
+// 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛夌浉鍏冲彉閲�
+const filters = reactive({
+  deviceName: '',
+  maintenancePlanTime: '',
+  maintenanceActuallyTime: '',
+  maintenanceActuallyName: '',
+})
 
-// 澶氶�夊悗鍋氫粈涔�
-const handleSelectionChange = (selectionList) => {
-  multipleList.value = selectionList;
-};
+const dataList = ref([])
+const pagination = ref({
+  currentPage: 1,
+  pageSize: 10,
+  total: 0,
+})
+const multipleList = ref([])
 
-// 琛ㄦ牸閽╁瓙
-const {
-  filters,
-  columns,
-  dataList,
-  pagination,
-  getTableData,
-  resetFilters,
-  onCurrentChange,
-} = usePaginationApi(getUpkeepPage, {
-  deviceName: undefined,
-  maintenancePlanTime: undefined,
-  maintenanceActuallyTime: undefined,
-  maintenanceActuallyName: undefined,
-}, [
-  {
-    label: "璁惧鍚嶇О",
-    align: "center",
-    prop: "deviceName",
-  },
-  {
-    label: "瑙勬牸鍨嬪彿",
-    align: "center",
-    prop: "deviceModel",
-  },
-  {
-    label: "璁″垝淇濆吇鏃ユ湡",
-    align: "center",
-    prop: "maintenancePlanTime",
-    formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
-  },
-  {
-    label: "褰曞叆浜�",
-    align: "center",
-    prop: "createUserName",
-  },
-  {
-    label: "褰曞叆鏃ユ湡",
-    align: "center",
-    prop: "createTime",
-    formatData: (cell) => dayjs(cell).format("YYYY-MM-DD HH:mm:ss"),
-    width: 200,
-  },
-  {
-    label: "瀹為檯淇濆吇浜�",
-    align: "center",
-    prop: "maintenanceActuallyName",
-  },
-  {
-    label: "瀹為檯淇濆吇鏃ユ湡",
-    align: "center",
-    prop: "maintenanceActuallyTime",
-    formatData: (cell) =>
-      cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
-  },
-  {
-    label: "淇濆吇缁撴灉",
-    align: "center",
-    prop: "maintenanceResult",
-    dataType: "slot",
-    slot: "maintenanceResultRef",
-  },
-  {
-    label: "鐘舵��",
-    align: "center",
-    prop: "status",
-    dataType: "slot",
-    slot: "statusRef",
-  },
-  {
-    fixed: "right",
-    label: "鎿嶄綔",
-    dataType: "slot",
-    slot: "operation",
-    align: "center",
-    width: "200px",
-  },
-]);
-// type == 1瀹為檯淇濆吇鏃堕棿 2璁″垝淇濆吇鏃堕棿
-const handleDateChange = (value,type) => {
-  filters.maintenanceActuallyTimeReq = null
-  filters.maintenancePlanTimeReq = null
-  if(type === 1){
-    if (value) {
-      filters.maintenanceActuallyTimeReq = dayjs(value).format("YYYY-MM-DD");
-    }
-  }else{
-    if (value) {
-      filters.maintenancePlanTimeReq = dayjs(value).format("YYYY-MM-DD");
-    }
+// 瀹氭椂浠诲姟绠$悊tab鐩稿叧鍙橀噺
+const scheduledFilters = reactive({
+  taskName: '',
+  status: '',
+})
+
+const scheduledDataList = ref([])
+const scheduledPagination = reactive({
+  currentPage: 1,
+  pageSize: 10,
+  total: 0,
+})
+const scheduledMultipleList = ref([])
+
+// 瀹氭椂浠诲姟绠$悊琛ㄦ牸鍒楅厤缃�
+const scheduledColumns = ref([
+	{ prop: "taskName", label: "璁惧鍚嶇О"},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		prop: "deviceModel",
+	},
+	{
+		prop: "frequencyType",
+		label: "棰戞",
+		minWidth: 150,
+		// PIMTable 浣跨敤鐨勬槸 formatData锛岃�屼笉鏄� Element-Plus 鐨� formatter
+		formatData: (cell) => ({
+			DAILY: "姣忔棩",
+			WEEKLY: "姣忓懆",
+			MONTHLY: "姣忔湀",
+			QUARTERLY: "瀛e害"
+		}[cell] || "")
+	},
+	{
+		prop: "frequencyDetail",
+		label: "寮�濮嬫棩鏈熶笌鏃堕棿",
+		minWidth: 150,
+		// 鍚屾牱鏀圭敤 formatData锛孭IMTable 鍐呴儴浼氭妸鍗曞厓鏍煎�间紶杩涙潵
+		formatData: (cell) => {
+			if (typeof cell !== 'string') return '';
+			let val = cell;
+			const replacements = {
+				MON: '鍛ㄤ竴',
+				TUE: '鍛ㄤ簩',
+				WED: '鍛ㄤ笁',
+				THU: '鍛ㄥ洓',
+				FRI: '鍛ㄤ簲',
+				SAT: '鍛ㄥ叚',
+				SUN: '鍛ㄦ棩'
+			};
+			// 浣跨敤姝e垯涓�娆℃�ф浛鎹㈡墍鏈夊尮閰嶉」
+			return val.replace(/MON|TUE|WED|THU|FRI|SAT|SUN/g, match => replacements[match]);
+		}
+	},
+	{ prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
+	{ prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 },
+	{
+		fixed: "right",
+		label: "鎿嶄綔",
+		dataType: "slot",
+		slot: "operation",
+		align: "center",
+		width: "200px",
+	},
+])
+
+// 浠诲姟璁板綍琛ㄦ牸鍒楅厤缃紙鍘熻澶囦繚鍏昏〃鏍煎垪锛�
+const columns = ref([
+	{
+		label: "璁惧鍚嶇О",
+		align: "center",
+		prop: "deviceName",
+	},
+	{
+		label: "瑙勬牸鍨嬪彿",
+		align: "center",
+		prop: "deviceModel",
+	},
+	{
+		label: "璁″垝淇濆吇鏃ユ湡",
+		align: "center",
+		prop: "maintenancePlanTime",
+		formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
+	},
+	{
+		label: "褰曞叆浜�",
+		align: "center",
+		prop: "createUserName",
+	},
+	// {
+	//   label: "褰曞叆鏃ユ湡",
+	//   align: "center",
+	//   prop: "createTime",
+	//   formatData: (cell) => dayjs(cell).format("YYYY-MM-DD HH:mm:ss"),
+	//   width: 200,
+	// },
+	{
+		label: "瀹為檯淇濆吇浜�",
+		align: "center",
+		prop: "maintenanceActuallyName",
+	},
+	{
+		label: "瀹為檯淇濆吇鏃ユ湡",
+		align: "center",
+		prop: "maintenanceActuallyTime",
+		formatData: (cell) =>
+			cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
+	},
+	{
+		label: "淇濆吇缁撴灉",
+		align: "center",
+		prop: "maintenanceResult",
+		dataType: "slot",
+		slot: "maintenanceResultRef",
+	},
+	{
+		label: "鐘舵��",
+		align: "center",
+		prop: "status",
+		dataType: "slot",
+		slot: "statusRef",
+	},
+	{
+		fixed: "right",
+		label: "鎿嶄綔",
+		dataType: "slot",
+		slot: "operation",
+		align: "center",
+		width: "200px",
+	},
+])
+
+// Tab鍒囨崲澶勭悊
+const handleTabChange = (tabName) => {
+  if (tabName === 'record') {
+    getTableData()
+  } else if (tabName === 'scheduled') {
+    getScheduledTableData()
   }
-  getTableData();
-};
+}
 
-// 鏂板淇濆吇
-const addMaintain = () => {
-  const row = multipleList.value[0];
-  maintainModalRef.value.open(row.id, row);
-};
-
-// 鏂板璁″垝
-const addPlan = () => {
-  planModalRef.value.openModal();
-};
-
-// 缂栬緫璁″垝
-const editPlan = (id) => {
-  planModalRef.value.openEdit(id);
-};
-
-const changePage = ({ page, limit }) => {
-	pagination.currentPage = page;
-	pagination.pageSize = limit;
-	onCurrentChange(page);
-};
-
-// 鍗曡鍒犻櫎
-const delRepairByIds = async (ids) => {
-  ElMessageBox.confirm("纭鍒犻櫎鎶ヤ慨鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
-    confirmButtonText: "纭畾",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
-  }).then(async () => {
-    const { code } = await delUpkeep(ids);
-    if (code === 200) {
-      ElMessage.success("鍒犻櫎鎴愬姛");
-      getTableData();
+// 瀹氭椂浠诲姟绠$悊鐩稿叧鏂规硶
+const getScheduledTableData = async () => {
+  try {
+    const params = {
+      current: scheduledPagination.currentPage,
+      size: scheduledPagination.pageSize,
+      taskName: scheduledFilters.taskName || undefined,
+      status: scheduledFilters.status || undefined,
     }
-  });
-};
+    const { code, data } = await deviceMaintenanceTaskList(params)
+    if (code === 200) {
+      scheduledDataList.value = data?.records || []
+      scheduledPagination.total = data?.total || 0
+    }
+  } catch (error) {
+    ElMessage.error('鑾峰彇瀹氭椂浠诲姟鍒楄〃澶辫触')
+  }
+}
 
-// 瀵煎嚭
+const resetScheduledFilters = () => {
+  scheduledFilters.taskName = ''
+  scheduledFilters.status = ''
+  getScheduledTableData()
+}
+
+const handleScheduledSelectionChange = (selection) => {
+  scheduledMultipleList.value = selection
+}
+
+const changeScheduledPage = (page) => {
+  scheduledPagination.currentPage = page.page
+  scheduledPagination.pageSize = page.limit
+  getScheduledTableData()
+}
+
+const addScheduledTask = () => {
+  nextTick(() => {
+		formDiaRef.value?.openDialog('add');
+	});
+}
+
+const editScheduledTask = (row) => {
+  if (row) {
+		nextTick(() => {
+			formDiaRef.value?.openDialog('edit', row);
+		});
+  }
+}
+
+const delScheduledTaskByIds = async (ids) => {
+  try {
+    await ElMessageBox.confirm('纭畾鍒犻櫎閫変腑鐨勫畾鏃朵换鍔″悧锛�', '鎻愮ず', {
+      type: 'warning',
+    })
+    const payload = Array.isArray(ids) ? ids : [ids]
+    await deviceMaintenanceTaskDel(payload)
+    ElMessage.success('鍒犻櫎瀹氭椂浠诲姟鎴愬姛')
+    getScheduledTableData()
+  } catch (error) {
+    // 鐢ㄦ埛鍙栨秷鍒犻櫎
+  }
+}
+
+const handleScheduledOut = () => {
+  ElMessage.info('瀵煎嚭瀹氭椂浠诲姟鍔熻兘寰呭疄鐜�')
+}
+
+// 浠诲姟璁板綍鐩稿叧鏂规硶锛堝師璁惧淇濆吇椤甸潰鏂规硶锛�
+const getTableData = async () => {
+  try {
+    const params = {
+      current: pagination.value.currentPage,
+      size: pagination.value.pageSize,
+      deviceName: filters.deviceName || undefined,
+      maintenancePlanTime: filters.maintenancePlanTime ? dayjs(filters.maintenancePlanTime).format('YYYY-MM-DD') : undefined,
+      maintenanceActuallyTime: filters.maintenanceActuallyTime ? dayjs(filters.maintenanceActuallyTime).format('YYYY-MM-DD') : undefined,
+      maintenanceActuallyName: filters.maintenanceActuallyName || undefined,
+    }
+
+    const { code, data } = await getUpkeepPage(params)
+    if (code === 200) {
+      dataList.value = data.records
+      pagination.value.total = data.total
+    }
+  } catch (error) {
+    console.log(error);
+    
+  }
+}
+
+const resetFilters = () => {
+  filters.deviceName = ''
+  filters.maintenancePlanTime = ''
+  filters.maintenanceActuallyTime = ''
+  filters.maintenanceActuallyName = ''
+  getTableData()
+}
+
+const handleSelectionChange = (selection) => {
+  multipleList.value = selection
+}
+
+const changePage = (page) => {
+  pagination.value.currentPage = page.page
+  pagination.value.pageSize = page.limit
+  getTableData()
+}
+
+const addMaintain = () => {
+  const row = multipleList.value[0]
+  maintainModalRef.value.open(row.id, row)
+}
+
+const addPlan = () => {
+  planModalRef.value.openModal()
+}
+
+const editPlan = (id) => {
+  planModalRef.value.openEdit(id)
+}
+
+const delRepairByIds = async (ids) => {
+  try {
+    await ElMessageBox.confirm('纭鍒犻櫎淇濆吇鏁版嵁, 姝ゆ搷浣滀笉鍙��?', '璀﹀憡', {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning',
+    })
+    
+    const { code } = await delUpkeep(ids)
+    if (code === 200) {
+      ElMessage.success('鍒犻櫎鎴愬姛')
+      getTableData()
+    }
+  } catch (error) {
+    // 鐢ㄦ埛鍙栨秷鍒犻櫎
+  }
+}
+
 const handleOut = () => {
-  ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
-    confirmButtonText: "纭",
-    cancelButtonText: "鍙栨秷",
-    type: "warning",
+  ElMessageBox.confirm('閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�', '瀵煎嚭', {
+    confirmButtonText: '纭',
+    cancelButtonText: '鍙栨秷',
+    type: 'warning',
   })
     .then(() => {
-      proxy.download("/device/maintenance/export", {}, "璁惧淇濆吇.xlsx");
+      proxy.download('/device/maintenance/export', {}, '璁惧淇濆吇.xlsx')
     })
     .catch(() => {
-      ElMessage.info("宸插彇娑�");
-    });
-};
+      ElMessage.info('宸插彇娑�')
+    })
+}
+
+const handleDateChange = (date, type) => {
+  if (type === 1) {
+    filters.maintenanceActuallyTime = date ? dayjs(date).format('YYYY-MM-DD') : ''
+  } else {
+    filters.maintenancePlanTime = date ? dayjs(date).format('YYYY-MM-DD') : ''
+  }
+  getTableData()
+}
 
 onMounted(() => {
-  getTableData();
-});
+  // 鏍规嵁榛樿婵�娲荤殑 Tab 璋冪敤瀵瑰簲鐨勬煡璇㈡帴鍙�
+  if (activeTab.value === 'scheduled') {
+    getScheduledTableData()
+  } else {
+    getTableData()
+  }
+})
 </script>
 
 <style lang="scss" scoped>
@@ -311,3 +574,8 @@
   margin-bottom: 10px;
 }
 </style>
+
+
+
+
+

--
Gitblit v1.9.3