From 88c66adb41f9d55276e1fc4a3b1b5f26f2ecf1a7 Mon Sep 17 00:00:00 2001 From: gongbaoxiong <751575283@qq.com> Date: Sun, 16 Aug 2026 14:42:51 +0800 Subject: [PATCH] =?UTF-8?q?opt=EF=BC=9A=E4=BC=98=E5=8C=96=E7=A7=B0?= =?UTF-8?q?=E9=87=8D=E5=90=8C=E6=AD=A5=E5=8A=9F=E8=83=BD=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chainer/impl/EndDecisionChainer.java | 8 +- .../impl/base/AlleyAveRuleHandler.java | 11 +- .../impl/base/LimitStorageRuleHandler.java | 2 +- .../impl/diy/DepthPriorityHandler.java | 216 +++++++++++++- .../controller/SchBasePointController.java | 2 + .../task/handler/impl/MoveStorageTask.java | 14 +- .../task/handler/impl/OutStorageTask.java | 2 +- .../impl/SecondFloorAgvTransferTask.java | 10 +- .../impl/SecondFloorOutStorageTask.java | 2 + .../task/handler/impl/ToPickPlatformTask.java | 25 +- .../service/impl/SchBaseTaskServiceImpl.java | 12 +- .../service/impl/MdGruopDickServiceImpl.java | 22 +- .../service/dao/MdPbVehicleMater.java | 6 + .../dao/mapper/xml/MdPbVehicleivtMapper.xml | 4 +- .../service/dto/MdPbVehicleMaterVo.java | 4 +- .../service/impl/CockpitServiceImpl.java | 24 +- .../iostorage/sevice/PdaIOService.java | 267 ++++++++++++++++-- .../pda_manage/pick/PdaPickController.java | 12 +- .../controller/StIvtStructattrController.java | 4 +- .../dao/mapper/xml/StIvtStructattrMapper.xml | 1 + .../struct/service/dto/StructattrQuery.java | 2 + .../impl/StIvtStructattrServiceImpl.java | 150 +++++++++- .../quartz/task/TaskScheduleService.java | 3 + .../src/main/resources/config/application.yml | 2 + .../wms/stor_manage/storIvtInfo/index.vue | 12 + 25 files changed, 721 insertions(+), 96 deletions(-) diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java index be0ad9c5..e395e830 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/chainer/impl/EndDecisionChainer.java @@ -63,14 +63,16 @@ public class EndDecisionChainer extends DecisionerChain { List structs = new ArrayList<>(); //入库分配 if (in_storage) { - //混托任务判断 + //非异常任务,且是混托任务判断,直接返回库位 if (startParam.getString("vehicle_code").contains("T")) { List schBaseTaskList = iSchBaseTaskService.list(new QueryWrapper() .eq("vehicle_code", startParam.getString("vehicle_code")).select("point_code2") .lt("status", StatusEnum.FORM_STATUS.code("完成"))); if (CollectionUtil.isNotEmpty(schBaseTaskList)) { - structs.add(schBaseTaskList.get(0).getPoint_code2()); - return structs; + if (!"errorTask".equals(startParam.getString("errorTask"))) { + structs.add(schBaseTaskList.get(0).getPoint_code2()); + return structs; + } } } StIvtStructattr struct = (StIvtStructattr) transfers.get(0); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java index 0d1ae0eb..c72d97ce 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/AlleyAveRuleHandler.java @@ -48,14 +48,12 @@ public class AlleyAveRuleHandler extends Decisioner @Override public List handler(List list, JSONObject param) { // 判断仓位是否为空 - if (CollectionUtils.isEmpty(list)) { + if (ObjectUtils.isEmpty(list)) { log.error("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略无可用货位"); return Collections.emptyList(); - } - long startTime1 = System.currentTimeMillis(); - if (ObjectUtils.isNotEmpty(list)) { - //扩展库不需要均衡策略 - if ("LXBCP02".equals(list.get(0).getSect_code())) { + }else { + //扩展库和移库不需要均衡策略 + if ("LXBCP02".equals(list.get(0).getSect_code())||Boolean.parseBoolean(param.getString("is_move"))) { return list; } } @@ -93,7 +91,6 @@ public class AlleyAveRuleHandler extends Decisioner subList = subList.stream().filter(r -> !r.getStruct_code().equals(result.getStruct_code())).collect(Collectors.toList()); } log.info("均衡策略结果:载具号:" + param.getString("vehicle_code") + "分配结果: " + subList.stream().map(StIvtStructattr::getStruct_code).collect(Collectors.toList())); - log.info("均衡策略:载具号:" + param.getString("vehicle_code") + "获取仓位耗时:{}", System.currentTimeMillis() - startTime1); if (subList.size() == 0) { log.error("均衡策略结果:载具号:" + param.getString("vehicle_code") + "当前分配策略货位数量为0"); return Collections.emptyList(); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java index 596b3180..24d8d90e 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/base/LimitStorageRuleHandler.java @@ -57,6 +57,7 @@ public class LimitStorageRuleHandler extends Decisioner eqLimt = stIvtStructattr -> { diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java index 25b9abb7..7cbfe35b 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/decision_manage/handler/decisioner/impl/diy/DepthPriorityHandler.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.ObjectUtils; import org.nl.common.enums.StatusEnum; import org.nl.common.utils.SpringContextHolder; import org.nl.wms.decision_manage.handler.decisioner.Decisioner; @@ -14,10 +15,7 @@ import org.nl.wms.stor_manage.struct.service.IStIvtStructattrService; import org.nl.wms.stor_manage.struct.service.dao.StIvtStructattr; import org.springframework.stereotype.Service; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /* @@ -42,6 +40,73 @@ public class DepthPriorityHandler extends Decisioner allDepCollectL1 = list.stream() + .filter(a -> a.getRow_num() == 1) + .collect(Collectors.toList()); + List allDepCollectL4 = list.stream() + .filter(a -> a.getRow_num() == 4) + .collect(Collectors.toList()); + // 浅货位 + List allShallowCollect = list.stream() + .filter(a -> a.getRow_num() == 2 || a.getRow_num() == 3) + .collect(Collectors.toList()); + List allShallowCollectL2 = list.stream() + .filter(a -> a.getRow_num() == 2) + .collect(Collectors.toList()); + List allShallowCollectL3 = list.stream() + .filter(a ->a.getRow_num() == 3) + .collect(Collectors.toList()); + Set allShallowCollectSetL2 = allShallowCollectL2.stream() + .map(r -> r.getCol_num() + "_" + r.getLayer_num()) + .collect(Collectors.toSet()); + Set allShallowCollectSetL3 = allShallowCollectL3.stream() + .map(r -> r.getCol_num() + "_" + r.getLayer_num()) + .collect(Collectors.toSet()); + //过滤出无阻挡的全部深货位 + List allDepListL1 = allDepCollectL1.stream() + .filter(r -> allShallowCollectSetL2.contains(r.getCol_num() + "_" + r.getLayer_num())) + .collect(Collectors.toList()); + List allDepListL4 = allDepCollectL4.stream() + .filter(r -> allShallowCollectSetL3.contains(r.getCol_num() + "_" + r.getLayer_num())) + .collect(Collectors.toList()); + List alldepList =new ArrayList<>(); + alldepList.addAll(allDepListL1); + alldepList.addAll(allDepListL4); + List depCollect = alldepList.stream().filter(item -> item.getRow_num() == 1 && item.getLayer_num() >= 24 && item.getLayer_num() <= 31).collect(Collectors.toList()); + List shallowCollect = allShallowCollect.stream().filter(item -> item.getRow_num() == 2 && item.getLayer_num() >= 24 && item.getLayer_num() <= 31).collect(Collectors.toList()); + log.info("移库深位优先策略:载具号:{} 分配结果第一个: 全部深库位:{}, 全部浅库位:{}, 专属移库深库位:{}, 专属移库浅库位:{}", + param.getString("vehicle_code"), + alldepList.isEmpty() ? "无数据" : alldepList.get(0), + allShallowCollect.isEmpty() ? "无数据" : allShallowCollect.get(0), + depCollect.isEmpty() ? "无数据" : depCollect.get(0), + shallowCollect.isEmpty() ? "无数据" : shallowCollect.get(0) + ); + // 实现深位优先策略 + // 获取起始货位信息 + String startStructCode = param.getString("start_struct_code"); + String[] parts = startStructCode.split("-"); + // int p = Integer.parseInt(parts[0].replaceAll("\\D", "")); + int l = Integer.parseInt(parts[1].replaceAll("\\D", "")); + int c = Integer.parseInt(parts[2].replaceAll("\\D", "")); + // 实现深位优先策略 + StIvtStructattr result = findBestStructByDeepFirstStrategy(alldepList, allShallowCollect, depCollect, shallowCollect, l, c); + if (result != null) { + log.info("移库深位优先策略:载具号:{} 分配结果: 存在深位并对应浅位无货的库位,分配仓位:{}", param.getString("vehicle_code"),result.getStruct_code()); + return Collections.singletonList(result); + } + log.info("移库深位优先策略:载具号:{} 分配结果: 不存在可用移库库位,查找入库库位", param.getString("vehicle_code")); + } else { + //入库任务 + //3,4排不限制移库专属 + List list2 = list.stream().filter(item -> item.getRow_num() > 2).collect(Collectors.toList()); + List list3 = list.stream().filter(item -> (item.getRow_num() < 3) && (item.getLayer_num() < 24 || item.getLayer_num() > 31)).collect(Collectors.toList()); + List list4 = new ArrayList<>(list2); + list4.addAll(list3); + list = list4; + } long startTime1 = System.currentTimeMillis(); List returnResult = new ArrayList<>(); // 深货位 @@ -52,6 +117,7 @@ public class DepthPriorityHandler extends Decisioner shallowCollect = list.stream() .filter(a -> a.getRow_num() == 2 || a.getRow_num() == 3) .collect(Collectors.toList()); + //找出深和浅货位都无货的深货位 for (StIvtStructattr r : depCollect) { for (StIvtStructattr s : shallowCollect) { String depCode = r.getCol_num() + "-" + r.getLayer_num(); @@ -136,7 +202,7 @@ public class DepthPriorityHandler extends Decisioner taskList = iSchBaseTaskService.list( new LambdaQueryWrapper() @@ -144,11 +210,11 @@ public class DepthPriorityHandler extends Decisioner t.getTask_type().equals(StatusEnum.IOBILL_TYPE_IN.code("生产入库"))||t.getTask_type().equals(StatusEnum.IOBILL_TYPE_IN.code("拣选回库"))) + taskList = taskList.stream() + .filter(t -> t.getTask_type().equals(StatusEnum.IOBILL_TYPE_IN.code("生产入库")) || t.getTask_type().equals(StatusEnum.IOBILL_TYPE_IN.code("拣选回库"))) .collect(Collectors.toList()); if (CollectionUtils.isNotEmpty(taskList)) { - log.error("深位优先策略:获取深货位有货且浅货位无货仓位:载具号:" + param.getString("vehicle_code") + "获取仓位失败,该策略对应库位已不足30个!"); + log.error("深位优先策略:获取深货位有货且浅货位无货仓位:载具号:" + param.getString("vehicle_code") + "获取仓位失败,该策略对应库位已不足20个!"); return Collections.emptyList(); } } @@ -161,5 +227,139 @@ public class DepthPriorityHandler extends Decisioner allDepCollect, + List allShallowCollect, + List depCollect, + List shallowCollect, + int targetCol, + int targetLayer) { + // 1. 先在深货位中查找相同列的货位 + StIvtStructattr result = findInCollectionWithSameColumn(depCollect,allDepCollect, targetCol, targetLayer); + if (result != null) { + return result; + } + // 2. 如果深货位中没有,则在浅货位中查找相同列的货位 + result = findInCollectionWithSameColumn(shallowCollect,allShallowCollect, targetCol, targetLayer); + if (result != null) { + return result; + } + + // 3. 如果都没有相同列,则查找最近的列(不需要排除层) + result = findNearestColumn(depCollect,allDepCollect, targetCol, targetLayer); + if (result != null) { + return result; + } + // 4. 最后尝试浅货位中最近的列 + result = findNearestColumn(shallowCollect,allShallowCollect, targetCol, targetLayer); + return result; + } + + + /** + * 在集合中查找相同列的货位,排除自身层和相邻层 + * + * @param collection 货位集合 + * @param targetCol 目标列号 + * @param targetLayer 目标层号 + * @return 匹配的货位 + */ + private StIvtStructattr findInCollectionWithSameColumn(List collection, List allCollect, + int targetCol, + int targetLayer) { + // 筛选出相同列的货位 + List sameColList = collection.stream() + .filter(item -> item.getCol_num() != null && item.getCol_num() == targetCol) + .collect(Collectors.toList()); + if (ObjectUtils.isEmpty(sameColList)) { + sameColList = allCollect.stream() + .filter(item -> item.getCol_num() != null && item.getCol_num() == targetCol) + .collect(Collectors.toList()); + if (ObjectUtils.isEmpty(sameColList)) { + return null; + } + } + // 排除自身层和相邻层(targetLayer-1, targetLayer, targetLayer+1) + List filteredList = sameColList.stream() + .filter(item -> { + Integer layer = item.getLayer_num(); + if (layer == null) { + return false; + } + // 排除自身层和相邻层 + return Math.abs(layer - targetLayer) > 1; + }) + .collect(Collectors.toList()); + + if (ObjectUtils.isEmpty(filteredList)) { + return null; + } + // 找到与目标层数最接近的货位 + return filteredList.stream() + .min((a, b) -> { + int diffA = Math.abs(a.getLayer_num() - targetLayer); + int diffB = Math.abs(b.getLayer_num() - targetLayer); + return Integer.compare(diffA, diffB); + }) + .orElse(null); + } + + /** + * 在集合中查找最近的列(不需要排除层) + * + * @param collection 货位集合 + * @param targetCol 目标列号 + * @param targetLayer 目标层号 + * @return 匹配的货位 + */ + private StIvtStructattr findNearestColumn(List collection, List allCollect, + int targetCol, + int targetLayer) { + if (ObjectUtils.isEmpty(collection) && ObjectUtils.isEmpty(allCollect)) { + return null; + } + // 按列号分组,找出与目标列差值最小的列 + Map> colGroupMap = collection.stream() + .filter(item -> item.getCol_num() != null) + .collect(Collectors.groupingBy(StIvtStructattr::getCol_num)); + if (colGroupMap.isEmpty()) { + colGroupMap = allCollect.stream() + .filter(item -> item.getCol_num() != null) + .collect(Collectors.groupingBy(StIvtStructattr::getCol_num)); + if (colGroupMap.isEmpty()) { + return null; + } + } + // 找到与目标列差值绝对值最小的列号 + Integer nearestCol = colGroupMap.keySet().stream() + .min((col1, col2) -> { + int diff1 = Math.abs(col1 - targetCol); + int diff2 = Math.abs(col2 - targetCol); + return Integer.compare(diff1, diff2); + }) + .orElse(null); + if (nearestCol == null) { + return null; + } + // 在该列中找到与目标层数最接近的货位 + List nearestColList = colGroupMap.get(nearestCol); + return nearestColList.stream() + .min((a, b) -> { + Integer layerA = a.getLayer_num() != null ? a.getLayer_num() : 0; + Integer layerB = b.getLayer_num() != null ? b.getLayer_num() : 0; + int diffA = Math.abs(layerA - targetLayer); + int diffB = Math.abs(layerB - targetLayer); + return Integer.compare(diffA, diffB); + }) + .orElse(null); + } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/point/controller/SchBasePointController.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/point/controller/SchBasePointController.java index cb50c26b..5bd21b9e 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/point/controller/SchBasePointController.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/point/controller/SchBasePointController.java @@ -78,6 +78,8 @@ public class SchBasePointController { TableDataInfo result = pointService.bindOrUnbind(entity.getCode(), entity.getVehicle_code(), (entity.getPriority())); if (!"200".equals(result.getCode())) { throw new BadRequestException("地面站点:" + entity.getCode() + "绑定或解绑" + entity.getVehicle_code() + "指令下发CTU,返回操作失败,失败原因:" + result.getMsg()); + }else{ + lambdaUpdateWrapper.set(SchBasePoint::getRemark,"地面站点:" + entity.getCode() + "绑定或解绑" + entity.getVehicle_code() + "指令下发CTU,返回操作成功。"); } } } else { diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/MoveStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/MoveStorageTask.java index d81ec415..34b83f88 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/MoveStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/MoveStorageTask.java @@ -118,12 +118,11 @@ public class MoveStorageTask extends AbstractTask { //移库完成后,起点作为技改锁,支持技改,不再入库,技改完成后需要解锁 iStIvtStructattrService.update( new UpdateWrapper() - .set("lock_type", StatusEnum.LOCK.code("技改锁")) - .set("is_used",0) + .set("lock_type", StatusEnum.LOCK.code("禁分配锁")) .eq("struct_code", schBaseTask.getPoint_code1()) ); // List taskList = taskService.list(new QueryWrapper().eq("source_form_id", "99").lt("status", StatusEnum.FORM_STATUS.code("完成"))); - //移库任务完成,解锁需要维护不能分配的区域 + // // 移库任务完成,解锁需要维护不能分配的区域 // if (taskList.size() == 0) { // UpdateWrapper wrapper = new UpdateWrapper<>(); // wrapper.set("update_time", DateUtil.now()) @@ -144,5 +143,14 @@ public class MoveStorageTask extends AbstractTask { .eq("struct_code", schBaseTask.getPoint_code1()); iStIvtStructattrService.update(wrapper); this.updateTask(data); + List taskList = taskService.list(new QueryWrapper().eq("source_form_id", "99").lt("status", StatusEnum.FORM_STATUS.code("完成"))); + // 移库任务完成,解锁需要维护不能分配的区域 + if (taskList.size() == 0) { + UpdateWrapper wrapper2 = new UpdateWrapper<>(); + wrapper2.set("update_time", DateUtil.now()) + .set("lock_type", StatusEnum.LOCK.code("无锁")) + .eq("lock_type", StatusEnum.LOCK.code("禁分配锁")); + iStIvtStructattrService.update(wrapper2); + } } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java index 9032670f..f17a3234 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/OutStorageTask.java @@ -193,7 +193,7 @@ public class OutStorageTask extends AbstractTask { AtomicReference moveStruct = new AtomicReference<>(); RedissonUtils.lock(() -> { System.out.println("---3--" + Thread.currentThread().getName()); - Map process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(ListOf.of("limitStorage", "depthPriority", "alleyAve"), new JSONObject(MapOf.of("is_move", true, "stor_code", block.getStor_code(), "vehicle_code", block.getVehicle_code()))); + Map process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(ListOf.of("limitStorage", "depthPriority", "alleyAve"), new JSONObject(MapOf.of("is_move", true, "stor_code", block.getStor_code(), "vehicle_code", block.getVehicle_code(),"start_struct_code", block.getStruct_code()))); moveStruct.set(((Map) process.get("form_data")).get("end_struct_code")); }, "1" + block.getStor_code(), 5); Map moveForm = MapOf.of("task_type", StatusEnum.IOBILL_TYPE_MOVE.code("移库") diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorAgvTransferTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorAgvTransferTask.java index 4ca67e87..b4a957d9 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorAgvTransferTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorAgvTransferTask.java @@ -120,11 +120,11 @@ public class SecondFloorAgvTransferTask extends AbstractTask { @Transactional(rollbackFor = Exception.class) public void cancel(JSONObject data) { try { - SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper().eq("task_code", data.getString("task_code"))); - iSchBaseTaskService.update(new LambdaUpdateWrapper() - .set(SchBaseTask::getTask_step, "1") - .eq(SchBaseTask::getTask_type, StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库")) - .in(SchBaseTask::getGroup_code, schBaseTask.getGroup_code())); + // SchBaseTask schBaseTask = iSchBaseTaskService.getOne(new QueryWrapper().eq("task_code", data.getString("task_code"))); + // iSchBaseTaskService.update(new LambdaUpdateWrapper() + // .set(SchBaseTask::getTask_step, "1") + // .eq(SchBaseTask::getTask_type, StatusEnum.IOBILL_TYPE_OUT.code("二楼CTU出库")) + // .in(SchBaseTask::getGroup_code, schBaseTask.getGroup_code())); this.updateTask(data); } catch (Exception e) { throw new BadRequestException("取消任务失败,失败原因:" + e.getMessage()); diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java index 4e8bc715..3684b294 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/SecondFloorOutStorageTask.java @@ -231,8 +231,10 @@ public class SecondFloorOutStorageTask extends AbstractTask { .set(MdPbVehicleMater::getFrozen_qty, 0) .set(MdPbVehicleMater::getRemark, r.getTask_code() + "任务被取消,任务组:" + r.getGroup_code() + "任务都被取消。") .eq(MdPbVehicleMater::getId, r.getSource_form_id()); + //任务取消后不再自动生成任务 LambdaUpdateWrapper updateWrapper3 = new LambdaUpdateWrapper() .set(SchBaseTask::getRemark, r.getTask_code() + "任务被取消,任务组:" + r.getGroup_code() + "任务都被取消。") + .set(SchBaseTask::getTask_step,"2") .eq(SchBaseTask::getId, r.getId()); if (r.getStatus().equals(StatusEnum.FORM_STATUS.code("完成"))) { //清除库存 diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java index f087060b..2e435c33 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/handler/impl/ToPickPlatformTask.java @@ -15,6 +15,7 @@ import org.nl.common.utils.IdUtil; import org.nl.common.utils.SecurityUtils; import org.nl.common.utils.SpringContextHolder; import org.nl.wms.dispatch_manage.point.service.ISchBasePointService; +import org.nl.wms.dispatch_manage.point.service.dao.SchBasePoint; import org.nl.wms.dispatch_manage.task.handler.AbstractTask; import org.nl.wms.dispatch_manage.task.service.ISchBaseTaskService; import org.nl.wms.dispatch_manage.task.service.dao.SchBaseTask; @@ -66,13 +67,22 @@ public class ToPickPlatformTask extends AbstractTask { if (start_struct_code.contains("B")) { target_point = "1311"; } else { - List list = iSchBaseTaskService.list(new QueryWrapper() - .lt("status", StatusEnum.FORM_STATUS.code("完成"))); - String pointCode1 = "1308"; - String pointCode2 = "1311"; - long count1 = list.stream().filter(r -> r.getPoint_code2().equals(pointCode1)).count(); - long count2 = list.stream().filter(r -> r.getPoint_code2().equals(pointCode2)).count(); - target_point = count1 >= count2 ? pointCode2 : pointCode1; + List targetPoints = iSchBasePointService.list(new QueryWrapper() + .eq("region_code", "PICK01").eq("is_used", true)); + if (CollectionUtils.isEmpty(targetPoints)) { + throw new BadRequestException("当前拣选工位未启用"); + } + if (targetPoints.size() > 1) { + List list = iSchBaseTaskService.list(new QueryWrapper() + .lt("status", StatusEnum.FORM_STATUS.code("完成"))); + String pointCode1 = "1308"; + String pointCode2 = "1311"; + long count1 = list.stream().filter(r -> r.getPoint_code2().equals(pointCode1)).count(); + long count2 = list.stream().filter(r -> r.getPoint_code2().equals(pointCode2)).count(); + target_point = count1 >= count2 ? pointCode2 : pointCode1; + } else { + target_point = targetPoints.get(0).getCode(); + } // List targetPoints = iSchBasePointService.list(new QueryWrapper() // .eq("region_code", "PICK01").eq("is_used", true)); // //通过全局变量获取目标位置 @@ -98,7 +108,6 @@ public class ToPickPlatformTask extends AbstractTask { if (!CollectionUtils.isEmpty(list)) { throw new BadRequestException("当前载具存在任务:" + list.stream().map(SchBaseTask::getTask_code).collect(Collectors.joining(","))); } - //移库判断 if (struct.getStor_code().equals("FStockId")) { synchronized ("FStockId") { diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java index 4ce4f0c1..0a50344a 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/dispatch_manage/task/service/impl/SchBaseTaskServiceImpl.java @@ -442,7 +442,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl { System.out.println("---3--" + Thread.currentThread().getName()); //出阻挡说明是同排跟任务一个类型载具 - Map process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(ListOf.of("limitStorage", "depthPriority", "alleyAve"), new JSONObject(MapOf.of("is_move", true, "stor_code", stIvtStructattr.getStor_code(), "vehicle_code", task.getVehicle_code(), "errorTask", "errorTask"))); + Map process = SpringContextHolder.getBean(DecisionHandler.class).dispenseTransa(ListOf.of("limitStorage", "depthPriority", "alleyAve"), new JSONObject(MapOf.of("is_move", true, "stor_code", stIvtStructattr.getStor_code(), "vehicle_code", task.getVehicle_code(), "errorTask", "errorTask", "start_struct_code", block.getStruct_code()))); moveStruct.set(((Map) process.get("form_data")).get("end_struct_code")); }, "1" + stIvtStructattr.getStor_code(), 5); Map moveForm = MapOf.of("task_type", StatusEnum.IOBILL_TYPE_MOVE.code("异常位移库") @@ -503,7 +503,7 @@ public class SchBaseTaskServiceImpl extends ServiceImpl vehicleList = iMdPbVehicleMaterService .list(new QueryWrapper() @@ -533,15 +533,15 @@ public class SchBaseTaskServiceImpl extends ServiceImpl) map.get("form_data")).get("end_struct_code"); if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(vehicleList)) { iActRuExecutionService.update(new UpdateWrapper() - .set("remark", stIvtStructattr.getStruct_code() + "入满异常重新分配货位" + new_struct_code) + .set("remark", stIvtStructattr.getStruct_code() + "入满异常重新分配货位:" + stIvtStructattr.getStruct_code() + "->" + new_struct_code) .eq("proc_inst_id", vehicleList.get(0).getProc_inst_id())); } - log.error("任务:{},载具号:{},原终点:{}入满异常重新分配货位:{}", task_code, task.getVehicle_code(), task.getPoint_code2(), new_struct_code); + log.info("【入满异常处理-更新任务】任务号:{}, 载具号:{}, 库位变更:{} -> {}, 阻挡库位:{}", + task_code, task.getVehicle_code(), stIvtStructattr.getStruct_code(), new_struct_code, stIvtStructattr.getStruct_code()); this.update(new UpdateWrapper() .set("point_code2", new_struct_code) - .set("remark", stIvtStructattr.getStruct_code() + "入满异常重新分配货位" + new_struct_code) + .set("remark", "入满异常重新分配货位:原库位" + stIvtStructattr.getStruct_code() + "->新库位" + new_struct_code + ",阻挡库位:" + stIvtStructattr.getStruct_code()) .eq("task_code", task_code)); - JSONObject result = new JSONObject(); result.put("point_code2", new_struct_code); return result; diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/impl/MdGruopDickServiceImpl.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/impl/MdGruopDickServiceImpl.java index bc4ab6da..dbe6adf4 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/impl/MdGruopDickServiceImpl.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/group_dick/service/impl/MdGruopDickServiceImpl.java @@ -9,10 +9,12 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.kingdee.bos.webapi.sdk.K3CloudApi; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.nl.common.TableDataInfo; @@ -65,6 +67,7 @@ import java.util.stream.Collectors; * @since 2024-04-24 */ @Service +@Slf4j public class MdGruopDickServiceImpl extends ServiceImpl implements IMdGruopDickService { @Autowired @@ -594,8 +597,10 @@ public class MdGruopDickServiceImpl extends ServiceImpl 0) List validItems = item.stream() @@ -660,8 +665,8 @@ public class MdGruopDickServiceImpl extends ServiceImpl { BigDecimal singleWeight = r.getSingle_weight(); // 辅助单位包含 kg - if (StringUtils.isNotBlank(r.getAssist_unit_id())) { - if (r.getAssist_unit_id().toLowerCase().contains("kg")) { + if (StringUtils.isNotBlank(r.getWeight_unit_id())) { + if (r.getWeight_unit_id().toLowerCase().contains("kg")) { singleWeight = singleWeight.multiply(BigDecimal.valueOf(1000)); } } @@ -669,6 +674,7 @@ public class MdGruopDickServiceImpl extends ServiceImpl() + .set("netWeight", netWeight) + .eq("id", item.get(0).getId()) + ); // 差异重量 = 净重 - 理论重量 - 误差 BigDecimal diffWeight = netWeight .subtract(materialWeight) .abs(); if (diffWeight.compareTo(relativeError) > 0) { - log.error(item.get(0).getVehicle_code()+ "的物料数量为:" + validItems.get(0).getQty() + log.error(item.get(0).getVehicle_code() + "的物料数量为:" + validItems.get(0).getQty() + ",上报重量为:" + actualWeightKg + ",载具重量为:" + weight + ",去皮重量为:" + netWeight + ",与物料实际重量:" + materialWeight + ",进行对比已超过误差值" + diffWeight + ",不允许入库,请检查。"); throw new BadRequestException( - (item.get(0).getVehicle_code() + "的物料数量为:" + validItems.get(0).getQty() + ",上报重量为:" + actualWeightKg + unitIsG + ",载具重量为:" + weight + "g" + ",物料单重为:" + validItems.get(0).getSingle_weight() + validItems.get(0).getAssist_unit_id() + ",去皮重量为:" + netWeight + "g,与物料实际重量:" + materialWeight + "g,进行对比已超过误差值" + diffWeight + "g,不允许入库,请检查。") + (item.get(0).getVehicle_code() + "的物料数量为:" + validItems.get(0).getQty() + ",上报重量为:" + actualWeightKg + unitIsG + ",载具重量为:" + weight + "g" + ",物料单重为:" + validItems.get(0).getSingle_weight() + validItems.get(0).getWeight_unit_id() + ",去皮重量为:" + netWeight + "g,与物料实际重量:" + materialWeight + "g,进行对比已超过误差值" + diffWeight + "g,不允许入库,请检查。") ); } } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/MdPbVehicleMater.java b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/MdPbVehicleMater.java index a2749c36..2f073f55 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/MdPbVehicleMater.java +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/MdPbVehicleMater.java @@ -144,5 +144,11 @@ public class MdPbVehicleMater implements Serializable { */ private Boolean need_pick = Boolean.FALSE; + /** + * 物料净重 + */ + private BigDecimal netWeight; + + } diff --git a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/mapper/xml/MdPbVehicleivtMapper.xml b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/mapper/xml/MdPbVehicleivtMapper.xml index 7ac5fdb5..a7952b92 100644 --- a/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/mapper/xml/MdPbVehicleivtMapper.xml +++ b/wms_pro/hd/nladmin-system/src/main/java/org/nl/wms/md_manage/vehicleMater/service/dao/mapper/xml/MdPbVehicleivtMapper.xml @@ -17,14 +17,14 @@ - +