ZengTao
2024-12-09 3050db3dbea1d48ed07b79290ac42df76f0361d2
修改调度逻辑为按预排的格子进行调度
7个文件已修改
396 ■■■■ 已修改文件
UI-Project/src/views/Slicecage/slicecage.vue 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/JsonFile/PlcCacheVerticalGlass.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java 305 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/JsonFile/PlcCacheVerticalGlass.json 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UI-Project/src/views/Slicecage/slicecage.vue
@@ -960,27 +960,25 @@
    <el-button style="margin-top: 10px;margin-left: 10px;margin-bottom: 10px;" id="searchButton" type="primary"
      @click="dialogFormVisibleaDownGlasss = true">标签打印
    </el-button>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 5px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 100px;">
        <el-table height="100px" ref="table"
    <div style="display: flex;">
      <el-card style="flex: 1;margin-left: 10px;margin-top: 5px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 240px;">
        <el-table height="240px" ref="table"
        :data="tableDatac" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="bigStorageCageOutTask.glassId" align="center" :label="$t('searchOrder.outputglassID')" min-width="140" />
          <el-table-column prop="bigStorageCageOutTask.startSlot" align="center" :label="$t('searchOrder.startposition')" min-width="120" />
          <el-table-column prop="bigStorageCageOutTask.endSlot" align="center" :label="$t('searchOrder.targetlocation')" min-width="120" />
          <el-table-column prop="bigStorageCageOutTask.trainNumber" align="center" :label="$t('searchOrder.trips')" min-width="120" />
          <el-table-column prop="bigStorageCageOutTask.serialNumber" align="center" :label="$t('searchOrder.number')" min-width="120" />
          <el-table-column prop="bigStorageCageOutTask.taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="157">
          <!-- <template #default="scope">
            <el-tag type="success" >{{ scope.row.bigStorageCageOutTask.taskState==0? $t('searchOrder.filmenter') : $t('searchOrder.infilm') }}111</el-tag>
          </template> -->
          </el-table-column>
          <!-- <el-table-column prop="bigStorageCageOutTask.taskState" align="center" :label="$t('searchOrder.taskstatus')" min-width="157">
          </el-table-column> -->
          <!-- <el-table-column prop="id" align="center" :label="$t('searchOrder.tabid')" min-width="150"/> -->
          <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.tid')" min-width="100"/>
          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="100"/>
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="140"/>
          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="150"/>
          <!-- <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.tid')" min-width="100"/> -->
          <!-- <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="100"/> -->
          <!-- <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="140"/> -->
          <!-- <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="150"/> -->
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="140"/>
          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/>
          <!-- <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/> -->
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="100"/>
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="100"/>
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="100"/>
@@ -996,8 +994,8 @@
      </div>
    </el-card>
    <el-card style="flex: 1;margin-left: 10px;margin-top: 3px;" v-loading="loading">
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 100px;">
        <el-table height="100px" ref="table"
      <div style="width: 98%; height: calc(100% - 35px); overflow-y: auto;max-height: 240px;">
        <el-table height="240px" ref="table"
        @selection-change="handleSelectionChange"
        :data="tableDatad" :header-cell-style="{background:'#F2F3F5 ',color:'#1D2129'}">
          <el-table-column prop="bigStorageCageFeedTask.glassId" align="center" :label="$t('searchOrder.intoglassid')" min-width="140" />
