From 6e3f39127fa0d1d9b42da15904cdf4217a3ae9d6 Mon Sep 17 00:00:00 2001
From: baoshiwei <baoshiwei@shlanbao.cn>
Date: 星期五, 11 七月 2025 09:53:12 +0800
Subject: [PATCH] refactor(web-antd): 重构预测性维护页面

---
 eims-ui/apps/web-antd/src/views/eims/predictive-maintenance/injection-molding-machine-detail.vue |  302 +++++++++++++++++++++++++++-----------------------
 1 files changed, 164 insertions(+), 138 deletions(-)

diff --git a/eims-ui/apps/web-antd/src/views/eims/predictive-maintenance/injection-molding-machine-detail.vue b/eims-ui/apps/web-antd/src/views/eims/predictive-maintenance/injection-molding-machine-detail.vue
index 61b3576..91f7f0c 100644
--- a/eims-ui/apps/web-antd/src/views/eims/predictive-maintenance/injection-molding-machine-detail.vue
+++ b/eims-ui/apps/web-antd/src/views/eims/predictive-maintenance/injection-molding-machine-detail.vue
@@ -1,20 +1,30 @@
 <script lang="ts">
 import { defineComponent, onUnmounted, reactive } from 'vue';
 
+import { AppstoreOutlined, FieldTimeOutlined, LineChartOutlined, WarningOutlined, ThunderboltOutlined, CheckCircleOutlined } from '@ant-design/icons-vue';
 import * as echarts from 'echarts';
 
 export default defineComponent({
   name: 'InjectionMoldingMachineDetail',
+  components: {
+    LineChartOutlined,
+    WarningOutlined,
+    AppstoreOutlined,
+    CheckCircleOutlined,
+    FieldTimeOutlined,
+    ThunderboltOutlined
+  },
   setup() {
     // 妯℃嫙鏁版嵁
     const deviceInfo = reactive({
-      deviceName: '娉ㄥ鏈� #IM-001',
+      deviceName: '绔嬪紡娉ㄥ鏈�',
       deviceType: '娉ㄥ鏈�',
-      deviceId: 'IM-2024-001',
-      installDate: '2023-08-20',
+      deviceId: 'GPC2013C027',
+      installDate: '2014-01-06',
       serviceLife: 15,
       status: '杩愯涓�',
-      statusColor: '#52c41a'
+      statusColor: '#52c41a',
+      imageUrl: '/src/assets/images/2t.png' // 娣诲姞璁惧鍥剧墖璺緞
     });
 
     const healthData = reactive({
@@ -22,7 +32,19 @@
       healthColor: '#faad14',
       predictedLife: 1500,
       riskLevel: '涓闄�',
-      riskColor: '#faad14'
+      riskColor: '#faad14',
+      injectionPressure: 120, // 娉ㄥ鍘嬪姏
+      clampingForce: 80, // 閿佹ā鍔�
+      moldTemperature: 45, // 妯″叿娓╁害
+      screwSpeed: 150, // 铻烘潌杞��
+      meltTemperature: 220, // 鐔旇瀺娓╁害
+      coolingTime: 25, // 鍐峰嵈鏃堕棿
+      injectionCount: '495d 19h 44 ', // 娉ㄥ皠娆℃暟
+      clampingCount: 545636, // 鍚堟ā娆℃暟
+      productionCycle: 19, // 鐢熶骇鍛ㄦ湡
+      energyConsumption: 1500, // 鑳借��
+      yieldRate: 98.5, // 鑹搧鐜�
+      downtime: 120 // 鍑洪敊鍋滄満鏃堕棿
     });
 
     const maintenanceColumns = [
@@ -97,7 +119,7 @@
 
     const sparePartColumns = [
       {
-        title: '澶囦欢鍚嶇О',
+        title: '閮ㄤ欢鍚嶇О',
         dataIndex: 'name',
         key: 'name'
       },
@@ -204,7 +226,6 @@
       handleMaintenance
     };
   },
-
   mounted() {
     // 鍒濆鍖栧浘琛�
     const initChart = (chartId: string, title: string, chartData: any[], unit: string, baseValue: number, fluctuation: number) => {
@@ -213,11 +234,12 @@
       // 纭繚鍒濆鏁版嵁鐐硅冻澶熸樉绀轰竴涓畬鏁寸殑瓒嬪娍
       if (chartData.length === 0) {
         const now = new Date();
-        for (let i = 0; i < 60; i++) { // 鐢熸垚60涓偣锛屼唬琛�5鍒嗛挓鐨勬暟鎹�
+        for (let i = 0; i < 60; i++) {
+          // 鐢熸垚60涓偣锛屼唬琛�5鍒嗛挓鐨勬暟鎹�
           const time = new Date(now.getTime() - (59 - i) * 5000); // 姣忎釜鐐归棿闅�5绉�
           chartData.push({
             time: time.toLocaleTimeString(),
-            value: (baseValue + Math.random() * fluctuation * 2 - fluctuation).toFixed(2),
+            value: (baseValue + Math.random() * fluctuation * 2 - fluctuation).toFixed(2)
           });
         }
       }
@@ -256,7 +278,7 @@
           },
           xAxis: {
             type: 'category',
-            data: chartData.map(item => item.time)
+            data: chartData.map((item) => item.time)
           },
           yAxis: {
             type: 'value',
@@ -266,7 +288,7 @@
           },
           series: [
             {
-              data: chartData.map(item => Number.parseFloat(item.value)),
+              data: chartData.map((item) => Number.parseFloat(item.value)),
               type: 'line',
               smooth: true,
               lineStyle: {
@@ -285,7 +307,7 @@
                     color: 'rgba(84,112,198,0)'
                   }
                 ])
-              },
+              }
             }
           ]
         };
