From dcf9c9e0410fe1186239e3f8d6f7bdc789c08010 Mon Sep 17 00:00:00 2001
From: lzhe <lzhe@example.com>
Date: 星期三, 05 六月 2024 18:00:39 +0800
Subject: [PATCH] 1

---
 src/views/mdc/station-live.vue |  332 +++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 287 insertions(+), 45 deletions(-)

diff --git a/src/views/mdc/station-live.vue b/src/views/mdc/station-live.vue
index 0afc929..acc9866 100644
--- a/src/views/mdc/station-live.vue
+++ b/src/views/mdc/station-live.vue
@@ -2,7 +2,7 @@
  * @Author: lzhe lzhe@example.com
  * @Date: 2024-03-26 10:28:33
  * @LastEditors: lzhe lzhe@example.com
- * @LastEditTime: 2024-04-23 17:08:42
+ * @LastEditTime: 2024-06-05 11:37:17
  * @FilePath: /smart-web/src/views/master/person/main/index.vue
  * @Description: 杩欐槸榛樿璁剧疆,璇疯缃甡customMade`, 鎵撳紑koroFileHeader鏌ョ湅閰嶇疆 杩涜璁剧疆: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 -->
@@ -38,16 +38,16 @@
 			<div class="collect-info-panel">
 				<div class="fact-analysis-realtim">
 					<div class="wimi-empty" style="background-color: rgb(255, 255, 255);" v-if="dmpList.length == 0">
-						<div class="wimi-empty-img" style="width: 150px; height: 150px;">
+						<!-- <div class="wimi-empty-img" style="width: 150px; height: 150px;">
 							<img src="./quesheng.bd026700.png" style="height: auto; width: 100%;">
-						</div>
+						</div> -->
 						<div class="empty-description">
 							<div>鏆傛棤鏁版嵁</div>
 						</div>
 					</div>
 					<div class="fact-analysis-card" v-for="item in dmpList" v-if="dmpList.length != 0">
-						<div class="card-name" style="background-color: rgb(127, 192, 192);">{{item.description}}</div>
-						<div class="card-value" style="background-color: rgba(127, 192, 192, 0.14);"></div>
+						<div class="card-name" :style="{'background-color': item.color}">{{item.description}}</div>
+						<div :class="{'card-value': true,'card-value-bg1':item.name != 'Alarm','card-value-bg2':item.name == 'Alarm'}">{{item.codeName}}</div>
 					</div>
 				</div>
 			</div>
@@ -81,13 +81,21 @@
 							<div id="wcs-log" style="width: 100%;height:200px;"></div>
 							<el-table ref="multipleTableRef1" :data="recordData" border style="width: 100%;">
 								<el-table-column prop="shiftIndexName" label="鐝"></el-table-column>
-								<el-table-column prop="temdata" label="璋冭瘯"></el-table-column>
-								<el-table-column prop="temdata" label="绂荤嚎"></el-table-column>
-								<el-table-column prop="temdata" label="寰呮満"></el-table-column>
-								<el-table-column prop="temdata" label="鎶ヨ"></el-table-column>
-								<el-table-column prop="temdata" label="杩愯"></el-table-column>
-								<el-table-column prop="perdata" label="绋煎姩鐜�%"></el-table-column>
-								<el-table-column prop="perdata" label="鎶ヨ鐜�%"></el-table-column>
+								<el-table-column prop="5" label="璋冭瘯"></el-table-column>
+								<el-table-column prop="4" label="绂荤嚎"></el-table-column>
+								<el-table-column prop="3" label="寰呮満"></el-table-column>
+								<el-table-column prop="1" label="鎶ヨ"></el-table-column>
+								<el-table-column prop="2" label="杩愯"></el-table-column>
+								<el-table-column prop="oee" label="绋煎姩鐜�%">
+									<template #default="scope">
+										<span>{{(Number(scope.row.oee) * 100).toFixed(2)}}</span>
+									</template>
+								</el-table-column>
+								<el-table-column prop="perdata" label="鎶ヨ鐜�%">
+									<template #default="scope">
+										<span>{{(Number(scope.row.fault) * 100).toFixed(2)}}</span>
+									</template>
+								</el-table-column>
 							</el-table>
 						</div>
 					</div>
@@ -116,6 +124,7 @@
 	<save-dialog v-if="dialog.save" ref="saveDialog"  @success="addfeedbackSuccess" :workstationId="lastLevelId" @closed="dialog.save=false"></save-dialog>
 </template>
 <script>
+	import moment from 'moment'
 	import * as echarts from 'echarts';
 	import saveDialog from './add-station-status'
 	export default {
@@ -142,7 +151,7 @@
 		            tooltip: {  
 		                trigger: 'item',  
 		                //formatter: '{a} <br/>{b} : {c} ({d}%)'  
-		                formatter: '{a} 0鍒嗛挓'
+		                formatter: '{a} {c}鍒嗛挓'
 		            },  
 		            legend: {  
 		                orient: 'vertical',  
@@ -233,26 +242,13 @@
 					},
 					xAxis: {
 						type: 'category',
-						data: ['00:00:00', '02:00:00', '04:00:00', '06:00:00', '08:00:00', '10:00:00', '12:00:00', '14:00:00', '18:00:00'],  
+						data: [],  
 					},
 					yAxis: {
 						type: 'category',
 						data: ['1', '2']
 					},
-					series: [
-						{	
-		                    name: 'wcsLog',  
-		                    type: 'bar',   
-		                    data: [],  
-		                    emphasis: {  
-		                        itemStyle: {  
-		                            shadowBlur: 10,  
-		                            shadowOffsetX: 0,  
-		                            shadowColor: 'rgba(0, 0, 0, 0.5)'  
-		                        }  
-		                    }  
-						}
-					]
+					series: []
 				},
 				dmpList: [],
 				stationForm: {
@@ -289,7 +285,9 @@
 					current: "1",
 					size: "15"
 				},
-				recordData: [] // 鐝鐘舵�佽褰晅able
+				records: [],
+				recordData: [], // 鐝鐘舵�佽褰晅able
+				allwcs: []
 			}
 		},
 		created(){
@@ -343,30 +341,221 @@
 				}
 				this.$HTTP.post(`/api/blade-mdc/status-record/shift-index-status-record-table`,obj).then(res=> {
 					if(res.code == 200) {
-						res.data.forEach(item=> {
-							item.temdata = "00:00:00";
-							item.perdata = "0";
-						})
+						var defaultValues = {  
+							oee: 0,  
+							fault: 0,  
+							'1': "00:00:00",  
+							'2': "00:00:00",  
+							'3': "00:00:00",  
+							'4': "00:00:00",  
+							'5': "00:00:00"  
+						};  
+						res.data.forEach(item => {  
+							Object.keys(defaultValues).forEach(key => {  
+								if (!item[key]) {  
+								item[key] = defaultValues[key];  
+								}  
+							});  
+						});
 						this.recordData = res.data;
 					}
 				})
 			},
+			renderItem(params, api) {
+				var categoryIndex = api.value(0);
+				var start = api.coord([api.value(1), categoryIndex]);
+				var end = api.coord([api.value(2), categoryIndex]);
+				var height = api.size([0, 1])[1] * 0.6;
+				var rectShape = echarts.graphic.clipRectByRect(
+					{
+						x: start[0],
+						y: start[1] - height / 2,
+						width: end[0] - start[0],
+						height: height
+					},
+					{
+						x: params.coordSys.x,
+						y: params.coordSys.y,
+						width: params.coordSys.width,
+						height: params.coordSys.height
+					}
+				);
+				return (
+						rectShape && {
+						type: 'rect',
+						transition: ['shape'],
+						shape: rectShape,
+						style: api.style()
+					}
+				);
+			},
+			getColor(name) {
+				var color = '';
+				this.achievements.forEach(item=> {
+					if(item.code == name) {
+						color = item.color;
+					}
+				})
+				return color;
+			},
+			getStatus(name) {
+				var stauts = {};
+				this.allwcs.forEach(item=> {
+					if(item.code == name) {
+						stauts.name= item.name;
+						stauts.type= item.type;
+					}
+				})
+				return stauts;
+			},
 			getlogcart() {  //鐝鐘舵�佽褰昪hart
 				var obj = {
 					date: this.wcsDate,
+					//date : "2024-05-15",
 					humanFeedback: true,
 					workstationId: this.lastLevelId
 				}
-				this.$HTTP.post(`/api/blade-mdc/status-record/shift-index-status-record-table`,obj).then(res=> {
+				this.$HTTP.post(`/api/blade-mdc/status-record/shift-index-status-record-chart`,obj).then(res=> {
 					if(res.code == 200) {
-						var myChart = echarts.init(document.getElementById('wcs-log')); 
-						res.data.forEach(item => {
-							item.value = 0;
+						var yAxisData = [];
+						var newData = [];
+						this.records = res.data.reverse();
+						res.data.forEach(item=> {
+							if(item.statusRecordList == null) item.statusRecordList = [];
+							var filterRecordList = [];
+							item.statusRecordList.forEach(item1=> {
+								if(item1.endTime.startsWith(this.wcsDate)) {  //鍙繑鍥炲綋鍓嶇粨鏉熸棩鏈熺殑
+									filterRecordList.push(item1)
+								}
+							})
+							item.statusRecordList = filterRecordList;
 						})
-						this.wcsOptionLog.series[0].data = res.data;
+						res.data.forEach((item,index)=> {
+							yAxisData.push(item.shiftIndex);
+							//璁$畻寮�濮嬫椂闂达紝鏄剧ず鏃堕棿
+							if(item.statusRecordList == null) item.statusRecordList = [];
+							item.statusRecordList.forEach(item1=> {
+								var initstart = item1.startTime.split(" ")[0];  //鏍规嵁鏃ユ湡璁$畻宸��
+								var startTime = moment(item1.startTime).diff(moment(initstart + " 00:00:00"), 'minutes');
+								var endTime = moment(item1.endTime).diff(moment(initstart + " 00:00:00"), 'minutes');
+								var diff = moment(item1.endTime).diff(moment(item1.startTime), 'minutes') //寮�濮嬩簡澶氫箙
+								var color = this.getColor(item1.wcs);
+								item1.value = [index,startTime,endTime,diff];
+								item1.itemStyle = {"normal": {"color": color}};
+								item1.statusName = this.getStatus(item1.wcs).name;
+                            	item1.statusType = this.getStatus(item1.wcs).type;
+							})
+							newData.push(...item.statusRecordList);
+						})
+						//娓叉煋鍥捐〃
+						this.setCharts(yAxisData,newData);
+
+						var nowTime = moment().format("HH:mm:ss");  //11:37:54
+						var spaceTime = moment(obj.date + " " + nowTime).diff(moment(obj.date + " 00:00:00"), 'hours');  //绂诲綋澶�00:00:00杩囦簡澶氬皯灏忔椂
+						//console.log(spaceTime,obj.date + " " + nowTime,234)
+						return;
+						//璁$畻鏃堕棿
+						var startOfDay = moment().startOf('day'); //00:00:00
+						var now = moment();  //褰撳墠鏃堕棿
+						var diffInMilliseconds = now.diff(startOfDay);  //鏃堕棿宸�
+						var diffInHours = Math.floor(diffInMilliseconds / (1000 * 60 * 60));  //鏃堕棿宸浆鎹㈡垚灏忔椂
+						//鍒嗗壊
+						var everTime = Math.ceil(diffInHours/8);
+						var arrData = [];
+						for(var i=0;i<=diffInHours;i+=everTime) {
+							if(i<=10) {
+								var num = '0' + i;
+							}else {
+								var num = i;
+							}
+							arrData.push(num + ':00:00');
+						}
+						//璁$畻鏃堕棿缁撴潫
+						this.wcsOptionLog.xAxis.data = [...arrData,moment().format("HH:mm:ss")];
 						myChart.setOption(this.wcsOptionLog);
 					}
 				})
+			},
+			setCharts(yAxisData,data) {
+				var option = {
+					tooltip: {
+						formatter: function (params) {
+							if(params.data.statusType == 4) {
+								var dom = `<span class="tipdesc">宸ヤ綅:</span>${params.data.name}</br>
+											<span class="tipdesc">鐘舵��:</span>${params.data.wcsDesc}</br>
+											<span class="tipdesc">鎻忚堪:</span>${params.data.feedbackDesc}</br>
+											<span class="tipdesc">鐘舵�佹椂闂�:</span>${params.data.startTime} 锝� ${params.data.endTime}</br>
+											<span class="tipdesc">鍙嶉鏃堕棿:</span>${params.data.feedbackTime}</br>
+											<span class="tipdesc">鍙嶉浜�:</span>${params.data.feedUser}</br>`
+							}else {
+								var dom = `<span class="tipstatus">${params.data.statusName}</span></br>
+											<span class="tipdesc">鏃舵:</span><span>${params.data.startTime.split(" ")[1]} 锝� ${params.data.endTime.split(" ")[1]}</span></br>`
+							}
+							return dom;
+						}
+					},
+					grid: {
+						top: 10,
+						left: 70,
+						bottom: 120
+					},
+					xAxis: {
+						min: 0,
+						max: 1440,  // 鍗曚綅鍒嗛挓
+						interval: 1440/6,  //姣忛殧澶氬皯鍒嗛挓鏄剧ず涓�涓埢搴�
+						axisLabel: {
+							formatter: (value)=> {
+								if(value == 0) {
+									return "00:00:00";
+								}else if(value == 240) {
+									return "04:00:00";
+								}else if(value == 480) {
+									return "08:00:00";
+								}else if(value == 720) {
+									return "12:00:00";
+								}else if(value == 960) {
+									return "16:00:00";
+								}else if(value == 1200) {
+									return "18:00:00";
+								}else if(value == 1440) {
+									return "00:00:00";
+								}
+							}
+						}
+					},
+					yAxis: {
+						type: 'category',
+						axisLabel: {
+							formatter: function (value) {
+								return value;
+							},
+							rich: {
+								a: {
+									color: '#409eff',
+									cursor: 'pointer',
+									fontSize: '12px'
+								}
+							}
+						},
+						data: yAxisData
+					},
+					series: [
+						{
+						type: 'custom',
+						renderItem: this.renderItem,
+						itemStyle: {
+							opacity: 0.8
+						},
+						encode: {
+							x: [1, 2],
+							y: 0
+						},
+						data: data
+						}
+					]
+				};
+				var myChart = echarts.init(document.getElementById('wcs-log')); 
+				myChart.setOption(option);
 			},
 			getwscLvalue() {
 				var obj = {
@@ -380,7 +569,7 @@
 						var wcsOption = JSON.parse(JSON.stringify(this.wcsBeginOption));
 						if(res.data.length == 0) {
 							wcsOption.forEach(item=> {
-								item.value = 20;
+								item.value = 0;
 							})
 						}else {
 							wcsOption.forEach(item=> {
@@ -444,7 +633,7 @@
 						if(res.code == 200) {
 							this.stationForm = res.data;
 							this.getdmp(this.lastLevelId,this.stationForm.machineId);
-							this.newDate();  //鑾峰彇褰撳墠鏃ユ湡
+							//this.newDate();  //鑾峰彇褰撳墠鏃ユ湡
 							this.getwcsR();
 							this.getwscLvalue();  //宸︿晶鍥捐〃
 							this.alarmsearchBtn();  //鏈哄櫒灞ュ巻
@@ -455,10 +644,50 @@
 				}
 			},
 			getdmp(lastLevelId,machineId) {
+				console.log(lastLevelId,machineId)
 				this.$HTTP.get(`/api/blade-cps/workstation/get-dmp-variables?machineId=${machineId}&workstationId=${lastLevelId}`).then(res=> {
 					if(res.code == 200) {
-						this.dmpList = res.data;
-						console.log(this.dmpList,1)
+						this.dmpList = [];
+						var that = this;
+						//鍙戦�亀ebsocket
+						var obj = {
+							type: "realTimeData",
+							workstationIdList: [lastLevelId]
+						}
+						if(this.$TOOL.socket.websocket == null) {  //娌℃湁寤虹珛鍏堝缓绔�
+							this.$TOOL.socket.connectToWebSocket(this.$TOOL.cookie.get("TOKEN")); 
+						}
+						this.$TOOL.socket.sendDataToWebSocket(obj);  //鍙戦��
+						this.$TOOL.socket.websocket.onmessage = function(event) {  
+							if(res.data.length == 0) return;  //娌″�间笉鐢ㄥ惊鐜�
+					        res.data.forEach(item=> {  //绗竴姝ユ妸v鏀惧埌code閲�
+					        	var eventData = JSON.parse(event.data);
+							    if(item.name == "DeviceStatus") {  //鏈哄櫒鐘舵��
+							        item.code = eventData.data[item.name].v;
+							        that.allwcs.forEach(item1=> {
+							        	if(item.code == item1.code) {
+							        		item.codeName = item1.name;    //绗簩姝ユ妸v鐨刢ode鍜岃繍琛屽搴�
+							        		if(item.code == "2") {
+							        			item.color = "#73D13D";
+							        		}else {
+							        			item.color = "#75C0C0";
+							        		}
+							        	}
+							        })
+							    }else {
+							    	if(item.name == 'Alarm') {  //鎶ヨ
+							    		var v = JSON.parse(eventData.data[item.name].v);
+							    		item.description = v.code;
+							    		item.codeName = v.msg;
+							    		item.color = "#370C0D";
+							    	}else {
+							    		item.codeName = eventData.data[item.name].v;
+							        	item.color = "#75C0C0";
+							    	}
+							    }
+							});
+							that.dmpList = res.data;
+					    };
 					}
 				})
 			},
@@ -562,6 +791,7 @@
 						})
 						this.achievements = achievements;
 						this.collectionstatus = collectionstatus;
+						this.allwcs = res.data;
 					}
 				})
 			},
@@ -673,6 +903,13 @@
     padding: 0 8px;
     overflow: hidden;
     word-break: break-all;
+	line-height: 68px;
+}
+.card-value-bg1 {
+	background-color: rgba(115, 209, 61, 0.14);
+}
+.card-value-bg2 {
+	background-color: rgba(55, 12, 13, 0.14);
 }
 .wcs-main {
 	display: flex;
@@ -763,7 +1000,7 @@
 	position: absolute;
     right: 10px;
     top: -2px;
-    color: #3b8e8e;
+    color: #409eff;
     cursor: pointer;
 }
 .status-wrap.align-left, .status-wrap:first-child {
@@ -776,7 +1013,7 @@
     justify-content: start;
 }
 .collect-status {
-    color: #3b8e8e;
+    color: #409eff;
     margin-right: 16px;
 	font-size: 14px;
 }
@@ -803,6 +1040,11 @@
     flex-wrap: wrap;
 }
 .status-wrap /deep/ .el-checkbox.el-checkbox--large {
-    color: #3b8e8e;
+    color: #409eff;
+}
+#record /deep/ .tipstatus {
+	width: 100%;
+	display: inline-block;
+	border-bottom: 1px solid #eee;
 }
 </style>
\ No newline at end of file

--
Gitblit v1.9.3