1、增加流程卡进度查询,可根据工程号,流程卡号,玻璃id查看进度情况
2、钢化界面增加颜色对应注释,版图增加落架顺序
3、两个大理片界面笼子上色块显示修改为根据玻璃宽度显示
4、中空大理片右侧缺片情况显示优化
5、是否除膜从领取工程取消,在中空领取任务时选择除膜膜系(不除膜时不选择膜系),当配方中是需要除膜时并且选择的膜系与小片膜系一样时发送除膜信息
6、中空领取任务界面流程卡数量不等于已配对数量时高亮显示
7、磨边队列当后面玻璃磨边完成扫码但前面玻璃还未扫到码时高亮显示
3个文件已添加
32个文件已修改
2391 ■■■■■ 已修改文件
UI-Project/src/lang/en.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/kr.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/py.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue 251 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturns.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Returns/upreturns2.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Slicecage/slicecage.vue 531 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicData.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicData1.vue 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowslicecage.vue 409 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/vo/BigStorageVO.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/controller/DamageController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/request/DamageRequest.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/vo/FlowCardDamageVO.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/vo/GlassDamageVO.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/mapper/DamageMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/ReportingWork.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/DamageMapper.xml 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageNewTask.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassOutRelationInfo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/request/HollowTaskRequest.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowBigStorageCageDetailsService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowBigStorageCageDetailsServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassRelationInfoServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/PushMessageToIndex.java 296 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageDetailsMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/en.js
@@ -366,6 +366,14 @@
        glasstakeout: 'Glass take away list',
        layoutID: 'Drawing ID of loading for tempering furnace',
        glassID: 'Glass ID',
        tempState1: 'Task Generated',        // -1 生成任务
        tempState2: 'Sheet Output Completed', // 0 出片完成
        tempState3: 'Sheet Arrangement Completed', // 1 摆片完成
        tempState4: 'Furnace Entry Completed', // 2 进炉完成
        tempState5: 'Tempering Completed',    // 3 钢化完成
        tempState6: 'Sheet Output Completed', // 4 出片完成
        tempState7: 'Damaged',                // 8 破损
        tempState8: 'Taken Away',             // 9 拿走
    },
    reportWork: {
        details: 'Drop off details',
UI-Project/src/lang/kr.js
@@ -363,6 +363,14 @@
          glasstakeout:'유리 가져가기 리스트',
          layoutID:'판도 ID',
          glassID:'유리 ID',
        tempState1: '작업 생성됨',            // -1 生成任务
        tempState2: '출판 완료',              // 0 出片完成
        tempState3: '진열 완료',              // 1 摆片完成
        tempState4: '입로 완료',              // 2 进炉完成
        tempState5: '강화 완료',              // 3 钢化完成
        tempState6: '출판 완료',              // 4 出片完成
        tempState7: '파손됨',                // 8 破损
        tempState8: '반출됨',                // 9 拿走
      },
      reportWork:{
          details:'낙하 상세 정보',
UI-Project/src/lang/py.js
@@ -363,6 +363,14 @@
        glasstakeout:'玻璃拿走清单',
        layoutID:'版图ID',
        glassID:'Стеклянный ID',
        tempState1: '生成任务',        // -1 生成任务
        tempState2: '出片完成',        // 0 出片完成
        tempState3: '摆片完成',        // 1 摆片完成
        tempState4: '进炉完成',        // 2 进炉完成
        tempState5: '钢化完成',        // 3 钢化完成
        tempState6: '出片完成',        // 4 出片完成
        tempState7: '破损',            // 8 破损
        tempState8: '拿走',            // 9 拿走
    },
    reportWork: {
        details:'Сведения о сдаче',
UI-Project/src/lang/zh.js
@@ -365,6 +365,14 @@
          glasstakeout:'玻璃拿走清单',
          layoutID:'版图ID',
          glassID:'玻璃ID',
        tempState1: '生成任务',        // -1 生成任务
        tempState2: '出片完成',        // 0 出片完成
        tempState3: '摆片完成',        // 1 摆片完成
        tempState4: '进炉完成',        // 2 进炉完成
        tempState5: '钢化完成',        // 3 钢化完成
        tempState6: '出片完成',        // 4 出片完成
        tempState7: '破损',            // 8 破损
        tempState8: '拿走',            // 9 拿走
      },
      reportWork:{
          details:'落架详情',
UI-Project/src/views/PurchaseReturn/purchaseReturn.vue
@@ -869,6 +869,7 @@
<template>
  <div style="height: 500px;">
    <div style="margin-top: 10px;">
      <div class="dot-tips">
      <el-button style="margin-left: 15px;" id="searchButton" type="primary"
                 @click="dialogFormVisiblea = true;dialogFormVisible = false;dialogFormVisibleb = false;">
        {{ $t('processCard.beforefurnace') }}
@@ -881,6 +882,39 @@
                 @click="dialogFormVisibleb = true;dialogFormVisible = false;dialogFormVisiblea = false;">
        {{ $t('processCard.outfurnace') }}
      </el-button>
        <div class="dot-item">
          <span class="dot color1"></span>
          <span class="text">{{ $t('processCard.tempState1') }}</span>
        </div>
        <div class="dot-item">
          <span class="dot color2"></span>
          <span class="text">{{ $t('processCard.tempState2') }}</span>
        </div>
        <div class="dot-item">
          <span class="dot color3"></span>
          <span class="text">{{ $t('processCard.tempState3') }}</span>
        </div>
        <div class="dot-item">
          <span class="dot color4"></span>
          <span class="text">{{ $t('processCard.tempState4') }}</span>
        </div>
        <div class="dot-item">
          <span class="dot color5"></span>
          <span class="text">{{ $t('processCard.tempState5') }}</span>
        </div>
        <div class="dot-item">
          <span class="dot color6"></span>
          <span class="text">{{ $t('processCard.tempState6') }}</span>
        </div>
        <div class="dot-item">
          <span class="dot color7"></span>
          <span class="text">{{ $t('processCard.tempState7') }}</span>
        </div>
        <div class="dot-item">
          <span class="dot color8"></span>
          <span class="text">{{ $t('processCard.tempState8') }}</span>
        </div>
      </div>
      <div v-if="dialogFormVisible">
        <!-- 进炉中右 -->
        <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
@@ -894,20 +928,18 @@
              </div>
    <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">  
      <div
      v-for="(rect, index) in adjustedRects1"
      :key="index"
      @click="showDialog1(rect)"
      class="rect"
      :style="{ position: 'absolute',
                <div v-for="(rect, index) in adjustedRects1" :key="index" @click="showDialog1(rect)" class="rect"
                  :style="{
                    position: 'absolute',
       top: `${rect.y}px`, 
       left: `${rect.x}px`,
        width: `${rect.width}px`, 
        height: `${rect.height}px`,
        backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor1(rect.state) }">
                    backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor1(rect.state)
                  }">
     <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>  
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
                    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}/{{ rect.layer }}/{{ rect.sequence }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>  
  </div>
  </div>
@@ -919,23 +951,22 @@
<!-- <div style="width: 750px;float: left;background-color: #f4f4f5;height: 350px;"> -->
    <!-- <div v-if="adjustedRects2.length > 0"> -->
      <div v-else-if="currentPage === 2 && adjustedRects2.length > 0">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRects2[0].engineerId }}-{{ adjustedRects2[0].temperingLayoutId }} </div>
            <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRects2[0].engineerId
              }}-{{ adjustedRects2[0].temperingLayoutId }} </div>
    <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">  
      <div
      v-for="(rect, index) in adjustedRects2"
      :key="index"
      @click="showDialog2(rect)"
      class="rect"
      :style="{ position: 'absolute',
                <div v-for="(rect, index) in adjustedRects2" :key="index" @click="showDialog2(rect)" class="rect"
                  :style="{
                    position: 'absolute',
       top: `${rect.y}px`, 
       left: `${rect.x}px`, 
       width: `${rect.width}px`, 
       height: `${rect.height}px`,
        backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor2(rect.state) }">
                    backgroundColor: rect.isActive ? '#ADFF2F' : getRectColor2(rect.state)
                  }">
     <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>  
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
                    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}/{{ rect.layer }}/{{ rect.sequence }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>  
  </div>
  </div>
@@ -945,34 +976,28 @@
<!-- </div> -->
   </el-card>
   <div style="display: flex;margin-left: 40%;margin-bottom: 10px;">
    <el-pagination
        size="small"
        background
        layout="prev, pager, next"
        :total="20"
        @current-change="handlePageChange"
      />
          <el-pagination size="small" background layout="prev, pager, next" :total="20"
            @current-change="handlePageChange" />
  </div>
    </div>
<div v-if="dialogFormVisiblea">
  <!-- 进炉前 -->
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
    <div v-if="adjustedRectsa.length > 0">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRectsa[0].engineerId }}-{{ adjustedRectsa[0].temperingLayoutId }} </div>
            <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRectsa[0].engineerId
              }}-{{ adjustedRectsa[0].temperingLayoutId }} </div>
    <!-- <div style="text-align: center;">炉号:{{ engineerIdDisplaya }}-{{ adjustedRects[0].temperingLayoutId }}</div>   -->
      <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">  
      <div
      v-for="(rect, index) in adjustedRectsa"
      :key="index"
      @click="showDialoga(rect)"
      class="rect"
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
                <div v-for="(rect, index) in adjustedRectsa" :key="index" @click="showDialoga(rect)" class="rect"
                  :style="{
                    position: 'absolute', top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColora(rect.state) }">
                    backgroundColor: rect.isActive ? '#ADFF2F' : getRectColora(rect.state)
                  }">
    <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>  
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
                    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}/{{ rect.layer }}/{{ rect.sequence }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>  
  </div>
  </div> 
@@ -985,22 +1010,21 @@
  <!-- 已出炉 -->
  <el-card style="flex: 1;margin-left: 10px;margin-top: 10px;margin-right: 10px;height: 800px;">
      <div v-if="adjustedRectsb.length > 0">
    <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRectsb[0].engineerId }}-{{ adjustedRectsb[0].temperingLayoutId }} </div>
            <div style="text-align: center;"> {{ $t('processCard.temperinglayout') }}:{{ adjustedRectsb[0].engineerId
              }}-{{ adjustedRectsb[0].temperingLayoutId }} </div>
    <!-- <div style="text-align: center;">炉号:{{ engineerIdDisplayb }}-{{ adjustedRects[0].temperingLayoutId }}</div>   -->
      <el-scrollbar height="750px" style="background-color: #e9e9eb;">
    <div  style="position: relative;max-width: 1400px;">
      <div
      v-for="(rect, index) in adjustedRectsb"
      :key="index"
      @click="showDialogb(rect)"
      class="rect"
      :style="{ position: 'absolute',  top: `${rect.y}px`, left: `${rect.x}px`,
                <div v-for="(rect, index) in adjustedRectsb" :key="index" @click="showDialogb(rect)" class="rect"
                  :style="{
                    position: 'absolute', top: `${rect.y}px`, left: `${rect.x}px`,
       width: `${rect.width}px`, height: `${rect.height}px`,
      backgroundColor: rect.isActive ? '#ADFF2F' : getRectColorb(rect.state) }">
                    backgroundColor: rect.isActive ? '#ADFF2F' : getRectColorb(rect.state)
                  }">
       <!-- backgroundColor: rect.state === 4 ? '#911005' : '#f8e3c5' }"> -->
     <div  class="centered-text">
    <div style="font-size: 15px;font-weight: bold;">{{ rect.glassId }}</div>  
    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}</div>
                    <div style="font-size: 15px;font-weight: bold;">{{ rect.flowCardId }}/{{ rect.layer }}/{{ rect.sequence }}</div>
    <div style="font-size: 30px;font-weight: bold;">{{ rect.widtha }}*{{ rect.heighta }}</div>  
  </div>
  </div> 
@@ -1011,67 +1035,78 @@
</div>
<!-- 进炉中 -->
<el-dialog v-model="blind1" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose1">
        <el-button :disabled="!canSelectProject1" type="warning" plain @click="handleDamage1"  style="width: 150px;margin-left: 10px;">
        <el-button :disabled="!canSelectProject1" type="warning" plain @click="handleDamage1"
          style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeoutc"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeoutc"
          style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload />
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
  </el-dialog>  
<el-dialog v-model="blind2" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClose2">
        <el-button :disabled="!canSelectProject2" type="warning" plain @click="handleDamage2"  style="width: 150px;margin-left: 10px;">
        <el-button :disabled="!canSelectProject2" type="warning" plain @click="handleDamage2"
          style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeoutd"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeoutd"
          style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload />
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
  </el-dialog>  
  <!-- 进炉前 -->
<el-dialog v-model="blinda" top="30vh" width="15%" style="text-align: center;" @close="handleDialogClosea">
  <el-button type="warning" plain @click="handleDamagea" :disabled="!canSelectProjecta" style="width: 150px;margin-left: 10px;">
        <el-button type="warning" plain @click="handleDamagea" :disabled="!canSelectProjecta"
          style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeouta"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
        <el-button :disabled="!cantakea" type="danger" plain @click="takeouta"
          style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload />
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
        <el-button type="success" plain @click="takeona" :disabled="!canona" style="width: 150px;margin-left: 10px;margin-top: 10px;">
        <el-button type="success" plain @click="takeona" :disabled="!canona"
          style="width: 150px;margin-left: 10px;margin-top: 10px;">
          {{ $t('order.takeon') }}
        </el-button>
  </el-dialog>  
  <!-- 已出炉 -->
<el-dialog v-model="blindb" top="30vh" width="15%" style="text-align: center;" @close="handleDialogCloseb">
        <el-button :disabled="!canSelectProjectb" type="warning" plain  @click="handleDamageb"  style="width: 150px;margin-left: 10px;">
        <el-button :disabled="!canSelectProjectb" type="warning" plain @click="handleDamageb"
          style="width: 150px;margin-left: 10px;">
          {{ $t('order.dilapidation') }}
        </el-button>
        <el-button :disabled="!cantakeb" type="danger" plain @click="takeoutb"  style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right"><Upload /></el-icon>
        <el-button :disabled="!cantakeb" type="danger" plain @click="takeoutb"
          style="width: 150px;margin-left: 10px;margin-top: 10px;">
          <el-icon class="el-icon--right">
            <Upload />
          </el-icon>
          {{ $t('order.takeaway') }}
        </el-button>
        <!-- <el-button type="success" plain  @click="takeonb" :disabled="!canonb" style="width: 150px;margin-left: 10px;margin-top: 10px;">
          {{ $t('order.takeon') }}
        </el-button> -->
  </el-dialog> 
  <el-dialog
      v-model="dialogVisible"
      width="100%"
      top="0vh"
      :show-close="false"
      >
      <el-dialog v-model="dialogVisible" width="100%" top="0vh" :show-close="false">
      <div class="custom-title" style="text-align: center; margin-bottom: 20px;">  
      {{ $t('processCard.glasstakeout') }}  
    </div>  
      <el-table
        :data="tableData"
        style="width: 100%;height: 760px"
      >
        <el-table :data="tableData" style="width: 100%;height: 760px">
        <el-table-column prop="flowCardId" :label="$t('processCard.flowcard')" width="140" align="center"/>
        <el-table-column prop="layer" :label="$t('processCard.layer')" align="center" width="52"/>
        <el-table-column prop="engineerId" :label="$t('processCard.project')" align="center" width="110"/>
        <el-table-column prop="temperingLayoutId" :label="$t('processCard.temperinglayout')" align="center" width="52"/>
        <el-table-column prop="temperingFeedSequence" :label="$t('processCard.temperingfeed')" align="center" width="52"/>
          <el-table-column prop="temperingLayoutId" :label="$t('processCard.temperinglayout')" align="center"
            width="52" />
          <el-table-column prop="temperingFeedSequence" :label="$t('processCard.temperingfeed')" align="center"
            width="52" />
        <el-table-column prop="width" :label="$t('processCard.width')" align="center" width="80"/>
        <el-table-column prop="height" :label="$t('processCard.height')" align="center" width="80"/>
        <el-table-column prop="thickness" :label="$t('processCard.thickness')" align="center" width="52"/>
@@ -1090,6 +1125,7 @@
    /* justify-content:center; */
  margin-left: 20px;
}
#boxb{
  border: 1px solid rgb(119, 116, 116);
  background-color:  #a0cfff;