@@ -304,9 +326,7 @@
       onUnmounted(() => {
         clearInterval(intervalId);
       });
-
     };
-
 
     const hydraulicOilTemperatureData: any[] = [];
     const hydraulicOilPressureData: any[] = [];
@@ -321,49 +341,54 @@
     const ejectorPositionData: any[] = [];
     const cycleTimeData: any[] = [];
 
-    initChart('hydraulicOilTemperatureChart', '娑插帇娌规俯', hydraulicOilTemperatureData, '掳C', 50, 2);
-    initChart('hydraulicOilPressureChart', '娑插帇娌瑰帇', hydraulicOilPressureData, 'MPa', 150, 5);
-    initChart('mainMotorCurrentChart', '涓荤數鏈虹數娴�', mainMotorCurrentData, 'A', 80, 3);
+    // initChart('hydraulicOilTemperatureChart', '娑插帇娌规俯', hydraulicOilTemperatureData, '掳C', 50, 2);
+    // initChart('hydraulicOilPressureChart', '娑插帇娌瑰帇', hydraulicOilPressureData, 'MPa', 150, 5);
+    // initChart('mainMotorCurrentChart', '涓荤數鏈虹數娴�', mainMotorCurrentData, 'A', 80, 3);
     initChart('screwSpeedChart', '铻烘潌杞��', screwSpeedData, 'rpm', 100, 10);
     initChart('moldClampingForceChart', '閿佹ā鍔�', moldClampingForceData, 'kN', 1000, 50);
     initChart('injectionPressureChart', '娉ㄥ皠鍘嬪姏', injectionPressureData, 'MPa', 1200, 80);
     initChart('injectionSpeedChart', '娉ㄥ皠閫熷害', injectionSpeedData, 'mm/s', 150, 10);
-    initChart('barrelTemperatureChart', '鏂欑瓛娓╁害', barrelTemperatureData, '掳C', 200, 5);
+    initChart('barrelTemperatureChart', '鏂欑瓛娓╁害', barrelTemperatureData, '掳C', 240, 3);
     initChart('coolingWaterTemperatureChart', '鍐峰嵈姘存俯搴�', coolingWaterTemperatureData, '掳C', 25, 2);
-    initChart('coolingWaterFlowChart', '鍐峰嵈姘存祦閲�', coolingWaterFlowData, 'L/min', 30, 3);
-    initChart('ejectorPositionChart', '椤跺嚭浣嶇疆', ejectorPositionData, 'mm', 50, 5);
-    initChart('cycleTimeChart', '寰幆鏃堕棿', cycleTimeData, 's', 30, 2);
+    // initChart('coolingWaterFlowChart', '鍐峰嵈姘存祦閲�', coolingWaterFlowData, 'L/min', 30, 3);
+    // initChart('ejectorPositionChart', '椤跺嚭浣嶇疆', ejectorPositionData, 'mm', 50, 5);
+    // initChart('cycleTimeChart', '寰幆鏃堕棿', cycleTimeData, 's', 30, 2);
   }
 });
 </script>
 
 <template>
   <div class="device-detail-container">
