wuyouming666
2024-07-24 c531149478942c18ccf99c2533b7b5fd8edc91b9
Merge branch 'master' of http://10.153.19.25:10101/r/HangZhouMes
45个文件已修改
6 文件已重命名
2个文件已添加
1481 ■■■■ 已修改文件
UI-Project/src/assets/shangpian.png 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/utils/WebSocketService.js 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue 234 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/ReportWork/reportWork.vue 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/returns.vue 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Slicecage/slicecage.vue 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/controller/DamageController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/mapper/DamageMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/controller/WorkAssignmentController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/mapper/WorkAssignmentMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageDTO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/common/S7object.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcSlicecage.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcScreenTask.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/controller/TemperingRecordController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/entity/TemperingRecord.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/TemperingRecordMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/xml/TemperingRecordMapper.xml 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/TemperingRecordService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/impl/TemperingRecordServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/json/PlcTemperingGlass.json 132 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/assets/shangpian.png
UI-Project/src/lang/zh.js
@@ -205,6 +205,12 @@
        down:'下一页',
        now:'当前页显示',
        tit:'条数据',
        temperingqueries:'钢化查询',
        specifytempering:'指定钢化',
        projectnumber:'工程号',
        layoutnumber:'钢化版图号',
        numberglasses:'玻璃数量',
        specifytemperinga:'是否指定钢化该条信息?',
    },
    workOrder:{
        glassID:'玻璃ID',
UI-Project/src/utils/WebSocketService.js
@@ -1,7 +1,7 @@
// WebSocketService.js
let socket = null;
let messages = '';
export const initializeWebSocket = (socketUrl, messageHandler) => {
    if (typeof WebSocket === "undefined") {
      console.log("Your browser does not support WebSocket");
@@ -18,13 +18,24 @@
      if (!msg.data) {
        return;
      }
      const obj = JSON.parse(msg.data);
      messages += msg.data;
      const isLastChunk = msg.data.endsWith('<END>');
      //是否为最后一块消息
      if(isLastChunk) {
        messages= messages.replace('<END>', '');
        const obj = JSON.parse(messages);
  
      // 调用消息处理函数,将数据传递给 Vue 组件
      if (messageHandler) {
        messageHandler(obj);
      }
        messages='';
      }
    };
  
    return socket;
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -9,9 +9,10 @@
  import { useI18n } from 'vue-i18n'
  const { t } = useI18n()
  let language = ref(localStorage.getItem('lang') || 'zh')
const dialogFormVisible = ref(true)
const dialogFormVisiblea = ref(false)
const dialogFormVisible = ref(false)
const dialogFormVisiblea = ref(true)
const dialogFormVisibleb = ref(false)
const blind = ref(false)
const width = ref();
const height = ref();
const adjustedRects = ref([]);
@@ -21,51 +22,137 @@
const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/temperingGlass`;
const handleMessage = (data) => {
// 进炉中
  adjustedRects.value =  data.intoGlass[0].map(rect => ({
  if(data.intoGlass!=null){
    adjustedRects.value =  data.intoGlass[0].map(rect => {
        let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta;
        let newX = rect.yCoordinate;
  if (rect.angle === 0) {
          adjustedWidth = rect.height * 0.12;
          adjustedHeight = rect.width * 0.1;
          adjustedWidtha = rect.height;
          adjustedHeighta = rect.width;
          newX = 5087 - (rect.xCoordinate + rect.height);
        } else {
          adjustedWidth = rect.width * 0.12;
          adjustedHeight = rect.height * 0.1;
          adjustedWidtha = rect.width;
          adjustedHeighta = rect.height;
          newX = 5087 - (rect.xCoordinate + rect.width);
        }
        return {
        ...rect, 
        xcoordinate: rect.xCoordinate * 0.3,
        ycoordinate: rect.ycoordinate * 0.3,
        width: rect.width * 0.2,
        height: rect.height * 0.2,
        widtha: rect.width,
        heighta: rect.height,
      }));
  adjustedRects2.value =  data.intoGlass2[0].map(rect => ({
        xcoordinate: newX * 0.12,
        ycoordinate: rect.yCoordinate * 0.1,
        width: adjustedWidth,
        height: adjustedHeight,
        widtha: adjustedWidtha,
        heighta: adjustedHeighta,
      };
      });
      }
  if(data.intoGlass2!=null){
    adjustedRects2.value =  data.intoGlass2[0].map(rect => {
        let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta;
      let newX = rect.yCoordinate;
      if (rect.angle === 0) {
          adjustedWidth = rect.height * 0.12;
          adjustedHeight = rect.width * 0.1;
          adjustedWidtha = rect.height;
          adjustedHeighta = rect.width;
          newX = 5087 - (rect.xCoordinate + rect.height);
  } else {
          adjustedWidth = rect.width * 0.12;
          adjustedHeight = rect.height * 0.1;
          adjustedWidtha = rect.width;
          adjustedHeighta = rect.height;
          newX = 5087 - (rect.xCoordinate + rect.width);
  }
        return {
        ...rect, 
        xcoordinate: rect.xCoordinate * 0.3,
        ycoordinate: rect.ycoordinate * 0.3,
        width: rect.width * 0.2,
        height: rect.height * 0.2,
        widtha: rect.width,
        heighta: rect.height,
      }));
      console.log(data.intoGlass[0]);
        xcoordinate: newX * 0.12,
        ycoordinate: rect.yCoordinate * 0.1,
        width: adjustedWidth,
        height: adjustedHeight,
        widtha: adjustedWidtha,
        heighta: adjustedHeighta,
      };
      });
      }
  // 进炉前
      adjustedRectsa.value = data.waitingGlass[0].map(rect => ({
        ...rect, // 复制原始对象的其他属性
        xcoordinate: rect.xCoordinate * 0.5,
        ycoordinate: rect.ycoordinate * 0.5,
        width: rect.width * 0.4,
        height: rect.height * 0.4,
        widtha: rect.width,
        heighta: rect.height,
        state: rect.state
      }));
  if(data.waitingGlass!=null){
    adjustedRectsa.value = data.waitingGlass[0].map(rect => {
  let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta;
  let newX = rect.yCoordinate;
  if (rect.angle === 0) {
    adjustedWidth = rect.width * 0.24;
    adjustedHeight = rect.height * 0.16;
    adjustedWidtha = rect.width;
    adjustedHeighta = rect.height;
    newX = 5190 - (rect.yCoordinate + rect.width);
    } else {
    adjustedWidth = rect.height * 0.24;
    adjustedHeight = rect.width * 0.16;
    adjustedWidtha = rect.height;
    adjustedHeighta = rect.width;
    newX = 5190 - (rect.yCoordinate + rect.height);
  }
  return {
    ...rect,
    x: newX * 0.24,
    y: rect.xCoordinate * 0.16,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: adjustedWidtha,
    heighta: adjustedHeighta,
  };
});
  }
    // 已出炉
      adjustedRectsb.value = data.outGlass[0].map(rect => ({
  if(data.outGlass!=null){
    adjustedRectsb.value = data.outGlass[0].map(rect => {
  let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta;
  let newX = rect.yCoordinate;
  if (rect.angle === 0) {
    adjustedWidth = rect.width * 0.24;
    adjustedHeight = rect.height * 0.16;
    adjustedWidtha = rect.width;
    adjustedHeighta = rect.height;
    newX = 5190 - (rect.yCoordinate + rect.width);
  } else {
    adjustedWidth = rect.height * 0.24;
    adjustedHeight = rect.width * 0.16;
    adjustedWidtha = rect.height;
    adjustedHeighta = rect.width;
    newX = 5190 - (rect.yCoordinate + rect.height);
  }
  return {
        ...rect, // 复制原始对象的其他属性  
        xcoordinate: rect.xCoordinate * 0.5,
        ycoordinate: rect.ycoordinate * 0.5,
        width: rect.width * 0.4,
        height: rect.height * 0.4,
        widtha: rect.width,
        heighta: rect.height,
        state: rect.state
      }));
        x: newX * 0.24,
        y: rect.xCoordinate * 0.16,
        width: adjustedWidth,
        height: adjustedHeight,
        widtha: adjustedWidtha,
        heighta: adjustedHeighta,
  };
});
  }
};
onMounted(() => {
  initializeWebSocket(socketUrl, handleMessage);
});
function getRectColor(state) {
  switch (state) {
    case 0:
      return '#f8e3c5';
    case 1:
      return '#d1edc4';
    case -1:
      return '#dedfe0';
  }
}
function showDialog(row) {
  blind.value = true;
}
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
@@ -73,14 +160,16 @@
</script>
<template>
  <div style="margin-top: 10px;">
     <el-button style="margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisible = true;dialogFormVisiblea = false;dialogFormVisibleb = false;">{{ $t('processCard.intofurnace') }}</el-button>
     <el-button style="margin-left: 15px;"   id="searchButton" type="primary" @click="dialogFormVisiblea = true;dialogFormVisible = false;dialogFormVisibleb = false;" >{{ $t('processCard.beforefurnace') }}</el-button>
     <el-button style="margin-left: 15px;" id="searchButton" type="primary" @click="dialogFormVisible = true;dialogFormVisiblea = false;dialogFormVisibleb = false;">{{ $t('processCard.intofurnace') }}</el-button>
    <el-button  id="searchButton" type="success" @click="dialogFormVisibleb = true;dialogFormVisible = false;dialogFormVisiblea = false">{{ $t('processCard.outfurnace') }}</el-button>
<div v-if="dialogFormVisible" >
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
<div style="width: 49%;float: left;background-color: #f4f4f5;height: 550px;">
  <el-scrollbar height="630px">
    <div  style="position: relative;width: 1400px;">
    <div v-if="adjustedRects.length > 0">
      <div style="text-align: center;">炉号:{{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }}</div>
    <el-scrollbar height="550px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div  
      v-for="(rect, index) in adjustedRects"
      :key="index"  
@@ -88,16 +177,20 @@
      :style="{ position: 'absolute',  top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`, width: `${rect.width}px`, height: `${rect.height}px`  }"  
    >
     <div  class="centered-text">
    <div >{{ rect.flowcardId }}</div>
    <div style="text-align: center;">{{ rect.widtha }}*{{ rect.heighta }}</div>
    <div >{{ rect.glassId }}</div>
    <div >{{ rect.flowCardId }}</div>
    <div>{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
   </el-scrollbar>
  </div>
  </div>
<div style="width: 49%;float: right;background-color: #f4f4f5;height: 550px;">
  <el-scrollbar height="550px">
    <div  style="position: relative;width: 1400px;">
    <div v-if="adjustedRects2.length > 0">
      <div style="text-align: center;">炉号:{{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }}</div>
    <el-scrollbar height="550px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div  
      v-for="(rect, index) in adjustedRects2"
      :key="index"  
@@ -105,57 +198,75 @@
      :style="{ position: 'absolute',  top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`, width: `${rect.width}px`, height: `${rect.height}px`  }"  
    >
     <div  class="centered-text">
    <div >{{ rect.flowcardId }}</div>
    <div style="text-align: center;">{{ rect.widtha }}*{{ rect.heighta }}</div>
    <div >{{ rect.glassId }}</div>
    <div >{{ rect.flowCardId }}</div>
    <div>{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div>
   </div>
   </el-scrollbar>
   </div>
</div>
   </el-card>
    </div>
<div v-if="dialogFormVisiblea">
  <!-- 进炉前 -->
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
      <el-scrollbar height="550px">
    <div  style="position: relative;width: 1400px;">
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
    <div v-if="adjustedRectsa.length > 0">
      <div style="text-align: center;">炉号:{{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }}</div>
      <!-- <div style="text-align: center;">流程卡: {{ adjustedRectsa[0].flowCardId }}</div>   -->
      <el-scrollbar height="550px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div  
      v-for="(rect, index) in adjustedRectsa"  
      :key="index"  
      @click="showDialog"
      class="rect"  
      :style="{ position: 'absolute',  top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`,
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
       backgroundColor: rect.state === 0 ? '#dedfe0' : '#d1edc4' }">
      backgroundColor: getRectColor(rect.state) }">
     <div  class="centered-text">
    <div >{{ rect.flowcardId }}</div>
    <div style="text-align: center;">{{ rect.widtha }}*{{ rect.heighta }}</div>
    <div>{{ rect.glassId }}</div>
    <div >{{ rect.flowCardId }}</div>
    <div>{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div> 
   </div>
   </el-scrollbar>
   </div>
   </el-card>
</div>
<div v-if="dialogFormVisibleb">
  <!-- 已出炉 -->
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
      <el-scrollbar height="550px">
    <div  style="position: relative;width: 1400px;">
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
      <div v-if="adjustedRectsb.length > 0">
      <div style="text-align: center;">炉号:{{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }}</div>
      <el-scrollbar height="550px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div  
      v-for="(rect, index) in adjustedRectsb"  
      :key="index"  
      class="rect"  
      :style="{ position: 'absolute',  top: `${rect.ycoordinate}px`, left: `${rect.xcoordinate}px`,
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
       backgroundColor: rect.state === 4 ? '#911005' : '#f8e3c5' }">
     <div  class="centered-text">
    <div >{{ rect.flowcardId }}</div>
    <div style="text-align: center;">{{ rect.widtha }}*{{ rect.heighta }}</div>
    <div >{{ rect.glassId }}</div>
    <div >{{ rect.flowCardId }}</div>
    <div>{{ rect.widtha }}*{{ rect.heighta }}</div>
  </div>
  </div> 
   </div>
   </el-scrollbar>
   </div>
   </el-card>
</div>
<el-dialog v-model="blind" top="30vh" width="15%" style="text-align: center;">
        <el-button type="warning" plain :icon="Delete" @click="handleDamage(currentGlassId)"  style="width: 140px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
  </el-dialog>
  </div>
</template>
<style scoped>
@@ -233,9 +344,10 @@
}  
.centered-text {
  /* 设置文字居中样式 */  
  display: flex;
  /* display: flex; */
  justify-content: center;  
  align-items: center;  
  height: 100%; /* 确保div占据整个矩形的高度 */  
  font-size: small;
</style>
UI-Project/src/views/PurchaseReturn/purchaseStorage.vue
@@ -29,16 +29,34 @@
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  adjustedRects.value =  data.overGlass[0].map(rect => ({
        ...rect, // 复制原始对象的其他属性
        xcoordinate: rect.xCoordinate * 0.5, // 将x值除以3
        ycoordinate: rect.ycoordinate * 0.5,
        width: rect.width * 0.4,
        height: rect.height * 0.4,
        widtha: rect.width,
        heighta: rect.height,
      }));
      console.log(adjustedRects.value);
  if(data.overGlass!=null){
    adjustedRects.value =  data.overGlass[0].map(rect => {
  let adjustedWidth, adjustedHeight, adjustedWidtha, adjustedHeighta;
      let newX = rect.yCoordinate;
      if (rect.angle === 0) {
    adjustedWidth = rect.width * 0.24;
    adjustedHeight = rect.height * 0.16;
    adjustedWidtha = rect.width;
    adjustedHeighta = rect.height;
    newX = 5190 - (rect.yCoordinate + rect.width);
  } else {
    adjustedWidth = rect.height * 0.24;
    adjustedHeight = rect.width * 0.16;
    adjustedWidtha = rect.height;
    adjustedHeighta = rect.width;
    newX = 5190 - (rect.yCoordinate + rect.height);
  }
  return {
    ...rect,
    xcoordinate: newX * 0.24,
    ycoordinate: rect.xCoordinate * 0.16,
    width: adjustedWidth,
    height: adjustedHeight,
    widtha: adjustedWidtha,
    heighta: adjustedHeighta,
  };
});
  }
};
onMounted(() => {
  // fetchFlowCardId();
@@ -55,9 +73,12 @@
<template>
  <div style="margin-top: 10px;">
<div>
    <el-card style="margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading">
    <el-scrollbar height="600px">
    <div  style="position: relative;width: 1400px;">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 600px;" v-loading="loading">
      <!-- <el-card style="margin-left: 10px;margin-top: 10px;margin-right: 10px;" v-loading="loading"> -->
      <div v-if="adjustedRects.length > 0">
      <div style="text-align: center;">炉号:{{ adjustedRects[0].engineerId }}-{{ adjustedRects[0].temperingLayoutId }}</div>
    <el-scrollbar height="550px" width="1200px" style="background-color: #e9e9eb;">
    <div  style="position: relative;">
      <div  
      v-for="(rect, index) in adjustedRects"
      :key="index"  
@@ -66,12 +87,15 @@
       width: `${rect.width}px`, height: `${rect.height}px`,
       backgroundColor: rect.state === 4 ? '#d1edc4' : '#f8e3c5' }">
     <div  class="centered-text">
    <div >{{ rect.flowcardId }}</div>
    <div style="text-align: center;">{{ rect.widtha }}*{{ rect.heighta }}</div>
    <div >{{ rect.glassId }}</div>
    <div >{{ rect.flowCardId }}</div>
    <div>{{ rect.widtha }}*{{ rect.heighta }}</div>
    <!-- <div style="margin-top: 25px;margin-left: -60px;">{{ rect.widtha }}*{{ rect.heighta }}</div>   -->
  </div>
  </div> 
   </div>
   </el-scrollbar>
   </div>
    </el-card>
    </div>
  </div>
@@ -94,9 +118,10 @@
.centered-text {
  /* 设置文字居中样式 */  
  display: flex;
  /* display: flex; */
  justify-content: center;  
  align-items: center;  
  height: 100%; /* 确保div占据整个矩形的高度 */  
  font-size: small;
</style>
UI-Project/src/views/ReportWork/reportWork.vue
@@ -15,7 +15,7 @@
      <el-option label="待报工" value="2"></el-option>
      <el-option label="已报工" value="3"></el-option>
    </el-select>
    <el-select v-model="report.workProcedure" placeholder="清选择工序">
    <el-select v-model="report.workingProcedure" placeholder="清选择工序">
      <el-option label="全部" value="0"></el-option>
      <el-option label="切割" value="1"></el-option>
      <el-option label="磨边" value="2"></el-option>
@@ -25,26 +25,26 @@
    <el-button type="success">报工</el-button>
    <el-table height="100%" ref="table" :data="reportData"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="reportData.line" align="center" label="线路" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="工序" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="玻璃id" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="工程号" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="钢化版图id" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="生产时间" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="备注" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="类型" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="状态" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="流程卡" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="序号" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="层" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="破损类型" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="破损原因" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="责任工序" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="责任人员" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="责任班组" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="责任设备" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="报工班组" min-width="120" />
      <el-table-column prop="reportData.line" align="center" label="报工设备" min-width="120" />
      <el-table-column prop="teamsGroupsName" align="center" label="报工班组" min-width="120" />
      <el-table-column prop="deviceName" align="center" label="报工设备" min-width="120" />
      <el-table-column prop="line" align="center" label="线路" min-width="120" />
      <el-table-column prop="workingProcedure" align="center" label="工序" min-width="120" />
      <el-table-column prop="glassId" align="center" label="玻璃id" min-width="120" />
      <el-table-column prop="engineerId" align="center" label="工程号" min-width="120" />
      <el-table-column prop="temperingLayoutId" align="center" label="钢化版图id" min-width="120" />
      <el-table-column prop="damageTime" align="center" label="生产时间" min-width="120" />
      <el-table-column prop="type" align="center" label="类型" min-width="120" />
      <el-table-column prop="status" align="center" label="状态" min-width="120" />
      <el-table-column prop="processId" align="center" label="流程卡" min-width="120" />
      <el-table-column prop="orderNumber" align="center" label="序号" min-width="120" />
      <el-table-column prop="technologyNumber" align="center" label="层" min-width="120" />
      <el-table-column prop="breakageType" align="center" label="破损类型" min-width="120" />
      <el-table-column prop="breakageReason" align="center" label="破损原因" min-width="120" />
      <el-table-column prop="responsibleProcess" align="center" label="责任工序" min-width="120" />
      <el-table-column prop="responsiblePersonnel" align="center" label="责任人员" min-width="120" />
      <el-table-column prop="responsibleTeam" align="center" label="责任班组" min-width="120" />
      <el-table-column prop="responsibleEquipment" align="center" label="责任设备" min-width="120" />
      <el-table-column prop="remark" align="center" label="备注" min-width="120" />
    </el-table>
  </div>
</template>
@@ -58,23 +58,22 @@
import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const report = ref({
  type: '',
  status: '',
  workProcedure: '',
  type: '0',
  status: '0',
  workingProcedure: '0',
});
const reportData = ref([])
const timeRange = ref([new Date(2000, 10, 10), new Date(2200, 10, 11)])
const timeRange = ref(["2022-01-01", "2022-01-01"])
// 查询数据
const selectReportData = async () => {
  console.log(timeRange.value[0])
  const response = await request.post("/loadGlass/damage/selectDamage", {
  const response = await request.post("/cacheVerticalGlass/damage/selectDamage", {
    startTime: timeRange.value[0],
    endTime: timeRange.value[1],
    type: report.value.type,
    status: report.value.status,
    workProcedure: report.value.workProcedure,
    workingProcedure: report.value.workingProcedure
  })
  if (response.code === 200) {
    reportData.value = response.data;
@@ -82,6 +81,14 @@
  } else {
    ElMessage.error(response.message);
  }
  const responses = await request.post("/cacheVerticalGlass/damage/insertDamage", {
    glassId:"P24060403|3|6",
    line:"2001",
    workingProcedure:"冷加工",
    remark:"",
    status:"2"
  })
};
const socketUrl = `ws://${WebSocketHost}:${host}/api/temperingGlass/api/talk/screen`;
UI-Project/src/views/Returns/returns.vue
@@ -15,6 +15,8 @@
const adda = ref(false)
const flake = ref(false)
const flakea = ref(false)
const flakeb = ref(false)
const flakec = ref(false)
import { WebSocketHost ,host} from '@/utils/constants'
import request from "@/utils/request"
const ida = ref(null); 
@@ -78,26 +80,62 @@
    // ElMessage.error('获取表格数据失败,请重试');
  }
};
request.get("/loadGlass/LoadGlass/list").then((res) => {
      window.localStorage.setItem('patternWidth', res.data.patternWidth)
      window.localStorage.setItem('workstationId', res.data.workstationId)
          if (res.code == 200) {
          console.log(res.data);
          tableDataa.value = res.data
          console.log(res.data.patternWidth);
      let workstationId = window.localStorage.getItem('workstationId')
      let patternWidth = window.localStorage.getItem('patternWidth')
      if (patternWidth !== '' || workstationId == '1') {
      flake.value = true
    } else if (patternWidth !== '' || workstationId == '2') {
      flakea.value = true
onMounted(() => {
  list('');
  fetchOptions('');
  initializeWebSocket(socketUrl, handleMessage);
});
onMounted(() => {
});
const list = async () => {
  try {
    const response = await request.get('/loadGlass/LoadGlass/list');
    if (response.code == 200) {
      tableDataa.value = response.data
          if (tableDataa.value.length === 4) {
          if (tableDataa.value[0].patternHeight > 0) {
          flake.value = true;
          }
         if (tableDataa.value[1].patternHeight > 0) {
          flakea.value = true;
          }
         if (tableDataa.value[2].patternHeight > 0) {
          flakeb.value = true;
          }
         if (tableDataa.value[3].patternHeight > 0) {
          flakec.value = true;
          }
    }
          } else {
          ElMessage.warning(res.message)
          // router.push("/login")
      ElMessage.warning(response.data);
          }
          });
  } catch (error) {
    console.error('Error fetching options:', error);
  }
};
// 假设这是您的响应处理函数
// request.get("/loadGlass/LoadGlass/list").then((res) => {
//       if (res.code == 200) {
//           tableDataa.value = res.data
//           if (tableDataa.value.length === 4) {
//           if (tableDataa.value[0].patternHeight > 0) {
//           flake.value = true;
//           }
//          if (tableDataa.value[1].patternHeight > 0) {
//           flakea.value = true;
//           }
//          if (tableDataa.value[2].patternHeight > 0) {
//           flakeb.value = true;
//           }
//          if (tableDataa.value[3].patternHeight > 0) {
//           flakec.value = true;
//           }
//            }
//           } else {
//           ElMessage.warning(res.message)
//           // router.push("/login")
//           }
//           });
//定义接收加载表头下拉数据
const titleSelectJson = ref({
  processType: [],
@@ -109,10 +147,12 @@
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  if(data.prioritylist!=null){
  tableData.splice(0, tableData.length, ...data.prioritylist[0]);
  }
  if(data.list!=null){
  tableDataa.value = data.list[0]
 // console.log("更新后数据", tableData);
  }
};
const requestData = {  
  state: 100  
@@ -153,13 +193,7 @@
    options.value = []; // 清空选项列表  
  }  
};  
// 初始化加载数据(如果需要)
onMounted(() => {
  fetchOptions('');
  initializeWebSocket(socketUrl, handleMessage);
});
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
const user = ref('');
@@ -175,14 +209,12 @@
const handleBindRack = (row) => {
  workstationId.value = row.workstationId; // 假设rackNumber是架号字段的属性名
  ida.value = row.id;
  console.log(ida.value);
  add.value = true; // 打开绑定架子对话框
};
// 添加
    const handleConfirm = async () => {
  console.log(ida.value);
      // console.log('id.value:', id.value);
  if ((ida.value === 2 || ida.value === 4) && (parseInt(patternHeight.value, 10) >= 2700 )) {
  if ((ida.value === 2 || ida.value === 4) && (parseInt(selectedValuea.value, 10) >= 2700 )) {
    try {
    const response = await request.post('/loadGlass/LoadGlass/updateGlassMessage', {
      id: workstationId.value,
@@ -193,24 +225,31 @@
      patternThickness: selectedValuec.value,
      number: number.value
    }); 
      window.localStorage.setItem('workstationId', workstationId.value)
      window.localStorage.setItem('patternHeight', selectedValuea.value)
    if (response.code == 200) {
      // 绑定成功,处理逻辑
      ElMessage.success(response.message);
      // window.location.reload() 
      add.value = false;
     tableDataa.value = response.data;
      let workstationId = window.localStorage.getItem('workstationId')
      let patternHeight = window.localStorage.getItem('patternHeight')
      if (patternHeight !== '' && workstationId === '1') {
      flake.value = true
    } else if (patternHeight !== '' && workstationId === '2'){
      flakea.value = true
    }else if (patternHeight !== '' && workstationId === '3'){
      flakeb.value = true
    }else if (patternHeight !== '' && workstationId === '4'){
      flakec.value = true
    }
      selectedValuea.value = '';
      selectedValue.value = '';
      selectedValueb.value = '';
      selectedValuec.value = '';
      number.value = '';
      window.localStorage.setItem('workstationId', response.data.workstationId)
      let workstationId = window.localStorage.getItem('workstationId')
      if (workstationId == '1') {
      flake.value = true
    } else if (workstationId == '2'){
      flakea.value = true
    }
        list()
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.message);
@@ -232,24 +271,31 @@
      patternThickness: selectedValuec.value,
      number: number.value
    }); 
      window.localStorage.setItem('workstationId', workstationId.value)
      window.localStorage.setItem('patternHeight', selectedValuea.value)
    if (response.code == 200) {
      // 绑定成功,处理逻辑
      ElMessage.success(response.message);
      // window.location.reload() 
      add.value = false;
     tableDataa.value = response.data;
      let workstationId = window.localStorage.getItem('workstationId')
      let patternHeight = window.localStorage.getItem('patternHeight')
      if (patternHeight !== '' && workstationId === '1') {
      flake.value = true
    } else if (patternHeight !== '' && workstationId === '2'){
      flakea.value = true
    }else if (patternHeight !== '' && workstationId === '3'){
      flakeb.value = true
    }else if (patternHeight !== '' && workstationId === '4'){
      flakec.value = true
    }
      selectedValuea.value = '';
      selectedValue.value = '';
      selectedValueb.value = '';
      selectedValuec.value = '';
      number.value = '';
      window.localStorage.setItem('workstationId', response.data.workstationId)
      let workstationId = window.localStorage.getItem('workstationId')
      if (workstationId == '1') {
      flake.value = true
    } else if (workstationId == '2'){
      flakea.value = true
    }
      list()
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.message);
@@ -285,13 +331,18 @@
      ElMessage.success(response.message);
      adda.value = false;
     tableDataa.value = response.data;
      window.localStorage.setItem('workstationId', response.data.workstationId)
      let workstationId = window.localStorage.getItem('workstationId')
      if (workstationId == '1') {
      // window.localStorage.setItem('workstationId', response.data.workstationId)
      // let workstationId = window.localStorage.getItem('workstationId')
      if (workstationId.value == '1') {
      flake.value = false
    } else if (workstationId == '2'){
    } else if (workstationId.value == '2'){
      flakea.value = false
    }else if (workstationId.value == '3'){
      flakeb.value = false
    }else if (workstationId.value == '4'){
      flakec.value = false
    }
        list()
    } else {
      // 请求失败,显示错误消息
      ElMessage.error(response.message);
@@ -545,11 +596,13 @@
    const data = JSON.parse(event.data); // 解析消息为JSON  
  
    if (data && Array.isArray(data.InkageStatus) && data.InkageStatus.length > 0) {  
if(data.InkageStatus!=null){
      const status = data.InkageStatus[0]; 
      cuttingMachine.value = status; 
            upstatus.value = status === '1' ? t('basicData.machine') : t('basicData.machineaa');
      cuttingMachineStatusColor.value = status === '1' ? 'green' : '#911005';  
      inKageWord.value = status === '1' ? 0 : 1;  
}
    } else {  
      // 处理错误情况或无效数据  
      console.error('接收到的数据无效', data);  
@@ -673,11 +726,13 @@
    </template>
  </el-dialog> -->
      <div id="parent">
        <img src="../../assets/shangpianji.png" alt="" style="max-width: 20%;max-height: 20%;margin-top: 20px;margin-left: 500px;">
        <img src="../../assets/shangpian.png" alt="" style="max-width: 40%;max-height: 40%;margin-top: 20px;margin-left: 340px;">
        <div id="overlay" v-show="flake"></div>
        <div id="overlaya" v-show="flakea"></div>
        <div id="overlayb" v-show="flakeb"></div>
        <div id="overlayc" v-show="flakec"></div>
      </div>
      <div style="margin-top: -350px;margin-left: 650px;">
      <div style="margin-top: -300px;margin-left: 680px;">
        <el-table :data="tableDataa" border style="width: 85%"
     :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
        >
@@ -876,20 +931,38 @@
#overlay{
  position: absolute;
  z-index: 1;
  width: 212px;
  height: 15px;
  width: 228px;
  height: 16px;
  background-color: #529b2e;
  margin-top: -404px;
  margin-left: 542px;
  margin-top: -303px;
  margin-left: 355px;
}
#overlaya{
  position: absolute;
  z-index: 1;
  width: 212px;
  height: 15px;
  width: 228px;
  height: 16px;
  background-color: #529b2e;
  margin-top: -38px;
  margin-left: 537px;
  margin-top: -303px;
  margin-left:703px;
}
#overlayb{
  position: absolute;
  z-index: 1;
  width: 228px;
  height: 16px;
  background-color: #529b2e;
  margin-top: -45px;
  margin-left: 355px;
}
#overlayc{
  position: absolute;
  z-index: 1;
  width: 228px;
  height: 16px;
  background-color: #529b2e;
  margin-top: -45px;
  margin-left: 703px;
}
 
</style>
UI-Project/src/views/Slicecage/slicecage.vue
@@ -14,7 +14,9 @@
const dialogFormVisible = ref(false)
const dialogFormVisiblea = ref(false)
const dialogFormVisibleb = ref(false)
const dialogFormVisiblec = ref(false)
const tableData = ref([])
const tableDatagh = ref([])
const tableDatab = ref([])
const tableDatac = ref([])
const tableDatad = ref([])
@@ -70,7 +72,18 @@
const cell9=ref(true);
const selectedRow = ref(null); // 存储选中的行数据  
 
onMounted(async () => {
  try {
    const response = await request.post('/cacheVerticalGlass/bigStorageCageDetails/selectTemperingGlass');
    if (response.code === 200) {
      tableDatagh.value = response.data
    } else {
      ElMessage.warning(response.msg)
    }
  } catch (error) {
    // console.error('Error fetching rects :', error);
  }
});
    // 当前页码和每页显示的条数
    const currentPage = ref(1);
    const itemsPerPage = computed(() => {
@@ -349,6 +362,33 @@
    console.error('发生错误:', error);  
  }  
}; 
 // 指定钢化
 const brokee = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('searchOrder.specifytemperinga'),
      t('searchOrder.prompt'),
      {
        confirmButtonText: t('searchOrder.yes'),
        cancelButtonText: t('searchOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheVerticalGlass/bigStorageCageDetails/TemperingGlass",{
        engineerId: row.engineer_id,
        temperingLayoutId: row.tempering_layout_id,
    });
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.message);
      }
    }
  } catch (error) {
    console.error('发生错误:', error);
  }
};
// 出片队列拿走
const brokeb = async(row) => {  
  try {
@@ -617,6 +657,7 @@
  <div style="height: 600px;">
    <el-button style="margin-top: 5px;margin-left: 10px;"   id="searchButton" type="primary" @click="dialogFormVisiblea = true">{{ $t('searchOrder.cageinformation') }}</el-button>
    <el-button style="margin-top: 5px;margin-left: 10px;"   id="searchButton" type="success" @click="dialogFormVisibleb = true">{{ $t('searchOrder.productionqueue') }}</el-button>
    <el-button style="margin-top: 5px;margin-left: 10px;"   id="searchButton" type="info" @click="dialogFormVisiblec = true">{{ $t('searchOrder.temperingqueries') }}</el-button>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 5px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 100px;">
        <el-table height="100px" ref="table" 
@@ -1239,6 +1280,19 @@
        </el-table-column>
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisiblec" top="5vh" width="85%" :title="$t('searchOrder.temperingqueries')">
    <el-table  ref="table" style="margin-top: 20px;height: 500px;"
        :data="tableDatagh" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineer_id" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
          <el-table-column prop="tempering_layout_id" fixed align="center" :label="$t('searchOrder.layoutnumber')" min-width="120" />
          <el-table-column prop="count" align="center" :label="$t('searchOrder.numberglasses')" min-width="150" />
          <el-table-column fixed="right" :label="$t('searchOrder.operate')" align="center" width="150">
            <template #default="scope">
              <el-button size="mini" type="text" plain @click="brokee(scope.row)">{{ $t('searchOrder.specifytempering') }}</el-button>
            </template>
        </el-table-column>
        </el-table>
</el-dialog>
 
</template>
<style scoped>
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java
@@ -22,6 +22,11 @@
     */
    @ApiModelProperty(value = "宽")
    private double width;
    /**
     * 宽
     */
    @ApiModelProperty(value = "高")
    private double height;
    /**
     * 格子号
@@ -29,4 +34,16 @@
    @ApiModelProperty(value = "玻璃id")
    private Integer slot;
    /**
     * x坐标
     */
    @ApiModelProperty(value = "x坐标", position = 13)
    private Integer xCoordinate;
    /**
     * y坐标
     */
    @ApiModelProperty(value = "y坐标", position = 14)
    private Integer yCoordinate;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -21,6 +21,7 @@
     * A09出片目标位置  d02卧转立    2001
     * A10出片目标位置  d05卧转立    2002
     */
    public static final Integer OUT_TARGET_POSITION_ZERO = 0;
    public static final Integer A09_OUT_TARGET_POSITION = 2001;
    public static final Integer A10_OUT_TARGET_POSITION = 2002;
@@ -37,12 +38,14 @@
     * 识别后成功状态100
     * 出片任务101
     * 人工下片102
     * 出片中103
     * 拿走200
     * 破损201
     */
    public static final Integer GLASS_STATE_IN = 100;
    public static final Integer GLASS_STATE_OUT = 101;
    public static final Integer GLASS_STATE_ARTIFICIAL = 102;
    public static final Integer GLASS_STATE_OUT_ING = 103;
    public static final Integer GLASS_STATE_TAKE = 200;
    public static final Integer GLASS_STATE_DAMAGE = 201;
@@ -112,6 +115,7 @@
    public static final Integer BIG_STORAGE_OUT_SUCCESS = 3;
    public static final Integer BIG_STORAGE_OUT_ERROR = 4;
    public static final Integer BIG_STORAGE_OUT_DAMAGE = 5;
    public static final List<Integer> BIG_STORAGE_OUT_ALL = Arrays.asList(2, 3);
    /**
     * 卧转立出片请求
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/controller/DamageController.java
@@ -25,35 +25,47 @@
@Api(description = "报工信息")
@RestController
@RequestMapping("/damage")
@ResponseBody
public class DamageController {
    @Autowired
    private DamageService damageService;
    @ApiOperation("报工数据查询")
    @ResponseBody
    @PostMapping("/selectDamage")
    public Result selectDamage(@RequestBody Map map) {
        String startTime=map.get("startTime").toString();
        String endTime=map.get("endTime").toString();
        int type =Integer.parseInt(map.get("type").toString());
        int status =Integer.parseInt(map.get("status").toString());
        int workingProcedure =Integer.parseInt(map.get("workingProcedure").toString());
//        String startTime , String endTime, int type, int status, int workingProcedure
        String workingProcedure =map.get("workingProcedure").toString();
        return Result.build(200,"查询成功",damageService.selectDamage(startTime,endTime,type,status,workingProcedure));
    }
    @ApiOperation("报工")
    @PostMapping("/submitDamage")
    public Result submitDamage(DateTime startTime , DateTime endTime,int type,int status,int workingProcedureId) {
        damageService.submitDamage(startTime,endTime,type,status,workingProcedureId);
    public Result submitDamage(@RequestBody Map map) {
        String startTime=map.get("startTime").toString();
        String endTime=map.get("endTime").toString();
        int type =Integer.parseInt(map.get("type").toString());
        int status =Integer.parseInt(map.get("status").toString());
        String workingProcedure =map.get("workingProcedure").toString();
        damageService.submitDamage(startTime,endTime,type,status,workingProcedure);
        return Result.build(200,"报工成功",1);
    }
    @ApiOperation("报工数据修改")
    @PostMapping("/updateDamage")
    public Result updateDamage(List<Damage> damageList) {
    public Result updateDamage(@RequestBody List<Damage> damageList) {
        damageService.updateBatchById(damageList);
        return Result.build(200,"修改成功",1);
    }
    @ApiOperation("报工数据新增")
    @PostMapping("/insertDamage")
    public Result insertDamage(@RequestBody Damage damage) {
        damageService.insertDamage(damage);
        return Result.build(200,"新增成功",1);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/mapper/DamageMapper.java
@@ -1,5 +1,6 @@
package com.mes.damage.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.mes.damage.entity.Damage;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -11,6 +12,7 @@
 * @author wu
 * @since 2024-06-13
 */
@DS("hangzhoumes")
public interface DamageMapper extends BaseMapper<Damage> {
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java
@@ -17,9 +17,9 @@
 */
public interface DamageService extends IService<Damage> {
    List<Damage> selectDamage(String startTime, String endTime, int type, int status, int workingProcedureId);
    List<Damage> selectDamage(String startTime, String endTime, int type, int status, String workingProcedure);
    void submitDamage(DateTime startTime, DateTime endTime, int type, int status, int workingProcedureId);
    void submitDamage(String startTime, String endTime, int type, int status, String workingProcedure);
    void insertDamage(Damage damage);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java
@@ -39,7 +39,7 @@
     * 查询报工信息
     */
    @Override
    public List<Damage> selectDamage(String startTime, String endTime, int type, int status, int workingProcedure){
    public List<Damage> selectDamage(String startTime, String endTime, int type, int status, String workingProcedure){
        LambdaQueryWrapper<Damage> damageSelectWrapper =new LambdaQueryWrapper<>();
        damageSelectWrapper.between(Damage::getDamageTime,startTime,endTime);
        if (type!=0){
@@ -48,7 +48,7 @@
        if (status!=0){
            damageSelectWrapper.eq(Damage::getStatus,status);
        }
        if(workingProcedure!=0){
        if(!"0".equals(workingProcedure)){
            damageSelectWrapper.eq(Damage::getWorkingProcedure,workingProcedure);
        }
        return baseMapper.selectList(damageSelectWrapper);
@@ -58,7 +58,7 @@
     * 提交报工
     */
    @Override
    public void submitDamage(DateTime startTime, DateTime endTime, int type, int status, int workingProcedureId){
    public void submitDamage(String startTime, String endTime, int type, int status, String workingProcedure){
        LambdaUpdateWrapper<Damage> damageUpdateWrapper=new LambdaUpdateWrapper<>();
        damageUpdateWrapper.between(Damage::getDamageTime,startTime,endTime);
        if (type!=0){
@@ -67,8 +67,8 @@
        if (status!=0){
            damageUpdateWrapper.eq(Damage::getStatus,status);
        }
        if(workingProcedureId!=0){
            damageUpdateWrapper.eq(Damage::getWorkingProcedure,workingProcedureId);
        if(!"0".equals(workingProcedure)){
            damageUpdateWrapper.eq(Damage::getWorkingProcedure,workingProcedure);
        }
        Damage damage=new Damage();
        damage.setStatus(2);
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/mapper/GlassInfoMapper.java
@@ -1,5 +1,6 @@
package com.mes.glassinfo.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.glassinfo.entity.GlassInfo;
@@ -11,6 +12,7 @@
 * @author wu
 * @since 2024-04-29
 */
@DS("hangzhoumes")
public interface GlassInfoMapper extends MPJBaseMapper<GlassInfo> {
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java
@@ -1,4 +1,5 @@
package com.mes.temperingglass.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mes.base.entity.BigStorageCageBaseInfo;
@@ -44,12 +45,6 @@
    private Integer glassType;
    /**
     * 高
     */
    @ApiModelProperty(value = "高", position = 7)
    private double height;
    /**
     * 厚度
     */
    @ApiModelProperty(value = "厚度", position = 8)
@@ -80,18 +75,6 @@
    private Integer temperingFeedSequence;
    /**
     * x坐标
     */
    @ApiModelProperty(value = "x坐标", position = 13)
    private Integer xCoordinate;
    /**
     * y坐标
     */
    @ApiModelProperty(value = "y坐标", position = 14)
    private Integer yCoordinate;
    /**
     * 旋转角度(逆时针)
     */
    @ApiModelProperty(value = "旋转角度(逆时针)", position = 15)
@@ -103,4 +86,9 @@
    @ApiModelProperty(value = "状态", position = 16)
    private Integer state;
    /**
     * 工程id
     */
    @ApiModelProperty(value = "工程id", position = 17)
    private String engineerId;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
@@ -15,7 +15,7 @@
    List<TemperingGlassInfo> selectWaitingGlass();
    List<TemperingGlassInfo> selectIntoGlass(int layoutId);
    List<TemperingGlassInfo> selectIntoGlass(TemperingGlassInfo temperingGlassInfo);
    List<TemperingGlassInfo> selectOutGlass();
@@ -24,4 +24,7 @@
    List<TemperingGlassInfo> selectLayoutId();
    List<TemperingGlassInfo> selectTaskType();
    Integer updateTemperingState(TemperingGlassInfo temperingGlassInfo);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/service/impl/TemperingGlassInfoServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.temperingglass.mapper.TemperingGlassInfoMapper;
import com.mes.temperingglass.service.TemperingGlassInfoService;
@@ -29,17 +30,20 @@
    public List<TemperingGlassInfo> selectWaitingGlass() {
        //获取等待进炉中的玻璃信息
        QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>();
        //wrapper.eq("state",1);
        wrapper.in("state",1,0);
        return temperingMapper.selectList(wrapper);
        wrapper.select("Top 1 *").eq("state",1);
        TemperingGlassInfo glass=temperingMapper.selectOne(wrapper);
        QueryWrapper<TemperingGlassInfo> glassinfo = new QueryWrapper<>();
        glassinfo.eq("engineer_id",glass.getEngineerId())
                .eq("tempering_layout_id", glass.getTemperingLayoutId());
        return temperingMapper.selectList(glassinfo);
    }
    @Override
    public List<TemperingGlassInfo> selectIntoGlass(int layoutId) {
    public List<TemperingGlassInfo> selectIntoGlass(TemperingGlassInfo temperingGlassInfo) {
        //获取进炉中的玻璃信息
        QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>();
        wrapper.eq("state",2)
                .eq("tempering_layout_id", layoutId)
        wrapper.eq("tempering_layout_id", temperingGlassInfo.getTemperingLayoutId())
                .eq("engineer_id", temperingGlassInfo.getEngineerId())
                .orderByAsc("tempering_layout_id","tempering_feed_sequence");
        return temperingMapper.selectList(wrapper);
    }
@@ -47,8 +51,13 @@
    @Override
    public List<TemperingGlassInfo> selectOutGlass() {
        //获取出炉中的玻璃信息
        QueryWrapper<TemperingGlassInfo> wrap = new QueryWrapper<>();
        wrap.select("Top 1 *").eq("state",3);
        TemperingGlassInfo glass=temperingMapper.selectOne(wrap);
        //根据工程号和版图获取数据
        QueryWrapper<TemperingGlassInfo> wapper = new QueryWrapper<>();
        wapper.eq("state", 3)
        wapper.eq("engineer_id",glass.getEngineerId())
                .eq("tempering_layout_id", glass.getTemperingLayoutId())
                .orderByAsc("tempering_layout_id","tempering_feed_sequence");
        return temperingMapper.selectList(wapper);
    }
@@ -58,14 +67,15 @@
        //获取过旋转台最大的钢化版图id
        QueryWrapper<TemperingGlassInfo> wapper = new QueryWrapper<>();
        wapper.select("Top 1 *").eq("state", 4)
                .orderByDesc("tempering_layout_id");
                .orderByDesc("tempering_layout_id,engineer_id");
        //根据最大的版图id显示钢化后的版图信息
        TemperingGlassInfo glassinfo= temperingMapper.selectOne(wapper);
        if (glassinfo == null) {
            return null;  // 直接返回null,表示没有找到符合条件的记录
        }
        QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>();
        wrapper.eq("tempering_layout_id",glassinfo.getTemperingLayoutId());
        wrapper.eq("tempering_layout_id",glassinfo.getTemperingLayoutId())
                .eq("engineer_id",glassinfo.getEngineerId());
        return  temperingMapper.selectList(wrapper);
    }
@@ -73,7 +83,7 @@
    @Override
    public List<TemperingGlassInfo> selectLayoutId() {
        QueryWrapper<TemperingGlassInfo> wrapper = new QueryWrapper<>();
        wrapper.select("distinct tempering_layout_id")
        wrapper.select("distinct tempering_layout_id,engineer_id")
                .eq("state",2)
                .orderByAsc("tempering_layout_id");
        return temperingMapper.selectList(wrapper);
@@ -86,4 +96,17 @@
                .groupBy("state");
        return temperingMapper.selectList(wrapper);
    }
    @Override
    public Integer updateTemperingState(TemperingGlassInfo temperingGlassInfo) {
        UpdateWrapper<TemperingGlassInfo> wrapper = new UpdateWrapper<>();
        wrapper.eq("glass_id",temperingGlassInfo.getGlassId())
                .lt("state",5)
                .set("state", temperingGlassInfo.getState());;
        if (temperingMapper.update(null,wrapper) > 0) {
            return 200;
        }else {
            return 100;
        }
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/S7control.java
@@ -66,6 +66,7 @@
                s7PLC.writeUInt16(address, data);
                result = true;
            } catch (Exception ex) {
                System.out.println("向plc写命令过程中发生异常,原因为:" + ex.getMessage());
                reStartS7client();
            } finally {
                tryCount -= 1;
hangzhoumesParent/common/servicebase/src/main/java/com/mes/tools/WebSocketServer.java
@@ -43,8 +43,6 @@
    public void onOpen(Session session, @PathParam("username") String username) {
        this.username = username;
        this.session = session;
        this.session.setMaxTextMessageBufferSize(12*1024*1024);
        this.session.setMaxBinaryMessageBufferSize(12*1024*1024);
        List<WebSocketServer> webSocketServers = sessionMap.get(username);
        if (webSocketServers == null) {
            ArrayList<WebSocketServer> arrayListwebserver = new ArrayList<WebSocketServer>();
@@ -98,7 +96,7 @@
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage(maxMessageSize = 5242880)
    @OnMessage
    public void onMessage(String message, Session session, @PathParam("username") String username) {
        log.info("服务端收到用户username={}的消息:{}", username, message);
        JSONObject obj = JSONUtil.parseObj(message);
@@ -121,9 +119,27 @@
    public void sendMessage(String message) {
        try {
            // log.info("服务端给客户端[{}]发送消息{}", this.session.getId(), message);
            this.session.getBasicRemote().sendText(message);
            if(this.session.isOpen()){
                int maxChunkSize = 50000; // 定义最大的分块大小
                int length = message.length();
                int chunks = (int) Math.ceil((double) length / maxChunkSize);
                //分块发送消息
                for (int i = 0; i < chunks; i++) {
                    int startIndex = i * maxChunkSize;
                    int endIndex = Math.min(startIndex + maxChunkSize, length);
                    String chunk = message.substring(startIndex, endIndex);
                    // 判断是否是最后一块消息
                    boolean isLastChunk = (i == chunks - 1);
                    if(isLastChunk==true){
                        chunk+="<END>";
                    }
                    // 发送分块消息,并传递是否是最后一块消息的标识
                    this.session.getBasicRemote().sendText(chunk);
                }
            }
        } catch (Exception e) {
            log.error("服务端发送消息给客户端失败", e);
            log.error("发送消息给客户端失败:{}", e.getMessage(), e);
        }
    }
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/controller/WorkAssignmentController.java
@@ -1,18 +1,15 @@
package com.mes.work_assignment.controller;
import cn.hutool.core.date.DateTime;
import com.mes.damage.service.DamageService;
import com.mes.utils.Result;
import com.mes.work_assignment.entity.WorkAssignment;
import com.mes.work_assignment.service.WorkAssignmentService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * <p>
@@ -35,5 +32,11 @@
        return Result.build(200,"查询成功",workAssignmentService.selectWorkAssignment(line,workingProcedure));
    }
    @ApiOperation("值班数据修改")
    @PostMapping("/updateWorkAssignment")
    public Result updateWorkAssignment(@RequestBody List<WorkAssignment> workAssignmentList) {
        workAssignmentService.saveOrUpdateBatch(workAssignmentList);
        return Result.build(200,"修改成功",1);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/work_assignment/mapper/WorkAssignmentMapper.java
@@ -1,5 +1,6 @@
package com.mes.work_assignment.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.mes.work_assignment.entity.WorkAssignment;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
@@ -11,6 +12,7 @@
 * @author wu
 * @since 2024-07-01
 */
@DS("hangzhoumes")
public interface WorkAssignmentMapper extends BaseMapper<WorkAssignment> {
}
hangzhoumesParent/common/springsecurity/src/main/java/com/mes/userinfo/mapper/SysUserMapper.java
@@ -1,5 +1,6 @@
package com.mes.userinfo.mapper;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.userinfo.entity.SysUser;
@@ -11,7 +12,7 @@
 * @author zhoush
 * @since 2024-04-11
 */
@DS("hangzhoumes")
public interface SysUserMapper extends MPJBaseMapper<SysUser> {
}
hangzhoumesParent/moduleService/CacheGlassModule/src/main/java/com/mes/job/CacheGlassTask.java
@@ -5,6 +5,7 @@
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.github.yulichang.query.MPJQueryWrapper;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.mes.common.S7object;
@@ -587,11 +588,9 @@
                log.info("6、添加出片任务是否完成:{}", taskCacheStatus);
            } else {
                log.info("5、非直通任务,将玻璃信息插入卧式理片笼,当前玻璃信息:{}", glassInfo);
                LambdaQueryWrapper<EdgStorageCageDetails> wrapper = new LambdaQueryWrapper<>();
                wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId());
                EdgStorageCageDetails updateDetail = new EdgStorageCageDetails();
                updateDetail.setState(Const.GLASS_STATE_OUT);
                edgStorageCageDetailsService.update(updateDetail, wrapper);
                LambdaUpdateWrapper<EdgStorageCageDetails> wrapper = new LambdaUpdateWrapper<>();
                wrapper.eq(EdgStorageCageDetails::getGlassId, glassInfo.getGlassId()).set(EdgStorageCageDetails::getState, Const.GLASS_STATE_OUT);
                edgStorageCageDetailsService.update(wrapper);
                log.info("5、更新出片玻璃的状态为{}", Const.GLASS_STATE_OUT);
                boolean taskCacheStatus = saveTaskCache(glassInfo.getGlassId(), glassInfo.getSlot(), endcell, Const.GLASS_CACHE_TYPE_OUT);
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/controller/BigStorageCageDetailsController.java
@@ -34,7 +34,11 @@
    @PostMapping("/selectBigStorageCageDetails")
    public Result selectBigStorageCageDetails(@RequestBody Map map) {
        List<BigStorageCageDetails> bigStorageCageDetails=bigStorageCageDetailsService.selectBigStorageCageDetails(map.get("glassId").toString());
        if (bigStorageCageDetails.size()>0){
        return Result.build(200,"查询成功",bigStorageCageDetails);
        }else{
            return Result.build(200,"查询失败,无此玻璃id",bigStorageCageDetails);
        }
    }
    @ApiOperation("理片笼详情添加")
@@ -68,10 +72,25 @@
    @ApiOperation("理片笼任务出片")
    @PostMapping("/outBigStorageCageDetails")
    public Result outBigStorageCageDetails(@RequestBody BigStorageCageDetails bigStorageCageDetails) {
        bigStorageCageDetailsService.outBigStorageCageDetails(bigStorageCageDetails);
        return Result.build(200,"出片添加成功",1);
    }
    @ApiOperation("指定钢化")
    @PostMapping("/TemperingGlass")
    public Result TemperingGlass(@RequestBody BigStorageCageDetails bigStorageCageDetails) {
        boolean result=bigStorageCageDetailsService.TemperingGlass(bigStorageCageDetails.getTemperingLayoutId().toString(),bigStorageCageDetails.getEngineerId());
        if(result==true){
            return Result.build(200,"指定钢化成功",1);
        }else {
            return Result.build(200, "已存在钢化任务,请等待钢化完成再指定钢化", 1);
        }
    }
    @ApiOperation("钢化查询")
    @PostMapping("/selectTemperingGlass")
    public Result selectTemperingGlass() {
        return Result.build(200,"查询成功",bigStorageCageDetailsService.selectTemperingGlass());
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java
@@ -60,11 +60,6 @@
    @ApiModelProperty(value = "玻璃类型", position = 8)
    private Integer glassType;
    /**
     * 高
     */
    @ApiModelProperty(value = "高", position = 10)
    private double height;
    /**
     * 厚度
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageDTO.java
@@ -22,4 +22,9 @@
     * 玻璃数量
     */
    private Integer glassCount;
    /**
     * 笼子号
     */
    private Integer deviceId;
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -8,6 +8,7 @@
import com.mes.glassinfo.entity.GlassInfo;
import java.util.List;
import java.util.Map;
/**
 * <p>
@@ -64,4 +65,8 @@
     * @return
     */
    List<SlotSequenceDTO> queryGlassMaxAndMin(String engineerId, Integer temperingLayoutId);
    boolean TemperingGlass(String temperingLayoutId, String engineerId);
    List<Map<String, Object>> selectTemperingGlass();
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.mes.bigstorage.entity.BigStorageCage;
@@ -17,6 +18,8 @@
import com.mes.bigstoragetask.mapper.BigStorageCageFeedTaskMapper;
import com.mes.bigstoragetask.mapper.BigStorageCageOutTaskMapper;
import com.mes.common.config.Const;
import com.mes.damage.entity.Damage;
import com.mes.damage.service.DamageService;
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.mapper.GlassInfoMapper;
import com.mes.temperingglass.entity.TemperingGlassInfo;
@@ -53,6 +56,9 @@
    private BigStorageCageService bigStorageCageService;
    @Resource
    private GlassInfoMapper glassInfoMapper;
    @Resource
    private DamageService damageService;
    @Value("${mes.minCount}")
    private int minCount;
@@ -197,14 +203,19 @@
            temperingGlassInfoMapper.updateById(temperingGlassInfo);
        }
        if (status == 0) {
            bigStorageCageDetails.setState(Const.GLASS_STATE_TAKE);
        } else {
            bigStorageCageDetails.setState(Const.GLASS_STATE_DAMAGE);
        } else {
            bigStorageCageDetails.setState(Const.GLASS_STATE_TAKE);
        }
        baseMapper.updateById(bigStorageCageDetails);
        bigStorageCageService.updateRemainWidth(bigStorageCageDetails.getSlot());
        //todo:插入破损数据
        Damage damage = new Damage();
        damage.setGlassId(bigStorageCageDetails.getGlassId());
        damage.setWorkingProcedure("冷加工");
        damage.setRemark("大理片笼破损");
        damage.setStatus(2);
        damageService.insertDamage(damage);
    }
    //查询玻璃信息
@@ -218,10 +229,13 @@
            BeanUtils.copyProperties(glassInfo, bigStorageCageDetails);
            bigStorageCageDetails.setState(1);
            bigStorageCageDetails.setGap(glassGap);
        }
        List<BigStorageCageDetails> bigStorageCageDetailsList = new ArrayList<>();
        bigStorageCageDetailsList.add(bigStorageCageDetails);
        return bigStorageCageDetailsList;
        } else {
            return null;
        }
    }
    //理片笼详情添加
@@ -260,7 +274,7 @@
                .leftJoin(BigStorageCageDetails.class, BigStorageCageDetails::getSlot, BigStorageCage::getSlot)
                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
                .eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
                .gt(BigStorageCage::getRemainWidth, glassInfo.getWidth())
                .gt(BigStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight()))
                .last("limit 1");
        if (glassInfo.getTemperingLayoutId() == 0) {
            wrapper.eq(BigStorageCageDetails::getWidth, glassInfo.getWidth()).eq(BigStorageCageDetails::getHeight, glassInfo.getHeight());
@@ -272,6 +286,7 @@
            bigStorageDTO = new BigStorageDTO();
            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
            bigStorageDTO.setSlot(bigStorageCage.getSlot());
            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
            return bigStorageDTO;
        }
        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
@@ -284,19 +299,37 @@
            bigStorageDTO = new BigStorageDTO();
            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
            bigStorageDTO.setSlot(bigStorageCage.getSlot());
            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
            return bigStorageDTO;
        }
        //todo:获取玻璃的厚度:重新选笼子需要按照笼子可放玻璃厚度进行选择
        //获取玻璃的厚度:重新选笼子需要按照笼子可放玻璃厚度进行选择
        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                .eq(BigStorageCage::getRemainWidth, slotWidth)
                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
                .gt(BigStorageCage::getMaxThickness, glassInfo.getThickness())
                .notInSql(BigStorageCage::getDeviceId,
                        "select distinct device_id from big_storage_cage_details where state in (100,102,103)")
                .ge(BigStorageCage::getMaxThickness, glassInfo.getThickness())
                .orderByAsc(BigStorageCage::getDeviceId)
                .last("limit 1"));
        if (null != bigStorageCage) {
            bigStorageDTO = new BigStorageDTO();
            bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
            bigStorageDTO.setSlot(bigStorageCage.getSlot());
            bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
            return bigStorageDTO;
        }
        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                .eq(BigStorageCage::getRemainWidth, slotWidth)
                .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
                .ge(BigStorageCage::getMaxThickness, glassInfo.getThickness())
                .orderByAsc(BigStorageCage::getDeviceId)
                .last("limit 1"));
        Assert.isTrue(null != bigStorageCage, "没有空余的笼子存放玻璃");
        bigStorageDTO = new BigStorageDTO();
        bigStorageDTO.setWidth(bigStorageCage.getRemainWidth());
        bigStorageDTO.setSlot(bigStorageCage.getSlot());
        bigStorageDTO.setDeviceId(bigStorageCage.getDeviceId());
        return bigStorageDTO;
    }
@@ -315,4 +348,48 @@
    public List<SlotSequenceDTO> queryGlassMaxAndMin(String engineerId, Integer temperingLayoutId) {
        return baseMapper.queryGlassMaxAndMin(engineerId, temperingLayoutId);
    }
    @Override
    public boolean TemperingGlass(String temperingLayoutId, String engineerId) {
        LambdaQueryWrapper<TemperingGlassInfo> temperingGlassInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
        temperingGlassInfoLambdaQueryWrapper
                .eq(TemperingGlassInfo::getState,Const.TEMPERING_NEW);
        List<TemperingGlassInfo> temperingGlassInfoList=temperingGlassInfoMapper.selectList(temperingGlassInfoLambdaQueryWrapper);
        if(temperingGlassInfoList.size()==0){
            LambdaQueryWrapper<BigStorageCageDetails> wrapper =new LambdaQueryWrapper<>();
            wrapper.eq(BigStorageCageDetails::getTemperingLayoutId,temperingLayoutId)
                    .eq(BigStorageCageDetails::getEngineerId,engineerId)
                    .in(BigStorageCageDetails::getState,Const.GLASS_STATE_IN,Const.GLASS_STATE_ARTIFICIAL);
            List<BigStorageCageDetails> bigStorageCageDetailsList=baseMapper.selectList(wrapper);
            for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList
            ) {
                TemperingGlassInfo temperingGlassInfo = new TemperingGlassInfo();
                LambdaQueryWrapper<GlassInfo> glassInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
                glassInfoLambdaQueryWrapper.eq(GlassInfo::getGlassId, bigStorageCageDetails.getGlassId());
                GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoLambdaQueryWrapper);
                BeanUtils.copyProperties(glassInfo, temperingGlassInfo);
                temperingGlassInfo.setAngle((int) glassInfo.getAngle());
                temperingGlassInfo.setState(Const.TEMPERING_NEW);
                temperingGlassInfo.setSlot(bigStorageCageDetails.getSlot());
                temperingGlassInfoMapper.insert(temperingGlassInfo);
            }
            return true;
        } else {
            return false;
        }
    }
    @Override
    public List<Map<String, Object>> selectTemperingGlass(){
        QueryWrapper<BigStorageCageDetails> wrapper = new QueryWrapper<>();
        wrapper.select("engineer_id,tempering_layout_id,count(*) as count")
                .groupBy("engineer_id,tempering_layout_id");
        List<Map<String, Object>> TemperingGlass = baseMapper.selectMaps(wrapper);
        return TemperingGlass;
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageServiceImpl.java
@@ -18,6 +18,7 @@
import com.mes.temperingglass.service.TemperingGlassInfoService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@@ -48,6 +49,9 @@
    @Resource
    private GlassInfoService glassInfoService;
    @Value("${mes.glassGap}")
    private Integer glassGap;
    //进片逻辑
    @Override
@@ -217,15 +221,13 @@
        LambdaQueryWrapper<BigStorageCageDetails> bigStorageCageDetailsWrapper = new LambdaQueryWrapper();
        bigStorageCageDetailsWrapper
                .eq(BigStorageCageDetails::getSlot, slot)
                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL);
                .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN, Const.GLASS_STATE_ARTIFICIAL);
        List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsMapper.selectList(bigStorageCageDetailsWrapper);
        for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList
        ) {
            double widths = bigStorageCageDetails.getWidth();
            double gap = bigStorageCageDetails.getGap();
            width -= widths + gap;
            width = width - widths - glassGap;
        }
        //修改格子剩余宽度
        BigStorageCage bigStorageCage = new BigStorageCage();
@@ -241,7 +243,7 @@
        MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(BigStorageCage.class).selectCollection(BigStorageCageDetails.class, BigStorageCage::getBigStorageCageDetails)
                .leftJoin(BigStorageCageDetails.class, on -> on.eq(BigStorageCageDetails::getSlot, BigStorageCage::getSlot)
                        .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN, Const.GLASS_STATE_ARTIFICIAL))
                        .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN, Const.GLASS_STATE_ARTIFICIAL,Const.GLASS_STATE_OUT_ING))
                        .orderByAsc(BigStorageCage::getDeviceId)
                        .orderByAsc(BigStorageCage::getSlot);
        return bigStorageCageMapper.selectJoinList(BigStorageCage.class, wrapper);