@@ -1100,6 +1136,7 @@
  justify-content:center;
  margin-left: 20px;
}
#box{
  border: 1px solid black;
  background-color:  #337ecc;
@@ -1107,12 +1144,14 @@
  align-items:center; 
  justify-content:center;
}
#home-card {
  width: 100%;
  overflow: hidden;
  padding: 10px 0px;
  display: flex;
  flex-wrap: wrap;
  #home-item {
    border-style: solid;
    border-width: 1px;
@@ -1125,6 +1164,7 @@
    justify-content: center;
    /* align-items: center; */
    background: #fff;
    #home-img {
      display: inline-block;
      width: 160px;
@@ -1132,12 +1172,14 @@
      margin: 0;
      padding: 0;
    }
      #home-right {
        display: flex;
        flex-direction: column;
        justify-content: center;
        align-items: flex-start;
        margin-left: 10px;
        #home-num {
          font-size: 40px;
          margin: 5px 0;
@@ -1145,23 +1187,92 @@
      }
    }
  }
  .rect {  
  border: 1px solid black; /* 设置矩形的边框 */
  border: 1px solid black;
  /* 设置矩形的边框 */
  /* background-color: lightblue; 设置矩形的背景色   */
#rect {  
  position: relative; /* 确保箭头可以相对于矩形定位 */
  position: relative;
  /* 确保箭头可以相对于矩形定位 */
}  
.centered-text {
  /* 设置文字居中样式 */  
  /* display: flex; */
  justify-content: center;  
  align-items: center; 
  height: 100%; /* 确保div占据整个矩形的高度 */
  height: 100%;
  /* 确保div占据整个矩形的高度 */
  /* font-size: small; */
.custom-title {  
  font-size: 20px;
  font-weight: bold;
.dot-tips {
  display: flex;
  align-items: center;
  gap: 20px;
  /* 每个圆点项之间的间距 */
  padding: 10px;
}
/* 单个圆点+文字项 */
.dot-item {
  display: flex;
  align-items: center;
  font-size: 14px;
}
/* 圆点样式:核心是圆形 */
.dot {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  /* 圆形 */
  margin-right: 6px;
  /* 圆点和文字的间距 */
}
/* 不同颜色的圆点(可自定义) */
.color1 {
  background-color: #99BBFF;
}
.color2 {
  background-color: #7AC5CD;
}
.color3 {
  background-color: #95d475;
}
.color4 {
  background-color: lightblue;
}
.color5 {
  background-color: #eebe77;
}
.color6 {
  background-color: #CD6090;
}
.color7 {
  background-color: #911005;
}
.color8 {
  background-color: #4682B4;
}
/* 文字样式 */
.text {
  color: #666;
}
</style>
UI-Project/src/views/Returns/upreturns.vue
@@ -180,7 +180,7 @@
    try {
      const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
        stationCell: 5,
        filmRemove: filmRemove,
        filmRemove: 0,
        engineerId: engineeringId,
        state: 1,
      })
UI-Project/src/views/Returns/upreturns2.vue
@@ -249,7 +249,7 @@
    try {
      const response = await request.post('/loadGlass/engineering/engineering/changeTask', {
        stationCell: 6,
        filmRemove: filmRemove,
        filmRemove: 0,
        engineerId: engineeringId,
        state: 1,
      })
UI-Project/src/views/Slicecage/slicecage.vue
@@ -898,42 +898,12 @@
  diaodu.value = ''
  }
  if(data.bigStorageCageInfos!=null){
  adjustedRects.value = data.bigStorageCageInfos[0][1].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCounts.value = data.bigStorageCageInfos[0][1].map(rect => rect.count);
adjustedRectsa.value = data.bigStorageCageInfos[0][2].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountsa.value = data.bigStorageCageInfos[0][2].map(rect => rect.count);
adjustedRectsb.value = data.bigStorageCageInfos[0][3].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountsb.value = data.bigStorageCageInfos[0][3].map(rect => rect.count);
adjustedRectsc.value = data.bigStorageCageInfos[0][4].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountsc.value = data.bigStorageCageInfos[0][4].map(rect => rect.count);
adjustedRectsd.value = data.bigStorageCageInfos[0][5].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountsd.value = data.bigStorageCageInfos[0][5].map(rect => rect.count);
adjustedRectse.value = data.bigStorageCageInfos[0][6].map((rect, index) => ({
    id: index + 1,
    height: 20/55,
    top: 53/55,
  }));
subRectsCountse.value = data.bigStorageCageInfos[0][6].map(rect => rect.count);
    adjustedRects.value = data.bigStorageCageInfos[0][1];
    adjustedRectsa.value = data.bigStorageCageInfos[0][2];
    adjustedRectsb.value = data.bigStorageCageInfos[0][3];
    adjustedRectsc.value = data.bigStorageCageInfos[0][4];
    adjustedRectsd.value = data.bigStorageCageInfos[0][5];
    adjustedRectse.value = data.bigStorageCageInfos[0][6];
  }else{
    adjustedRects.value = '',
    adjustedRectsa.value = '',
@@ -944,11 +914,11 @@
  }
};
// 计算每个大矩形的样式
const rectStyle = (rect, index) => ({
const rectStyle = (rect, index, high) => ({
  position: 'absolute',
  width: '170px',
  right: '0px',
  top: `${index*rect.top}px`,
  top: `${index * high}px`,
  height: `${rect.height}px`,
});
// 计算每个小矩形的样式和数量
@@ -960,18 +930,19 @@
  }
  return subRects;
};
const proportion=ref((170/6200).toFixed(2));
// 计算每个小矩形的样式
const subRectStyle = (rectIndex, subIndex) => {
  const width = '18px';
  const marginRight = '8px';
  const width = `${rectIndex.length* proportion.value}px`;
  const marginRight = '6.85px';
  const totalWidth = 6 * (parseInt(width) + parseInt(marginRight));
  const right = `${(subIndex * (parseInt(width) + parseInt(marginRight))) / totalWidth * 100}%`;
  return {
    position: 'absolute',
    width,
    height: '100%',
    height: '1px',
    marginRight,
    top: '0px',
    top: '1px',
    backgroundColor: '#911005',
    right,
  };
@@ -1245,7 +1216,9 @@
  <div style="height: 600px;">
    <div v-if="showAlert" class="global-alert-bar" @dblclick="handleDoubleClick">
    <div class="alert-content">
      <el-icon><WarnTriangleFilled /></el-icon>
        <el-icon>
          <WarnTriangleFilled />
        </el-icon>
      <span class="alert-text">
        {{ alertText }} (id:{{ alertMessage }})
        <span class="confirm-text">{{ $t('hellow.pleaseConfirm') }}</span>
@@ -1253,24 +1226,10 @@
    </div>
    <button @click="showAlert = false" class="close-btn">×</button>
  </div>
  <el-dialog
    v-model="showModal"
    width="40%"
    center
  >
      <el-table
      ref="table"
      border
      :data="tableDataAlert"
      max-height="calc(500px - 35px)"
      style="width: 100%;"
    >
    <el-dialog v-model="showModal" width="40%" center>
      <el-table ref="table" border :data="tableDataAlert" max-height="calc(500px - 35px)" style="width: 100%;">
      <el-table-column prop="formattedCreateTime" align="center" :label="$t('film.createtime')" min-width="100" />
      <el-table-column
       :label="$t('hellow.content')"
       align="center"
       min-width="220"
     >
        <el-table-column :label="$t('hellow.content')" align="center" min-width="220">
       <template #default="scope">
           <span>
             {{ getAlertText(scope.row.alarmCode) }} 
@@ -1280,122 +1239,106 @@
     </el-table-column>
      <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="100">
        <template #default="scope">
          <el-button type="text" plain
            @click="handleSure(scope.row)">{{ $t('basicData.yes') }}</el-button>
            <el-button type="text" plain @click="handleSure(scope.row)">{{ $t('basicData.yes') }}</el-button>
        </template>
      </el-table-column>
    </el-table>
  </el-dialog>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="primary" @click="handlexiang">{{ $t('searchOrder.cageinformation') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="success" @click="handlehistorical">{{ $t('searchOrder.historicaltasks') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="warning" @click="handleganghua">{{ $t('searchOrder.temperingqueries') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="info" @click="dialogFormVisibles=true;fetchFlows()">{{ $t('searchOrder.searchlayout') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="primary" @click="handlexiang">{{
      $t('searchOrder.cageinformation') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="success" @click="handlehistorical">{{
      $t('searchOrder.historicaltasks') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="warning" @click="handleganghua">{{
      $t('searchOrder.temperingqueries') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="info"
      @click="dialogFormVisibles = true; fetchFlows()">{{ $t('searchOrder.searchlayout') }}</el-button>
    <!-- <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="danger" @click="handleptask()">{{ $t('searchOrder.partask') }}</el-button> -->
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="ganghua" class="mb-2" :inactive-text="$t('searchOrder.temperedswitch')" @change="handleChange" />
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="diaodu" class="mb-2" :inactive-text="$t('searchOrder.Schedulingswitch')" @change="handlediaodu" />
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="ganghua" class="mb-2"
      :inactive-text="$t('searchOrder.temperedswitch')" @change="handleChange" />
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="diaodu" class="mb-2"
      :inactive-text="$t('searchOrder.Schedulingswitch')" @change="handlediaodu" />
    <div id="dotClass">
        <div>{{ $t('searchOrder.inkageEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: inkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: inkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.requestEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: requestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: requestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.mesReplyEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: mesReplyEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: mesReplyEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.outInkageEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: outInkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: outInkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.outRequestEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: outRequestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: outRequestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
  </div>
<!-- // 父级框 -->
<div class="img-dlpl" >
    <div class="img-car1" :style="'z-index:999;left:240px;top:' + 350*carPosition[0] + 'px;position:absolute;'">
      <div
      v-for="(rect, index) in adjusta"
      :key="rect.id"
      :style="{
        <div v-for="(rect, index) in adjusta" :key="rect.id" :style="{
       width: '30px',
       height: '5px',
       backgroundColor: '#409EFF',
       marginLeft: 5+ `px`,
       top: '10px',
       }"
    >
        }">
    </div>
    </div>
    <div class="img-car4" :style="'z-index:999;left:630px;top:' + 350*carPosition[1] + 'px;position:absolute;'">
      <div
      v-for="(rect, index) in adjust"
      :key="rect.id"
      :style="{
        <div v-for="(rect, index) in adjust" :key="rect.id" :style="{
       width: '30px',
       height: '5px',
       backgroundColor: '#409EFF',
       marginLeft: 5+ `px`,
       top: '10px',
       }"
    >
        }">
    </div>
    </div>
    <div style="position: relative;">
    <div v-show="cell1" style="width: 170px;height: 53px;position: relative;top:63px;left: 445px;">
      <div v-for="(rect, rectIndex) in adjustedRects" :key="rect.id" :style="rectStyle(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRects(rectIndex)"
      :key="subIndex"
      :style="subRectStyle(rectIndex, subIndex)"
    ></div>
          <div v-for="(rect, rectIndex) in Object.values(adjustedRects)" :key="rect.id" :style="rectStyle(rect, rectIndex, 1)">
            <div v-for="(subRect, subIndex) in rect" :key="subIndex"
              :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
 <div v-show="cell2" style="width: 170px;height: 53px;position: relative;top:70px;left: 445px;">
    <div v-for="(rect, rectIndex) in adjustedRectsa" :key="rect.id" :style="rectStylea(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsa(rectIndex)"
      :key="subIndex"
      :style="subRectStylea(rectIndex, subIndex)"
    ></div>
          <div v-for="(rect, rectIndex) in Object.values(adjustedRectsa)" :key="rect.id" :style="rectStyle(rect, rectIndex, 1)">
            <div v-for="(subRect, subIndex) in rect" :key="subIndex"
              :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell3" style="width: 170px;height: 53px;position: relative;top:76px;left: 445px;">
    <div v-for="(rect, rectIndex) in adjustedRectsb" :key="rect.id" :style="rectStyleb(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsb(rectIndex)"
      :key="subIndex"
      :style="subRectStyleb(rectIndex, subIndex)"
    ></div>
          <div v-for="(rect, rectIndex) in Object.values(adjustedRectsb)" :key="rect.id" :style="rectStyle(rect, rectIndex, 1)">
            <div v-for="(subRect, subIndex) in rect" :key="subIndex"
              :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell4" style="width: 170px;height: 53px;position: relative;top:84px;left: 445px;">
    <div v-for="(rect, rectIndex) in adjustedRectsc" :key="rect.id" :style="rectStylec(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsc(rectIndex)"
      :key="subIndex"
      :style="subRectStylec(rectIndex, subIndex)"
    ></div>
          <div v-for="(rect, rectIndex) in Object.values(adjustedRectsc)" :key="rect.id" :style="rectStyle(rect, rectIndex, 1)">
            <div v-for="(subRect, subIndex) in rect" :key="subIndex"
              :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell5" style="width: 170px;height: 53px;position: relative;top:-16px;left: 45px;">
    <div v-for="(rect, rectIndex) in adjustedRectsd" :key="rect.id" :style="rectStyled(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsd(rectIndex)"
      :key="subIndex"
      :style="subRectStyled(rectIndex, subIndex)"
    ></div>
          <div v-for="(rect, rectIndex) in Object.values(adjustedRectsd)" :key="rect.id" :style="rectStyle(rect, rectIndex, 2.12)">
            <div v-for="(subRect, subIndex) in rect" :key="subIndex"
              :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell6" style="width: 170px;height: 53px;position: relative;top:-6px;left: 45px;">
    <div v-for="(rect, rectIndex) in adjustedRectse" :key="rect.id" :style="rectStylee(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectse(rectIndex)"
      :key="subIndex"
      :style="subRectStylee(rectIndex, subIndex)"
    ></div>
          <div v-for="(rect, rectIndex) in Object.values(adjustedRectse)" :key="rect.id" :style="rectStyle(rect, rectIndex, 2.12)">
            <div v-for="(subRect, subIndex) in rect" :key="subIndex"
              :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
</div>
</div>
<el-card style="flex: 1;margin-left: 1074px;margin-top: -410px;">
      <div style="width: 100%; height: calc(100% - 35px); overflow-y: auto;max-height: 420px;">
       <el-table height="370px" ref="table" border
       :data="tableDatass" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table height="370px" ref="table" border :data="tableDatass"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
         <el-table-column fixed prop="engineerId" align="center" :label="$t('Mounting.project')" min-width="100" />
         <el-table-column prop="countTemp" align="center" :label="$t('searchOrder.totalfurnaces')" min-width="68" />
         <el-table-column prop="fullTemp" align="center" :label="$t('searchOrder.furnaces')" min-width="82" />
@@ -1421,15 +1364,16 @@
    <div class="table-container">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 3px;">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 200px;">
       <el-table height="200px" ref="table"
        :row-class-name="tableRowClassName"
        :data="tableDatax" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table height="200px" ref="table" :row-class-name="tableRowClassName" :data="tableDatax"
            :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.intoglassid')" min-width="140" />
          <el-table-column prop="startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
          <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
            <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')"
              min-width="120" />
          <el-table-column prop="taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="120">
          <template #default="scope">
            <el-tag type="success" >{{ scope.row.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
                <el-tag type="success">{{ scope.row.taskState == 0 ? $t('searchOrder.filmenter') : $t('searchOrder.infilm')
                  }}</el-tag>
          </template>
          </el-table-column>
          <el-table-column prop="isSame" align="center" :label="$t('searchOrder.whethersame')" min-width="120">
@@ -1443,14 +1387,15 @@
       </div>
    </el-card>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 3px;">
      <el-table height="200px" ref="table"
       :data="tableDatac" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table height="200px" ref="table" :data="tableDatac"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
         <el-table-column prop="glassId" align="center" :label="$t('searchOrder.outputglassID')" min-width="140" />
         <el-table-column prop="startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
         <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
         <el-table-column prop="taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="157">
           <template #default="scope">
             <el-tag type="success" >{{ scope.row.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
              <el-tag type="success">{{ scope.row.taskState == 0 ? $t('searchOrder.filmenter') : $t('searchOrder.infilm')
                }}</el-tag>
           </template>
         </el-table-column>
       </el-table>
@@ -1482,11 +1427,12 @@
      <div style="margin-top: -20px;margin-bottom: 40px;margin-left: 30px">
          <el-input v-model="glassId"   :placeholder="$t('searchOrder.inputid')" clearable style="width: 200px;">
          </el-input>
          <el-button type="primary" plain style="margin-left: 10px;" @click="searchout">{{ $t('searchOrder.search') }}</el-button>
      <el-button type="primary" plain style="margin-left: 10px;" @click="searchout">{{ $t('searchOrder.search')
        }}</el-button>
    </div>
    <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 200px;">
        <el-table height="100%" ref="table"
        :data="tableDataf" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table height="100%" ref="table" :data="tableDataf"
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="120" />
          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="180" />
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
@@ -1495,17 +1441,11 @@
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="150"/>
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="150"/>
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="150"/>
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="150"/>
          <el-table-column
          align="center"
            :label="$t('searchOrder.startstatus')"
            min-width="80"
            prop="state"
          >
        <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')"
          min-width="150" />
        <el-table-column align="center" :label="$t('searchOrder.startstatus')" min-width="80" prop="state">
          <template #default="scope">  
          <el-tag
            :type="scope.row.state === 1 ? 'success' : 'danger'"
          >
            <el-tag :type="scope.row.state === 1 ? 'success' : 'danger'">
          {{ scope.row.state === 1 ? $t('searchOrder.enable') : $t('searchOrder.disable') }}
          </el-tag>  
        </template> 
@@ -1519,51 +1459,33 @@
        </el-table>
      </div>
  </el-dialog>
  <el-dialog v-model="dialogFormVisiblea" top="2vh" width="95%"
  :title="$t('searchOrder.cageinformation')">
  <el-dialog v-model="dialogFormVisiblea" top="2vh" width="95%" :title="$t('searchOrder.cageinformation')">
  <div v-loading="isLoading" class="loading-container" :element-loading-text="$t('searchOrder.loadingText')" >
  <div style="display: flex;">
    <el-input v-model="engineerId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('processCard.projectnumber')"/>
    <el-input v-model="glassId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('searchOrder.inglassID')"/>
    <el-input v-model="flowCardId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('searchOrder.incardnumber')" />
    <el-input v-model="filmsId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('film.infilms')"/>
    <el-input v-model="thickness" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('searchOrder.inthickness')"/>
        <el-input v-model="engineerId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
          :placeholder="$t('processCard.projectnumber')" />
        <el-input v-model="glassId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
          :placeholder="$t('searchOrder.inglassID')" />
        <el-input v-model="flowCardId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
          :placeholder="$t('searchOrder.incardnumber')" />
        <el-input v-model="filmsId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
          :placeholder="$t('film.infilms')" />
        <el-input v-model="thickness" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
          :placeholder="$t('searchOrder.inthickness')" />
    <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="fetchxianga">
      {{$t('reportmanage.inquire')}}</el-button>
  </div>
<el-table
  ref="table"
  style="margin-top: 20px; height: 700px; width: 1770px; overflow-y: auto;"
  :data="tableDataa"
  :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}"
  virtual-scroll
  :virtual-scroll-item-size="50"
  :virtual-scroll-offset="100"
  :row-height="50"
   :border="false"
  :lazy="true"
  :cell-style="{padding: '8px 0'}"
  :show-header-overflow="false"
  :show-overflow="false"
  :stripe="false"
  :selectable="false"
  :tooltip-effect="null"
>
      <el-table ref="table" style="margin-top: 20px; height: 700px; width: 1770px; overflow-y: auto;" :data="tableDataa"
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }" virtual-scroll :virtual-scroll-item-size="50"
        :virtual-scroll-offset="100" :row-height="50" :border="false" :lazy="true" :cell-style="{ padding: '8px 0' }"
        :show-header-overflow="false" :show-overflow="false" :stripe="false" :selectable="false" :tooltip-effect="null">
  <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.cagenumber')" min-width="100" />
          <el-table-column prop="engineerId" align="center" :label="$t('searchOrder.projectnumber')" min-width="100" />
          <el-table-column prop="layer" align="center" :label="$t('processCard.layer')" min-width="50" />
          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="150" />
          <el-table-column
          align="center"
            :label="$t('searchOrder.startstatus')"
            min-width="80"
            prop="enableState"
          >
        <el-table-column align="center" :label="$t('searchOrder.startstatus')" min-width="80" prop="enableState">
          <template #default="scope">  
          <el-tag
            :type="scope.row.enableState === 1 ? 'success' : 'danger'"
            @click="toggleEnableState(scope.row)"
          >
            <el-tag :type="scope.row.enableState === 1 ? 'success' : 'danger'" @click="toggleEnableState(scope.row)">
            {{ scope.row.enableState === 1 ? $t('searchOrder.enable') : $t('searchOrder.disable')}}  
          </el-tag>  
        </template> 
@@ -1576,7 +1498,8 @@
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
        <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')"
          min-width="120" />
          <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="240">
              <template #default="scope">
              <!-- <el-button type="text" plain @click="handleBindRack(scope.row)">{{ $t('searchOrder.add') }}</el-button> -->
@@ -1607,14 +1530,8 @@
  </el-dialog>
<!-- 历史任务 -->
<el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="750px"
     frameborder="0"
     ></iframe>
    <iframe :src="iframeUrl" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
      frameborder="0"></iframe>
  </el-dialog>
<!-- 钢化查询 -->
<el-dialog v-model="dialogFormVisiblec" top="5vh" width="90%" :title="$t('searchOrder.temperingqueries')">
@@ -1657,13 +1574,15 @@
        </el-row>
      </el-form>
    </div>
    <el-table  ref="table" style="margin-top: 20px;height: 600px;"
        :data="tableDatagh" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="100"/>
    <el-table ref="table" style="margin-top: 20px;height: 600px;" :data="tableDatagh"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')"
        min-width="100" />
          <el-table-column prop="engineerName" fixed align="center" :label="$t('large.engineername')" min-width="120"/>
          <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')" min-width="100" />
          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="100" />
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutnumber')" min-width="100" />
      <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutnumber')"
        min-width="100" />
          <el-table-column prop="totalCount" align="center" :label="$t('searchOrder.allnumber')" min-width="100" />
          <el-table-column prop="realCount" align="center" :label="$t('searchOrder.numbercages')" min-width="100" />
          <el-table-column prop="lackCount" align="center" :label="$t('searchOrder.missingquantity')" min-width="100" />
@@ -1674,44 +1593,38 @@
              <el-button type="text" plain @click="brokee(scope.row,0)">{{ $t('searchOrder.specifyout') }}</el-button>
              <el-button type="text" plain @click="brokek(scope.row)">{{ $t('searchOrder.specifyengineerid') }}</el-button>
              <el-button type="text" plain @click="handlelack(scope.row)">{{ $t('searchOrder.lacknumber') }}</el-button>
              <el-button type="text" plain @click="handlecagedetails(scope.row)">{{ $t('searchOrder.cagedetails') }}</el-button>
          <el-button type="text" plain @click="handlecagedetails(scope.row)">{{ $t('searchOrder.cagedetails')
            }}</el-button>
            </template>
        </el-table-column>
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisibled" top="5vh" width="85%" :title="$t('hellow.missingnumber')">
    <el-table  ref="table" style="margin-top: 20px;height: 600px;"
        :data="tableDatalack" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
    <el-table ref="table" style="margin-top: 20px;height: 600px;" :data="tableDatalack"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')"
        min-width="150" />
          <el-table-column prop="flowCardId" fixed align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
      <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')"
        min-width="100" />
      <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')"
        min-width="120" />
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')"  min-width="80" />
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="filmsid" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('searchOrder.state')"
            min-width="80"
            prop="isDamage"
          >
      <el-table-column align="center" :label="$t('searchOrder.state')" min-width="80" prop="isDamage">
            <template #default="scope">
              <div
                @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
                style="position: relative; display: inline-block;"
              >
                <el-tag
                  :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
                  style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};"
                >
          <div @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
            style="position: relative; display: inline-block;">
            <el-tag :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
              style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};">
                  {{ scope.row.isDamage === 1 ? $t('searchOrder.breakage') : $t('searchOrder.breakagn') }}
                </el-tag>
                <div
                  v-if="scope.row.isDamage === 1"
                  style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;"
                ></div>
            <div v-if="scope.row.isDamage === 1"
              style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;">
            </div>
              </div>
            </template>
          </el-table-column>
@@ -1721,38 +1634,31 @@
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisiblee" top="5vh" width="85%" :title="$t('searchOrder.specifyengineerid')">
    <el-table  ref="table" style="margin-top: 20px;height: 600px;"
        :data="tableDataspecify" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
    <el-table ref="table" style="margin-top: 20px;height: 600px;" :data="tableDataspecify"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')"
        min-width="150" />
          <el-table-column prop="flowCardId" fixed align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
      <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')"
        min-width="100" />
      <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')"
        min-width="120" />
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')"  min-width="80" />
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="filmsid" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('searchOrder.state')"
            min-width="80"
            prop="isDamage"
          >
      <el-table-column align="center" :label="$t('searchOrder.state')" min-width="80" prop="isDamage">
            <template #default="scope">
              <div
                @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
                style="position: relative; display: inline-block;"
              >
                <el-tag
                  :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
                  style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};"
                >
          <div @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
            style="position: relative; display: inline-block;">
            <el-tag :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
              style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};">
                  {{ scope.row.isDamage === 1 ? $t('searchOrder.breakage') : $t('searchOrder.breakagn') }}
                </el-tag>
                <div
                  v-if="scope.row.isDamage === 1"
                  style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;"
                ></div>
            <div v-if="scope.row.isDamage === 1"
              style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;">
            </div>
              </div>
            </template>
          </el-table-column>
@@ -1762,39 +1668,32 @@
        </el-table>
</el-dialog>
<el-dialog v-model="dialogFormVisiblef" top="5vh" width="85%" :title="$t('searchOrder.cagedetails')">
    <el-table  ref="table" style="margin-top: 20px;height: 600px;"
        :data="tableDatacagedetails" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
    <el-table ref="table" style="margin-top: 20px;height: 600px;" :data="tableDatacagedetails"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')"
        min-width="150" />
          <el-table-column prop="flowCardId" fixed align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
          <el-table-column prop="glassId" fixed align="center" :label="$t('searchOrder.glassID')" min-width="150" />
          <el-table-column prop="slot" fixed align="center" :label="$t('film.slot')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
      <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutID')"
        min-width="100" />
      <el-table-column prop="temperingFeedSequence" fixed align="center" :label="$t('searchOrder.picturesequence')"
        min-width="120" />
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')"  min-width="80" />
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="filmsId" align="center" :label="$t('searchOrder.coatingtypes')" min-width="80" />
          <el-table-column
            align="center"
            :label="$t('searchOrder.state')"
            min-width="80"
            prop="isDamage"
          >
      <el-table-column align="center" :label="$t('searchOrder.state')" min-width="80" prop="isDamage">
            <template #default="scope">
              <div
                @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
                style="position: relative; display: inline-block;"
              >
                <el-tag
                  :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
                  style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};"
                >
          <div @click="scope.row.isDamage === 1 ? null : broken(scope.row)"
            style="position: relative; display: inline-block;">
            <el-tag :type="scope.row.isDamage === 1 ? 'danger' : 'success'"
              style="pointer-events: {{ scope.row.isDamage === 1 ? 'none' : 'auto' }};">
                  {{ scope.row.isDamage === 1 ? $t('searchOrder.breakage') : $t('searchOrder.breakagn') }}
                </el-tag>
                <div
                  v-if="scope.row.isDamage === 1"
                  style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;"
                ></div>
            <div v-if="scope.row.isDamage === 1"
              style="position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: transparent; z-index: 1;">
            </div>
              </div>
            </template>
          </el-table-column>
@@ -1805,12 +1704,14 @@
</el-dialog>
<!-- 非钢化 -->
<el-dialog v-model="dialogFormVisibles" top="5vh" width="85%" :title="$t('searchOrder.searchlayout')">
  <el-table  ref="table" style="margin-top: 20px;height: 500px;"
        :data="tableDatas" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')" min-width="150"/>
    <el-table ref="table" style="margin-top: 20px;height: 500px;" :data="tableDatas"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
      <el-table-column prop="engineerId" fixed align="center" :label="$t('searchOrder.projectnumber')"
        min-width="150" />
          <el-table-column prop="thickness" align="center" :label="$t('basicData.thickness')" min-width="150" />
          <el-table-column prop="filmsId" align="center" :label="$t('basicData.coatingtypes')" min-width="150" />
          <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutnumber')" min-width="120" />
      <el-table-column prop="temperingLayoutId" fixed align="center" :label="$t('searchOrder.layoutnumber')"
        min-width="120" />
          <el-table-column prop="totalCount" align="center" :label="$t('searchOrder.allnumber')" min-width="150" />
          <el-table-column prop="realCount" align="center" :label="$t('searchOrder.numbercages')" min-width="150" />
          <el-table-column prop="lackCount" align="center" :label="$t('searchOrder.missingquantity')" min-width="150" />
@@ -1821,7 +1722,8 @@
              <el-button type="text" plain @click="brokee(scope.row,0)">{{ $t('searchOrder.specifyout') }}</el-button>
              <el-button type="text" plain @click="brokek(scope.row)">{{ $t('searchOrder.specifyengineerid') }}</el-button>
              <el-button type="text" plain @click="handlelack(scope.row)">{{ $t('hellow.missingnumber') }}</el-button>
              <el-button type="text" plain @click="handlecagedetails(scope.row)">{{ $t('searchOrder.cagedetails') }}</el-button>
          <el-button type="text" plain @click="handlecagedetails(scope.row)">{{ $t('searchOrder.cagedetails')
            }}</el-button>
            </template>
        </el-table-column>
        </el-table>
@@ -1839,12 +1741,25 @@
</el-dialog>
</template>
<style>
#dt { display:block; float:left;line-height: 20px;margin-left: 150px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 150px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
@@ -1854,9 +1769,11 @@
   background-color: #337ecc;
   margin-left: 28%;
}
#awatch{
  height: 450px;
}
#occupy {
    height: 100%;
    width: 15%;
@@ -1866,28 +1783,37 @@
    text-align: center;
    padding: 5px;
}
#biao {
    font-size: 12px;
}
#zhi {
    font-size: 18px;
    font-weight: bold;
}
#demo-pagination-block + #demo-pagination-block {
  margin-top: 10px;
}
#demo-pagination-block #demonstration {
  margin-bottom: 16px;
}
::-webkit-scrollbar {
     width: 0 !important;
   }
   ::-webkit-scrollbar {
     width: 0 !important;height: 0;
  width: 0 !important;
  height: 0;
   }
   .img-list{
  position:relative;
}
.data-img{
  @apply float-none ;
  width:100%;
@@ -1896,6 +1822,7 @@
  opacity: 1;
  border-radius: 0.5rem 0.5rem 0px 0px;
}
.check-img{
  position: absolute;
  width: 3.3125rem;
@@ -1904,6 +1831,7 @@
  right: 57rem;
  z-index: 10;
}
.check-imga{
  position: absolute;
  width: 3.3125rem;
@@ -1912,23 +1840,32 @@
  right: 28.5rem;
  z-index: 10;
}
.vertical {
    width: 45px;
    height: 25px;
    background-color: #409EFF;
    top: 485px; /* 初始位置 */
    left: 899px; /* 水平居中 */
  top: 485px;
  /* 初始位置 */
  left: 899px;
  /* 水平居中 */
    transform: translateX(-50%);
    animation: move-vertical 6s infinite; /* 从上到下动画,持续6秒,无限循环 */
  animation: move-vertical 6s infinite;
  /* 从上到下动画,持续6秒,无限循环 */
}
@keyframes move-vertical {
    0% {
        top: 485px; /* 起始位置 */
    top: 485px;
    /* 起始位置 */
    }
    100% {
        top: calc(100% - 210px); /* 从上到下结束位置 */
    top: calc(100% - 210px);
    /* 从上到下结束位置 */
    }
}
.img-dlpl{
  margin-left: 20px;
  margin-top: 0px;
@@ -1942,6 +1879,7 @@
  overflow: hidden;
  position:relative
}
.img-car1{
  display: flex;
  background-image:url('/xiaoche.png');
@@ -1955,6 +1893,7 @@
  overflow: hidden;
  position:relative
}
.img-car4{
  display: flex;
  background-image:url('/xiaoche.png');
@@ -1968,15 +1907,22 @@
  overflow: hidden;
  position:relative
}
.table-container {
  display: flex;
  flex-wrap: nowrap; /* 防止换行 */
  justify-content: space-between; /* 根据需要调整子元素之间的间距 */
  flex-wrap: nowrap;
  /* 防止换行 */
  justify-content: space-between;
  /* 根据需要调整子元素之间的间距 */
}
.table-container > el-card {
  flex: 1; /* 使两个卡片平分可用空间 */
  margin-bottom: 10px; /* 可选,根据需要添加底部间距 */
  flex: 1;
  /* 使两个卡片平分可用空间 */
  margin-bottom: 10px;
  /* 可选,根据需要添加底部间距 */
}
#dotClass {
  display: flex;
  margin-left: 20px; 
@@ -1984,14 +1930,18 @@
  margin-top: 20px;
  margin-bottom: 10px;
}
.row-red-background {
  background-color: #CDAF95 !important;
}
.global-alert-bar {
  position: fixed;
  top: 0;
  left: 50%; /* 水平居中关键 */
  transform: translateX(-50%); /* 水平居中关键 */
  left: 50%;
  /* 水平居中关键 */
  transform: translateX(-50%);
  /* 水平居中关键 */
  padding: 12px 20px;
  background-color: #dbdbd7;
  box-shadow: 0 2px 10px rgba(0,0,0,0.2);
@@ -1999,16 +1949,21 @@
  justify-content: space-between;
  align-items: center;
  z-index: 9999;
  max-width: 80%; /* 防止小屏幕溢出 */
  min-width: 400px; /* 最小宽度保证 */
  max-width: 80%;
  /* 防止小屏幕溢出 */
  min-width: 400px;
  /* 最小宽度保证 */
}
/* 提示内容居中 */
.alert-content {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-grow: 1; /* 占据可用空间 */
  flex-grow: 1;
  /* 占据可用空间 */
}
/* 提示文字样式 */
.alert-text {
  margin-left: 8px;
@@ -2016,6 +1971,7 @@
  font-weight: bold;
  color: #0d0d0d;
}
/* 关闭按钮样式 */
.close-btn {
  background: none;
@@ -2024,18 +1980,23 @@
  cursor: pointer;
  margin-left: 20px;
}
/* 页面容器顶部内边距 */
#app-container {
  padding-top: 60px; /* 根据alert高度调整 */
  padding-top: 60px;
  /* 根据alert高度调整 */
}
.loading-container {
  position: relative;
  height: 100%;
}
/* 确保遮罩层在最顶层 */
.el-loading-mask {
  z-index: 2000 !important;
}
.confirm-text {
  color: rgb(242, 121, 8);
  display: block; /* 强制换行 */
UI-Project/src/views/StockBasicData/stockBasicData.vue
@@ -256,6 +256,7 @@
    case 2: return 'primary';
    default: return 'info';
  }
  return getOriginalColor(row.state);
}
// 5. 标签类型函数(调用isNeedHighlight)
UI-Project/src/views/StockBasicData/stockBasicData1.vue
New file
@@ -0,0 +1,259 @@
<script setup>
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {useRouter} from "vue-router"
import request from "@/utils/request"
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import {ElMessage, ElMessageBox} from 'element-plus'
import {useI18n} from 'vue-i18n'
const router = useRouter()
const adda = ref(false)
const {t} = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const tableData = ref([])
const blindb = ref(false)
const slot = ref('')
const requestData = {
  line: 2001
};
const timeRange = ref([])
const selectValuesa = reactive([]);
// 磨边任务查询
const setEdgGlassInfoRequest = async () => {
  let celllist=[]
  let stateList=[]
  if(selectValuesa[0]!=null&&selectValuesa[0]!='undefined'){
    if(selectValuesa[0]!=""){
      celllist=[selectValuesa[0]];
    }
  }
  if(selectValuesa[1]!=null&&selectValuesa[1]!='undefined'){
    if(selectValuesa[1]!=""){
      stateList=[selectValuesa[1]];
    }
  }
  const response = await request.post("/cacheGlass/edgGlassTaskInfo/setEdgGlassInfoRequest", {
    cellList: celllist,
    stateList: stateList,
    beginDate: timeRange.value[0],
    endDate: timeRange.value[1],
  })
  if (response.code === 200) {
    ElMessage.success(response.message);
  } else {
    ElMessage.error(response.message);
  }
}
// 破损
 const open = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.messagedamaged'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
        glassId: row.glassId,
        state: 8,
        line: row.line,
        workingProcedure: '磨边',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
// 拿走
 const opena = async(row) => {
  try {
    const confirmResult = await ElMessageBox.confirm(
      t('workOrder.takemessage'),
      t('workOrder.prompt'),
      {
        confirmButtonText: t('workOrder.yes'),
        cancelButtonText: t('workOrder.cancel'),
        type: 'warning',
      }
    );
    if (confirmResult === 'confirm') {
      const response = await request.post("/cacheGlass/edgStorageCage/edgReportStatus", {
        glassId: row.glassId,
        state: 9,
        line: row.line,
        workingProcedure: '磨边',
    })
    if (response.code === 200) {
      ElMessage.success(response.message);
      } else {
      ElMessage.error(response.msg);
      }
    }
  } catch (error) {
  }
};
let socket = null;
const socketUrl = `ws://${window.ipConfig.serverUrl}/api/cacheGlass/api/talk/edgTasks`;
const handleMessage = (data) => {
  const formattedTasks = data.edgTasks[0].map(cageInfo => {
    if (cageInfo && cageInfo.createTime) {
      cageInfo.formattedCreateTime = formatTimestamp(cageInfo.createTime);
    }
    return cageInfo;
  });
  tableData.value = formattedTasks
};
// 历史任务
const iframeUrl = ref('');
const handlehistorical = (row) => {
  blindb.value = true;
  iframeUrl.value = `${window.location.origin}/#/StockBasicData/stockhistory`;
};
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
  onUnmounted(() => {
    if (socket) {
      closeWebSocket(socket);
    }
  });
  function getStatusTypeb(state) {
  switch (state) {
    case 0:
      return 'info';
    case 1:
      return 'success';
    case 1:
      return 'danger';
  }
}
function getStatusTextb(state) {
  switch (state) {
    case 0:
      return t('workOrder.nedging');
    case 1:
      return t('workOrder.edging');
    case 2:
      return t('workOrder.finedging');
  }
}
function formatTimestamp(timestamp) {
  const date = new Date(timestamp);
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始,需要加1,并补零
  const day = String(date.getDate()).padStart(2, '0'); // 补零
  const hours = String(date.getHours()).padStart(2, '0'); // 补零(如果需要显示时间)
  const minutes = String(date.getMinutes()).padStart(2, '0'); // 补零(如果需要显示时间)
  const seconds = String(date.getSeconds()).padStart(2, '0'); // 补零(如果需要显示时间)
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
onBeforeUnmount(() => {
  closeWebSocket();
});
</script>
<template>
  <div style="height: 500px;">
    <div>
      <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" >
        <div style="display: flex;">
        <!-- <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handlehistorical">{{
          $t('searchOrder.historicaltasks')
        }}
      </el-button> -->
        <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('workOrder.cway')" clearable
                   style="margin-left: 20px;margin-bottom: 10px;">
          <el-option :label="$t('workOrder.edgingone')" value="930"></el-option>
          <el-option :label="$t('workOrder.edgingtwo')" value="931"></el-option>
        </el-select>
        <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('workOrder.cstate')" clearable
                   style="margin-left: 20px;margin-bottom: 10px;">
          <el-option :label="$t('workOrder.nedging')" value="0"></el-option>
          <el-option :label="$t('workOrder.edging')" value="1"></el-option>
          <el-option :label="$t('workOrder.finedging')" value="2"></el-option>
          </el-select>
          <span class="demonstration" style="margin-left: 20px;margin-top: 3px;">{{ $t('workOrder.time') }}</span>
            <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至" :start-placeholder="$t('reportmanage.starttime')"  style="margin-left: 15px;" value-format = "YYYY-MM-DD hh:mm:ss"
              :end-placeholder="$t('reportmanage.endtime')">
            </el-date-picker>
          <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="setEdgGlassInfoRequest()">{{
        $t('reportmanage.inquire')
      }}</el-button>
      </div>
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
        <el-table height="750" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableData" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table-column prop="glassId" align="center" :label="$t('workOrder.glassID')" min-width="180" />
          <el-table-column prop="width" align="center" :label="$t('workOrder.width')" min-width="120" />
          <el-table-column prop="height" align="center" :label="$t('workOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('workOrder.thickness')" min-width="120" />
          <el-table-column prop="filmsid" align="center" :label="$t('workOrder.glasstype')" min-width="120" />
          <el-table-column prop="line" align="center" :label="$t('workOrder.line')" min-width="120" />
          <el-table-column prop="formattedCreateTime" align="center" :label="$t('workOrder.time')" min-width="120" />
          <el-table-column prop="state" :label="$t('workOrder.status')" align="center" width="200">
            <!-- <template #default="scope">
              {{ scope.row.status==0?"未磨边":scope.row.status==1?"磨边中":"已磨边" }}
            </template> -->
            <template #default="scope">
        <el-tag :type="getStatusTypeb(scope.row.state)">
          {{ getStatusTextb(scope.row.state) }}
        </el-tag>
      </template>
        </el-table-column>
          <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
            <template #default="scope">
              <el-button type="text" plain @click="open(scope.row)">{{
                  $t('workOrder.breakage')
                }}
              </el-button>
              <el-button type="text" plain @click="opena(scope.row)">{{
                  $t('workOrder.takeout')
                }}
              </el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      </el-card>
    </div>
  <!-- 历史任务 -->
