1、fixbug:缺片详情临时解决 将所有缺片信息返回
2、新增膜系 状态:避免同一块玻璃占用完相同尺寸关系表
3、中空界面注释开始暂停按钮
4、领取/强制执行任务增加限制,必须在本条线没有任务的情况下可以领取
14个文件已修改
556 ■■■■■ 已修改文件
UI-Project/src/lang/zh.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/StockBasicData/stockBasicyiwu.vue 270 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/hollow/hollowequipment.vue 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassOutRelationInfoController.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassRelationInfoController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassRelationInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/entity/dto/FlowCardGlassInfoDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/HollowGlassRelationInfoService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassRelationInfoServiceImpl.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollowqueue/entity/HollowGlassQueueInfo.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageHollowTask.java 159 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/howllowGlassModule/src/main/resources/mapper/HollowBigStorageCageDetailsMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/lang/zh.js
@@ -654,6 +654,7 @@
        order: '出片顺序',
        thickness: '厚度',
        coatingtypes: '膜系',
        layer: '层数',
        height: '长',
        width: '宽',
        state: '状态',
UI-Project/src/views/StockBasicData/stockBasicyiwu.vue
@@ -1,28 +1,28 @@
<script setup>
import {onBeforeUnmount, onMounted, onUnmounted, reactive, ref} from "vue";
import {useRouter} from "vue-router"
import {host, WebSocketHost} from '@/utils/constants'
import request from "@/utils/request"
import {closeWebSocket, initializeWebSocket} from '@/utils/WebSocketService';
import { onBeforeUnmount, onMounted, onUnmounted, reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
import { host, WebSocketHost } from '@/utils/constants'
import request from '@/utils/request'
import { closeWebSocket, initializeWebSocket } from '@/utils/WebSocketService'
// import { ref } from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
//  import LanguageMixin from './lang/LanguageMixin'
import {useI18n} from 'vue-i18n'
import { useI18n } from 'vue-i18n'
const router = useRouter()
const adda = ref(false)
const {t} = useI18n()
const { t } = useI18n()
let language = ref(localStorage.getItem('lang') || 'zh')
const tableData = ref([])
const slot = ref('')
const requestData = {
  line: 2001
};
  line: 1,
}
const timeRange = ref([])
const selectValuesa = reactive([]);
const selectValuesa = reactive([])
// request.post("/cacheGlass/taskCache/selectEdgTask",{
//   ...requestData,
//   ...requestData,
// }).then((res) => {
//           if (res.code == 200) {
@@ -41,168 +41,224 @@
  let celllist = []
  let stateList = []
  if (selectValuesa[0] != null && selectValuesa[0] != 'undefined') {
    if (selectValuesa[0] != "") {
      celllist = [selectValuesa[0]];
    if (selectValuesa[0] != '') {
      celllist = [selectValuesa[0]]
    }
  }
  if (selectValuesa[1] != null && selectValuesa[1] != 'undefined') {
    if (selectValuesa[1] != "") {
      stateList = [selectValuesa[1]];
    if (selectValuesa[1] != '') {
      stateList = [selectValuesa[1]]
    }
  }
  console.log(timeRange.value[0], timeRange.value[1]);
  const response = await request.post("/cacheGlass/edgGlassTaskInfo/setEdgGlassInfoRequest", {
    cellList: celllist,
    stateList: stateList,
    beginDate: timeRange.value[0],
    endDate: timeRange.value[1],
  })
  console.log(timeRange.value[0], timeRange.value[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);
    ElMessage.success(response.message)
  } else {
    ElMessage.error(response.message);
    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',
        }
    );
      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: '磨边',
      })
      // 用户点击了“是”,现在调用删除接口
      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);
        ElMessage.success(response.message)
      } else {
        // 删除失败,您可以处理错误或显示错误信息给用户
        ElMessage.error(response.msg);
        // alert('删除失败:' + deleteResponse.message);
        // 删除失败,您可以处理错误或显示错误信息给用户
        ElMessage.error(response.msg)
        // alert('删除失败:' + deleteResponse.message);
      }
    }
  } catch (error) {
    // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等
    console.error('发生错误:', error);
    // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等
    console.error('发生错误:', 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',
        }
    );
      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: '磨边',
      })
      // 用户点击了“是”,现在调用删除接口
      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);
        ElMessage.success(response.message)
      } else {
        // 删除失败,您可以处理错误或显示错误信息给用户
        ElMessage.error(response.msg);
        // alert('删除失败:' + deleteResponse.message);
        // 删除失败,您可以处理错误或显示错误信息给用户
        ElMessage.error(response.msg)
        // alert('删除失败:' + deleteResponse.message);
      }
    }
  } catch (error) {
    // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等
    console.error('发生错误:', error);
    // 处理可能出现的错误,比如 ElMessageBox 抛出的异常等
    console.error('发生错误:', error)
  }
};
let socket = null;
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/edgTasks`;
}
let socket = null
const socketUrl = `ws://${WebSocketHost}:${host}/api/cacheGlass/api/talk/edgTasks`
// 定义消息处理函数,更新 receivedData 变量
const handleMessage = (data) => {
  // 更新 tableData 的数据
  tableData.value = data.edgTasks[0]
};
}
onMounted(() => {
  socket = initializeWebSocket(socketUrl, handleMessage);
});
  socket = initializeWebSocket(socketUrl, handleMessage)
})
onUnmounted(() => {
  if (socket) {
    closeWebSocket(socket);
    closeWebSocket(socket)
  }
});
})
onBeforeUnmount(() => {
  console.log("关闭了")
  closeWebSocket();
});
  console.log('关闭了')
  closeWebSocket()
})
</script>
<template>
  <div style="height: 500px;">
    <div>
      <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;" v-loading="loading">
        <el-select v-model="selectValuesa[0]" filterable :placeholder="$t('workOrder.cway')" clearable
      <el-card style="flex: 1;margin-left: 10px;margin-top: 20px;"
               v-loading="loading">
        <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="2001"></el-option>
          <el-option :label="$t('workOrder.edgingtwo')" value="2002"></el-option>
          <el-option :label="$t('workOrder.edgingone')"
                     value="1"></el-option>
          <el-option :label="$t('workOrder.edgingtwo')"
                     value="2"></el-option>
        </el-select>
        <el-select v-model="selectValuesa[1]" filterable :placeholder="$t('workOrder.cstate')" clearable
        <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-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-bottom: 10px;">{{ $t('workOrder.time') }}</span>
        <el-date-picker v-model="timeRange" type="datetimerange" range-separator="至"
                        :start-placeholder="$t('reportmanage.starttime')" style="margin-left: 20px;margin-bottom: 10px;"
        <span class="demonstration"
              style="margin-left: 20px;margin-bottom: 10px;">{{ $t('workOrder.time') }}</span>
        <el-date-picker v-model="timeRange"
                        type="datetimerange"
                        range-separator="至"
                        :start-placeholder="$t('reportmanage.starttime')"
                        style="margin-left: 20px;margin-bottom: 10px;"
                        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()">{{
        <el-button type="primary"
                   style="margin-left: 10px;margin-bottom: 10px;"
                   @click="setEdgGlassInfoRequest()">{{
            $t('reportmanage.inquire')
          }}
        </el-button>
        <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;">
          <el-table height="750" ref="table"
          <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="glassType" 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="status" :label="$t('workOrder.status')" align="center" width="200">
                    :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="glassType"
                             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="status"
                             :label="$t('workOrder.status')"
                             align="center"
                             width="200">
              <template #default="scope">
                {{ scope.row.status == 0 ? "未磨边" : scope.row.status == 1 ? "磨边中" : "已磨边" }}
              </template>
            </el-table-column>
            <el-table-column fixed="right" :label="$t('workOrder.operate')" align="center" width="200">
            <el-table-column fixed="right"
                             :label="$t('workOrder.operate')"
                             align="center"
                             width="200">
              <template #default="scope">
                <el-button size="mini" type="text" plain @click="open(scope.row)">{{
                <el-button size="mini"
                           type="text"
                           plain
                           @click="open(scope.row)">{{
                    $t('workOrder.breakage')
                  }}
                </el-button>
                <el-button size="mini" type="text" plain @click="opena(scope.row)">{{
                <el-button size="mini"
                           type="text"
                           plain
                           @click="opena(scope.row)">{{
                    $t('workOrder.takeout')
                  }}
                </el-button>
UI-Project/src/views/hollow/hollowequipment.vue
@@ -5,13 +5,13 @@
        <el-button id="searchButton" type="success" @click="handlezhiban">
          {{ $t('hellow.createtask') }}
        </el-button>
        <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinda">
          {{ $t('hellow.starttask') }}
        </el-button>
        <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBindb">{{
            $t('hellow.stoptask')
          }}
        </el-button>
<!--        <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBinda">-->
<!--          {{ $t('hellow.starttask') }}-->
<!--        </el-button>-->
<!--        <el-button style="margin-left: 20px;" id="searchButton" type="success" @click="handleBindb">{{-->
<!--            $t('hellow.stoptask')-->
<!--          }}-->
<!--        </el-button>-->
    <el-switch style="margin-top: 7px;margin-left: 10px;" v-model="ganghua" class="mb-2" :inactive-text="$t('hellow.schedulingswitch')" @change="handleChange" />
  </div>
      <div style="margin-bottom: -5px;margin-left: 5px;">
@@ -46,10 +46,15 @@
              :header-cell-style="{ background: '#F2F3F5', color: '#1D2129' }">
      <el-table-column prop="sequence" :label="$t('hellow.order')" align="center"/>
      <el-table-column prop="thickness" :label="$t('hellow.thickness')" align="center"/>
      <el-table-column prop="layer" :label="$t('hellow.coatingtypes')" align="center"/>
      <el-table-column prop="layer" :label="$t('hellow.layer')" align="center"/>
      <el-table-column prop="filmsId" :label="$t('hellow.coatingtypes')" align="center"/>
      <el-table-column prop="height" :label="$t('hellow.height')" align="center"/>
      <el-table-column prop="width" :label="$t('hellow.width')" align="center"/>
      <el-table-column prop="state" :label="$t('hellow.state')" align="center"/>
      <el-table-column prop="state" :label="$t('hellow.state')" align="center">
        <template #default="scope">
          {{ scope.row.state == -1 ? "等待出片" : "出片完成" }}
        </template>
      </el-table-column>
    </el-table>
      <div style="display: flex;margin-left: 500px;margin-top: 10px;">
        <!-- <div style="float: center;"> -->
@@ -358,7 +363,8 @@
    var url="/hollowGlass/hollowGlassRelationInfo/queryLackByFlowCard?flowCardId="+flowCardId + "&layer=" + layer;
    const response = await request.post(url)
    if (response.code == 200) {
      tableDatac.value = response.data[1];
      // tableDatac.value = response.data[1];
      tableDatac.value = response.data;
      ElMessage.success(response.message);
    } else {
      ElMessage.error(response.message);
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -289,4 +289,14 @@
    public static final Integer HOLLOW_FLOW_CARD_PAUSE = 2;
    public static final Integer HOLLOW_FLOW_CARD_SUCCESS = 3;
    /**
     * 中空大理片笼出片状态I
     * 0 未进笼
     * 1 占用
     * 2 进笼完成
     */
    public static final Integer HOLLOW_RELATION_NEW = 0;
    public static final Integer HOLLOW_RELATION_OCCUPY = 1;
    public static final Integer HOLLOW_RELATION_SUCCESS = 2;
}
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassOutRelationInfoController.java
@@ -27,18 +27,30 @@
    @ApiOperation("领取任务")
    @PostMapping("/receiveTask")
    public Result<HollowGlassOutRelationInfo> receiveTask(String flowCardId, int cell, int totalPairQuantity) {
        return Result.success(hollowGlassOutRelationInfoService.receiveTask(flowCardId, cell, totalPairQuantity));
        HollowGlassOutRelationInfo hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService.receiveTask(flowCardId, cell, totalPairQuantity);
        if (null == hollowGlassOutRelationInfo) {
            return Result.error(500, "有正在执行的任务,请先确保任务完成后,再次领取任务");
        } else {
            return Result.success(hollowGlassOutRelationInfo);
        }
    }
    @ApiOperation("强制出片")
    @PostMapping("/forceOutGlass")
    public Result<HollowGlassOutRelationInfo> forceOutGlass(String flowCardId, int cell, int totalPairQuantity) {
        return Result.success(hollowGlassOutRelationInfoService.forceOutGlass(flowCardId, cell, totalPairQuantity));
        HollowGlassOutRelationInfo hollowGlassOutRelationInfo = hollowGlassOutRelationInfoService.forceOutGlass(flowCardId, cell, totalPairQuantity);
        if (null == hollowGlassOutRelationInfo) {
            return Result.error(500, "有正在执行的任务,请先确保任务完成后,再次强制执行任务");
        } else {
            return Result.success(hollowGlassOutRelationInfo);
        }
    }
    @ApiOperation("是否调度开关")
    @PostMapping("/dispatchHollowSwitch")
    public Result<Boolean> dispatchHollowSwitch(Boolean flag) {
        return Result.build(200, "修改成功",hollowGlassOutRelationInfoService.dispatchHollowSwitch(flag));
        return Result.build(200, "修改成功", hollowGlassOutRelationInfoService.dispatchHollowSwitch(flag));
    }
}
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/controller/HollowGlassRelationInfoController.java
@@ -34,10 +34,17 @@
        return Result.success(bigStorageCageDetails);
    }
    //    @ApiOperation("查询指定流程卡及层数的缺片详情")
