diff --git a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java index d863ed60f..641fc270e 100644 --- a/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java +++ b/lms/nladmin-system/src/main/java/org/nl/wms/st/outbill/service/impl/CheckOutBillServiceImpl.java @@ -90,7 +90,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { private final IStIvtIostorinvdisService iStIvtIostorinvdisService; @Autowired @Lazy - private CheckOutBillService checkOutBillService; + private CheckOutBillService checkOutBillService; @Override @@ -125,7 +125,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = vbeln.split(" "); String vbeln_in = String.join("','", Arrays.asList(s)); - map.put("vbeln_in", "('"+vbeln_in+"')"); + map.put("vbeln_in", "('" + vbeln_in + "')"); map.put("vbeln", ""); } else { map.put("vbeln", "%" + map.get("vbeln") + "%"); @@ -143,7 +143,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = box_no.split(" "); String box_no_in = String.join("','", Arrays.asList(s)); - map.put("box_no_in", "('"+box_no_in+"')"); + map.put("box_no_in", "('" + box_no_in + "')"); map.put("box_no", ""); } else { map.put("box_no", "%" + map.get("box_no") + "%"); @@ -167,7 +167,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = pcsn.split(" "); String pcsn_in = String.join("','", Arrays.asList(s)); - map.put("pcsn_in", "('"+pcsn_in+"')"); + map.put("pcsn_in", "('" + pcsn_in + "')"); map.put("pcsn", ""); } else { map.put("pcsn", "%" + map.get("pcsn") + "%"); @@ -186,7 +186,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = sap_pcsn.split(" "); String sap_pcsn_in = String.join("','", Arrays.asList(s)); - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); + map.put("sap_pcsn_in", "('" + sap_pcsn_in + "')"); map.put("sap_pcsn", ""); } else { map.put("sap_pcsn", "%" + map.get("sap_pcsn") + "%"); @@ -269,7 +269,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = pcsn.split(" "); String pcsn_in = String.join("','", Arrays.asList(s)); - map.put("pcsn_in", "('"+pcsn_in+"')"); + map.put("pcsn_in", "('" + pcsn_in + "')"); map.put("pcsn", ""); } else { map.put("pcsn", "%" + pcsn + "%"); @@ -286,7 +286,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = sap_pcsn.split(" "); String sap_pcsn_in = String.join("','", Arrays.asList(s)); - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); + map.put("sap_pcsn_in", "('" + sap_pcsn_in + "')"); map.put("sap_pcsn", ""); } else { map.put("sap_pcsn", "%" + sap_pcsn + "%"); @@ -303,7 +303,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = package_box_sn.split(" "); String package_box_sn_in = String.join("','", Arrays.asList(s)); - map.put("box_no_in", "('"+package_box_sn_in+"')"); + map.put("box_no_in", "('" + package_box_sn_in + "')"); map.put("box_no", ""); } else { map.put("box_no", "%" + map.get("package_box_sn") + "%"); @@ -427,9 +427,9 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { @Override @Transactional(rollbackFor = Exception.class) public String insertDtl(JSONObject map) { - if(MapUtil.getStr(map,"bill_type").equals("1011")) { - String iostorinv_id = inserdtlPic(map); - return iostorinv_id ; + if (MapUtil.getStr(map, "bill_type").equals("1011")) { + String iostorinv_id = inserdtlPic(map); + return iostorinv_id; } WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt"); @@ -591,6 +591,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { /** * 拣选出库新增 + * * @param map 、 * @return 单据标识 */ @@ -1032,7 +1033,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = vbeln.split(" "); String vbeln_in = String.join("','", Arrays.asList(s)); - map.put("vbeln_in", "('"+vbeln_in+"')"); + map.put("vbeln_in", "('" + vbeln_in + "')"); map.put("vbeln", ""); } else { map.put("vbeln", "%" + map.get("vbeln") + "%"); @@ -1050,7 +1051,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = box_no.split(" "); String box_no_in = String.join("','", Arrays.asList(s)); - map.put("box_no_in", "('"+box_no_in+"')"); + map.put("box_no_in", "('" + box_no_in + "')"); map.put("box_no", ""); } else { map.put("box_no", "%" + map.get("box_no") + "%"); @@ -1073,7 +1074,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = pcsn.split(" "); String pcsn_in = String.join("','", Arrays.asList(s)); - map.put("pcsn_in", "('"+pcsn_in+"')"); + map.put("pcsn_in", "('" + pcsn_in + "')"); map.put("pcsn", ""); } else { map.put("pcsn", "%" + map.get("pcsn") + "%"); @@ -1091,7 +1092,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String[] s = sap_pcsn.split(" "); String sap_pcsn_in = String.join("','", Arrays.asList(s)); - map.put("sap_pcsn_in", "('"+sap_pcsn_in+"')"); + map.put("sap_pcsn_in", "('" + sap_pcsn_in + "')"); map.put("sap_pcsn", ""); } else { map.put("sap_pcsn", "%" + map.get("sap_pcsn") + "%"); @@ -1219,7 +1220,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { .reduce(Double::sum).orElse(0.00); JSONObject result = new JSONObject(); - result.put("overdue_qyt",overdue_qyt); + result.put("overdue_qyt", overdue_qyt); result.put("mst", jsonMst); return result; } @@ -1287,7 +1288,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { String estimated_freight = list.get(5).toString(); // 更新主表 - jsonMst.put("trans_code", ObjectUtil.isNotEmpty(jsonTran) ? jsonTran.getString("cust_code") : "" ); + jsonMst.put("trans_code", ObjectUtil.isNotEmpty(jsonTran) ? jsonTran.getString("cust_code") : ""); jsonMst.put("order_number", order_number); jsonMst.put("car_type", car_type); jsonMst.put("other_freight", other_freight); @@ -1320,18 +1321,18 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { // 更新冻结库存 JSONObject jsonIvt = ivtTab.query("pcsn = '" + json.getString("pcsn") + "'").uniqueResult(0); if (ObjectUtil.isEmpty(jsonIvt)) { - throw new BadRequestException("库存不存在!"+json.getString("pcsn")); + throw new BadRequestException("库存不存在!" + json.getString("pcsn")); } jsonIvt.put("frozen_qty", json.getDoubleValue("plan_qty")); // 冻结库存不能超过库存数量 if (jsonIvt.getDoubleValue("frozen_qty") > jsonIvt.getDoubleValue("ivt_qty")) { - throw new BadRequestException("输入数量不能大于库存数量! 当前库存数为:"+jsonIvt.getString("ivt_qty")); + throw new BadRequestException("输入数量不能大于库存数量! 当前库存数为:" + jsonIvt.getString("ivt_qty")); } // 更新库存数 double canuse_qty = NumberUtil.sub(jsonIvt.getDoubleValue("ivt_qty"), jsonIvt.getDoubleValue("frozen_qty")); - jsonIvt.put("canuse_qty",canuse_qty); + jsonIvt.put("canuse_qty", canuse_qty); ivtTab.update(jsonIvt); @@ -1497,6 +1498,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { /** * 分拣出库修改 + * * @param whereJson、 */ private void updatePic(JSONObject whereJson) { @@ -1606,7 +1608,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } }*/ - RedissonUtils.lock(a->{ + RedissonUtils.lock(a -> { //查询生成和未分配完的明细 JSONArray dtls = WQL.getWO("QST_IVT_CHECKOUTBILL") .addParam("flag", "2") @@ -1743,7 +1745,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { throw new BadRequestException("库存不足"); } - double canuse_qty ; + double canuse_qty; if (StrUtil.equals(bill_type, "1011")) { canuse_qty = dtl.getDoubleValue("plan_qty"); } else { @@ -1837,7 +1839,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } } return null; - },"all_divOne",whereJson); + }, "all_divOne", whereJson); } @Override @@ -2473,7 +2475,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } RLock lock = redissonClient.getLock("all_cancelDivOne"); - boolean tryLock = lock.tryLock(0, 60,TimeUnit.SECONDS); + boolean tryLock = lock.tryLock(0, 60, TimeUnit.SECONDS); try { if (tryLock) { @@ -3150,7 +3152,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (ObjectUtil.isNotEmpty(structArr)) { JSONObject jsonObject = structArr.getJSONObject(0); - throw new BadRequestException("当前排存在单据号为【"+jsonObject.getString("inv_code")+"】的仓位【"+jsonObject.getString("struct_code")+"】正在执行任务,请稍后在试!"); + throw new BadRequestException("当前排存在单据号为【" + jsonObject.getString("inv_code") + "】的仓位【" + jsonObject.getString("struct_code") + "】正在执行任务,请稍后在试!"); } } @@ -3220,7 +3222,8 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { public void allSetPointByNoTran(JSONObject whereJson) { String point_code = whereJson.getString("point_code"); // 终点 JSONObject jsonPoint2 = WQLObject.getWQLObject("SCH_BASE_Point").query("lock_type='1' and (vehicle_code='' or vehicle_code IS NULL) and point_code='" + whereJson.getString("point_code") + "'").uniqueResult(0); - 参数校验:{ + 参数校验: + { JSONObject jo_mst = WQLObject.getWQLObject("ST_IVT_IOStorInv").query("iostorinv_id = '" + whereJson.getString("iostorinv_id") + "'").uniqueResult(0); if (ObjectUtil.isEmpty(jo_mst)) { throw new BadRequestException("未查到相关出库单"); @@ -3245,7 +3248,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { JSONArray structArr = WQLObject.getWQLObject("ST_IVT_StructAttr").query("block_num = '" + jsonRow.getString("block_num") + "' and row_num = '" + jsonRow.getString("row_num") + "' and is_used = '1' and is_delete = '0' and lock_type not in ('1','6','3')").getResultJSONArray(0); if (ObjectUtil.isNotEmpty(structArr)) { - throw new BadRequestException("有其他任务正在执行中,对应单据号为【"+structArr.getJSONObject(0).getString("inv_code")+"】,请稍后在试!"); + throw new BadRequestException("有其他任务正在执行中,对应单据号为【" + structArr.getJSONObject(0).getString("inv_code") + "】,请稍后在试!"); } } } @@ -3254,7 +3257,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { //同区同排排序:10302-04-01 //口口回口回口口口1 //口口回回口口口口2 - Map> collect = structSet.stream().distinct().collect(Collectors.groupingBy(struct -> struct.getRow_num()+"_"+struct.getBlock_num())); + Map> collect = structSet.stream().distinct().collect(Collectors.groupingBy(struct -> struct.getRow_num() + "_" + struct.getBlock_num())); //批量校验单据锁定 for (String orderBy : collect.keySet()) { List needStructs = collect.get(orderBy); @@ -3268,60 +3271,167 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (String orderBy : collect.keySet()) { List needStructs = collect.get(orderBy); //从左到右排序 - needStructs.sort(Comparator.comparingInt(a->Integer.valueOf(a.getOut_order_seq()))); + needStructs.sort(Comparator.comparingInt(a -> Integer.valueOf(a.getOut_order_seq()))); StructAllsetDto left = needStructs.get(0); - StructAllsetDto right = needStructs.get(needStructs.size()-1); + StructAllsetDto right = needStructs.get(needStructs.size() - 1); //确认左/右出库并根据出库顺序获取货位集合 - List structs = 左右出库确认(needStructs, left, right,whereJson.getString("iostorinv_id")); - //attr.struct_code,attr.lock_type,attr.storagevehicle_code,attr.inv_code,storagevehicle_code + JSONObject jsonObject = 左右出库确认(needStructs, left, right, whereJson.getString("iostorinv_id")); + List structs = (List) jsonObject.get("struct_list"); + boolean is_all = jsonObject.getBoolean("is_all"); List needStructList = needStructs.stream().map(StructAllsetDto::getStruct_code).collect(Collectors.toList()); - /** - * 1.判断当前仓位:是否有锁定,是否是分配的货位 - * 锁定: - * 直接跳过 - * 没锁定: - * 1.不是分配的货位则移库 - * 2.是分配的货位则出库:并更新单据 - */ - String taskGroup = org.nl.common.utils.IdUtil.getStringId(); - for (int i = 0; i < structs.size(); i++) { - JSONObject item = structs.get(i); - item.put("task_group_id",taskGroup); - item.put("iostorinv_id",whereJson.getString("iostorinv_id")); - item.put("sort_seq",i); - item.put("point_code",point_code); - item.put("point_id",jsonPoint2.getString("point_id")); - String structCode = item.getString("struct_code"); - if (CollectionUtils.isEmpty(needStructList)){ - break; - } - if (needStructList.contains(structCode)){ - //出库 - checkOutBillService.createOut(item); - needStructList.remove(structCode); - }else { - //移库:如果当前存在业务锁定则说明存在相关任务,不需要移库,直接跳过 - if (!item.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))){ - continue; + if (is_all) { + List all_struct = new ArrayList<>(structs.size()); + HashMap struct_map = new HashMap<>(structs.size()); + structs.forEach(struct -> { + all_struct.add(struct.getString("struct_code")); + struct_map.put(struct.getString("struct_code"), struct); + }); + List move_list = moveBoxes(needStructList, all_struct); + String taskGroup = org.nl.common.utils.IdUtil.getStringId(); + for (int i = 0; i < move_list.size(); i++) { + String goal_struct = move_list.get(i); + JSONObject item = struct_map.get(goal_struct); + item.put("task_group_id", taskGroup); + item.put("iostorinv_id", whereJson.getString("iostorinv_id")); + item.put("sort_seq", i); + item.put("point_code", point_code); + item.put("point_id", jsonPoint2.getString("point_id")); + String structCode = item.getString("struct_code"); + if (CollectionUtils.isEmpty(needStructList)) { + break; + } + if (needStructList.contains(structCode)) { + //出库 + checkOutBillService.createOut(item); + needStructList.remove(structCode); + } else { + //移库:如果当前存在业务锁定则说明存在相关任务,不需要移库,直接跳过 + if (!item.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + continue; + } + checkOutBillService.createMove(item); + } + } + } else { + //attr.struct_code,attr.lock_type,attr.storagevehicle_code,attr.inv_code,storagevehicle_code + /** + * 1.判断当前仓位:是否有锁定,是否是分配的货位 + * 锁定: + * 直接跳过 + * 没锁定: + * 1.不是分配的货位则移库 + * 2.是分配的货位则出库:并更新单据 + */ + String taskGroup = org.nl.common.utils.IdUtil.getStringId(); + for (int i = 0; i < structs.size(); i++) { + JSONObject item = structs.get(i); + item.put("task_group_id", taskGroup); + item.put("iostorinv_id", whereJson.getString("iostorinv_id")); + item.put("sort_seq", i); + item.put("point_code", point_code); + item.put("point_id", jsonPoint2.getString("point_id")); + String structCode = item.getString("struct_code"); + if (CollectionUtils.isEmpty(needStructList)) { + break; + } + if (needStructList.contains(structCode)) { + //出库 + checkOutBillService.createOut(item); + needStructList.remove(structCode); + } else { + //移库:如果当前存在业务锁定则说明存在相关任务,不需要移库,直接跳过 + if (!item.getString("lock_type").equals(IOSEnum.LOCK_TYPE.code("未锁定"))) { + continue; + } + checkOutBillService.createMove(item); } - checkOutBillService.createMove(item); } } - }; + } } - private void 锁单判断(List structs, StructAllsetDto left, StructAllsetDto right,String invId) { - HashMap param = MapOf.of("invId",invId,"flag", "51", "sect_id",left.getSect_id(),"block_num", left.getBlock_num(), "row_num", left.getRow_num()); + + private void 锁单判断(List structs, StructAllsetDto left, StructAllsetDto right, String invId) { + HashMap param = MapOf.of("invId", invId, "flag", "51", "sect_id", left.getSect_id(), "block_num", left.getBlock_num(), "row_num", left.getRow_num()); JSONArray allLock = WQL.getWO("ST_OUTIVT04").addParamMap(param).process().getResultJSONArray(0); List hasLock = this.isNumList(allLock); - if (!ObjectUtil.isEmpty(hasLock)){ + if (!ObjectUtil.isEmpty(hasLock)) { String error = hasLock.stream() .map(a -> "仓位" + a.getString("struct_code") + "锁定单据" + a.getString("inv_code")) .collect(Collectors.joining(",")); throw new BadRequestException(error + "被锁定且未下发任务,无法生成任务!"); } - }; + } - private List 左右出库确认(List structs, StructAllsetDto left, StructAllsetDto right,String invId) { + public static List moveBoxes(List toRemove, List allBoxes) { + // 边界检查:所有箱子列表不能为空 + if (allBoxes == null || allBoxes.isEmpty()) { + throw new BadRequestException("所有箱子列表不能为空"); + } + + // 处理需要搬出的箱子列表为null的情况(视为无需要搬出的箱子) + List safeToRemove = (toRemove == null) ? new ArrayList<>() : toRemove; + + // 用HashSet存储需要搬出的箱子,提高查询效率(O(1)复杂度) + Set toRemoveSet = new HashSet<>(safeToRemove.size()); + toRemoveSet.addAll(safeToRemove); + + int totalBoxes = allBoxes.size(); + int maxKeepLength = 0; // 最长连续保留序列的长度 + int bestKeepStart = 0; // 最长连续保留序列的起始索引 + int bestKeepEnd = -1; // 最长连续保留序列的结束索引 + int currentKeepStart = 0; // 当前连续保留序列的起始索引 + int currentKeepLength = 0; // 当前连续保留序列的长度 + + // 遍历所有箱子,寻找最长的连续保留序列 + for (int i = 0; i < totalBoxes; i++) { + String currentBox = allBoxes.get(i); + // 判断当前箱子是否需要保留(不在需要搬出的集合中) + boolean needKeep = !toRemoveSet.contains(currentBox); + + if (needKeep) { + // 若当前是新的连续保留序列起点,记录起始索引 + if (currentKeepLength == 0) { + currentKeepStart = i; + } + currentKeepLength++; + } else { + // 遇到需要搬出的箱子,检查当前连续保留序列是否为最长 + if (currentKeepLength > maxKeepLength) { + maxKeepLength = currentKeepLength; + bestKeepStart = currentKeepStart; + bestKeepEnd = i - 1; + } + // 重置当前连续保留序列 + currentKeepLength = 0; + } + } + + // 检查循环结束后是否有未处理的最长连续保留序列(可能在列表末尾) + if (currentKeepLength > maxKeepLength) { + maxKeepLength = currentKeepLength; + bestKeepStart = currentKeepStart; + bestKeepEnd = totalBoxes - 1; + } + + // 计算需要搬运的箱子数量并预分配集合容量 + int leftMoveCount = bestKeepStart; // 最长保留序列左侧需要搬运的数量 + int rightMoveCount = (totalBoxes - 1) - bestKeepEnd; // 右侧需要搬运的数量 + List moveOrder = new ArrayList<>(leftMoveCount + rightMoveCount); + + // 添加左侧需要搬运的箱子(按原有顺序) + for (int i = 0; i < bestKeepStart; i++) { + moveOrder.add(allBoxes.get(i)); + } + + // 添加右侧需要搬运的箱子(从右向左,减少移动距离) + for (int i = totalBoxes - 1; i > bestKeepEnd; i--) { + moveOrder.add(allBoxes.get(i)); + } + System.out.println("搬运顺序: " + moveOrder); + return moveOrder; + } + + private JSONObject 左右出库确认(List structs, StructAllsetDto left, StructAllsetDto right, String invId) { /** * 1.查询当前排被锁住的货位集合 * 2.过滤仓位没有没有被其他单据锁定的货位 @@ -3334,39 +3444,40 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { * 5.根据哪边出库查询当前排货位出库顺序 */ String placementType = left.getPlacement_type(); + boolean is_all = false; //查询当前排 //lock_type('2','3','6','7') // 查询仓位被锁住的货位 - HashMap param = MapOf.of("invId",invId,"flag", "51", "sect_id",left.getSect_id(),"block_num", left.getBlock_num(), "row_num", left.getRow_num()); + HashMap param = MapOf.of("invId", invId, "flag", "51", "sect_id", left.getSect_id(), "block_num", left.getBlock_num(), "row_num", left.getRow_num()); JSONArray allLock = WQL.getWO("ST_OUTIVT04").addParamMap(param).process().getResultJSONArray(0); List hasLock = this.isNumList(allLock); String option; //如果货位有锁定则需要判断左右 //口回口口回口*口口 <---> - if (!ObjectUtil.isEmpty(hasLock)){ + if (!ObjectUtil.isEmpty(hasLock)) { List rightLock = hasLock.stream().filter(item -> item.getInteger("out_order_seq") >= Integer.valueOf(left.getOut_order_seq())) - .map(a->"仓位"+a.getString("struct_code")+"锁定单据"+a.getString("inv_code")).collect(Collectors.toList()); + .map(a -> "仓位" + a.getString("struct_code") + "锁定单据" + a.getString("inv_code")).collect(Collectors.toList()); List leftLock = hasLock.stream().filter(item -> item.getInteger("out_order_seq") < Integer.valueOf(right.getOut_order_seq())) - .map(a->"仓位"+a.getString("struct_code")+"锁定单据"+a.getString("inv_code")).collect(Collectors.toList()); + .map(a -> "仓位" + a.getString("struct_code") + "锁定单据" + a.getString("inv_code")).collect(Collectors.toList()); //如果锁定货位存在则判断左右通 - if (StringUtils.equals(placementType,"03")){ + if (StringUtils.equals(placementType, "03")) { //右通:获取最左边仓位对应锁定的仓位 - if (!ObjectUtil.isEmpty(rightLock)){ + if (!ObjectUtil.isEmpty(rightLock)) { String error = rightLock.stream().collect(Collectors.joining(",")); throw new BadRequestException(error + "被锁定且未下发任务,无法生成任务!"); } option = "03"; - }else if (StringUtils.equals(placementType,"02")){ + } else if (StringUtils.equals(placementType, "02")) { //左通:获取最右边仓位对应锁定的仓位 - if (!ObjectUtil.isEmpty(leftLock)){ + if (!ObjectUtil.isEmpty(leftLock)) { String error = leftLock.stream().collect(Collectors.joining(",")); throw new BadRequestException(error + "被锁定且未下发任务,无法生成任务!"); } option = "02"; - }else { + } else { //双通 String error = hasLock.stream() .map(a -> "仓位" + a.getString("struct_code") + "锁定单据" + a.getString("inv_code")) @@ -3382,31 +3493,35 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { // throw new BadRequestException(error + "被锁定且未下发任务,无法生成任务!"); // } } - } - else { + } else { //如果没有锁定这确认从左边出还是右边出库 - if (StringUtils.equals(placementType,"01")){ + if (StringUtils.equals(placementType, "01")) { //确认那边少出哪边- //查询当前排最大order //口回口口回口*口口 - HashMap maxParam = MapOf.of("flag", "52", "sect_id",left.getSect_id(),"block_num", left.getBlock_num(), "row_num", left.getRow_num()); + is_all = true; + HashMap maxParam = MapOf.of("flag", "52", "sect_id", left.getSect_id(), "block_num", left.getBlock_num(), "row_num", left.getRow_num()); JSONObject result = WQL.getWO("ST_OUTIVT04").addParamMap(maxParam).process().uniqueResult(0); Integer maxSeq = result.getInteger("maxseq"); Integer minSeq = result.getInteger("minseq"); int leftVe = Integer.valueOf(left.getOut_order_seq()) - minSeq; int rightVe = maxSeq - Integer.valueOf(right.getOut_order_seq()); - option = leftVe>rightVe?"02":"03"; - }else { + option = leftVe > rightVe ? "02" : "03"; + } else { option = placementType; } } //option确认了左边出库还是右边出库03右边,02左边 - String orderBy = "order by out_order_seq "+(option.equals("03")?"asc":"desc"); - HashMap structParam = MapOf.of("flag", "53", "order_by",orderBy,"sect_id",left.getSect_id(),"block_num", left.getBlock_num(), "row_num", left.getRow_num()); - return WQL.getWO("ST_OUTIVT04").addParamMap(structParam).process().getResultJSONArray(0).toJavaList(JSONObject.class); + String orderBy = "order by out_order_seq " + (option.equals("03") ? "asc" : "desc"); + HashMap structParam = MapOf.of("flag", "53", "order_by", orderBy, "sect_id", left.getSect_id(), "block_num", left.getBlock_num(), "row_num", left.getRow_num()); + JSONObject json = new JSONObject(); + json.put("is_all", is_all); + json.put("struct_list", WQL.getWO("ST_OUTIVT04").addParamMap(structParam).process().getResultJSONArray(0).toJavaList(JSONObject.class)); + return json; } + @Transactional - public void createMove(JSONObject struct){ + public void createMove(JSONObject struct) { //attr.struct_code,attr.lock_type,attr.storagevehicle_code,attr.inv_code JSONObject json = WQLObject.getWQLObject("st_ivt_structattr").query("struct_code = '" + struct.getString("struct_code") + "'").uniqueResult(0); JSONObject mapParam = new JSONObject();// 生成移库单传入参数 @@ -3471,7 +3586,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { json.put("point_code2", form.getString("point_code2")); json.put("material_id", form.getString("material_id")); json.put("task_group_id", form.getString("task_group_id")); - json.put("sort_seq", form.getString("sort_seq")+1); + json.put("sort_seq", form.getString("sort_seq") + 1); json.put("task_status", TaskStatusEnum.START_AND_POINT.getCode()); json.put("handle_class", HandMoveStorAcsTask.class.getName()); json.put("create_id", SecurityUtils.getCurrentUserId()); @@ -3487,11 +3602,12 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { handMoveStorService.insertDtl2(mapParam); moveStorAcsTask.immediateNotifyAcs(json.getString("task_id")); } + @Transactional - public void createOut(JSONObject struct){ + public void createOut(JSONObject struct) { List list = iStIvtIostorinvdisService .list(new QueryWrapper() - .eq("iostorinv_id",struct.getString("iostorinv_id")) + .eq("iostorinv_id", struct.getString("iostorinv_id")) .eq("box_no", struct.getString("storagevehicle_code"))); StIvtIostorinvdis oneDis = list.get(0); // 创建任务 @@ -3505,18 +3621,19 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { param.put("material_id", oneDis.getMaterial_id()); // 更新出库任务:任务组和顺序号 param.put("task_group_id", struct.getString("task_group_id")); // 任务组 - param.put("sort_seq", struct.getIntValue("sort_seq")+1); // 任务组顺序号 + param.put("sort_seq", struct.getIntValue("sort_seq") + 1); // 任务组顺序号 String create_task_id = outTask.createTask(param); //批量更细分配明细 List disIds = list.stream().map(StIvtIostorinvdis::getIostorinvdis_id).collect(Collectors.toList()); iStIvtIostorinvdisService.update(new UpdateWrapper() - .set("work_status","01") - .set("task_id",create_task_id) - .set("point_id",struct.getString("id")) - .eq("work_status","00") - .in("iostorinvdis_id",disIds)); + .set("work_status", "01") + .set("task_id", create_task_id) + .set("point_id", struct.getString("id")) + .eq("work_status", "00") + .in("iostorinvdis_id", disIds)); outTask.immediateNotifyAcs(create_task_id); } + public void formeth(Consumer allTransactionConsumer, JSONArray allRowArr, String iostorinv_id, String point_code, boolean checked, String iostorinvdtl_id, JSONObject jsonPoint2) { for (int i = 0; i < allRowArr.size(); i++) { // 调用当前排处理方法 @@ -3615,7 +3732,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); @@ -3649,7 +3766,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); @@ -3683,7 +3800,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); @@ -3720,7 +3837,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成"); @@ -3754,7 +3871,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成"); @@ -4075,7 +4192,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); @@ -4107,7 +4224,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); @@ -4139,7 +4256,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定且未下发任务,无法生成任务!"); @@ -4173,7 +4290,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成"); @@ -4204,7 +4321,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { for (int k = 0; k < numArr.size(); k++) { JSONObject json = numArr.getJSONObject(k); - error += json.getString("struct_code") + ", 锁定单据号:"+json.getString("inv_code"); + error += json.getString("struct_code") + ", 锁定单据号:" + json.getString("inv_code"); } throw new BadRequestException("仓位:" + error + "被锁定请等待下发任务并等待任务完成!"); @@ -4560,6 +4677,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } return result; } + public List isNumList(JSONArray arr) { StringJoiner joiner = new StringJoiner(",", "(", ")"); List result = new ArrayList<>(); @@ -5124,12 +5242,12 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (jo_mst.getString("bill_type").equals("1011")) { // 更新子卷包装净重 double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); - jsonSub.put("net_weight",net_weight); + jsonSub.put("net_weight", net_weight); if (net_weight <= 0) { - jsonSub.put("status","3"); + jsonSub.put("status", "3"); } else { - jsonSub.put("status","2"); + jsonSub.put("status", "2"); } } @@ -5162,7 +5280,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (is_zero) { from_start.put("storagevehicle_code", ""); } else { - from_start.put("bill_type","1011"); + from_start.put("bill_type", "1011"); from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); } } @@ -5271,7 +5389,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { //插入分配表 dis_wql.insert(dis_row); - total_qty = NumberUtil.add(total_qty,dis_row.getDoubleValue("plan_qty")); + total_qty = NumberUtil.add(total_qty, dis_row.getDoubleValue("plan_qty")); //将包装关系中对应的记录状态改为包装 HashMap map = new HashMap<>(); @@ -5756,12 +5874,12 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (jo_mst.getString("bill_type").equals("1011")) { // 更新子卷包装净重 double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); - jsonSub.put("net_weight",net_weight); + jsonSub.put("net_weight", net_weight); if (net_weight <= 0) { - jsonSub.put("status","3"); + jsonSub.put("status", "3"); } else { - jsonSub.put("status","2"); + jsonSub.put("status", "2"); } } @@ -5794,7 +5912,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (is_zero) { from_start.put("storagevehicle_code", ""); } else { - from_start.put("bill_type","1011"); + from_start.put("bill_type", "1011"); from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); } } @@ -5903,7 +6021,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { //插入分配表 dis_wql.insert(dis_row); - total_qty = NumberUtil.add(total_qty,dis_row.getDoubleValue("plan_qty")); + total_qty = NumberUtil.add(total_qty, dis_row.getDoubleValue("plan_qty")); //将包装关系中对应的记录状态改为包装 HashMap map = new HashMap<>(); @@ -6073,12 +6191,12 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (jo_mst.getString("bill_type").equals("1011")) { // 更新子卷包装净重 double net_weight = NumberUtil.sub(jsonSub.getDoubleValue("net_weight"), plan_qty); - jsonSub.put("net_weight",net_weight); + jsonSub.put("net_weight", net_weight); if (net_weight <= 0) { - jsonSub.put("status","3"); + jsonSub.put("status", "3"); } else { - jsonSub.put("status","2"); + jsonSub.put("status", "2"); } } @@ -6089,10 +6207,10 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { //如果为返检出库或者改切出库删除对应的包装关系 JSONArray dis_rows = new JSONArray(); if (jo_mst.getString("is_overdue").equals("1")) { - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0' and box_no = '"+jsonSub.getString("package_box_sn")+"'").getResultJSONArray(0); + dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and is_overdue = '0' and box_no = '" + jsonSub.getString("package_box_sn") + "'").getResultJSONArray(0); } else { - dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and box_no = '"+jsonSub.getString("package_box_sn")+"'").getResultJSONArray(0); + dis_rows = WQLObject.getWQLObject("ST_IVT_IOStorInvDis").query("iostorinv_id = '" + iostorinv_id + "' and box_no = '" + jsonSub.getString("package_box_sn") + "'").getResultJSONArray(0); } for (int j = 0; j < dis_rows.size(); j++) { @@ -6142,7 +6260,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { if (is_zero) { from_start.put("storagevehicle_code", ""); } else { - from_start.put("bill_type","1011"); + from_start.put("bill_type", "1011"); from_start.put("storagevehicle_code", jsonSub.getString("package_box_sn")); } } @@ -6463,13 +6581,13 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { } else { shd_dtl_num = jsonCust.getIntValue("shd_dtl_num"); if (ObjectUtil.isEmpty(shd_dtl_num)) { - throw new BadRequestException("客户编码:"+cust_code+",送货单明细数未配置,请先去配置!"); + throw new BadRequestException("客户编码:" + cust_code + ",送货单明细数未配置,请先去配置!"); } //1.根据出入库主表中 收货单位 查询客户表中的模板路径 code_template = jsonCust.getString("shd_print_no"); if (StrUtil.isEmpty(code_template)) { - throw new BadRequestException("客户编码:"+cust_code+",送货单打印模板号未配置,请先去配置!"); + throw new BadRequestException("客户编码:" + cust_code + ",送货单打印模板号未配置,请先去配置!"); } } @@ -6582,7 +6700,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { ExcelWriter workBook = EasyExcel.write(outputStream, null).withTemplate(code_template).build(); oneMap.put("all_qty", NumberUtil.round(all_qty, 1)); // 合计 - oneMap.put("all_real", NumberUtil.round(all_real,1)); // 总毛重 + oneMap.put("all_real", NumberUtil.round(all_real, 1)); // 总毛重 workBook.fill(oneMap, sheet); workBook.fill(new FillWrapper("data", flData), sheet); workBook.finish(); @@ -6646,7 +6764,7 @@ public class CheckOutBillServiceImpl implements CheckOutBillService { // 订单号 ExcelWriter workBook = EasyExcel.write(outputStream, null).withTemplate(code_template).build(); oneMap.put("all_qty", NumberUtil.round(all_qty, 1)); // 合计 - oneMap.put("all_real", NumberUtil.round(all_real,1)); // 总毛重 + oneMap.put("all_real", NumberUtil.round(all_real, 1)); // 总毛重 WriteSheet sheet = EasyExcel.writerSheet(0).build(); workBook.fill(oneMap, sheet); workBook.fill(new FillWrapper("data", flData), sheet);