<el-dialog v-model="blindb" top="10vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="700px"
     frameborder="0"
     ></iframe>
  </el-dialog>
  </div>
</template>
<style scoped>
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
  color: black;
   width: 200px;
   height: 100px;
   background-color: #337ecc;
   margin-left: 28%;
}
#awatch{
  height: 460px;
  /* margin-top: -60px; */
}
</style>
UI-Project/src/views/hollow/hollowslicecage.vue
@@ -642,52 +642,22 @@
}else{
  hollowPriority.value = ''
  }
//   if(data.bigStorageCageInfos!=null){
//     adjustedRects.value = data.bigStorageCageInfos[0][1].map((rect, index) => ({
//     id: index + 1,
//     height: 15/55,
//     top: 64/55,
//   }));
// subRectsCounts.value = data.bigStorageCageInfos[0][1].map(rect => rect.count);
// adjustedRectsa.value = data.bigStorageCageInfos[0][2].map((rect, index) => ({
//     id: index + 1,
//     height: 15/55,
//     top: 64/55,
//   }));
// subRectsCountsa.value = data.bigStorageCageInfos[0][2].map(rect => rect.count);
// adjustedRectsb.value = data.bigStorageCageInfos[0][3].map((rect, index) => ({
//     id: index + 1,
//     height: 15/55,
//     top: 64/55,
//   }));
// subRectsCountsb.value = data.bigStorageCageInfos[0][3].map(rect => rect.count);
// adjustedRectsc.value = data.bigStorageCageInfos[0][4].map((rect, index) => ({
//     id: index + 1,
//     height: 15/55,
//     top: 64/55,
//   }));
// subRectsCountsc.value = data.bigStorageCageInfos[0][4].map(rect => rect.count);
// adjustedRectsd.value = data.bigStorageCageInfos[0][5].map((rect, index) => ({
//     id: index + 1,
//     height: 15/55,
//     top: 64/55,
//   }));
// subRectsCountsd.value = data.bigStorageCageInfos[0][5].map(rect => rect.count);
// adjustedRectse.value = data.bigStorageCageInfos[0][6].map((rect, index) => ({
//     id: index + 1,
//     height: 15/55,
//     top: 64/55,
//   }));
// subRectsCountse.value = data.bigStorageCageInfos[0][6].map(rect => rect.count);
//   }else{
//     adjustedRects.value = '',
//     adjustedRectsa.value = '',
//     adjustedRectsb.value = '',
//     adjustedRectsc.value = '',
//     adjustedRectsd.value = '',
//     adjustedRectse.value = ''
//   }
  if (data.bigStorageCageInfos != null) {
    adjustedRects.value = data.bigStorageCageInfos[0][1];
    adjustedRectsa.value = data.bigStorageCageInfos[0][2];
    console.log(adjustedRectsa.value)
    adjustedRectsb.value = data.bigStorageCageInfos[0][3];
    adjustedRectsc.value = data.bigStorageCageInfos[0][4];
    adjustedRectsd.value = data.bigStorageCageInfos[0][5];
    adjustedRectse.value = data.bigStorageCageInfos[0][6];
  } else {
    adjustedRects.value = '',
      adjustedRectsa.value = '',
      adjustedRectsb.value = '',
      adjustedRectsc.value = '',
      adjustedRectsd.value = '',
      adjustedRectse.value = ''
  }
};
const getAlertText = (alarmCode) => {
  const codeMap = {
@@ -706,11 +676,11 @@
  showModal.value = true;
};
// 计算每个大矩形的样式
const rectStyle = (rect, index) => ({
const rectStyle = (rect, index, high) => ({
  position: 'absolute',
  width: '150px',
  left: '0px',
  top: `${index*rect.top}px`,
  top: `${index * high}px`,
  height: `${rect.height}px`,
});
// 计算每个小矩形的样式和数量
@@ -723,15 +693,17 @@
  return subRects;
};
// 计算每个小矩形的样式
const proportion = ref((150 / 6200).toFixed(2));
const subRectStyle = (rectIndex, subIndex) => {
  const width = '18px';
  const width = `${rectIndex.length * proportion.value}px`;
  // const width = '18px';
  const marginLeft = '3px';
  const totalWidth = 6 * (parseInt(width) + parseInt(marginLeft));
  const left = `${(subIndex * (parseInt(width) + parseInt(marginLeft))) / totalWidth * 100}%`;
  return {
    position: 'absolute',
    width,
    height: '100%',
    height: '1px',
    marginLeft,
    top: '0px',
    backgroundColor: '#911005',
@@ -949,7 +921,9 @@
  <div style="height: 600px;">
    <div v-if="showAlert" class="global-alert-bar" @dblclick="handleDoubleClick">
    <div class="alert-content">
      <el-icon><WarnTriangleFilled /></el-icon>
        <el-icon>
          <WarnTriangleFilled />
        </el-icon>
      <span class="alert-text">
        {{ alertText }} (id:{{ alertMessage }})
        <span class="confirm-text">{{ $t('hellow.pleaseConfirm') }}</span>
@@ -957,24 +931,10 @@
    </div>
    <button @click="showAlert = false" class="close-btn">×</button>
  </div>
  <el-dialog
    v-model="showModal"
    width="40%"
    center
  >
      <el-table
      ref="table"
      border
      :data="tableDataAlert"
      max-height="calc(500px - 35px)"
      style="width: 100%;"
    >
    <el-dialog v-model="showModal" width="40%" center>
      <el-table ref="table" border :data="tableDataAlert" max-height="calc(500px - 35px)" style="width: 100%;">
      <el-table-column prop="formattedCreateTime" align="center" :label="$t('film.createtime')" min-width="100" />
      <el-table-column
       :label="$t('hellow.content')"
       align="center"
       min-width="220"
     >
        <el-table-column :label="$t('hellow.content')" align="center" min-width="220">
       <template #default="scope">
           <span>
             {{ getAlertText(scope.row.alarmCode) }} 
@@ -984,131 +944,117 @@
     </el-table-column>
      <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="100">
        <template #default="scope">
          <el-button type="text" plain
            @click="handleSure(scope.row)">{{ $t('basicData.yes') }}</el-button>
            <el-button type="text" plain @click="handleSure(scope.row)">{{ $t('basicData.yes') }}</el-button>
        </template>
      </el-table-column>
    </el-table>
  </el-dialog>
    <div style="display: flex;">
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="primary" @click="handlexiang">{{ $t('searchOrder.cageinformation') }}</el-button>
    <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="success" @click="handlehistorical">{{ $t('searchOrder.historicaltasks') }}</el-button>
      <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="primary" @click="handlexiang">{{
        $t('searchOrder.cageinformation') }}</el-button>
      <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="success"
        @click="handlehistorical">{{
          $t('searchOrder.historicaltasks') }}</el-button>
    <!-- <el-button style="margin-top: 7px;margin-left: 10px;" id="searchButton" type="danger" @click="handleptask()">{{ $t('searchOrder.partask') }}</el-button> -->
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="diaodu" class="mb-2" :inactive-text="$t('searchOrder.Schedulingswitch')" @change="handlediaodu" />
      <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="diaodu" class="mb-2"
        :inactive-text="$t('searchOrder.Schedulingswitch')" @change="handlediaodu" />
    <div style="display: flex;">
   <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;">{{ $t('searchOrder.hollowPriority') }}:</div>
   <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;color: #911005;">{{ $t('searchOrder.firstLinePriority') }}</div>
    <el-switch
       style="margin-top: 7px;margin-left: 10px;"
       v-model="hollowPriority"
       class="mb-2"
       @change="handlehollowPriority"
     />
   <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;color: rgb(184, 130, 48)">{{ $t('searchOrder.secondLinePriority') }}</div>
        <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;">{{
          $t('searchOrder.hollowPriority') }}:</div>
        <div style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;color: #911005;">{{
          $t('searchOrder.firstLinePriority') }}</div>
        <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="hollowPriority" class="mb-2"
          @change="handlehollowPriority" />
        <div
          style="margin-left: 15px;margin-top: 5px;font-size: 14px;top: 5vh;margin-top: 12px;color: rgb(184, 130, 48)">
          {{
            $t('searchOrder.secondLinePriority') }}</div>
     </div>
