From 1524fa42ddf01fd72207a8a4b4667a48e4f233aa Mon Sep 17 00:00:00 2001 From: baoshiwei <baoshiwei@shlanbao.cn> Date: 星期五, 11 七月 2025 13:39:02 +0800 Subject: [PATCH] refactor(eims): 重构预测性维护模块 --- eims-ui/apps/web-antd/src/views/eims/predictive-maintenance/injection-molding-machine-detail.vue | 304 +++++++++++++++++++++++++++----------------------- 1 files changed, 165 insertions(+), 139 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..5ec94fc 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'; - +import img from '#/assets/images/2t.png'; 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: img // 娣诲姞璁惧鍥剧墖璺緞 }); 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