From 3c2da9058f01e823d68d8ded808997b4500f33b2 Mon Sep 17 00:00:00 2001 From: liuxy Date: Thu, 20 Jun 2024 09:39:22 +0800 Subject: [PATCH] =?UTF-8?q?rev=EF=BC=9A=E5=8F=91=E8=B4=A7=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E4=BA=8C=E6=AC=A1=E5=88=86=E9=85=8D=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../nl/b_lms/sch/tasks/TwoSendOutTask.java | 35 ++- .../storage_manage/ios/enums/IOSEnum.java | 3 + .../util/impl/SendOutManageServiceImpl.java | 259 ++++++++++++++++++ .../util/service/SendOutManageService.java | 18 ++ .../acs/service/impl/AcsToWmsServiceImpl.java | 31 ++- 5 files changed, 323 insertions(+), 23 deletions(-) diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoSendOutTask.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoSendOutTask.java index 7b5d04e7e..c3c68b775 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoSendOutTask.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/sch/tasks/TwoSendOutTask.java @@ -39,6 +39,8 @@ public class TwoSendOutTask extends AbstractAcsTask { /* * 下发给ACS时需要特殊处理 */ + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0); ArrayList resultList = new ArrayList<>(); @@ -60,6 +62,11 @@ public class TwoSendOutTask extends AbstractAcsTask { .remark(json.getString("remark")) .build(); resultList.add(dto); + + // 更新任务为下发 + JSONObject paramMap = new JSONObject(); + paramMap.put("task_status", TaskStatusEnum.ISSUE.getCode()); + taskTab.update(paramMap, "task_id ='" + json.getString("task_id") + "'"); } return resultList; } @@ -79,7 +86,16 @@ public class TwoSendOutTask extends AbstractAcsTask { jsonTask.put("update_time", DateUtil.now()); taskTab.update(jsonTask); - JSONObject jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + JSONObject jsonPoint2; + + if (ObjectUtil.isNotEmpty(jsonTask.getString("point_code4"))) { + // 第一次申请取消 + jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code4") + "'").uniqueResult(0); + } else { + // 第二次申请取消 + jsonPoint2 = pointTab.query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + } + jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); jsonPoint2.put("vehicle_code", ""); pointTab.update(jsonPoint2); @@ -102,11 +118,13 @@ public class TwoSendOutTask extends AbstractAcsTask { jsonTask.put("update_time", DateUtil.now()); taskTab.update(jsonTask); - // 更新暂存区点位状态 - JSONObject jsonPoint2 = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); - jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); - jsonPoint2.put("vehicle_code", jsonTask.getString("vehicle_code")); - pointTab.update(jsonPoint2); + if (ObjectUtil.isEmpty(jsonTask.getString("point_code4"))) { + // 第二次申请任务完成 - 更新点位状态 + JSONObject jsonPoint2 = WQLObject.getWQLObject("sch_base_point").query("point_code = '" + jsonTask.getString("point_code2") + "'").uniqueResult(0); + jsonPoint2.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + jsonPoint2.put("vehicle_code", jsonTask.getString("vehicle_code")); + pointTab.update(jsonPoint2); + } } } @@ -126,10 +144,6 @@ public class TwoSendOutTask extends AbstractAcsTask { WQLObject tab = WQLObject.getWQLObject("SCH_BASE_Task"); CutConveyorTask cutConveyorTask = new CutConveyorTask(); - String point_code2 = form.getString("point_code2"); - if (cutConveyorTask.isSingleTask(point_code2)) { - throw new BadRequestException("点位:" + point_code2 + "存在未完成的任务!"); - } JSONObject json = new JSONObject(); json.put("task_id", IdUtil.getSnowflake(1, 1).nextId()); json.put("task_code", IdUtil.getSnowflake(1, 1).nextId()); @@ -138,6 +152,7 @@ public class TwoSendOutTask extends AbstractAcsTask { json.put("point_code1", form.getString("point_code1")); json.put("route_plan_code", getRoutePlanCode(json.getString("point_code1"))); json.put("point_code2", form.getString("point_code2")); + json.put("point_code4", form.getString("point_code4")); json.put("vehicle_code", form.getString("vehicle_code")); json.put("handle_class", THIS_CLASS); json.put("create_id", SecurityUtils.getCurrentUserId()); diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java index c124c041b..0cfd0678a 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/enums/IOSEnum.java @@ -103,6 +103,9 @@ public enum IOSEnum { OUT_POINT(MapOf.of("1","CK2038", "2","CK2038", "3","CK2042", "4","CK2042" ,"5","CK2046", "6","CK2046", "7","7", "8","8", "9","9", "10","10")), + // 出库发货等待点 + OUT_FH_POINT(MapOf.of("1","B_FH_01_0", "2","B_FH_02_0", "3","B_FH_03_0", "4","B_FH_04_0" ,"5","B_FH_05_0", + "6","B_FH_06_0")), // 行架点位 OUT_HANGER(MapOf.of("行架位1", "CK2013","行架位2", "CK2017")), diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java index 511e36ddc..4f9e688ef 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/impl/SendOutManageServiceImpl.java @@ -210,4 +210,263 @@ public class SendOutManageServiceImpl implements SendOutManageService { // 删除载具对应木箱记录 //extTab.delete(jsonExt); } + + @Override + public void createSendOutTaskOne(JSONObject whereJson) { + // 子卷包装关系表 + WQLObject subTab = WQLObject.getWQLObject("pdm_bi_subpackagerelation"); + // 载具扩展属性表 + WQLObject extTab = WQLObject.getWQLObject("md_pb_storagevehicleext"); + /* + * 1.找相同订单号的木箱 + * 1)有相同订单号有空位的:相同订单号的放在一排 + * 2)没有相同订单号的:新开一排 + * 3)有相同订单号的但是没有空位:新开一排 + */ + CutConveyorTask cutConveyorTask = new CutConveyorTask(); + + // 所有发货区点位 + List pointDaoList = ischBasePointService.list( + new QueryWrapper().lambda() + .eq(SchBasePoint::getRegion_id, RegionTypeEnum.TWO_FH01.getId()) + .eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) + .eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + ); + + //木箱号可能用逗号隔开 + String vehicleCode = Arrays.asList(whereJson.getString("vehicle_code").split(",")).get(0); + JSONObject jsonSub = subTab.query("package_box_sn = '" + vehicleCode + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(jsonSub)) { + throw new BadRequestException("未查询到该木箱对应的包装关系!"); + } + + // 2.找相同订单号的所有排 + jsonSub.put("region_id", RegionTypeEnum.TWO_FH01.getId()); + List pointLikeOrder = schBasePointMapper.queryLikeOrderRow(jsonSub); + + // 3.找相同订单号的所在排的所有空位 + String point_code = ""; + List joArr = new ArrayList<>(); + + for (int i = 0; i < pointLikeOrder.size(); i++) { + JSONObject json = pointLikeOrder.get(i); + + // 过滤此排的空位 + List rowPointList = pointDaoList.stream() + .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) && + ObjectUtil.isEmpty(row.getVehicle_code()) && + row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定")) + ) + .sorted(Comparator.comparing(SchBasePoint::getIn_order_seq)) + .collect(Collectors.toList()); + + joArr.addAll(rowPointList); + } + + if (ObjectUtil.isEmpty(joArr)) { + //查询新的一排 + List newRowPointList = schBasePointMapper.queryNewRow(jsonSub); + + if (ObjectUtil.isEmpty(newRowPointList)) { + throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); + } + + for (int i = 0; i < newRowPointList.size(); i++) { + JSONObject json = newRowPointList.get(i); + + // 找出这一排的所有空位 + List rowPointList = pointDaoList.stream() + .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) && + ObjectUtil.isEmpty(row.getVehicle_code()) && + row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定")) + ) + .sorted(Comparator.comparing(SchBasePoint::getIn_order_seq)) + .collect(Collectors.toList()); + + JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0))); + + if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) { + continue; + } + + point_code = jsonNewRow.getString("point_code"); + break; + } + } else { + // 校验此货位是否被堵住:1.如果被堵住则判断下一个是否被堵住 2.如果全部被堵住则新开一排 + for (int i = 0; i < joArr.size(); i++) { + JSONObject json = JSONObject.parseObject(JSON.toJSONString(joArr.get(i))); + + // 判断是否被挡住 + JSONObject paramJson = new JSONObject(); + paramJson.put("point_code", json.getString("point_code")); + paramJson.put("region_id", RegionTypeEnum.TWO_FH01.getId()); + List isBlock = schBasePointMapper.isBlock(paramJson); + + if (ObjectUtil.isNotEmpty(isBlock)) { + // 堵住则判断下一个 + continue; + } else { + if (cutConveyorTask.isSingleTask(json.getString("point_code"))) { + continue; + } + // 未堵住: 跳出循环 + point_code = json.getString("point_code"); + break; + } + } + } + + if (ObjectUtil.isEmpty(point_code)) { + //查询新的一排 + List newRowPointList = schBasePointMapper.queryNewRow(jsonSub); + + if (ObjectUtil.isEmpty(newRowPointList)) { + throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); + } + + for (int i = 0; i < newRowPointList.size(); i++) { + JSONObject json = newRowPointList.get(i); + + // 找出这一排的所有空位 + List rowPointList = pointDaoList.stream() + .filter(row -> row.getRow_num().toString().equals(json.getString("row_num")) && + ObjectUtil.isEmpty(row.getVehicle_code()) && + row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定")) + ) + .sorted(Comparator.comparing(SchBasePoint::getIn_order_seq)) + .collect(Collectors.toList()); + + JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0))); + + if (cutConveyorTask.isSingleTask(jsonNewRow.getString("point_code"))) { + continue; + } + + point_code = jsonNewRow.getString("point_code"); + break; + } + } + + if (ObjectUtil.isEmpty(point_code)) { + throw new BadRequestException("未查询到相同销售订单的放货区点位或空的一排!"); + } + + //创建任务 + JSONObject task_jo = new JSONObject(); + task_jo.put("point_code1", whereJson.getString("device_code")); + // 根据此排找到对应的等待点 + String finalPoint_code = point_code; + SchBasePoint schBasePoint = pointDaoList.stream() + .filter(row -> row.getPoint_code().equals(finalPoint_code)) + .findFirst().orElse(null); + String code = IOSEnum.OUT_FH_POINT.code(schBasePoint.getRow_num().toString()); + + task_jo.put("point_code2", code); + task_jo.put("point_code4", point_code); + task_jo.put("vehicle_code", vehicleCode); + task_jo.put("task_type", "010708"); + TwoSendOutTask taskBean = new TwoSendOutTask(); + taskBean.createTask(task_jo); + + // 锁住点位 + ischBasePointService.update( + new UpdateWrapper().lambda() + .eq(SchBasePoint::getPoint_code, point_code) + .set(SchBasePoint::getLock_type, IOSEnum.LOCK_TYPE.code("其它")) + ); + + } + + @Override + public void createSendOutTaskTwo(JSONObject whereJson) { + WQLObject taskTab = WQLObject.getWQLObject("sch_base_task"); + WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); + + // 根据任务号找到第一次申请时的任务 + JSONObject taskJson = taskTab.query("task_code = '" + whereJson.getString("task_code") + "'").uniqueResult(0); + if (ObjectUtil.isEmpty(taskJson)) { + throw new BadRequestException("任务号为:"+ whereJson.getString("task_code")+ "的任务不存在!"); + } + + String point_code4 = ""; + + // 判断当前点位是否被堵住 + JSONObject paramJson = new JSONObject(); + paramJson.put("point_code", taskJson.getString("point_code4")); + paramJson.put("region_id", RegionTypeEnum.TWO_FH01.getId()); + List isBlock = schBasePointMapper.isBlock(paramJson); + + if (ObjectUtil.isNotEmpty(isBlock)) { + // 堵住: 找这一排的的空位 + // 所有发货区点位 + List pointDaoList = ischBasePointService.list( + new QueryWrapper().lambda() + .eq(SchBasePoint::getRegion_id, RegionTypeEnum.TWO_FH01.getId()) + .eq(SchBasePoint::getIs_used, IOSEnum.IS_NOTANDYES.code("是")) + .eq(SchBasePoint::getIs_delete, IOSEnum.IS_NOTANDYES.code("否")) + ); + + SchBasePoint pointDao = pointDaoList.stream() + .filter(row -> row.getPoint_code().equals(taskJson.getString("point_code4"))) + .findFirst().orElse(null); + + // 找出这一排所有空位 + List rowPointList = pointDaoList.stream() + .filter(row -> row.getRow_num().toString().equals(pointDao.getRow_num().toString()) && + ObjectUtil.isEmpty(row.getVehicle_code()) && + row.getLock_type().equals(IOSEnum.LOCK_TYPE.code("未锁定")) + ) + .sorted(Comparator.comparing(SchBasePoint::getIn_order_seq)) + .collect(Collectors.toList()); + + // 判断是否被堵住 + for (int i = 0; i < rowPointList.size(); i++) { + SchBasePoint json = rowPointList.get(i); + + JSONObject paramJson2 = new JSONObject(); + paramJson2.put("point_code", json.getPoint_code()); + paramJson2.put("region_id", RegionTypeEnum.TWO_FH01.getId()); + List isBlock2 = schBasePointMapper.isBlock(paramJson2); + + if (ObjectUtil.isNotEmpty(isBlock2)) { + continue; + } else { + JSONObject jsonNewRow = JSONObject.parseObject(JSON.toJSONString(rowPointList.get(0))); + point_code4 = jsonNewRow.getString("point_code"); + break; + } + } + + // 更新原仓位 + JSONObject jsonUpdate = new JSONObject(); + jsonUpdate.put("lock_type", IOSEnum.LOCK_TYPE.code("未锁定")); + pointTab.update(jsonUpdate,"point_code = '"+taskJson.getString("point_code4")+"'"); + + if (ObjectUtil.isEmpty(point_code4)) { + // 如果没有找到此排空位 则重新下发到别的排 + JSONObject param = new JSONObject(); + param.put("device_code", taskJson.getString("point_code2")); + param.put("vehicle_code", taskJson.getString("vehicle_code")); + createSendOutTaskOne(param); + return; + } else { + // 更新现仓位 + jsonUpdate.put("lock_type", IOSEnum.LOCK_TYPE.code("其它")); + pointTab.update(jsonUpdate,"point_code = '"+point_code4+"'"); + } + + } else { + point_code4 = taskJson.getString("point_code4"); + } + + //创建任务 + JSONObject task_jo = new JSONObject(); + task_jo.put("point_code1", taskJson.getString("point_code2")); + task_jo.put("point_code2", point_code4); + task_jo.put("vehicle_code", taskJson.getString("vehicle_code")); + task_jo.put("task_type", "010721"); + TwoSendOutTask taskBean = new TwoSendOutTask(); + taskBean.createTask(task_jo); + } } diff --git a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java index deba0362c..1859463dc 100644 --- a/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java +++ b/lms/nladmin-system/src/main/java/org/nl/b_lms/storage_manage/ios/service/iostorInv/util/service/SendOutManageService.java @@ -21,4 +21,22 @@ public interface SendOutManageService { */ void createSendOutTask(JSONObject whereJson); + /** + * 创建发货任务 - 到等待点 + * @param whereJson { + * device_code:起点 + * vehicle_code: 载具号 + * } + */ + void createSendOutTaskOne(JSONObject whereJson); + + + /** + * 创建发货任务 等待点 - 具体点位 + * @param whereJson { + * task_code:任务号(第一次申请时下发的任务号) + * } + */ + void createSendOutTaskTwo(JSONObject whereJson); + } diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java index ba04ddea7..c92b3b827 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/ext/acs/service/impl/AcsToWmsServiceImpl.java @@ -1943,21 +1943,26 @@ public class AcsToWmsServiceImpl implements AcsToWmsService { @Transactional(rollbackFor = Exception.class) public JSONObject applySendOutTwo(JSONObject whereJson) { log.info("applySendOutTwo输入参数:---------------------------------------------" + whereJson.toString()); - - // 校验 - if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) { - throw new BadRequestException("设备号不能为空!"); - } - - if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) { - throw new BadRequestException("载具号不能为空!"); - } - JSONObject result = new JSONObject(); - try { - // 调用服务 - sendOutManageService.createSendOutTask(whereJson); + try{ + // 校验是否是二次分配 + if (ObjectUtil.isEmpty(whereJson.getString("task_code"))) { + // 第一次申请 + if (ObjectUtil.isEmpty(whereJson.getString("device_code"))) { + throw new BadRequestException("设备号不能为空!"); + } + + if (ObjectUtil.isEmpty(whereJson.getString("vehicle_code"))) { + throw new BadRequestException("载具号不能为空!"); + } + + // 调用服务 + sendOutManageService.createSendOutTaskOne(whereJson); + } else { + // 第二次申请 + sendOutManageService.createSendOutTaskTwo(whereJson); + } result.put("status", HttpStatus.OK.value()); result.put("message", "下发成功!"); return result;