</div>
    <div id="dotClass">
        <div>{{ $t('searchOrder.inkageEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: inkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: inkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.requestEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: requestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: requestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.mesReplyEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: mesReplyEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: mesReplyEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.outInkageEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: outInkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: outInkageEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('searchOrder.outRequestEntity') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: outRequestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: outRequestEntity, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('hellow.freeone') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: freeone, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: freeone, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('hellow.freetwo') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: freetwo, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: freetwo, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
        <div style="margin-left: 70px;">{{ $t('hellow.freethree') }}</div>
        <i :style="{ marginTop: '2px', backgroundColor: freethree, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      <i
        :style="{ marginTop: '2px', backgroundColor: freethree, width: '18px', height: '18px', borderRadius: '50%', display: 'block' }"></i>
      </div>
    <div style="display: flex; align-items: flex-start; gap: 20px; height: 70vh;">
<!-- // 父级框 -->
<div class="img-zkdlpl" >
    <div class="img-car1" :style="'z-index:999;left:212px;top:' + 1300*carPosition[0] + 'px;position:absolute;'">
      <div
      v-for="(rect, index) in adjusta"
      :key="rect.id"
      :style="{
          <div v-for="(rect, index) in adjusta" :key="rect.id" :style="{
       width: '30px',
       height: '5px',
       backgroundColor: '#409EFF',
       marginLeft: 5+ `px`,
       top: '10px',
       }"
    >
          }">
    </div>
    </div>
    <div class="img-car4" :style="'z-index:999;left:580px;top:' + 450*carPosition[1] + 'px;position:absolute;'">
      <div
      v-for="(rect, index) in adjust"
      :key="rect.id"
      :style="{
          <div v-for="(rect, index) in adjust" :key="rect.id" :style="{
       width: '30px',
       height: '5px',
       backgroundColor: '#409EFF',
       marginLeft: 5+ `px`,
       top: '10px',
       }"
    >
          }">
    </div>
    </div>
    <div style="position: relative;">
    <div v-show="cell1" style="width: 150px;height: 64px;position: relative;top:82px;left: 415px;">
      <div v-for="(rect, rectIndex) in adjustedRects" :key="rect.id" :style="rectStyle(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRects(rectIndex)"
      :key="subIndex"
      :style="subRectStyle(rectIndex, subIndex)"
    ></div>
            <div v-for="(rect, rectIndex) in Object.values(adjustedRects)" :key="rect.id" :style="rectStyle(rect, rectIndex,1.6)">
              <div v-for="(subRect, subIndex) in rect" :key="subIndex"
                :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
 <div v-show="cell2" style="width: 150px;height: 64px;position: relative;top:88px;left: 415px;">
  <div v-for="(rect, rectIndex) in adjustedRectsa" :key="rect.id" :style="rectStylea(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsa(rectIndex)"
      :key="subIndex"
      :style="subRectStylea(rectIndex, subIndex)"
    ></div>
            <div v-for="(rect, rectIndex) in Object.values(adjustedRectsa)" :key="rect.id" :style="rectStyle(rect, rectIndex,1.16)">
              <div v-for="(subRect, subIndex) in rect" :key="subIndex"
                :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell3" style="width: 150px;height: 64px;position: relative;top:93px;left: 415px;">
    <div v-for="(rect, rectIndex) in adjustedRectsb" :key="rect.id" :style="rectStyleb(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsb(rectIndex)"
      :key="subIndex"
      :style="subRectStyleb(rectIndex, subIndex)"
    ></div>
            <div v-for="(rect, rectIndex) in Object.values(adjustedRectsb)" :key="rect.id" :style="rectStyle(rect, rectIndex,1.16)">
              <div v-for="(subRect, subIndex) in rect" :key="subIndex"
                :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell4" style="width: 150px;height: 64px;position: relative;top:99px;left: 415px;">
    <div v-for="(rect, rectIndex) in adjustedRectsc" :key="rect.id" :style="rectStylec(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsc(rectIndex)"
      :key="subIndex"
      :style="subRectStylec(rectIndex, subIndex)"
    ></div>
            <div v-for="(rect, rectIndex) in Object.values(adjustedRectsc)" :key="rect.id" :style="rectStyle(rect, rectIndex,1.16)">
              <div v-for="(subRect, subIndex) in rect" :key="subIndex"
                :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell5" style="width: 150px;height: 64px;position: relative;top:105px;left: 415px;">
    <div v-for="(rect, rectIndex) in adjustedRectsd" :key="rect.id" :style="rectStyled(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectsd(rectIndex)"
      :key="subIndex"
      :style="subRectStyled(rectIndex, subIndex)"
    ></div>
            <div v-for="(rect, rectIndex) in Object.values(adjustedRectsd)" :key="rect.id" :style="rectStyle(rect, rectIndex,1.16)">
              <div v-for="(subRect, subIndex) in rect" :key="subIndex"
                :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
  <div v-show="cell6" style="width: 150px;height: 64px;position: relative;top:28px;left: 40px;">
    <div v-for="(rect, rectIndex) in adjustedRectse" :key="rect.id" :style="rectStyled(rect, rectIndex)">
    <div
      v-for="(subRect, subIndex) in getSubRectse(rectIndex)"
      :key="subIndex"
      :style="subRectStylee(rectIndex, subIndex)"
    ></div>
            <div v-for="(rect, rectIndex) in Object.values(adjustedRectse)" :key="rect.id" :style="rectStyle(rect, rectIndex,2.56)">
              <div v-for="(subRect, subIndex) in rect" :key="subIndex"
                :style="subRectStyle(subRect, subIndex)"></div>
    </div>
    </div>