@@ -254,7 +256,7 @@
        MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>();
        wrapper.selectAll(BigStorageCage.class).selectCollection(BigStorageCageDetails.class, BigStorageCage::getBigStorageCageDetails)
                .leftJoin(BigStorageCageDetails.class, on -> on.eq(BigStorageCageDetails::getSlot, BigStorageCage::getSlot)
                        .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN, Const.GLASS_STATE_ARTIFICIAL));
                        .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN, Const.GLASS_STATE_ARTIFICIAL,Const.GLASS_STATE_OUT_ING));
        List<BigStorageCage> bigStorageCages = bigStorageCageMapper.selectJoinList(BigStorageCage.class, wrapper);
        Map<Integer, List<BigStorageCage>> listMap = bigStorageCages.stream().collect(Collectors.groupingBy(item -> item.getDeviceId()));
        return listMap;
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstoragetask/entity/BigStorageCageOutTask.java
@@ -27,10 +27,12 @@
    public BigStorageCageOutTask() {
    }
    public BigStorageCageOutTask(String glassId, Integer startSlot, Integer endSlot, Integer width, Integer trainNumber, Integer serialNumber, Integer taskState) {
    public BigStorageCageOutTask(String glassId, Integer startSlot, Integer endSlot, double width, double height, Integer trainNumber, Integer serialNumber, Integer taskState) {
        this.glassId = glassId;
        this.startSlot = startSlot;
        this.endSlot = endSlot;
        this.width = width;
        this.height = height;
        this.trainNumber = trainNumber;
        this.serialNumber = serialNumber;
        this.taskState = taskState;
@@ -60,6 +62,16 @@
     */
    @ApiModelProperty(value = "目标位置", position = 5)
    private Integer endSlot;
    /**
     * 目标位置
     */
    @ApiModelProperty(value = "目标位置", position = 5)
    private double width;
    /**
     * 目标位置
     */
    @ApiModelProperty(value = "目标位置", position = 5)
    private double height;
    /**
     * 车次
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/common/S7object.java
@@ -57,12 +57,17 @@
                e.printStackTrace();
            }
            Date startDate = new Date();
            log.info("大理片笼读取plc数据开始时间:{}", startDate);
            byte[] getplcvlues = plccontrol.readByte(PlcMesObject.getPlcAddressBegin(), PlcMesObject.getPlcAddressLength());
            Date endDate = new Date();
            log.info("大理片笼读取plc数据结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime());
            log.info("大理片笼读取plc数据,开始时间:{},结束时间:{},共耗时:{}ms,结束扫码任务", startDate, endDate, endDate.getTime() - startDate.getTime());
            if (getplcvlues != null) {
                PlcMesObject.setPlcParameterList(getplcvlues);
                log.info("大理片当前进卧转立确认字为d01:{},d04:{},进笼送片任务确认字为:d03:{},d05:{},出片任务确认字为{}",
                        PlcMesObject.getPlcParameter("MESToD01").getValue(),
                        PlcMesObject.getPlcParameter("MESToD04").getValue(),
                        PlcMesObject.getPlcParameter("MESToD03").getValue(),
                        PlcMesObject.getPlcParameter("MESToD05").getValue(),
                        PlcMesObject.getPlcParameter("MESToPLC").getValue());
            }
        }
    }
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcSlicecage.java
@@ -33,14 +33,13 @@
    private TemperingGlassInfoService temperingGlassInfoService;
    private JSONObject jsonObject = new JSONObject();
    private JSONObject jsonObject1 = new JSONObject();
    public void queryDataSource1() throws InterruptedException {
        List<Double> carPostion=new ArrayList<>();
        carPostion.add(0.25);
        carPostion.add(0.5);
        jsonObject.append("carPostion",carPostion);
        //界面展示笼子信息
        jsonObject1.append("bigStorageCageInfos", bigStorageCageService.querybigStorageCageDetail());
        jsonObject.append("bigStorageCageInfos", bigStorageCageService.querybigStorageCageDetail());
        //进片任务数据
        List<BigStorageCageDetails> bigStorageCageDetailsFeedTask=bigStorageCageDetailsService.selectTask(1);
@@ -72,7 +71,6 @@
    @Scheduled(fixedDelay = 1000)
    public void plcStorageCageTask() throws InterruptedException {
        jsonObject = new JSONObject();
        jsonObject1 = new JSONObject();
        try {
            //查询使用数据源1查询数据
            queryDataSource1();
@@ -84,7 +82,6 @@
                for (WebSocketServer webserver : sendwServer) {
                    if (webserver != null) {
                        webserver.sendMessage(jsonObject.toString());
                        webserver.sendMessage(jsonObject1.toString());
                        List<String> messages = webserver.getMessages();
                        if (!messages.isEmpty()) {
                            // // 将最后一个消息转换为整数类型的列表
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -85,6 +85,13 @@
    @Value("${mes.glassGap}")
    private Integer glassGap;
    @Value("${mes.xMaxSize}")
    private Integer xMaxSize;
    private String d01GlassId = "";
    private String d04GlassId = "";
    @Scheduled(fixedDelay = 300)
    public void plcToHomeEdgScan() {
        Date startDate = new Date();
@@ -114,11 +121,17 @@
        }
        //按照线路及玻璃id获取相邻两块玻璃 卧转立上的玻璃:  状态为0不操作(D01送片,0不操作,1允许送片),请求字为1, (02玻璃id为空或者卧转立未启动)
        if (!REQUEST_WORD.equals(mesD01Value) && REQUEST_WORD.equals(d01ToMES) && (StringUtils.isBlank(d02State) || !REQUEST_WORD.equals(d03State))) {
            if (!d01GlassId.equals(d01Id)) {
            judgeGlassTypeStatus(d01Id, Const.A09_OUT_TARGET_POSITION, mesD01Address);
                d01GlassId = d01Id;
            }
        }
//        状态为0不操作(D01送片,0不操作,1允许送片),请求字为1, 卧转立未启动
        if (!REQUEST_WORD.equals(mesD04Value) && REQUEST_WORD.equals(d04ToMES) && !REQUEST_WORD.equals(d05State)) {
            if (!d04GlassId.equals(d04Id)) {
            judgeGlassTypeStatus(d04Id, Const.A10_OUT_TARGET_POSITION, mesD04Address);
                d04GlassId = d04Id;
            }
        }
        Date endDate = new Date();
        log.info("大理片笼扫码任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime());
@@ -145,6 +158,7 @@
        }
        LambdaQueryWrapper<BigStorageCageFeedTask> wrapper = new LambdaQueryWrapper<BigStorageCageFeedTask>()
                .eq(BigStorageCageFeedTask::getTaskType, Const.BIG_STORAGE_IN_RUN)
                .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO))
                .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP);
        //获取可以启动卧转立的任务线路
        List<BigStorageCageFeedTask> feedTaskList = bigStorageCageFeedTaskService.list(wrapper);
@@ -169,7 +183,7 @@
//            log.info("两条线都存在进片任务,结束任务");
//            return;
//        }
        //获取两条线卧转立是否有玻璃,且任务状态都为2
        //获取两条线卧转立是否有玻璃,且任务状态为1/2
        List<Integer> lineList = bigStorageCageFeedTaskService.querySitToUpGlass();
        if (CollectionUtils.isEmpty(lineList)) {
            Date endDate = new Date();
@@ -235,6 +249,11 @@
        Date startDate = new Date();
        log.info("大理片笼空车进片任务开始执行时间:{}", startDate);
        PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject;
        String e02State = plcMesObject.getPlcParameter("E02State").getAddress();
        if (REQUEST_WORD.equals(e02State)) {
            log.info("出片忙碌,结束出片任务");
            return;
        }
        String mesToPLCAddress = plcMesObject.getPlcParameter("MESToPLC").getAddress();
        List<BigStorageCageOutTask> outingList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>().eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_NEW));
        Assert.isTrue(CollectionUtils.isEmpty(outingList), "有正在执行出片的任务,结束当前出片线程");
@@ -298,16 +317,50 @@
                    List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                            .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN));
                    List<BigStorageCageOutTask> outTasks = list.stream().map(e -> new BigStorageCageOutTask(e.getGlassId(), first.getSlot(), second.getSlot(),
                            slotWidth, 0, 0, 1)).collect(Collectors.toList());
                            e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1)).collect(Collectors.toList());
                    bigStorageCageOutTaskService.saveBatch(outTasks);
                    //向plc写入确认字
                    int returnData = 0;
                    int count = 1;
                    while (returnData == 0) {
                        log.info("已向plc第{}次送协议", count);
                    S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1);
                    log.info("已向plc发送出片任务确认,地址为:{}", mesToPLCAddress);
                        returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0);
                        log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData);
                    }
                    Date endDate = new Date();
                    log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime());
                    return;
                }
            }
        }
    }
    @Scheduled(fixedDelay = 300)
    public void updateOutGlassStateTask() {
        Date startDate = new Date();
        log.info("1、大理片笼出片完成后更新大理片笼数据任务开始执行时间:{}", startDate);
        //因为大理片笼和出片任务是两个库的数据,所以要分开查找
        List<Object> list = bigStorageCageDetailsService.listObjs(new LambdaQueryWrapper<BigStorageCageDetails>()
                .select(BigStorageCageDetails::getGlassId).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING));
        if (CollectionUtils.isNotEmpty(list)) {
            log.info("2、获取所有正在出片的玻璃信息id:{}", list);
            List<String> glassIds = list.stream().map(String::valueOf).collect(Collectors.toList());
            List<Object> outSuccessGlassIdsObj = bigStorageCageOutTaskService.listObjs(new LambdaQueryWrapper<BigStorageCageOutTask>()
                    .select(BigStorageCageOutTask::getGlassId).in(BigStorageCageOutTask::getGlassId, glassIds).in(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_ALL));
            List<String> outSuccessGlassIds = outSuccessGlassIdsObj.stream().map(String::valueOf).collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(outSuccessGlassIds)) {
                log.info("3、获取出片已完成的玻璃信息id:{}", outSuccessGlassIdsObj);
                bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
                        .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT).in(BigStorageCageDetails::getGlassId, outSuccessGlassIds));
                log.info("4、大理片笼出片状态已完成已完成的玻璃信息id:{}", outSuccessGlassIdsObj);
            }
        }
        Date endDate = new Date();
        log.info("end:大理片笼出片完成后更新大理片笼数据任务结束时间:{},共耗时:{}ms,结束任务", endDate, endDate.getTime() - startDate.getTime());
        return;
    }
    /**
@@ -321,7 +374,11 @@
        List<BigStorageCageFeedTask> inDamageTaskInfoList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
                .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_DAMAGE));
        if (CollectionUtils.isNotEmpty(inDamageTaskInfoList)) {
            log.info("获取进片任务表中破损的玻璃信息{}", inDamageTaskInfoList);
            bigStorageCageFeedTaskService.remove(new LambdaQueryWrapper<BigStorageCageFeedTask>().eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_DAMAGE));
            //理片笼详情表数据状态更新
            bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
                    .set(BigStorageCageDetails::getState, Const.GLASS_STATE_DAMAGE).in(BigStorageCageDetails::getGlassId, inDamageTaskInfoList.stream().map(BigStorageCageFeedTask::getGlassId).collect(Collectors.toList())));
            //将破损信息新增入破损表
            for (BigStorageCageFeedTask bigStorageCageFeedTask : inDamageTaskInfoList) {
                Damage damage = new Damage();
@@ -332,14 +389,21 @@
                damage.setStatus(2);
                damageService.insertDamage(damage);
            }
            log.info("进片任务执行完成");
        }
        //获取出片任务表中状态为破损的数据
        List<BigStorageCageOutTask> outDamageTaskInfoList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>()
                .eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_DAMAGE));
        if (CollectionUtils.isNotEmpty(outDamageTaskInfoList)) {
            log.info("获取出片任务表中破损的玻璃信息{}", outDamageTaskInfoList);
            bigStorageCageOutTaskService.remove(new LambdaQueryWrapper<BigStorageCageOutTask>().eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_IN_DAMAGE));
            List<String> glassIdList = outDamageTaskInfoList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
            //移除钢化下片表数据
            temperingGlassInfoService.remove(new LambdaQueryWrapper<TemperingGlassInfo>().in(TemperingGlassInfo::getGlassId, glassIdList));
            //理片笼详情表数据状态更新
            bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
                    .set(BigStorageCageDetails::getState, Const.GLASS_STATE_DAMAGE).in(BigStorageCageDetails::getGlassId, glassIdList));
            //将破损信息新增入破损表
            for (BigStorageCageOutTask bigStorageCageOutTask : outDamageTaskInfoList) {
                Damage damage = new Damage();
@@ -350,6 +414,7 @@
                damage.setStatus(2);
                damageService.insertDamage(damage);
            }
            log.info("出片任务执行完成");
        }
        Date endDate = new Date();
        log.info("大理片笼破损玻璃清除任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime());
@@ -411,7 +476,15 @@
        }
        //向plc发送进片确认
        if (flag) {
            //向plc写入确认字
            int returnData = 0;
            int count = 1;
            while (returnData == 0) {
            S7object.getinstance().plccontrol.writeWord(mesAddress, 1);
                returnData = S7object.getinstance().plccontrol.readWord(mesAddress, 1).get(0);
                log.info("进卧转立第{}次发送确认字完成,地址为:{},写入的内容为{}", count++, mesAddress, returnData);
            }
        }
        //记录无法放下玻璃,后续判断启动
        return flag;
@@ -439,7 +512,8 @@
     */
    public Integer getStartLine() {
        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
                .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2 group by line"));
                .inSql(BigStorageCageFeedTask::getId, "select min(id) from big_storage_cage_feed_task where task_state = 2" +
                        "and (target_slot = 0 or target_slot is null) group by line"));
        Assert.isFalse(CollectionUtils.isEmpty(taskList), "卧转立两条线都没有玻璃进片任务");
        Map<String, Integer> taskMap = taskList.stream().collect(Collectors.toMap(BigStorageCageFeedTask::getGlassId,
                BigStorageCageFeedTask::getLine));
@@ -458,6 +532,7 @@
        //1、获取任务表中的所有玻璃(指定线路且已经进卧转立完成)
        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
                .eq(BigStorageCageFeedTask::getLine, line)
                .and(e -> e.isNull(BigStorageCageFeedTask::getTargetSlot).or().eq(BigStorageCageFeedTask::getTargetSlot, Const.OUT_TARGET_POSITION_ZERO))
                .in(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP_ALL)
                .orderByAsc(BigStorageCageFeedTask::getId));
        //2、去笼子内查找是否可以继续存放的笼子
@@ -487,7 +562,7 @@
            //2、获取目标格子信息
            BigStorageDTO bigStorageDTO = bigStorageCageDetailsService.queryTargetSlotByTempering(info);
            //3、更新大理片笼表剩余宽度
            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - info.getWidth())
            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, bigStorageDTO.getWidth() - info.getWidth() - glassGap)
                    .eq(BigStorageCage::getSlot, bigStorageDTO.getSlot()));
            //4、更新进片任务表,目标格子及状态(状态改为2 电气扫到自行处理)  遇到问题:无法批量更新,批量更新无法走指定从库
            e.setTargetSlot(bigStorageDTO.getSlot());
