zhoushihao
2025-10-23 da620e4cf3aa0b6071c817327c6b0b52bbde66af
1、 钢化前大理片笼调度任务已完成
5个文件已修改
1个文件已添加
185 ■■■■ 已修改文件
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageSlotDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageDetailsMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageNewTask.java 114 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/BigStorageSlotDTO.java
New file
@@ -0,0 +1,22 @@
package com.mes.bigstorage.entity.dto;
import lombok.Data;
/**
 * @Author : zhoush
 * @Date: 2024/11/25 18:53
 * @Description:
 */
@Data
public class BigStorageSlotDTO {
    /**
     * 起始格子
     */
    private Integer startSlot;
    /**
     * 目标格子
     */
    private Integer targetSlot;
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageDetailsMapper.java
@@ -66,4 +66,9 @@
    void updateDeviceIdBySlot(@Param("list") List<Integer> slotList);
    List<BigStorageVO> querybigStorageCageDetail();
    List<BigStorageCageDetails> queryNeedDispatch();
    BigStorageSlotDTO queryNeedDispatchSlotBySequence();
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -142,4 +142,12 @@
     * @return
     */
    List<BigStorageCageDetails> queryEngineer();
    /**
     * 查询4号笼可往5-6号笼不满格却满足个别的调度
     * @return
     */
    List<BigStorageCageDetails> queryNeedDispatch();
    BigStorageSlotDTO queryNeedDispatchSlotBySequence();
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -29,7 +29,6 @@
import com.mes.glassinfo.entity.GlassInfo;
import com.mes.glassinfo.mapper.GlassInfoMapper;
import com.mes.glassinfo.service.GlassInfoService;
import com.mes.pp.entity.OptimizeProject;
import com.mes.sysconfig.entity.SysConfig;
import com.mes.sysconfig.service.SysConfigService;
import com.mes.temperingglass.entity.TemperingGlassInfo;
@@ -578,4 +577,14 @@
                .eq("state", 100);
        return this.list(wrapper);
    }
    @Override
    public List<BigStorageCageDetails> queryNeedDispatch() {
        return baseMapper.queryNeedDispatch();
    }
    @Override
    public BigStorageSlotDTO queryNeedDispatchSlotBySequence() {
        return baseMapper.queryNeedDispatchSlotBySequence();
    }
}
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/OpcPlcStorageCageNewTask.java
@@ -14,10 +14,7 @@
import com.mes.base.entity.BigStorageCageBaseInfo;
import com.mes.bigstorage.entity.BigStorageCage;
import com.mes.bigstorage.entity.BigStorageCageDetails;
import com.mes.bigstorage.entity.dto.BigStorageDTO;
import com.mes.bigstorage.entity.dto.BigStorageRelationDTO;
import com.mes.bigstorage.entity.dto.BigStorageSequenceDTO;
import com.mes.bigstorage.entity.dto.TemperingLayoutDTO;
import com.mes.bigstorage.entity.dto.*;
import com.mes.bigstorage.service.BigStorageCageDetailsService;
import com.mes.bigstorage.service.BigStorageCageService;
import com.mes.bigstorage.service.BigStorageGlassInfoService;
@@ -160,9 +157,9 @@
            return;
        }
        log.info("获取任务的玻璃id:{}", glassIdList);
        String countEntity = s7DataDLPOne.getGlassCount().toString();
        if (null == countEntity || Integer.parseInt(countEntity) != glassIdList.size()) {
            log.info("当前大车进片玻璃数量{}与mes读取到的数量{}不匹配,结束进片任务", countEntity, glassIdList.size());
        Integer glassCount = s7DataDLPOne.getGlassCount();
        if (glassCount != glassIdList.size()) {
            log.info("当前大车进片玻璃数量{}与mes读取到的数量{}不匹配,结束进片任务", glassCount, glassIdList.size());
            //向plc发送报警:当前大车进片玻璃数量与mes读取到的数量不匹配
            s7DataDLPOne = new S7DataDLPOne();
            s7DataDLPOne.setAlarmSignal(1);
@@ -381,17 +378,16 @@
            log.info("有正在执行的出片任务,结束本次出片任务");
            return;
        }
        Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP);
        Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH);
        Integer slotMaxThickness = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_MAX_THICKNESS);
        Integer slotMaxHeight = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_MAX_HEIGHT);
        List<BigStorageCageDetails> detailsList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                .eq(BigStorageCageDetails::getSlot, THROUGH_SLOT)
                .in(BigStorageCageDetails::getState, Const.GLASS_STATE_IN_ALL).orderByAsc(BigStorageCageDetails::getId));
        if (CollectionUtil.isNotEmpty(detailsList)) {
            List<BigStorageCageHistoryTask> historyTasks = new ArrayList<>();
            List<BigStorageCageTask> taskList = new ArrayList<>();
            Integer glassGap = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_GLASS_GAP);
            Integer slotWidth = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_WIDTH);
            Integer slotMaxThickness = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_MAX_THICKNESS);
            Integer slotMaxHeight = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_SLOT_MAX_HEIGHT);
            for (BigStorageCageDetails info : detailsList) {
                BigStorageCageTask task = new BigStorageCageTask();
                task.setGlassId(info.getGlassId());
@@ -399,11 +395,12 @@
                task.setTaskState(Const.ENGINEERING_NEW);
                LambdaQueryWrapper<BigStorageCage> queryWrapper = new LambdaQueryWrapper<BigStorageCage>()
                        .eq(BigStorageCage::getRemainWidth, slotWidth).orderByAsc(BigStorageCage::getSlot)
                        .eq(BigStorageCage::getRemainWidth, slotWidth)
                        .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
                        .orderByAsc(BigStorageCage::getDeviceId).orderByAsc(BigStorageCage::getSlot)
                        .last("limit 1");
                if (slotMaxHeight > Math.min(info.getWidth(), info.getHeight()) && info.getThickness() < slotMaxThickness) {
                if (slotMaxHeight > Math.min(info.getWidth(), info.getHeight())) {
                    queryWrapper.in(BigStorageCage::getDeviceId, Arrays.asList(5, 6));
                } else {
                    queryWrapper.eq(BigStorageCage::getDeviceId, 6);
@@ -430,7 +427,7 @@
                cageDetails.setState(Const.GLASS_STATE_NEW);
                cageDetails.setDeviceId(bigStorageCage.getDeviceId());
                cageDetails.setSequence(0);
                cageDetails.setAngle((int) info.getAngle());
                cageDetails.setAngle(info.getAngle());
                cageDetails.setGap(glassGap);
                cageDetails.setFilmsId(info.getFilmsId());
                cageDetails.setId(null);
@@ -501,7 +498,8 @@
        Integer outCarMaxSize = sysConfigService.queryConfigValue(ConstSysConfig.VERTICAL_OUT_CAR_SIZE);
        List<BigStorageCageDetails> artificialList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_ARTIFICIAL)
                .orderByAsc(BigStorageCageDetails::getSlot)
                .orderByAsc(BigStorageCageDetails::getDeviceId)
                .orderByAsc(BigStorageCageDetails::getId)
                .orderByAsc(BigStorageCageDetails::getId).last("limit " + outCarMaxSize));
        if (CollectionUtil.isNotEmpty(artificialList)) {
            computeOutGlassInfoByVirtualSlot(artificialList, "big_storage_cage_out_one_task", artificialOutTargetPosition, Const.GLASS_STATE_OUT_ING, Const.BIG_STORAGE_BEFORE_OUT);
@@ -523,14 +521,68 @@
                log.info("有正在执行的进片任务,结束调度任务");
                return;
            }
//todo:4号获取笼内单格已经到齐的玻璃格子信息
//4号获取笼内单格已经到齐的玻璃格子信息
            List<BigStorageCageDetails> list = new ArrayList<>();
            List<BigStorageRelationDTO> virtualList = bigStorageCageDetailsService.queryIsAllNeedDispatchVirtualSlot(Arrays.asList(4));
            for (BigStorageRelationDTO dto : virtualList) {
                List<BigStorageSequenceDTO> sequenceDTOList = bigStorageCageDetailsService.dispatchBigStorageGlassInfo(dto);
                if (CollectionUtil.isEmpty(sequenceDTOList) || sequenceDTOList.size() == 1) {
                    continue;
                }
                BigStorageCage bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                        .eq(BigStorageCage::getRemainWidth, slotWidth)
                        .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
                        .in(BigStorageCage::getDeviceId, Arrays.asList(5, 6))
                        .orderByAsc(BigStorageCage::getDeviceId).orderByAsc(BigStorageCage::getSlot)
                        .last("limit 1"));
                List<Integer> slotList = sequenceDTOList.stream().map(BigStorageSequenceDTO::getSlot).collect(Collectors.toList());
                list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                        .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN).in(BigStorageCageDetails::getSlot, slotList));
                computeOutGlassInfoByVirtualSlot(list, "big_storage_cage_out_one_task",
                        bigStorageCage.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH);
                slotList.add(bigStorageCage.getSlot());
                updateSlotRemainBySlots(slotList);
            }
            //有:统一往5号笼子送
