zhoushihao
2024-06-21 e555f50e1bb0cb6b8facca208c70df4dcce06b80
大理片笼进出片任务bug修复完毕,自测已完成,待联调
9个文件已修改
1个文件已添加
356 ■■■■ 已修改文件
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/common/servicebase/src/main/java/com/mes/base/entity/BigStorageCageBaseInfo.java
New file
@@ -0,0 +1,32 @@
package com.mes.base.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @Author : zhoush
 * @Date: 2024/6/21 9:40
 * @Description:
 */
@Data
public class BigStorageCageBaseInfo {
    /**
     * 玻璃id
     */
    @ApiModelProperty(value = "玻璃id")
    private String glassId;
    /**
     * 宽
     */
    @ApiModelProperty(value = "宽")
    private Double width;
    /**
     * 格子号
     */
    @ApiModelProperty(value = "玻璃id")
    private Integer slot;
}
hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/Const.java
@@ -121,12 +121,6 @@
    public static final Integer BIG_STORAGE_IN_RUN = 2;
    /**
     * 大理片笼宽度 及 玻璃间距
     */
    public static final Integer BIG_STORAGE_WIDTH = 5000;
    public static final Integer BIG_STORAGE_GAP = 20;
    /**
     * 钢化小片表
     * -1 生成任务
     * 0  出片完成
hangzhoumesParent/common/servicebase/src/main/java/com/mes/temperingglass/entity/TemperingGlassInfo.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mes.base.entity.BigStorageCageBaseInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -20,7 +21,7 @@
@ApiModel(description = "<p> 钢化小片信息表 </p>")
@Data
@EqualsAndHashCode(callSuper = false)
public class TemperingGlassInfo implements Serializable {
public class TemperingGlassInfo extends BigStorageCageBaseInfo implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -30,12 +31,6 @@
    @ApiModelProperty(value = "钢化小片信息表id", position = 2)
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 玻璃id
     */
    @ApiModelProperty(value = "玻璃id", position = 3)
    private String glassId;
    /**
     * 流程卡
@@ -48,12 +43,6 @@
     */
    @ApiModelProperty(value = "流程卡玻璃类型", position = 5)
    private Integer glassType;
    /**
     * 宽
     */
    @ApiModelProperty(value = "宽", position = 6)
    private Double width;
    /**
     * 高
@@ -71,7 +60,7 @@
     * 膜系
     */
    @ApiModelProperty(value = "膜系", position = 9)
    private Integer filmsid;
    private String filmsid;
    /**
     * 钢化是否接受横放
@@ -114,10 +103,5 @@
     */
    @ApiModelProperty(value = "状态", position = 16)
    private Integer state;
    /**
     * 格子号
     */
    private Integer slot;
}
hangzhoumesParent/common/servicebase/src/main/resources/mapper/TemperingGlassInfoMapper.xml
@@ -2,11 +2,14 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mes.temperingglass.mapper.TemperingGlassInfoMapper">
    <insert id="saveBatch">
        INSERT INTO tempering_glass_info ( glass_id, width, height, thickness, tempering_layout_id,
        tempering_feed_sequence, "state" ) VALUES
        INSERT INTO tempering_glass_info (glass_id, flow_card_id, glass_type, width, height, thickness, filmsid,
        ishorizontal, tempering_layout_id,
        tempering_feed_sequence, x_coordinate, y_coordinate, angle, state, slot ) VALUES
        <foreach collection="list" item="item" separator=",">
            (#{item.glassId}, #{item.width}, #{item.height}, #{item.thickness}, #{item.temperingLayoutId},
            #{item.temperingFeedSequence}, #{item.state})
            (#{item.glassId}, #{item.flowCardId}, #{item.glassType}, #{item.width}, #{item.height}, #{item.thickness},
            #{item.filmsid},#{item.ishorizontal},
            #{item.temperingLayoutId}, #{item.temperingFeedSequence}, #{item.xCoordinate}, #{item.yCoordinate},
            #{item.angle}, #{item.state}, #{item.slot})
        </foreach>
    </insert>
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/BigStorageCageDetails.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.mes.base.entity.BigStorageCageBaseInfo;
import com.mes.bigstoragetask.entity.BigStorageCageFeedTask;
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import io.swagger.annotations.Api;
@@ -23,7 +24,7 @@
@Api(description = "大理片笼详情")
@Data
@EqualsAndHashCode(callSuper = false)
public class BigStorageCageDetails implements Serializable {
public class BigStorageCageDetails extends BigStorageCageBaseInfo implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -40,17 +41,6 @@
    @ApiModelProperty(value = "设备id", position = 3)
    private Integer deviceId;
    /**
     * 栅格号
     */
    @ApiModelProperty(value = "栅格号", position = 4)
    private Integer slot;
    /**
     * 玻璃id
     */
    @ApiModelProperty(value = "玻璃id", position = 5)
    private String glassId;
    /**
     * 小片在格内的顺序
@@ -69,12 +59,6 @@
     */
    @ApiModelProperty(value = "玻璃类型", position = 8)
    private Integer glassType;
    /**
     * 宽
     */
    @ApiModelProperty(value = "宽", position = 9)
    private Double width;
    /**
     * 高
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -26,7 +26,6 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@@ -55,6 +54,18 @@
    @Value("${mes.minCount}")
    private int minCount;
    @Value("${mes.carWidth}")
    private Integer carWidth;
    @Value("${mes.slotWidth}")
    private Integer slotWidth;
    @Value("${mes.carMaxSize}")
    private Integer carMaxSize;
    @Value("${mes.galssGap}")
    private Integer galssGap;
    /**
     * 查询进/出片任务
@@ -125,7 +136,7 @@
        for (BigStorageCageDetails bigStorageCageDetails : bigStorageCageDetailsList
        ) {
            if (bigStorageCageDetails.getBigStorageCageFeedTask().getTaskState() == 0) {
                carWidth -= Integer.parseInt(bigStorageCageDetails.getWidth().toString()) + bigStorageCageDetails.getGap();
                carWidth -= Integer.parseInt(bigStorageCageDetails.getWidth().toString()) + galssGap;
            }
        }
        return carWidth;
@@ -175,7 +186,7 @@
        BigStorageCageDetails bigStorageCageDetails = new BigStorageCageDetails();
        BeanUtils.copyProperties(glassInfo, bigStorageCageDetails);
        bigStorageCageDetails.setState(0);
        bigStorageCageDetails.setGap(Const.BIG_STORAGE_GAP);
        bigStorageCageDetails.setGap(galssGap);
        return bigStorageCageDetails;
    }
@@ -228,7 +239,7 @@
            return bigStorageDTO;
        }
        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                .eq(BigStorageCage::getRemainWidth, Const.BIG_STORAGE_WIDTH)
                .eq(BigStorageCage::getRemainWidth, slotWidth)
                .inSql(BigStorageCage::getDeviceId,
                        "select distinct device_id from big_storage_cage_details where tempering_layout_id = " + glassInfo.getTemperingLayoutId())
                .last("limit 1"));
@@ -239,7 +250,7 @@
            return bigStorageDTO;
        }
        bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                .eq(BigStorageCage::getRemainWidth, Const.BIG_STORAGE_WIDTH)
                .eq(BigStorageCage::getRemainWidth, slotWidth)
                .last("limit 1"));
        Assert.isTrue(null != bigStorageCage, "没有空余的笼子存放玻璃");
        bigStorageDTO = new BigStorageDTO();
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -5,6 +5,8 @@
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.github.yulichang.toolkit.JoinWrappers;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.mes.base.entity.BigStorageCageBaseInfo;
import com.mes.bigstorage.entity.BigStorageCage;
import com.mes.bigstorage.entity.BigStorageCageDetails;
import com.mes.bigstorage.entity.BigStorageDTO;
@@ -16,7 +18,9 @@
import com.mes.bigstoragetask.entity.BigStorageCageOutTask;
import com.mes.bigstoragetask.service.BigStorageCageFeedTaskService;
import com.mes.bigstoragetask.service.BigStorageCageOutTaskService;
import com.mes.common.S7object;
import com.mes.common.config.Const;
import com.mes.device.PlcParameterObject;
import com.mes.edgglasstask.entity.EdgGlassTaskInfo;
import com.mes.edgglasstask.service.EdgGlassTaskInfoService;
import com.mes.glassinfo.entity.GlassInfo;
@@ -27,13 +31,11 @@
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -63,26 +65,28 @@
    @Value("${mes.sequence.order}")
    private boolean sequenceOrder;
    @Value("${mes.carWidth}")
    private Integer carWidth;
    @Value("${mes.slotWidth}")
    private Integer slotWidth;
    //    @Scheduled(fixedDelay = 5000)
    public void plcToHomeEdgScan(String d01Id) {
//        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
//        String d01Request = plcParameterObject.getPlcParameter("D01Request").getValue();
//        String d01Id = plcParameterObject.getPlcParameter("D01ID1").getValue();
//        String d02SitState = plcParameterObject.getPlcParameter("D02SitState").getValue();
//        String d04Request = plcParameterObject.getPlcParameter("D04Request").getValue();
//        String d04Id = plcParameterObject.getPlcParameter("D04ID1").getValue();
//        String d05SitState = plcParameterObject.getPlcParameter("D05SitState").getValue();
    @Value("${mes.carMaxSize}")
    private Integer carMaxSize;
        String d01Request = "1";
        String d02SitState = "0";
//        String d01Id = "P24060403|3|6";
        String d04Request = "0";
        String d05SitState = "0";
//        String d04Id = "P24060403|4|3";
        String d04Id = "P24060403|5|4";
    @Value("${mes.galssGap}")
    private Integer galssGap;
    @Scheduled(fixedDelay = 5000)
    public void plcToHomeEdgScan() {
        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
        String d01Request = plcParameterObject.getPlcParameter("D01Request").getValue();
        String d01Id = plcParameterObject.getPlcParameter("D01ID1").getValue();
        String d02SitState = plcParameterObject.getPlcParameter("D02SitState").getValue();
        String d04Request = plcParameterObject.getPlcParameter("D04Request").getValue();
        String d04Id = plcParameterObject.getPlcParameter("D04ID1").getValue();
        String d05SitState = plcParameterObject.getPlcParameter("D05SitState").getValue();
        log.info("1、获取到的请求字d01为:{},获取到的扫描ID为:{};获取到的请求字d04为:{},获取到的扫描ID为:{};",
                d01Request, d01Id, d04Request, d04Id);
        if (!REQUEST_WORD.equals(d01Request) && !REQUEST_WORD.equals(d04Request)) {
@@ -116,23 +120,18 @@
        }
    }
    //    @Scheduled(fixedDelay = 5000)
    @Scheduled(fixedDelay = 5000)
    public void plcToHomeEdgFreeCarTask() {
//        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
//        String e01Status = plcParameterObject.getPlcParameter("E01Status").getValue();
        String e01Status = "0";
        PlcParameterObject plcParameterObject = S7object.getinstance().PlcMesObject;
        String e01Status = plcParameterObject.getPlcParameter("E01Status").getValue();
        if (REQUEST_WORD.equals(e01Status)) {
            log.info("进片大车非空闲");
            return;
        }
//        String d01Request = plcParameterObject.getPlcParameter("D01Request").getValue();
//        String d01Id = plcParameterObject.getPlcParameter("D01ID1").getValue();
//        String d04Request = plcParameterObject.getPlcParameter("D04Request").getValue();
//        String d04Id = plcParameterObject.getPlcParameter("D04ID1").getValue();
        String d01Request = "";
        String d01Id = "";
        String d04Request = "1";
        String d04Id = "";
        String d01Request = plcParameterObject.getPlcParameter("D01Request").getValue();
        String d01Id = plcParameterObject.getPlcParameter("D01ID1").getValue();
        String d04Request = plcParameterObject.getPlcParameter("D04Request").getValue();
        String d04Id = plcParameterObject.getPlcParameter("D04ID1").getValue();
        log.info("1、获取到的请求字d01为:{},获取到的扫描ID为:{};获取到的请求字d04为:{},获取到的扫描ID为:{};",
                d01Request, d01Id, d04Request, d04Id);
        //两条线都有进卧转立任务,直接结束
@@ -168,43 +167,29 @@
        computeTargetByLine(outLine);
    }
    //    @Scheduled(fixedDelay = 5000)
    @Scheduled(fixedDelay = 5000)
    public void plcToHomeEdgOutTask() {
        //任务数据  获取车子存放玻璃最大数量  玻璃间隔
        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
        List<BigStorageCageOutTask> outingList = bigStorageCageOutTaskService.list(new LambdaQueryWrapper<BigStorageCageOutTask>().eq(BigStorageCageOutTask::getTaskState, Const.BIG_STORAGE_OUT_NEW));
        Assert.isTrue(CollectionUtils.isEmpty(outingList), "有正在执行出片的任务,结束当前出片线程");
        //是否有正在钢化的玻璃
        List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.list(new LambdaQueryWrapper<TemperingGlassInfo>()
        List<TemperingGlassInfo> temperingGlassInfoList = temperingGlassInfoService.selectJoinList(TemperingGlassInfo.class, new MPJLambdaWrapper<TemperingGlassInfo>()
                .selectAll(TemperingGlassInfo.class)
                .leftJoin(BigStorageCageOutTask.class, BigStorageCageOutTask::getGlassId, TemperingGlassInfo::getGlassId)
                .eq(TemperingGlassInfo::getState, Const.TEMPERING_NEW)
                .isNull(BigStorageCageOutTask::getGlassId)
                .orderBy(Boolean.TRUE, sequenceOrder, TemperingGlassInfo::getTemperingFeedSequence));
        if (CollectionUtils.isNotEmpty(temperingGlassInfoList)) {
            log.info("有正在出片的钢化任务");
            //打车剩余尺寸
            Integer remainWidth = Const.BIG_STORAGE_WIDTH;
            for (TemperingGlassInfo e : temperingGlassInfoList) {
                if (bigStorageCageOutTaskList.size() > 5 || e.getWidth() > remainWidth) {
                    break;
                }
                remainWidth = remainWidth - e.getWidth().intValue() - Const.BIG_STORAGE_GAP;
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getState(), Const.A09_OUT_TARGET_POSITION,
                        e.getWidth().intValue(), 0, 0, 1));
            }
            bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
            computeOutGlassInfo(temperingGlassInfoList);
            return;
        }
        //是否有人工下片任务   有直接出
        List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL).orderByDesc(BigStorageCageDetails::getWidth));
        if (CollectionUtils.isNotEmpty(artificialList)) {
            Integer remainWidth = Const.BIG_STORAGE_WIDTH;
            for (BigStorageCageDetails e : artificialList) {
                if (remainWidth < e.getWidth().intValue()) {
                    break;
                }
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.A10_OUT_TARGET_POSITION,
                        e.getWidth().intValue(), 0, 0, 1));
                remainWidth = remainWidth - e.getWidth().intValue() - Const.BIG_STORAGE_GAP;
            }
            bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
            computeOutGlassInfo(temperingGlassInfoList);
            return;
        }
        //钢化优先:获取理片笼  玻璃小片  破损表 数量   判断笼内版图是否到齐
@@ -214,24 +199,14 @@
            //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务  结束
            List<TemperingGlassInfo> temperingGlassInfos = glassInfoService.selectJoinList(TemperingGlassInfo.class, JoinWrappers.lambda(GlassInfo.class)
                    .selectAll(GlassInfo.class)
                    .select("-1 as state")
                    .selectAs(BigStorageCageDetails::getSlot, TemperingGlassInfo::getSlot)
                    .innerJoin(BigStorageCageDetails.class, BigStorageCageDetails::getGlassId, GlassInfo::getGlassId)
                    .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)
                    .eq(GlassInfo::getTemperingLayoutId, temperingLayoutDTO.getTemperingLayoutId())
                    .eq(GlassInfo::getEngineerId, temperingLayoutDTO.getEngineerId()));
            temperingGlassInfoService.saveBatch(temperingGlassInfos);
            //大车剩余尺寸
            Integer remainWidth = Const.BIG_STORAGE_WIDTH;
            for (TemperingGlassInfo e : temperingGlassInfos) {
                if (bigStorageCageOutTaskList.size() > 5 || e.getWidth() > remainWidth) {
                    break;
                }
                remainWidth = remainWidth - e.getWidth().intValue() - Const.BIG_STORAGE_GAP;
                bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getState(), Const.A09_OUT_TARGET_POSITION,
                        e.getWidth().intValue(), 0, 0, 1));
            }
            bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
            computeOutGlassInfo(temperingGlassInfoList);
            return;
        }
        //未到齐 执行内部调度任务
@@ -241,7 +216,7 @@
            for (int i = 0; i < slotSequenceList.size() - 1; i++) {
                SlotSequenceDTO first = slotSequenceList.get(i);
                SlotSequenceDTO second = slotSequenceList.get(i + 1);
                int slotWidth = Const.BIG_STORAGE_WIDTH - first.getRemainWidth() - Const.BIG_STORAGE_GAP;
                int slotWidth = carWidth - first.getRemainWidth() - galssGap;
                if (first.getMinSequence() == second.getMaxSequence() + 1
                        && second.getRemainWidth() > slotWidth) {
                    List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
@@ -271,7 +246,7 @@
        Integer remainWidth;
        Integer glassCount;
        if (0 == sitToUpRemainWidth.getGlassCount()) {
            remainWidth = Const.BIG_STORAGE_WIDTH;
            remainWidth = carWidth;
            glassCount = 0;
        } else {
            remainWidth = sitToUpRemainWidth.getWidth();
@@ -292,8 +267,8 @@
        } else {
            Integer widthSecond = edgGlassTaskInfoList.get(1).getWidth();
            if (remainWidth >= widthFirst) {
                if (remainWidth - widthFirst - Const.BIG_STORAGE_GAP >= widthSecond) {
                    if (glassCount <= 5) {
                if (remainWidth - widthFirst - galssGap >= widthSecond) {
                    if (glassCount <= carMaxSize - 1) {
                        addFeedTask(glassId, line, Const.BIG_STORAGE_IN_WAIT, widthFirst);
                        return Boolean.FALSE;
                    } else {
@@ -392,4 +367,60 @@
        }
        return Boolean.TRUE;
    }
    private <T extends BigStorageCageBaseInfo> Boolean computeOutGlassInfo(List<T> list) {
        //任务数据  获取车子存放玻璃最大数量  玻璃间隔
        List<BigStorageCageOutTask> bigStorageCageOutTaskList = new ArrayList<>();
        //打车剩余尺寸
        Integer remainWidth = carWidth;
        for (T e : list) {
            if (bigStorageCageOutTaskList.size() > carMaxSize || e.getWidth() > remainWidth) {
                break;
            }
            remainWidth = remainWidth - e.getWidth().intValue() - galssGap;
            bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), Const.A09_OUT_TARGET_POSITION,
                    e.getWidth().intValue(), 0, 0, 1));
        }
        Assert.isFalse(CollectionUtils.isEmpty(bigStorageCageOutTaskList), "未获取出片数据,结束出片任务");
        log.info("获取出片任务数据{}条,执行保存", bigStorageCageOutTaskList.size());
        bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList);
        List<String> glassIds = bigStorageCageOutTaskList.stream().map(BigStorageCageOutTask::getGlassId).collect(Collectors.toList());
        log.info("将出片玻璃{}玻璃状态改为已出片", glassIds);
        bigStorageCageDetailsService.update(new LambdaUpdateWrapper<BigStorageCageDetails>()
                .set(BigStorageCageDetails::getState, Const.GLASS_STATE_OUT)
                .in(BigStorageCageDetails::getGlassId, glassIds));
        //更新笼子内格子的剩余尺寸
        updateSlotRemain(list, glassIds);
        return Boolean.TRUE;
    }
    /**
     * 更新笼子内格子的剩余尺寸
     *
     * @param list
     * @param taskGlassIds
     * @param <T>
     */
    public <T extends BigStorageCageBaseInfo> void updateSlotRemain(List<T> list, List<String> taskGlassIds) {
        //获取需要出去(包括待出去的)的所有玻璃格子号
        List<Integer> slotList = list.stream().map(T::getSlot).distinct().collect(Collectors.toList());
        //获取待出去的玻璃信息(等下车出去的玻璃)
        Map<Integer, Double> slotRemainMap = list.stream().filter(e -> !taskGlassIds.contains(e.getGlassId()))
                .collect(Collectors.groupingBy(T::getSlot, Collectors.summingDouble(item -> item.getWidth() + galssGap)));
        if (CollectionUtils.isNotEmpty(slotRemainMap)) {
            //按照格子号更新剩余尺寸
            slotRemainMap.forEach((e, v) -> {
                bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth - v)
                        .eq(BigStorageCage::getSlot, e));
            });
        }
        Set<Integer> remainSlotList = slotRemainMap.keySet();
        slotList.removeAll(remainSlotList);
        if (CollectionUtils.isNotEmpty(slotList)) {
            bigStorageCageService.update(new LambdaUpdateWrapper<BigStorageCage>().set(BigStorageCage::getRemainWidth, slotWidth)
                    .in(BigStorageCage::getSlot, slotList));
        }
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/temperingglass/service/TemperingGlassInfoService.java
@@ -1,6 +1,6 @@
package com.mes.temperingglass.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.yulichang.base.MPJBaseService;
import com.mes.temperingglass.entity.TemperingGlassInfo;
import java.util.List;
@@ -13,7 +13,7 @@
 * @author zhoush
 * @since 2024-03-27
 */
public interface TemperingGlassInfoService extends IService<TemperingGlassInfo> {
public interface TemperingGlassInfoService extends MPJBaseService<TemperingGlassInfo> {
    public void addOutTask(List<TemperingGlassInfo> temperingGlassInfoList);
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml
@@ -14,4 +14,7 @@
  sequence:
    order: false
  minCount: 5
  slotWidth: 5000
  carWidth: 5000   #大车宽度
  slotWidth: 5000   #大车宽度
  carMaxSize: 6     #大车最大存放玻璃数量
  galssGap: 20      #玻璃间距
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/test/java/com/mes/CacheVerticalGlassModuleApplicationTest.java
@@ -1,5 +1,6 @@
package com.mes;
import com.mes.base.entity.BigStorageCageBaseInfo;
import com.mes.bigstorage.service.BigStorageCageService;
import com.mes.common.config.Const;
import com.mes.job.PlcStorageCageTask;
@@ -40,74 +41,57 @@
    }
    @Test
    public void updateSlotRemain() {
        List<String> taskGlassIds = Arrays.asList(
//                "P24060403|1|1",
//                "P24060403|1|2",
//                "P24060403|1|3",
//                "P24060403|1|4",
                "P24060403|1|5");
        List<BigStorageCageBaseInfo> list = new ArrayList<>();
        list.add(new BigStorageCageBaseInfo("P24060403|1|1", 1080.0, 4));
        list.add(new BigStorageCageBaseInfo("P24060403|1|2", 1080.0, 1));
        list.add(new BigStorageCageBaseInfo("P24060403|1|3", 1080.0, 1));
        list.add(new BigStorageCageBaseInfo("P24060403|1|4", 1080.0, 16));
        list.add(new BigStorageCageBaseInfo("P24060403|1|5", 1080.0, 15));
        plcStorageCageTask.updateSlotRemain(list, taskGlassIds);
    }
    @Test
    public void plcToHomeEdgOutTask() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        plcStorageCageTask.plcToHomeEdgOutTask();
    }
    @Test
    public void plcToHomeEdgFreeCarTask() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        plcStorageCageTask.plcToHomeEdgFreeCarTask();
    }
    @Test
    public void plcStorageCageTask() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        List<String> list = new ArrayList<>();
        //2002
//        list.add("P24060403|4|3");
//        list.add("P24060403|5|4");
//        list.add("P24060403|2|1");
//        list.add("P24060403|3|2");
//        list.add("P24060403|1|3");
//        list.add("P24060403|3|1");
//        list.add("P24060403|2|3");
//        list.add("P24060403|1|1");
//        list.add("P24060403|8|6");
//        list.add("P24060403|7|2");
        //2001
//        list.add("P24060403|3|6");
//        list.add("P24060403|5|2");
//        list.add("P24060403|4|4");
//        list.add("P24060403|3|5");
//        list.add("P24060403|5|3");
//        list.add("P24060403|1|2");
//        list.add("P24060403|2|2");
//        list.add("P24060403|5|1");
        list.add("P24060403|2|4");
        list.add("P24060403|1|5");
        list.add("P24060403|4|2");
        list.add("P24060403|1|4");
        list.add("P24060403|4|1");
        list.add("P24060403|8|7");
        for (String e : list) {
            plcStorageCageTask.plcToHomeEdgScan(e);
        }
        plcStorageCageTask.plcToHomeEdgScan();
    }
    @Test
    public void computeTargetByLine() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        plcStorageCageTask.computeTargetByLine(2001);
    }
    @Test
    public void judgeGlassTypeStatus() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        plcStorageCageTask.judgeGlassTypeStatus("P24060403|6|7", Const.A09_OUT_TARGET_POSITION);
    }
    @Test
    public void getStartLine() {
//        log.info("获取大理片笼信息:{}",bigStorageCageService.querybigStorageCageDetail());
        Integer startLine = plcStorageCageTask.getStartLine();
        log.info("---------{}", startLine);
    }
    @Test
    public void selectBigStorageCageUsage() {
//        bigStorageCageService.querybigStorageCageDetail(1);
        log.info("获取大理片笼信息:{}", bigStorageCageService.selectBigStorageCageUsage());
    }