UI-Project/src/views/GlassStorage/MaterialRackManagement.vue
@@ -73,9 +73,16 @@ ref="table" empty-text="No Data" > <template #header> <div style="display: flex; align-items: center;"> <span style="font-size: 16px; font-weight: bold; margin-right: 20px;">任务列表</span> </div> </template> <el-table-column prop="Glassid" label="Glassid"></el-table-column> <el-table-column prop="taskDescription" label="任务描述" width="250"></el-table-column> <el-table-column prop="taskStatus" label="任务状态"></el-table-column> <el-table-column prop="glassThickness" label="玻璃厚度"></el-table-column> <el-table-column prop="glassFilm" label="玻璃膜系"></el-table-column> <el-table-column prop="creationTime" label="创建时间"></el-table-column> hangzhoumesParent/common/servicebase/src/main/java/com/mes/common/config/WebSocketConfig.java
@@ -13,9 +13,9 @@ * bean注册:会自动扫描带有@ServerEndpoint注解声明的Websocket Endpoint(端点),注册成为Websocket bean。 * 要注意,如果项目使用外置的servlet容器,而不是直接使用springboot内置容器的话,就不要注入ServerEndpointExporter,因为它将由容器自己提供和管理。 */ // @Bean // public ServerEndpointExporter serverEndpointExporter() { // return new ServerEndpointExporter(); // } @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } hangzhoumesParent/common/servicebase/src/main/java/com/mes/glassinfo/service/impl/GlassInfoServiceImpl.java
@@ -4,14 +4,12 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.yulichang.base.MPJBaseServiceImpl; import com.github.yulichang.query.MPJQueryWrapper; import com.github.yulichang.toolkit.JoinWrappers; import com.mes.glassinfo.entity.GlassInfo; import com.mes.glassinfo.entity.OptimizeGlassinfo; import com.mes.glassinfo.mapper.GlassInfoMapper; import com.mes.glassinfo.service.GlassInfoService; import com.mes.pp.entity.OptimizeProject; import com.mes.pp.mapper.OptimizeProjectMapper; import com.mes.uppattenusage.entity.UpPattenUsage; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -35,6 +33,7 @@ public class GlassInfoServiceImpl extends MPJBaseServiceImpl<GlassInfoMapper, GlassInfo> implements GlassInfoService { @Autowired OptimizeProjectMapper optimizeProjectMapper; @Override @DS("pp") public List<GlassInfo> selectGlassInfo(String engineeringId) { @@ -88,16 +87,11 @@ } @Override public int getGlassInfoCountByFlowCardId(String flowCardId) { return baseMapper.selectCount(new QueryWrapper<GlassInfo>().lambda() .eq(GlassInfo::getFlowCardId, flowCardId)); } @Override @@ -131,12 +125,6 @@ log.info("result: {}", result); return result; } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/mapper/DownGlassInfoMapper.java
@@ -1,11 +1,13 @@ package com.mes.downglassinfo.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.github.yulichang.base.MPJBaseMapper; import com.mes.downglassinfo.entity.DownGlassInfo; import com.mes.glassinfo.entity.GlassInfo; import org.springframework.stereotype.Repository; @Repository public interface DownGlassInfoMapper extends BaseMapper<DownGlassInfo> { public interface DownGlassInfoMapper extends BaseMapper<DownGlassInfo>, MPJBaseMapper<DownGlassInfo> { hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downglassinfo/service/impl/DownGlassTaskServiceImpl.java
@@ -5,15 +5,21 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.mes.downglassinfo.entity.DownGlassInfo; import com.mes.downglassinfo.entity.DownGlassTask; import com.mes.downglassinfo.mapper.DownGlassInfoMapper; import com.mes.downglassinfo.mapper.DownGlassTaskMapper; import com.mes.downglassinfo.service.DownGlassInfoService; import com.mes.downglassinfo.service.DownGlassTaskService; import com.mes.downworkstation.entity.DownWorkstation; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * <p> @@ -27,15 +33,33 @@ @Service public class DownGlassTaskServiceImpl extends ServiceImpl<DownGlassTaskMapper, DownGlassTask> implements DownGlassTaskService { @Autowired private DownGlassInfoService downGlassInfoService; // MySQL Mapper @Autowired private DownGlassTaskMapper downGlassTaskMapper; // SQL Server Mapper @Override public List<DownGlassTask> getUnloadingTaskState() { log.info("出片或直通任务状态为1 的任务"); log.info("排除已经下片的出片或直通任务状态为1的任务"); // Step 1: 从 MySQL 中获取玻璃 ID 列表 // Step 2: 从 SQL Server 中过滤掉这些玻璃 ID 并查询任务 QueryWrapper<DownGlassTask> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("task_stauts", 1).eq("task_type", 2).or().eq("task_type", 3); queryWrapper.eq("task_stauts", 1) .and(qw -> qw.eq("task_type", 2).or().eq("task_type", 3)); List<DownGlassInfo> excludedGlassIds = downGlassInfoService.list(); if (!excludedGlassIds.isEmpty()) { queryWrapper.notIn("glass_id", excludedGlassIds.stream().map(DownGlassInfo::getGlassId).collect(Collectors.toList())); } log.info(String.valueOf(excludedGlassIds)); return baseMapper.selectList(queryWrapper); } @Override public void updateTaskState(String id) { UpdateWrapper<DownGlassTask> updateWrapper = new UpdateWrapper<>(); hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/DownStorageCageDetailsService.java
@@ -56,7 +56,17 @@ /** * @param start * @param end * @return 根据传入的料架号 查询符合按照流程卡中顺序出片的小片 */ List<DownStorageCageDetails> CacheOut2(int start, int end); // /** // * @return 直通查询 // */ // List<GlassInfo> DirectConnection(); /** * @return 直通查询 */ List<GlassInfo> DirectConnection(); boolean DirectConnection(GlassInfo glassInfo); } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/downstorage/service/impl/DownStorageCageDetailsServiceImpl.java
@@ -162,23 +162,39 @@ // // } // @Override // public List<GlassInfo> DirectConnection(){ // LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery(); // queryWrapper2.select(GlassInfo::getFlowCardId, // GlassInfo::getGlassId, // GlassInfo::getTemperingLayoutId, // GlassInfo::getTemperingFeedSequence) // .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info") // .orderByAsc(GlassInfo::getTemperingLayoutId) // .orderByDesc(GlassInfo::getTemperingFeedSequence) // .last("LIMIT 1"); // // // 查询 GlassInfo 表 // log.info("直通查询"); // return glassInfoMapper.selectList(queryWrapper2); // // }; @Override public List<GlassInfo> DirectConnection(){ LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery(); queryWrapper2.select(GlassInfo::getFlowCardId, GlassInfo::getGlassId, GlassInfo::getTemperingLayoutId, GlassInfo::getTemperingFeedSequence) public boolean DirectConnection(GlassInfo glassInfo) { LambdaQueryWrapper<GlassInfo> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(GlassInfo::getGlassId, glassInfo.getGlassId()) .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info") .orderByAsc(GlassInfo::getTemperingLayoutId) .orderByDesc(GlassInfo::getTemperingFeedSequence) .orderByDesc(GlassInfo::getGlassType) .groupBy(GlassInfo::getFlowCardId) .last("LIMIT 1"); // 查询 GlassInfo 表 log.info("直通查询"); return glassInfoMapper.selectList(queryWrapper2); // 查询符合条件的 GlassInfo 记录数量 int count = glassInfoMapper.selectCount(queryWrapper); }; return count > 0; } @@ -197,7 +213,6 @@ if (cageDetails.size() == 9) { log.info("1、笼子满了的时候,按照笼内版图id 版图片序出"); List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end)); List<String> flowCardIds = new ArrayList<>(); for (DownWorkstation workstation : workstationList) { @@ -221,12 +236,10 @@ // Step 1: 查询 DownWorkstation 表获取对应 workstation_id 的 flow_card_id List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end)); List<String> flowCardIds = new ArrayList<>(); for (DownWorkstation workstation : workstationList) { flowCardIds.add(workstation.getFlowCardId()); } if (flowCardIds.isEmpty()) { log.error("2、未找到对应的 flow_card_id"); return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定 @@ -254,7 +267,6 @@ cageDetailsQueryWrapper.in(DownStorageCageDetails::getGlassId, glassIds); cageDetailsQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds); cageDetailsQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN); log.info("按照流程卡的版图id 版图片序出"); // Step 4: 查询 down_storage_cage_details 表并返回结果 return downStorageCageDetailsMapper.selectList(cageDetailsQueryWrapper); @@ -264,4 +276,78 @@ } @Override public List<DownStorageCageDetails> CacheOut2(int start, int end) { // 创建一个 LambdaQueryWrapper 实例 LambdaQueryWrapper<DownStorageCageDetails> lambdaQueryWrapper = new LambdaQueryWrapper<>(); // 条件 state=100 lambdaQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN); List<DownStorageCageDetails> cageDetails = downStorageCageDetailsMapper.selectList(lambdaQueryWrapper); // Step 5: 判断 down_storage_cage_details 结果数量是否为9,如果是,则执行另外一个查询 if (cageDetails.size() == 9) { log.info("1、笼子满了的时候,按照笼内流程卡顺序出 GlassType目前是流程卡中的顺序"); List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end)); List<String> flowCardIds = new ArrayList<>(); for (DownWorkstation workstation : workstationList) { flowCardIds.add(workstation.getFlowCardId()); } if (flowCardIds.isEmpty()) { log.error("未找到对应的 flow_card_id"); return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定 } LambdaQueryWrapper<DownStorageCageDetails> anotherQueryWrapper = Wrappers.lambdaQuery(); anotherQueryWrapper.orderByAsc(DownStorageCageDetails::getGlassType); anotherQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds); anotherQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN); anotherQueryWrapper.last("LIMIT 1"); return downStorageCageDetailsMapper.selectList(anotherQueryWrapper); } else { // Step 1: 查询 DownWorkstation 表获取对应 workstation_id 的 flow_card_id List<DownWorkstation> workstationList = downWorkstationMapper.selectList(new QueryWrapper<DownWorkstation>().between("workstation_id", start, end)); List<String> flowCardIds = new ArrayList<>(); for (DownWorkstation workstation : workstationList) { flowCardIds.add(workstation.getFlowCardId()); } if (flowCardIds.isEmpty()) { log.error("2、未找到对应的 flow_card_id"); return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定 } log.info("流程卡:{}", flowCardIds); LambdaQueryWrapper<GlassInfo> queryWrapper2 = Wrappers.lambdaQuery(); queryWrapper2.select(GlassInfo::getFlowCardId, GlassInfo::getGlassId) .notInSql(GlassInfo::getGlassId, "SELECT glass_id FROM down_glass_info") .orderByAsc(GlassInfo::getGlassType) .last("LIMIT 1"); // 查询 GlassInfo 表 List<GlassInfo> glassInfos = glassInfoMapper.selectList(queryWrapper2); if (glassInfos.isEmpty()) { log.error("未找到对应的玻璃信息"); return Collections.emptyList(); // 返回空列表或者抛出异常,视情况而定 } // Step 3: 构造查询 down_storage_cage_details 表的条件 List<String> glassIds = glassInfos.stream().map(GlassInfo::getGlassId).collect(Collectors.toList()); LambdaQueryWrapper<DownStorageCageDetails> cageDetailsQueryWrapper = Wrappers.lambdaQuery(); cageDetailsQueryWrapper.in(DownStorageCageDetails::getGlassId, glassIds); cageDetailsQueryWrapper.in(DownStorageCageDetails::getFlowCardId, flowCardIds); cageDetailsQueryWrapper.eq(DownStorageCageDetails::getState, Const.GLASS_STATE_IN); log.info("按照流程卡的顺序出"); // Step 4: 查询 down_storage_cage_details 表并返回结果 return downStorageCageDetailsMapper.selectList(cageDetailsQueryWrapper); } } } hangzhoumesParent/moduleService/UnLoadGlassModule/src/main/java/com/mes/job/DownCacheGlassTask.java
@@ -129,12 +129,12 @@ } } if (("1".equals(G11RobotTaskRequestWord) || "1".equals(G06RobotTaskRequestWord)) || "1".equals(G13RobotTaskRequestWord)) { log.info("4、有机器人下片请求,执行下片任务"); if (("0".equals(G11RobotTaskRequestWord) || "0".equals(G06RobotTaskRequestWord)) || "0".equals(G13RobotTaskRequestWord)) { log.info("4、有下片完成信号更新落架数量"); insertdownglassinfo(); } //自动绑定架子,如果工位表没有绑定架子,默认将笼子中数量最多的流程卡号绑定机器手2的空架子 } @@ -155,9 +155,10 @@ } log.info("2、获取到的玻璃信息为{}", glassInfo); if (glassInfo.getGlassId().equals(downStorageCageDetailsService.DirectConnection())) { if (downStorageCageDetailsService.DirectConnection(glassInfo)) { //直通 log.info("3、如果当前玻璃属于版图id和片序的顺序则直通,执行下片任务"); //log.info("3、如果当前玻璃属于版图id和片序的顺序则直通,执行下片任务"); log.info("3、如果当前玻璃属于流程卡中的片序的顺序则直通,执行下片任务"); DownWorkstation downWorkstation = downWorkstationService.getOne(new LambdaQueryWrapper<DownWorkstation>().eq(DownWorkstation::getFlowCardId, glassInfo.getFlowCardId())); int WorkstationId = downWorkstation.getWorkstationId(); DownGlassTask downGlassTask = downStorageCageService.createDownGlassTask(glassInfo, "0", String.valueOf(WorkstationId), "3"); @@ -165,7 +166,9 @@ } else { log.info("4、如果不属于版图id和片序的顺序执行进片任务"); // log.info("4、如果不属于版图id和片序的顺序执行进片任务"); log.info("4、如果不属于流程卡中的片序的顺序执行进片任务"); //添加进片任务 查找空格 List<DownStorageCageDetails> list = downStorageCageService.selectCacheEmpty(); if (list.size() > 0) { @@ -201,11 +204,12 @@ * @param MESSendingWord */ private Boolean outTo(String MESSendingWord) { log.info("单片情况根据传入的料架号 查询符合按照版图id和片序出片,并且优先出满架的小片"); // log.info("单片情况根据传入的料架号 查询符合按照版图id和片序出片,并且优先出满架的小片"); log.info("单片情况根据传入的料架号 查询符合按照流程卡中顺序出片,并且优先出满架的小片"); // List<DownStorageCageDetails> list1to3 = downStorageCageDetailsService.CacheOut1(1, 3); // List<DownStorageCageDetails> list4to6 = downStorageCageDetailsService.CacheOut1(4, 6); List<DownStorageCageDetails> list1to6 = downStorageCageDetailsService.CacheOut1(1, 6); List<DownStorageCageDetails> list1to6 = downStorageCageDetailsService.CacheOut2(1, 6); DownStorageCageDetails selectedItem = null; hangzhoumesParent/moduleService/UnLoadGlassModule/src/test/java/mes/UnloadGlassModuleApplicationTest.java
@@ -1,6 +1,7 @@ package mes; import com.mes.UnLoadGlassApplication; import com.mes.downglassinfo.service.DownGlassTaskService; import com.mes.downglassinfo.service.impl.DownGlassInfoServiceImpl; import com.mes.downglassinfo.service.impl.DownGlassTaskServiceImpl; import com.mes.downstorage.entity.DownStorageCage; @@ -58,6 +59,8 @@ DownWorkstationService downWorkstationService; @Autowired DownStorageCageService downStorageCageService; @Autowired DownGlassTaskService downGlassTaskService; @@ -171,8 +174,15 @@ @Test public void getFlowCardId() { glassInfoServiceImpl.getFlowCardId(); } @Test public void getUnloadingTaskState() { downGlassTaskService.getUnloadingTaskState(); } @Test