<template>
|
<div style="display: flex;">
|
<el-input v-model="inputValue" style="margin-left: 15px;margin-top: 10px;width: 240px" placeholder="请输入工程号" @blur="handleBlur"/>
|
<el-pagination
|
v-model:current-page="currentPage"
|
:page-size="pageSize"
|
:size="size"
|
:disabled="disabled"
|
layout="prev, pager, next, jumper"
|
:total="totalPages"
|
@current-change="handleCurrentChange"
|
/>
|
</div>
|
<el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
|
<el-scrollbar height="550px" width="1200px" style="background-color: #e9e9eb;">
|
<div style="position: relative;">
|
<div
|
v-for="(rect, index) in adjustedRects"
|
:key="rect.glass_id"
|
class="rect"
|
@click="showDialog(rect.glass_id)"
|
:style="{ position: 'absolute',
|
top: `${rect.y_axis}px`, left: `${rect.x_axis}px`, width: `${rect.width}px`, height: `${rect.height}px`,
|
backgroundColor: getRectColor(rect.glass_state)
|
}"
|
>
|
<!-- 箭头 -->
|
<!-- <div id="arrow"></div>
|
<div id="line"></div> -->
|
<div class="centered-text">
|
<div>{{ rect.glass_id }}</div>
|
<div>{{ rect.widtha }}*{{ rect.heighta }}</div>
|
</div>
|
</div>
|
</div>
|
</el-scrollbar>
|
<el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;">
|
<el-button type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
|
{{ $t('order.dilapidation') }}
|
</el-button>
|
<el-button type="danger" plain @click="handleManualTake(currentGlassId)" style="width: 140px;margin-top: 10px;">
|
<el-icon class="el-icon--right"><Upload /></el-icon>
|
{{ $t('order.Takeaway') }}</el-button>
|
</el-dialog>
|
</el-card>
|
</template>
|
<script setup lang="ts">
|
import { Delete, Upload } from '@element-plus/icons-vue'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
import { ref, onMounted, onBeforeUnmount,onUnmounted, computed } from 'vue';
|
import request from "@/utils/request"
|
import { WebSocketHost ,host} from '@/utils/constants'
|
import { initializeWebSocket, closeWebSocket } from '@/utils/WebSocketService';
|
import { useI18n } from 'vue-i18n'
|
const { t } = useI18n()
|
let language = ref(localStorage.getItem('lang') || 'zh')
|
const blind = ref(false)
|
const olWidth = ref();
|
const olHeight = ref();
|
const glass_id = ref();
|
const inputValue = ref('');
|
const currentGlassId = ref(null); // 存储当前点击矩形的 glass_id
|
const adjustedRects = ref([]);
|
const raw = ref([]);
|
let webSocket: WebSocket | null = null;
|
const totalPages = ref(0);
|
const pageSize = ref(1);
|
const currentPage = ref(1);
|
const disabled = false;
|
const size = 'small';
|
const rawData = ref([]);
|
// const handleBind = (row) => {
|
// blind.value = true; // 打开绑定架子对话框
|
// };
|
// 显示对话框并设置当前 glass_id
|
function showDialog(glassId: number) {
|
currentGlassId.value = glassId;
|
blind.value = true;
|
}
|
// 破损
|
const handleDamage = async () => {
|
try {
|
// var url="/cacheGlass/taskCache/identControls?identId="+currentGlassId.value+'&controlsId='+201;
|
// console.log(url);
|
// const response = await request.post(url)
|
const response = await request.post('/cacheGlass/taskCache/identControls', {
|
identId: currentGlassId.value,
|
controlsId: 8,
|
line: 1001,
|
machine: '识别',
|
})
|
if (response.code == 200) {
|
ElMessage.success(response.message);
|
// window.location.reload()
|
blind.value = false;
|
updateRectStatus(currentGlassId.value, 8);
|
} else {
|
// 请求失败,显示错误消息
|
ElMessage.error(response.msg);
|
}
|
}
|
catch (error) {
|
// 处理错误
|
console.error(error);
|
}
|
}
|
// 人工拿走
|
const handleManualTake = async () => {
|
try {
|
// var url="/cacheGlass/taskCache/identControls?identId="+currentGlassId.value+'&controlsId='+200;
|
// console.log(url);
|
// const response = await request.post(url)
|
const response = await request.post('/cacheGlass/taskCache/identControls', {
|
identId: currentGlassId.value,
|
controlsId: 9,
|
line: 1001,
|
machine: '识别',
|
})
|
if (response.code == 200) {
|
// 绑定成功,处理逻辑
|
ElMessage.success(response.message);
|
// window.location.reload()
|
blind.value = false;
|
updateRectStatus(currentGlassId.value, 9);
|
} else {
|
// 请求失败,显示错误消息
|
ElMessage.error(response.msg);
|
}
|
}
|
catch (error) {
|
// 处理错误
|
console.error(error);
|
}
|
}
|
const handleBlur = async () => {
|
if (inputValue.value) {
|
var url="/cacheGlass/taskCache/cutTerritory?current="+inputValue.value;
|
const response = await request.post(url)
|
if (response.code === 200) {
|
console.log(response.data);
|
|
const rawRects = response.data[0];
|
rawData.value = response.data;
|
totalPages.value = rawData.value.length;
|
adjustedRects.value = rawRects.map(rect => ({
|
...rect,
|
x_axis: (6000 -(rect.x_axis + rect.width)) * 0.2085,
|
y_axis: rect.y_axis * 0.17,
|
width: rect.width * 0.2 ,
|
widtha: rect.width ,
|
heighta: rect.height ,
|
height: rect.height * 0.165 ,
|
glass_state: rect.glass_state
|
}));
|
// 如果WebSocket已连接,则关闭
|
if (webSocket) {
|
webSocket.close();
|
webSocket = null;
|
}
|
currentPage.value = 1;
|
}
|
} else{
|
connectWebSocket();
|
}
|
};
|
const handleCurrentChange = (val: number) => {
|
currentPage.value = val;
|
const page = currentPage.value - 1
|
adjustedRects.value = rawData.value[page]?.map(rect => ({
|
// adjustedRects.value = rawRects.map(rect => ({
|
...rect,
|
x_axis: (6000 -(rect.x_axis + rect.width)) * 0.2085,
|
y_axis: rect.y_axis * 0.17,
|
width: rect.width * 0.2 ,
|
widtha: rect.width ,
|
heighta: rect.height ,
|
height: rect.height * 0.165 ,
|
glass_state: rect.glass_state
|
}));
|
};
|
function getRectColor(state: number): string {
|
switch (state) {
|
case 0:
|
return '#e1f3d8';
|
case 100:
|
return '#c8c9cc';
|
case 110:
|
return '#b3e19d';
|
case 120:
|
return '#f89898';
|
case 8:
|
return '#911005';
|
case 9:
|
return '#f3d19e';
|
// default:
|
// return '#911005'; // 默认颜色
|
}
|
}
|
// 更新矩形状态
|
function updateRectStatus(glassId: string, status: number) {
|
adjustedRects.value.forEach(rect => {
|
if (rect.glass_id === glassId) {
|
rect.glass_state = status; // 更新矩形的状态
|
}
|
});
|
}
|
const connectWebSocket = () => {
|
if (!webSocket) {
|
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/cacheGlass`;
|
webSocket = new WebSocket(socketUrl);
|
webSocket.onmessage = (event) => {
|
const data = JSON.parse(event.data);
|
adjustedRects.value = data.currentCutTerritory[0].map(rect => ({
|
...rect,
|
x_axis: (6000 -(rect.x_axis + rect.width)) * 0.2085,
|
y_axis: rect.y_axis * 0.17,
|
width: rect.width * 0.2 ,
|
widtha: rect.width ,
|
heighta: rect.height ,
|
height: rect.height * 0.165 ,
|
glass_state: rect.glass_state
|
}));
|
};
|
webSocket.onerror = (error) => {
|
console.error('WebSocket Error:', error);
|
};
|
webSocket.onclose = () => {
|
console.log('WebSocket Connection Closed');
|
// 可以选择重新连接
|
};
|
}
|
};
|
|
onMounted(() => {
|
// 初始时,如果输入框为空,则连接WebSocket
|
if (!inputValue.value) {
|
connectWebSocket();
|
}
|
});
|
|
onUnmounted(() => {
|
if (webSocket) {
|
webSocket.close();
|
}
|
});
|
</script>
|
|
<style scoped>
|
.rect {
|
border: 1px solid black; /* 设置矩形的边框 */
|
/* background-color: lightblue; 设置矩形的背景色 */
|
}
|
.centered-text {
|
/* 设置文字居中样式 */
|
/* display: flex; */
|
justify-content: center;
|
align-items: center;
|
height: 100%; /* 确保div占据整个矩形的高度 */
|
font-size: small;
|
}
|
#rect {
|
position: relative; /* 确保箭头可以相对于矩形定位 */
|
/* 其他样式 */
|
}
|
|
#arrow {
|
position: absolute;
|
top: 70%; /* 箭头位于矩形中间 */
|
left: 200px; /* 箭头在矩形左侧一些距离 */
|
transform: translateY(-50%); /* 垂直居中 */
|
width: 0;
|
height: 0;
|
border-top: 10px solid transparent; /* 上边框 */
|
border-bottom: 10px solid transparent; /* 下边框 */
|
border-right: 20px solid #911005; /* 右边框,形成箭头 */
|
/* 根据需要调整边框大小和颜色 */
|
}
|
|
#line {
|
position: absolute;
|
top: 70%; /* 直线位于矩形中间 */
|
left: 210px; /* 直线在箭头右侧一些距离 */
|
transform: translateY(-50%); /* 垂直居中 */
|
height: 2px; /* 直线的高度 */
|
width: 240px; /* 直线的长度,根据需要调整 */
|
background-color: #911005; /* 直线的颜色 */
|
}
|
|
</style>
|