hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/SlotSequenceDTO.java
New file @@ -0,0 +1,38 @@ package com.mes.bigstorage.entity.dto; import lombok.Data; /** * @Author : zhoush * @Date: 2024/6/13 15:51 * @Description: */ @Data public class SlotSequenceDTO { /** * 钢化版图id */ private String engineerId; /** * 钢化版图id */ private Integer temperingLayoutId; /** * 大理片详情中格子号 */ private Integer slot; /** * 格子内的最大序号 */ private Integer maxSequence; /** * 格子内的最小序号 */ private Integer minSequence; /** * 格子剩余宽度 */ private Integer remainWidth; } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/entity/dto/TemperingLayoutDTO.java
@@ -22,4 +22,9 @@ * 当前版图数量 */ private Integer count; /** * 当前版图占用格子数量 */ private Integer slotCount; } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/mapper/BigStorageCageDetailsMapper.java
@@ -2,7 +2,11 @@ import com.github.yulichang.base.MPJBaseMapper; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.entity.dto.SlotSequenceDTO; import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; import org.apache.ibatis.annotations.Param; import java.util.List; /** @@ -22,4 +26,13 @@ */ TemperingLayoutDTO temperingIsAll(); /** * 获取每个钢化版图占用的格子数量 * * @return */ TemperingLayoutDTO queryTemperingOccupySlot(@Param(value = "count") int count); List<SlotSequenceDTO> queryGlassMaxAndMin(@Param(value = "engineerId") String engineerId, @Param(value = "temperingLayoutId") Integer temperingLayoutId); } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/BigStorageCageDetailsService.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.entity.BigStorageDTO; import com.mes.bigstorage.entity.dto.SlotSequenceDTO; import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; import com.mes.glassinfo.entity.GlassInfo; @@ -41,5 +42,26 @@ */ BigStorageDTO queryTargetSlotByTempering(GlassInfo glassInfo); /** * 获取钢化版图已经到齐的工程号及版图id * * @return */ TemperingLayoutDTO temperingIsAll(); /** * 获取每个钢化版图占用的格子数量 * * @return */ TemperingLayoutDTO queryTemperingOccupySlot(); /** * 获取版图每个格子的最大最小序号 * * @param engineerId * @param temperingLayoutId * @return */ List<SlotSequenceDTO> queryGlassMaxAndMin(String engineerId, Integer temperingLayoutId); } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/bigstorage/service/impl/BigStorageCageDetailsServiceImpl.java
@@ -7,6 +7,7 @@ import com.mes.bigstorage.entity.BigStorageCage; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.entity.BigStorageDTO; import com.mes.bigstorage.entity.dto.SlotSequenceDTO; import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; import com.mes.bigstorage.mapper.BigStorageCageDetailsMapper; import com.mes.bigstorage.service.BigStorageCageDetailsService; @@ -21,6 +22,7 @@ import com.mes.temperingglass.entity.TemperingGlassInfo; import com.mes.temperingglass.mapper.TemperingGlassInfoMapper; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -49,6 +51,9 @@ private BigStorageCageService bigStorageCageService; @Resource private GlassInfoMapper glassInfoMapper; @Value("${mes.minCount}") private int minCount; /** * 查询进/出片任务 @@ -259,4 +264,15 @@ public TemperingLayoutDTO temperingIsAll() { return baseMapper.temperingIsAll(); } @Override public TemperingLayoutDTO queryTemperingOccupySlot() { return baseMapper.queryTemperingOccupySlot(minCount); } @Override public List<SlotSequenceDTO> queryGlassMaxAndMin(String engineerId, Integer temperingLayoutId) { return baseMapper.queryGlassMaxAndMin(engineerId, temperingLayoutId); } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/java/com/mes/job/PlcStorageCageTask.java
@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.mes.bigstorage.entity.BigStorageCageDetails; import com.mes.bigstorage.entity.BigStorageDTO; import com.mes.bigstorage.entity.dto.SlotSequenceDTO; import com.mes.bigstorage.entity.dto.TemperingLayoutDTO; import com.mes.bigstorage.service.BigStorageCageDetailsService; import com.mes.bigstorage.service.BigStorageCageService; @@ -62,6 +63,9 @@ @Value("${mes.sequence.order}") private boolean sequenceOrder; @Value("${mes.slotWidth}") private Integer slotWidth; public static boolean bigStorageCageFullAlarm = false; @@ -285,13 +289,13 @@ return; } //todo:获取状态字 钢化优先 or 人工下片优先 //获取状态字 钢化优先 or 人工下片优先 if (true) { //todo:钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 //钢化优先:获取理片笼 玻璃小片 破损表 数量 判断笼内版图是否到齐 TemperingLayoutDTO temperingLayoutDTO = bigStorageCageDetailsService.temperingIsAll(); if (null != temperingLayoutDTO) { //玻璃到齐 //todo: 到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 //到齐,将玻璃小片数据存入钢化小片表,逻辑生成出片任务 结束 List<BigStorageCageDetails> bigStorageCageDetails = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() .eq(BigStorageCageDetails::getTemperingLayoutId, temperingLayoutDTO.getTemperingLayoutId()) .eq(BigStorageCageDetails::getEngineerId, temperingLayoutDTO.getEngineerId())); @@ -302,7 +306,7 @@ }).collect(Collectors.toList()); temperingGlassInfoService.saveBatch(temperingGlassInfos); //打车剩余尺寸 //大车剩余尺寸 AtomicReference<Integer> remainWidth = new AtomicReference<>(Const.BIG_STORAGE_WIDTH); temperingGlassInfoList.stream().forEach(e -> { if (bigStorageCageOutTaskList.size() > 5 || e.getWidth() > remainWidth.get()) { @@ -315,11 +319,41 @@ bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); return; } //todo: 未到齐 执行内部调度任务 结束 //未到齐 执行内部调度任务 结束 TemperingLayoutDTO temperingOccupySlot = bigStorageCageDetailsService.queryTemperingOccupySlot(); if (null != temperingOccupySlot) { 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); if (first.getMinSequence() == second.getMaxSequence() + 1 && second.getRemainWidth() > Const.BIG_STORAGE_WIDTH - first.getRemainWidth() - Const.BIG_STORAGE_GAP) { List<BigStorageCageDetails> list = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() .eq(BigStorageCageDetails::getSlot, first.getSlot()).eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN)); List<BigStorageCageOutTask> outTasks = list.stream().map(e -> new BigStorageCageOutTask(e.getGlassId(), first.getSlot(), second.getSlot(), 0, 0, 1)).collect(Collectors.toList()); bigStorageCageOutTaskService.saveBatch(outTasks); return; } } } } //todo:笼内是否有人工下片玻璃 有直接出 无 结束 //笼内是否有人工下片玻璃 有直接出 无 结束 List<BigStorageCageDetails> oneList = bigStorageCageDetailsService.list(new LambdaQueryWrapper<BigStorageCageDetails>() .eq(BigStorageCageDetails::getState, Const.GLASS_STATE_IN).orderByDesc(BigStorageCageDetails::getWidth)); AtomicReference<Integer> remainWidth = new AtomicReference<>(Const.BIG_STORAGE_WIDTH); if (CollectionUtils.isNotEmpty(oneList)) { oneList.stream().forEach(e -> { if (remainWidth.get() < e.getWidth().intValue()) { return; } bigStorageCageOutTaskList.add(new BigStorageCageOutTask(e.getGlassId(), e.getSlot(), 0, 0, 0, 1)); remainWidth.set(remainWidth.get() - e.getWidth().intValue() - Const.BIG_STORAGE_GAP); }); bigStorageCageOutTaskService.saveBatch(bigStorageCageOutTaskList); return; } } hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/application.yml
@@ -12,4 +12,6 @@ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl mes: sequence: order: false order: false minCount: 5 slotWidth: 5000 hangzhoumesParent/moduleService/CacheVerticalGlassModule/src/main/resources/mapper/BigStorageCageDetailsMapper.xml
@@ -6,14 +6,18 @@ <result column="engineer_id" property="engineerId"/> <result column="tempering_layout_id" property="temperingLayoutId"/> <result column="count" property="count"/> <result column="slot_count" property="slotCount"/> </resultMap> <!-- <select id="listAllTemperingCount" resultMap="temperingLayoutDTO">--> <!-- select tempering_layout_id,--> <!-- count(tempering_layout_id) as count--> <!-- from big_storage_cage_details--> <!-- where state = 100--> <!-- group by tempering_layout_id--> <!-- </select>--> <resultMap id="slotSequenceDTO" type="com.mes.bigstorage.entity.dto.SlotSequenceDTO"> <result column="engineer_id" property="engineerId"/> <result column="tempering_layout_id" property="temperingLayoutId"/> <result column="slot" property="slot"/> <result column="max_sequence" property="maxSequence"/> <result column="min_sequence" property="minSequence"/> <result column="remain_width" property="remainWidth"/> </resultMap> <select id="temperingIsAll" resultMap="temperingLayoutDTO"> SELECT T.ENGINEER_ID, T.TEMPERING_LAYOUT_ID, @@ -41,4 +45,32 @@ LIMIT 1 </select> <select id="queryTemperingOccupySlot" resultMap="temperingLayoutDTO"> SELECT TEMPERING_LAYOUT_ID, COUNT(DISTINCT SLOT) as SLOT_COUNT FROM BIG_STORAGE_CAGE_DETAILS WHERE STATE = 100 GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID HAVING SLOT_COUNT >= #{count} LIMIT 1 </select> <select id="queryGlassMaxAndMin" resultMap="slotSequenceDTO"> SELECT T.*, T1.REMAIN_WIDTH FROM ( SELECT ENGINEER_ID, TEMPERING_LAYOUT_ID, SLOT, MAX(TEMPERING_FEED_SEQUENCE) AS MAX_SEQUENCE, MIN(TEMPERING_FEED_SEQUENCE) AS MIN_SEQUENCE FROM BIG_STORAGE_CAGE_DETAILS WHERE ENGINEER_ID = #{engineerId} AND TEMPERING_LAYOUT_ID = #{temperingLayoutId} GROUP BY ENGINEER_ID, TEMPERING_LAYOUT_ID, SLOT ) T INNER JOIN BIG_STORAGE_CAGE T1 ON T.SLOT = T1.SLOT ORDER BY T.MAX_SEQUENCE DESC </select> </mapper>