@@ -497,6 +572,8 @@
            //5、将进片信息存入大理片笼详情表
            cageDetails.setSlot(bigStorageDTO.getSlot());
            cageDetails.setState(Const.GLASS_STATE_IN);
            cageDetails.setDeviceId(bigStorageDTO.getDeviceId());
            cageDetails.setGap(glassGap);
            bigStorageCageDetailsService.save(cageDetails);
        }
        sendTaskListToPLC(taskList, line);
@@ -514,8 +591,13 @@
            s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine());
            s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot());
        }
        int returnData = 0;
        int count = 1;
        while (returnData == 0) {
        s7control.writeWord(outLine, 2);
        log.info("送片任务已发送完成,任务线路为:{},启动地址为{},确认字为{}", line, outLine, 2);
            returnData = s7control.readWord(outLine, 1).get(0);
            log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, outLine, returnData);
        }
    }
    private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, Boolean isTempering, String mesToPLCAddress) {
@@ -523,17 +605,25 @@
        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
        //打车剩余尺寸
        Integer remainWidth = carWidth;
        int maxX = 0;
        for (T e : list) {
            if (bigStorageCageOutTaskList.size() > outCarMaxSize || e.getWidth() > remainWidth) {
            if (bigStorageCageOutTaskList.size() >= outCarMaxSize || e.getWidth() > remainWidth) {
                break;
            }
            remainWidth = remainWidth - (int) e.getWidth() - glassGap;
            if (isTempering) {
                int minLength = Math.min((int) e.getWidth(), (int) e.getHeight());
                if (maxX + minLength <= xMaxSize) {
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.TEMPERING_OUT_TARGET_POSITION,
                        (int) e.getWidth() * 10, 0, 0, 1));
                            e.getWidth() * 10, e.getHeight() * 10, 0, 0, 1));
                    maxX = Math.max(maxX, e.getXCoordinate());
                } else {
                    break;
                }
            } else {
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.ARTIFICIAL_OUT_TARGET_POSITION,
                        (int) e.getWidth() * 10, 0, 0, 1));
                        e.getWidth() * 10, e.getHeight(), 0, 0, 1));
            }
        }