</div>
@@ -1162,15 +1108,16 @@
    <div class="table-container">
    <el-card style="flex: 1;margin-left: 10px;margin-top: 3px;">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 140px;">
      <el-table height="120px" ref="table"
        :row-class-name="tableRowClassName"
        :data="tableDatad" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table height="120px" ref="table" :row-class-name="tableRowClassName" :data="tableDatad"
            :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.intoglassid')" min-width="140" />
          <el-table-column prop="startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
          <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
            <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')"
              min-width="120" />
          <el-table-column prop="taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="120">
          <template #default="scope">
            <el-tag type="success" >{{ scope.row.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
                <el-tag type="success">{{ scope.row.taskState == 0 ? $t('searchOrder.filmenter') : $t('searchOrder.infilm')
                  }}</el-tag>
          </template>
          </el-table-column>
          <el-table-column prop="isSame" align="center" :label="$t('searchOrder.whethersame')" min-width="120">
@@ -1184,14 +1131,15 @@
       </div>
    </el-card>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 3px;">
      <el-table height="120px" ref="table"
       :data="tableDatac" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
        <el-table height="120px" ref="table" :data="tableDatac"
          :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
         <el-table-column prop="glassId" align="center" :label="$t('searchOrder.outputglassID')" min-width="140" />
         <el-table-column prop="startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
         <el-table-column prop="targetSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
         <el-table-column prop="taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="157">
           <template #default="scope">
             <el-tag type="success" >{{ scope.row.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}</el-tag>
              <el-tag type="success">{{ scope.row.taskState == 0 ? $t('searchOrder.filmenter') : $t('searchOrder.infilm')
                }}</el-tag>
           </template>
         </el-table-column>
       </el-table>
@@ -1223,11 +1171,12 @@
      <div style="margin-top: -20px;margin-bottom: 40px;margin-left: 30px">
          <el-input v-model="glassId"   :placeholder="$t('searchOrder.inputid')" clearable style="width: 200px;">
          </el-input>
          <el-button type="primary" plain style="margin-left: 10px;" @click="searchout">{{ $t('searchOrder.search') }}</el-button>
      <el-button type="primary" plain style="margin-left: 10px;" @click="searchout">{{ $t('searchOrder.search')
        }}</el-button>
    </div>
    <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 200px;">
        <el-table height="100%" ref="table"
        :data="tableDataf" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
      <el-table height="100%" ref="table" :data="tableDataf"
        :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="120" />
          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="180" />
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="150" />
@@ -1236,17 +1185,11 @@
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="150"/>
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="150"/>
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="150"/>
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="150"/>
          <el-table-column
          align="center"
            :label="$t('searchOrder.startstatus')"
            min-width="80"
            prop="state"
          >
        <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')"
          min-width="150" />
        <el-table-column align="center" :label="$t('searchOrder.startstatus')" min-width="80" prop="state">
          <template #default="scope">  
          <el-tag
            :type="scope.row.state === 1 ? 'success' : 'danger'"
          >
            <el-tag :type="scope.row.state === 1 ? 'success' : 'danger'">
          {{ scope.row.state === 1 ? $t('searchOrder.enable') : $t('searchOrder.disable') }}
          </el-tag>  
        </template> 
@@ -1263,30 +1206,28 @@
  <!-- 理片笼信息 -->
<el-dialog v-model="dialogFormVisiblea" top="2vh" width="97%" :title="$t('searchOrder.cageinformation')">
  <div style="display: flex;">
    <el-input v-model="engineerId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('processCard.projectnumber')"/>
    <el-input v-model="glassId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('searchOrder.inglassID')"/>
    <el-input v-model="flowCardId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('searchOrder.incardnumber')" />
    <el-input v-model="filmsId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('film.infilms')"/>
    <el-input v-model="thickness" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;" :placeholder="$t('searchOrder.inthickness')"/>
      <el-input v-model="engineerId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
        :placeholder="$t('processCard.projectnumber')" />
      <el-input v-model="glassId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
        :placeholder="$t('searchOrder.inglassID')" />
      <el-input v-model="flowCardId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
        :placeholder="$t('searchOrder.incardnumber')" />
      <el-input v-model="filmsId" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
        :placeholder="$t('film.infilms')" />
      <el-input v-model="thickness" clearable style="margin-left: 10px;margin-bottom: 10px;width: 240px;"
        :placeholder="$t('searchOrder.inthickness')" />
    <el-button type="primary" style="margin-left: 10px;margin-bottom: 10px;" @click="fetchxianga">
      {{$t('reportmanage.inquire')}}</el-button>
  </div>
  <el-table ref="table" style="margin-top: 20px;height: 700px;width: 1770px;" :data="tableDataa" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
    <el-table ref="table" style="margin-top: 20px;height: 700px;width: 1770px;" :data="tableDataa"
      :header-cell-style="{ background: '#F2F3F5 ', color: '#1D2129' }">
          <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.cagenumber')" min-width="150" />
          <el-table-column prop="engineerId" align="center" :label="$t('searchOrder.projectnumber')" min-width="100" />
          <el-table-column prop="layer" align="center" :label="$t('processCard.layer')" min-width="80" />
          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="120" />
          <el-table-column
          align="center"
            :label="$t('searchOrder.startstatus')"
            min-width="80"
            prop="enableState"
          >
      <el-table-column align="center" :label="$t('searchOrder.startstatus')" min-width="80" prop="enableState">
          <template #default="scope">  
          <el-tag
            :type="scope.row.enableState === 1 ? 'success' : 'danger'"
            @click="toggleEnableState(scope.row)"
          >
          <el-tag :type="scope.row.enableState === 1 ? 'success' : 'danger'" @click="toggleEnableState(scope.row)">
            {{ scope.row.enableState === 1 ? $t('searchOrder.enable') : $t('searchOrder.disable')}}  
          </el-tag>  
        </template> 
@@ -1299,7 +1240,8 @@
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="80" />
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="80" />
          <el-table-column prop="temperingLayoutId" align="center" :label="$t('searchOrder.layoutID')" min-width="100" />
          <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')" min-width="120" />
      <el-table-column prop="temperingFeedSequence" align="center" :label="$t('searchOrder.picturesequence')"
        min-width="120" />
          <el-table-column prop="gap" align="center" :label="$t('searchOrder.glassgaps')" min-width="80" />
          <el-table-column fixed="right" :label="$t('film.operate')" align="center" width="240">
              <template #default="scope">
@@ -1339,23 +1281,30 @@
  </el-dialog>
  <!-- 历史任务 -->
<el-dialog v-model="blindb" top="5vh" width="95%" @close="iframeUrl=''">
     <iframe
     :src="iframeUrl"
     marginwidth="2000px"
     marginheight="2000px"
     width="100%"
     height="750px"
     frameborder="0"
     ></iframe>
    <iframe :src="iframeUrl" marginwidth="2000px" marginheight="2000px" width="100%" height="750px"
      frameborder="0"></iframe>
  </el-dialog>
</template>
<style>
#dt { display:block; float:left;line-height: 20px;margin-left: 100px;}
#dta { display:block; float:left;line-height: 20px;margin-left: 80%;}
#dt {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 100px;
}
#dta {
  display: block;
  float: left;
  line-height: 20px;
  margin-left: 80%;
}
#dialog-footer{
  text-align: center;
  margin-top: -15px;
}
#message{
  text-align: center;
  align-items: center;
@@ -1365,9 +1314,11 @@
   background-color: #337ecc;
   margin-left: 28%;
}
#awatch{
  height: 450px;
}
#occupy {
    height: 100%;
    width: 15%;
@@ -1377,28 +1328,37 @@
    text-align: center;
    padding: 5px;
}
#biao {
    font-size: 12px;
}
#zhi {
    font-size: 18px;
    font-weight: bold;
}
#demo-pagination-block + #demo-pagination-block {
  margin-top: 10px;
}
#demo-pagination-block #demonstration {
  margin-bottom: 16px;
}
::-webkit-scrollbar {
     width: 0 !important;
   }
   ::-webkit-scrollbar {
     width: 0 !important;height: 0;
  width: 0 !important;
  height: 0;
   }
   .img-list{
  position:relative;
}
.data-img{
  @apply float-none ;
  width:100%;
@@ -1407,6 +1367,7 @@
  opacity: 1;
  border-radius: 0.5rem 0.5rem 0px 0px;
}
.check-img{
  position: absolute;
  width: 3.3125rem;
@@ -1415,6 +1376,7 @@
  right: 57rem;
  z-index: 10;
}
.check-imga{
  position: absolute;
  width: 3.3125rem;
@@ -1423,23 +1385,32 @@
  right: 28.5rem;
  z-index: 10;
}
.vertical {
    width: 45px;
    height: 25px;
    background-color: #409EFF;
    top: 485px; /* 初始位置 */
    left: 899px; /* 水平居中 */
  top: 485px;
  /* 初始位置 */
  left: 899px;
  /* 水平居中 */
    transform: translateX(-50%);
    animation: move-vertical 6s infinite; /* 从上到下动画,持续6秒,无限循环 */
  animation: move-vertical 6s infinite;
  /* 从上到下动画,持续6秒,无限循环 */
}
@keyframes move-vertical {
    0% {
        top: 485px; /* 起始位置 */
    top: 485px;
    /* 起始位置 */
    }
    100% {
        top: calc(100% - 210px); /* 从上到下结束位置 */
    top: calc(100% - 210px);
    /* 从上到下结束位置 */
    }
}
.img-zkdlpl{
  margin-left: 20px;
  margin-top: 0px;
@@ -1453,6 +1424,7 @@
  overflow: hidden;
  position:relative
}
.img-car1{
  display: flex;
  background-image:url('/xiaoche.png');
@@ -1466,6 +1438,7 @@
  overflow: hidden;
  position:relative
}
.img-car4{
  display: flex;
  background-image:url('/xiaoche.png');
@@ -1479,15 +1452,22 @@
  overflow: hidden;
  position:relative
}
.table-container {
  display: flex;
  flex-wrap: nowrap; /* 防止换行 */
  justify-content: space-between; /* 根据需要调整子元素之间的间距 */
  flex-wrap: nowrap;
  /* 防止换行 */
  justify-content: space-between;
  /* 根据需要调整子元素之间的间距 */
}
.table-container > el-card {
  flex: 1; /* 使两个卡片平分可用空间 */
  margin-bottom: 10px; /* 可选,根据需要添加底部间距 */
  flex: 1;
  /* 使两个卡片平分可用空间 */
  margin-bottom: 10px;
  /* 可选,根据需要添加底部间距 */
}
#dotClass {
  display: flex;
  margin-left: 20px; 
