From 5270308151082506e0e6df2c72d278d2976ec860 Mon Sep 17 00:00:00 2001
From: liulijun <liulijun@hnkhzn.com>
Date: 星期三, 29 四月 2026 10:28:58 +0800
Subject: [PATCH] WCS设备监控

---
 项目代码/WCS/WCSClient/src/views/LineInfo.vue |  629 ++++++++++++++++++++++++++++++++++++++------------------
 1 files changed, 425 insertions(+), 204 deletions(-)

diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSClient/src/views/LineInfo.vue" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSClient/src/views/LineInfo.vue"
index 0f2cf01..4c275ae 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSClient/src/views/LineInfo.vue"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WCS/WCSClient/src/views/LineInfo.vue"
@@ -1,100 +1,42 @@
 <template>
-	<div :class="update()" :style="{ left: left, top: top, marginBottom: 0 + 'px', marginTop: 0 + 'px' }"
+	<div :class="update" :style="{ left: left, top: top, marginBottom: 0 + 'px', marginTop: 15 + 'px' }"
 		@click="mouseClick" v-loading.fullscreen.lock="fullscreenLoading">
 		<img v-if="imgType === '2'" src="../../public/lines.png" />
 		<img v-if="imgType === '1'" src="../../public/lines2.png" />
 		<label v-if="equipNo" class="equip-no">{{ equipNo }}</label>
 	</div>
