wu
2024-08-22 cbec6e3f120344f6f2d69808aaabb447bb52a693
Merge remote-tracking branch 'origin/master'

# Conflicts:
# hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcScreenTask.java
34个文件已修改
7个文件已添加
1621 ■■■■ 已修改文件
UI-Project/config.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/companyInfo.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/constants.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Identify/identify.vue 95 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue 98 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/PrintCustomLabelSemi1.vue 227 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/PrintFlow.vue 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/UnLoadGlass/loadmachinerack.vue 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcTemperingGlass.json 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcdownGlass.json 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/OptimizeEngineering.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/EngineeringMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/xml/EngineeringMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Orderdetail.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/ReportingWorkController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/Reportingdamage.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/FlowCardMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/FlowCardService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/FlowCardServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/ReportingWorkServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/gateway/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassInfoController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassInfoService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/impl/DownWorkstationServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/Downpush.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownGlassInfoMapper.xml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/config.js
@@ -1,9 +1,9 @@
export default {
 serverUrl: "10.153.19.150:88/api",
//  serverUrl: "192.168.1.199:88/api",
//  serverUrl: "10.153.19.150:88/api",
 serverUrl: "192.168.1.199:88/api",
//  serverUrl: "127.0.0.1:88/api",
  serverUrl2: "10.153.19.150:88"
  // serverUrl2: "192.168.1.199:88"
  // serverUrl2: "10.153.19.150:88"
  serverUrl2: "192.168.1.199:88"
    // serverUrl2: "127.0.0.1:88"
  //serverUrl:"res.abeim.cn"
UI-Project/src/lang/companyInfo.js
@@ -42,8 +42,8 @@
            labelType3: '成品标签3',
            labelValue3:3,
            printFlowCard: {
                patch:'正品',
                lackOf:'次品',
                patch:'正',
                lackOf:'次',
                processingNote: (itemtextarea) => {
                    return  `${itemtextarea.processing_note}`
                },
UI-Project/src/utils/constants.js
@@ -1,4 +1,4 @@
//  export const WebSocketHost = "192.168.1.199";
export const WebSocketHost = "10.153.19.150";
 export const WebSocketHost = "192.168.1.199";
// export const WebSocketHost = "10.153.19.150";
// export const WebSocketHost = "127.0.0.1";
export const host = "88";
UI-Project/src/views/Identify/identify.vue
@@ -21,7 +21,7 @@
      @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)
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor(rect.glass_state)
       }"  
    >
     <!-- 箭头 -->  
@@ -34,7 +34,7 @@
  </div> 
   </div>
  </el-scrollbar>
  <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;">
  <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose">
        <el-button type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)"  style="width: 140px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
@@ -76,7 +76,16 @@
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  {
@@ -206,32 +215,74 @@
    }  
  });  
}
// 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;
//         adjustedRects.value = data.currentCutTerritory[0].map(rect => ({
//         ...rect,
//         x_axis: (6000 -(rect.x_axis + rect.width)) * scaleFactor,
//         y_axis: rect.y_axis * 0.17,
//         width: rect.width * scaleFactor ,
//         widtha: rect.width ,
//         heighta: rect.height ,
//         height: rect.height * 0.165 ,
//         glass_state: rect.glass_state,
//         isActive: false
//       }));
//     };
//     webSocket.onerror = (error) => {
//       console.error('WebSocket Error:', error);
//     };
//     webSocket.onclose = () => {
//       console.log('WebSocket Connection Closed');
//       // 可以选择重新连接
//     };
//   }
// };
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;
        adjustedRects.value = data.currentCutTerritory[0].map(rect => ({
        ...rect,
        x_axis: (6000 -(rect.x_axis + rect.width)) * scaleFactor,
        y_axis: rect.y_axis * 0.17,
        width: rect.width * scaleFactor ,
        widtha: rect.width ,
        heighta: rect.height ,
        height: rect.height * 0.165 ,
        glass_state: rect.glass_state
      }));
      const data = JSON.parse(event.data);
      const scaleFactor = 1621.78 / 6000;
      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 * 0.17,
            width: rect.width * scaleFactor,
            height: rect.height * 0.165,
            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 * 0.17,
            width: rect.width * scaleFactor,
            height: rect.height * 0.165,
            widtha: rect.width,
            heighta: rect.height,
            glass_state: rect.glass_state,
            isActive: false,
            glass_id: rect.glass_id,
          };
        }
      });
      adjustedRects.value = newRects;
    };  
    webSocket.onerror = (error) => {
      console.error('WebSocket Error:', error);
    };
    webSocket.onclose = () => {
      console.log('WebSocket Connection Closed');
      // 可以选择重新连接
    };
  }
  }
};  
  