@@ -1010,12 +1008,12 @@
          </el-table-column>
          <el-table-column prop="bigStorageCageFeedTask.line" align="center" :label="$t('searchOrder.line')" min-width="120" />
          <!-- <el-table-column prop="id" align="center" :label="$t('searchOrder.tabid')" min-width="150"/>  -->
          <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.tid')" min-width="100"/>
          <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="100"/>
          <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="140"/>
          <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="150"/>
          <!-- <el-table-column prop="deviceId" align="center" :label="$t('searchOrder.tid')" min-width="100"/> -->
          <!-- <el-table-column prop="slot" align="center" :label="$t('searchOrder.gridnumber')" min-width="100"/> -->
          <!-- <el-table-column prop="glassId" align="center" :label="$t('searchOrder.glassID')" min-width="140"/> -->
          <!-- <el-table-column prop="sequence" align="center" :label="$t('searchOrder.pieceingrid')" min-width="150"/> -->
          <el-table-column prop="flowCardId" align="center" :label="$t('searchOrder.cardnumber')" min-width="140"/>
          <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/>
          <!-- <el-table-column prop="glassType" align="center" :label="$t('searchOrder.typeglass')" min-width="100"/> -->
          <el-table-column prop="width" align="center" :label="$t('searchOrder.width')" min-width="100"/>
          <el-table-column prop="height" align="center" :label="$t('searchOrder.height')" min-width="100"/>
          <el-table-column prop="thickness" align="center" :label="$t('searchOrder.thickness')" min-width="100"/>
@@ -1030,6 +1028,8 @@
        </el-table>
      </div>
    </el-card>
    </div>
    <div style="padding: 10px;display: flex;height:130px;">
            <div v-for="(item, index) in tableDatae" :key="index" id="occupy">  
               <el-col style="text-align:left;font-weight: bold;">#{{ item.device_id }}</el-col>  
hangzhoumesParent/JsonFile/PlcCacheVerticalGlass.json
@@ -386,6 +386,20 @@
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "CarRequest",
            "addressIndex": "902",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "CarResponse",
            "addressIndex": "904",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        }
    ]
hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/entity/GlassInfo.java
@@ -145,6 +145,9 @@
     * 是否合并
     */
    private Integer combine;
    /**
     * 预排格子
     */
    private Integer Slot;
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -268,6 +268,13 @@
    @Override
    public BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo) {
        List<GlassInfo> glassInfoList = glassInfoService.list(
                new LambdaQueryWrapper<GlassInfo>()
                        .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId())
                        .eq(GlassInfo::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
                        .eq(GlassInfo::getSlot, glassInfo.getSlot())
        );
        List<String> glassIds = glassInfoList.stream().map(String::valueOf).collect(Collectors.toList());
        BigStorageDTO bigStorageDTO = null;
        MPJLambdaWrapper<BigStorageCage> wrapper = new MPJLambdaWrapper<>(BigStorageCage.class)
                .selectAll(BigStorageCage.class)
@@ -277,6 +284,7 @@
                .eq(BigStorageCageDetails::getEngineerId, glassInfo.getEngineerId())
                .eq(BigStorageCageDetails::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
                .gt(BigStorageCage::getRemainWidth, Math.max(glassInfo.getWidth(), glassInfo.getHeight()))
                .in(BigStorageCageDetails::getGlassId, glassIds)
                .last("limit 1");
        if (glassInfo.getTemperingLayoutId() == 0) {
            wrapper.eq(BigStorageCageDetails::getFlowCardId, glassInfo.getFlowCardId())
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -33,6 +33,7 @@
import com.mes.temperingglass.service.TemperingGlassInfoService;
import com.mes.tools.S7control;
import com.mes.utils.RedisUtil;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
@@ -321,6 +322,7 @@
            return;
        }
        if (redisUtil.getCacheObject("temperingSwitch")) {
//        if(true){
            //是否有正在钢化的玻璃
            List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.selectJoinList(TemperingGlassInfo.class, new MPJLambdaWrapper<TemperingGlassInfo>()
                    .selectAll(TemperingGlassInfo.class)
@@ -383,91 +385,142 @@
            if (CollectionUtils.isNotEmpty(temperingOccupySlotList)) {
                loop:
                for (TemperingLayoutDTO temperingOccupySlot : temperingOccupySlotList) {
                    List<GlassInfo> glassInfoList = glassInfoService.list(
                    List<GlassInfo> glassInfos = glassInfoService.list(
                            new LambdaQueryWrapper<GlassInfo>()
                                    .eq(GlassInfo::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId())
                                    .eq(GlassInfo::getEngineerId, temperingOccupySlot.getEngineerId())
                                    .eq(GlassInfo::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId())
                                    .notInSql(GlassInfo::getGlassId, "select glass_id from damage where type=8 and engineer_id='"
                                            + temperingOccupySlot.getEngineerId() + "' and tempering_layout_id = '" + temperingOccupySlot.getTemperingLayoutId() + "'")
                                    .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)
                    );
                    List<BigStorageCageDetails> glassInfoLists = new ArrayList<>();
                    glassInfoList.forEach(glassInfo -> {
                        BigStorageCageDetails details = new BigStorageCageDetails();
                        BeanUtils.copyProperties(glassInfo, details);
                        details.setSlot(1);
                        glassInfoLists.add(details);
                    });
                    List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsService.list(
                            new LambdaQueryWrapper<BigStorageCageDetails>()
                                    .eq(BigStorageCageDetails::getEngineerId, temperingOccupySlot.getEngineerId())
                                    .eq(BigStorageCageDetails::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId())
                                    .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
                                    .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)
                    );
//                    if (glassInfoLists.size() == bigStorageCageDetailsList.size()) {
                        computeOutMoreGlassInfo(glassInfoLists, Boolean.TRUE, 2);
                        computeOutMoreGlassInfo(bigStorageCageDetailsList, Boolean.TRUE, 3);
                        int allTrainNumber = allTask.stream()
                                .map(BigStorageCageOutTask::getTrainNumber)
                                .collect(Collectors.toSet())
                                .size();
                        int allTrainSlot = allTask.stream()
                                .map(BigStorageCageOutTask::getStartSlot)
                                .collect(Collectors.toSet())
                                .size();
                        int notallTrainNumber = notAllTask.stream()
                                .map(BigStorageCageOutTask::getTrainNumber)
                                .collect(Collectors.toSet())
                                .size();
                        int notallTrainSlot = notAllTask.stream()
                                .map(BigStorageCageOutTask::getStartSlot)
                                .collect(Collectors.toSet())
                                .size();
//                        if (allTrainNumber < notallTrainNumber || (allTrainNumber == notallTrainNumber && allTrainSlot < notallTrainSlot)) {
                            List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId());
                            for (int i = 0; i < slotSequenceList.size() - 1; i++) {
                                SlotSequenceDTO first = slotSequenceList.get(i);
                                SlotSequenceDTO second = slotSequenceList.get(i + 1);
                                int slotWidth = first.getRemainWidth() - glassGap;
                                List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                                        .eq(BigStorageCageDetails::getSlot, second.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
                                        .orderBy(Boolean.TRUE, !sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence));
                                if (CollectionUtils.isNotEmpty(list)) {
                                    List<BigStorageCageOutTask> outTasks = new ArrayList<>();
                                    int serialNumber = 1;
                                    for (BigStorageCageDetails item : list) {
                                        int maxlength=(int)Math.max(item.getWidth(), item.getHeight());
                                        if (slotWidth > maxlength) {
                                            slotWidth = slotWidth - maxlength- glassGap;
                                            outTasks.add(new BigStorageCageOutTask(item.getGlassId(), second.getSlot(), first.getSlot(),
                                                    item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date()));
                                        } else {
                                            outTasks.add(new BigStorageCageOutTask(item.getGlassId(), second.getSlot(), second.getSlot(),
                                                    item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date()));
                                        }
                                    }
                                    List<String> glassList = outTasks.stream()
                                            .filter(item -> !item.getStartSlot().equals(item.getEndSlot()))
                                            .map(BigStorageCageOutTask::getGlassId)
                                            .collect(Collectors.toList());
                                    if(glassList.size()>0){
                                        //新增调度任务
                                        bigStorageCageOutTaskService.saveBatch(outTasks);
                                        //更新理片笼详情表调度的后的玻璃位置信息:生成任务后先将玻璃格子位置进行调整,玻璃状态改为调度中,新增调度完成任务,处理调度完成后玻璃状态改为100.
//                                    List<String> glassList = list.stream().map(BigStorageCageDetails::getGlassId).collect(Collectors.toList());
                    Map<Integer, List<GlassInfo>> listMap = glassInfos.stream().collect(Collectors.groupingBy(item -> item.getSlot()));
                    for (Map.Entry<Integer, List<GlassInfo>> entry : listMap.entrySet()) {
                        List<GlassInfo> valueList = entry.getValue();
                        List<String> glassIds = valueList.stream().map(GlassInfo::getGlassId).collect(Collectors.toList());
                        List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsService.list(
                                new LambdaQueryWrapper<BigStorageCageDetails>()
                                        .in(BigStorageCageDetails::getGlassId, glassIds)
                                        .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
                                        .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)
                        );
                        //当一格玻璃都到齐时
                        if (bigStorageCageDetailsList.size() == valueList.size()) {
                            long distinctSlotCount = bigStorageCageDetailsList.stream()
                                    .map(BigStorageCageDetails::getSlot)
                                    .distinct()
                                    .count();
                            //当玻璃不在同一格时
                            if (distinctSlotCount > 1) {
                                BigStorageCageDetails maxSequenceDetail = bigStorageCageDetailsList.stream()
                                        .max(Comparator.comparingInt(BigStorageCageDetails::getTemperingFeedSequence))
                                        .orElse(null);  // 如果没有元素,返回 null
                                int maxSlot = maxSequenceDetail.getSlot();
                                int serialNumber = 1;
                                for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList
                                ) {
                                    if (bigStorageCageDetails.getSlot() != maxSlot) {
                                        bigStorageCageOutTaskService.save(new BigStorageCageOutTask(bigStorageCageDetails.getGlassId(), bigStorageCageDetails.getSlot(), maxSlot,
                                                bigStorageCageDetails.getWidth() * 10, bigStorageCageDetails.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date()));
                                        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>().set(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING)
                                                .set(BigStorageCageBaseInfo::getSlot, first.getSlot()).in(BigStorageCageDetails::getGlassId, glassList)
                                                .ne(BigStorageCageDetails::getState,Const.GLASS_STATE_OUT));
                                                .set(BigStorageCageBaseInfo::getSlot, maxSlot).eq(BigStorageCageDetails::getGlassId, bigStorageCageDetails.getGlassId())
                                                .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT));
                                        //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸
                                        // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入,
                                        updateSlotRemainBySlots(Arrays.asList(second.getSlot()));
                                        break loop;
                                        List<Integer> updateSlots = new ArrayList<>();
                                        updateSlots.add(bigStorageCageDetails.getSlot());
                                        updateSlotRemainBySlots(updateSlots);
                                    }
                                }
                                break loop;
                            }
                        }
                    }
//                    List<GlassInfo> glassInfoList = glassInfoService.list(
//                            new LambdaQueryWrapper<GlassInfo>()
//                                    .eq(GlassInfo::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId())
//                                    .eq(GlassInfo::getEngineerId, temperingOccupySlot.getEngineerId())
//                                    .notInSql(GlassInfo::getGlassId, "select glass_id from damage where type=8 and engineer_id='"
//                                            + temperingOccupySlot.getEngineerId() + "' and tempering_layout_id = '" + temperingOccupySlot.getTemperingLayoutId() + "'")
//                    );
//                    List<BigStorageCageDetails> glassInfoLists = new ArrayList<>();
//                    glassInfoList.forEach(glassInfo -> {
//                        BigStorageCageDetails details = new BigStorageCageDetails();
//                        BeanUtils.copyProperties(glassInfo, details);
//                        details.setSlot(1);
//                        glassInfoLists.add(details);
//                    });
//                    List<BigStorageCageDetails> bigStorageCageDetailsList = bigStorageCageDetailsService.list(
//                            new LambdaQueryWrapper<BigStorageCageDetails>()
//                                    .eq(BigStorageCageDetails::getEngineerId, temperingOccupySlot.getEngineerId())
//                                    .eq(BigStorageCageDetails::getTemperingLayoutId, temperingOccupySlot.getTemperingLayoutId())
//                                    .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
//                                    .orderBy(Boolean.TRUE, sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence)
//                    );
////                    if (glassInfoLists.size() == bigStorageCageDetailsList.size()) {
//                    computeOutMoreGlassInfo(glassInfoLists, Boolean.TRUE, 2);
//                    computeOutMoreGlassInfo(bigStorageCageDetailsList, Boolean.TRUE, 3);
//                    int allTrainNumber = allTask.stream()
//                            .map(BigStorageCageOutTask::getTrainNumber)
//                            .collect(Collectors.toSet())
//                            .size();
//                    int allTrainSlot = allTask.stream()
//                            .map(BigStorageCageOutTask::getStartSlot)
//                            .collect(Collectors.toSet())
//                            .size();
//                    int notallTrainNumber = notAllTask.stream()
//                            .map(BigStorageCageOutTask::getTrainNumber)
//                            .collect(Collectors.toSet())
//                            .size();
//                    int notallTrainSlot = notAllTask.stream()
//                            .map(BigStorageCageOutTask::getStartSlot)
//                            .collect(Collectors.toSet())
//                            .size();
////                        if (allTrainNumber < notallTrainNumber || (allTrainNumber == notallTrainNumber && allTrainSlot < notallTrainSlot)) {
//                    List<SlotSequenceDTO> slotSequenceList = bigStorageCageDetailsService.queryGlassMaxAndMin(temperingOccupySlot.getEngineerId(), temperingOccupySlot.getTemperingLayoutId());
//                    for (int i = 0; i < slotSequenceList.size() - 1; i++) {
//                        SlotSequenceDTO first = slotSequenceList.get(i);
//                        SlotSequenceDTO second = slotSequenceList.get(i + 1);
//                        int slotWidth = first.getRemainWidth() - glassGap;
//                        List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
//                                .eq(BigStorageCageDetails::getSlot, second.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
//                                .orderBy(Boolean.TRUE, !sequenceOrder, BigStorageCageDetails::getTemperingFeedSequence));
//                        if (CollectionUtils.isNotEmpty(list)) {
//                            List<BigStorageCageOutTask> outTasks = new ArrayList<>();
//                            int serialNumber = 1;
//                            for (BigStorageCageDetails item : list) {
//                                int maxlength = (int) Math.max(item.getWidth(), item.getHeight());
//                                if (slotWidth > maxlength) {
//                                    slotWidth = slotWidth - maxlength - glassGap;
//                                    outTasks.add(new BigStorageCageOutTask(item.getGlassId(), second.getSlot(), first.getSlot(),
//                                            item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date()));
//                                } else {
//                                    outTasks.add(new BigStorageCageOutTask(item.getGlassId(), second.getSlot(), second.getSlot(),
//                                            item.getWidth() * 10, item.getHeight() * 10, 1, serialNumber++, Const.BIG_STORAGE_OUT_NEW, new Date()));
//                                }
//                            }
//                            List<String> glassList = outTasks.stream()
//                                    .filter(item -> !item.getStartSlot().equals(item.getEndSlot()))
//                                    .map(BigStorageCageOutTask::getGlassId)
//                                    .collect(Collectors.toList());
//                            if (glassList.size() > 0) {
//                                //新增调度任务
//                                bigStorageCageOutTaskService.saveBatch(outTasks);
//                                //更新理片笼详情表调度的后的玻璃位置信息:生成任务后先将玻璃格子位置进行调整,玻璃状态改为调度中,新增调度完成任务,处理调度完成后玻璃状态改为100.
////                                    List<String> glassList = list.stream().map(BigStorageCageDetails::getGlassId).collect(Collectors.toList());
//
//                                bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>().set(BigStorageCageDetails::getState, Const.GLASS_STATE_SCHEDULE_ING)
//                                        .set(BigStorageCageBaseInfo::getSlot, first.getSlot()).in(BigStorageCageDetails::getGlassId, glassList)
//                                        .ne(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT));
//
//                                //两次更新笼子的剩余尺寸:第一次防止有玻璃继续进调度后的笼子,第二次更新:计算格子的实际尺寸
//                                // 仅更新调度后的格子信息:起始格子完成后更新:防止调度出片过程中有新玻璃进入,
//                                updateSlotRemainBySlots(Arrays.asList(second.getSlot()));
//                                break loop;
//                            }
//
//                        }
//                    }
//                        }
//                    }
                }
@@ -687,6 +740,8 @@
        String d05ToMES = plcParameterObject.getPlcParameter("D05Request").getValue();
        String mesD03Address = plcParameterObject.getPlcParameter("MESToD03").getAddress();
        String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress();
        String carRequest = plcParameterObject.getPlcParameter("CarRequest").getValue();
        String carResponse = plcParameterObject.getPlcParameter("CarResponse").getAddress();
        if (!REQUEST_WORD.equals(d01ToMES)) {
            log.info("地址:{}写入0", mesD01Address);
            S7object.getinstance().plccontrol.writeWord(mesD01Address, 0);
@@ -703,7 +758,12 @@
            log.info("地址:{}写入0", mesD05Address);
            S7object.getinstance().plccontrol.writeWord(mesD05Address, 0);
        }
        if (!REQUEST_WORD.equals(carRequest)) {
            log.info("地址:{}写入0", carResponse);
            S7object.getinstance().plccontrol.writeWord(carResponse, 0);
        }
    }
    /**
     * 进片状态修改
@@ -715,6 +775,7 @@
        String mesD05Address = plcParameterObject.getPlcParameter("MESToD05").getAddress();
        List<String> glassIds1 = new ArrayList<>();
        List<String> glassIds2 = new ArrayList<>();
        List<String> glassIdsCar = new ArrayList<>();
        for (int i = 1; i <= 6; i++) {
            String line1GlassId = plcParameterObject.getPlcParameter("D03ID" + i).getValue();
            if (StringUtils.isNotEmpty(line1GlassId)) {
@@ -723,6 +784,10 @@
            String line2GlassId = plcParameterObject.getPlcParameter("D05ID" + i).getValue();
            if (StringUtils.isNotEmpty(line2GlassId)) {
                glassIds2.add(line2GlassId);
            }
            String carGlassId = plcParameterObject.getPlcParameter("E01ID" + i).getValue();
            if (StringUtils.isNotEmpty(carGlassId)) {
                glassIdsCar.add(carGlassId);
            }
        }
        List<BigStorageCageFeedTask> bigStorageCageFeedTasks1 = bigStorageCageFeedTaskService.list(
@@ -791,12 +856,27 @@
                            .set(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_CAR)
            );
        }
        String carRequest = plcParameterObject.getPlcParameter("CarRequest").getValue();
        log.info("大车当前玻璃id{}",glassIdsCar);
        if (CollectionUtils.isNotEmpty(glassIdsCar) && REQUEST_WORD.equals(carRequest)) {
            List<BigStorageCageFeedTask> bigStorageCageFeedTasks = bigStorageCageFeedTaskService.list(
                    new LambdaQueryWrapper<BigStorageCageFeedTask>()
                            .in(BigStorageCageFeedTask::getGlassId, glassIdsCar)
                            .eq(BigStorageCageFeedTask::getTaskState, Const.BIG_STORAGE_IN_UP)
                            .eq(BigStorageCageFeedTask::getTargetSlot, 0)
            );
            computeTargetByLineCar(bigStorageCageFeedTasks.get(0).getLine());
        }
    }
    /**
     * 按照玻璃id判断玻璃状态及卧转立是否可直接启动
     */
    public Boolean judgeGlassTypeStatus(String glassId, Integer line, String mesAddress) {
        //预排格子
        computeSlot(glassId);
        //判断此玻璃是在笼内或已生成进片任务
        BigStorageCageFeedTask bigStorageCageFeedTask = bigStorageCageFeedTaskService.getOne(
                new LambdaQueryWrapper<BigStorageCageFeedTask>()
@@ -915,6 +995,37 @@
        return flag;
    }
    public void computeSlot(String glassId) {
        GlassInfo glassInfo = glassInfoService.getOne(
                new LambdaQueryWrapper<GlassInfo>()
                        .eq(GlassInfo::getGlassId, glassId)
        );
        if (glassInfo.getSlot() == null) {
            List<GlassInfo> glassInfos = glassInfoService.list(
                    new LambdaQueryWrapper<GlassInfo>()
                            .eq(GlassInfo::getEngineerId, glassInfo.getEngineerId())
                            .eq(GlassInfo::getTemperingLayoutId, glassInfo.getTemperingLayoutId())
                            .orderBy(Boolean.TRUE, sequenceOrder, GlassInfo::getTemperingFeedSequence)
            );
            List<BigStorageCageDetails> glassInfoLists = new ArrayList<>();
            glassInfos.forEach(item -> {
                BigStorageCageDetails details = new BigStorageCageDetails();
                BeanUtils.copyProperties(item, details);
                details.setSlot(1);
                glassInfoLists.add(details);
            });
            computeOutMoreGlassInfo(glassInfoLists, Boolean.TRUE, 2);
            for (BigStorageCageOutTask bigStorageCageOutTask : allTask
            ) {
                glassInfoService.update(
                        new LambdaUpdateWrapper<GlassInfo>()
                                .eq(GlassInfo::getGlassId, bigStorageCageOutTask.getGlassId())
                                .set(GlassInfo::getSlot, bigStorageCageOutTask.getTrainNumber())
                );
            }
        }
    }
    /**
     * 添加任务信息
     */
@@ -963,6 +1074,14 @@
     * 计算任务表进片线路的目标格子,并启动任务
     */
    public boolean computeTargetByLine(Integer line) {
        sendTaskListToPLC(new ArrayList<>(), line);
        return true;
    }
    /**
     * 计算任务表进片线路的目标格子,并启动任务
     */
    public boolean computeTargetByLineCar(Integer line) {
        //1、获取任务表中的所有玻璃(指定线路且已经进卧转立完成)
        List<BigStorageCageFeedTask> taskList = bigStorageCageFeedTaskService.list(new LambdaQueryWrapper<BigStorageCageFeedTask>()
                .eq(BigStorageCageFeedTask::getLine, line)
@@ -988,7 +1107,7 @@
                .collect(Collectors.toMap(GlassInfo::getGlassId, p -> p));
        for (BigStorageCageFeedTask e : taskList) {
            //替换玻璃id
//            queryAndChangeGlass(e.getGlassId());
            queryAndChangeGlass(e.getGlassId());
            GlassInfo info = glassInfoService.getOne(
                    new LambdaQueryWrapper<GlassInfo>()
                            .eq(GlassInfo::getGlassId, e.getGlassId())
@@ -1016,8 +1135,26 @@
            bigStorageCageDetailsService.save(cageDetails);
        }
        sendTaskListToPLC(taskList, line);
        sendTaskListToPLCCar(taskList);
        return Boolean.TRUE;
    }
    private void sendTaskListToPLCCar(List<BigStorageCageFeedTask> taskList) {
        S7control s7control = S7object.getinstance().plccontrol;
        PlcParameterObject plcMesObject = S7object.getinstance().PlcMesObject;
        List<String> returnData = new ArrayList<>();
        for (int i = 1; i <= taskList.size(); i++) {
            s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine());
            s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot());
            returnData.add(taskList.get(i - 1).getGlassId());
            log.info("向plc发送第{}片玻璃已完成,起始位置是{},目标位置是", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot());
        }
        String carRequest = plcMesObject.getPlcParameter("CarRequest").getValue();
        String CarResponse = plcMesObject.getPlcParameter("CarResponse").getAddress();
        while (REQUEST_WORD.equals(carRequest)) {
            s7control.writeWord(CarResponse, 1);
            carRequest = plcMesObject.getPlcParameter("CarRequest").getValue();
        }
    }
    private void sendTaskListToPLC(List<BigStorageCageFeedTask> taskList, Integer line) {
@@ -1028,13 +1165,13 @@
        String mesD05Address = plcMesObject.getPlcParameter("MESToD05").getAddress();
        String outLine = line.equals(Const.A09_OUT_TARGET_POSITION) ? mesD03Address : mesD05Address;
        List<String> returnData = new ArrayList<>();
        for (int i = 1; i <= taskList.size(); i++) {
            s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine());
            s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot());
            returnData.add(taskList.get(i - 1).getGlassId());
            log.info("向plc发送第{}片玻璃已完成,起始位置是{},目标位置是", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot());
        }
        returnData.add("glassid");
