<template>
|
<div style="height: 500px;">
|
<div style="display: flex;">
|
<el-input v-model="engineerId" style="margin-left: 15px;margin-top: 10px;width: 240px" :placeholder="$t('order.projectnumber')"/>
|
<el-button type="primary" style="margin-left: 10px;margin-top: 10px;" @click="sethistorical()">{{$t('reportmanage.inquire')}}</el-button>
|
<el-pagination
|
v-model:current-page="currentPage"
|
:page-size="pageSize"
|
:size="size"
|
:disabled="disabled"
|
layout="prev, pager, next, jumper"
|
:total="totalPages"
|
@current-change="handleCurrentChange"
|
style="margin-top: 10px;"
|
/>
|
</div>
|
<el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
|
<el-scrollbar height="750px" width="1400px" style="background-color: #e9e9eb;">
|
<div style="position: relative;">
|
<div
|
v-for="(rect, index) in adjustedRects"
|
:key="rect.glassId"
|
class="rect"
|
@click="showDialog(rect.glassId)"
|
:style="{ position: 'absolute',
|
top: `${rect.y}px`, left: `${rect.x}px`, width: `${rect.width}px`, height: `${rect.height}px`,
|
backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.state)
|
}"
|
>
|
<div class="centered-text">
|
<div style="font-size: 20px;font-weight: bold;">{{ rect.glassId }}</div>
|
<div style="font-size: 20px;font-weight: bold;">{{ rect.flowCardId }}</div>
|
<div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>
|
</div>
|
</div>
|
</div>
|
</el-scrollbar>
|
<el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
|
<el-button :disabled="currentGlassRect?.state === 8 || currentGlassRect?.state === 9" type="warning"
|
plain @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;">
|
{{ $t('order.dilapidation') }}
|
</el-button>
|
<el-button :disabled="currentGlassRect?.state === 9 || currentGlassRect?.state === 8" 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>
|
</div>
|
</template>
|
<script setup lang="ts">
|
import {ElMessage} from 'element-plus'
|
import {computed, onMounted, onUnmounted, ref} from 'vue';
|
import request from "@/utils/request"
|
import {host, WebSocketHost} from '@/utils/constants'
|
import {useI18n} from 'vue-i18n'
|
const {t} = useI18n()
|
let language = ref(localStorage.getItem('lang') || 'zh')
|
const blind = ref(false)
|
const engineerId = ref();
|
const currentGlassId = ref(null);
|
const temperingLayoutId = ref(null);
|
const adjustedRects = ref([]);
|
const raw = ref([]);
|
let webSocket: WebSocket | null = null;
|
const totalPages = ref(0);
|
const pageSize = ref(1);
|
const currentPage = ref('');
|
const disabled = false;
|
const size = 'small';
|
const rawData = ref([]);
|
// 显示对话框并设置当前 glassId
|
const currentGlassRect = computed(() => {
|
return adjustedRects.value.find(rect => rect.glassId === currentGlassId.value);
|
});
|
function showDialog(glassId: number) {
|
currentGlassId.value = glassId;
|
blind.value = true;
|
adjustedRects.value = adjustedRects.value.map(rect =>
|
rect.glassId === glassId ? { ...rect, isActive: true } : rect
|
);
|
}
|
const handleDialogClose = () => {
|
adjustedRects.value = adjustedRects.value.map(rect => ({
|
...rect,
|
isActive: false
|
}));
|
}
|
// 破损
|
const handleDamage = async () => {
|
try {
|
const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
|
glassId: currentGlassId.value,
|
line: 4001,
|
state: 8,
|
workingProcedure: '钢化',
|
temperingLayoutId: currentPage.value,
|
engineerId: engineerId.value,
|
})
|
if (response.code == 200) {
|
ElMessage.success(response.message);
|
blind.value = false;
|
updateRectstate(currentGlassId.value, 8);
|
} else {
|
ElMessage.error(response.msg);
|
}
|
}
|
catch (error) {
|
// 处理错误
|
console.error(error);
|
}
|
}
|
// 人工拿走
|
const handleManualTake = async () => {
|
try {
|
const response = await request.post('/temperingGlass/temperingGlassInfo/updateTemperingState', {
|
glassId: currentGlassId.value,
|
line: 4001,
|
state: 9,
|
workingProcedure: '钢化',
|
temperingLayoutId: currentPage.value,
|
engineerId: engineerId.value,
|
})
|
if (response.code == 200) {
|
ElMessage.success(response.message);
|
blind.value = false;
|
updateRectstate(currentGlassId.value, 9);
|
} else {
|
ElMessage.error(response.msg);
|
}
|
}
|
catch (error) {
|
console.error(error);
|
}
|
}
|
const sethistorical = async () => {
|
search()
|
fetchTableData()
|
}
|
const fetchTableData = async () => {
|
try {
|
const response = await request.post("/temperingGlass/temperingGlassInfo/selectTempering", {
|
engineerId: engineerId.value,
|
})
|
if (response.code === 200) {
|
totalPages.value = response.data.id;
|
}
|
} catch (error) {
|
}
|
};
|
const search = async () => {
|
const response = await request.post('/temperingGlass/temperingGlassInfo/selectTemperingGlass', {
|
engineerId: engineerId.value,
|
temperingLayoutId: 1
|
})
|
if (response.code === 200) {
|
const scaleFactor = 1621.78/6000;
|
const scaleFactory = 750/2800;
|
const adjustedRectsData = response.data.map(rect => {
|
const scaleFactor = 1621.78/6000;
|
const scaleFactorY = 750/2800;
|
let adjustedWidth, adjustedHeight,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 * scaleFactorY;
|
newX = 6000 - (rect.ycoordinate + widtha);
|
} else {
|
adjustedWidth = heighta * scaleFactor;
|
adjustedHeight = widtha * scaleFactorY;
|
newX = 6000 - (rect.ycoordinate + heighta);
|
}
|
return {
|
...rect,
|
x: newX * scaleFactor,
|
y: rect.xcoordinate* scaleFactorY,
|
width: adjustedWidth,
|
height: adjustedHeight,
|
widtha: rect.width,
|
heighta: rect.height,
|
}
|
});
|
adjustedRects.value = adjustedRectsData;
|
currentPage.value = 1;
|
}
|
};
|
const handleCurrentChange = async(val: number) => {
|
currentPage.value = val;
|
const response = await request.post('/temperingGlass/temperingGlassInfo/selectTemperingGlass', {
|
engineerId: engineerId.value,
|
temperingLayoutId: currentPage.value
|
})
|
if (response.code === 200) {
|
const scaleFactor = 1621.78/6000;
|
const scaleFactory = 750/2800;
|
const adjustedRectsData = response.data.map(rect => {
|
const scaleFactor = 1621.78/6000;
|
const scaleFactorY = 750/2800;
|
let adjustedWidth, adjustedHeight,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 * scaleFactorY;
|
newX = 6000 - (rect.ycoordinate + widtha);
|
} else {
|
adjustedWidth = heighta * scaleFactor;
|
adjustedHeight = widtha * scaleFactorY;
|
newX = 6000 - (rect.ycoordinate + heighta);
|
}
|
return {
|
...rect,
|
x: newX * scaleFactor,
|
y: rect.xcoordinate* scaleFactorY,
|
width: adjustedWidth,
|
height: adjustedHeight,
|
widtha: rect.width,
|
heighta: rect.height,
|
}
|
});
|
adjustedRects.value = adjustedRectsData;
|
}
|
};
|
function getRectColor(state: number): string {
|
switch (state) {
|
// case -1:
|
// return '#CDAF95';
|
// case 0:
|
// return '#7AC5CD';
|
// case 1:
|
// return '#95d475';
|
// case 2:
|
// return 'lightblue';
|
// case 3:
|
// return '#eebe77';
|
case 4:
|
return '#CD6090';
|
case 8:
|
return '#911005';
|
case 9:
|
return '#4682B4';
|
default:
|
return '#CDAF95';
|
}
|
}
|
// 更新矩形状态
|
function updateRectstate(glassId: string, state: number) {
|
adjustedRects.value.forEach(rect => {
|
if (rect.glassId === glassId) {
|
rect.state = state; // 更新矩形的状态
|
}
|
});
|
}
|
</script>
|
<style scoped>
|
.rect {
|
border: 1px solid black; /* 设置矩形的边框 */
|
}
|
.centered-text {
|
justify-content: center;
|
align-items: center;
|
height: 100%;
|
/* font-size: large; */
|
}
|
#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>
|