From 2a97deaa6deb2b5e94b2edba33a3e885cab4892b Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 22 十二月 2025 17:11:21 +0800
Subject: [PATCH] 1.海川开心-设备保养添加定时任务 2.海川开心-销售管理、采购管理展示字段修改

---
 src/views/equipmentManagement/upkeep/index.vue               |  740 ++++++++++++++++++++++++++------------
 src/views/salesManagement/receiptPayment/index.vue           |    2 
 src/views/equipmentManagement/upkeep/Modal/formDia.vue       |  296 +++++++++++++++
 src/views/procurementManagement/invoiceEntry/index.vue       |    2 
 src/api/equipmentManagement/upkeep.js                        |   32 +
 src/views/procurementManagement/paymentEntry/index.vue       |    2 
 src/views/salesManagement/salesLedger/index.vue              |   13 
 src/views/equipmentManagement/inspectionManagement/index.vue |    4 
 src/views/salesManagement/invoiceRegistration/index.vue      |    2 
 src/views/equipmentManagement/upkeep/Form/PlanForm.vue       |    2 
 src/views/inventoryManagement/dispatchLog/index.vue          |    4 
 11 files changed, 851 insertions(+), 248 deletions(-)

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/views/equipmentManagement/inspectionManagement/index.vue b/src/views/equipmentManagement/inspectionManagement/index.vue
index 2bfc1ee..381fc69 100644
--- a/src/views/equipmentManagement/inspectionManagement/index.vue
+++ b/src/views/equipmentManagement/inspectionManagement/index.vue
@@ -129,12 +129,12 @@
 		prop: "frequencyType",
 		label: "棰戞",
 		minWidth: 150,
-		formatter: (_, __, val) => ({
+		formatData: (cell) => ({
 			DAILY: "姣忔棩",
 			WEEKLY: "姣忓懆",
 			MONTHLY: "姣忔湀",
 			QUARTERLY: "瀛e害"
-		}[val] || "")
+		}[cell] || "")
 	},
 	{
 		prop: "frequencyDetail",
diff --git a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue b/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
index 2c16f55..2822e2c 100644
--- a/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
+++ b/src/views/equipmentManagement/upkeep/Form/PlanForm.vue
@@ -36,7 +36,7 @@
         <el-option
           v-for="item in userList"
           :key="item.userId"
-          :label="item.userName"
+          :label="item.nickName"
           :value="item.userId"
         />
       </el-select>
diff --git a/src/views/equipmentManagement/upkeep/Modal/formDia.vue b/src/views/equipmentManagement/upkeep/Modal/formDia.vue
new file mode 100644
index 0000000..02c7cf9
--- /dev/null
+++ b/src/views/equipmentManagement/upkeep/Modal/formDia.vue
@@ -0,0 +1,296 @@
+<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";
+
+const { proxy } = getCurrentInstance()
+const emit = defineEmits()
+const dialogVisitable = ref(false);
+const operationType = ref('add');
+const deviceOptions = ref([]);
+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);
+		}
+	}
+}
+
+// 鍏抽棴瀵硅瘽妗�
+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 cc6396b..d40e4d8 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"
@@ -87,12 +174,6 @@
       >
         <template #maintenanceResultRef="{ row }">
           <div>{{ row.maintenanceResult || '-' }}</div>
-          <!-- <el-tag v-if="row.maintenanceResult === 1" type="success">
-            瀹屽ソ
-          </el-tag>
-          <el-tag v-if="row.maintenanceResult === 0" type="danger">
-            缁翠慨
-          </el-tag> -->
         </template>
         <template #statusRef="{ row }">
           <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