onMounted(() => {  
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -25,9 +25,10 @@
const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/temperingGlass`;
const handleMessage = (data) => {
// 进炉中
  if(data.intoGlass!=null){
    adjustedRects1.value =  data.intoGlass[0].map(rect => {
      const scaleFactor =  794.67/5087;
  if(data.intoGlass2!=null){
    adjustedRects2.value =  data.intoGlass2[0].map(rect => {
        isActive: false
        const scaleFactor =  794.67/5087;
        let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
        let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -63,9 +64,10 @@
      }else{
        adjustedRects1.value = ''
      }
  if(data.intoGlass2!=null){
    adjustedRects2.value =  data.intoGlass2[0].map(rect => {
      const scaleFactor =  794.67/5087;
  if(data.intoGlass!=null){
      adjustedRects1.value =  data.intoGlass[0].map(rect => {
        isActive: false
        const scaleFactor =  794.67/5087;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
      let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -104,7 +106,8 @@
  // 进炉前
  if(data.waitingGlass!=null){
    adjustedRectsa.value = data.waitingGlass[0].map(rect => {  
      const scaleFactor =  1621.78/5190;
        isActive: false
        const scaleFactor =  1621.78/5190;
  let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;; 
  let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
@@ -143,8 +146,10 @@
    // 已出炉
  if(data.outGlass!=null){
    adjustedRectsb.value = data.outGlass[0].map(rect => {  
      const scaleFactor =  1621.78/5190;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta;;
        isActive: false
        const scaleFactor =  1621.78/5190;
      const scaleFactory =  550/2800;
      let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta,widtha,heighta,newY;
  let newX = rect.yCoordinate; 
      if (rect.width < rect.height) {
        widtha = rect.height;
@@ -155,21 +160,23 @@
      }
  if (rect.angle === 0) {  
    adjustedWidth = widtha * scaleFactor;  
    adjustedHeight = heighta * 0.16;
    adjustedHeight = heighta * scaleFactory;
    // adjustedWidtha = widtha;  
    // adjustedHeighta = heighta;  
    // newX = 5190 - (rect.yCoordinate + widtha); 
    newY = 2800 - (rect.xCoordinate + heighta);
  } else {  
    adjustedWidth = heighta * scaleFactor;  
    adjustedHeight = widtha * 0.16;
    adjustedHeight = widtha * scaleFactory;
    // adjustedWidtha = heighta;  
    // adjustedHeighta = widtha;  
    // newX = 5190 - (rect.yCoordinate + heighta);  
    newY = 2800 - (rect.xCoordinate + widtha);
  }  
  return {  
        ...rect, // 复制原始对象的其他属性  
        x: newX * scaleFactor,
        y: rect.xCoordinate * 0.16,
        y: newY * scaleFactory,
        width: adjustedWidth,  
        height: adjustedHeight,  
        widtha: rect.width, 
@@ -224,11 +231,56 @@
//   if (adjustedRects[0].engineerId != null) {
//     engineerIdDisplay = adjustedRects[0].engineerId
//   }
function showDialog(rect) {
function showDialog1(rect) {
  currentGlassId.value = rect.glassId;  
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;  
  blind.value = true;  
}
  adjustedRects1.value = adjustedRects1.value.map(rect =>
    rect.glass_id === glassId ? { ...rect, isActive: true } : rect
  );
}
function showDialog2(rect) {
  currentGlassId.value = rect.glassId;
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;
  blind.value = true;
  adjustedRects2.value = adjustedRects2.value.map(rect =>
    rect.glass_id === glassId ? { ...rect, isActive: true } : rect
  );
}
function showDialoga(rect) {
  currentGlassId.value = rect.glassId;
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;
  blind.value = true;
  adjustedRectsa.value = adjustedRectsa.value.map(rect =>
    rect.glass_id === glassId ? { ...rect, isActive: true } : rect
  );
}
function showDialogb(rect) {
  currentGlassId.value = rect.glassId;
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;
  blind.value = true;
  adjustedRectsb.value = adjustedRectsb.value.map(rect =>
    rect.glass_id === glassId ? { ...rect, isActive: true } : rect
  );
}
const handleDialogClose = () => {
  adjustedRects1.value = adjustedRects1.value.map(rect => ({
    ...rect,
    isActive: false
  }));
  // adjustedRects2.value = adjustedRects2.value.map(rect => ({
  //   ...rect,
  //   isActive: false
  // }));
  // adjustedRectsa.value = adjustedRectsa.value.map(rect => ({
  //   ...rect,
  //   isActive: false
  // }));
  adjustedRectsb.value = adjustedRectsb.value.map(rect => ({
    ...rect,
    isActive: false
  }));
}
// 破损
const handleDamage = async () => {
  try  {
@@ -274,14 +326,14 @@
      <div  
      v-for="(rect, index) in adjustedRects1"
      :key="index"  
      @click="showDialog(rect)"
      @click="showDialog1(rect)"
      class="rect"
      :style="{ position: 'absolute', 
       top: `${rect.ycoordinate}px`, 
       left: `${rect.xcoordinate}px`,
        width: `${rect.width}px`, 
        height: `${rect.height}px`,
        backgroundColor: rect.state === 5 ? '#911005' : 'lightblue' }"
        backgroundColor: rect.isActive ? '#ADFF2F' : rect.state === 5 ? '#911005' : 'lightblue' }"
    >
     <div  class="centered-text">
    <div >{{ rect.glassId }}</div>  
@@ -302,14 +354,14 @@
      <div  
      v-for="(rect, index) in adjustedRects2"
      :key="index"
      @click="showDialog(rect)"
      @click="showDialog2(rect)"
      class="rect"
      :style="{ position: 'absolute', 
       top: `${rect.ycoordinate}px`, 
       left: `${rect.xcoordinate}px`, 
       width: `${rect.width}px`, 
       height: `${rect.height}px`,
       backgroundColor: rect.state === 5 ? '#911005' : 'lightblue' }"
       backgroundColor: rect.isActive ? '#ADFF2F' : rect.state === 5 ? '#911005' : 'lightblue' }"
       >
     <div  class="centered-text">
    <div >{{ rect.glassId }}</div>  
@@ -334,11 +386,11 @@
      <div  
      v-for="(rect, index) in adjustedRectsa"  
      :key="index"  
      @click="showDialog(rect)"
      @click="showDialoga(rect)"
      class="rect"  
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: getRectColora(rect.state) }">
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColora(rect.state) }">
    <div  class="centered-text">
    <div>{{ rect.glassId }}</div>  
    <div >{{ rect.flowCardId }}</div>  
@@ -361,11 +413,11 @@
      <div  
      v-for="(rect, index) in adjustedRectsb"  
      :key="index"  
      @click="showDialog(rect)"
      @click="showDialogb(rect)"
      class="rect"  
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: getRectColorb(rect.state) }">
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColorb(rect.state) }">
       <!-- backgroundColor: rect.state === 4 ? '#911005' : '#f8e3c5' }"> -->
     <div  class="centered-text">
    <div >{{ rect.glassId }}</div>  
@@ -379,7 +431,7 @@
   </el-card>
</div>
 
<el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;">
<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>
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
@@ -4,18 +4,18 @@
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' :{
@@ -39,6 +39,7 @@
      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;
@@ -67,17 +68,79 @@
    height: adjustedHeight,  
    widtha: rect.width, 
    heighta: rect.height,
    // isActive: false,
  };  
});
  }
};
// const handleMessage = (data) => {
//   // 假设 data.overGlass[0] 是矩形数组
//   const newRects = data.overGlass[0].map(newRect => ({
//     ...newRect,
//     const scaleFactor = 1621.78 / 5190;
//     let widtha, heighta, adjustedWidth, adjustedHeight;
//     // 交换宽度和高度(如果矩形是“横向”的)
//     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;
//     }
//     // 注意:这里可能需要重新考虑 newX 的计算方式
//     // 暂时保留为原始 yCoordinate 的处理,但通常 x 坐标不应来自 y 坐标
//     let newX = rect.yCoordinate; // 可能是个错误,除非有特定用途
//     // 返回新的矩形对象
//     return {
//       ...rect, // 复制原始矩形的所有属性
//       xcoordinate: newX * scaleFactor, // 注意:这里的 newX 可能需要调整
//       ycoordinate: rect.xCoordinate * 0.16,
//       width: adjustedWidth,
//       height: adjustedHeight,
//       widtha,
//       heighta,
//       isActive: false, // 默认为非激活状态
//       // 可以添加其他需要的属性
//     }
//   }));
  // 使用新数据更新 adjustedRects
  // 注意:这里我们假设 adjustedRects.value 中的矩形也有 id 属性
//   adjustedRects.value = adjustedRects.value.map(oldRect => {
//     const updatedRect = newRects.find(newRect => newRect.id === oldRect.id);
//     if (updatedRect) {
//       // 如果找到了对应的矩形,则合并属性和保留原始激活状态(如果需要的话)
//       // 但在这个例子中,我们总是将 isActive 设置为 false
//       return {
//         ...oldRect,
//         ...updatedRect, // 合并新矩形的属性,但会覆盖 isActive
//         isActive: false, // 总是设置为 false,除非您有更复杂的逻辑
//       };
//     }
//     // 如果没有找到对应的矩形,则保留原样
//     return oldRect;
//   }).concat(newRects.filter(newRect => !adjustedRects.value.some(oldRect => oldRect.id === newRect.id)));
//   // concat 用于添加那些在 adjustedRects.value 中不存在的新矩形
// };
function updateRectColors() {  
  adjustedRects.value.forEach(rect => {  
    if (rect.glassId === glassId) {  
      rect.state = 8;
    }
  });  
}
}
function getRectColora(state) {  
  switch (state) { 
    case 3:  
@@ -89,10 +152,16 @@
  }  
}
function showDialog(rect) {  
  rect.isActive = true;
  currentGlassId.value = rect.glassId;  
  currenttemperingFeedSequence.value = rect.temperingFeedSequence;  
  blind.value = true;  
}  
const handleDialogClose = () => {
  adjustedRects.value.forEach(rect => {
    rect.isActive = false; // 关闭对话框时重置所有矩形的 isActive 状态
  });
};
// 破损
const handleDamage = async () => {
  try  {
@@ -130,7 +199,7 @@
  closeWebSocket();
});
</script>
<template>
  <div style="margin-top: 10px;">
<div>
@@ -147,7 +216,8 @@
      class="rect"  
      :style="{ position: 'absolute',  top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: getRectColora(rect.state) }">
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColora(rect.state)
      }">
     <div  class="centered-text">
    <div >{{ rect.glassId }}</div>  
    <div >{{ rect.flowCardId }}</div>  
@@ -160,15 +230,15 @@
   </div>
    </el-card>
    </div>
    <el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;">
    <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);
UI-Project/src/views/UnLoadGlass/PrintCustomLabelSemi1.vue
New file
@@ -0,0 +1,227 @@
<script setup>
import request from "@/utils/request"
import {ElDatePicker, ElMessage} from "element-plus"
import {nextTick, onMounted, onUnmounted, reactive, ref, watch} from "vue"
import {Search} from "@element-plus/icons-vue"
// import {useRouter} from 'vue-router'
// import {changeFilterEvent, filterChanged} from "@/hook"
// import {useI18n} from 'vue-i18n'
// import deepClone from "@/utils/deepClone";
import companyInfo from "@/lang/companyInfo"
const company = companyInfo()
//语言获取
const {t} = useI18n()
// let router = useRouter()
let produceList = ref([])
let labelList = ref([])
let titleList = ref([])
let dataList = ref([])
let list = ref([])
let lastList=ref([])
let filterData = ref({})
const data = ref({
  printList: []
})
// const {currentRoute} = useRouter()
// const route = currentRoute.value
// data.value.printList = JSON.parse(route.query.printList)
// const type = route.query.type
// const faceOrientation = route.query.faceOrientation
// const lableType = route.query.lableType
let props = defineProps({
  printFlowCardId: null,
  printLayer: null,
})
onMounted(async () => {
  console.log(props.printFlowCardId,props.printLayer)
  const response = await request.post('/unLoadGlass/downGlassInfo/downGlassLabelPrint',{
        flowCardId:props.printFlowCardId,
        layer:props.printLayer
    });
        if (response.code == 200) {
          console.log("lastList.value",response.data)
          lastList.value=response.data;
        } else {
          ElMessage.error(response.message);
        }
    }
)
// // 打印方法
// const printFlowCard = () => {
//   // 需要打印的局部区域赋予"print-wrap"的id
//   let el = document.getElementById("printFlowCard");
//   let doc = document;
//   let body = doc.body || doc.getElementsByTagName("body")[0];
//   let printId = "print-" + Date.now();
//   // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式)
//   let content = doc.createElement("div");
//   content.id = printId;
//   // 样式控制与打印无关的元素隐藏
//   let style = doc.createElement("style");
//   style.innerHTML =
//       "body>#" +
//       printId +
//       "{display:none}@media print{" +
//       "@page {" +
//       "    size: auto; " +
//       "    margin: 2mm 2mm 2mm 2mm;  " +
//       "  }body>:not(#" +
//       printId +
//       "){display:none !important}body>#" +
//       printId +
//       "{display:block;padding-top:1px}}";
//   //
//   content.innerHTML = el.outerHTML;
//   // // console.log("el.outerHTML", el.outerHTML);
//   body.appendChild(style);
//   // 与style元素设置的样式相配合
//   // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式)
//   body.appendChild(content);
//   setTimeout(() => {
//     window.print();
//     body.removeChild(content);
//     body.removeChild(style);
//   }, 20);
// }
</script>
<template>
  <!-- <el-button id="printButton" @click="printFlowCard();">打印</el-button> -->
  <div id="printFlowCard" >
    <template v-for="(item,index) in lastList">
    <div id="entirety" >
      <div class="row1">
        <div style="position: absolute;font-weight: bold;margin-left: 5px;" v-if="item.tempering_layout_id!=null">{{ item.tempering_layout_id }}/{{ item.tempering_feed_sequence }}</div>
        <span>{{ item.customer_name }}</span>&nbsp;
        <span>{{ item.order_id }}</span>
        <span v-if="item.process.includes('夹胶')">胶片</span>
        <span v-else-if="item.process.includes('中空')">中空</span>
<span v-else-if="item.process.includes('百叶')">百叶</span>
<span v-else></span>
        <div style="position: absolute;font-weight: bold;margin-left: 210px;margin-top: -26px;" >{{ index+1 }}</div>
      </div>
      <div  class="row2">
        <span>{{ item.project }}</span>&nbsp;
        <span>{{ item.building_number }}</span>
      </div>
      <div class="row3" v-if="item.other_columns!=null&&(JSON.parse(item.other_columns).S02!=null)">{{JSON.parse(item.other_columns).S02}}={{item.quantity}}</div>
      <div class="row3" v-else>{{Math.round(item.width)}}x{{Math.round(item.height)}}={{item.quantity}}</div>
      <div class="row5">
        <span>{{item.glass_child }}</span>&nbsp;
        <span>{{ item.processing_note }}</span>
      </div>
    </div>
    <div style="width: 20px" v-if="index%2===0"></div>
    <div class="print-page" v-else></div>
    </template>
  </div>
</template>
<style scoped>
* {
  margin: 0;
  padding: 0;
}
#printButton {
  /*margin-top: -20px;*/
  width: 100px;
}
#printFlowCard {
  display: flex;
  justify-content: left;
  flex-wrap: wrap;
  width: 500px;
}
#entirety{
  text-align: center;
  width: 46%;
  height: 170px;
  border: black 1px;
  word-wrap: break-word;
  margin-left: 10px;
}
.row1 {
  font-size: 12pt;
  font-weight: bold;
  height: 35px;
}
.row1 span {
  font-size: 12pt;
}
.row2 {
  font-size: 14pt;
  font-weight: bold;
  height: 35px;
}
.row2 span {
  font-size: 12pt;
}
span {
  font-size: 12pt;
  font-weight: bold;
}
.row3 {
  margin-top: -5px;
  height: 35px;
  font-size: 22pt;
  font-weight: bolder;
  line-height: 35px;
}
.row5 {
  height: 50px;
  font-weight: bold;
  font-size: 12pt;
  /* margin-left: 20px; */
}
.row5 span {
  font-size: 12pt;
}
.row6 {
  height: 15px;
  font-weight: bold;
  font-size: 8pt;
}
@media print {
  .print-page {
    page-break-after: always; /* 添加分页符,在每个print-page div之后分页 */
  }
  div {
    page-break-inside: avoid;
  }
  @page {
    size: auto;  /* auto is the initial value */
    margin: 2mm 2mm 2mm 2mm;  /* this affects the margin in the printer settings */
  }
}
</style>
UI-Project/src/views/UnLoadGlass/PrintFlow.vue
@@ -69,45 +69,6 @@
}
// const printFlowCard = () => {
//   // 需要打印的局部区域赋予"print-wrap"的id
//   let el = document.getElementById("printFlowCard");
//   let doc = document;
//   let body = doc.body || doc.getElementsByTagName("body")[0];
//   let printId = "print-" + Date.now();
//   // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式)
//   let content = doc.createElement("div");
//   content.id = printId;
//   // 样式控制与打印无关的元素隐藏
//   let style = doc.createElement("style");
//   style.innerHTML =
//       "body>#" +
//       printId +
//       "{display:none}@media print{" +
//       "@page {" +
//       "    size: auto; " +
//       "    margin: 5mm 5mm 5mm 5mm; " +
//       "  }body>:not(#" +
//       printId +
//       "){display:none !important}body>#" +
//       printId +
//       "{display:block;padding-top:1px}}";
//   //
//   content.innerHTML = el.outerHTML;
//   // // console.log("el.outerHTML", el.outerHTML);
//   body.appendChild(style);
//   // 与style元素设置的样式相配合
//   // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式)
//   body.appendChild(content);
//   setTimeout(() => {
//     window.print();
//     body.removeChild(content);
//     body.removeChild(style);
//   }, 20);
// }
onMounted(async () => {
  console.log(props.printFlowCardId,props.printLayer)
@@ -162,30 +123,20 @@
    <table v-for="(item,id) in produceList" id="contentTable" :key="id">
      <thead>
      <tr v-for="(itemFlow,index) in item.detail" :key="index">
        <td  v-if="like='1'"  colspan="26">
        <td  colspan="29">
          <div style="float: left;"><input style="border: none;font-size: 28px;width: 70px;margin: 5px  "/></div>
          <div id="bj" style="float: right;font-size: 28px">{{ id + 1 }}</div>
          <div>{{ company.companyName }}</div>
          <div>生产流程卡</div>
          <div v-if="itemFlow.technologyNumber!=''" style="text-align: right;font-weight: bolder">流程卡号: {{
          <div v-if="itemFlow.technologyNumberMerge!=''" style="text-align: right;font-weight: bolder">
            {{itemFlow.otherRemarks}}&nbsp;&nbsp;
            流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }}
            }}/{{ itemFlow.technologyNumberMerge }} 共 {{ flowCardCount }} 架
          </div>
          <div v-else style="text-align: right;font-weight: bolder">流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }}
          </div>
        </td>
        <td v-else colspan="24">
          <div style="float: left;"><input style="border: none;font-size: 28px;width: 70px  "/></div>
          <div id="bj" style="float: right;font-size: 28px">{{ id + 1 }}</div>
          <div>{{ company.companyName }}</div>
          <div>生产流程卡</div>
          <div v-if="itemFlow.technologyNumber!=''" style="text-align: right;font-weight: bolder">流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }} 共 {{ flowCardCount }} 架
          </div>
          <div v-else style="text-align: right;font-weight: bolder">流程卡号: {{
          <div v-else style="text-align: right;font-weight: bolder">
            {{itemFlow.otherRemarks}}&nbsp;&nbsp;
            流程卡号: {{
              itemFlow.process_id
            }}/{{ itemFlow.technologyNumber }} 共 {{ flowCardCount }} 架
          </div>
@@ -197,8 +148,7 @@
        <td class="tdNowrap">项目名称:</td>
        <td colspan="2">{{ items.project }}</td>
        <td class="tdNowrap">工艺流程:</td>
        <td colspan="19" v-if="like='1'" style="width: 500px">{{ items.process }}</td>
        <td colspan="17" v-else style="width: 500px">{{ items.process }}</td>
        <td colspan="22"  style="width: 500px">{{ items.process }}</td>
      </tr>
      <tr v-for="(itemTr,index) in item.detail" :key="index">
        <td class="tdNowrap">磨边类型:</td>
@@ -206,15 +156,13 @@
        <td class="tdNowrap">单片名称:</td>
        <td colspan="2">{{ itemTr.glass_child }}</td>
        <td class="tdNowrap">产品名称:</td>
        <td v-if="like=='1'" colspan="19">{{ itemTr.product_name }}</td>
        <td v-else colspan="17">{{ itemTr.product_name }}</td>
        <td colspan="22">{{ itemTr.product_name }}</td>
      </tr>
      <tr>
        <td rowspan='2'>序号</td>
        <td rowspan='2'>编号</td>
        <td v-if="like!=null" rowspan="2">小片顺序</td>
        <td v-else style="display: none;" rowspan="2">小片顺序</td>
        <td rowspan='2'>宽*高</td>
        <td rowspan="2">小片顺序</td>
        <td rowspan='2' style="width: 90px">宽*高</td>
        <td rowspan='2'>数量</td>
        <td rowspan='2'>面积</td>
        <td rowspan='2'>周长</td>
@@ -240,6 +188,10 @@
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
        <td>{{ company.printLabel.printFlowCard.patch }}</td>
        <td>{{ company.printLabel.printFlowCard.lackOf }}</td>
      </tr>
      </thead>
      <tbody>
@@ -247,16 +199,11 @@
      <tr v-for="(itemDatile,index) in item.detailList" :key="index">
        <td>{{ itemDatile.order_number }}</td>
        <td>{{ itemDatile.s01Value }}</td>
        <td v-if="like=='1'">{{ itemDatile.technology_number }}</td>
        <td v-else style="display: none"></td>
        <td>{{ itemDatile.technology_number }}</td>
        <td>{{ itemDatile.child_width }}</td>
        <td class="item" style="width: 5%;height: 100%;">
          <!-- <el-input v-model="itemDatile.quantity" style="border: none" @keyup="handleSummary()"></el-input> -->
          {{ itemDatile.quantity }}
          <input v-model="itemDatile.quantity" style="width: 100%;height: 100%"  @keyup="handleSummary()"/>
        </td>
        <!-- <td class="item" style="width: 5%;height: 100%;">
          {{ itemDatile.quantity1 }}
        </td> -->
        <td>{{ itemDatile.total_area }}</td>
        <td>{{ itemDatile.perimeter }}</td>
        <td>{{ itemDatile.bend_radius }}</td>
@@ -277,11 +224,15 @@
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
      </tr>
      </tbody>
      <tfoot>
      <tr style="height: 14px">
        <td v-for="(itemsum,index) in item.detail" :key="index" colspan="26">
        <td v-for="(itemsum,index) in item.detail" :key="index" colspan="29">
          数量:
          <label>{{ itemsum.quantity }}</label>
          面积:
@@ -291,17 +242,12 @@
        </td>
      </tr>
      <tr v-for="(itemtextarea,index) in item.detail" :key="index">
        <td v-if="like='1'" colspan="4" rowspan="6" style="width: 480px;height: 100px ">
          <div style="width: 100%;height: 100%;"><textarea style="height: 99%;width: 99%;border: none;;font-size: 11px">{{itemtextarea.otherRemarks}}</textarea>
          </div>
        </td>
        <td v-else colspan="6" rowspan="2" style="width: 480px;height: 100px ">
          <!--          <div style="width: 100%;height: 100%"><textarea style="height: 99%;width: 99%;font-size: 11px">{{ itemtextarea.processing_note }}</textarea>-->
          <!--          </div>-->
           <div style="width: 100%;height: 100%;"><textarea style="height: 99%;width: 99%;border: none;;font-size: 11px">{{itemtextarea.otherRemarks}}</textarea>
           </div>
        </td>
        <td colspan="2">完工签名</td>
        <td>完工签名</td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
@@ -314,7 +260,11 @@
        <td colspan="2"></td>
      </tr>
      <tr>
        <td colspan="2">生产日期</td>
        <td>生产日期</td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
@@ -327,7 +277,9 @@
        <td colspan="2"></td>
      </tr>
      <tr>
        <td colspan="2">质检签名</td>
        <td>质检签名</td>
        <td colspan="2"></td>
        <td colspan="2">生产签名</td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
@@ -338,9 +290,15 @@
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
        <td colspan="2"></td>
      </tr>
      <tr>
        <td>原片箱号</td>
        <td colspan="28"></td>
      </tr>
      <tr v-for="(qrCodeItem,index) in item.detail" :key="index">
        <td colspan="23">
        <td colspan="29">
          <span style="display: flex;">
            <span v-for="(qrCodeItems,index) in qrCodeItem.qrcodeList" :key="index" style="display: flex;width: 35%">
            <div class='qrCode' style="width: 80px;height: 80px;">
@@ -353,6 +311,12 @@
          </span>
        </td>
      </tr>
      <tr v-for="(itemtextareas,index) in item.detail" :key="index">
        <td  colspan="29" rowspan="6" style="width: 480px;height: 150px ">
          <div style="width: 100%;height: 100%;"><textarea style="height: 99%;width: 99%;border: none;;font-size: 12px;overflow: hidden;">{{itemtextareas.processing_note}}</textarea>
          </div>
        </td>
      </tr>
      </tfoot>
    </table>
@@ -368,8 +332,7 @@
#printFlowCard {
  text-align: center;
font-weight: bolder;
 height: 600px;
//font-weight: bolder; height: 600px;
}
#contentTable {
@@ -395,12 +358,10 @@
}
#contentTable tbody {
  white-space: nowrap;
}
.tdNowrap {
  white-space: nowrap;
}
@@ -410,17 +371,20 @@
}
input{
  font-weight: bolder;
  border: none;
  background: none;
}
@page {
  size: auto;  /* auto is the initial value */
  margin: 10mm 2mm 10mm 1mm;  /* this affects the margin in the printer settings */
}
@media print {
  @page {
    size: auto;
    margin: 4mm 5mm 5mm 5mm
  }
  table {
    page-break-before: always;
    page-break-inside: auto;
@@ -441,4 +405,6 @@
  height: 100%;
}
</style>
UI-Project/src/views/UnLoadGlass/loadmachinerack.vue
@@ -9,6 +9,7 @@
import PrintFlow from "@/views/UnLoadGlass/PrintFlow.vue";
import Landingindication from "./Landingindication.vue";
import Landingindicationtwo from "./Landingindicationtwo.vue";
import PrintLabel from "@/views/UnLoadGlass/PrintCustomLabelSemi1.vue";
const router = useRouter()
const {t} = useI18n()
@@ -36,6 +37,7 @@
const selectValuesa = reactive({});
const selectOptionsa = ref([]);
const dialogTableVisible = ref(false)
const dialogTableVisible1 = ref(false)
const printFlowCardId = ref('')
const printLayer = ref('')
const now = new Date();
@@ -107,7 +109,6 @@
      flowCardId: firstPart,
      layer: twoPart
    });
    console.log(response)
    if (response.code == 200) {
      // 绑定成功,处理逻辑
      console.log('绑定成功');
@@ -191,7 +192,7 @@
  // 更新 tableData 的数据
  if (data.downGlassInfos != null) {
    downGlass.value = data.downGlassInfos[0][1];
    downGlass.value = data.downGlassInfos[0];
  }
  if (data.engineerIdList != null) {
    selectOptionsa.value = data.engineerIdList[0]
@@ -294,15 +295,68 @@
  dialogTableVisible.value = true;
  setTimeout(() => {
    printFlowCard(); // 替换成你要执行的函数名
    dialogTableVisible.value = false;
    //dialogTableVisible.value = false;
  }, 1000);
  ;
}
const open1 = async (row) => {
printFlowCardId.value = row.flowCardId;
printLayer.value = row.layer
dialogTableVisible1.value = true;
setTimeout(() => {
  printFlowCard1(); // 替换成你要执行的函数名
  //dialogTableVisible1.value = false;
}, 1000);
}
const printFlowCard = () => {
  // 需要打印的局部区域赋予"print-wrap"的id
  let el = document.getElementById("child");
  let doc = document;
  let body = doc.body || doc.getElementsByTagName("body")[0];
  let printId = "print-" + Date.now();
  // 创建无副作用的打印容器(因不确定页面的打印元素有无其它样式)
  let content = doc.createElement("div");
  content.id = printId;
  alert(/Chrome/.test(userAgent) && !/Edge/.test(userAgent));
  // 样式控制与打印无关的元素隐藏
  let style = doc.createElement("style");
  console.log("style1:"+style.innerHTML)
  style.innerHTML =
      "body>#" +
      printId +
      "{display:none;}@media print{" +
      "@page {" +
      "    size: auto; " +
      "    margin: 10mm 5mm 10mm 5mm; " +
      "  }body>:not(#" +
      printId +
      "){display:none !important;}body>#" +
      printId +
      "{display:block;}#" +
      printId +
      "{display: block; padding: 0; margin: 0;  width: 100%;  position: absolute; top: 0; left: 0; height: 100vh;  box-sizing: border-box;}} ";
  content.innerHTML = el.outerHTML;
  // // console.log("el.outerHTML", el.outerHTML);
  body.appendChild(style);
  // 与style元素设置的样式相配合
  // 把打印内容的元素添加到body(作为body的子元素,可用body的子选择器 '>' 控制打印样式)
  body.appendChild(content);
  setTimeout(() => {
    window.print();
    body.removeChild(content);
    body.removeChild(style);
  }, 20);
}
const printFlowCard1 = () => {
  // 需要打印的局部区域赋予"print-wrap"的id
  let el = document.getElementById("printFlowCard");
  let doc = document;
  let body = doc.body || doc.getElementsByTagName("body")[0];
  let printId = "print-" + Date.now();
@@ -319,7 +373,7 @@
      "{display:none}@media print{" +
      "@page {" +
      "    size: auto; " +
      "    margin: 10mm 2mm 10mm 1mm; " +
      "    margin: 2mm 2mm 2mm 2mm;  " +
      "  }body>:not(#" +
      printId +
      "){display:none !important}body>#" +
@@ -341,6 +395,8 @@
}
// beforeUnmount(() => {
//   closeWebSocket();
// });
@@ -356,7 +412,7 @@
    <el-card style="flex: 1;" v-loading="loading">
      <el-card style="flex: 1;margin-left: 4px;margin-top: 1px;" v-loading="loading">
        <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
          <el-table height="200px" ref="table" @selection-change="handleSelectionChange" :data="tableData"
          <el-table height="350px" ref="table" @selection-change="handleSelectionChange" :data="tableData"
                    :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
            <el-table-column prop="workstationId" align="center" :label="$t('reportWork.lowerbit')" min-width="80"/>
            <el-table-column prop="workstationId" align="center" :label="$t('reportWork.shelfnumber')"
@@ -376,14 +432,15 @@
                </el-tag>
              </template>
            </el-table-column>
            <el-table-column fixed="right" :label="$t('reportWork.operate')" align="center" width="200">
            <el-table-column fixed="right" :label="$t('reportWork.operate')" align="center" width="400">
              <template #default="scope">
                <el-button size="mini" type="text" plain v-show="scope.row.enableState !== '已启用'"
                           @click="handleBindRack(scope.row)">{{ $t('reportWork.bindingshelves') }}
                </el-button>
                <el-button size="mini" type="text" plain @click="handleBindRack2(scope.row)">{{ $t('reportWork.clear')
                  }}</el-button>
                <el-button @click="open(scope.row)" :disabled="scope.row.flowCardId == null">打印</el-button>
                <el-button @click="open(scope.row)" :disabled="scope.row.flowCardId == null">打印流程卡</el-button>
                <el-button @click="open1(scope.row)" :disabled="scope.row.flowCardId == null">打印标签</el-button>
              </template>
            </el-table-column>
@@ -401,9 +458,6 @@
            <el-option label="5" value="5"></el-option>
            <el-option label="6" value="6"></el-option>
            <el-option label="7" value="7"></el-option>
            <el-option label="8" value="8"></el-option>
            <el-option label="9" value="9"></el-option>
            <el-option label="10" value="10"></el-option>
          </el-select>
          <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('basicData.plselectproject')" clearable
@@ -492,13 +546,14 @@
    </template>
  </el-dialog>
  <el-dialog id="sizePrintCalrd" v-model="dialogTableVisible" destroy-on-close style="width: 75%;height:75% ">
    <!-- <template #header="{ close, titleId, titleClass }">
        <el-button  @click="printFlowCard" >打印</el-button>
      </template> -->
  <el-dialog id="sizePrintCalrd" v-model="dialogTableVisible" destroy-on-close >
    <print-flow id="child" :printFlowCardId="printFlowCardId" :printLayer="printLayer"
                style="width: 100%;height: 100%"/>
  </el-dialog>
  <el-dialog id="sizePrintCalrd1" v-model="dialogTableVisible1" destroy-on-close >
    <print-label id="printFlowCard" :printFlowCardId="printFlowCardId" :printLayer="printLayer"
                style=""/>
  </el-dialog>
</template>
<style scoped>
hangzhoumesParent/JsonFile/PlcTemperingGlass.json
New file
@@ -0,0 +1,132 @@
{
    "plcAddressBegin": "DB88.0",
    "plcAddressLenght": "58",
    "dataType": "word",
    "parameteInfor": [
        {
            "codeId": "confirmationWord",
            "addressIndex": "0",
            "addressLenght": "2"
        },
        {
            "codeId": "temperingLayoutId",
            "addressIndex": "2",
            "addressLenght": "2"
        },
        {
            "codeId": "filmsid",
            "addressIndex": "4",
            "addressLenght": "2"
        },
        {
            "codeId": "temperingType",
            "addressIndex": "6",
            "addressLenght": "2"
        },
        {
            "codeId": "thickness",
            "addressIndex": "8",
            "addressLenght": "2"
        },
        {
            "codeId": "loadingRate",
            "addressIndex": "10",
            "addressLenght": "2"
        },
        {
            "codeId": "areaDifference",
            "addressIndex": "12",
            "addressLenght": "2"
        },
        {
            "codeId": "state",
            "addressIndex": "22",
            "addressLenght": "2"
        },
        {
            "codeId": "deviceState",
            "addressIndex": "24",
            "addressLenght": "2"
        },
        {
            "codeId": "resultState",
            "addressIndex": "26",
            "addressLenght": "2"
        },
        {
            "codeId": "loadSpeed",
            "addressIndex": "28",
            "addressLenght": "2"
        },
        {
            "codeId": "downSpeed",
            "addressIndex": "30",
            "addressLenght": "2"
        },
        {
            "codeId": "load1",
            "addressIndex": "32",
            "addressLenght": "2"
        },
        {
            "codeId": "heat1",
            "addressIndex": "34",
            "addressLenght": "2"
        },
        {
            "codeId": "heat2",
            "addressIndex": "36",
            "addressLenght": "2"
        },
        {
            "codeId": "cool1",
            "addressIndex": "38",
            "addressLenght": "2"
        },
        {
            "codeId": "cool2",
            "addressIndex": "40",
            "addressLenght": "2"
        },
        {
            "codeId": "downId",
            "addressIndex": "42",
            "addressLenght": "2"
        },
        {
            "codeId": "productionTime",
            "addressIndex": "44",
            "addressLenght": "2"
        },
        {
            "codeId": "heatEnergy",
            "addressIndex": "46",
            "addressLenght": "2"
        },
        {
            "codeId": "coolEnergy",
            "addressIndex": "48",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureUp1",
            "addressIndex": "50",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureDown1",
            "addressIndex": "52",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureUp2",
            "addressIndex": "54",
            "addressLenght": "2"
        },
        {
            "codeId": "temperatureDown2",
            "addressIndex": "56",
            "addressLenght": "2"
        }
    ]
}
hangzhoumesParent/JsonFile/PlcdownGlass.json
New file
@@ -0,0 +1,149 @@
{
    "plcAddressBegin": "DB11.0",
    "plcAddressLenght": "94",
    "dataType": "word",
    "parameteInfor": [
        {
            "codeId": "requestWord",
            "addressIndex": "0",
            "addressLenght": "2"
        },
        {
            "codeId": "requestID",
            "addressIndex": "2",
            "addressLenght": "30"
        },
        {
            "codeId": "currentCell",
            "addressIndex": "32",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus08",
            "addressIndex": "36",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus06",
            "addressIndex": "40",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus11",
            "addressIndex": "42",
            "addressLenght": "2"
        },
        {
            "codeId": "glassStatus13",
            "addressIndex": "44",
            "addressLenght": "2"
        },
        {
            "codeId": "G04_error_status",
            "addressIndex": "48",
            "addressLenght": "2"
        },
        {
            "codeId": "G05_error_status",
            "addressIndex": "50",
            "addressLenght": "2"
        },
        {
            "codeId": "G06_error_status",
            "addressIndex": "52",
            "addressLenght": "2"
        },
        {
            "codeId": "robot_error_status",
            "addressIndex": "54",
            "addressLenght": "2"
        },
        {
            "codeId": "G08_error_status",
            "addressIndex": "56",
            "addressLenght": "2"
        },
        {
            "codeId": "G09_error_status",
            "addressIndex": "58",
            "addressLenght": "2"
        },
        {
            "codeId": "G10_error_status",
            "addressIndex": "60",
            "addressLenght": "2"
        },
        {
            "codeId": "G11_error_status",
            "addressIndex": "62",
            "addressLenght": "2"
        },
        {
            "codeId": "robot_error_status",
            "addressIndex": "64",
            "addressLenght": "2"
        },
        {
            "codeId": "G13_error_status",
            "addressIndex": "66",
            "addressLenght": "2"
        },
        {
            "codeId": "confirmationWord",
            "addressIndex": "72",
            "addressLenght": "2"
        },
        {
            "codeId": "G06_prohibit_film_production",
            "addressIndex": "74",
            "addressLenght": "2"
        },
        {
            "codeId": "G11_prohibit_film_production",
            "addressIndex": "76",
            "addressLenght": "2"
        },
        {
            "codeId": "G13_prohibit_film_production",
            "addressIndex": "78",
            "addressLenght": "2"
        },
        {
            "codeId": "Glass_width",
            "addressIndex": "80",
            "addressLenght": "2"
        },
        {
            "codeId": "Glass_height",
            "addressIndex": "82",
            "addressLenght": "2"
        },
        {
            "codeId": "Glass_thickness",
            "addressIndex": "84",
            "addressLenght": "2"
        },
        {
            "codeId": "Start_cell",
            "addressIndex": "86",
            "addressLenght": "2"
        },
        {
            "codeId": "End_cell",
            "addressIndex": "88",
            "addressLenght": "2"
        },
        {
            "codeId": "task_type",
            "addressIndex": "90",
            "addressLenght": "2"
        },
        {
            "codeId": "alarm_signal",
            "addressIndex": "92",
            "addressLenght": "2"
        }
    ]
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/Engineering.java
New file
@@ -0,0 +1,101 @@
package com.mes.engineering.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
/**
 * <p>
 *
 * </p>
 *
 * @author wu
 * @since 2024-04-22
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class Engineering implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * 工程表id
     */
      @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 工程号
     */
    private String  engineerId;
    /**
     * 工程名称
     */
    private String engineerName;
    /**
     * 平均利用率
     */
    private double avgAvailability;
    /**
     * 有效利用率
     */
    private double validAvailability;
    /**
     * 尾片利用率
     */
    private double lastAvailability;
    /**
     * 状态
     */
    private Integer state;
    /**
     * 小片总数
     */
    private Integer glassTotal;
    /**
     * 小片总面积
     */
    private double glassTotalArea;
    /**
     * 计划原片总数
     */
    private Integer planPatternTotal;
    /**
     * 计划原片总面积
     */
    private double planPatternTotalArea;
    /**
     * 实际原片总数
     */
    private Integer realityPatternTotal;
    /**
     * 实际原片总面积
     */
    private double realityPatternTotalArea;
    /**
     * 膜系id
     */
    private String filmsId;
    /**
     * 备注
     */
    private String notes;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/entity/OptimizeEngineering.java
New file
@@ -0,0 +1,78 @@
package com.mes.engineering.entity;
import lombok.Getter;
import lombok.Setter;
/**
 * @author SNG-010
 */
@Setter
@Getter
public class OptimizeEngineering {
    // Getter methods
    // Setter methods
    /**
     * 工程号
     */
    private String projectNo;
    /**
     * 工程名
     */
    private String projectName;
    /**
     * 平均利用率
     */
    private double avgCutPct;
    /**
     * 有效利用率
     */
    private double validCutPct;
    /**
     * 尾片利用率
     */
    private double lastCutPct;
    /**
     * 状态
     */
    private Integer state;
    /**
     * 小片总数
     */
    private Integer glassTotal;
    /**
     * 小片总面积
     */
    private double glassTotalArea;
    /**
     * 计划原片总数
     */
    private Integer rawStockQty;
    /**
     * 计划原片总面积
     */
    private double rawStockArea;
    /**
     * 实际原片总数
     */
    private Integer actualStockQty;
    /**
     * 实际原片总面积
     */
    private double actualStockArea;
    /**
     * 膜系
     */
    private String glassType;
    /**
     * 备注
     */
    private  String remark;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/EngineeringMapper.java
New file
@@ -0,0 +1,17 @@
package com.mes.engineering.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.engineering.entity.Engineering;
/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author wu
 * @since 2024-04-22
 */
public interface EngineeringMapper extends MPJBaseMapper<Engineering> {
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/engineering/mapper/xml/EngineeringMapper.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mes.engineering.mapper.EngineeringMapper">
</mapper>
hangzhoumesParent/common/servicebase/src/main/java/com/mes/order/entity/Orderdetail.java
@@ -28,14 +28,6 @@
    private String project;
    /**
     * 流程卡号
     */
    private String processId;
    /**
     * 订单序号
     */
    private String orderNumber;
    /**
     * 产品名称
     */
    private String productName;
@@ -43,40 +35,30 @@
    /**
     * 宽
     */
    private double width;
    private String width;
    /**
     * 高
     */
    private double height;
    private String height;
    /**
     * 面积
     */
    private double area;
    /**
     * 数量
     */
    private Integer quantity;
    /**
     * 补片数量
     */
    private Integer numberPatches;
    /**
     * 已入数量
     */
    private Integer receivedQuantity;
    /**
     * 生产状态
     */
    private Integer terminationStatus;
    /**
     * 包装方式
     */
    private String packType;
    private Integer quantity;
    /**
     * 工程号
     * 状态
     */
    private String projectNo;
    private String processingNote;
    /**
     * 送货时间
     */
    private String deliveryDate;
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/controller/ReportingWorkController.java
@@ -27,15 +27,14 @@
    @Autowired
    private ReportingWorkService reportingWorkService;
    @ApiOperation("显示大屏显示扇形图信息")
    @ApiOperation("显示工程选择信息")
    @PostMapping("/selectDamage") //显示工程选择信息
    @ResponseBody
    public Result<List<Reportingdamage>> selectDamage(@RequestBody Reportingdamage reportingdamage) {
        log.info("将请求参数封装在请求类里面");
        List<Reportingdamage> glass = reportingWorkService.selectDamage(reportingdamage);
        log.info("显示大屏显示扇形图信息:{}", glass);
        log.info("显示工程选择信息:{}", glass);
        return Result.build(200, "", glass);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/request/Reportingdamage.java
@@ -31,10 +31,6 @@
     * 次破时间
     */
    private String reportingWorkTime;
    /**
     * 次破时间2
     */
    private String reportingWorkTime2;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/mapper/FlowCardMapper.java
@@ -22,4 +22,6 @@
    List<Map<String, Object>> selectProject(@Param("processId") String processId,@Param("technologyNumber") Integer technologyNumber);
    List<Map<String, Object>> selectFlowCard(@Param("processId") String processId,@Param("technologyNumber") Integer technologyNumber);
    List<Map<String, Object>> selectLabel(@Param("processId") String processId,@Param("technologyNumber") Integer technologyNumber);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/FlowCardService.java
@@ -19,4 +19,6 @@
    List<Map<String, Object>> selectProject(String processId, Integer technologyNumber);
    List<Map<String, Object>> selectFlowCard(String processId, Integer technologyNumber);
    List<Map<String, Object>> selectLabel(String processId, Integer technologyNumber);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/FlowCardServiceImpl.java
@@ -29,4 +29,9 @@
    public List<Map<String, Object>> selectFlowCard(String processId, Integer technologyNumber){
        return baseMapper.selectFlowCard(processId, technologyNumber);
    }
    @Override
    public List<Map<String, Object>> selectLabel(String processId, Integer technologyNumber){
        return baseMapper.selectLabel(processId, technologyNumber);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/service/impl/ReportingWorkServiceImpl.java
@@ -42,7 +42,6 @@
                //.eq("this_process", reportingdamage.getThisProcess())
                //.eq("device_name",reportingdamage.getDeviceName())
                .ge("reporting_work_time", reportingdamage.getReportingWorkTime())
                .le("reporting_work_time",reportingdamage.getReportingWorkTime2())
                .groupBy("this_process");
        return reportingDamageMapper.selectList(queryWrapper);
    }
hangzhoumesParent/common/servicebase/src/main/resources/mapper/FlowCardMapper.xml
@@ -68,6 +68,38 @@
        group by fc.process_id
    </select>
    <select id="selectLabel" resultType="java.util.Map">
        select fc.process_id,
               o.order_id,
               o.project,
               o.customer_id,
               ogd.child_width                as width,
               ogd.child_height               as height,
               od.quantity,
               od.order_number                as orderNumber,
               fc.technology_number           as technologyNumber,
               ogd.glass_child,
               ogd.process,
               c.customer_abbreviation        as customer_name,
               ifnull(od.processing_note, '') as processing_note,
               bgt.type_name,
               od.other_columns,
               od.building_number,
               od.bend_radius
        from sd.order as o
                 left join sd.order_detail as od on o.order_id = od.order_id
                 left join sd.order_glass_detail as ogd
                           on ogd.order_id = od.order_id and ogd.order_number = od.order_number
                 left join pp.flow_card as fc on o.order_id = fc.order_id and
                                                 od.order_number = fc.order_number and
                                                 fc.technology_number = ogd.technology_number
                 left join sd.product pt on pt.id = od.product_id
                 left join sd.customer c on c.id = o.customer_id
                 left join sd.basic_glass_type bgt on bgt.type_id = pt.type_id
        where fc.process_id = #{processId}
          and fc.technology_number = #{technologyNumber}
        group by od.order_number, od.width, od.height
    </select>
</mapper>
hangzhoumesParent/gateway/src/main/resources/application.yml
@@ -6,7 +6,7 @@
  cloud:
    nacos:
      discovery:
        server-addr: 10.153.19.150:8848
        server-addr: 127.0.0.1:8848
    gateway:
      discovery:
        locator:
hangzhoumesParent/moduleService/CacheGlassModule/src/main/resources/application.yml
@@ -3,7 +3,7 @@
spring:
  profiles:
    active: prod
    active: dev
  application:
    name: cacheGlass
mybatis-plus:
hangzhoumesParent/moduleService/CacheGlassModule/src/test/java/com/mes/CacheGlassModuleApplicationTest.java
@@ -144,12 +144,12 @@
    @Test
    public void testidentWorn() {
        Map<String, String> arguments=new HashMap<>();
        arguments.put("glassId","P24060403|3|6");//玻璃ID
        arguments.put("controlsId","300");        //拿走:200/破损:201
        arguments.put("line","2001");             //线路:
        arguments.put("machine","冷加工");           //设备名称:
//        edgStorageCageDetailsService.identWorn(arguments);
        Map<String, Object> arguments=new HashMap<>();
        arguments.put("glassId","NG24051802A002-1-4-2-4");//玻璃ID
        arguments.put("state","8");        //拿走:200/破损:201
        arguments.put("line","1001");             //线路:
        arguments.put("workingProcedure","识别");           //设备名称:
        edgStorageCageDetailsService.identWorn(arguments);
        log.info("识别台【破损/拿走】:{}", 1);
    }
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -544,7 +544,7 @@
        //1、获取任务表中相邻玻璃
        List<EdgGlassTaskInfo> edgGlassTaskInfoList = edgGlassTaskInfoService.list(new LambdaQueryWrapper<EdgGlassTaskInfo>()
                .eq(EdgGlassTaskInfo::getLine, line)
                .apply("time >= (select time from edg_glass_task_info where glass_id = '" + glassId + "' and deleted = 0)")
                .apply("time >= (select time from edg_glass_task_info where line='" + line + "' and glass_id = '" + glassId + "' and deleted = 0)")
                .orderByAsc(EdgGlassTaskInfo::getTime));
        Assert.isFalse(CollectionUtils.isEmpty(edgGlassTaskInfoList), "识别玻璃信息未出现在尺寸表中,获取相邻两块玻璃失败");
        //2、获取卧转立剩余宽度
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml
@@ -3,7 +3,7 @@
spring:
  profiles:
    active: cz
    active: dev
  application:
    name: cacheVerticalGlass
mybatis-plus:
@@ -17,6 +17,6 @@
  carWidth: 5000   #大车宽度
  slotWidth: 5000   #大车宽度
  inCarMaxSize: 3     #进片大车最大存放玻璃数量
  outCarMaxSize: 3     #出片大车最大存放玻璃数量
  outCarMaxSize: 2     #出片大车最大存放玻璃数量
  glassGap: 350  #玻璃间距
  xMaxSize: 2850
hangzhoumesParent/moduleService/GlassStorageModule/src/main/resources/application.yml
@@ -3,7 +3,7 @@
spring:
  profiles:
    active: prod
    active: dev
  application:
    name: glassStorage
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java
@@ -166,12 +166,12 @@
            }
        }
    }
    @Scheduled(fixedDelay = 10000)
    @Scheduled(fixedDelay = 1000)
    public void loadGlassIsRun() {
        JSONObject jsonObject = new JSONObject();
        //是否开始工程
        Engineering engineering = engineeringService.selectInitiate(1);
        jsonObject.append("engineering", engineering);
            jsonObject.append("engineering", engineering);
        //工位信息
        List<UpWorkstation> upWorkstations = upWorkstationService.list();
        jsonObject.append("list", upWorkstations);
hangzhoumesParent/moduleService/LoadGlassModule/src/main/resources/application.yml
@@ -2,7 +2,7 @@
  port: 8083
spring:
  profiles:
    active: cz
    active: dev
  application:
    name: loadGlass
mybatis-plus:
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java
@@ -1,5 +1,10 @@
package com.mes.job;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.mes.common.config.Const;
import com.mes.damage.entity.Damage;
import com.mes.damage.service.DamageService;
import com.mes.temperingglass.service.TemperingGlassInfoService;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.tools.WebSocketServer;
@@ -10,6 +15,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author SNG-010
@@ -20,24 +26,27 @@
    @Autowired
    private TemperingGlassInfoService temperingAgoService;
    @Autowired
    private DamageService damageService;
    /**
     * fixedRate : 上一个调用开始后再次调用的延时(不用等待上一次调用完成)
     * fixedDelay : 上一个调用结束后再次调用的延时
     */
    @Scheduled(fixedDelay = 1000)
    public void temperingGlassHome(){
    public void temperingGlassHome() {
        JSONObject jsonObject = new JSONObject();
        //正在等待进片的玻璃
        List<TemperingGlassInfo> waitingGlass = temperingAgoService.selectWaitingGlass();
        if(waitingGlass!=null){
        if (waitingGlass != null) {
            jsonObject.append("waitingGlass", waitingGlass);
        }
        //获取整在炉中的两个版图id
        List<TemperingGlassInfo> layoutId = temperingAgoService.selectLayoutId();
        //进炉中的玻璃
        if(!layoutId.isEmpty()) {
        if (!layoutId.isEmpty()) {
            List<TemperingGlassInfo> intoGlass = temperingAgoService.selectIntoGlass(layoutId.get(0));
            jsonObject.append("intoGlass", intoGlass);
            //进炉中的第二个版图
@@ -48,7 +57,7 @@
        }
        //出炉后的玻璃
        List<TemperingGlassInfo> outGlass = temperingAgoService.selectOutGlass();
        if(outGlass!=null){
        if (outGlass != null) {
            jsonObject.append("outGlass", outGlass);
        }
@@ -57,7 +66,27 @@
        if (outGlass != null) {
            jsonObject.append("overGlass", overGlass);
        }
        //当前钢化工程的拿走数据
        LambdaQueryWrapper<TemperingGlassInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.select(TemperingGlassInfo::getEngineerId)
                .lt(TemperingGlassInfo::getState, Const.TEMPERING_END)
                .groupBy(TemperingGlassInfo::getEngineerId);
        List<String> engineerIds = temperingAgoService.list(queryWrapper)
                .stream()
                .map(TemperingGlassInfo::getEngineerId)
                .distinct()
                .collect(Collectors.toList());
        List<Damage> temperingTakeGlassInfos = damageService.list(
                new LambdaQueryWrapper<Damage>()
                        .in(Damage::getEngineerId, engineerIds)
                        .eq(Damage::getType, Const.GLASS_STATE_TAKE)
                        .orderByAsc(Damage::getId)
        );
        jsonObject.append("temperingTakeGlassInfos", temperingTakeGlassInfos);
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("temperingGlass");
        if (sendwServer != null) {
@@ -70,12 +99,15 @@
            }
        }
    }
    @Scheduled(fixedDelay = 1000)
    public void temperingIsRun(){
    public void temperingIsRun() {
        JSONObject jsonObject = new JSONObject();
        //正在进行的任务
        List<TemperingGlassInfo>temperingTaskType=temperingAgoService.selectTaskType();
        List<TemperingGlassInfo> temperingTaskType = temperingAgoService.selectTaskType();
        jsonObject.append("temperingTaskType", temperingTaskType);
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("temperingIsRun");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
@@ -86,6 +118,7 @@
                }
            }
        }
    }
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application.yml
@@ -2,7 +2,7 @@
  port: 8084
spring:
  profiles:
    active: prod
    active: dev
  application:
    name: temperingGlass
mybatis-plus:
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/controller/DownGlassInfoController.java
@@ -37,4 +37,9 @@
        return Result.build(200, "查询成功", downGlassInfoService.downGlassPrint(downGlassInfo));
    }
    @PostMapping("/downGlassLabelPrint")
    public Result downGlassLabelPrint(@RequestBody DownGlassInfo downGlassInfo) {
        return Result.build(200, "查询成功", downGlassInfoService.downGlassLabelPrint(downGlassInfo));
    }
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java
@@ -7,6 +7,7 @@
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Map;
@Repository
public interface DownGlassInfoMapper extends BaseMapper<DownGlassInfo> {
@@ -42,4 +43,13 @@
     * @return
     */
    List<DownGlassInfoDTO> queryWorkStationFlowCard(@Param(value = "workList") List<Integer> workList);
    /**
     * 获取下片信息
     *
     * @param processId,technologyNumber
     * @return
     */
    List<Map<String, Object>> downGlassLabelPrint(@Param("processId") String processId, @Param("technologyNumber") Integer technologyNumber);
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/DownGlassInfoService.java
@@ -60,9 +60,26 @@
     */
    String setDownGlassInfoRequest(DownGlassInfoRequest request);
    /**
     * 流程卡打印查询
     *
     * @param downGlassInfo
     * @return
     */
    List<Map<String, List<Map<String, Object>>>> downGlassPrint(DownGlassInfo downGlassInfo);
    /**
     * 工位是否满架查询
     *
     * @return
     */
    List<DownWorkstation> queryWorkStationIsFull();
    /**
     * 标签打印查询
     *
     * @param downGlassInfo
     * @return
     */
    List<Map<String, Object>> downGlassLabelPrint(DownGlassInfo downGlassInfo);
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassInfoServiceImpl.java
@@ -158,9 +158,10 @@
        queryWrapper.eq("flow_card_id", downGlassInfo.getFlowCardId())
                .eq("layer", downGlassInfo.getLayer())
                .select("flow_card_id", "layer", "width", "height", "filmsid", "thickness", "glass_type", "COUNT(*) AS quantity")
                .groupBy("flow_card_id", "layer", "width", "height", "filmsid", "thickness", "glass_type","id")
                .groupBy("flow_card_id", "layer", "width", "height", "filmsid", "thickness", "glass_type", "id")
                .orderByAsc("id");
        List<Map<String, Object>> resultList = baseMapper.selectMaps(queryWrapper);
        log.info("MES落架数据:{}", resultList);
        List<Map<String, Object>> projectInfo = flowCardService.selectProject(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer());
@@ -220,4 +221,66 @@
        listMap.add(result);
        return listMap;
    }
    @Override
    public List<Map<String, Object>> downGlassLabelPrint(DownGlassInfo downGlassInfo) {
        //获取下片玻璃的顺序
//        QueryWrapper<DownGlassInfo> queryWrapper = Wrappers.query();
//        queryWrapper
//                .eq("flow_card_id", downGlassInfo.getFlowCardId())
//                .eq("layer", downGlassInfo.getLayer())
//                .select("flow_card_id", "layer", "width", "height", "filmsid", "thickness", "glass_type", "COUNT(*) AS quantity")
//                .groupBy("flow_card_id", "layer", "width", "height", "filmsid", "thickness", "glass_type", "id")
//                .orderByAsc("id");
//        List<Map<String, Object>> resultList = baseMapper.selectMaps(queryWrapper);
        List<Map<String, Object>> resultList = baseMapper.downGlassLabelPrint(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer());
        log.info("MES落架数据:{}", resultList);
        //获取ERP标签所需的信息
        List<Map<String, Object>> labelInfo = flowCardService.selectLabel(downGlassInfo.getFlowCardId(), downGlassInfo.getLayer());
        log.info("标签数据:{}", labelInfo);
        for (Map<String, Object> row : resultList) {
            int glass_type = (int) row.get("glass_type");
            int layer = (int) row.get("layer");
            for (Map<String, Object> row1 : labelInfo) {
                int orderNumber = (int) row1.get("orderNumber");
                int technologyNumber = (int) row1.get("technologyNumber");
                if (orderNumber == glass_type && technologyNumber == layer) {
                    String order_id = (String) row1.get("order_id");
                    String project = (String) row1.get("project");
                    Long customer_id = (Long) row1.get("customer_id");
                    BigDecimal width = (BigDecimal) row1.get("width");
                    BigDecimal height = (BigDecimal) row1.get("height");
                    Long quantity = (Long) row1.get("quantity");
                    String glass_child = (String) row1.get("glass_child");
                    String process = (String) row1.get("process");
                    String customer_name = (String) row1.get("customer_name");
                    String processing_note = (String) row1.get("processing_note");
                    String other_colunmns = (String) row1.get("other_colunmns");
                    String building_number = (String) row1.get("building_number");
                    String bend_radius = (String) row1.get("bend_radius");
                    row.put("orderNumber", orderNumber);
                    row.put("technology_number", technologyNumber);
                    row.put("order_id", order_id);
                    row.put("project", project);
                    row.put("customer_id", customer_id);
                    row.put("width", width);
                    row.put("height", height);
                    row.put("quantity", quantity);
                    row.put("glass_child", glass_child);
                    row.put("process", process);
                    row.put("customer_name", customer_name);
                    row.put("processing_note", processing_note);
                    row.put("other_colunmns", other_colunmns);
                    row.put("building_number", building_number);
                    row.put("bend_radius", bend_radius);
                }
            }
        }
        return resultList;
    }
}
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downworkstation/service/impl/DownWorkstationServiceImpl.java
@@ -86,7 +86,7 @@
            item.put("width", downWorkstionAndDownGlassinfo.getTotalwidth());
            item.put("fillColor", "yellow");
            item.put("content", downWorkstionAndDownGlassinfo.getFlowCardId());
            if (downWorkstionAndDownGlassinfo.getFlowCardId()!=""&&downWorkstionAndDownGlassinfo.getFlowCardId()!=null&&downWorkstionAndDownGlassinfo.getTotalQuantity() == downWorkstionAndDownGlassinfo.getRacksNumber() + downWorkstionAndDownGlassinfo.getRacksNumber()) {
            if (downWorkstionAndDownGlassinfo.getFlowCardId() != "" && downWorkstionAndDownGlassinfo.getFlowCardId() != null && downWorkstionAndDownGlassinfo.getTotalQuantity() == downWorkstionAndDownGlassinfo.getRacksNumber() + downWorkstionAndDownGlassinfo.getRacksNumber()) {
                item.put("fullCardColor", "red");
            } else {
                item.put("fullCardColor", "blue");
@@ -170,6 +170,8 @@
        updateWrapper.set("flow_card_id", null)
                .set("total_quantity", 0)
                .set("racks_number", 0)
                .set("other_number", 0)
                .set("layer", null)
                .eq("workstation_id", workstationId);
        baseMapper.update(new DownWorkstation(), updateWrapper);
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/Downpush.java
@@ -128,11 +128,11 @@
            wrapper.eq(DownGlassInfo::getWorkStationId, request.getWorkStationId());
        }
        List<DownGlassInfo> downGlassInfos = downGlassInfoService.list(wrapper);
        Map<Integer, List<DownGlassInfo>> listMap = downGlassInfos.stream().collect(Collectors.groupingBy(DownGlassInfo::getWorkStationId));
//        Map<Integer, List<DownGlassInfo>> listMap = downGlassInfos.stream().collect(Collectors.groupingBy(DownGlassInfo::getWorkStationId));
        List<Object> engineerIdListTemp = downGlassInfoService.listObjs(new QueryWrapper<DownGlassInfo>().select("distinct engineer_id"));
        List<String> engineerIdList = engineerIdListTemp.stream().map(String::valueOf).collect(Collectors.toList());
        JSONObject jsonObject4 = new JSONObject();
        jsonObject4.append("downGlassInfos", listMap);
        jsonObject4.append("downGlassInfos", downGlassInfos);
        jsonObject4.append("engineerIdList", engineerIdList);
        //钢化开关
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/application.yml
@@ -10,8 +10,8 @@
mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#  configuration:
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mes:
  maxWidth: 2500    #下片的最大宽度
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/resources/mapper/DownGlassInfoMapper.xml
@@ -90,4 +90,99 @@
        </foreach>
        ORDER BY T.RACKS_NUMBER DESC
    </select>
    <select id="selectFlowCard" resultType="java.util.Map">
        select fc.order_number,
               concat(round(ogd.child_width), "*", round(ogd.child_height))   as child_width,
               od.quantity,
               round(ogd.total_area, 2)                                       as total_area,
               od.perimeter,
               od.bend_radius,
               concat(IFNULL(od.processing_note, ''), IFNULL(od.remarks, '')) as remarks,
               od.other_columns,
               round(ogd.child_width)                                         as width,
               round(ogd.child_height)                                        as height,
               pd.separation,
               fc.technology_number
        from pp.flow_card as fc
                 left join sd.order_glass_detail as ogd
                           on fc.order_id = ogd.order_id and fc.order_number = ogd.order_number and
                              fc.technology_number = ogd.technology_number
                 left join sd.order_detail as od on od.order_id = fc.order_id and od.order_number = fc.order_number
                 left join sd.product_detail as pd
                           on pd.prod_id = od.product_id and pd.glass_sort = ogd.technology_number
        where fc.process_id = #{processId}
          and position(fc.technology_number in #{technologyNumber})
        group by fc.process_id, fc.order_number, fc.technology_number
        order by IF(sort != NULL || sort != '', sort, fc.order_number)
    </select>
    <select id="selectProject" resultType="java.util.Map">
        select o.customer_name,
               o.project,
               (select process
                from sd.order_glass_detail
                where order_id = fc.order_id
                  and order_number = fc.order_number
                  and technology_number = fc.technology_number) as process,
               od.edging_type,
               (select glass_child
                from sd.order_glass_detail
                where order_id = fc.order_id
                  and order_number = fc.order_number
                  and technology_number = fc.technology_number) as glass_child,
               od.product_name,
               o.processing_note,
               fc.process_id,
               SUM(od.quantity)                                 as quantity,
               round(SUM(ogd.total_area), 2)                    as gross_area,
               sum(od.weight)                                   as weight,
               1                                                as technologyNumber,
               concat(fc.process_id, '/', 1)                    as processIdNumber,
               concat('对应我司单号', o.batch)                        AS otherRemarks
        from pp.flow_card as fc
                 left join sd.order_glass_detail as ogd
                           on fc.order_id = ogd.order_id and fc.order_number = ogd.order_number and
                              fc.technology_number = ogd.technology_number
                 left join sd.order_detail as od on od.order_id = fc.order_id and od.order_number = fc.order_number
                 left join sd.`order` as o on o.order_id = fc.order_id
                 left join sd.product as p on p.id = od.product_id
                 left join (select ogd.order_id,
                                   ogd.order_number,
                                   ogd.technology_number,
                                   ogd.glass_child,
                                   GROUP_CONCAT(glass_child SEPARATOR ' ') AS concatenated_glass_child
                            from sd.order_glass_detail as ogd
                            where ogd.order_id = left (#{processId}
                                , 10)
                              and position (ogd.technology_number in #{technologyNumber})
                            GROUP BY order_id, order_number) as ogdc
                           on ogdc.order_id = ogd.order_id and ogdc.order_number = ogd.order_number and
                              ogdc.technology_number = ogd.technology_number
        where fc.process_id = #{processId}
          and position(fc.technology_number in #{technologyNumber})
        group by fc.process_id
    </select>
    <select id="downGlassLabelPrint" resultType="java.util.Map">
        select a.flow_card_id,
               a.layer,
               a.width,
               a.height,
               a.filmsid,
               a.thickness,
               a.glass_type,
               COUNT(*) AS quantity,
               b.tempering_layout_id,
               b.tempering_feed_sequence
        from down_glass_info a
                 inner join glass_info b on a.glass_id = b.glass_id
        where a.flow_card_id = #{processId}
          and a.layer = #{technologyNumber}
        group by a.flow_card_id, a.layer, a.width, a.height, a.filmsid, a.thickness, a.glass_type, a.id
        order by a.id
    </select>
</mapper>