-	<el-dialog v-model="dialogVisible" title="杈撻�佺嚎淇℃伅鏌ョ湅" :before-close="handleClose">
-		<el-form ref="$form" :model="lineItemInfo" label-position="left" label-width="100px" size="medium">
-			<el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
-				<el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
-					<el-form-item label="璁惧缂栧彿锛�">
-						<j-el-description :value="equipNo" type="primary" ellipsis></j-el-description>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
-					<el-form-item label="鏄惁鏈夌洏:">
-						<j-el-description :value="lineItemInfo.inStock" type="primary" ellipsis></j-el-description>
-					</el-form-item>
-				</el-col>
-			</el-row>
-			<el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
-				<el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
-					<el-form-item label="浠诲姟鍙�:">
-						<j-el-description :value="lineItemInfo.taskNumm" type="primary" ellipsis></j-el-description>
-					</el-form-item>
-				</el-col>
-				<el-col :span="12" :offset="0" :push="0" :pull="0" tag="div">
-					<el-form-item label="鎶ヨ浠g爜锛�">
-						<j-el-description :value="lineItemInfo.alarm" type="primary" ellipsis></j-el-description>
-					</el-form-item>
-				</el-col>
-			</el-row>
-
-		</el-form><el-divider />
-		<h4 style="margin-bottom: 20px;">鎵嬪姩鎿嶄綔</h4>
-		<el-form ref="form" :model="form" label-width="100px">
-			<el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
-				<el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
-					<el-form-item label="浠�  鍔�  鍛�  浠�" prop="TargetAddress">
-						<el-select size="large" v-model="form.TaskType" placeholder="璇烽�夋嫨浠诲姟鍛戒护">
-							<el-option label="鍏ュ簱" value="1" />
-							<el-option label="鍑哄簱" value="2" />
-						</el-select>
-					</el-form-item>
-				</el-col>
-			</el-row>
-			<el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
-				<el-col :span="16" :offset="0" :push="0" :pull="0" tag="div">
-					<el-form-item label="涓嬩竴鐩爣鍦板潃:">
-						<el-input size="large" v-model="form.TargetAddress" placeholder="璇疯緭鍏ヤ笅涓�鐩爣鍦板潃" />
-					</el-form-item>
-				</el-col>
-			</el-row>
-		</el-form>
-		<el-divider />
-		<el-row :gutter="20" type="flex" justify="start" align="top" tag="div">
-			<el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
-				<el-button type="primary" size="small" plain @click="SendCommand">
-					<i class="el-icon-check">鍙戦�佸懡浠�</i>
-				</el-button>
-			</el-col>
-			<el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
-				<el-button type="warning" size="small" plain @click="ConveyorLineReset">
-					<i class="el-icon-check">澶嶄綅</i>
-				</el-button>
-
-			</el-col>
-			<el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
-				<el-button type="danger" size="small" plain @click="ConveyorLineEmergencyStop">
-					<i class="el-icon-check">鍋滄</i>
-				</el-button>
-			</el-col>
-			<el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
-				<el-button type="danger" size="small" plain @click="ConveyorLineReturn">
-					<i class="el-icon-check">閫�鍥�</i>
-				</el-button>
-			</el-col>
-			<el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
-				<el-button type="danger" size="small" plain @click="ConveyorLineCancel">
-					<i class="el-icon-check">鍙栨秷浠诲姟</i>
-				</el-button>
-			</el-col>
-			<el-col :span="4" :offset="0" :push="0" :pull="0" tag="div">
-				<el-button type="danger" size="small" plain @click="ConveyorLineInitialize">
-					<i class="el-icon-check">宸ヤ綅鍒濆鍖�</i>
-				</el-button>
-			</el-col>
-		</el-row>
-		<template #footer>
-			<div class="dialog-footer">
-				<el-button @click="dialogVisible = false">鍙栨秷</el-button>
-				<el-button type="primary" @click="dialogVisible = false">
-					纭
-				</el-button>
+	<el-dialog v-model="dialogVisible" :before-close="handleClose" width="520px" class="modern-dialog">
+		<div class="dialog-header">
+			<h3 class="dialog-title">杈撻�佺嚎淇℃伅</h3>
+		</div>
+		<div class="dialog-content">
+			<div class="info-list">
+				<div class="info-item">
+					<span class="item-label">璁惧缂栧彿</span>
+					<span class="item-value">{{ equipNo || '鏃�' }}</span>
+				</div>
+				<div class="info-item">
+					<span class="item-label">浠诲姟鍙�</span>
+					<span class="item-value">{{ ConveyorLineInfo.TaskNum || '鏃�' }}</span>
+				</div>
+				<div class="info-item">
+					<span class="item-label">鏄惁鏈夌洏</span>
+					<span class="item-value">{{ ConveyorLineInfo.HasGoods || '鏃�' }}</span>
+				</div>
+				<div class="info-item">
+					<span class="item-label">鎵樼洏鏉$爜</span>
+					<span class="item-value">{{ ConveyorLineInfo.PalletCode || '鏃�' }}</span>
+				</div>
+				<div class="info-item">
+					<span class="item-label">鐘舵��</span>
+					<span :class="['item-value', statusClass]">{{ ConveyorLineInfo.Status || '鏃�' }}</span>
+				</div>
+				<div class="info-item">
+					<span class="item-label">鍛戒护</span>
+					<span class="item-value">{{ ConveyorLineInfo.Command || '鏃�' }}</span>
+				</div>
 			</div>
-		</template>
+		</div>
 	</el-dialog>
 </template>
 
@@ -140,143 +82,288 @@
 			left: "500px",
 			top: "400px",
 			dialogVisible: false,