//    @PostMapping("/queryLackByFlowCard")
//    public Result<Map<Integer, List<LackDetailsDTO>> > queryLackByFlowCard(String flowCardId) {
//        Map<Integer, List<LackDetailsDTO>>  lackDetailsList = hollowGlassRelationInfoService.queryLackByFlowCard(flowCardId);
//        return Result.success(lackDetailsList);
//    }
//
    @ApiOperation("查询指定流程卡及层数的缺片详情")
    @PostMapping("/queryLackByFlowCard")
    public Result<Map<Integer, List<LackDetailsDTO>> > queryLackByFlowCard(String flowCardId) {
        Map<Integer, List<LackDetailsDTO>>  lackDetailsList = hollowGlassRelationInfoService.queryLackByFlowCard(flowCardId);
    public Result<List<LackDetailsDTO>> queryLackByFlowCard(String flowCardId) {
        List<LackDetailsDTO> lackDetailsList = hollowGlassRelationInfoService.queryLackByFlowCard(flowCardId);
        return Result.success(lackDetailsList);
    }
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/entity/HollowGlassRelationInfo.java
@@ -85,6 +85,10 @@
     * /*中空总次序
     */
    private Integer orderSort;
    /**
     * /*状态:表示配对的玻璃是否进笼,0未进笼 1已占用 2进笼完成
     */
    private Integer state;
}
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/entity/dto/FlowCardGlassInfoDTO.java
@@ -23,6 +23,10 @@
     */
    private String filmsId;
    /**
     * 厚度
     */
    private int thickness;
    /**
     * 层号
     */
    private int layer;
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/HollowGlassRelationInfoService.java
@@ -30,7 +30,8 @@
    Map<String, List<FlowCardGlassInfoDTO>> queryHollowAllFlowCard();
    Map<Integer, List<LackDetailsDTO>>  queryLackByFlowCard(String flowCardId);
    //    Map<Integer, List<LackDetailsDTO>>  queryLackByFlowCard(String flowCardId);
    List<LackDetailsDTO> queryLackByFlowCard(String flowCardId);
}
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassOutRelationInfoServiceImpl.java
@@ -1,5 +1,6 @@
package com.mes.hollow.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.mes.common.config.Const;
@@ -67,6 +68,11 @@
            log.info("该流程卡信息系统未找到");
            return info;
        }
        List<HollowGlassOutRelationInfo> outRelationInfos = this.list(new LambdaQueryWrapper<HollowGlassOutRelationInfo>().eq(HollowGlassOutRelationInfo::getCell, cell)
                .in(HollowGlassOutRelationInfo::getState, Const.HOLLOW_FLOW_CARD_START));
        if (CollectionUtil.isNotEmpty(outRelationInfos)){
            return null;
        }
        info.setFlowCardId(flowCardId);
        info.setCell(cell);
        info.setIsForce(isForce);
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollow/service/impl/HollowGlassRelationInfoServiceImpl.java
@@ -64,8 +64,7 @@
                .eq(HollowGlassRelationInfo::getWidth, width)
                .eq(HollowGlassRelationInfo::getHeight, height)
                .eq(HollowGlassRelationInfo::getLayer, layer)
                .isNull(HollowGlassRelationInfo::getTemperingLayoutId)
                .isNull(HollowGlassRelationInfo::getTemperingFeedSequence)
                .eq(HollowGlassRelationInfo::getState,Const.HOLLOW_RELATION_NEW)
                .orderByAsc(HollowGlassRelationInfo::getHollowSequence)
                .last("limit 1")
        );
