From 56fab901b298857ff4985b7429ef843c9a9d1471 Mon Sep 17 00:00:00 2001 From: wangfei <3597712270@qq.com> Date: 星期三, 28 八月 2024 16:20:02 +0800 Subject: [PATCH] 钢化模块打印功能,新增表格字段 --- UI-Project/src/views/Identify/identify.vue | 494 +++++++++++++++++++++++++++++++++++------------------- 1 files changed, 315 insertions(+), 179 deletions(-) diff --git a/UI-Project/src/views/Identify/identify.vue b/UI-Project/src/views/Identify/identify.vue index be0e99f..8d2760c 100644 --- a/UI-Project/src/views/Identify/identify.vue +++ b/UI-Project/src/views/Identify/identify.vue @@ -1,186 +1,322 @@ <template> - <el-card style="margin-left: 10px; margin-top: 10px; margin-right: 10px;" v-loading="loading"> - <div style="display: flex;"> - <div style="margin-left: 400px; font-size: 20px;">宸ョ▼鍙凤細P20240305001 </div> - <div style="margin-left: 150px; font-size: 20px;">鐗堝浘缂栧彿锛�1</div> + <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> - <svg width="100%" height="690" xmlns="http://www.w3.org/2000/svg" style="margin-top: -40px;"> - <defs> - <marker id="arrow" markerUnits="strokeWidth" markerWidth="12" markerHeight="12" viewBox="0 0 12 12" refX="6" - refY="6" orient="auto"> - <path d="M2,2 L10,6 L2,10 L2,2" style="fill: #911005;" /> - </marker> - </defs> - <g v-for="(rack, index) in racks" :key="index"> - <rect - :x="rack.x" - :y="rack.y" - :width="rack.width" - :height="rack.height" - :fill="rack.fillColor" - :data-index="index" - class="rack-rect" - style="stroke:#c8c9cc;stroke-width:3;" - @click="showRectInfo(rack)" - /> - <line x1='510' y1='309' x2='260' y2='310' stroke='#911005' stroke-width='2' marker-end='url(#arrow)'> - </line> - <line x1='850' y1='309' x2='1100' y2='310' stroke='#911005' stroke-width='2' marker-end='url(#arrow)'> - </line> - <line x1='510' y1='409' x2='260' y2='410' stroke='#911005' stroke-width='2' marker-end='url(#arrow)'> - </line> - <line x1='1200' y1='650' x2='1200' y2='470' stroke='#911005' stroke-width='2' marker-end='url(#arrow)'> - </line> - <text x="370" y="240" dominant-baseline="middle" text-anchor="middle">NG2024030501A-01</text> - <text x="370" y="260" dominant-baseline="middle" text-anchor="middle">500*300</text> - - <text x="970" y="240" dominant-baseline="middle" text-anchor="middle">NG2024030501A-02</text> - <text x="970" y="260" dominant-baseline="middle" text-anchor="middle">500*300</text> - - <text x="600" y="500" dominant-baseline="middle" text-anchor="middle">NG2024030501A-03</text> - <text x="600" y="520" dominant-baseline="middle" text-anchor="middle">800*450</text> - - - <text x="1280" y="520" dominant-baseline="middle" text-anchor="middle">NG2024030501A-04</text> - <text x="1280" y="540" dominant-baseline="middle" text-anchor="middle">400*300</text> - <g v-for="(item, itemIndex) in rack.items" :key="itemIndex"> - <rect - :x="calculateItemXPosition(rack, item, itemIndex)" - :y="calculateItemYPosition(rack, item, itemIndex)" - :width="item.width" - :height="item.height" - :fill="item.fillColor" - /> - </g> - </g> - </svg> + <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;" v-loading="loading"> + <el-scrollbar height="750px" width="1400px" 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: rect.isActive ? '#ADFF2F' : 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;" @close="handleDialogClose"> + <el-button :disabled="currentGlassRect?.glass_state === 8" type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)" style="width: 140px;margin-left: 10px;"> + {{ $t('order.dilapidation') }} + </el-button> + <el-button :disabled="currentGlassRect?.glass_state === 9" 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> -import Swal from 'sweetalert2' -import request from "@/utils/request"; - - -request.get("/TidyUpGlassModule/CurrentCutTerritory").then((res) => { - if (res.code == 200) { - console.log(res.data); - } else { - ElMessage.warning(res.msg) - router.push("/login") - } - }); - -export default { - data() { - return { - loading: false, - racks: [ - { - x: 70, y: 126, width: 600, height: 240, fillColor: '#93d2f3', - items: [ - { position: 'top-left', width: 40, height: 30, fillColor: '#ffffff', content: 'NG123456',y: '20'}, - { position: 'bottom-left', width: 40, height: 30, fillColor: '#ffffff', content: 'NG1234567' }, - { position: 'bottom-right', width: 40, height: 30, fillColor: '#ffffff', content: 'NG12345678' } - ] - }, - { - x: 685, y: 126, width: 600, height: 240, fillColor: '#93d2f3', - items: [ - { position: 'bottom-left', width: 40, height: 30, fillColor: '#ffffff', content: 'NG123456' }, - { position: 'bottom-right', width: 40, height: 30, fillColor: '#ffffff', content: 'NG123456' }, - { position: 'top-right', width: 40, height: 30, fillColor: '#ffffff', content: 'NG1234567' } - ] - }, - { - x: 70, y: 380, width: 1100, height: 260, fillColor: '#81b337', - items: [ - { position: 'top-left', width: 40, height: 30, fillColor: '#ffffff', content: 'NG123456' }, - { position: 'bottom-right', width: 40, height: 30, fillColor: '#ffffff', content: 'NG123456' }, - { position: 'top-right', width: 40, height: 30, fillColor: '#ffffff', content: 'NG1234567' } - ] - }, - { - x: 1185, y: 380, width: 200, height: 300,fillColor: '#81b337', - items: [ - { position: 'bottom-right', width: 40, height: 30, fillColor: '#ffffff', content: 'NG123456' }, - { position: 'top-right',width: 40, height: 30, fillColor: '#ffffff', content: 'NG123456' }, - { position: 'top-left', width: 40, height: 30, fillColor: '#ffffff', content: 'NG1234567' }, - ] - } - - // Add more racks and items here as needed - ], - }; - }, - - methods: { - calculateItemXPosition(rack, item, index) { - if (item.position === 'top-right' || item.position === 'bottom-right') { - return Math.min(rack.x + rack.width - item.width, rack.x + rack.width); - } else { - return rack.x; - } - }, - - calculateItemYPosition(rack, item, index) { - if (item.position === 'bottom-left' || item.position === 'bottom-right') { - return Math.min(rack.y + rack.height - item.height, rack.y + rack.height); - } else { - return rack.y; - } - }, - - showCustomAlert(content) { - Swal.fire({ - // type: 'warning', // 寮规绫诲瀷 - title: '璇ョ墖鐜荤拑鐘舵��', //鏍囬 - // text: "娉ㄩ攢鍚庡皢鏃犳硶鎭㈠锛岃璋ㄦ厧鎿嶄綔锛�", //鏄剧ず鍐呭 - - confirmButtonColor: '#3085d6',// 纭畾鎸夐挳鐨� 棰滆壊 - confirmButtonText: '浜哄伐鎷胯蛋',// 纭畾鎸夐挳鐨� 鏂囧瓧 - showCancelButton: true, // 鏄惁鏄剧ず鍙栨秷鎸夐挳 - cancelButtonColor: '#d33', // 鍙栨秷鎸夐挳鐨� 棰滆壊 - cancelButtonText: "鐮存崯", // 鍙栨秷鎸夐挳鐨� 鏂囧瓧 - - // focusCancel: true, // 鏄惁鑱氱劍 鍙栨秷鎸夐挳 - reverseButtons: true // 鏄惁 鍙嶈浆 涓や釜鎸夐挳鐨勪綅缃� 榛樿鏄� 宸﹁竟 纭畾 鍙宠竟 鍙栨秷 -}).then((isConfirm) => { - try { - //鍒ゆ柇 鏄惁 鐐瑰嚮鐨� 纭畾鎸夐挳 - if (isConfirm.value) { - Swal.fire("浜哄伐鎷胯蛋", "鐐瑰嚮浜嗕汉宸ユ嬁璧�", "success"); - } - else { - Swal.fire("鐮存崯", "鐐瑰嚮浜嗙牬鎹�", "error"); - } - } catch (e) { - alert(e); +</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 currentstate = ref(null); +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 +const currentGlassRect = computed(() => { + return adjustedRects.value.find(rect => rect.glass_id === currentGlassId.value); +}); +function showDialog(glassId: number) { + currentGlassId.value = glassId; + blind.value = true; + adjustedRects.value = adjustedRects.value.map(rect => + rect.glass_id === glassId ? { ...rect, isActive: true } : rect + ); +} +const handleDialogClose = () => { + adjustedRects.value = adjustedRects.value.map(rect => ({ + ...rect, + isActive: false + })); +} +// 鐮存崯 +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', { + glassId: currentGlassId.value, + state: 8, + line: 1001, + workingProcedure: '璇嗗埆', + }) + if (response.code == 200) { + ElMessage.success(response.message); + // window.location.reload() + blind.value = false; + updateRectStatus(currentGlassId.value, 8); + } else { + // 璇锋眰澶辫触锛屾樉绀洪敊璇秷鎭� + ElMessage.error(response.msg); } -}); - }, - - showRectInfo(rectInfo) { - const contents = rectInfo.items.map(item => item.content).join(', '); - this.$nextTick(() => { - this.showCustomAlert(contents); - }); - }, +} +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', { + glassId: currentGlassId.value, + state: 9, + line: 1001, + workingProcedure: '璇嗗埆', + }) + 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) { + const rawRects = response.data[0]; + rawData.value = response.data; + totalPages.value = rawData.value.length; + const scaleFactor = 1621.78/6000; + const scaleFactory = 750/3300; + adjustedRects.value = rawRects.map(rect => ({ + ...rect, + x_axis: (6000 -(rect.x_axis + rect.width)) * scaleFactor, + y_axis: rect.y_axis * scaleFactory, + width: rect.width * scaleFactor , + widtha: rect.width , + heighta: rect.height , + height: rect.height * scaleFactory, + 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 + const scaleFactor = 1621.78/6000; + const scaleFactory = 750/3300; + adjustedRects.value = rawData.value[page]?.map(rect => ({ + // adjustedRects.value = rawRects.map(rect => ({ + ...rect, + x_axis: (6000 -(rect.x_axis + rect.width)) * scaleFactor, + y_axis: rect.y_axis * scaleFactory, + width: rect.width * scaleFactor , + widtha: rect.width , + heighta: rect.height , + height: rect.height * scaleFactory, + glass_state: rect.glass_state + })); }; -</script> +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'; + } +} +// 鏇存柊鐭╁舰鐘舵�� +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); + const scaleFactor = 1621.78/6000; + const scaleFactory = 750/3300; + if (data.currentCutTerritory && data.currentCutTerritory.length > 0) { + const newRects = data.currentCutTerritory[0].map(rect => { + const existingRect = adjustedRects.value.find(r => r.glass_id === rect.glass_id); + + if (existingRect) { + return { + ...existingRect, + x_axis: (6000 - (rect.x_axis + rect.width)) * scaleFactor, + y_axis: rect.y_axis * scaleFactory, + width: rect.width * scaleFactor, + height: rect.height * scaleFactory, + widtha: rect.width, + heighta: rect.height, + glass_state: rect.glass_state, + // 淇濇寔 isActive 鐘舵�佷笉鍙� + }; + } else { + // 濡傛灉涓嶅瓨鍦紝鍒欐坊鍔犳柊鐭╁舰锛岄粯璁� isActive 涓� false + return { + ...rect, + x_axis: (6000 - (rect.x_axis + rect.width)) * scaleFactor, + y_axis: rect.y_axis * scaleFactory, + width: rect.width * scaleFactor, + height: rect.height * scaleFactory, + widtha: rect.width, + heighta: rect.height, + glass_state: rect.glass_state, + isActive: false, + glass_id: rect.glass_id, + }; + } + }); + adjustedRects.value = newRects; + } else if (data.currentCutTerritory == '') { + adjustedRects.value = []; + } + }; + } +}; +onMounted(() => { + // 鍒濆鏃讹紝濡傛灉杈撳叆妗嗕负绌猴紝鍒欒繛鎺ebSocket + 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; /* 纭繚绠ご鍙互鐩稿浜庣煩褰㈠畾浣� */ + /* 鍏朵粬鏍峰紡 */ +} -<style scoped> -.glass-rack { - width: 100%; - height: 80vh; -} -.rack-rect:hover { - cursor: pointer; -} -.custom-popover-class { - background-color: lightgrey; - color: black; - border: 1px solid black; -} -</style> +#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> \ No newline at end of file -- Gitblit v1.8.0