-			lineItemInfo: {
-				inStock: "",
-				taskNum: "",
-				alarm: "",
+			fullscreenLoading: false,
+			timer1: null,
+			hasGoods: false,
+			isAlarm: false,
+			ConveyorLineInfo: {
+				TaskNum: "",
+				HasGoods: "",
+				Status: "",
+				Command: "",
+				PalletCode: "",
 			},
 			form: {
 				TaskType: "",
 				TargetAddress: "",
 				DeviceCode: "",
 			},
+			Map: {
+			Command: {
+				0: "鏃犲懡浠�",
+				1: "闈炲氨缁紙涓嶆墽琛屼笅鍙戝懡浠わ級",
+				2: "鍙栬揣绔欏彴宸ヤ綅灏辩华锛堟湁鏂欙級",
+				3: "鏀捐揣绔欏彴宸ヤ綅灏辩华锛堟棤鏂欙級",
+				4: "鏀捐揣绔欏彴宸ヤ綅灏辩华锛堟湁鏂欙級",
+				5: "鎵爜宸ヤ綅灏辩华",
+				6: "浠诲姟宸ヤ綅灏辩华",
+				7: "鐢宠鏂欐",
+				8: "鏂欐鍒颁綅",
+				9: "鎵ц鍛戒护涓�"
+			},
+			Status: {
+				0: "鑴辨満涓�",
+				1: "鎵嬪姩寰呮満",
+				2: "鑷姩寰呮満",
+				3: "璁惧杩愯",
+				4: "璁惧鏁呴殰"
+			}
+		},
 		};
 	},
 	mounted() {
-		const axisX = (this.positionX - 1) * 40 + 100;
+		const axisX = (this.positionX - 1) * 60 + 100;
 		const axisY = (this.positionY - 1) + 50;
 		this.$nextTick(() => {
 			this.left = `${axisX}px`;
 			this.top = `${axisY}px`;
 		});
+		// 鍚姩瀹氭椂鍣紝姣忕鏇存柊涓�娆℃暟鎹�
+		this.timer1 = setInterval(() => {
+			this.updateAlarmStatus();
+		}, 1000);
+	},
+	beforeUnmount() {
+		// 娓呴櫎瀹氭椂鍣�
+		if (this.timer1) {
+			clearInterval(this.timer1);
+			this.timer1 = null;
+		}
+	},
+	watch: {
+		'$root.conveyorLineDetails': {
+			handler() {
+				this.updateAlarmStatus();
+			},
+			deep: true,
+			immediate: true
+		}
 	},
 	methods: {
+		updateAlarmStatus() {
+			const equipNoStr = String(this.equipNo);
+			if (this.$root.conveyorLineDetails && this.$root.conveyorLineDetails[equipNoStr]) {
+				const rawData = this.$root.conveyorLineDetails[equipNoStr];
+				this.hasGoods = rawData.inStock === '鏄�' || false;
+				// 浣跨敤Home.vue涓凡缁忚绠楀ソ鐨刬sAlarm鍊硷紝鎴栬�呮牴鎹姸鎬佸垽鏂�
+				this.isAlarm = rawData.isAlarm || (rawData.status === 4) || false;
+				// 瀹炴椂鏇存柊瀵硅瘽妗嗕腑鐨勬暟鎹�
+				this.ConveyorLineInfo = {
+					TaskNum: rawData.taskNum || rawData.TaskNum || '鏃�',
+					HasGoods: (rawData.taskNum && rawData.taskNum !== '鏃�' && rawData.taskNum !== '0') ? '鏄�' : '鍚�',
+					Status: rawData.status || rawData.Status || '鏃�',
+					Command: rawData.command || rawData.Command || '鏃�',
+					PalletCode: rawData.palletCode || rawData.PalletCode || '鏃�',
+				};
+				// 灏嗗懡浠や唬鐮佽浆鎹负瀵瑰簲鐨勪腑鏂囨弿杩�
+				if (this.ConveyorLineInfo.Command !== '' && this.ConveyorLineInfo.Command !== '鏃�') {
+					const commandCode = parseInt(this.ConveyorLineInfo.Command);
+					if (!isNaN(commandCode) && this.Map.Command && this.Map.Command[commandCode] !== undefined) {
+						this.ConveyorLineInfo.Command = this.Map.Command[commandCode];
+					}
+				}
+				// 灏嗙姸鎬佷唬鐮佽浆鎹负瀵瑰簲鐨勪腑鏂囨弿杩�
+				if (this.ConveyorLineInfo.Status !== '' && this.ConveyorLineInfo.Status !== '鏃�') {
+					const statusCode = parseInt(this.ConveyorLineInfo.Status);
+					if (!isNaN(statusCode) && this.Map.Status && this.Map.Status[statusCode] !== undefined) {
+						this.ConveyorLineInfo.Status = this.Map.Status[statusCode];
+					}
+				}
+			} else {
+				this.hasGoods = false;
+				this.isAlarm = false;
+			}
+		},
 		mouseClick() {
 			this.fullscreenLoading = true;
 			this.dialogVisible = true;
-			// 澶勭悊鐐瑰嚮浜嬩欢
-			this.http.post("api/DeviceInfo/GetConveyorLineInfo?DeviceChildCode=" + this.equipNo, null, "")
-				.then((x) => {
-					if (x.status) {
-						this.lineItemInfo = x.data;
-					} else {
-						this.$message({
-							type: "error",
-							message: x.message,
-						});
-					}
-				});
+			// 浠庡叏灞�鍙橀噺涓幏鍙栬緭閫佺嚎璇︾粏淇℃伅
+			if (this.$root.conveyorLineDetails && this.$root.conveyorLineDetails[this.equipNo]) {
+				// 鍏堣幏鍙栧師濮嬫暟鎹�
+				const rawData = this.$root.conveyorLineDetails[this.equipNo];
 
+				// 澶嶅埗鏁版嵁鍒癈onveyorLineInfo锛堟ā鏉夸腑缁戝畾鐨勫璞★級
+				this.ConveyorLineInfo = {
+					TaskNum: rawData.taskNum || rawData.TaskNum || '鏃�',
+					HasGoods: (rawData.taskNum && rawData.taskNum !== '鏃�' && rawData.taskNum !== '0') ? '鏄�' : '鍚�',
+					Status: rawData.status || rawData.Status || '鏃�',
+					Command: rawData.command || rawData.Command || '鏃�',
+					PalletCode: rawData.palletCode || rawData.PalletCode || '鏃�',
+				};
+
+				// 灏嗗懡浠や唬鐮佽浆鎹负瀵瑰簲鐨勪腑鏂囨弿杩�
+				if (this.ConveyorLineInfo.Command !== '' && this.ConveyorLineInfo.Command !== '鏃�') {
+					const commandCode = parseInt(this.ConveyorLineInfo.Command);
+					if (!isNaN(commandCode) && this.Map.Command && this.Map.Command[commandCode] !== undefined) {
+						this.ConveyorLineInfo.Command = this.Map.Command[commandCode];
+					}
+				}
+
+				// 灏嗙姸鎬佷唬鐮佽浆鎹负瀵瑰簲鐨勪腑鏂囨弿杩�
+				if (this.ConveyorLineInfo.Status !== '' && this.ConveyorLineInfo.Status !== '鏃�') {
+					const statusCode = parseInt(this.ConveyorLineInfo.Status);
+					if (!isNaN(statusCode) && this.Map.Status && this.Map.Status[statusCode] !== undefined) {
+						this.ConveyorLineInfo.Status = this.Map.Status[statusCode];
+					}
+				}
+
+				// 灏嗘姤璀︿唬鐮佽浆鎹负瀵瑰簲鐨勪腑鏂囨弿杩�
+				if (rawData.alarm !== '' && rawData.alarm !== '鏃�') {
+					const alarmCode = parseInt(rawData.alarm);
+					if (!isNaN(alarmCode) && this.Map.ErrorCode && this.Map.ErrorCode[alarmCode] !== undefined) {
+						this.ConveyorLineInfo.Alarm = this.Map.ErrorCode[alarmCode];
+					}
+				}
+			} else {
+				// 濡傛灉娌℃湁鏁版嵁锛屼娇鐢ㄩ粯璁ゅ��
+				this.ConveyorLineInfo = {
+					TaskNum: '',
+					HasGoods: '',
+					Status: '',
+					Command: '',
+					PalletCode: '',
+				};
+			}
+			this.fullscreenLoading = false;
+		},
+		handleClose() {
+			this.dialogVisible = false;
 			this.fullscreenLoading = false;
 		},
 
-		SendCommand() {
-			this.fullscreenLoading = true;
-			this.form.DeviceCode=this.equipNo;
-			this.http.post("api/DeviceInfo/ConveyorLineHandTask" ,this.form)
-				.then((x) => {
-					if (!x.status) {
-						this.$message.error(x.message);
-					} else {
-						this.$Message.success(x.message);
-					}
-				})
-				.finally(() => {
-					this.fullscreenLoading = false;
-				});
-		}, 
-		ConveyorLineReset() {
-			this.fullscreenLoading = true;
-			this.http.post("api/DeviceInfo/ConveyorLineReset?DeviceChildCode=" + this.equipNo, null, "")
-				.then((x) => {
-					if (!x.status) {
-						this.$message.error(x.message);
-					} else {
-						this.$Message.success(x.message);
+		// SendCommand() {
+		// 	this.fullscreenLoading = true;
+		// 	this.form.DeviceCode=this.equipNo;
+		// 	this.http.post("api/DeviceInfo/ConveyorLineHandTask" ,this.form)
+		// 		.then((x) => {
+		// 			if (!x.status) {
+		// 				this.$message.error(x.message);
+		// 			} else {
+		// 				this.$Message.success(x.message);
+		// 			}
+		// 		})
+		// 		.finally(() => {
+		// 			this.fullscreenLoading = false;
+		// 		});
+		// }, 
+		// ConveyorLineReset() {
+		// 	this.fullscreenLoading = true;
+		// 	this.http.post("api/DeviceInfo/ConveyorLineReset?DeviceChildCode=" + this.equipNo, null, "")
+		// 		.then((x) => {
+		// 			if (!x.status) {
+		// 				this.$message.error(x.message);
+		// 			} else {
+		// 				this.$Message.success(x.message);
 
-					}
-				})
-				.finally(() => {
-					this.fullscreenLoading = false;
-				});
-		},
-		ConveyorLineEmergencyStop() {
-			this.fullscreenLoading = true;
-			this.http.post("api/DeviceInfo/ConveyorLineEmergencyStop?DeviceChildCode=" + this.equipNo, null, "")
-				.then((x) => {
-					if (!x.status) {
-						this.$message.error(x.message);
-					} else {
-						this.$Message.success(x.message);
+		// 			}
+		// 		})
+		// 		.finally(() => {
+		// 			this.fullscreenLoading = false;
+		// 		});
+		// },
+		// ConveyorLineEmergencyStop() {
+		// 	this.fullscreenLoading = true;
+		// 	this.http.post("api/DeviceInfo/ConveyorLineEmergencyStop?DeviceChildCode=" + this.equipNo, null, "")
+		// 		.then((x) => {
+		// 			if (!x.status) {
+		// 				this.$message.error(x.message);
+		// 			} else {
+		// 				this.$Message.success(x.message);
 
-					}
-				})
-				.finally(() => {
-					this.fullscreenLoading = false;
-				});
-		}, 
-		ConveyorLineReturn() {
-			this.fullscreenLoading = true;
-			this.http.post("api/DeviceInfo/ConveyorLineReturn?DeviceChildCode=" + this.equipNo, null, "")
-				.then((x) => {
-					if (!x.status) {
-						this.$message.error(x.message);
-					} else {
-						this.$Message.success(x.message);
-					}
-				})
-				.finally(() => {
-					this.fullscreenLoading = false;
-				});
-		},
-		ConveyorLineCancel() {
-			this.fullscreenLoading = true;
-			this.http.post("api/DeviceInfo/ConveyorLineCancel?DeviceChildCode=" + this.equipNo, null, "")
-				.then((x) => {
-					if (!x.status) {
-						this.$message.error(x.message);
-					} else {
-						this.$Message.success(x.message);
-					}
-				})
-				.finally(() => {
-					this.fullscreenLoading = false;
-				});
-		},
-		ConveyorLineInitialize() {
-			this.fullscreenLoading = true;
-			this.http.post("api/DeviceInfo/ConveyorLineInitialize?DeviceChildCode=" + this.equipNo, null, "")
-				.then((x) => {
-					if (!x.status) {
-						this.$message.error(x.message);
-					} else {
-						this.$Message.success(x.message);
-					}
-				})
-				.finally(() => {
-					this.fullscreenLoading = false;
-				});
-		},
-		update() {
-			return !this.condition ? 'custom-img' : 'custom-img-color'
-		},
+		// 			}
+		// 		})
+		// 		.finally(() => {
+		// 			this.fullscreenLoading = false;
+		// 		});
+		// }, 
+		// ConveyorLineReturn() {
+		// 	this.fullscreenLoading = true;
+		// 	this.http.post("api/DeviceInfo/ConveyorLineReturn?DeviceChildCode=" + this.equipNo, null, "")
+		// 		.then((x) => {
+		// 			if (!x.status) {
+		// 				this.$message.error(x.message);
+		// 			} else {
+		// 				this.$Message.success(x.message);
+		// 			}
+		// 		})
+		// 		.finally(() => {
+		// 			this.fullscreenLoading = false;
+		// 		});
+		// },
+		// ConveyorLineCancel() {
+		// 	this.fullscreenLoading = true;
+		// 	this.http.post("api/DeviceInfo/ConveyorLineCancel?DeviceChildCode=" + this.equipNo, null, "")
+		// 		.then((x) => {
+		// 			if (!x.status) {
+		// 				this.$message.error(x.message);
+		// 			} else {
+		// 				this.$Message.success(x.message);
+		// 			}
+		// 		})
+		// 		.finally(() => {
+		// 			this.fullscreenLoading = false;
+		// 		});
+		// },
+		// ConveyorLineInitialize() {
+		// 	this.fullscreenLoading = true;
+		// 	this.http.post("api/DeviceInfo/ConveyorLineInitialize?DeviceChildCode=" + this.equipNo, null, "")
+		// 		.then((x) => {
+		// 			if (!x.status) {
+		// 				this.$message.error(x.message);
+		// 			} else {
+		// 				this.$Message.success(x.message);
+		// 			}
+		// 		})
+		// 		.finally(() => {
+		// 			this.fullscreenLoading = false;
+		// 		});
+		//},
 		startTimer() {
 			// 寮�鍚畾鏃跺櫒锛屾瘡3绉掓墽琛屼竴娆�
 			this.timer1 = setInterval(() => {
-				update();
-			}, 500);
+				this.updateAlarmStatus();
+			}, 1000);
 		},
 	},