@@ -200,6 +199,7 @@
                    hollow.setVirtualSlot(temp.get(0).getVirtualSlot());
                    hollow.setFilmsId(glassInfo.getFilmsid());
                    hollow.setThickness(glassInfo.getThickness());
                    hollow.setState(Const.HOLLOW_RELATION_NEW);
                    temp.add(hollow);
                    flag = true;
                    break;
@@ -214,6 +214,7 @@
                hollow.setVirtualSlot(slotNumber++);
                hollow.setFilmsId(glassInfo.getFilmsid());
                hollow.setThickness(glassInfo.getThickness());
                hollow.setState(Const.HOLLOW_RELATION_NEW);
                newList.add(hollow);
                tempHollowList.add(newList);
            }
@@ -242,11 +243,16 @@
        return dtos.stream().collect(Collectors.groupingBy(FlowCardGlassInfoDTO::getFlowCardId));
    }
//    @Override
//    public Map<Integer, List<LackDetailsDTO>>  queryLackByFlowCard(String flowCardId) {
//        List<LackDetailsDTO> lackDetailsList = this.baseMapper.queryLackByFlowCard(flowCardId);
//        Map<Integer, List<LackDetailsDTO>> listMap = lackDetailsList.stream().collect(Collectors.groupingBy(LackDetailsDTO::getLayer));
//        return listMap;
//    }
    @Override
    public Map<Integer, List<LackDetailsDTO>>  queryLackByFlowCard(String flowCardId) {
    public List<LackDetailsDTO>  queryLackByFlowCard(String flowCardId) {
        List<LackDetailsDTO> lackDetailsList = this.baseMapper.queryLackByFlowCard(flowCardId);
        Map<Integer, List<LackDetailsDTO>> listMap = lackDetailsList.stream().collect(Collectors.groupingBy(LackDetailsDTO::getLayer));
        return listMap;
        return lackDetailsList;
    }
}
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/hollowqueue/entity/HollowGlassQueueInfo.java
@@ -45,6 +45,10 @@
     */
    private Integer glassType;
    /**
     * 膜系
     */
    private String filmsId;
    /**
     * /*厚度
     */
    private Double thickness;