@@ -1495,14 +1475,18 @@
  margin-top: 20px;
  margin-bottom: 10px;
}
.row-red-background {
  background-color: #CDAF95 !important;
}
.global-alert-bar {
  position: fixed;
  top: 0;
  left: 50%; /* 水平居中关键 */
  transform: translateX(-50%); /* 水平居中关键 */
  left: 50%;
  /* 水平居中关键 */
  transform: translateX(-50%);
  /* 水平居中关键 */
  padding: 12px 20px;
  background-color: #dbdbd7;
  box-shadow: 0 2px 10px rgba(0,0,0,0.2);
@@ -1510,16 +1494,21 @@
  justify-content: space-between;
  align-items: center;
  z-index: 9999;
  max-width: 80%; /* 防止小屏幕溢出 */
  min-width: 400px; /* 最小宽度保证 */
  max-width: 80%;
  /* 防止小屏幕溢出 */
  min-width: 400px;
  /* 最小宽度保证 */
}
/* 提示内容居中 */
.alert-content {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-grow: 1; /* 占据可用空间 */
  flex-grow: 1;
  /* 占据可用空间 */
}
/* 提示文字样式 */
.alert-text {
  margin-left: 8px;
@@ -1527,6 +1516,7 @@
  font-weight: bold;
  color: #0d0d0d;
}
/* 关闭按钮样式 */
.close-btn {
  background: none;
@@ -1535,15 +1525,22 @@
  cursor: pointer;
  margin-left: 20px;
}
/* 页面容器顶部内边距 */
#app-container {
  padding-top: 60px; /* 根据alert高度调整 */
  padding-top: 60px;
  /* 根据alert高度调整 */
}
.confirm-text {
  color: rgb(242, 121, 8);
  display: block; /* 强制换行 */
  text-align: center; /* 水平居中 */
  margin-top: 4px; /* 与上一行保持间距 */
  font-weight: 500; /* 加粗突出 */
  display: block;
  /* 强制换行 */
  text-align: center;
  /* 水平居中 */
  margin-top: 4px;
  /* 与上一行保持间距 */
  font-weight: 500;
  /* 加粗突出 */
}
</style>
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/vo/BigStorageVO.java
@@ -15,6 +15,8 @@
    private int deviceId;
    @ApiModelProperty(value = "格子号")
    private int slot;
    @ApiModelProperty(value = "数量")
    private int count;
    @ApiModelProperty(value = "玻璃id")
    private String glassId;
    @ApiModelProperty(value = "长边")
    private int length;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/controller/DamageController.java
