diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java index 343bb6042..932e44c02 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/IBstIvtStockingivtService.java @@ -75,6 +75,13 @@ public interface IBstIvtStockingivtService extends IService { * @return / */ List getEmptyPointNotTask(String location, String pointType); + /** + * 获取备货区空位,没有任务的位置 + * @param location 位置:0上区域,1下区域 + * @param pointType [] 类型:0暂存位置,1靠近分切机 + * @return / + */ + List getEmptyPointNotTask2(String location, List pointType); /** * 根据点位编码获取备货区点位 diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java index eebb68b15..d434cbb0c 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.java @@ -34,6 +34,8 @@ public interface BstIvtStockingivtMapper extends BaseMapper { */ List getEmptyPointNotTask(String location, String pointType); + List getEmptyPointNotTask2(String location, List pointTypes); + BstIvtStockingivt getCanMovePointOne(String location, String pointType); /** diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml index 7cd6d3991..7aaf74c7f 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/dao/mapper/BstIvtStockingivtMapper.xml @@ -160,4 +160,22 @@ GROUP BY bs.point_code; + diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java index a28efc352..d19cbe8fa 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/bst/ivt/stockingivt/service/impl/BstIvtStockingivtServiceImpl.java @@ -119,6 +119,11 @@ public class BstIvtStockingivtServiceImpl extends ServiceImpl getEmptyPointNotTask2(String location, List pointType) { + return bstIvtStockingivtMapper.getEmptyPointNotTask2(location, pointType); + } + @Override public BstIvtStockingivt getPointByCode(String pointCode, boolean flag) { LambdaQueryWrapper lam = new LambdaQueryWrapper<>(); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java index 5615d91ec..667e40480 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/TrussCallShaftCacheTask.java @@ -94,6 +94,7 @@ public class TrussCallShaftCacheTask extends AbstractAcsTask { endPointObj.setHave_qzz("1"); + endPointObj.setPlan(""); TaskUtils.updateOptMessageByBShaftPoint(endPointObj); shafttubeivtService.updateById(endPointObj); } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java index 543d6c427..fa29287b3 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/auto/AutoCallAirShaftTask.java @@ -34,6 +34,7 @@ import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubeMovePointDto; import org.nl.b_lms.sch.tasks.slitter.mapper.dto.BhTubePointDto; import org.nl.b_lms.sch.tasks.slitter.mapper.dto.SlitterPlanDistinctDto; import org.nl.b_lms.sch.tasks.slitter.util.SlitterTaskUtil; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.common.enums.NoticeTypeEnum; import org.nl.common.utils.TaskUtils; import org.nl.modules.common.exception.BadRequestException; @@ -315,14 +316,15 @@ public class AutoCallAirShaftTask extends Prun { stepErrorInfo.add("没有套轴暂存位没有相同规格的气胀轴来拔轴,直接去气胀轴库获取。"); //若套轴暂存位没有相同规格的气胀轴,直接去气胀轴库找即可 // 调用ACS滚条气涨轴下来 - if (!toAcsOutShaft(needPlans, plans, qzzSize, location, empty)) { + String callOutStatus = toAcsOutShaft(needPlans, plans, qzzSize, location, empty); + if ("0".equals(callOutStatus)) { log.error("呼叫出轴失败-穿拔轴{}不进行套轴,跳过!", empty.getPoint_code()); stepErrorInfo.add("呼叫出轴失败-穿拔轴" + empty.getPoint_code() + "不进行套轴,直接做拔轴!"); makePullShaft(empty, specification); return; } // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 - saveCutPlanMessage(empty, needPlans, qzzSize); + saveCutPlanMessage(empty, needPlans, qzzSize, callOutStatus); // toCallAgvMovePaperTube(needPlans, location, empty, plans); return; } @@ -371,7 +373,7 @@ public class AutoCallAirShaftTask extends Prun { return; } // 保存所需要的分切计划数据到点位上(套轴对接位)更新分切计划 - saveCutPlanMessage(empty, needPlans, qzzSize); + saveCutPlanMessage(empty, needPlans, qzzSize, "0"); SlitterTaskUtil.putCurrentPaperSpec(param, oldPlans); // 套管数量 param.put("casingCount", needPlans.size()); @@ -807,24 +809,25 @@ public class AutoCallAirShaftTask extends Prun { * @param qzzSize 气涨轴尺寸 * @param location 位置:上半部分还是下半部分 * @param empty 套拔轴点位 + * @return 0: 呼叫失败,1:呼叫成功,2:该点位需要从密集库获取 */ - private Boolean toAcsOutShaft(List needPlans, List plans, String qzzSize, String location, BstIvtShafttubeivt empty) { + private String toAcsOutShaft(List needPlans, List plans, String qzzSize, String location, BstIvtShafttubeivt empty) { Integer movePaperTube = toCallAgvMovePaperTube(needPlans, location, empty, plans); if (movePaperTube == 2) { log.info("跳过,无法更换托盘。"); stepErrorInfo.add("呼叫AGV更换托盘失败,无法更换托盘。"); - return false; + return "0"; } if (movePaperTube != 0) { skipTheSameTubePlans(needPlans); - return false; + return "0"; } // 需要区分上下 List shafttubeivts = bstIvtShafttubeivtService.getByQzzSize(qzzSize, empty.getPoint_code(), location); if (shafttubeivts.size() == 0) { log.error("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位"); stepErrorInfo.add("气胀轴库找不到[" + qzzSize + "]规格的气涨轴位"); - return false; + return "0"; } // 气涨轴库 BstIvtShafttubeivt shafttubeivt = shafttubeivts.get(0); @@ -839,9 +842,9 @@ public class AutoCallAirShaftTask extends Prun { if (ObjectUtil.isEmpty(pointStatus) || ObjectUtil.isEmpty(pointStatus.getJSONArray("data"))) { log.error("获取气胀轴库信息失败"); stepErrorInfo.add("获取ACS气胀轴库信息失败..."); - return false; + return "0"; } - boolean judgment1 = true; + boolean judgment1 = false; boolean judgment2 = true; // 获取气涨轴缓存没有任务的点位 List qzzCache = bstIvtShafttubeivtService.getNotTaskShaftCache(qzzSize, @@ -849,6 +852,58 @@ public class AutoCallAirShaftTask extends Prun { if (qzzCache.size() == 0) { log.warn("未找到气胀轴密集库气涨轴规格「" + qzzSize + "」的暂存位"); judgment2 = false; + } else { + // 查找正在进行的取货点任务(未确定取货位) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + queryWrapper.eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")); + queryWrapper.in(SchBaseTask::getTask_type, + Arrays.asList(SlitterEnum.TASK_TYPE.code("穿拔轴位<>气胀轴缓存位"), + SlitterEnum.TASK_TYPE.code("人工叫空轴桁架任务"))); + queryWrapper.likeRight(SchBaseTask::getPoint_code1, "B_QHD"); + List baseTasks = taskService.list(queryWrapper); + if (baseTasks.size() > 0) { + // 过滤 + List collect = baseTasks.stream().filter(task -> { + if (ObjectUtil.isNotEmpty(task.getPoint_code3())) { + JSONObject object = JSONObject.parseObject(task.getRequest_param()); + if (ObjectUtil.isEmpty(object)) { + return false; + } + String size = object.getString("qzz_size"); + String generation = object.getString("qzz_generation"); + return "6".equals(qzzSize) + ? qzzSize.equals(size) + : qzzSize.equals(size) && empty.getQzz_generation().equals(generation); + } + BstIvtShafttubeivt cbzj = bstIvtShafttubeivtService.getByPointCode(task.getPoint_code2(), false); + if (ObjectUtil.isEmpty(cbzj)) { + return false; + } + return "6".equals(qzzSize) + ? qzzSize.equals(cbzj.getQzz_size()) + : qzzSize.equals(cbzj.getQzz_size()) && empty.getQzz_generation().equals(cbzj.getQzz_generation()); + }).collect(Collectors.toList()); + if (collect.size() > 0) { + if (qzzCache.size() - collect.size() <= 0) { + log.warn("未找到气胀轴密集库气涨轴规格「" + qzzSize + "」的暂存位"); + judgment2 = false; + } + } + } else { + // 查看另一台机构的尺寸是否一致,plan是否为2 + BstIvtShafttubeivt one = bstIvtShafttubeivtService.getOne(new LambdaQueryWrapper() + .ne(BstIvtShafttubeivt::getPoint_code, empty.getPoint_code()) + .eq(BstIvtShafttubeivt::getPoint_location, empty.getPoint_location()) + .eq(BstIvtShafttubeivt::getPoint_type, empty.getPoint_type()) + .eq(BstIvtShafttubeivt::getIs_used, "1")); + if (ObjectUtil.isNotEmpty(one.getPlan()) && "2".equals(one.getPlan())) { + if (qzzSize.equals(one.getQzz_size()) && "6".equals(qzzSize)) { + judgment2 = (qzzCache.size() - 1) > 0; + } + } + } + // todo: 检查正在进行的放货点任务(已经确定放货位)[先不要考虑] } JSONObject data2 = pointStatus.getJSONArray("data").getJSONObject(0); if (data2.getInteger("qty") == 0) { @@ -858,7 +913,7 @@ public class AutoCallAirShaftTask extends Prun { if (!judgment1 && !judgment2) { log.warn("没有气胀轴,不给ACS写出轴信息"); stepErrorInfo.add("呼叫气胀轴失败,(密集库/暂存架)没有" + qzzSize + "寸的气胀轴,不给ACS写出轴信息。请人工补轴或将对应的分切计划点击入站完成"); - return false; + return "0"; } // 判断气胀轴密集库是否有数据 JSONArray acsParam = new JSONArray(); @@ -872,7 +927,7 @@ public class AutoCallAirShaftTask extends Prun { log.info("开始给ACS写信号出气胀轴 - {}", acsQzz); JSONObject action = wmsToAcsService.action(acsParam); log.info("下发给ACS写信号出气涨轴返回参数:{}", action); - return true; + return judgment1 ? "1" : "2"; } /** @@ -906,7 +961,7 @@ public class AutoCallAirShaftTask extends Prun { * @param needPlans 需要的分切计划 * @param qzzSize 气涨轴尺寸 */ - private void saveCutPlanMessage(BstIvtShafttubeivt empty, List needPlans, String qzzSize) { + private void saveCutPlanMessage(BstIvtShafttubeivt empty, List needPlans, String qzzSize, String remark) { log.info("正在保存套轴信息 - {} , 尺寸 - {} 到点位 - {}", needPlans, qzzSize, empty); empty.setHave_qzz(SlitterConstant.SLITTER_YES); empty.setQzz_size(qzzSize); @@ -934,6 +989,7 @@ public class AutoCallAirShaftTask extends Prun { empty.setContainer_name2(plan.getContainer_name()); } } + empty.setPlan(remark); bstIvtShafttubeivtService.updateById(empty); // 分切计划 // 将分切计划is_paper_ok 1(准备好纸管) -> 2(套好气胀轴) @@ -1021,6 +1077,7 @@ public class AutoCallAirShaftTask extends Prun { /** * 检测气胀轴密集库/气胀轴缓存库有没有空位 + * * @param empty * @param specification * @param plan diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java index 478987e0a..a283d8154 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/slitter/service/impl/SlitterServiceImpl.java @@ -3,6 +3,7 @@ package org.nl.b_lms.sch.tasks.slitter.service.impl; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import org.nl.b_lms.storage_manage.ios.enums.IOSEnum; import org.nl.common.utils.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; @@ -1055,7 +1056,7 @@ public class SlitterServiceImpl implements SlitterService { List tasks = taskService.checkHaveTask(deviceCode); if (CollectionUtil.isEmpty(tasks)) { // 查找一个没有任务的空位 - List list = stockingivtService.getEmptyPointNotTask(device.getPoint_location(), "0"); + List list = stockingivtService.getEmptyPointNotTask2(device.getPoint_location(), Arrays.asList("0", "2")); if (list.size() == 0) { noticeService.createNotice("备货区找不到空位置搬运", "备货区" + deviceCode + "异常", @@ -1132,6 +1133,7 @@ public class SlitterServiceImpl implements SlitterService { shaftPoint.setContainer_name1(""); shaftPoint.setContainer_name2(""); shaftPoint.setQzz_size(""); + shaftPoint.setPlan(""); TaskUtils.updateOptMessageByBShaftPoint(shaftPoint); shafttubeivtService.update(shaftPoint); // 初始化 预分配点位 @@ -3048,6 +3050,7 @@ public class SlitterServiceImpl implements SlitterService { } @Override + @Transactional(rollbackFor = Exception.class) public JSONObject callShaft(JSONObject param) { // area、point_code、row(size,generation) log.info("呼叫空轴:{}", param); @@ -3104,6 +3107,46 @@ public class SlitterServiceImpl implements SlitterService { if (shafttubeivts.size() == 0) { throw new BadRequestException("没有气胀轴尺寸[" + rowJSONObject.getString("size") + "],代数[" + rowJSONObject.getString("generation") + "]的库存!"); + } else { + // 查找正在进行的取货点任务(未确定取货位) + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.lt(SchBaseTask::getTask_status, TaskStatusEnum.FINISHED.getCode()); + queryWrapper.eq(SchBaseTask::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")); + queryWrapper.in(SchBaseTask::getTask_type, + Arrays.asList(SlitterEnum.TASK_TYPE.code("穿拔轴位<>气胀轴缓存位"), + SlitterEnum.TASK_TYPE.code("人工叫空轴桁架任务"))); + queryWrapper.likeRight(SchBaseTask::getPoint_code1, "B_QHD"); + List baseTasks = taskService.list(queryWrapper); + if (baseTasks.size() > 0) { + // 过滤 + List collect = baseTasks.stream().filter(task -> { + if (ObjectUtil.isNotEmpty(task.getPoint_code3())) { + JSONObject object = JSONObject.parseObject(task.getRequest_param()); + if (ObjectUtil.isEmpty(object)) { + return false; + } + String size = object.getString("qzz_size"); + String generation = object.getString("qzz_generation"); + return "6".equals(rowJSONObject.getString("size")) + ? rowJSONObject.getString("size").equals(size) + : rowJSONObject.getString("size").equals(size) && rowJSONObject.getString("generation").equals(generation); + } + BstIvtShafttubeivt cbzj = shafttubeivtService.getByPointCode(task.getPoint_code2(), false); + if (ObjectUtil.isEmpty(cbzj)) { + return false; + } + return "6".equals(rowJSONObject.getString("size")) + ? rowJSONObject.getString("size").equals(cbzj.getQzz_size()) + : rowJSONObject.getString("size").equals(cbzj.getQzz_size()) && rowJSONObject.getString("generation").equals(cbzj.getQzz_generation()); + }).collect(Collectors.toList()); + if (collect.size() > 0) { + if (shafttubeivts.size() - collect.size() <= 0) { + throw new BadRequestException("气胀轴尺寸[" + rowJSONObject.getString("size") + "],代数[" + + rowJSONObject.getString("generation") + "]的库存不满足!"); + } + } + } + // todo: 检查正在进行的放货点任务(已经确定放货位)[先不要考虑] } // 创建桁架任务(二次分配) JSONObject taskParam = new JSONObject();