@@ -543,26 +633,32 @@
        List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
        log.info("将出片玻璃{}玻璃状态改为已出片", glassIds);
        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)
                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT_ING)
                .in(BigStorageCageDetails::getGlassId, glassIds));
        //更新笼子内格子的剩余尺寸
        updateSlotRemain(list, glassIds);
        int returnData = 0;
        int count = 1;
        while (returnData == 0) {
        S7object.getinstance().plccontrol.writeWord(mesToPLCAddress, 1);
        log.info("已向plc发送出片任务确认,地址为:{}", mesToPLCAddress);
            returnData = S7object.getinstance().plccontrol.readWord(mesToPLCAddress, 1).get(0);
            log.info("已向plc第{}次发送出片任务确认,地址为:{},写入的内容为{}", count++, mesToPLCAddress, returnData);
        }
        return Boolean.TRUE;
    }
    /**
     * 更新笼子内格子的剩余尺寸
     *
     * @param list
     * @param taskGlassIds
     * @param list         笼内可以出笼的玻璃信息
     * @param taskGlassIds 本次任务出去的玻璃ids
     * @param <T>
     */
    public <T extends BigStorageCageBaseInfo> void updateSlotRemain(List<T> list, List<String> taskGlassIds) {
        //获取需要出去(包括待出去的)的所有玻璃格子号
        List<Integer> slotList = list.stream().map(T::getSlot).distinct().collect(Collectors.toList());
        //获取待出去的玻璃信息(等下车出去的玻璃)
        //获取待出去的玻璃信息(等待本次任务结束后下车出去的玻璃)
        Map<Integer, Double> slotRemainMap = list.stream().filter(e -> !taskGlassIds.contains(e.getGlassId()))
                .collect(Collectors.groupingBy(T::getSlot, Collectors.summingDouble(item -> item.getWidth() + glassGap)));
        if (CollectionUtils.isNotEmpty(slotRemainMap)) {
@@ -588,7 +684,7 @@
        }
        //获取玻璃信息
        GlassInfo glassInfo = glassInfoService.getOne(new LambdaQueryWrapper<GlassInfo>().eq(GlassInfo::getGlassId, glassId));
        return sitToUpRemainWidth.getWidth() < glassInfo.getWidth();
        return sitToUpRemainWidth.getWidth() < Math.max(glassInfo.getWidth(), glassInfo.getHeight());
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml
@@ -3,7 +3,7 @@
spring:
  profiles:
    active: prod
    active: cz
  application:
    name: cacheVerticalGlass
mybatis-plus:
@@ -16,6 +16,7 @@
  minCount: 5
  carWidth: 5000   #大车宽度
  slotWidth: 5000   #大车宽度
  inCarMaxSize: 6     #进片大车最大存放玻璃数量
  outCarMaxSize: 1     #出片大车最大存放玻璃数量
  glassGap: 300      #玻璃间距
  inCarMaxSize: 2     #进片大车最大存放玻璃数量
  outCarMaxSize: 3     #出片大车最大存放玻璃数量
  glassGap: 1000      #玻璃间距
  xMaxSize: 2850
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -37,7 +37,7 @@
             ) T2
                 INNER JOIN (SELECT ENGINEER_ID, TEMPERING_LAYOUT_ID, COUNT(TEMPERING_FEED_SEQUENCE) AS COUNT
                             FROM BIG_STORAGE_CAGE_DETAILS
                             WHERE STATE in (100, 101, 102)
                             WHERE STATE in (100, 101, 102, 103)
                             GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID) T3 ON T2.ENGINEER_ID = T3.ENGINEER_ID
            AND T2.TEMPERING_LAYOUT_ID = T3.TEMPERING_LAYOUT_ID
            AND T2.COUNT = T3.COUNT
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageFeedTaskMapper.xml
@@ -34,6 +34,7 @@
                            END MAX_LENGTH
                 FROM BIG_STORAGE_CAGE_FEED_TASK
                 WHERE LINE = #{line}
                   AND (target_slot = 0 or target_slot is null)
                   AND TASK_STATE IN (1, 2)
             ) T
    </select>
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
@@ -38,8 +38,8 @@
    @Autowired
    DamageService damageService;
    @Autowired
    BigStorageCageFeedTaskMapper bigStorageCageFeedTaskMapper;