@@ -118,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 = reactive({
+  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.current
+  scheduledPagination.pageSize = page.size
+  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.currentPage,
+      size: pagination.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.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.currentPage = page.current
+  pagination.pageSize = page.size
+  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>
@@ -313,3 +574,8 @@
   margin-bottom: 10px;
 }
 </style>
+
+
+
+
+
diff --git a/src/views/inventoryManagement/dispatchLog/index.vue b/src/views/inventoryManagement/dispatchLog/index.vue
index 5f73d91..be9e6b8 100644
--- a/src/views/inventoryManagement/dispatchLog/index.vue
+++ b/src/views/inventoryManagement/dispatchLog/index.vue
@@ -219,7 +219,7 @@
 						<div class="delivery-note">
 							<div class="header">
 								<div class="company-name">娴峰窛寮�蹇冮鍝佹湁闄愬叕鍙�</div>
-								<div class="document-title">闆跺敭鍙戣揣鍗�</div>
+								<div class="document-title">鍙戣揣鍗�</div>
 							</div>
 							
 							<div class="info-section">
@@ -662,7 +662,7 @@
         <div class="delivery-note">
           <div class="header">
             <div class="company-name">娴峰窛寮�蹇冮鍝佹湁闄愬叕鍙�</div>
-            <div class="document-title">闆跺敭鍙戣揣鍗�</div>
+            <div class="document-title">鍙戣揣鍗�</div>
           </div>
           
           <div class="info-section">
diff --git a/src/views/procurementManagement/invoiceEntry/index.vue b/src/views/procurementManagement/invoiceEntry/index.vue
index 2797edb..3719ffe 100644
--- a/src/views/procurementManagement/invoiceEntry/index.vue
+++ b/src/views/procurementManagement/invoiceEntry/index.vue
@@ -40,7 +40,7 @@
         <div>
           <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
           <el-button type="primary" @click="handleAdd('add')">
-            鏂板鐧昏
+            鏉ョエ鐧昏
           </el-button>
 <!--          <el-button type="danger" plain @click="handleDelete">鍒犻櫎</el-button>-->
         </div>
diff --git a/src/views/procurementManagement/paymentEntry/index.vue b/src/views/procurementManagement/paymentEntry/index.vue
index e04da41..28c355b 100644
--- a/src/views/procurementManagement/paymentEntry/index.vue
+++ b/src/views/procurementManagement/paymentEntry/index.vue
@@ -29,7 +29,7 @@
             <el-form-item style="float: right; margin-right: unset">
               <el-button @click="handleExport" style="margin-right: 10px">瀵煎嚭</el-button>
               <el-button type="primary" @click="openForm('add')">
-                鏂板浠樻
+                浠樻鐧昏
               </el-button>
 <!--              <el-button type="danger" plain @click="handleDelete">-->
 <!--                鍒犻櫎-->
diff --git a/src/views/salesManagement/invoiceRegistration/index.vue b/src/views/salesManagement/invoiceRegistration/index.vue
index 17b38bb..be11c2b 100644
--- a/src/views/salesManagement/invoiceRegistration/index.vue
+++ b/src/views/salesManagement/invoiceRegistration/index.vue
@@ -31,7 +31,7 @@
 				<div></div>
 				<div>
 					<el-button type="primary" @click="openForm" style="margin-bottom: 8px">
-						鏂板鐧昏
+						寮�绁ㄧ櫥璁�
 					</el-button>
 				</div>
 			</div>
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
index 336f3fa..2324c6a 100644
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ b/src/views/salesManagement/receiptPayment/index.vue
@@ -32,7 +32,7 @@
         <div></div>
         <div>
           <el-button type="primary" @click="openForm('add')">
-            鏂板鍥炴
+            鍥炴鐧昏
           </el-button>
           <el-button icon="Download" @click="handleOut"> 瀵煎嚭 </el-button>
         </div>
diff --git a/src/views/salesManagement/salesLedger/index.vue b/src/views/salesManagement/salesLedger/index.vue
index d599868..bccf621 100644
--- a/src/views/salesManagement/salesLedger/index.vue
+++ b/src/views/salesManagement/salesLedger/index.vue
@@ -57,6 +57,15 @@
         <el-table-column label="鍚堝悓閲戦(鍏�)" prop="contractAmount" width="220" show-overflow-tooltip
           :formatter="formattedNumber" />
         <el-table-column label="褰曞叆浜�" prop="entryPersonName" width="100" show-overflow-tooltip />
+				<el-table-column label="鐢熶骇鐘舵��" prop="productionStatus" width="100" show-overflow-tooltip >
+					<template #default="scope">
+						<div>
+							<el-tag v-if="scope.row.productionStatus === '宸插畬鎴�'" type="success">宸插畬鎴�</el-tag>
+							<el-tag v-if="scope.row.productionStatus === '鐢熶骇涓�'" type="warning">鐢熶骇涓�</el-tag>
+							<el-tag v-if="scope.row.productionStatus === '鏈紑濮�'" type="danger">鏈紑濮�</el-tag>
+						</div>
+					</template>
+				</el-table-column>
         <el-table-column label="鍙戣揣杞︾墝" prop="shippingCarNumber" width="120" show-overflow-tooltip>
           <template #default="scope">
             <div>
@@ -310,7 +319,7 @@
 						<div class="delivery-note">
 							<div class="header">
 								<div class="company-name">娴峰窛寮�蹇冮鍝佹湁闄愬叕鍙�</div>
-								<div class="document-title">闆跺敭鍙戣揣鍗�</div>
+								<div class="document-title">鍙戣揣鍗�</div>
 							</div>
 							
 							<div class="info-section">
@@ -1172,7 +1181,7 @@
         <div class="delivery-note">
           <div class="header">
             <div class="company-name">娴峰窛寮�蹇冮鍝佹湁闄愬叕鍙�</div>
-            <div class="document-title">闆跺敭鍙戣揣鍗�</div>
+            <div class="document-title">鍙戣揣鍗�</div>
           </div>
           
           <div class="info-section">

--
Gitblit v1.9.3