//        for (int i = 1; i <= taskList.size(); i++) {
//            s7control.writeWord(plcMesObject.getPlcParameter("StartAddToImport" + i).getAddress(), taskList.get(i - 1).getLine());
//            s7control.writeWord(plcMesObject.getPlcParameter("TargetAddToImport" + i).getAddress(), taskList.get(i - 1).getTargetSlot());
//            returnData.add(taskList.get(i - 1).getGlassId());
//            log.info("向plc发送第{}片玻璃已完成,起始位置是{},目标位置是", i, taskList.get(i - 1).getLine(), taskList.get(i - 1).getTargetSlot());
//        }
//        int returnData = 1;
        int count = 1;
@@ -1061,7 +1198,7 @@
                returnData = glassIds2;
            }
//            returnData = s7control.readWord(outLine, 1).get(0);
            log.info("已向plc第{}次发送进片任务确认,地址为:{},写入的内容为{},读到的请求为{}", count++, outLine, 2, returnData);
            log.info("已向plc第{}次发送进片卧转立,地址为:{},写入的内容为{},读到的请求为{}", count++, outLine, 2, returnData);
        }
//        while (returnData != 0) {
//            s7control.writeWord(outLine, 2);
@@ -1240,7 +1377,7 @@
            });
        }
        //过滤不存在玻璃的格子 将宽度重置为原始宽度5000
        Set<Integer> remainSlotList = slotRemainMap.keySet();
        List<Integer> remainSlotList = new ArrayList<>(slotRemainMap.keySet());
        slotList.removeAll(remainSlotList);
        if (CollectionUtils.isNotEmpty(slotList)) {
            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth)
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/JsonFile/PlcCacheVerticalGlass.json
@@ -386,6 +386,20 @@
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "CarRequest",
            "addressIndex": "902",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        },
        {
            "codeId": "CarResponse",
            "addressIndex": "904",
            "addressLenght": "2",
            "ratio": "1",
            "unit": ""
        }
    ]
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
@@ -274,6 +274,16 @@
    }
    @Test
    public void ca111() {
        List<Integer> slotList = new ArrayList<>(Arrays.asList(62));  // 注意 null 元素
        Set<Integer> remainSlotList = new HashSet<>(Arrays.asList(62));
        slotList.removeAll(remainSlotList);
        log.info("1");
//        plcStorageCageTask.computeSlot("P24111102|1|1");
    }
    @Test
    public void ca() {
        try {
            // 目标系统的API URL