<script setup>
|
import {Search} from "@element-plus/icons-vue";
|
import {reactive} from "vue";
|
import {useRouter} from "vue-router"
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
import request from "@/utils/request"
|
|
import { ref, onMounted, onBeforeUnmount,onUnmounted } from 'vue';
|
import { WebSocketHost ,host} from '@/utils/constants'
|
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
|
const adjustedRects = ref([]);
|
const currentGlassId = ref(null);
|
const currenttemperingFeedSequence = ref(null);
|
|
const dialogFormVisible = ref(true)
|
const dialogFormVisiblea = ref(false)
|
const blind = ref(false)
|
|
const getTableRow = (row,type) =>{
|
switch (type) {
|
case 'edit' :{
|
//alert('我接收到子组件传送的编辑信息')
|
router.push({path: '/main/returns/createReturns', query: { ReturnID: 'TH24010101' }})
|
break
|
}
|
case 'delete':{
|
alert('我接收到子组件传送的删除信息')
|
break
|
}
|
}
|
}
|
let socket = null;
|
const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/temperingGlass`;
|
const handleMessage = (data) => {
|
if (data.overGlass && data.overGlass.length > 0) {
|
// 提取新的矩形ID
|
const newGlassIds = new Set(data.overGlass[0].map(rect => rect.glassId));
|
|
// 过滤出已存在的矩形
|
const existingRects = adjustedRects.value.filter(rect => newGlassIds.has(rect.glassId));
|
|
// 计算新的矩形
|
const newRects = data.overGlass[0].map(rect => {
|
const scaleFactor = 1621.78/5190;
|
let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;
|
let newX = rect.yCoordinate;
|
|
if (rect.width < rect.height) {
|
widtha = rect.height;
|
heighta = rect.width;
|
}else {
|
widtha = rect.width;
|
heighta = rect.height;
|
}
|
if (rect.angle === 0) {
|
adjustedWidth = widtha * scaleFactor;
|
adjustedHeight = heighta * 0.16;
|
} else {
|
adjustedWidth = heighta * scaleFactor;
|
adjustedHeight = widtha * 0.16;
|
}
|
return {
|
...rect,
|
xcoordinate: newX * scaleFactor,
|
ycoordinate: rect.xCoordinate * 0.16,
|
width: adjustedWidth,
|
height: adjustedHeight,
|
widtha: rect.width,
|
heighta: rect.height,
|
}
|
});
|
|
// 合并新旧矩形,并保留 isActive 状态
|
adjustedRects.value = existingRects.map(oldRect => {
|
const newRect = newRects.find(r => r.glassId === oldRect.glassId);
|
if (newRect) {
|
return { ...oldRect, ...newRect, isActive: oldRect.isActive };
|
}
|
return oldRect; // 如果旧矩形在新数据中不存在,但保留在newGlassIds中,则保留原样
|
}).concat(newRects.filter(r => !existingRects.some(o => o.glassId === r.glassId)));
|
}
|
else if (data.overGlass == null) {
|
adjustedRects.value = []
|
}
|
};
|
function updateRectColors() {
|
adjustedRects.value.forEach(rect => {
|
if (rect.glassId === glassId) {
|
rect.state = 8;
|
}
|
});
|
}
|
function getRectColora(state) {
|
switch (state) {
|
case 3:
|
return '#eebe77';
|
case 4:
|
return '#CD6090';
|
case 8:
|
return '#911005';
|
}
|
}
|
function showDialog(rect) {
|
const index = adjustedRects.value.findIndex(r => r.glassId === rect.glassId);
|
if (index !== -1) {
|
adjustedRects.value[index].isActive = true;
|
}
|
currentGlassId.value = rect.glassId;
|
currenttemperingFeedSequence.value = rect.temperingFeedSequence;
|
blind.value = true;
|
}
|
|
const handleDialogClose = () => {
|
adjustedRects.value.forEach(rect => {
|
rect.isActive = false;
|
});
|
blind.value = false;
|
};
|
// 破损
|
const handleDamage = async () => {
|
try {
|
const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
|
glassId: currentGlassId.value,
|
// temperingFeedSequence: currenttemperingFeedSequence.value,
|
line: 4001,
|
status: 8,
|
workingProcedure: '钢化',
|
})
|
if (response.code == 200) {
|
ElMessage.success(response.message);
|
blind.value = false;
|
updateRectColors();
|
} else {
|
// 请求失败,显示错误消息
|
ElMessage.error(response.message);
|
}
|
}
|
catch (error) {
|
// 处理错误
|
console.error(error);
|
}
|
}
|
onMounted(() => {
|
socket = initializeWebSocket(socketUrl, handleMessage);
|
});
|
onUnmounted(() => {
|
if (socket) {
|
closeWebSocket(socket);
|
}
|
});
|
onBeforeUnmount(() => {
|
console.log("关闭了")
|
closeWebSocket();
|
});
|
</script>
|
|
<template>
|
<div style="margin-top: 10px;">
|
<div>
|
<el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
|
<!-- <el-card style="margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading"> -->
|
<div v-if="adjustedRects.length > 0">
|
<div style="text-align: center;">炉号:{{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }}</div>
|
<el-scrollbar height="550px" width="1200px" style="background-color: #e9e9eb;">
|
<div style="position: relative;">
|
<div
|
v-for="(rect, index) in adjustedRects"
|
:key="index"
|
@click="showDialog(rect)"
|
class="rect"
|
:style="{ position: 'absolute', top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`,
|
width: `${rect.width}px`, height: `${rect.height}px`,
|
backgroundColor: rect.isActive ? '#ADFF2F' : getRectColora(rect.state)
|
}">
|
<div class="centered-text">
|
<div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>
|
<div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
|
<div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
|
</div>
|
</div>
|
</div>
|
</el-scrollbar>
|
</div>
|
</el-card>
|
</div>
|
<el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
|
<el-button type="warning" plain :icon="Delete" @click="handleDamage" style="width: 140px;margin-left: 10px;">
|
{{ $t('order.dilapidation') }}
|
</el-button>
|
</el-dialog>
|
</div>
|
|
</template>
|
|
<style scoped>
|
#boxa{
|
border: 1px solid rgb(119, 116, 116);
|
background-color: #529b2e;
|
text-align: center;
|
display: inline-block;
|
margin-left: 20px;
|
margin-top: 70px;
|
margin-bottom: 50px;
|
}
|
.rect {
|
border: 1px solid black; /* 设置矩形的边框 */
|
background-color: lightblue; /* 设置矩形的背景色 */
|
}
|
.centered-text {
|
/* 设置文字居中样式 */
|
/* display: flex; */
|
justify-content: center;
|
align-items: center;
|
height: 100%; /* 确保div占据整个矩形的高度 */
|
font-size: small;
|
}
|
</style>
|