hangzhoumesParent/moduleService/howllowGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageHollowTask.java
@@ -162,43 +162,56 @@
        //计算目标格子
        List<HollowBigStorageCageHistoryTask> historyTasks = new ArrayList<>();
        for (BigStorageCageTask task : inTaskList) {
            GlassInfo info = glassListMap.get(task.getGlassId()).get(0);
            HollowBigStorageDTO bigStorageDTO = hollowGlassRelationInfoService.queryHollowTargetSlot(info.getFlowCardId(),
                    info.getWidth(), info.getHeight(), info.getTotalLayer(), info.getLayer());
        try {
            for (BigStorageCageTask task : inTaskList) {
                GlassInfo info = glassListMap.get(task.getGlassId()).get(0);
                HollowBigStorageDTO bigStorageDTO = hollowGlassRelationInfoService.queryHollowTargetSlot(info.getFlowCardId(),
                        info.getWidth(), info.getHeight(), info.getTotalLayer(), info.getLayer());
//            临时更新格子的剩余尺寸:防止相邻玻璃进同一格子造成剩余尺寸不足,玻璃越界的情况,任务完成后再次更新大理片笼表剩余宽度(按照笼内玻璃数量更新大理片笼剩余尺寸)
            hollowBigStorageCageService.update(new LambdaUpdateWrapper<HollowBigStorageCage>()
                    .set(HollowBigStorageCage::getRemainWidth, bigStorageDTO.getRemainWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap)
                    .eq(HollowBigStorageCage::getSlot, bigStorageDTO.getSlot()));
            task.setTargetSlot(bigStorageDTO.getSlot());
            task.setGlassId(info.getGlassId());
            bigStorageCageTaskService.updateTaskMessage(BIG_STORAGE_CAGE_IN_TWO_TASK, task);
            //存放历史任务
            HollowBigStorageCageHistoryTask historyTask = new HollowBigStorageCageHistoryTask();
            BeanUtils.copyProperties(task, historyTask);
            historyTask.setTaskType(Const.BIG_STORAGE_AFTER_IN);
            historyTask.setGlassCount(glassInfoList.size());
            historyTask.setTaskState(Const.ENGINEERING_NEW);
            historyTasks.add(historyTask);
            //存放详情数据
            HollowBigStorageCageDetails cageDetails = new HollowBigStorageCageDetails();
            BeanUtils.copyProperties(bigStorageDTO, cageDetails);
            BeanUtils.copyProperties(info, cageDetails);
            cageDetails.setState(Const.GLASS_STATE_NEW);
            cageDetails.setSequence(bigStorageDTO.getSlotSequence());
            cageDetails.setGap(glassGap);
            cageDetails.setId(null);
            hollowBigStorageCageDetailsService.save(cageDetails);
                hollowBigStorageCageService.update(new LambdaUpdateWrapper<HollowBigStorageCage>()
                        .set(HollowBigStorageCage::getRemainWidth, bigStorageDTO.getRemainWidth() - Math.max(info.getWidth(), info.getHeight()) - glassGap)
                        .eq(HollowBigStorageCage::getSlot, bigStorageDTO.getSlot()));
                task.setTargetSlot(bigStorageDTO.getSlot());
                task.setGlassId(info.getGlassId());
                bigStorageCageTaskService.updateTaskMessage(BIG_STORAGE_CAGE_IN_TWO_TASK, task);
                //存放历史任务
                HollowBigStorageCageHistoryTask historyTask = new HollowBigStorageCageHistoryTask();
                BeanUtils.copyProperties(task, historyTask);
                historyTask.setTaskType(Const.BIG_STORAGE_AFTER_IN);
                historyTask.setGlassCount(glassInfoList.size());
                historyTask.setTaskState(Const.ENGINEERING_NEW);
                historyTasks.add(historyTask);
                //存放详情数据
                HollowBigStorageCageDetails cageDetails = new HollowBigStorageCageDetails();
                BeanUtils.copyProperties(bigStorageDTO, cageDetails);
                BeanUtils.copyProperties(info, cageDetails);
                cageDetails.setState(Const.GLASS_STATE_NEW);
                cageDetails.setSequence(bigStorageDTO.getSlotSequence());
                cageDetails.setGap(glassGap);
                cageDetails.setId(null);
                hollowBigStorageCageDetailsService.save(cageDetails);
                hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
                        .set(HollowGlassRelationInfo::getGlassId, cageDetails.getGlassId())
                        .set(HollowGlassRelationInfo::getTemperingLayoutId, cageDetails.getTemperingLayoutId())
                        .set(HollowGlassRelationInfo::getTemperingFeedSequence, cageDetails.getTemperingFeedSequence())
                        .set(HollowGlassRelationInfo::getEngineerId, cageDetails.getEngineerId())
                        .set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
                        .eq(HollowGlassRelationInfo::getFlowCardId, bigStorageDTO.getFlowCardId())
                        .eq(HollowGlassRelationInfo::getLayer, bigStorageDTO.getLayer())
                        .eq(HollowGlassRelationInfo::getVirtualSlot, bigStorageDTO.getVirtualSlot())
                        .eq(HollowGlassRelationInfo::getSlotSequence, bigStorageDTO.getSlotSequence())
                        .eq(HollowGlassRelationInfo::getHollowSequence, bigStorageDTO.getHollowSequence())
                );
            }
        } catch (Exception exception) {
            log.info("进片任务执行中发生异常:{}", exception);
            hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
                    .set(HollowGlassRelationInfo::getGlassId, cageDetails.getGlassId())
                    .set(HollowGlassRelationInfo::getTemperingLayoutId, cageDetails.getTemperingLayoutId())
                    .set(HollowGlassRelationInfo::getTemperingFeedSequence, cageDetails.getTemperingFeedSequence())
                    .set(HollowGlassRelationInfo::getEngineerId, cageDetails.getEngineerId())
                    .eq(HollowGlassRelationInfo::getFlowCardId, bigStorageDTO.getFlowCardId())
                    .eq(HollowGlassRelationInfo::getLayer, bigStorageDTO.getLayer())
                    .eq(HollowGlassRelationInfo::getVirtualSlot, bigStorageDTO.getVirtualSlot())
                    .eq(HollowGlassRelationInfo::getSlotSequence, bigStorageDTO.getSlotSequence())
                    .eq(HollowGlassRelationInfo::getHollowSequence, bigStorageDTO.getHollowSequence())
                    .set(HollowGlassRelationInfo::getGlassId, null)
                    .set(HollowGlassRelationInfo::getTemperingLayoutId, null)
                    .set(HollowGlassRelationInfo::getTemperingFeedSequence, null)
                    .set(HollowGlassRelationInfo::getEngineerId, null)
                    .set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_NEW)
                    .eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
            );
        }
        //历史数据入库