//            todo:无 4号笼子使用数量是否超过阈值 有 生成调度任务按照组号组序由1开始依次往5号笼子送小片
//            无 4号笼子使用数量是否超过阈值 有 生成调度任务按照组号组序由1开始依次往5号笼子送小片
            int count = bigStorageCageService.count(new LambdaQueryWrapper<BigStorageCage>().eq(BigStorageCage::getDeviceId, 4).eq(BigStorageCage::getRemainWidth, slotWidth)
                    .eq(BigStorageCage::getEnableState, Const.SLOT_ON));
            //定义10个格子为阈值
            if (count <= 10) {
                //获取序号为1的格子 将格子内的所有玻璃送到对应的笼子
                BigStorageCage bigStorageCage = bigStorageCageService.getOne(new LambdaQueryWrapper<BigStorageCage>()
                        .eq(BigStorageCage::getRemainWidth, slotWidth)
                        .eq(BigStorageCage::getEnableState, Const.SLOT_ON)
                        .in(BigStorageCage::getDeviceId, Arrays.asList(5, 6))
                        .orderByAsc(BigStorageCage::getDeviceId).orderByAsc(BigStorageCage::getSlot)
                        .last("limit 1"));
                list = bigStorageCageDetailsService.queryNeedDispatch();
                computeOutGlassInfoByVirtualSlot(list, "big_storage_cage_out_one_task",
                        bigStorageCage.getSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH);
                List<Integer> slotList = new ArrayList<>();
                slotList.add(bigStorageCage.getSlot());
                slotList.add(list.get(0).getSlot());
                updateSlotRemainBySlots(slotList);
                return;
            }
            //生成调度任务按照组号组序由1开始依次往5号笼子送小片
            BigStorageSlotDTO slotDTO = bigStorageCageDetailsService.queryNeedDispatchSlotBySequence();
            if (null != slotDTO) {
                list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>()
                        .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN).in(BigStorageCageDetails::getSlot, slotDTO.getStartSlot()));
                computeOutGlassInfoByVirtualSlot(list, "big_storage_cage_out_one_task",
                        slotDTO.getTargetSlot(), Const.GLASS_STATE_SCHEDULE_ING, Const.BIG_STORAGE_BEFORE_DISPATCH);
                List<Integer> slotList = new ArrayList<>();
                slotList.add(slotDTO.getStartSlot());
                slotList.add(slotDTO.getTargetSlot());
                updateSlotRemainBySlots(slotList);
                return;
            }
            //1-3号获取笼内单格已经到齐的玻璃格子信息
            virtualList = bigStorageCageDetailsService.queryIsAllNeedDispatchVirtualSlot(Arrays.asList(1, 2, 3));
            if (CollectionUtil.isNotEmpty(virtualList)) {
                List<BigStorageCageDetails> list = new ArrayList<>();
                loop:
                for (BigStorageRelationDTO dto : virtualList) {
                    List<BigStorageSequenceDTO> sequenceDTOList = bigStorageCageDetailsService.dispatchBigStorageGlassInfo(dto);
@@ -904,17 +956,17 @@
    computeOutGlassInfoByVirtualSlot(List<T> list, String tableName, int targetSlot, int state, int taskType) {
        //任务数据:获取车子存放玻璃最大数量,玻璃间隔
        List<T> outGlassList = list;
        if (!THROUGH_SLOT.equals(list.get(0).getSlot())) {
            //todo:临时解决方案:出片时考虑玻璃碰撞,改为一片一出
            // 界面关闭调度开关 !Const.BIG_STORAGE_BEFORE_DISPATCH.equals(taskType)
            if (list.get(0).getThickness() >= 8) {
                outGlassList = list.subList(0, 1);
            } else {
                List<String> glassIdList = bigStorageGlassRelationInfoService.queryNeedOutGlassId(
                        list.get(0).getEngineerId(), list.get(0).getTemperingLayoutId(), list.get(0).getTemperingFeedSequence());
                outGlassList = list.stream().filter(e -> glassIdList.contains(e.getGlassId())).collect(Collectors.toList());
            }
//        if (!THROUGH_SLOT.equals(list.get(0).getSlot())) {
//            临时解决方案:出片时考虑玻璃碰撞,改为一片一出
        // 界面关闭调度开关 !Const.BIG_STORAGE_BEFORE_DISPATCH.equals(taskType)
        if (list.get(0).getSlot() >= 500 && list.get(0).getThickness() > 8) {
            outGlassList = list.subList(0, 1);
        } else {
            List<String> glassIdList = bigStorageGlassRelationInfoService.queryNeedOutGlassId(
                    list.get(0).getEngineerId(), list.get(0).getTemperingLayoutId(), list.get(0).getTemperingFeedSequence());
            outGlassList = list.stream().filter(e -> glassIdList.contains(e.getGlassId())).collect(Collectors.toList());
        }
//        }
        Assert.isFalse(CollectionUtil.isEmpty(outGlassList), "未获取出片数据,结束出片任务");
        log.info("获取出片任务数据{}条,执行保存", outGlassList.size());
        List<BigStorageCageTask> bigStorageCageTaskList = outGlassList.stream()
@@ -922,10 +974,6 @@
        List<String> glassIds = bigStorageCageTaskList.stream().map(BigStorageCageTask::getGlassId).collect(Collectors.toList());
        int glassCount = bigStorageCageTaskList.size();
        //生成出片任务条数不足6补全
//        while (bigStorageCageTaskList.size() < 6) {
//            bigStorageCageTaskList.add(new BigStorageCageTask("", 0, 0, 0));
//        }
        //清空任务表数据
        extracted(bigStorageCageTaskList);
        S7DataDLPTwo s7DataDLPTwo;
hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -301,4 +301,29 @@
        group by bsc.device_id, bsc.slot
        order by bsc.device_id, bsc.slot
    </select>
    <select id="queryNeedDispatch" resultType="com.mes.bigstorage.entity.BigStorageCageDetails">
        SELECT * FROM big_storage_cage_details WHERE STATE = 100 AND SLOT = (SELECT SLOT FROM big_storage_cage_details WHERE STATE = 100 AND sequence = 1 order by slot desc LIMIT 1) ORDER BY tempering_feed_sequence
    </select>
    <select id="queryNeedDispatchSlotBySequence" resultType="com.mes.bigstorage.entity.dto.BigStorageSlotDTO">
        with glass_temp as (
        select t.* ,t1.virtual_slot,t1.slot_sequence from big_storage_cage_details t inner join
        big_storage_glass_relation_info t1 on t.engineer_id = t1.engineer_id
        and t.tempering_layout_id = t1.tempering_layout_id
        and t.tempering_feed_sequence = t1.tempering_feed_sequence where t.state = 100
        ),slot_max_temp as (
        select ROW_NUMBER()over(PARTITION by engineer_id, tempering_layout_id, virtual_slot order by slot_sequence desc)
        as rn,t.* from glass_temp t where t.device_id in (5,6)
        ) ,slot_max_message as (select * from slot_max_temp where rn =1)
        ,slot_min_temp as (
        select ROW_NUMBER()over(PARTITION by engineer_id, tempering_layout_id, virtual_slot order by slot_sequence) as
        rn,t.* from glass_temp t where t.device_id in (5,6)
        ) ,slot_min_message as (select * from slot_min_temp where rn =1)
        ,result as (
        select t.slot as target_slot ,t1.slot as start_slot from slot_max_message t inner join slot_min_message t1 on
        t.engineer_id = t1.engineer_id and t.tempering_layout_id = t1.tempering_layout_id and t.virtual_slot =
        t1.virtual_slot and t.tempering_layout_id = t1.tempering_layout_id and t.tempering_feed_sequence =
        t1.tempering_feed_sequence -1
        )select * from result limit 1
    </select>
</mapper>