//    @Autowired
//    BigStorageCageFeedTaskMapper bigStorageCageFeedTaskMapper;
    @Test
    public void testInsertSlot() {
@@ -161,4 +161,10 @@
        damage.setStatus(2);
        damageService.insertDamage(damage);
    }
    @Test
    public void updateOutGlassStateTask() {
        plcStorageCageTask.updateOutGlassStateTask();
    }
}
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/job/PlcLoadGlassTask.java
@@ -43,7 +43,7 @@
     * fixedDelay : 上一个调用结束后再次调用的延时
     */
    @Scheduled(fixedDelay = 30000000)
    @Scheduled(fixedDelay = 300)
    public void plcLoadGlassTask() throws InterruptedException {
        try {
            //获取联机状态
@@ -87,7 +87,7 @@
        }
    }
    @Scheduled(fixedDelay = 30000000)
    @Scheduled(fixedDelay = 300)
    public void plcLoadGlassReport(){
        //获取是否有汇报
        String loadStatus = plcParameterObject.getPlcParameter("PlcStatus").getValue();
@@ -144,8 +144,8 @@
    public void loadGlassStatus(){
        JSONObject jsonObject = new JSONObject();
        //正在进行的任务
        //String inkageStatus =plcParameterObject.getPlcParameter("MesToPlc").getValue();
        String inkageStatus ="1";
        String inkageStatus =plcParameterObject.getPlcParameter("MesToPlc").getValue();
        //String inkageStatus ="1";
        jsonObject.append("InkageStatus", inkageStatus);
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("loadGlass");
        if (sendwServer != null) {
hangzhoumesParent/moduleService/LoadGlassModule/src/main/java/com/mes/uppattenusage/service/impl/UpPattenUsageServiceImpl.java
@@ -66,8 +66,8 @@
        List<OptimizeUpPattenUsage> upPattenUsageList = null;
        if (engineeringId != null) {
            upPattenUsageList = optimizeProjectMapper.selectJoinList(OptimizeUpPattenUsage.class, new MPJQueryWrapper<OptimizeProject>()
                    .select("t.project_no,t.glass_type,b.o_width as width,b.o_height as height ,REGEXP_REPLACE(t.glass_thickness,'\\D','')as glass_thickness,b.stock_number")
                    .leftJoin("optimize_detail b on t.project_no=b.project_no")
                    .select("t.project_no,t.glass_type,b.width,b.height ,REGEXP_REPLACE(t.glass_thickness,'\\D','')as glass_thickness,b.count as stockId")
                    .leftJoin("optimize_layout b on t.project_no=b.project_no")
                    .eq("b.project_no", engineeringId));
        }
        // 创建一个 List 用于保存映射后的实体对象
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcScreenTask.java
@@ -36,33 +36,11 @@
    @Scheduled(fixedDelay = 2000)
    public void screenHome(){
        JSONObject jsonObject = new JSONObject();
        //正在等待进片的玻璃
        Reportingdamage reportingdamage = new Reportingdamage();
        reportingdamage.setReportingWorkTime("2024-05-11");
        //获取切割信息
        reportingdamage.setThisProcess("切割");
        List<Reportingdamage> cutting = reportingWorkService.selectDamage(reportingdamage);
        jsonObject.append("cutting", cutting);
        //获取磨边信息
        reportingdamage.setThisProcess("磨边");
        List<Reportingdamage> edging = reportingWorkService.selectDamage(reportingdamage);
        jsonObject.append("edging", edging);
        //获取钢化信息
        reportingdamage.setThisProcess("钢化");
        List<Reportingdamage> tempering = reportingWorkService.selectDamage(reportingdamage);
        jsonObject.append("tempering", tempering);
        //获取夹胶信息
        reportingdamage.setThisProcess("夹胶");
        List<Reportingdamage> doubling = reportingWorkService.selectDamage(reportingdamage);
        jsonObject.append("doubling", doubling);
        //获取中空信息
        reportingdamage.setThisProcess("中空");
        List<Reportingdamage> hollow = reportingWorkService.selectDamage(reportingdamage);
        jsonObject.append("hollow", hollow);
        //获取包装信息
        reportingdamage.setThisProcess("包装");
        List<Reportingdamage> packaging = reportingWorkService.selectDamage(reportingdamage);
        jsonObject.append("packaging", packaging);
        //扇形图各设备的加工破损数量
        List<Reportingdamage> device = reportingWorkService.selectDamage(reportingdamage);
        jsonObject.append("device", device);
        //获取次破未补信息
        List<AwaitingRepair>awaitingRepairs = reportingWorkService.selectAwaitingRepair();
        jsonObject.append("awaitingRepairs", awaitingRepairs);
@@ -73,6 +51,9 @@
        List<Orders>orders=ordersService.selectOrders();
        jsonObject.append("orders", orders);
        /*现场规划图显示*/
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("screen");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java
@@ -25,7 +25,7 @@
     * fixedDelay : 上一个调用结束后再次调用的延时
     */
    @Scheduled(fixedDelay = 2000)
    @Scheduled(fixedDelay = 1000)
    public void temperingGlassHome(){
        JSONObject jsonObject = new JSONObject();
        //正在等待进片的玻璃
@@ -34,12 +34,14 @@
        //获取整在炉中的两个版图id
        List<TemperingGlassInfo> layoutId = temperingAgoService.selectLayoutId();
        //进炉中的玻璃
        List<TemperingGlassInfo> intoGlass = temperingAgoService.selectIntoGlass(layoutId.get(0).getTemperingLayoutId());
        if(!layoutId.isEmpty()) {
            List<TemperingGlassInfo> intoGlass = temperingAgoService.selectIntoGlass(layoutId.get(0));
        jsonObject.append("intoGlass", intoGlass);
        //进炉中的第二个版图
        if (layoutId.size() > 1) {
            List<TemperingGlassInfo> intoGlass2 = temperingAgoService.selectIntoGlass(layoutId.get(1).getTemperingLayoutId());
                List<TemperingGlassInfo> intoGlass2 = temperingAgoService.selectIntoGlass(layoutId.get(1));
            jsonObject.append("intoGlass2", intoGlass2);
            }
        }
        //出炉后的玻璃
        List<TemperingGlassInfo> outGlass = temperingAgoService.selectOutGlass();
@@ -60,5 +62,23 @@
            }
        }
    }
    @Scheduled(fixedDelay = 1000)
    public void temperingIsRun(){
        JSONObject jsonObject = new JSONObject();
        //正在进行的任务
        List<TemperingGlassInfo>temperingTaskType=temperingAgoService.selectTaskType();
        jsonObject.append("temperingTaskType", temperingTaskType);
        ArrayList<WebSocketServer> sendwServer = WebSocketServer.sessionMap.get("isRun");
        if (sendwServer != null) {
            for (WebSocketServer webserver : sendwServer) {
                if (webserver != null) {
                    webserver.sendMessage(jsonObject.toString());
                } else {
                    log.info("Home is closed");
                }
            }
        }
    }
}
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/TemperingTask.java
@@ -1,25 +1,76 @@
package com.mes.job;
import com.mes.tempering_record.service.TemperingRecordService;
import cn.smallbun.screw.core.util.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.mes.common.S7object;
import com.mes.common.config.Const;
import com.mes.device.PlcParameterObject;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import com.mes.temperingglass.service.TemperingGlassInfoService;
import com.mes.temperingrecord.entity.TemperingRecord;
import com.mes.temperingrecord.service.TemperingRecordService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @Author : zhoush
 * @Date: 2024/7/17 12:47
 * @Description:
 */
@Component
@Slf4j
public class TemperingTask {
    @Autowired
    private TemperingRecordService temporalRecordService;
    @Autowired
    private TemperingGlassInfoService temporaryGlassInfoService;
    private static final String ALONE_STATE = "0";
    @Scheduled(fixedDelay = 1000)
    public void temperingGlassBefore() {
        Date startDate = new Date();
        log.info("本次任务开始执行时间:{}", startDate);
        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
        String state = plcParameterObject.getPlcParameter("state").getValue();
//        当前连线状态为
        if (ALONE_STATE.equals(state)) {
            log.info("当前钢化炉连线模式为:{},不执行该任务", state);
            return;
        }
        //将确认字置为0
        S7object.getinstance().plccontrol.writeWord(plcParameterObject.getPlcParameter("confirmationWord").getAddress(), 0);
        //todo:获取钢化版图中状态为2的(进炉完成的玻璃信息)  且不存在钢化记录表内的
        List<Object> temperRecordIdListObj = temporalRecordService.listObjs(new QueryWrapper<TemperingRecord>().select("distinct tempering_layout_id"));
        List<String> temperRecordIdList = temperRecordIdListObj.stream().map(String::valueOf).collect(Collectors.toList());
        List<TemperingGlassInfo> list = temporaryGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>()
                .eq(TemperingGlassInfo::getState, Const.TEMPERING_START).notIn(TemperingGlassInfo::getTemperingLayoutId, temperRecordIdList));
        if (CollectionUtils.isEmpty(list)) {
            log.info("当前系统没有需要钢化的玻璃信息");
            return;
        }
        List<Integer> temperingLayoutIdList = list.stream().map(TemperingGlassInfo::getTemperingLayoutId).distinct().collect(Collectors.toList());
        if (CollectionUtils.isNotEmpty(temperRecordIdList)) {
            temperingLayoutIdList.removeAll(temperRecordIdList);
        }
        if (CollectionUtils.isEmpty(temperingLayoutIdList)) {
            log.info("当前玻璃有正在钢化的任务");
        }
//        获取钢化下片表状态为2的玻璃信息
        //完成任务将确认字置为1
        S7object.getinstance().plccontrol.writeWord(plcParameterObject.getPlcParameter("confirmationWord").getAddress(), 1);
    }
    @Scheduled(fixedDelay = 1000)
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingglass/controller/TemperingGlassInfoController.java
@@ -1,13 +1,13 @@
package com.mes.temperingglass.controller;
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.utils.Result;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@@ -22,12 +22,14 @@
public class TemperingGlassInfoController {
    @Autowired
    private TemperingGlassInfoService temperingAgoService;
    private TemperingGlassInfoService temperingGlassInfoService;
    @Autowired
    private DamageService damageService;
    @ApiOperation("查询钢化等片中的版图信息,状态为1的为已到,状态为0的为等待中")
    @GetMapping("/selectWaitingGlass") // 查询钢化等片中的版图信息,状态为1的为已到,状态为0的为等待中
    public Result <List<TemperingGlassInfo>> selectWaitingGlass() {
        List<TemperingGlassInfo> glass = temperingAgoService.selectWaitingGlass();
        List<TemperingGlassInfo> glass = temperingGlassInfoService.selectWaitingGlass();
        log.info("等待中的玻璃信息{}",glass);
        return Result.build(200, "", glass);
    }
@@ -41,10 +43,24 @@
    @ApiOperation("//钢化后显示出炉的版图信息。")
    @GetMapping("/selectOutGlass") //钢化后显示出炉的版图信息
    public Result <List<TemperingGlassInfo>> selectOutGlass() {
        List<TemperingGlassInfo> glass = temperingAgoService.selectOutGlass();
        List<TemperingGlassInfo> glass = temperingGlassInfoService.selectOutGlass();
        log.info("钢化出炉后的玻璃信息{}",glass);
        return Result.build(200, "", glass);
    }
    @ApiOperation("//钢化破损")
    @PostMapping("/updateTemperingState") //钢化后显示出炉的版图信息
    public Result <Integer> updateTemperingState(@RequestBody  Damage damage) {
        damageService.insertDamage(damage);
        TemperingGlassInfo temperingGlassInfo=new TemperingGlassInfo();
        if(damage.getStatus()==2){
            temperingGlassInfo.setState(5);
        }
        temperingGlassInfo.setGlassId(damage.getGlassId());
        int result=temperingGlassInfoService.updateTemperingState(temperingGlassInfo);
        return Result.build(200, "破损成功", result);
    }
}
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/controller/TemperingRecordController.java
File was renamed from hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/tempering_record/controller/TemperingRecordController.java
@@ -1,4 +1,4 @@
package com.mes.tempering_record.controller;
package com.mes.temperingrecord.controller;
import org.springframework.web.bind.annotation.RequestMapping;
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/entity/TemperingRecord.java
File was renamed from hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/tempering_record/entity/TemperingRecord.java
@@ -1,4 +1,4 @@
package com.mes.tempering_record.entity;
package com.mes.temperingrecord.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@@ -20,6 +20,10 @@
    private static final long serialVersionUID = 1L;
    /**
     * 工程id
     */
    private String engineerId;
    /**
     * 钢化版图
     */
    private Integer temperingLayoutId;
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/TemperingRecordMapper.java
File was renamed from hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/tempering_record/mapper/TemperingRecordMapper.java
@@ -1,7 +1,7 @@
package com.mes.tempering_record.mapper;
package com.mes.temperingrecord.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.mes.tempering_record.entity.TemperingRecord;
import com.mes.temperingrecord.entity.TemperingRecord;
/**
 * <p>
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/mapper/xml/TemperingRecordMapper.xml
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/TemperingRecordService.java
File was renamed from hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/tempering_record/service/TemperingRecordService.java
@@ -1,7 +1,7 @@
package com.mes.tempering_record.service;
package com.mes.temperingrecord.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.mes.tempering_record.entity.TemperingRecord;
import com.mes.temperingrecord.entity.TemperingRecord;
/**
 * <p>
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/temperingrecord/service/impl/TemperingRecordServiceImpl.java
File was renamed from hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/tempering_record/service/impl/TemperingRecordServiceImpl.java
@@ -1,9 +1,9 @@
package com.mes.tempering_record.service.impl;
package com.mes.temperingrecord.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mes.tempering_record.entity.TemperingRecord;
import com.mes.tempering_record.mapper.TemperingRecordMapper;
import com.mes.tempering_record.service.TemperingRecordService;
import com.mes.temperingrecord.entity.TemperingRecord;
import com.mes.temperingrecord.mapper.TemperingRecordMapper;
import com.mes.temperingrecord.service.TemperingRecordService;
import org.springframework.stereotype.Service;
/**
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/application-cz.yml
@@ -10,7 +10,7 @@
          password: beibo.123/
          driver-class-name: com.mysql.cj.jdbc.Driver
        salve_hangzhoumes:
          url: jdbc:sqlserver://192.168.20.24:1433;databasename=hangzhoumes
          url: jdbc:sqlserver://192.168.10.2:1433;databasename=hangzhoumes
          username: sa
          password: beibo.123/
          driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/resources/json/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/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownLoadCacheGlassTask.java
@@ -77,7 +77,7 @@
    private Integer minHeight;
    @Scheduled(fixedDelay = 3000)
    @Scheduled(fixedDelay = 300)
    public void plcHomeEdgTask() {
        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
        String requestWord = plcParameterObject.getPlcParameter("requestWord").getValue();
@@ -90,7 +90,6 @@
        String confirmationWrodValue = plcParameterObject.getPlcParameter("confirmationWord").getValue();
        String confirmationWrodAddress = plcParameterObject.getPlcParameter("confirmationWord").getAddress();
        String currentSlot = plcParameterObject.getPlcParameter("currentCell").getValue();
        log.info("1、获取到的请求字为:{},获取到的扫描ID为:{},获取到的确认字为:{},获取到的出片状态分别为:g06:{}、g08:{}、g11:{}、g13:{},当前格子号为:{}",
@@ -162,7 +161,7 @@
                if (CollectionUtils.isNotEmpty(list)) {
                    log.info("有空架子,将流程卡与架子好绑定,执行进片任务 结束");
                    //绑定流程卡
                    downWorkstationService.updateFlowCardIdAndCount(glassInfo.getFlowCardId(), glassInfo.getLayer(), list.get(0).getWorkstationId());
                    downWorkstationService.updateFlowCardIdAndCount(glassInfo.getFlowCardId(), list.get(0).getWorkstationId(), glassInfo.getLayer());
                    checkFlag = Boolean.TRUE;
                }
            }
@@ -242,9 +241,14 @@
            return Boolean.FALSE;
        }
        Boolean flag08 = "1".equals(out08Glassstate) ? Boolean.TRUE : Boolean.FALSE;
        if (!flag08) {
            generateTaskByShelf(glassStatus06, glassStatus11, flag08, glassStatus13, tempList, cageDetails, glassId);
        } else {
        if (!generateTaskByShelf(glassStatus06, glassStatus11, flag08, glassStatus13, tempList, cageDetails, glassId)) {
            return generateTaskByShelf(glassStatus06, glassStatus11, !flag08, glassStatus13, tempList, cageDetails, glassId);
        }
        }
        return Boolean.TRUE;
    }
@@ -313,18 +317,33 @@
                    list = tempList.stream().filter(item -> item.getWidth() > maxWidth || item.getHeight() > maxHeight).collect(Collectors.toList());
                }
            } else {
                //获取可落架的的架子信息(包括空架子)
                List<DownWorkstation> workstationsIsNotBind = downWorkstationList.stream().filter(item -> null == (item.getFlowCardId())).collect(Collectors.toList());
                Map<String, List<DownWorkstation>> listMap = downWorkstationList.stream().collect(Collectors.groupingBy(item -> item.getFlowCardId() + ":" + item.getLayer()));
                //将架子的流程卡号及层数作为key
                if (CollectionUtils.isEmpty(workstationsIsNotBind)) {
                    log.info("不存在未绑定流程卡架子");
                    //筛选出对应架子已绑定流程卡可下片的玻璃
                    Map<String, List<DownWorkstation>> listMap = downWorkstationList.stream()
                            .filter(item -> null != (item.getFlowCardId())).collect(Collectors.groupingBy(item -> item.getFlowCardId() + ":" + item.getLayer()));
                    list = tempList.stream().filter(item -> listMap.containsKey(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList());
                } else {
                    log.info("存在未绑定流程卡架子,直接获取笼内所有玻璃");
                    log.info("存在未绑定流程卡架子,直接获取笼内所有玻璃,且未绑定架子的玻璃信息");
                    //获取禁用架子的流程号,将笼内绑定架子且架子被禁用的流程卡信息
                    List<Integer> workStationAll = Arrays.asList(1, 2, 3, 4, 5, 6);
                    List<Integer> offWorkStationList = workStationAll.stream().filter(e -> !workList.contains(e)).collect(Collectors.toList());
                    List<DownWorkstation> downWorkstationOffList = downWorkstationService.list(new LambdaQueryWrapper<DownWorkstation>()
                            .and(i -> i.in(DownWorkstation::getWorkstationId, offWorkStationList).or().eq(DownWorkstation::getEnableState, Const.SLOT_OFF)));
                    //获取被禁用的流程卡信息
                    if (CollectionUtils.isEmpty(downWorkstationOffList)) {
                        list = tempList;
                    } else {
                        Map<String, List<DownWorkstation>> listOffMap = downWorkstationOffList.stream().filter(item -> null != (item.getFlowCardId())).collect(Collectors.groupingBy(item -> item.getFlowCardId() + ":" + item.getLayer()));
                        list = tempList.stream().filter(item -> !listOffMap.containsKey(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList());
                    }
                    isEmptyShelf = Boolean.TRUE;
                    //todo:如果禁用架子已绑定流程卡,因为时间不确定,笼子内的玻璃可重新绑定新架子
//                    list = tempList.stream().filter(item -> !listMap.containsKey(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList());
                    list = tempList;
                }
            }
        } else {
@@ -361,7 +380,8 @@
                break loop;
            }
            //将笼子内的玻璃进行过滤,仅获取无法落架的流程卡玻璃
            List<DownStorageCageDetails> noDownLoadList = list.stream().filter(item -> !downGlassFlowList.contains(item.getFlowCardId() + ":" + item.getLayer())).collect(Collectors.toList());
            List<DownStorageCageDetails> noDownLoadList = list.stream().filter(item -> !downGlassFlowList.contains(item.getFlowCardId() + ":" + item.getLayer()))
                    .collect(Collectors.toList());
            if (CollectionUtils.isNotEmpty(noDownLoadList)) {
                //是否有空架子
//                List<DownWorkstation> emptyShelfList = downWorkstationService.list(new LambdaQueryWrapper<DownWorkstation>()
@@ -452,14 +472,18 @@
        }
        Integer endCell = null;
        if (!isBind) {
        if (isBind) {
            //获取空架子信息,将空架子信息绑定流程卡
            DownWorkstation emptyDownWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper<DownWorkstation>()
                    .isNull(DownWorkstation::getFlowCardId).orderByDesc(DownWorkstation::getWorkstationId).last("limit 1"));
            if (null != emptyDownWorkstation) {
                log.info("获取到空架子信息,绑定流程卡");
                downWorkstationService.updateFlowCardIdAndCount(downStorageCageDetails.getFlowCardId(), downStorageCageDetails.getLayer(), emptyDownWorkstation.getWorkstationId());
                downWorkstationService.updateFlowCardIdAndCount(downStorageCageDetails.getFlowCardId(), emptyDownWorkstation.getWorkstationId(), downStorageCageDetails.getLayer());
                endCell = emptyDownWorkstation.getWorkstationId();
                //将下片玻璃存入笼子详情信息表中
                //将任务插入理片笼详情表
                downStorageCageDetails.setState(Const.GLASS_STATE_OUT);
                downStorageCageDetailsService.save(downStorageCageDetails);
            } else {
                log.info("没有空架子信息,无法绑定流程卡");
                return Boolean.FALSE;
@@ -468,15 +492,16 @@
            DownWorkstation workstation = downWorkstationService.getOne(new LambdaUpdateWrapper<DownWorkstation>()
                    .eq(DownWorkstation::getFlowCardId, downStorageCageDetails.getFlowCardId()).eq(DownWorkstation::getLayer, downStorageCageDetails.getLayer()));
            endCell = workstation.getWorkstationId();
        }
        //更新详情表内的状态
        if (downStorageCageDetailsService.update(new LambdaUpdateWrapper<DownStorageCageDetails>()
                .set(DownStorageCageDetails::getState, Const.GLASS_STATE_OUT).eq(DownStorageCageDetails::getGlassId, glassId))) {
            log.info("更新详情表内的状态成功");
//                return Boolean.TRUE;
        } else {
            log.info("更新详情表内的状态失败");
            return Boolean.FALSE;
        }
        }
        //更新落架玻璃数量
        if (endCell == 7) {
            downWorkstationService.update(new UpdateWrapper<DownWorkstation>().eq("flow_card_id", downStorageCageDetails.getFlowCardId())