@@ -274,7 +287,7 @@
            if (CollectionUtil.isNotEmpty(unFinishHollowQueueList)) {
                log.info("有正在出片的中空任务");
                Integer isPair = unFinishHollowQueueList.get(0).getIsPair();
                hollowOutGlassByIsPair(unFinishHollowQueueList, hollowGlassOutRelationInfo.getCell(), isPair, hollowGlassOutRelationInfo.getTotalLayer(),hollowGlassOutRelationInfo.getIsForce());
                hollowOutGlassByIsPair(unFinishHollowQueueList, hollowGlassOutRelationInfo.getCell(), isPair, hollowGlassOutRelationInfo.getTotalLayer(), hollowGlassOutRelationInfo.getIsForce());
                Date endDate = new Date();
                log.info("大理片笼出片任务结束时间:{},共耗时:{}ms,结束扫码任务", endDate, endDate.getTime() - startDate.getTime());
                return;
@@ -367,7 +380,7 @@
                        int targetSlot = item.getSlot();
                        list = hollowBigStorageCageDetailsService.list(new LambdaQueryWrapper<HollowBigStorageCageDetails>()
                                .eq(HollowBigStorageCageDetails::getState, Const.GLASS_STATE_IN).eq(HollowBigStorageCageDetails::getSlot, startSlot));
                        hollowOutGlassByIsPair(list, targetSlot, 0, 0,0);
                        hollowOutGlassByIsPair(list, targetSlot, 0, 0, 0);
                        List<Integer> slotList = new ArrayList<>();
                        slotList.add(targetSlot);
                        updateSlotRemainBySlots(slotList);
@@ -440,12 +453,38 @@
                hollowBigStorageCageDetailsService.updateBySlot(storageCageDTOList, Const.GLASS_STATE_IN);
                log.info("4、大理片笼进片状态已完成已完成的玻璃信息id:{}", v);
                updateSlotRemainBySlots(inSuccessGlassSlot);
                List<String> glassList = v.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
                hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
                        .set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_SUCCESS)
                        .eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
                        .in(HollowGlassRelationInfo::getGlassId, glassList)
                );
            } else if (e1 == 3) {
                //破损处理
                dealDamageInTask(v);
                List<String> glassList = v.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
                hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
                        .set(HollowGlassRelationInfo::getGlassId, null)
                        .set(HollowGlassRelationInfo::getTemperingLayoutId, null)
                        .set(HollowGlassRelationInfo::getTemperingFeedSequence, null)
                        .set(HollowGlassRelationInfo::getEngineerId, null)
                        .set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_NEW)
                        .eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
                        .in(HollowGlassRelationInfo::getGlassId, glassList)
                );
            } else {
                //清空理片笼空数据
                noDealInTask(v);
                List<String> glassList = v.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
                hollowGlassRelationInfoService.update(new LambdaUpdateWrapper<HollowGlassRelationInfo>()
                        .set(HollowGlassRelationInfo::getGlassId, null)
                        .set(HollowGlassRelationInfo::getTemperingLayoutId, null)
                        .set(HollowGlassRelationInfo::getTemperingFeedSequence, null)
                        .set(HollowGlassRelationInfo::getEngineerId, null)
                        .set(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_NEW)
                        .eq(HollowGlassRelationInfo::getState, Const.HOLLOW_RELATION_OCCUPY)
                        .in(HollowGlassRelationInfo::getGlassId, glassList)
                );
            }
        });
        for (BigStorageCageTask item : inTaskList) {
@@ -560,36 +599,36 @@
        try {
            //更新数量
            //按照玻璃id获取需要出片对列表中的数据
            if(finalTaskType.equals(Const.BIG_STORAGE_AFTER_OUT) ){
            if (finalTaskType.equals(Const.BIG_STORAGE_AFTER_OUT)) {
                HollowGlassQueueInfo hollowGlassQueueInfo = hollowGlassQueueInfoService.getOne(new LambdaQueryWrapper<HollowGlassQueueInfo>()
                        .eq(HollowGlassQueueInfo::getGlassId, outTaskList.get(0).getGlassId())
                        .orderByDesc(HollowGlassQueueInfo::getUpdateTime).last("limit 1"));
                List<HollowGlassQueueInfo> list = hollowGlassQueueInfoService.list(new LambdaQueryWrapper<HollowGlassQueueInfo>()
                        .eq(HollowGlassQueueInfo::getFlowCardId, hollowGlassQueueInfo.getFlowCardId())
                        .eq(HollowGlassQueueInfo::getCell, hollowGlassQueueInfo.getCell())
                                .eq(HollowGlassQueueInfo::getFlowCardId, hollowGlassQueueInfo.getFlowCardId())
                                .eq(HollowGlassQueueInfo::getCell, hollowGlassQueueInfo.getCell())
//                        .eq(HollowGlassQueueInfo::getIsPair, 1)
                        .eq(HollowGlassQueueInfo::getState, Const.TEMPERING_NEW)
                                .eq(HollowGlassQueueInfo::getState, Const.TEMPERING_NEW)
                );
                if (CollectionUtil.isEmpty(list)){
                if (CollectionUtil.isEmpty(list)) {
//                任务更新为已完成
                    hollowGlassOutRelationInfoService.update(new UpdateWrapper<HollowGlassOutRelationInfo>()
                            .eq("flow_card_id",hollowGlassQueueInfo.getFlowCardId())
                            .eq("cell",hollowGlassQueueInfo.getCell())
                            .eq("flow_card_id", hollowGlassQueueInfo.getFlowCardId())
                            .eq("cell", hollowGlassQueueInfo.getCell())
                            .setSql("pair_quantity = total_pair_quantity")
                            .set("state",Const.HOLLOW_FLOW_CARD_SUCCESS)
                            .set("state", Const.HOLLOW_FLOW_CARD_SUCCESS)
                    );
                }else{
                } else {
//               计算剩余玻璃对数,用任务总队数减剩余对数
                    int remainCount = list.size() / hollowGlassQueueInfo.getTotalLayer();
                    hollowGlassOutRelationInfoService.update(new UpdateWrapper<HollowGlassOutRelationInfo>()
                            .eq("flow_card_id",hollowGlassQueueInfo.getFlowCardId())
                            .eq("cell",hollowGlassQueueInfo.getCell())
                            .setSql("pair_quantity = total_pair_quantity -"+remainCount)
                            .eq("flow_card_id", hollowGlassQueueInfo.getFlowCardId())
                            .eq("cell", hollowGlassQueueInfo.getCell())
                            .setSql("pair_quantity = total_pair_quantity -" + remainCount)
                    );
                }
            }
        }catch (Exception e){
            log.info("计算玻璃数量过程中出现错误,错误信息{}",e.getMessage());
        } catch (Exception e) {
            log.info("计算玻璃数量过程中出现错误,错误信息{}", e.getMessage());
        }
//        hollowGlassOutRelationInfoService.update
@@ -703,7 +742,7 @@
    }
    private <T extends HollowBigStorageCageBaseInfo> Boolean hollowOutGlassByIsPair(List<T> list, int targetSlot, int isPair, int totalLayer,int isForce) {
    private <T extends HollowBigStorageCageBaseInfo> Boolean hollowOutGlassByIsPair(List<T> list, int targetSlot, int isPair, int totalLayer, int isForce) {
        List<T> resultList = new ArrayList<>();
        List<T> tempList = new ArrayList<>();
        int taskType = Const.BIG_STORAGE_AFTER_OUT;
@@ -711,25 +750,25 @@
        for (T t : list) {
            if (isPair == (t.getIsPair() == null ? 0 : t.getIsPair())) {
                tempList.add(t);
            }else{
            } else {
                break;
            }
        }
        if (isPair == 0 && isForce!=1) {
        if (isPair == 0 && isForce != 1) {
            taskType = Const.BIG_STORAGE_AFTER_DISPATCH;
            taskState = Const.GLASS_STATE_SCHEDULE_ING;
            resultList.add(list.get(0));
            //目前调度任务totalLayer为0  出片调度任务有层号,用于区分调度方式
            if (totalLayer !=0){
            if (totalLayer != 0) {
                HollowBigStorageCage storageCage = hollowBigStorageCageService.getOne(new LambdaQueryWrapper<HollowBigStorageCage>()
                        .eq(HollowBigStorageCage::getEnableState, Const.SLOT_ON).eq(HollowBigStorageCage::getRemainWidth, slotWidth).last("limit 1"));
                targetSlot = storageCage.getSlot();
            }
            totalLayer = 0;
        }else{
        } else {
            resultList = tempList;
        }
        return computeOutGlassInfo(resultList, BIG_STORAGE_CAGE_OUT_TWO_TASK, targetSlot, taskState, taskType, totalLayer,isForce);
        return computeOutGlassInfo(resultList, BIG_STORAGE_CAGE_OUT_TWO_TASK, targetSlot, taskState, taskType, totalLayer, isForce);
    }
    /**
@@ -740,7 +779,7 @@
     * @param totalLayer
     * @return
     */
    private <T extends HollowBigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, int targetSlot, int state, int taskType, int totalLayer,int isForce) {
    private <T extends HollowBigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list, String tableName, int targetSlot, int state, int taskType, int totalLayer, int isForce) {
        //任务数据:获取车子存放玻璃最大数量,玻璃间隔
        List<BigStorageCageTask> tempList = new ArrayList<>();
        List<T> tempTList = new ArrayList<>();
@@ -759,13 +798,13 @@
        Assert.isFalse(CollectionUtil.isEmpty(tempList), "未获取出片数据,结束出片任务");
        log.info("获取出片任务数据{}条,执行保存", tempList.size());
        List<BigStorageCageTask> bigStorageCageTaskList = tempList;
        if (1!= isForce){
        if (1 != isForce) {
            if (taskType == Const.BIG_STORAGE_AFTER_OUT) {
                if (tempList.size() <= totalLayer) {
                    bigStorageCageTaskList = tempList;
                } else {
                    int remainCount = tempList.size() % totalLayer;
                    bigStorageCageTaskList = tempList.subList(0,tempList.size() - remainCount);
                    bigStorageCageTaskList = tempList.subList(0, tempList.size() - remainCount);
                }
            }
        }
hangzhoumesParent/moduleService/howllowGlassModule/src/main/resources/mapper/HollowBigStorageCageDetailsMapper.xml
@@ -6,6 +6,8 @@
        <result column="engineer_id" property="engineerId"/>
        <result column="flow_card_id" property="flowCardId"/>
        <result column="layer" property="layer"/>
        <result column="films_id" property="filmsId"/>
        <result column="thickness" property="thickness"/>
        <result column="sum_count" property="sumCount"/>
        <result column="pair_count" property="pairCount"/>
        <result column="real_count" property="realCount"/>
@@ -39,10 +41,12 @@
    </update>
    <select id="hollowIsAll" resultMap="baseMap">
        WITH sum_flow_layer_count AS ( SELECT flow_card_id, layer, min( films_id ) AS films_id, count(*) AS sum_count FROM hollow_glass_relation_info GROUP BY flow_card_id, layer ),
        real_flow_layer_count AS ( SELECT flow_card_id, layer, count(*) AS real_count FROM hollow_glass_relation_info WHERE tempering_layout_id IS NOT NULL AND tempering_feed_sequence IS NOT NULL GROUP BY flow_card_id, layer ),
        damage_flow_layer_count AS ( SELECT process_id AS flow_card_id, technology_number AS layer, count(*) as damage_count FROM damage GROUP BY process_id, technology_number )
        ,
        WITH sum_flow_layer_count AS ( SELECT flow_card_id, layer, min( films_id ) AS films_id, min(thickness) as
        thickness,count(*) AS sum_count FROM hollow_glass_relation_info GROUP BY flow_card_id, layer ),
        real_flow_layer_count AS ( SELECT flow_card_id, layer, count(*) AS real_count FROM
        hollow_big_storage_cage_details t WHERE state = 100 GROUP BY flow_card_id, layer ),
        damage_flow_layer_count AS ( SELECT process_id AS flow_card_id, technology_number AS layer, count(*) as
        damage_count FROM damage GROUP BY process_id, technology_number ),
        lack_flow_layer_count AS (
        SELECT
        t.flow_card_id,
@@ -55,9 +59,9 @@
        left JOIN damage_flow_layer_count t2 ON t1.flow_card_id = t2.flow_card_id
        AND t1.layer = t2.layer
        ),
        layer_one AS ( SELECT * FROM hollow_glass_relation_info WHERE layer = 1 AND tempering_layout_id IS NOT NULL AND tempering_feed_sequence IS NOT NULL ),
        layer_two AS ( SELECT * FROM hollow_glass_relation_info WHERE layer = 2 AND tempering_layout_id IS NOT NULL AND tempering_feed_sequence IS NOT NULL ),
        layer_three AS ( SELECT * FROM hollow_glass_relation_info WHERE layer = 3 AND tempering_layout_id IS NOT NULL AND tempering_feed_sequence IS NOT NULL )
        layer_one AS ( SELECT * FROM hollow_big_storage_cage_details WHERE layer = 1 AND state = 100 ),
        layer_two AS ( SELECT * FROM hollow_big_storage_cage_details WHERE layer = 2 AND state = 100),
        layer_three AS ( SELECT * FROM hollow_big_storage_cage_details WHERE layer = 3 AND state = 100 )
        ,
        pair_flow_layer_count AS (
        SELECT
@@ -67,11 +71,11 @@
        layer_one t
        INNER JOIN layer_two t1 ON t.flow_card_id = t1.flow_card_id
        AND t.virtual_slot = t1.virtual_slot
        AND t.slot_sequence = t1.slot_sequence
        AND t.sequence = t1.sequence
        <if test="totalLayer == 3">
            inner join layer_three t2
            on t.flow_card_id = t2.flow_card_id and
            t.virtual_slot = t2.virtual_slot and t.slot_sequence = t2.slot_sequence
            t.virtual_slot = t2.virtual_slot and t.sequence = t2.sequence
        </if>
        GROUP BY
        t.flow_card_id
@@ -81,6 +85,7 @@
        t.flow_card_id,
        t.layer,
        t.films_id,
        t.thickness,
        sum_count,
        IFNULL( t3.pair_count, 0 ) AS pair_count,
        IFNULL( real_count, 0 ) AS real_count,
@@ -105,7 +110,6 @@
            and sum_count = pair_count
        </if>
    </select>
    <select id="queryIsAllNeedDispatchVirtualSlot" resultMap="virtualSlotSequenceDTO">
        with relation_temp as (