+	computed: {
+		update() {
+			if (this.isAlarm) {
+				return 'custom-img-alarm';
+			}
+			// 浣跨敤涓枃鐘舵�佸�煎垽鏂�
+			const statusText = this.ConveyorLineInfo.Status;
+			// 鐘舵�佷负鎵嬪姩寰呮満鏃讹紝鏃犺鏈夋棤鐩橀兘鏄剧ず钃濊壊
+			if (statusText === '鎵嬪姩寰呮満') {
+				return 'custom-img-blue';
+			}
+			// 鐘舵�佷负鑷姩寰呮満鎴栬澶囪繍琛屼笖鏈夌洏鏃舵樉绀虹豢鑹�
+			if ((statusText === '鑷姩寰呮満' || statusText === '璁惧杩愯') && (this.hasGoods || this.ConveyorLineInfo.HasGoods === '鏄�')) {
+				return 'custom-img-color';
+			}
+			return 'custom-img';
+		},
+		statusClass() {
+			const statusText = this.ConveyorLineInfo.Status;
+			if (statusText === '鎵嬪姩寰呮満') {
+				return 'status-blue';
+			} else if (statusText === '鑷姩寰呮満' || statusText === '璁惧杩愯') {
+				return 'status-green';
+			} else if (statusText === '璁惧鏁呴殰') {
+				return 'status-red';
+			}
+			return '';
+		}
+	}
 });
 </script>
 
