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