From f1ee0aa9d6c6c89ee9f0e5d845cd3c64f161aeaf Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期二, 16 十二月 2025 20:03:08 +0800
Subject: [PATCH] 代码调整6
---
src/views/maintenance/MaintenanceManagement.vue | 526 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 526 insertions(+), 0 deletions(-)
diff --git a/src/views/maintenance/MaintenanceManagement.vue b/src/views/maintenance/MaintenanceManagement.vue
new file mode 100644
index 0000000..574f333
--- /dev/null
+++ b/src/views/maintenance/MaintenanceManagement.vue
@@ -0,0 +1,526 @@
+<template>
+ <div class="maintenance-management-container">
+ <!-- 椤堕儴鎿嶄綔鏍� -->
+ <el-card shadow="hover" style="margin-bottom: 20px;">
+ <div class="card-header">
+ <span>缁翠慨绠$悊</span>
+ <div class="header-buttons">
+ <el-button type="primary" @click="showCreateWorkOrderDialog">
+ <el-icon-plus /> 鍒涘缓宸ュ崟
+ </el-button>
+ </div>
+ </div>
+ </el-card>
+
+ <el-row :gutter="20">
+ <!-- 宸︿晶锛氬伐鍗曞垪琛� -->
+ <el-col :span="16">
+ <el-card shadow="hover">
+ <!-- 宸ュ崟鐘舵�佹爣绛鹃〉 -->
+ <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+ <el-tab-pane label="寰呭鐞�" name="pending"></el-tab-pane>
+ <el-tab-pane label="澶勭悊涓�" name="processing"></el-tab-pane>
+ <el-tab-pane label="宸插畬鎴�" name="completed"></el-tab-pane>
+ </el-tabs>
+
+ <!-- 宸ュ崟鍒楄〃 -->
+ <el-table :data="filteredWorkOrders" stripe style="width: 100%" @row-click="handleWorkOrderClick">
+ <el-table-column prop="orderNo" label="宸ュ崟缂栧彿" width="180"></el-table-column>
+ <el-table-column prop="deviceName" label="璁惧鍚嶇О" width="150"></el-table-column>
+ <el-table-column prop="faultType" label="鏁呴殰绫诲瀷" width="120"></el-table-column>
+ <el-table-column prop="createTime" label="鍒涘缓鏃堕棿" width="180"></el-table-column>
+ <el-table-column prop="assignee" label="璐熻矗浜�" width="120"></el-table-column>
+ <el-table-column prop="priority" label="浼樺厛绾�" width="100">
+ <template #default="scope">
+ <el-tag :type="scope.row.priority === 'high' ? 'danger' : scope.row.priority === 'medium' ? 'warning' : 'info'">
+ {{ scope.row.priority === 'high' ? '楂�' : scope.row.priority === 'medium' ? '涓�' : '浣�' }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="150">
+ <template #default="scope">
+ <el-button size="small" @click="showEditWorkOrderDialog(scope.row)">缂栬緫</el-button>
+ <el-button type="danger" size="small" @click="handleDeleteWorkOrder(scope.row.id)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <!-- 鍒嗛〉 -->
+ <div class="pagination-container">
+ <el-pagination
+ background
+ layout="total, sizes, prev, pager, next, jumper"
+ :total="filteredWorkOrders.length"
+ :current-page="currentPage"
+ :page-sizes="[10, 20, 50, 100]"
+ :page-size="pageSize"
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ ></el-pagination>
+ </div>
+ </el-card>
+ </el-col>
+
+ <!-- 鍙充晶锛氱淮淇粺璁″拰澶囦欢鎺ㄨ崘 -->
+ <el-col :span="8">
+ <!-- 缁翠慨鍘嗗彶缁熻 -->
+ <el-card shadow="hover" style="margin-bottom: 20px;">
+ <template #header>
+ <div class="card-header">
+ <span>缁翠慨鍘嗗彶缁熻</span>
+ </div>
+ </template>
+ <div class="statistics-content">
+ <div class="stat-item">
+ <div class="stat-label">鏈湀瀹屾垚宸ュ崟</div>
+ <div class="stat-value">{{ monthlyCompleted }}</div>
+ </div>
+ <div class="stat-item">
+ <div class="stat-label">骞冲潎缁翠慨鏃堕暱</div>
+ <div class="stat-value">{{ averageRepairTime }}灏忔椂</div>
+ </div>
+ <div class="stat-item">
+ <div class="stat-label">璁惧鏁呴殰鐜�</div>
+ <div class="stat-value">{{ failureRate }}%</div>
+ </div>
+ <div class="stat-item">
+ <div class="stat-label">甯哥敤缁翠慨璁惧</div>
+ <div class="stat-value">{{ commonDevice }}</div>
+ </div>
+ </div>
+ </el-card>
+
+ <!-- 甯哥敤澶囦欢鍏宠仈鎺ㄨ崘 -->
+ <el-card shadow="hover">
+ <template #header>
+ <div class="card-header">
+ <span>甯哥敤澶囦欢鎺ㄨ崘</span>
+ </div>
+ </template>
+ <div class="spare-parts-content">
+ <el-table :data="spareParts" stripe style="width: 100%" size="small">
+ <el-table-column prop="name" label="澶囦欢鍚嶇О" width="120"></el-table-column>
+ <el-table-column prop="model" label="鍨嬪彿" width="100"></el-table-column>
+ <el-table-column prop="stock" label="搴撳瓨" width="80">
+ <template #default="scope">
+ <el-tag :type="scope.row.stock < 10 ? 'danger' : 'success'">
+ {{ scope.row.stock }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="usageCount" label="浣跨敤娆℃暟" width="80"></el-table-column>
+ </el-table>
+ </div>
+ </el-card>
+ </el-col>
+ </el-row>
+
+ <!-- 鍒涘缓宸ュ崟瀵硅瘽妗� -->
+ <el-dialog v-model="createWorkOrderDialogVisible" title="鍒涘缓缁翠慨宸ュ崟" width="600px">
+ <el-form :model="workOrderForm" :rules="workOrderRules" ref="workOrderFormRef" label-width="100px">
+ <el-form-item label="璁惧" prop="deviceId">
+ <el-select v-model="workOrderForm.deviceId" placeholder="璇烽�夋嫨璁惧">
+ <el-option
+ v-for="device in devices"
+ :key="device.id"
+ :label="device.name"
+ :value="device.id"
+ ></el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="鏁呴殰绫诲瀷" prop="faultType">
+ <el-input v-model="workOrderForm.faultType" placeholder="璇疯緭鍏ユ晠闅滅被鍨�"></el-input>
+ </el-form-item>
+ <el-form-item label="鏁呴殰鎻忚堪" prop="faultDescription">
+ <el-input v-model="workOrderForm.faultDescription" type="textarea" placeholder="璇疯缁嗘弿杩版晠闅滄儏鍐�" :rows="3"></el-input>
+ </el-form-item>
+ <el-form-item label="浼樺厛绾�" prop="priority">
+ <el-select v-model="workOrderForm.priority" placeholder="璇烽�夋嫨浼樺厛绾�">
+ <el-option label="楂�" value="high"></el-option>
+ <el-option label="涓�" value="medium"></el-option>
+ <el-option label="浣�" value="low"></el-option>
+ </el-select>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="createWorkOrderDialogVisible = false">鍙栨秷</el-button>
+ <el-button type="primary" @click="handleCreateWorkOrder">纭畾</el-button>
+ </span>
+ </template>
+ </el-dialog>
+
+ <!-- 缂栬緫宸ュ崟瀵硅瘽妗� -->
+ <el-dialog v-model="editWorkOrderDialogVisible" title="缂栬緫缁翠慨宸ュ崟" width="600px">
+ <el-form :model="workOrderForm" :rules="workOrderRules" ref="workOrderFormRef" label-width="100px">
+ <el-form-item label="宸ュ崟缂栧彿" disabled>
+ <el-input v-model="workOrderForm.orderNo"></el-input>
+ </el-form-item>
+ <el-form-item label="璁惧" disabled>
+ <el-input v-model="workOrderForm.deviceName"></el-input>
+ </el-form-item>
+ <el-form-item label="鏁呴殰绫诲瀷" disabled>
+ <el-input v-model="workOrderForm.faultType"></el-input>
+ </el-form-item>
+ <el-form-item label="璐熻矗浜�" prop="assignee">
+ <el-select v-model="workOrderForm.assignee" placeholder="璇烽�夋嫨璐熻矗浜�">
+ <el-option
+ v-for="user in users"
+ :key="user.id"
+ :label="user.name"
+ :value="user.name"
+ ></el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="缁翠慨鐘舵��" prop="status">
+ <el-select v-model="workOrderForm.status" placeholder="璇烽�夋嫨鐘舵��">
+ <el-option label="寰呭鐞�" value="pending"></el-option>
+ <el-option label="澶勭悊涓�" value="processing"></el-option>
+ <el-option label="宸插畬鎴�" value="completed"></el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="缁翠慨缁撴灉" prop="repairResult">
+ <el-input v-model="workOrderForm.repairResult" type="textarea" placeholder="璇峰~鍐欑淮淇粨鏋�" :rows="3"></el-input>
+ </el-form-item>
+ <el-form-item label="澶囦欢浣跨敤" prop="usedParts">
+ <el-input v-model="workOrderForm.usedParts" type="textarea" placeholder="璇峰~鍐欎娇鐢ㄧ殑澶囦欢" :rows="2"></el-input>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="editWorkOrderDialogVisible = false">鍙栨秷</el-button>
+ <el-button type="primary" @click="handleEditWorkOrder">纭畾</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup>
+import { ref, computed } from 'vue'
+
+// 璁惧鍒楄〃
+const devices = ref([
+ { id: 'D001', name: '绌哄帇鏈篈-001' },
+ { id: 'D002', name: '鍐峰嵈濉擝-002' },
+ { id: 'D003', name: '姘存车C-003' },
+ { id: 'D004', name: '鍙戠數鏈篋-004' },
+ { id: 'D005', name: '鍙樺帇鍣‥-005' }
+])
+
+// 鐢ㄦ埛鍒楄〃锛堢敤浜庡垎閰嶈礋璐d汉锛�
+const users = ref([
+ { id: 'U001', name: '寮犱笁' },
+ { id: 'U002', name: '鏉庡洓' },
+ { id: 'U003', name: '鐜嬩簲' },
+ { id: 'U004', name: '璧靛叚' }
+])
+
+// 宸ュ崟鍒楄〃鏁版嵁
+const workOrders = ref([
+ {
+ id: 1,
+ orderNo: 'WO20241216001',
+ deviceId: 'D001',
+ deviceName: '绌哄帇鏈篈-001',
+ faultType: '鍘嬪姏寮傚父',
+ faultDescription: '璁惧杩愯鏃跺帇鍔涜秴杩囪瀹氶槇鍊硷紝浼存湁寮傚父鍣煶',
+ priority: 'high',
+ assignee: '',
+ status: 'pending',
+ repairResult: '',
+ usedParts: '',
+ createTime: '2024-12-16 14:32:15',
+ startTime: '',
+ endTime: ''
+ },
+ {
+ id: 2,
+ orderNo: 'WO20241216002',
+ deviceId: 'D002',
+ deviceName: '鍐峰嵈濉擝-002',
+ faultType: '娓╁害杩囬珮',
+ faultDescription: '鍐峰嵈濉斿嚭姘存俯搴﹁秴杩囪瀹氬�硷紝鍐峰嵈鏁堟灉涓嶄匠',
+ priority: 'medium',
+ assignee: '寮犱笁',
+ status: 'processing',
+ repairResult: '',
+ usedParts: '',
+ createTime: '2024-12-16 14:30:45',
+ startTime: '2024-12-16 15:00:00',
+ endTime: ''
+ },
+ {
+ id: 3,
+ orderNo: 'WO20241215001',
+ deviceId: 'D003',
+ deviceName: '姘存车C-003',
+ faultType: '鎸姩杩囧ぇ',
+ faultDescription: '姘存车杩愯鏃舵尟鍔ㄥ�艰秴杩囨爣鍑嗭紝鍙兘褰卞搷璁惧瀵垮懡',
+ priority: 'medium',
+ assignee: '鏉庡洓',
+ status: 'completed',
+ repairResult: '鏇存崲浜嗘按娉佃酱鎵匡紝璋冩暣浜嗚仈杞村櫒锛屾尟鍔ㄥ�兼仮澶嶆甯�',
+ usedParts: '杞存壙脳2锛岃仈杞村櫒脳1',
+ createTime: '2024-12-15 08:30:00',
+ startTime: '2024-12-15 09:00:00',
+ endTime: '2024-12-15 10:45:00'
+ },
+ {
+ id: 4,
+ orderNo: 'WO20241214001',
+ deviceId: 'D004',
+ deviceName: '鍙戠數鏈篋-004',
+ faultType: '鐢垫祦寮傚父',
+ faultDescription: '鍙戠數鏈鸿繍琛屾椂鐢垫祦娉㈠姩杈冨ぇ锛屽彲鑳藉瓨鍦ㄧ煭璺闄�',
+ priority: 'high',
+ assignee: '鐜嬩簲',
+ status: 'completed',
+ repairResult: '妫�鏌ュ苟淇浜嗗彂鐢垫満缁曠粍鐭矾闂锛岀數娴佹仮澶嶆甯�',
+ usedParts: '缁濈紭鏉愭枡脳1锛屽绾棵�5绫�',
+ createTime: '2024-12-14 14:20:00',
+ startTime: '2024-12-14 14:30:00',
+ endTime: '2024-12-14 16:15:00'
+ },
+ {
+ id: 5,
+ orderNo: 'WO20241213001',
+ deviceId: 'D005',
+ deviceName: '鍙樺帇鍣‥-005',
+ faultType: '鐢靛帇娉㈠姩',
+ faultDescription: '鍙樺帇鍣ㄨ緭鍑虹數鍘嬫尝鍔ㄨ緝澶э紝褰卞搷涓嬫父璁惧杩愯',
+ priority: 'low',
+ assignee: '璧靛叚',
+ status: 'completed',
+ repairResult: '璋冩暣浜嗗彉鍘嬪櫒鍒嗘帴寮�鍏筹紝鐢靛帇绋冲畾鍦ㄦ甯歌寖鍥村唴',
+ usedParts: '',
+ createTime: '2024-12-13 09:15:00',
+ startTime: '2024-12-13 10:00:00',
+ endTime: '2024-12-13 11:30:00'
+ }
+])
+
+// 褰撳墠婵�娲荤殑鏍囩椤碉紙宸ュ崟鐘舵�侊級
+const activeTab = ref('pending')
+
+// 鍒嗛〉鏁版嵁
+const currentPage = ref(1)
+const pageSize = ref(10)
+
+// 瀵硅瘽妗嗙姸鎬�
+const createWorkOrderDialogVisible = ref(false)
+const editWorkOrderDialogVisible = ref(false)
+
+// 宸ュ崟琛ㄥ崟鏁版嵁
+const workOrderForm = ref({
+ id: '',
+ orderNo: '',
+ deviceId: '',
+ deviceName: '',
+ faultType: '',
+ faultDescription: '',
+ priority: 'medium',
+ assignee: '',
+ status: 'pending',
+ repairResult: '',
+ usedParts: '',
+ createTime: '',
+ startTime: '',
+ endTime: ''
+})
+
+// 琛ㄥ崟楠岃瘉瑙勫垯
+const workOrderRules = ref({
+ deviceId: [{ required: true, message: '璇烽�夋嫨璁惧', trigger: 'change' }],
+ faultType: [{ required: true, message: '璇疯緭鍏ユ晠闅滅被鍨�', trigger: 'blur' }],
+ faultDescription: [{ required: true, message: '璇疯缁嗘弿杩版晠闅滄儏鍐�', trigger: 'blur' }],
+ priority: [{ required: true, message: '璇烽�夋嫨浼樺厛绾�', trigger: 'change' }],
+ assignee: [{ required: true, message: '璇烽�夋嫨璐熻矗浜�', trigger: 'change' }],
+ status: [{ required: true, message: '璇烽�夋嫨鐘舵��', trigger: 'change' }]
+})
+
+// 琛ㄥ崟寮曠敤
+const workOrderFormRef = ref(null)
+
+// 绛涢�夊悗鐨勫伐鍗曞垪琛�
+const filteredWorkOrders = computed(() => {
+ return workOrders.value.filter(order => order.status === activeTab.value)
+})
+
+// 缁翠慨缁熻鏁版嵁
+const monthlyCompleted = ref(28)
+const averageRepairTime = ref(2.5)
+const failureRate = ref(3.2)
+const commonDevice = ref('绌哄帇鏈篈-001')
+
+// 甯哥敤澶囦欢鎺ㄨ崘
+const spareParts = ref([
+ { id: 1, name: '杞存壙', model: '6308', stock: 15, usageCount: 23 },
+ { id: 2, name: '瀵嗗皝浠�', model: 'MS-25', stock: 8, usageCount: 18 },
+ { id: 3, name: '鑱旇酱鍣�', model: 'CL-50', stock: 5, usageCount: 12 },
+ { id: 4, name: '浼犳劅鍣�', model: 'TS-100', stock: 3, usageCount: 15 },
+ { id: 5, name: '娑︽粦娌�', model: 'L-46', stock: 20, usageCount: 30 }
+])
+
+// 鏄剧ず鍒涘缓宸ュ崟瀵硅瘽妗�
+const showCreateWorkOrderDialog = () => {
+ // 閲嶇疆琛ㄥ崟
+ workOrderForm.value = {
+ id: '',
+ orderNo: '',
+ deviceId: '',
+ deviceName: '',
+ faultType: '',
+ faultDescription: '',
+ priority: 'medium',
+ assignee: '',
+ status: 'pending',
+ repairResult: '',
+ usedParts: '',
+ createTime: '',
+ startTime: '',
+ endTime: ''
+ }
+ createWorkOrderDialogVisible.value = true
+}
+
+// 鏄剧ず缂栬緫宸ュ崟瀵硅瘽妗�
+const showEditWorkOrderDialog = (order) => {
+ workOrderForm.value = { ...order }
+ editWorkOrderDialogVisible.value = true
+}
+
+// 澶勭悊宸ュ崟鐐瑰嚮
+const handleWorkOrderClick = (row) => {
+ // 鍙互鍦ㄨ繖閲屾坊鍔犳煡鐪嬪伐鍗曡鎯呯殑閫昏緫
+}
+
+// 澶勭悊鏍囩椤靛垏鎹�
+const handleTabChange = (tab) => {
+ activeTab.value = tab
+ currentPage.value = 1 // 鍒囨崲鏍囩椤垫椂閲嶇疆椤电爜
+}
+
+// 澶勭悊鍒涘缓宸ュ崟
+const handleCreateWorkOrder = () => {
+ // 妯℃嫙鍒涘缓宸ュ崟
+ const newOrder = {
+ ...workOrderForm.value,
+ id: workOrders.value.length + 1,
+ orderNo: `WO${new Date().getFullYear()}${String(new Date().getMonth() + 1).padStart(2, '0')}${String(new Date().getDate()).padStart(2, '0')}${String(workOrders.value.length + 1).padStart(3, '0')}`,
+ deviceName: devices.value.find(d => d.id === workOrderForm.value.deviceId)?.name || '',
+ createTime: new Date().toLocaleString(),
+ status: 'pending'
+ }
+ workOrders.value.unshift(newOrder)
+ createWorkOrderDialogVisible.value = false
+ ElMessage.success('宸ュ崟鍒涘缓鎴愬姛')
+}
+
+// 澶勭悊缂栬緫宸ュ崟
+const handleEditWorkOrder = () => {
+ // 妯℃嫙缂栬緫宸ュ崟
+ const index = workOrders.value.findIndex(order => order.id === workOrderForm.value.id)
+ if (index !== -1) {
+ // 濡傛灉鐘舵�佷粠寰呭鐞嗗彉涓哄鐞嗕腑锛岃缃紑濮嬫椂闂�
+ if (workOrders.value[index].status === 'pending' && workOrderForm.value.status === 'processing') {
+ workOrderForm.value.startTime = new Date().toLocaleString()
+ }
+ // 濡傛灉鐘舵�佷粠澶勭悊涓彉涓哄凡瀹屾垚锛岃缃粨鏉熸椂闂�
+ if (workOrders.value[index].status === 'processing' && workOrderForm.value.status === 'completed') {
+ workOrderForm.value.endTime = new Date().toLocaleString()
+ }
+ workOrders.value[index] = { ...workOrderForm.value }
+ editWorkOrderDialogVisible.value = false
+ ElMessage.success('宸ュ崟缂栬緫鎴愬姛')
+ }
+}
+
+// 澶勭悊鍒犻櫎宸ュ崟
+const handleDeleteWorkOrder = (id) => {
+ ElMessageBox.confirm('纭畾瑕佸垹闄よ宸ュ崟鍚楋紵', '鎻愮ず', {
+ confirmButtonText: '纭畾',
+ cancelButtonText: '鍙栨秷',
+ type: 'warning'
+ }).then(() => {
+ // 妯℃嫙鍒犻櫎宸ュ崟
+ const index = workOrders.value.findIndex(order => order.id === id)
+ if (index !== -1) {
+ workOrders.value.splice(index, 1)
+ ElMessage.success('宸ュ崟鍒犻櫎鎴愬姛')
+ }
+ }).catch(() => {
+ // 鍙栨秷鍒犻櫎
+ })
+}
+
+// 澶勭悊鍒嗛〉澶у皬鍙樺寲
+const handleSizeChange = (size) => {
+ pageSize.value = size
+ currentPage.value = 1
+}
+
+// 澶勭悊褰撳墠椤靛彉鍖�
+const handleCurrentChange = (current) => {
+ currentPage.value = current
+}
+</script>
+
+<style scoped>
+.maintenance-management-container {
+ padding: 20px;
+ background-color: #f5f7fa;
+ min-height: 100vh;
+}
+
+.card-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.header-buttons {
+ display: flex;
+ gap: 10px;
+}
+
+.pagination-container {
+ display: flex;
+ justify-content: flex-end;
+ margin-top: 20px;
+}
+
+.statistics-content {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 20px;
+ padding: 10px 0;
+}
+
+.stat-item {
+ text-align: center;
+ padding: 15px;
+ background-color: #fafafa;
+ border-radius: 4px;
+}
+
+.stat-label {
+ font-size: 14px;
+ color: #606266;
+ margin-bottom: 10px;
+}
+
+.stat-value {
+ font-size: 24px;
+ font-weight: bold;
+ color: #303133;
+}
+
+.spare-parts-content {
+ padding: 10px 0;
+}
+
+:deep(.el-icon-plus) {
+ margin-right: 5px;
+}
+</style>
\ No newline at end of file
--
Gitblit v1.9.3