-    <a-page-header
-      :sub-title="deviceInfo.deviceName"
-      title="娉ㄥ鏈洪娴嬫�х淮鎶よ鎯�"
-      @back="() => $router.go(-1)"
-    />
+    <a-page-header :sub-title="deviceInfo.deviceName" title="娉ㄥ鏈洪娴嬫�х淮鎶よ鎯�" @back="() => $router.go(-1)" />
 
     <a-row :gutter="16" class="mt-4">
-      <!-- 璁惧鍩烘湰淇℃伅 -->
-      <a-col :span="8">
-        <a-card :style="{ height: '440px' }" class="mb-4" title="璁惧鍩烘湰淇℃伅">
-          <a-descriptions :column="1" bordered>
-            <a-descriptions-item label="璁惧鍚嶇О">{{ deviceInfo.deviceName }}</a-descriptions-item>
-            <a-descriptions-item label="璁惧绫诲瀷">{{ deviceInfo.deviceType }}</a-descriptions-item>
-            <a-descriptions-item label="璁惧缂栧彿">{{ deviceInfo.deviceId }}</a-descriptions-item>
-            <a-descriptions-item label="瀹夎鏃ユ湡">{{ deviceInfo.installDate }}</a-descriptions-item>
-            <a-descriptions-item label="浣跨敤骞撮檺">{{ deviceInfo.serviceLife }}骞�</a-descriptions-item>
-            <a-descriptions-item label="褰撳墠鐘舵��">
-              <a-tag :color="deviceInfo.statusColor">{{ deviceInfo.status }}</a-tag>
-            </a-descriptions-item>
-          </a-descriptions>
+      <!-- 璁惧鍥剧墖鍜岃澶囧熀鏈俊鎭悎骞� -->
+      <a-col :span="10">
+        <a-card :style="{ height: '440px' }" class="mb-4" title="璁惧淇℃伅">
+          <a-row :gutter="16">
+            <a-col :span="12">
+              <div class="device-image-container">
+                <img :src="deviceInfo.imageUrl" alt="璁惧鍥剧墖" class="device-image" />
+              </div>
+            </a-col>
+            <a-col :span="12">
+              <a-descriptions :column="1" bordered>
+                <a-descriptions-item label="璁惧鍚嶇О">{{ deviceInfo.deviceName }}</a-descriptions-item>
+                <a-descriptions-item label="璁惧绫诲瀷">{{ deviceInfo.deviceType }}</a-descriptions-item>
+                <a-descriptions-item label="璁惧缂栧彿">{{ deviceInfo.deviceId }}</a-descriptions-item>
+                <a-descriptions-item label="瀹夎鏃ユ湡">{{ deviceInfo.installDate }}</a-descriptions-item>
+                <a-descriptions-item label="浣跨敤骞撮檺">{{ deviceInfo.serviceLife }}骞�</a-descriptions-item>
+                <a-descriptions-item label="褰撳墠鐘舵��">
+                  <a-tag :color="deviceInfo.statusColor">{{ deviceInfo.status }}</a-tag>
+                </a-descriptions-item>
+              </a-descriptions>
+            </a-col>
+          </a-row>
         </a-card>
       </a-col>
 
       <!-- 璁惧鍋ュ悍鐘舵�佷笌缁存姢寤鸿 -->
-      <a-col :span="16">
+      <a-col :span="14">
         <a-card :style="{ height: '440px' }" class="mb-4" title="璁惧鍋ュ悍鐘舵�佷笌缁存姢寤鸿">
           <a-row :gutter="16">
             <a-col :span="8">
@@ -376,34 +401,17 @@
               />
             </a-col>
             <a-col :span="8">
-              <a-statistic
-                :value="healthData.predictedLife"
-                suffix="澶�"
-                title="棰勬祴鍓╀綑瀵垮懡"
-              />
+              <a-statistic :value="healthData.predictedLife" suffix="澶�" title="棰勬祴鍓╀綑瀵垮懡" />
             </a-col>
             <a-col :span="8">
-              <a-statistic
-                :value="healthData.riskLevel"
-                :value-style="{ color: healthData.riskColor }"
-                title="鏁呴殰椋庨櫓绛夌骇"
-              />
+              <a-statistic :value="healthData.riskLevel" :value-style="{ color: healthData.riskColor }" title="鏁呴殰椋庨櫓绛夌骇" />
             </a-col>
           </a-row>
           <div class="mt-4">