@@ -5,11 +5,14 @@
import com.mes.damage.entity.Damage;
import com.mes.damage.entity.DamagePrint;
import com.mes.damage.entity.dto.DamageDTO;
import com.mes.damage.entity.request.DamageRequest;
import com.mes.damage.entity.vo.FlowCardDamageVO;
import com.mes.damage.entity.vo.GlassDamageVO;
import com.mes.damage.service.DamageService;
import com.mes.opctask.entity.LoadGlassDeviceTaskHistory;
import com.mes.utils.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@@ -28,6 +31,7 @@
@RestController
@RequestMapping("/damage")
@ResponseBody
@Slf4j
public class DamageController {
    @Autowired(required = true)
@@ -94,5 +98,44 @@
        return Result.build(200, "查询成功", "");
    }
    @ApiOperation("自动报工测试")
    @PostMapping("/submitReport")
    public Result submitReport() {
//        for (int i = 0; i < 50; i++) {
            Damage damage = new Damage();
            damage.setProcessId("NG25110702A004");
            damage.setWorkingProcedure("磨边");
            damage.setOrderNumber(2);
            damage.setTechnologyNumber(2);
            damageService.submitReport(damage);
//            log.info("当前循环次数{}", i);
//            try {
//                // 方式1:使用Thread.sleep(推荐,直观)
//                Thread.sleep(5000); // 10000毫秒 = 10秒
//                // 方式2:使用TimeUnit(语义更清晰,可选)
//                // TimeUnit.SECONDS.sleep(10);
//            } catch (InterruptedException e) {
//                // 捕获中断异常,恢复线程中断状态(避免后续逻辑异常)
//                Thread.currentThread().interrupt();
//                // 日志记录中断信息
//                // 可选:中断后是否退出循环(根据业务需求调整)
//                // break; // 中断则退出循环
//                // continue; // 中断则跳过当前等待,继续下一次循环
//            }
//        }
        return Result.build(200, "查询成功", "");
    }
    @ApiOperation("玻璃进度查询")
    @PostMapping("/queryProgress")
    public Result<List<GlassDamageVO>> queryProgress(@RequestBody DamageRequest damageRequest) {
        return Result.build(200, "查询成功", damageService.queryProgress(damageRequest));
    }
    @ApiOperation("流程卡进度查询")
    @PostMapping("/queryFlowCardIdProgress")
    public Result<List<FlowCardDamageVO>> queryFlowCardIdProgress(@RequestBody DamageRequest damageRequest) {
        return Result.build(200, "查询成功", damageService.queryFlowCardIdProgress(damageRequest));
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/request/DamageRequest.java
@@ -30,7 +30,7 @@
    @NotBlank(message = "玻璃ID不能为空")
    private String glassId;
    @ApiModelProperty("状态 8 破损 9 拿走")
    @ApiModelProperty("状态 1:未报工,3已报工,7已现补,8现补信息同步给erp")
    @NotNull(message = "状态不能为空")
    private int state;
@@ -43,4 +43,26 @@
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("备注")
    private Integer type;
    @ApiModelProperty("备注")
    private List<Integer> typeList;
    @NotBlank(message = "工序不能为空")
    private List<String> workingProcedureList;
    @ApiModelProperty("工程号")
    private String engineerId;
    @ApiModelProperty("流程卡")
    private List<GlassCondition> conditionList;
    @Data
    public static class GlassCondition {
        private String flowCardId;
        private Integer layer;
        private Integer glassType;
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/vo/FlowCardDamageVO.java
New file
@@ -0,0 +1,97 @@
package com.mes.damage.entity.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.sql.Timestamp;
/**
 * <p>
 *
 * </p>
 *
 * @author wu
 * @since 2024-06-25
 */
@ApiModel(description = "<p> </p>")
@Data
@EqualsAndHashCode(callSuper = false)
public class FlowCardDamageVO implements Serializable {
    /**
     * 工程
     */
    @ApiModelProperty(value = "工程", position = 1)
    private String engineerId;
    /**
     * 流程卡
     */
    @ApiModelProperty(value = "流程卡", position = 2)
    private String flowCardId;
    /**
     * 序号
     */
    @ApiModelProperty(value = "序号", position = 3)
    private Integer glassType;
    /**
     * 工艺确认序号
     */
    @ApiModelProperty(value = "层", position = 4)
    private Integer layer;
    /**
     * 膜系
     */
    @ApiModelProperty(value = "膜系", position = 5)
    private String filmsid;
    /**
     * 宽
     */
    @ApiModelProperty(value = "宽", position = 6)
    private Double width;
    /**
     * 高
     */
    @ApiModelProperty(value = "高", position = 7)
    private Double height;
    /**
     * 高
     */
    @ApiModelProperty(value = "高", position = 8)
    private Double thickness;
    /**
     * 总数量
     */
    @ApiModelProperty(value = "总数量", position = 9)
    private Integer totalQuantity;
    /**
     * 切割
     */
    @ApiModelProperty(value = "切割", position = 10)
    private Integer cutting;
    /**
     * 磨边
     */
    @ApiModelProperty(value = "磨边", position = 11)
    private Integer edging;
    /**
     * 钢化
     */
    @ApiModelProperty(value = "钢化", position = 12)
    private Integer temping;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/entity/vo/GlassDamageVO.java
New file
@@ -0,0 +1,105 @@
package com.mes.damage.entity.vo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.sql.Timestamp;
/**
 * <p>
 *
 * </p>
 *
 * @author wu
 * @since 2024-06-25
 */
@ApiModel(description = "<p> </p>")
@Data
@EqualsAndHashCode(callSuper = false)
public class GlassDamageVO implements Serializable {
    /**
     * 工序
     */
    @ApiModelProperty(value = "工序", position = 1)
    private String workingProcedure;
    /**
     * 玻璃id
     */
    @ApiModelProperty(value = "玻璃id", position = 2)
    private String glassId;
    /**
     * 生产时间
     */
    @ApiModelProperty(value = "生产时间", position = 3)
    private Timestamp damageTime;
    /**
     * 类型:0:报工 1:破损 2:拿走
     */
    @ApiModelProperty(value = "类型:0:报工 1:完工 8:破损", position = 4)
    private Integer type;
    /**
     * 状态:0:未报工 1:已报工
     */
    @ApiModelProperty(value = "状态:1:未报工 3:已报工", position = 5)
    private Integer status;
    /**
     * 流程卡
     */
    @ApiModelProperty(value = "流程卡", position = 6)
    private String flowCardId;
    /**
     * 序号
     */
    @ApiModelProperty(value = "序号", position = 7)
    private Integer glassType;
    /**
     * 工艺确认序号
     */
    @ApiModelProperty(value = "层", position = 8)
    private Integer layer;
    /**
     * 膜系
     */
    @ApiModelProperty(value = "膜系", position = 9)
    private String filmsid;
    /**
     * 宽
     */
    @ApiModelProperty(value = "宽", position = 10)
    private Double width;
    /**
     * 高
     */
    @ApiModelProperty(value = "高", position = 11)
    private Double height;
    /**
     * 高
     */
    @ApiModelProperty(value = "高", position = 12)
    private Double thickness;
    /**
     * 报工设备名称
     */
    @ApiModelProperty(value = "报工设备", position = 13)
    private String deviceName;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/mapper/DamageMapper.java
@@ -4,6 +4,9 @@
import com.github.yulichang.base.MPJBaseMapper;
import com.mes.damage.entity.Damage;
import com.mes.damage.entity.dto.DamageDTO;
import com.mes.damage.entity.request.DamageRequest;
import com.mes.damage.entity.vo.FlowCardDamageVO;
import com.mes.damage.entity.vo.GlassDamageVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -28,4 +31,8 @@
            @Param("status") int status,
            @Param("workingProcedure") String workingProcedure
    );
    List<GlassDamageVO> queryProgress(DamageRequest damageRequest);
    List<FlowCardDamageVO> queryFlowCardIdProgress(DamageRequest damageRequest);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/DamageService.java
@@ -5,10 +5,11 @@
import com.mes.damage.entity.Damage;
import com.mes.damage.entity.DamagePrint;
import com.mes.damage.entity.dto.DamageDTO;
import com.mes.opctask.entity.LoadGlassDeviceTaskHistory;
import com.mes.damage.entity.request.DamageRequest;
import com.mes.damage.entity.vo.FlowCardDamageVO;
import com.mes.damage.entity.vo.GlassDamageVO;
import com.mes.pp.entity.ReportingWork;
import com.mes.pp.entity.ReportingWorkDetail;
import com.mes.utils.Result;
import java.util.List;
@@ -71,4 +72,8 @@
    Boolean sendToERP(ReportingWork reportingWork, List<ReportingWorkDetail> reportingWorkDetails, Boolean type);
    List<Damage> queryUnTempByFlowCardId(String flowCardId);
    List<GlassDamageVO> queryProgress(DamageRequest damageRequest);
    List<FlowCardDamageVO> queryFlowCardIdProgress(DamageRequest damageRequest);
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/damage/service/impl/DamageServiceImpl.java
@@ -3,8 +3,6 @@
import cn.hutool.json.JSONArray;
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.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.yulichang.base.MPJBaseServiceImpl;
@@ -13,11 +11,13 @@
import com.mes.damage.entity.Damage;
import com.mes.damage.entity.DamagePrint;
import com.mes.damage.entity.dto.DamageDTO;
import com.mes.damage.entity.request.DamageRequest;
import com.mes.damage.entity.vo.FlowCardDamageVO;
import com.mes.damage.entity.vo.GlassDamageVO;
import com.mes.damage.mapper.DamageMapper;
import com.mes.damage.service.DamageService;
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.mapper.GlassInfoMapper;
import com.mes.opctask.entity.LoadGlassDeviceTaskHistory;
import com.mes.pp.entity.DamageDetails;
import com.mes.pp.entity.ReportingWork;
import com.mes.pp.entity.ReportingWorkDetail;
@@ -233,25 +233,6 @@
     */
    @Override
    public void insertDamage(Damage damage) {
        List<Damage> damage1 = null;
        if (Const.GLASS_STATE_DAMAGE.equals(damage.getType()) || Const.GLASS_STATE_TAKE.equals(damage.getType())) {
            damage1 = baseMapper.selectList(
                    new LambdaQueryWrapper<Damage>()
                            .in(Damage::getType, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
                            .notIn(Damage::getStatus, 7, 8)
                            .lt(Damage::getStatus, 7)
                            .eq(Damage::getGlassId, damage.getGlassId())
            );
        } else {
            damage1 = baseMapper.selectList(
                    new LambdaQueryWrapper<Damage>()
                            .notIn(Damage::getType, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
                            .eq(Damage::getLine, damage.getLine())
                            .eq(Damage::getWorkingProcedure, damage.getWorkingProcedure())
                            .eq(Damage::getGlassId, damage.getGlassId())
            );
        }
        if (damage1 == null || damage1.size() == 0) {
            LambdaQueryWrapper<GlassInfo> glassInfoSelectWrapper = new LambdaQueryWrapper<>();
            glassInfoSelectWrapper.eq(GlassInfo::getGlassId, damage.getGlassId());
            GlassInfo glassInfo = glassInfoMapper.selectOne(glassInfoSelectWrapper);
@@ -273,12 +254,37 @@
            if (damage.getType() == null) {
                damage.setType(1);
            }
        List<Damage> damage1 = null;
        if (Const.GLASS_STATE_DAMAGE.equals(damage.getType()) || Const.GLASS_STATE_TAKE.equals(damage.getType())) {
            damage1 = baseMapper.selectList(
                    new LambdaQueryWrapper<Damage>()
                            .in(Damage::getType, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
                            .notIn(Damage::getStatus, 7, 8)
                            .lt(Damage::getStatus, 7)
                            .eq(Damage::getGlassId, damage.getGlassId())
            );
        } else {
            damage1 = baseMapper.selectList(
                    new LambdaQueryWrapper<Damage>()
                            .notIn(Damage::getType, Const.GLASS_STATE_DAMAGE, Const.GLASS_STATE_TAKE)
                            .eq(Damage::getLine, damage.getLine())
                            .eq(Damage::getWorkingProcedure, damage.getWorkingProcedure())
                            .eq(Damage::getGlassId, damage.getGlassId())
            );
        }
        if (damage1 == null || damage1.size() == 0) {
            if (damage.getType() == 1 && submitReport(damage)) {
                damage.setStatus(3);
            } else {
                damage.setStatus(1);
            }
            baseMapper.insert(damage);
        } else {
            if (damage.getType() == 1) {
                //重复进入
                damage.setStatus(9);
                baseMapper.insert(damage);
            }
        }
    }
@@ -358,7 +364,7 @@
            // 目标系统的API URL
            String url1 = ERP_URL + "/reportingWork/mesReportingWork";
            String url1 = ERP_URL + "/reportingWork/mesReportingWorkRedis";
            String url2 = ERP_URL + "/reportingWork/mesSaveReportingWorkWorn";
            String url;
            if (type) {
@@ -393,7 +399,8 @@
                result.put("detail", detailsJsonArray);
            }
            JSONObject reportingWorkJson = new JSONObject(objectMapper.writeValueAsString(reportingWork));
            reportingWorkJson.put("reportingWorkTime", reportingWork.getReportingWorkTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
            reportingWorkJson.put("reportingWorkTime", reportingWork.getReportingWorkTime().format(formatter));
            // 将 JSON 对象和数组添加到结果对象中
            result.put("title", reportingWorkJson);
@@ -435,7 +442,7 @@
                int code = jsonResponse.getInt("code");
                String message = jsonResponse.getStr("data");
                log.info("报工情况:{},{}", code, message);
                if (code == 200 && message.equals("true")) {
                if (code == 200) {
                    return true;
                } else {
                    return false;
@@ -451,4 +458,14 @@
    public List<Damage> queryUnTempByFlowCardId(String flowCardId) {
        return baseMapper.queryUnTempByFlowCardId(flowCardId);
    }
    @Override
    public List<GlassDamageVO> queryProgress(DamageRequest damageRequest) {
        return baseMapper.queryProgress(damageRequest);
    }
    @Override
    public List<FlowCardDamageVO> queryFlowCardIdProgress(DamageRequest damageRequest) {
        return baseMapper.queryFlowCardIdProgress(damageRequest);
    }
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/pp/entity/ReportingWork.java
@@ -142,6 +142,7 @@
    /**
     * 报工时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime reportingWorkTime;
    /**
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java
@@ -1,6 +1,7 @@
package com.mes.temperingglass.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.mes.base.entity.BigStorageCageBaseInfo;
@@ -8,6 +9,7 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NonNull;
import java.io.Serializable;
@@ -46,6 +48,12 @@
    private Integer glassType;
    /**
     * 层
     */
    @ApiModelProperty(value = "层", position = 6)
    private Integer layer;
    /**
     * 钢化是否接受横放
     */
    @ApiModelProperty(value = "钢化是否接受横放", position = 10)
@@ -74,6 +82,12 @@
    @ApiModelProperty(value = "状态", position = 16)
    private Integer state;
    /**
     * 状态
     */
    @TableField(exist = false)
    @ApiModelProperty(value = "顺序", position = 17)
    private Integer sequence;
    @TableLogic
    private int deleted;
hangzhoumesParent/common/servicebase/src/main/resources/mapper/DamageMapper.xml
@@ -6,12 +6,14 @@
        SELECT glass_id,
               order_number,
               technology_number,
               working_procedure
               working_procedure,
               type
        FROM (
                 SELECT glass_id,
                        order_number,
                        technology_number,
                        working_procedure,
                        type,
                        ROW_NUMBER() OVER (
      PARTITION BY glass_id
      ORDER BY damage_time DESC
@@ -45,4 +47,136 @@
            </if>
        </where>
    </select>
    <select id="queryProgress" resultType="com.mes.damage.entity.vo.GlassDamageVO">
        SELECT
        t.glass_id,
        t.glass_type,
        t.flow_card_id,
        t.layer,
        t1.damage_time,
        t.width,
        t.height,
        t.thickness,
        t.filmsid,
        t1.working_procedure,
        t1.device_name,
        t1.type
        FROM glass_info t
        LEFT JOIN damage t1 ON t.glass_id = t1.glass_id
        WHERE
        <!-- 抽离多字段IN条件:使用参数替换固定值 -->
        (t.flow_card_id, t.layer, t.glass_type) IN
        <foreach collection="conditionList" item="item" open="(" separator="," close=")">
            (#{item.flowCardId}, #{item.layer}, #{item.glassType})
        </foreach>
        <!-- 抽离t1.type条件 -->
        AND t1.type IN
        <foreach collection="typeList" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
        AND t1.working_procedure IN
        <foreach collection="workingProcedureList" item="item" open="(" separator="," close=")">
            #{item}
        </foreach>
        <if test="glassId != null and glassId != ''">
            AND t1.glass_id = #{glassId}
        </if>
    </select>
    <select id="queryFlowCardIdProgress" resultType="com.mes.damage.entity.vo.FlowCardDamageVO">
        WITH glass_info_result AS (
        SELECT
        engineer_id,
        flow_card_id,
        layer,
        glass_type,
        thickness,
        filmsid,
        width,
        height,
        count(*) AS total_quantity
        FROM
        glass_info
        WHERE
        1=1
        <if test="flowCardId != null and flowCardId != ''">
            AND flow_card_id = #{flowCardId}
        </if>
        <if test="engineerId != null and engineerId != ''">
            AND engineer_id = #{engineerId}
        </if>
        <if test="glassId != null and glassId != ''">
            and (flow_card_id, layer, glass_type) IN (select flow_card_id, layer, glass_type from glass_info where
            glass_id=#{glassId} )
        </if>
        GROUP BY
        engineer_id,
        flow_card_id,
        layer,
        glass_type,
        thickness,
        filmsid,
        width,
        height
        ),
        damage_result AS (
        SELECT
        engineer_id,
        process_id,
        technology_number,
        order_number,
        working_procedure,
        type,
        count(*) AS report_quantity
        FROM
        damage
        WHERE
        1=1
        <if test="flowCardId != null and flowCardId != ''">
            AND process_id = #{flowCardId}
        </if>
        <if test="engineerId != null and engineerId != ''">
            AND engineer_id = #{engineerId}
        </if>
        <if test="glassId != null and glassId != ''">
            AND (process_id, technology_number, order_number) IN (select flow_card_id, layer, glass_type from glass_info
            where glass_id=#{glassId} )
        </if>
        GROUP BY
        engineer_id,
        process_id,
        technology_number,
        order_number,
        working_procedure,
        type
        ),
        final_result AS (
        SELECT
        t.*,
        sum( CASE WHEN t1.working_procedure = "切割" AND t1.type = 1 THEN report_quantity ELSE 0 END ) -
        sum( CASE WHEN (t1.working_procedure = "磨边" or t1.working_procedure="钢化" or t1.working_procedure="中空") AND
        t1.type = 8 THEN report_quantity ELSE 0 END ) AS cutting,
        sum( CASE WHEN t1.working_procedure = "磨边" AND t1.type = 1 THEN report_quantity ELSE 0 END ) -
        sum( CASE WHEN (t1.working_procedure="钢化" or t1.working_procedure="中空") AND t1.type = 8 THEN report_quantity
        ELSE 0 END ) AS edging,
        sum( CASE WHEN t1.working_procedure = "钢化" AND t1.type = 1 THEN report_quantity ELSE 0 END ) -
        sum( CASE WHEN (t1.working_procedure="中空") AND t1.type = 8 THEN report_quantity ELSE 0 END ) AS temping
        FROM
        glass_info_result t
        LEFT JOIN damage_result t1 ON t.engineer_id = t1.engineer_id
        AND t.flow_card_id = t1.process_id
        AND t.layer = t1.technology_number
        AND t.glass_type = t1.order_number
        GROUP BY
        t.engineer_id,
        t.flow_card_id,
        t.layer,
        t.glass_type,
        t.thickness,
        t.filmsid,
        t.width,
        t.height,
        t.total_quantity
        )
        select * from final_result;
    </select>
</mapper>
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -129,7 +129,7 @@
     */
    List<BigStorageCageDetails> queryRealGlassInfo(BigStorageQueryVO bigStorageQueryVO);
    Map<Integer, List<BigStorageVO>> querybigStorageCageDetail();
    Map<Object, Map<Integer, List<BigStorageVO>>> querybigStorageCageDetail();
    /**
     * 取消钢化任务
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -466,7 +466,7 @@
        if (temperingGlassInfoList.size() == 0) {
            MPJLambdaWrapper<GlassInfo> wrapper = JoinWrappers.lambda(GlassInfo.class)
                    .select("-1 as state,t.filmsid as films_id,t.glass_id,t.flow_card_id,t.glass_type,t.width,t.height" +
                    .select("-1 as state,t.filmsid as films_id,t.glass_id,t.flow_card_id,t.layer,t.glass_type,t.width,t.height" +
                            ",t.thickness,t.ishorizontal,t.tempering_layout_id,t.tempering_feed_sequence,t.x_coordinate,t.y_coordinate," +
                            "t.angle,t1.slot,t.engineer_id")
                    .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId)
@@ -525,9 +525,17 @@
    }
    @Override
    public Map<Integer, List<BigStorageVO>> querybigStorageCageDetail() {
    public Map<Object, Map<Integer, List<BigStorageVO>>> querybigStorageCageDetail() {
        List<BigStorageVO> bigStorageCages = baseMapper.querybigStorageCageDetail();
        return bigStorageCages.stream().collect(Collectors.groupingBy(item -> item.getDeviceId()));
        // 嵌套分组:先按slot分组,再按deviceId分组
        return bigStorageCages.stream()
                // 第一层分组:key=slot值,value=该slot下的所有BigStorageVO
                .collect(Collectors.groupingBy(
                        BigStorageVO::getDeviceId, // 第一层分组依据:slot
                        // 第二层分组:对第一层的value继续按deviceId分组
                        Collectors.groupingBy(BigStorageVO::getSlot)
                ));
    }
    @Override
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageNewTask.java
@@ -528,7 +528,7 @@
                List<TemperingLayoutDTO> temperingLayoutDTOS = bigStorageCageDetailsService.temperingIsAllByTemperingLayoutId(temperingEngineerId, temperingLayoutId);
                if (CollectionUtil.isNotEmpty(temperingLayoutDTOS)) {
                    List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class)
                            .select("-1 as state,t.filmsid as films_id,t.glass_id,t.flow_card_id,t.glass_type,t.width,t.height" +
                            .select("-1 as state,t.filmsid as films_id,t.glass_id,t.flow_card_id,t.layer,t.glass_type,t.width,t.height" +
                                    ",t.thickness,t.ishorizontal,t.tempering_layout_id,t.tempering_feed_sequence,t.x_coordinate,t.y_coordinate," +
                                    "t.angle,t1.slot,t.engineer_id")
                            .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId)
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -296,11 +296,11 @@
        FROM result
    </select>
    <select id="querybigStorageCageDetail" resultType="com.mes.base.entity.vo.BigStorageVO">
        select bsc.device_id, bsc.slot, count(bscd.glass_id) as count
        select bsc.device_id, bsc.slot,bscd.glass_id,if(bscd.width>bscd.height,bscd.width,bscd.height) as length
        from big_storage_cage bsc
            left join big_storage_cage_details bscd
        on bsc.slot = bscd.slot and bscd.state in (100, 102, 103, 104)
        group by bsc.device_id, bsc.slot
        group by bsc.device_id, bsc.slot,bscd.glass_id
        order by bsc.device_id, bsc.slot
    </select>
    <select id="queryNeedDispatch" resultType="com.mes.bigstorage.entity.BigStorageCageDetails">
hangzhoumesParent/moduleService/TemperingGlassModule/src/main/java/com/mes/job/PlcTemperingGlassTask.java
@@ -21,9 +21,8 @@
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
@@ -53,7 +52,7 @@
        try {
            waitingGlass = selectWaitingGlassByOpc();
            if (CollectionUtil.isNotEmpty(waitingGlass)) {
                jsonObject.append("waitingGlass", waitingGlass);
                jsonObject.append("waitingGlass", markSequence(waitingGlass));
            }
        } catch (Exception e) {
            log.info("钢化前获取异常:{}", e.getMessage());
@@ -66,9 +65,10 @@
                    if (i != 0) {
                        jsonName = jsonName + i;
                    }
                    jsonObject.append(jsonName, temperingGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>()
                    List<TemperingGlassInfo> intoGlassList = temperingGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>()
                            .eq(TemperingGlassInfo::getEngineerId, intoGlass.get(i).getEngineerId())
                            .eq(TemperingGlassInfo::getTemperingLayoutId, intoGlass.get(i).getTemperingLayoutId())));
                            .eq(TemperingGlassInfo::getTemperingLayoutId, intoGlass.get(i).getTemperingLayoutId()));
                    jsonObject.append(jsonName, markSequence(intoGlassList));
                }
            }
@@ -79,7 +79,7 @@
            //出炉后的玻璃
            List<TemperingGlassInfo> outGlass = temperingGlassInfoService.selectOutGlass();
            if (CollectionUtil.isNotEmpty(outGlass)) {
                jsonObject.append("outGlass", outGlass);
                jsonObject.append("outGlass", markSequence(outGlass));
            }
        } catch (Exception e) {
            log.info("钢化前获取异常:{}", e.getMessage());
@@ -181,4 +181,33 @@
            return tempList;
        }
    }
    public List<TemperingGlassInfo> markSequence(List<TemperingGlassInfo> tempGlass) {
        // 1. 步骤1:定义分组键提取规则(明确类型,避免泛型推导混乱)
        // 组合键:flowCardId + "_" + layer(保证flowCardId+layer唯一)
        Function<TemperingGlassInfo, String> keyExtractor = info ->
                info.getFlowCardId() + "_" + (info.getLayer() == null ? "" : info.getLayer());
        // 2. 步骤2:按组合键分组(完全依赖编译器自动推导泛型,无显式指定)
        // 使用LinkedHashMap保证分组顺序与原始数据一致
        Map<String, List<TemperingGlassInfo>> groupMap = tempGlass.stream()
                .collect(Collectors.groupingBy(
                        keyExtractor,          // 分组键
                        LinkedHashMap::new,    // 外层Map实现(有序)
                        Collectors.toList()    // 内层List收集器
                ));
        // 3. 步骤3:为每个分组内的元素标记sequence(从1开始)
        groupMap.forEach((key, glassList) -> {
            // 遍历分组内的列表,按顺序赋值sequence
            for (int i = 0; i < glassList.size(); i++) {
                glassList.get(i).setSequence(i + 1); // sequence从1开始
            }
        });
        // 5. 返回标记后的完整列表(原列表已通过引用修改)
        return tempGlass;
    }
}
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassOutRelationInfo.java
@@ -53,6 +53,12 @@
     * 是否强制
     */
    private Long formulaId;
    /**
     * 除膜膜系
     */
    private String filmRemove;
    /**
     * /*创建时间
     */
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/entity/request/HollowTaskRequest.java
@@ -21,6 +21,8 @@
    private int totalPairQuantity;
    @ApiModelProperty(value = "配方id")
    private Long formulaId;
    @ApiModelProperty(value = "除膜膜系")
    private String filmRemove;
}
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/HollowBigStorageCageDetailsService.java
@@ -30,7 +30,7 @@
    List<HollowBigStorageCageDetails> queryOutGlassList(String flowCardId, int cell, List<Integer> layerList);
    Map<Integer, List<BigStorageVO>> queryHollowbigStorageCageDetail();
    Map<Object, Map<Integer, List<BigStorageVO>>> queryHollowbigStorageCageDetail();
    /**
     * 取出每组玻璃占用笼子的格子并计算格子内的最大组序号
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowBigStorageCageDetailsServiceImpl.java
@@ -75,9 +75,16 @@
    }
    @Override
    public Map<Integer, List<BigStorageVO>> queryHollowbigStorageCageDetail() {
    public Map<Object, Map<Integer, List<BigStorageVO>>> queryHollowbigStorageCageDetail() {
        List<BigStorageVO> bigStorageCages = baseMapper.queryHollowbigStorageCageDetail();
        return bigStorageCages.stream().collect(Collectors.groupingBy(item -> item.getDeviceId()));
        return bigStorageCages.stream()
                // 第一层分组:key=slot值,value=该slot下的所有BigStorageVO
                .collect(Collectors.groupingBy(
                        BigStorageVO::getDeviceId, // 第一层分组依据:slot
                        // 第二层分组:对第一层的value继续按deviceId分组
                        Collectors.groupingBy(BigStorageVO::getSlot)
                ));
//        return bigStorageCages.stream().collect(Collectors.groupingBy(item -> item.getDeviceId()));
    }
    @Override
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java
@@ -389,6 +389,7 @@
            info.setState(Const.HOLLOW_FLOW_CARD_NEW);
            info.setTotalPairQuantity(request.getTotalPairQuantity());
            info.setFormulaId(request.getFormulaId());
            info.setFilmRemove(request.getFilmRemove());
            this.save(info);
            // 查询出需要出玻璃的队列
            List<Integer> layerList = new ArrayList<>();
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassRelationInfoServiceImpl.java
@@ -464,6 +464,9 @@
        });
        List<LackDetailsDTO> detailsDTOS = baseMapper.queryLackByFlowCardByERP(processCardReports);
        List<Damage> damages = damageService.queryUnTempByFlowCardId(flowCardId);
        damages = damages.stream()
                .filter(damage -> damage.getType() != 8) // 核心:排除type=8的元素
                .collect(Collectors.toList());
// 1. 按(orderNumber+layer)分组,同时缓存DTO的其他字段作为模板
        Map<String, List<Damage>> damageMap = new HashMap<>();
        Map<String, LackDetailsDTO> dtoTemplateMap = new HashMap<>(); // 存储分组对应的DTO模板
hangzhoumesParent/moduleService/hollowGlassModule/src/main/java/com/mes/job/PushMessageToIndex.java
@@ -154,160 +154,160 @@
    public void queryDataSource1(JSONObject jsonObject) throws Exception {
        S7DataZKDLPOne s7DataZKDLPOne = s7SerializerZKDLPOne.read(S7DataZKDLPOne.class);
        S7DataZKDLPTwo s7DataZKDLPTwo = s7SerializerZKDLPTwo.read(S7DataZKDLPTwo.class);
        S7DataZKExtra s7DataZKExtra = s7SerializerZKQ2.read(S7DataZKExtra.class);
//        S7DataZKDLPOne s7DataZKDLPOne = s7SerializerZKDLPOne.read(S7DataZKDLPOne.class);
//        S7DataZKDLPTwo s7DataZKDLPTwo = s7SerializerZKDLPTwo.read(S7DataZKDLPTwo.class);
//        S7DataZKExtra s7DataZKExtra = s7SerializerZKQ2.read(S7DataZKExtra.class);
        List<Double> carPostion = new ArrayList<>();
        carPostion.add(0.25);
        carPostion.add(0.5);
        jsonObject.append("carPostion", carPostion);
        //界面展示笼子信息
        jsonObject.append("bigStorageCageInfos", hollowBigStorageCageDetailsService.queryHollowbigStorageCageDetail());
        try {
            //进片任务数据
            List<BigStorageTaskVO> inTaskList = new ArrayList();
            String fromOpcUa = s7DataZKDLPOne.getFrom1().toString();
            for (int i = 0; i < 6; i++) {
                String requestWord = "";
                String stateWord = "";
                String targetSlotWord = "";
                switch (i) {
                    case 0:
                        requestWord = s7DataZKDLPOne.getId1();
                        stateWord = s7DataZKDLPOne.getState1().toString();
                        targetSlotWord = s7DataZKDLPOne.getTo1().toString();
                        break;
                    case 1:
                        requestWord = s7DataZKDLPOne.getId2();
                        stateWord = s7DataZKDLPOne.getState2().toString();
                        targetSlotWord = s7DataZKDLPOne.getTo2().toString();
                        break;
                    case 2:
                        requestWord = s7DataZKDLPOne.getId3();
                        stateWord = s7DataZKDLPOne.getState3().toString();
                        targetSlotWord = s7DataZKDLPOne.getTo3().toString();
                        break;
                    case 3:
                        requestWord = s7DataZKDLPOne.getId4();
                        stateWord = s7DataZKDLPOne.getState4().toString();
                        targetSlotWord = s7DataZKDLPOne.getTo4().toString();
                        break;
                    case 4:
                        requestWord = s7DataZKDLPOne.getId5();
                        stateWord = s7DataZKDLPOne.getState5().toString();
                        targetSlotWord = s7DataZKDLPOne.getTo5().toString();
                        break;
                    case 5:
                        requestWord = s7DataZKDLPOne.getId6();
                        stateWord = s7DataZKDLPOne.getState6().toString();
                        targetSlotWord = s7DataZKDLPOne.getTo6().toString();
                        break;
                }
                if (StringUtils.isNotEmpty(requestWord)) {
                    BigStorageTaskVO task = new BigStorageTaskVO();
                    task.setGlassId(requestWord);
                    int isExistCount = hollowBigStorageCageDetailsService.count(new LambdaQueryWrapper<HollowBigStorageCageDetails>().in(HollowBigStorageCageDetails::getGlassId, task.getGlassId())
                            .in(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL));
                    if (isExistCount > 0) {
                        task.setIsSame(1);
                    } else {
                        task.setIsSame(0);
                    }
                    task.setStartSlot(Integer.parseInt(fromOpcUa));
                    task.setTargetSlot(Integer.parseInt(targetSlotWord));
                    task.setTaskState(Integer.parseInt(stateWord));
                    inTaskList.add(task);
                    continue;
                }
            }
            jsonObject.append("bigStorageCageDetailsFeedTask", inTaskList);
        } catch (Exception e) {
            //todo:不做任务处理
        }
        try {
            //进片联机
            Boolean inkageEntity = s7DataZKDLPOne.getMesControl();
            jsonObject.append("inkageEntity", inkageEntity);
            //进片请求
            Integer requestEntity = s7DataZKDLPOne.getRequestMes();
            jsonObject.append("requestEntity", requestEntity);
            //启动命令
            Integer mesReplyEntity = s7DataZKDLPOne.getMesReply();
            jsonObject.append("mesReplyEntity", mesReplyEntity);
            //出片联机
            Boolean outInkageEntity = s7DataZKDLPTwo.getMesControl();
            jsonObject.append("outInkageEntity", outInkageEntity);
            //出片请求
            Integer outRequestEntity = s7DataZKDLPTwo.getRequestMes();
            jsonObject.append("outRequestEntity", outRequestEntity);
            //930空闲信号
            jsonObject.append("freeOneRequestEntity", CMJ1ModbusTcp.readUInt16(42027 - offset));
            //931空闲信号
            jsonObject.append("freeTwoRequestEntity", s7DataZKExtra.getIsFree());
            //932空闲信号
            jsonObject.append("freeThreeRequestEntity", s7DataZKExtra.getIsFree());
        } catch (Exception e) {
            //todo:不做任务处理
        }
        //出片任务数据
        List<BigStorageCageTask> outTaskList = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            BigStorageCageTask bigStorageCageTask = new BigStorageCageTask();
            String glassId = "";
            Integer startSlot = 0;
            Integer targetSlot = 0;
            Integer taskState = 0;
            switch (i) {
                case 0:
                    glassId = s7DataZKDLPTwo.getId1();
                    startSlot = s7DataZKDLPTwo.getFrom1();
                    targetSlot = s7DataZKDLPTwo.getTo1();
                    taskState = s7DataZKDLPTwo.getState1();
                    ;
                    break;
                case 1:
                    glassId = s7DataZKDLPTwo.getId2();
                    startSlot = s7DataZKDLPTwo.getFrom2();
                    targetSlot = s7DataZKDLPTwo.getTo2();
                    taskState = s7DataZKDLPTwo.getState2();
                    break;
                case 2:
                    glassId = s7DataZKDLPTwo.getId3();
                    startSlot = s7DataZKDLPTwo.getFrom3();
                    targetSlot = s7DataZKDLPTwo.getTo3();
                    taskState = s7DataZKDLPTwo.getState3();
                    break;
                case 3:
                    glassId = s7DataZKDLPTwo.getId4();
                    startSlot = s7DataZKDLPTwo.getFrom4();
                    targetSlot = s7DataZKDLPTwo.getTo4();
                    taskState = s7DataZKDLPTwo.getState4();
                    break;
                case 4:
                    glassId = s7DataZKDLPTwo.getId5();
                    startSlot = s7DataZKDLPTwo.getFrom5();
                    targetSlot = s7DataZKDLPTwo.getTo5();
                    taskState = s7DataZKDLPTwo.getState5();
                    break;
                case 5:
                    glassId = s7DataZKDLPTwo.getId6();
                    startSlot = s7DataZKDLPTwo.getFrom6();
                    targetSlot = s7DataZKDLPTwo.getTo6();
                    taskState = s7DataZKDLPTwo.getState6();
                    break;
            }
            if (StringUtils.isNotEmpty(glassId)) {
                bigStorageCageTask.setGlassId(glassId);
                bigStorageCageTask.setStartSlot(startSlot);
                bigStorageCageTask.setTargetSlot(targetSlot);
                bigStorageCageTask.setTaskState(taskState);
                outTaskList.add(bigStorageCageTask);
            }
        }
        jsonObject.append("bigStorageCageDetailsOutTask", outTaskList);
        jsonObject.append("HollowAllFlowCard", hollowGlassRelationInfoService.queryHollowAllFlowCard(new HollowBigStorageDetailsQueryVO()));
//        try {
//            //进片任务数据
//            List<BigStorageTaskVO> inTaskList = new ArrayList();
//            String fromOpcUa = s7DataZKDLPOne.getFrom1().toString();
//            for (int i = 0; i < 6; i++) {
//                String requestWord = "";
//                String stateWord = "";
//                String targetSlotWord = "";
//                switch (i) {
//                    case 0:
//                        requestWord = s7DataZKDLPOne.getId1();
//                        stateWord = s7DataZKDLPOne.getState1().toString();
//                        targetSlotWord = s7DataZKDLPOne.getTo1().toString();
//                        break;
//                    case 1:
//                        requestWord = s7DataZKDLPOne.getId2();
//                        stateWord = s7DataZKDLPOne.getState2().toString();
//                        targetSlotWord = s7DataZKDLPOne.getTo2().toString();
//                        break;
//                    case 2:
//                        requestWord = s7DataZKDLPOne.getId3();
//                        stateWord = s7DataZKDLPOne.getState3().toString();
//                        targetSlotWord = s7DataZKDLPOne.getTo3().toString();
//                        break;
//                    case 3:
//                        requestWord = s7DataZKDLPOne.getId4();
//                        stateWord = s7DataZKDLPOne.getState4().toString();
//                        targetSlotWord = s7DataZKDLPOne.getTo4().toString();
//                        break;
//                    case 4:
//                        requestWord = s7DataZKDLPOne.getId5();
//                        stateWord = s7DataZKDLPOne.getState5().toString();
//                        targetSlotWord = s7DataZKDLPOne.getTo5().toString();
//                        break;
//                    case 5:
//                        requestWord = s7DataZKDLPOne.getId6();
//                        stateWord = s7DataZKDLPOne.getState6().toString();
//                        targetSlotWord = s7DataZKDLPOne.getTo6().toString();
//                        break;
//                }
//                if (StringUtils.isNotEmpty(requestWord)) {
//                    BigStorageTaskVO task = new BigStorageTaskVO();
//                    task.setGlassId(requestWord);
//                    int isExistCount = hollowBigStorageCageDetailsService.count(new LambdaQueryWrapper<HollowBigStorageCageDetails>().in(HollowBigStorageCageDetails::getGlassId, task.getGlassId())
//                            .in(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL));
//                    if (isExistCount > 0) {
//                        task.setIsSame(1);
//                    } else {
//                        task.setIsSame(0);
//                    }
//                    task.setStartSlot(Integer.parseInt(fromOpcUa));
//                    task.setTargetSlot(Integer.parseInt(targetSlotWord));
//                    task.setTaskState(Integer.parseInt(stateWord));
//                    inTaskList.add(task);
//                    continue;
//                }
//            }
//            jsonObject.append("bigStorageCageDetailsFeedTask", inTaskList);
//        } catch (Exception e) {
//            //todo:不做任务处理
//        }
//        try {
//            //进片联机
//            Boolean inkageEntity = s7DataZKDLPOne.getMesControl();
//            jsonObject.append("inkageEntity", inkageEntity);
//            //进片请求
//            Integer requestEntity = s7DataZKDLPOne.getRequestMes();
//            jsonObject.append("requestEntity", requestEntity);
//            //启动命令
//            Integer mesReplyEntity = s7DataZKDLPOne.getMesReply();
//            jsonObject.append("mesReplyEntity", mesReplyEntity);
//            //出片联机
//            Boolean outInkageEntity = s7DataZKDLPTwo.getMesControl();
//            jsonObject.append("outInkageEntity", outInkageEntity);
//            //出片请求
//            Integer outRequestEntity = s7DataZKDLPTwo.getRequestMes();
//            jsonObject.append("outRequestEntity", outRequestEntity);
//            //930空闲信号
//            jsonObject.append("freeOneRequestEntity", CMJ1ModbusTcp.readUInt16(42027 - offset));
//            //931空闲信号
//            jsonObject.append("freeTwoRequestEntity", s7DataZKExtra.getIsFree());
//            //932空闲信号
//            jsonObject.append("freeThreeRequestEntity", s7DataZKExtra.getIsFree());
//        } catch (Exception e) {
//            //todo:不做任务处理
//        }
//
//        //出片任务数据
//        List<BigStorageCageTask> outTaskList = new ArrayList<>();
//        for (int i = 0; i < 6; i++) {
//
//            BigStorageCageTask bigStorageCageTask = new BigStorageCageTask();
//            String glassId = "";
//            Integer startSlot = 0;
//            Integer targetSlot = 0;
//            Integer taskState = 0;
//            switch (i) {
//                case 0:
//                    glassId = s7DataZKDLPTwo.getId1();
//                    startSlot = s7DataZKDLPTwo.getFrom1();
//                    targetSlot = s7DataZKDLPTwo.getTo1();
//                    taskState = s7DataZKDLPTwo.getState1();
//                    ;
//                    break;
//                case 1:
//                    glassId = s7DataZKDLPTwo.getId2();
//                    startSlot = s7DataZKDLPTwo.getFrom2();
//                    targetSlot = s7DataZKDLPTwo.getTo2();
//                    taskState = s7DataZKDLPTwo.getState2();
//                    break;
//                case 2:
//                    glassId = s7DataZKDLPTwo.getId3();
//                    startSlot = s7DataZKDLPTwo.getFrom3();
//                    targetSlot = s7DataZKDLPTwo.getTo3();
//                    taskState = s7DataZKDLPTwo.getState3();
//                    break;
//                case 3:
//                    glassId = s7DataZKDLPTwo.getId4();
//                    startSlot = s7DataZKDLPTwo.getFrom4();
//                    targetSlot = s7DataZKDLPTwo.getTo4();
//                    taskState = s7DataZKDLPTwo.getState4();
//                    break;
//                case 4:
//                    glassId = s7DataZKDLPTwo.getId5();
//                    startSlot = s7DataZKDLPTwo.getFrom5();
//                    targetSlot = s7DataZKDLPTwo.getTo5();
//                    taskState = s7DataZKDLPTwo.getState5();
//                    break;
//                case 5:
//                    glassId = s7DataZKDLPTwo.getId6();
//                    startSlot = s7DataZKDLPTwo.getFrom6();
//                    targetSlot = s7DataZKDLPTwo.getTo6();
//                    taskState = s7DataZKDLPTwo.getState6();
//                    break;
//            }
//            if (StringUtils.isNotEmpty(glassId)) {
//                bigStorageCageTask.setGlassId(glassId);
//                bigStorageCageTask.setStartSlot(startSlot);
//                bigStorageCageTask.setTargetSlot(targetSlot);
//                bigStorageCageTask.setTaskState(taskState);
//                outTaskList.add(bigStorageCageTask);
//            }
//        }
//        jsonObject.append("bigStorageCageDetailsOutTask", outTaskList);
        //调度开关
        boolean dispatchHollowSwitch = false;
hangzhoumesParent/moduleService/hollowGlassModule/src/main/resources/mapper/HollowBigStorageCageDetailsMapper.xml
@@ -212,11 +212,14 @@
        </if>
    </select>
    <select id="queryHollowbigStorageCageDetail" resultType="com.mes.base.entity.vo.BigStorageVO">
        select hbsc.device_id, hbsc.slot, count(hbscd.glass_id) as count
        select hbsc.device_id,
               hbsc.slot,
               hbscd.glass_id,
               if(hbscd.width > hbscd.height, hbscd.width, hbscd.height) as length
        from hollow_big_storage_cage hbsc
                 left join hollow_big_storage_cage_details hbscd
                           on hbsc.slot = hbscd.slot and hbscd.state in (100, 102, 103, 104)
        group by hbsc.device_id, hbsc.slot
        group by hbsc.device_id, hbsc.slot, hbscd.glass_id
        order by hbsc.device_id, hbsc.slot
    </select>
    <select id="querySlotMaxSequence" resultType="com.mes.hollow.entity.HollowBigStorageCageDetails">