@@ -295,6 +382,42 @@
 	text-align: center;
 }
 
+.custom-img-alarm {
+	position: relative;
+	display: inline-block;
+	background-color: #ff0000;
+	color: white;
+	text-align: center;
+}
+
+.custom-img-blue {
+	position: relative;
+	display: inline-block;
+	background-color: #409eff;
+	color: white;
+	text-align: center;
+}
+
+.custom-img-blue img {
+	width: 80px;
+	height: 50px;
+}
+
+.custom-img-alarm img {
+	width: 80px;
+	height: 50px;
+}
+
+.custom-img img {
+	width: 80px;
+	height: 50px;
+}
+
+.custom-img-color img {
+	width: 80px;
+	height: 50px;
+}
+
 /* .custom-img-color::before {
   content: "";
   position: absolute;
@@ -307,19 +430,117 @@
 } */
 
 .custom-img img {
-	width: 40px;
-	height: 40px;
+	width: 80px;
+	height: 50px;
 }
 
 .custom-img-color img {
-	width: 40px;
-	height: 40px;
+	width: 80px;
+	height: 50px;
 }
 
 .equip-no {
 	position: absolute;
-	top: 15px;
-	font-size: 12px;
-	margin-left: -35px;
+	top: 50%;
+	left: 50%;
+	transform: translate(-50%, -50%);
+	font-size: 25px;
+	text-align: center;
+	width: 100%;
+}
+
+.modern-dialog {
+	border-radius: 16px !important;
+	overflow: hidden;
+	box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);
+}
+
+.modern-dialog .el-dialog__header {
+	display: none;
+}
+
+.modern-dialog .el-dialog__body {
+	padding: 0;
+	margin: 0;
+}
+
+.dialog-header {
+	background: linear-gradient(135deg, #409eff 0%, #67c23a 100%);
+	padding: 20px 24px;
+	text-align: center;
+}
+
+.dialog-title {
+	color: #fff;
+	font-size: 18px;
+	font-weight: 600;
+	margin: 0;
+	letter-spacing: 2px;
+}
+
+.dialog-content {
+	padding: 28px;
+	background: #f8fafc;
+	display: flex;
+	justify-content: center;
+}
+
+.info-list {
+	width: 100%;
+	max-width: 420px;
+	display: flex;
+	flex-direction: column;
+	gap: 12px;
+}
+
+.info-item {
+	display: flex;
+	align-items: center;
+	justify-content: space-between;
+	padding: 16px 20px;
+	background: #fff;
+	border-radius: 12px;
+	box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
+	transition: all 0.3s ease;
+}
+
+.info-item:hover {
+	transform: translateX(4px);
+	box-shadow: 0 4px 16px rgba(0, 0, 0, 0.1);
+}
+
+.item-label {
+	font-size: 14px;
+	color: #6b7280;
+	font-weight: 500;
+	min-width: 80px;
+	text-align: left;
+}
+
+.item-value {
+	font-size: 15px;
+	color: #1f2937;
+	font-weight: 500;
+	text-align: right;
+	flex: 1;
+	margin-left: 20px;
+	word-break: break-all;
+	padding-left: 20px;
+	border-left: 1px solid #e5e7eb;
+}
+
+.status-blue {
+	color: #409eff !important;
+	font-weight: 600;
+}
+
+.status-green {
+	color: #67c23a !important;
+	font-weight: 600;
+}
+
+.status-red {
+	color: #f56c6c !important;
+	font-weight: 600;
 }
 </style>

--
Gitblit v1.9.3