-            <a-progress
-              :percent="healthData.overallHealth"
-              :show-info="false"
-              :stroke-color="healthData.healthColor"
-            />
+            <a-progress :percent="healthData.overallHealth" :show-info="false" :stroke-color="healthData.healthColor" />
           </div>
           <a-divider orientation="left">棰勬祴鎬х淮鎶ゅ缓璁�</a-divider>
-          <a-table
-            :columns="maintenanceColumns"
-            :data-source="maintenanceData"
-            :pagination="false"
-            size="small"
-          >
+          <a-table :columns="maintenanceColumns" :data-source="maintenanceData" :pagination="false" size="small">
             <template #urgency="{ text }">
               <a-tag :color="getUrgencyColor(text)">{{ text }}</a-tag>
             </template>
@@ -414,65 +422,109 @@
         </a-card>
       </a-col>
     </a-row>
+    <a-col :span="24">
+      <a-card class="mb-4" title="璁惧鏁版嵁">
+        <a-row :gutter="[16, 16]">
+          <a-col :span="4">
+            <a-statistic :value="healthData.injectionCount" suffix="min" title="鎬诲紑鏈烘椂闂�">
+              <template #prefix>
+                <LineChartOutlined />
+              </template>
+            </a-statistic>
+          </a-col>
+          <a-col :span="4">
+            <a-statistic :value="healthData.clampingCount" suffix="娆�" title="鎬诲惊鐜鏁�">
+              <template #prefix>
+                <LineChartOutlined />
+              </template>
+            </a-statistic>
+          </a-col>
+          <a-col :span="4">
+            <a-statistic :value="healthData.productionCycle" suffix="s" title="鐢熶骇鍛ㄦ湡">
+              <template #prefix>
+                <FieldTimeOutlined />
+              </template>
+            </a-statistic>
+          </a-col>
+          <a-col :span="4">
+            <a-statistic :value="healthData.energyConsumption" suffix="kWh" title="鑳借��">
+              <template #prefix>
+                <ThunderboltOutlined />
+              </template>
+            </a-statistic>
+          </a-col>
+          <a-col :span="4">
+            <a-statistic :value="healthData.yieldRate" suffix="%" title="鑹搧鐜�">
+              <template #prefix>
+                <CheckCircleOutlined />
+              </template>
+            </a-statistic>
+          </a-col>
+<!--          <a-col :span="4">-->
+<!--            <a-statistic :value="healthData.downtime" suffix="s" title="鍑洪敊鍋滄満鏃堕棿">-->
+<!--              <template #prefix>-->
+<!--                <FieldTimeOutlined />-->
+<!--              </template>-->
+<!--            </a-statistic>-->
+<!--          </a-col>-->
+        </a-row>
+      </a-card>
+    </a-col>
 
     <!-- 瀹炴椂鏁版嵁瓒嬪娍鍥� -->
     <a-card class="mb-4" title="瀹炴椂鏁版嵁瓒嬪娍鍥�">
-      <a-row :gutter="16">
+<!--      <a-row :gutter="16">-->
+<!--        <a-col :span="8">-->
+<!--          <div id="hydraulicOilTemperatureChart" style="height: 300px"></div>-->
+<!--        </a-col>-->
+<!--        <a-col :span="8">-->
+<!--          <div id="hydraulicOilPressureChart" style="height: 300px"></div>-->
+<!--        </a-col>-->
+<!--        <a-col :span="8">-->
+<!--          <div id="mainMotorCurrentChart" style="height: 300px"></div>-->
+<!--        </a-col>-->
+<!--      </a-row>-->
+      <a-row :gutter="16" class="mt-4">
         <a-col :span="8">
-          <div id="hydraulicOilTemperatureChart" style="height: 300px;"></div>
+          <div id="screwSpeedChart" style="height: 300px"></div>
         </a-col>
         <a-col :span="8">
-          <div id="hydraulicOilPressureChart" style="height: 300px;"></div>
+         <div id="barrelTemperatureChart" style="height: 300px"></div>
         </a-col>
         <a-col :span="8">
-          <div id="mainMotorCurrentChart" style="height: 300px;"></div>
+          <div id="injectionPressureChart" style="height: 300px"></div>
         </a-col>
       </a-row>
       <a-row :gutter="16" class="mt-4">
         <a-col :span="8">
-          <div id="screwSpeedChart" style="height: 300px;"></div>
+          <div id="injectionSpeedChart" style="height: 300px"></div>
         </a-col>
         <a-col :span="8">
-          <div id="moldClampingForceChart" style="height: 300px;"></div>
+           <div id="moldClampingForceChart" style="height: 300px"></div>
+
         </a-col>
         <a-col :span="8">
-          <div id="injectionPressureChart" style="height: 300px;"></div>
+          <div id="coolingWaterTemperatureChart" style="height: 300px"></div>
         </a-col>
       </a-row>
-      <a-row :gutter="16" class="mt-4">
-        <a-col :span="8">
-          <div id="injectionSpeedChart" style="height: 300px;"></div>
-        </a-col>
-        <a-col :span="8">
-          <div id="barrelTemperatureChart" style="height: 300px;"></div>
-        </a-col>
-        <a-col :span="8">
-          <div id="coolingWaterTemperatureChart" style="height: 300px;"></div>
-        </a-col>
-      </a-row>
-      <a-row :gutter="16" class="mt-4">
-        <a-col :span="8">
-          <div id="coolingWaterFlowChart" style="height: 300px;"></div>
-        </a-col>
-        <a-col :span="8">
-          <div id="ejectorPositionChart" style="height: 300px;"></div>
-        </a-col>
-        <a-col :span="8">
-          <div id="cycleTimeChart" style="height: 300px;"></div>
-        </a-col>
-      </a-row>
+<!--      <a-row :gutter="16" class="mt-4">-->
+<!--        <a-col :span="8">-->
+<!--          <div id="coolingWaterFlowChart" style="height: 300px"></div>-->
+<!--        </a-col>-->
+<!--        <a-col :span="8">-->
+<!--          <div id="ejectorPositionChart" style="height: 300px"></div>-->
+<!--        </a-col>-->
+<!--        <a-col :span="8">-->
+<!--          <div id="cycleTimeChart" style="height: 300px"></div>-->
+<!--        </a-col>-->
+<!--      </a-row>-->
     </a-card>
 
     <a-row :gutter="16">
       <!-- 澶囦欢瀵垮懡棰勬祴 -->
       <a-col :span="12">
         <a-card class="mb-4" title="澶囦欢瀵垮懡棰勬祴">
-          <a-table
-            :columns="sparePartColumns"
-            :data-source="sparePartData"
-            :pagination="false"
-            size="small"
-          >
+          <a-table :columns="sparePartColumns" :data-source="sparePartData" :pagination="false" size="small">
             <template #status="{ text }">
               <a-tag :color="getStatusColor(text)">{{ text }}</a-tag>
             </template>
@@ -485,7 +537,7 @@
         <a-card class="mb-4" title="鍘嗗彶缁存姢璁板綍">
           <a-timeline>
             <a-timeline-item v-for="item in historyData" :key="item.id" :color="item.color">
-              {{ item.date }} - {{ item.type }}: {{ item.description }}
+              <p>{{ item.date }} - {{ item.type }}锛歿{ item.description }}</p>
             </a-timeline-item>
           </a-timeline>
         </a-card>
@@ -496,54 +548,28 @@
 
 <style scoped>
 .device-detail-container {
-  padding: 16px;
-  background: #f0f2f5;
+  padding: 20px;
+  background-color: #f0f2f5;
 }
 
-.mt-4 {
-  margin-top: 16px;
+.device-image-container {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  height: 330px;
+}
+
+.device-image {
+  max-width: 100%;
+  max-height: 100%;
+  object-fit: contain;
 }
 
 .mb-4 {
   margin-bottom: 16px;
 }
-</style>
 
-
-<style scoped>
-.injection-molding-machine-detail {
-  padding: 16px;
-  background-color: #f0f2f5;
-}
-
-.header-card {
-  margin-bottom: 16px;
-}
-
-.device-info h2 {
-  font-size: 24px;
-  margin-bottom: 10px;
-}
-
-.device-info p {
-  margin-bottom: 5px;
-}
-
-.health-status h3 {
-  font-size: 20px;
-  margin-bottom: 10px;
-}
-
-.ant-statistic-content {
-  font-size: 20px !important;
-}
-
-.ant-list-item-meta-title {
-  font-size: 16px;
-}
-
-.ant-list-item-meta-description {
-  font-size: 14px;
-  color: rgba(0, 0, 0, 0.65);
+.mt-4 {
+  margin-top: 16px;
 }
 </style>

--
Gitblit v1.9.3