diff --git a/zbf-common/src/main/java/com/zbf/common/enums/custom/InboundReceiverPlaceholder.java b/zbf-common/src/main/java/com/zbf/common/enums/custom/InboundReceiverPlaceholder.java new file mode 100644 index 0000000..a17a48d --- /dev/null +++ b/zbf-common/src/main/java/com/zbf/common/enums/custom/InboundReceiverPlaceholder.java @@ -0,0 +1,28 @@ +package com.zbf.common.enums.custom; + +/** + * 入库收货人占位标识 + */ +public enum InboundReceiverPlaceholder +{ + UNASSIGNED("0", "未指定收货人"); + + private final String code; + private final String description; + + InboundReceiverPlaceholder(String code, String description) + { + this.code = code; + this.description = description; + } + + public String getCode() + { + return code; + } + + public String getDescription() + { + return description; + } +} diff --git a/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsBatchAttr07Type.java b/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsBatchAttr07Type.java new file mode 100644 index 0000000..59547bb --- /dev/null +++ b/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsBatchAttr07Type.java @@ -0,0 +1,29 @@ +package com.zbf.common.enums.custom; + +/** + * IWMS批次属性07类型 + */ +public enum IwmsBatchAttr07Type +{ + TRAY("1", "托盘"), + BOX("2", "料箱"); + + private final String code; + private final String description; + + IwmsBatchAttr07Type(String code, String description) + { + this.code = code; + this.description = description; + } + + public String getCode() + { + return code; + } + + public String getDescription() + { + return description; + } +} diff --git a/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsOutboundOrderType.java b/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsOutboundOrderType.java new file mode 100644 index 0000000..c1ee40e --- /dev/null +++ b/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsOutboundOrderType.java @@ -0,0 +1,28 @@ +package com.zbf.common.enums.custom; + +/** + * IWMS出库单类型 + */ +public enum IwmsOutboundOrderType +{ + OUTBOUND("50", "IWMS出库单"); + + private final String code; + private final String description; + + IwmsOutboundOrderType(String code, String description) + { + this.code = code; + this.description = description; + } + + public String getCode() + { + return code; + } + + public String getDescription() + { + return description; + } +} diff --git a/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsOwnerCode.java b/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsOwnerCode.java new file mode 100644 index 0000000..b0aeffc --- /dev/null +++ b/zbf-common/src/main/java/com/zbf/common/enums/custom/IwmsOwnerCode.java @@ -0,0 +1,28 @@ +package com.zbf.common.enums.custom; + +/** + * IWMS货主编码 + */ +public enum IwmsOwnerCode +{ + DEFAULT_OWNER("8000", "默认货主"); + + private final String code; + private final String description; + + IwmsOwnerCode(String code, String description) + { + this.code = code; + this.description = description; + } + + public String getCode() + { + return code; + } + + public String getDescription() + { + return description; + } +} diff --git a/zbf-common/src/main/java/com/zbf/common/enums/custom/StockFreezeStatus.java b/zbf-common/src/main/java/com/zbf/common/enums/custom/StockFreezeStatus.java new file mode 100644 index 0000000..3ea3748 --- /dev/null +++ b/zbf-common/src/main/java/com/zbf/common/enums/custom/StockFreezeStatus.java @@ -0,0 +1,29 @@ +package com.zbf.common.enums.custom; + +/** + * 库存冻结状态 + */ +public enum StockFreezeStatus +{ + UNFROZEN("0", "未冻结"), + FROZEN("1", "已冻结"); + + private final String code; + private final String description; + + StockFreezeStatus(String code, String description) + { + this.code = code; + this.description = description; + } + + public String getCode() + { + return code; + } + + public String getDescription() + { + return description; + } +} diff --git a/zbf-system/src/main/java/com/zbf/system/service/impl/TCkOrdersServiceImpl.java b/zbf-system/src/main/java/com/zbf/system/service/impl/TCkOrdersServiceImpl.java index 10c3b76..20be6a3 100644 --- a/zbf-system/src/main/java/com/zbf/system/service/impl/TCkOrdersServiceImpl.java +++ b/zbf-system/src/main/java/com/zbf/system/service/impl/TCkOrdersServiceImpl.java @@ -14,6 +14,7 @@ import com.zbf.common.core.domain.entity.SysDept; import com.zbf.common.core.domain.entity.SysUser; import com.zbf.common.core.domain.model.LoginUser; import com.zbf.common.enums.DataSourceType; +import com.zbf.common.enums.custom.*; import com.zbf.common.exception.ServiceException; import com.zbf.common.utils.DateUtils; import com.zbf.common.utils.OrderCodeFactory; @@ -129,7 +130,7 @@ public class TCkOrdersServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TCkOrders::getDeliveryId, deliveryId); - List tCkOrders1 = tCkOrdersMapper.selectList(queryWrapper); - if (tCkOrders1.size() > 0) { + List existingOrders = tCkOrdersMapper.selectList(queryWrapper); + if (existingOrders.size() > 0) { throw new RuntimeException("来源单号已存在,请修改后再提交!"); } if(StringUtils.isEmpty(tCkOrders.getApplicant())){ @@ -217,10 +218,10 @@ public class TCkOrdersServiceImpl extends ServiceImpl3){ - SysDept sysDept1 = sysDeptMapper.selectDeptById(Long.valueOf(split[3])); - tCkOrders.setDeptName(sysDept1.getDeptName()); + String[] ancestorDeptIds = sysDept.getAncestors().split(","); + if(ancestorDeptIds.length>3){ + SysDept businessDept = sysDeptMapper.selectDeptById(Long.valueOf(ancestorDeptIds[3])); + tCkOrders.setDeptName(businessDept.getDeptName()); }else{ tCkOrders.setDeptName(sysDept.getDeptName()); } @@ -300,8 +301,6 @@ public class TCkOrdersServiceImpl extends ServiceImpl goodsVos = new ArrayList<>(); + List outboundGoodsList = new ArrayList<>(); //查询明细 - TCkOrderdetail tCkOrderdetail = new TCkOrderdetail(); - tCkOrderdetail.setOrderId(tCkOrders.getId()); - List tCkOrderdetailList = tCkOrderdetailMapper.selectTCkOrderdetailList(tCkOrderdetail); - if(tCkOrderdetailList.size() == 0){ + TCkOrderdetail orderDetailQuery = new TCkOrderdetail(); + orderDetailQuery.setOrderId(tCkOrders.getId()); + List orderDetailList = tCkOrderdetailMapper.selectTCkOrderdetailList(orderDetailQuery); + if(orderDetailList.size() == 0){ logger.error("没有获取到明细条数===="); throw new RuntimeException("未获取到明细,请确认!"); } - String storageId = StringUtils.EMPTY; - for (TCkOrderdetail tCkOrderdetail1 : tCkOrderdetailList) { + String outboundStorageShortName = StringUtils.EMPTY; + for (TCkOrderdetail orderDetail : orderDetailList) { GoodsVo goodsVo = new GoodsVo(); - goodsVo.setId(tCkOrderdetail1.getId()); - goodsVo.setGoodsId(tCkOrderdetail1.getGoodsId()); - goodsVo.setGoodsName(tCkOrderdetail1.getGoodsName()); - goodsVo.setPrice(tCkOrderdetail1.getPrice()); - goodsVo.setUnit(tCkOrderdetail1.getUnit()); - goodsVo.setShelvesNum(tCkOrderdetail1.getShelvesNum()); - goodsVo.setStorageId(tCkOrderdetail1.getStorageId()); - goodsVo.setStorageShortName(tCkOrderdetail1.getStorageShortName()); - if(StringUtils.isBlank(storageId)){ - storageId = tCkOrderdetail1.getStorageShortName(); + goodsVo.setId(orderDetail.getId()); + goodsVo.setGoodsId(orderDetail.getGoodsId()); + goodsVo.setGoodsName(orderDetail.getGoodsName()); + goodsVo.setPrice(orderDetail.getPrice()); + goodsVo.setUnit(orderDetail.getUnit()); + goodsVo.setShelvesNum(orderDetail.getShelvesNum()); + goodsVo.setStorageId(orderDetail.getStorageId()); + goodsVo.setStorageShortName(orderDetail.getStorageShortName()); + if(StringUtils.isBlank(outboundStorageShortName)){ + outboundStorageShortName = orderDetail.getStorageShortName(); } - goodsVo.setTotal(tCkOrderdetail1.getStockNum()); - goodsVo.setRemark(tCkOrderdetail1.getRemark()); + goodsVo.setTotal(orderDetail.getStockNum()); + goodsVo.setRemark(orderDetail.getRemark()); //物资流向 - goodsVo.setGoodsTo(tCkOrderdetail1.getGoodsTo()); + goodsVo.setGoodsTo(orderDetail.getGoodsTo()); - goodsVo.setLevelType(tCkOrderdetail1.getLevelType()); - goodsVo.setSpecification(tCkOrderdetail1.getSpecification()); - goodsVo.setRecoil(tCkOrderdetail1.getRecoil()); + goodsVo.setLevelType(orderDetail.getLevelType()); + goodsVo.setSpecification(orderDetail.getSpecification()); + goodsVo.setRecoil(orderDetail.getRecoil()); - goodsVos.add(goodsVo); + outboundGoodsList.add(goodsVo); //更新呼叫数量 - TCkOrderdetail tCkOrderdetail2 = new TCkOrderdetail(); - tCkOrderdetail2.setId(tCkOrderdetail1.getId()); - tCkOrderdetail2.setCallShelvesNum(tCkOrderdetail1.getShelvesNum()); - tCkOrderdetailMapper.updateTCkOrderdetail(tCkOrderdetail2); + TCkOrderdetail orderDetailUpdate = new TCkOrderdetail(); + orderDetailUpdate.setId(orderDetail.getId()); + orderDetailUpdate.setCallShelvesNum(orderDetail.getShelvesNum()); + tCkOrderdetailMapper.updateTCkOrderdetail(orderDetailUpdate); } - outBound.setStorageId(storageId); - outBound.setItemList(JSONUtil.toJsonStr(goodsVos)); + outBound.setStorageId(outboundStorageShortName); + outBound.setItemList(JSONUtil.toJsonStr(outboundGoodsList)); //查询token,创建实例 - String instance = d_service.createInstance(outBound); - logger.info("创建的实例ID:{}",instance); - if(StringUtils.isBlank(instance)){ + String instanceId = dingTalkService.createInstance(outBound); + logger.info("创建的实例ID:{}",instanceId); + if(StringUtils.isBlank(instanceId)){ logger.warn("创建实例ID异常,只能本地审批,无法通过钉钉审批了,流程继续,申请人:{}",getUsername()); //throw new RuntimeException("创建钉钉实例异常===》》》》"); } - outBound.setInstanceId(instance); + outBound.setInstanceId(instanceId); outBoundService.insertOutBound(outBound); //更新出库主表钉钉实例ID - tCkOrders.setInstanceId(instance); + tCkOrders.setInstanceId(instanceId); int row = tCkOrdersMapper.updateTCkOrders(tCkOrders); return row; } @@ -419,10 +416,10 @@ public class TCkOrdersServiceImpl extends ServiceImpl tCkOrderdetails) { + public int insertTCkOrdersDetails(List orderDetails) { //根据goodsId判断是否有重复的 用lanmada表达式 // 判断是否存在重复的GoodsId - boolean hasDuplicate = tCkOrderdetails.stream() + boolean hasDuplicate = orderDetails.stream() .collect(Collectors.groupingBy(TCkOrderdetail::getGoodsId)) .values() .stream() @@ -431,62 +428,62 @@ public class TCkOrdersServiceImpl extends ServiceImpl queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(TCkOrderdetail::getOrderId, orderdetail.getOrderId()); - queryWrapper.eq(TCkOrderdetail::getGoodsId, orderdetail.getGoodsId()); - List tCkOrderdetails1 = tCkOrderdetailMapper.selectList(queryWrapper); - for (TCkOrderdetail ckOrderdetail : tCkOrderdetails) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TMiStock::getGoodsId, ckOrderdetail.getGoodsId()); - wrapper.eq(TMiStock::getStatus, "1"); - List tMiStocks = tMiStockMapper.selectList(wrapper); - if (!tMiStocks.isEmpty()) { - throw new RuntimeException(ckOrderdetail.getGoodsName() + "物料已被冻结"); + queryWrapper.eq(TCkOrderdetail::getOrderId, orderDetail.getOrderId()); + queryWrapper.eq(TCkOrderdetail::getGoodsId, orderDetail.getGoodsId()); + List existingOrderDetails = tCkOrderdetailMapper.selectList(queryWrapper); + for (TCkOrderdetail currentOrderDetail : orderDetails) { + LambdaQueryWrapper stockQueryWrapper = new LambdaQueryWrapper<>(); + stockQueryWrapper.eq(TMiStock::getGoodsId, currentOrderDetail.getGoodsId()); + stockQueryWrapper.eq(TMiStock::getStatus, OutboundResourceLockStatus.LOCKED.getCode()); + List lockedStocks = tMiStockMapper.selectList(stockQueryWrapper); + if (!lockedStocks.isEmpty()) { + throw new RuntimeException(currentOrderDetail.getGoodsName() + "物料已被冻结"); } } - String goodsId = orderdetail.getGoodsId(); - LambdaQueryWrapper goods = new LambdaQueryWrapper<>(); - goods.eq(TBaseGoods::getGoodsId, goodsId); - TBaseGoods tBaseGoods = goodsMapper.selectOne(goods); + String goodsId = orderDetail.getGoodsId(); + LambdaQueryWrapper goodsQueryWrapper = new LambdaQueryWrapper<>(); + goodsQueryWrapper.eq(TBaseGoods::getGoodsId, goodsId); + TBaseGoods goodsInfo = goodsMapper.selectOne(goodsQueryWrapper); //原来仓库 //总价 - BigDecimal price = tBaseGoods.getPrice(); + BigDecimal price = goodsInfo.getPrice(); // 设置默认值 if (price == null || price.compareTo(BigDecimal.ZERO) == 0) { price = BigDecimal.ZERO; // 默认值为 1 } - orderdetail.setPrice(price); - BigDecimal totalPrice = price.multiply(shelvesNum); - orderdetail.setToMoney(totalPrice); + orderDetail.setPrice(price); + BigDecimal totalPrice = price.multiply(requiredShelvesNum); + orderDetail.setToMoney(totalPrice); - orderdetail.setUpdateTime(DateUtils.getNowDate()); - orderdetail.setCreateTime(DateUtils.getNowDate()); - orderdetail.setConfirmStatus("0"); - if (StringUtils.isNotBlank(orderdetail.getId())) { - if (tCkOrderdetails1.size() > 1) { + orderDetail.setUpdateTime(DateUtils.getNowDate()); + orderDetail.setCreateTime(DateUtils.getNowDate()); + orderDetail.setConfirmStatus(OutboundConfirmStatus.PENDING.getCode()); + if (StringUtils.isNotBlank(orderDetail.getId())) { + if (existingOrderDetails.size() > 1) { throw new RuntimeException("更新物料重复异常"); } - tCkOrderdetailMapper.update(orderdetail, queryWrapper); + tCkOrderdetailMapper.update(orderDetail, queryWrapper); } else { - if (tCkOrderdetails1.size() > 0) { + if (existingOrderDetails.size() > 0) { throw new RuntimeException("新增物料重复异常"); } - orderdetail.setId(OrderCodeFactory.getOrderCode("CKTM", "")); + orderDetail.setId(OrderCodeFactory.getOrderCode("CKTM", "")); //todo 暂时通过remark记录物资流向 - if(StringUtils.isNotBlank(orderdetail.getRemark())) { - orderdetail.setGoodsTo(orderdetail.getRemark()); + if(StringUtils.isNotBlank(orderDetail.getRemark())) { + orderDetail.setGoodsTo(orderDetail.getRemark()); } - tCkOrderdetailMapper.insert(orderdetail); + tCkOrderdetailMapper.insert(orderDetail); } } return 1; @@ -502,135 +499,135 @@ public class TCkOrdersServiceImpl extends ServiceImpl tCkOrderdetailList = tCkOrders.getTckOrderdetailList(); - if (tCkOrderdetailList.size() == 0) { + List orderDetails = tCkOrders.getTckOrderdetailList(); + if (orderDetails.size() == 0) { logger.error("出库明细条数必须大于0"); throw new RuntimeException("出库明细条数必须大于0"); } //1. 判断库存是否满足 // String storageId = tCkOrders.getStorageId(); //判断是否选中了仓库,如果没有选中,则从所有权限下仓库进行查询,如果选中了,则从指定仓库选择 - logger.info("出库请求解析开始:{}", tCkOrderdetailList); + logger.info("出库请求解析开始:{}", orderDetails); //value: 以托盘号为key,该托盘出库该物料的出库数量为value的map - Map> goodsMap = new HashMap>(); - List outStockVos = new ArrayList<>(); + Map> goodsLocationQuantityMap = new HashMap>(); + List selectedOutboundStocks = new ArrayList<>(); // 所有仓库集合 - List totalStorageList = new ArrayList<>(); + List involvedStorageIds = new ArrayList<>(); - for (TCkOrderdetail orderdetail : tCkOrderdetailList) { - if ("2".equals(orderdetail.getConfirmStatus())) { - logger.info("已出库完成的忽略:{}", orderdetail.getGoodsId()); + for (TCkOrderdetail orderDetail : orderDetails) { + if (OutboundConfirmStatus.COMPLETED.getCode().equals(orderDetail.getConfirmStatus())) { + logger.info("已出库完成的忽略:{}", orderDetail.getGoodsId()); continue; } - Map locationMap = new HashMap<>(); - TMiStock tMiStock = new TMiStock(); - tMiStock.setGoodsId(orderdetail.getGoodsId()); - tMiStock.setGoodsName(orderdetail.getGoodsName()); + Map locationOutboundQuantityMap = new HashMap<>(); + TMiStock stockQuery = new TMiStock(); + stockQuery.setGoodsId(orderDetail.getGoodsId()); + stockQuery.setGoodsName(orderDetail.getGoodsName()); - if (StringUtils.isNotBlank(orderdetail.getStorageId())) { - tMiStock.setStorageId(orderdetail.getStorageId()); + if (StringUtils.isNotBlank(orderDetail.getStorageId())) { + stockQuery.setStorageId(orderDetail.getStorageId()); } else { - TBaseStorage baseStorage = new TBaseStorage(); - baseStorage.setDeptId(tCkOrders.getDeptId()); - List tBaseStorages = baseStorageService.selectTBaseStorageList(baseStorage); - tMiStock.setStorageList(tBaseStorages.stream().map(TBaseStorage::getStorageId).collect(Collectors.toList())); + TBaseStorage storageQuery = new TBaseStorage(); + storageQuery.setDeptId(tCkOrders.getDeptId()); + List availableStorages = baseStorageService.selectTBaseStorageList(storageQuery); + stockQuery.setStorageList(availableStorages.stream().map(TBaseStorage::getStorageId).collect(Collectors.toList())); } - if(StringUtils.isNotBlank(orderdetail.getCtl())){ - tMiStock.setCtl(orderdetail.getCtl()); + if(StringUtils.isNotBlank(orderDetail.getCtl())){ + stockQuery.setCtl(orderDetail.getCtl()); } - if(StringUtils.isNotBlank(orderdetail.getLocationId())){ - tMiStock.setLocationId(orderdetail.getLocationId()); + if(StringUtils.isNotBlank(orderDetail.getLocationId())){ + stockQuery.setLocationId(orderDetail.getLocationId()); } // LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); // wrapper.eq(TMiStock::getGoodsId, tMiStock.getGoodsId()); // wrapper.eq(TMiStock::getGoodsName, tMiStock.getGoodsName()); - List tMiStocks = tMiStockMapper.selectTMiStockList(tMiStock); + List candidateStocks = tMiStockMapper.selectTMiStockList(stockQuery); - if (tMiStocks.size() == 0) { - logger.warn("未找到该物料库存或在冻结中:{}", orderdetail.getGoodsId()); - throw new RuntimeException("未找到该物料库存或在冻结中:" + orderdetail.getGoodsId()); + if (candidateStocks.size() == 0) { + logger.warn("未找到该物料库存或在冻结中:{}", orderDetail.getGoodsId()); + throw new RuntimeException("未找到该物料库存或在冻结中:" + orderDetail.getGoodsId()); } // 分组逻辑:如果指定了 ctl,则只处理该 ctl 分组;否则按 locationId 分组,并只取每组的第一条 - String specifiedCtl = orderdetail.getCtl(); // 假设从 orderdetail 中获取 ctl - Map> groupedStocks; - if (StringUtils.isNotBlank(specifiedCtl)) { - groupedStocks = tMiStocks.stream() + String specifiedPalletCode = orderDetail.getCtl(); + Map> groupedStockMap; + if (StringUtils.isNotBlank(specifiedPalletCode)) { + groupedStockMap = candidateStocks.stream() .collect(Collectors.groupingBy(TMiStock::getCtl)); } else { - groupedStocks = tMiStocks.stream() + groupedStockMap = candidateStocks.stream() .collect(Collectors.groupingBy(TMiStock::getLocationId)); } - BigDecimal goodsNum = orderdetail.getGoodsNum(); - BigDecimal total = BigDecimal.ZERO; + BigDecimal requiredGoodsNum = orderDetail.getGoodsNum(); + BigDecimal accumulatedAvailableQuantity = BigDecimal.ZERO; // 处理分组 - StringBuilder sb = new StringBuilder(); - for (List stocks : groupedStocks.values()) { - TMiStock tMiStock1 = stocks.get(0); // 取每组的第一条记录 - total = total.add(tMiStock1.getShelvesNum()); - if (orderdetail.getPickNum() == null) { - orderdetail.setPickNum(BigDecimal.ZERO); + StringBuilder salesOrderNumbersBuilder = new StringBuilder(); + for (List stockGroup : groupedStockMap.values()) { + TMiStock stockSnapshot = stockGroup.get(0); // 取每组的第一条记录 + accumulatedAvailableQuantity = accumulatedAvailableQuantity.add(stockSnapshot.getShelvesNum()); + if (orderDetail.getPickNum() == null) { + orderDetail.setPickNum(BigDecimal.ZERO); } - OutStockVo outStockVo = new OutStockVo(); - outStockVo.setId(tMiStock1.getId()); - outStockVo.setLocationId(tMiStock1.getLocationId()); + OutStockVo outboundStock = new OutStockVo(); + outboundStock.setId(stockSnapshot.getId()); + outboundStock.setLocationId(stockSnapshot.getLocationId()); - if (goodsNum.compareTo(total) == 0) { - locationMap.put(tMiStock1.getLocationId(), tMiStock1.getShelvesNum()); - outStockVo.setShelvesNum(tMiStock1.getShelvesNum()); - outStockVos.add(outStockVo); - orderdetail.setPickNum(orderdetail.getPickNum().add(tMiStock1.getShelvesNum())); - sb.append(tMiStock1.getSalesOrderNumber()).append(","); - totalStorageList.add(tMiStock1.getStorageId()); + if (requiredGoodsNum.compareTo(accumulatedAvailableQuantity) == 0) { + locationOutboundQuantityMap.put(stockSnapshot.getLocationId(), stockSnapshot.getShelvesNum()); + outboundStock.setShelvesNum(stockSnapshot.getShelvesNum()); + selectedOutboundStocks.add(outboundStock); + orderDetail.setPickNum(orderDetail.getPickNum().add(stockSnapshot.getShelvesNum())); + salesOrderNumbersBuilder.append(stockSnapshot.getSalesOrderNumber()).append(","); + involvedStorageIds.add(stockSnapshot.getStorageId()); break; - } else if (goodsNum.compareTo(total) > 0) { - locationMap.put(tMiStock1.getLocationId(), tMiStock1.getShelvesNum()); - outStockVo.setShelvesNum(tMiStock1.getShelvesNum()); - outStockVos.add(outStockVo); - orderdetail.setPickNum(orderdetail.getPickNum().add(tMiStock1.getShelvesNum())); - sb.append(tMiStock1.getSalesOrderNumber()).append(","); - totalStorageList.add(tMiStock1.getStorageId()); + } else if (requiredGoodsNum.compareTo(accumulatedAvailableQuantity) > 0) { + locationOutboundQuantityMap.put(stockSnapshot.getLocationId(), stockSnapshot.getShelvesNum()); + outboundStock.setShelvesNum(stockSnapshot.getShelvesNum()); + selectedOutboundStocks.add(outboundStock); + orderDetail.setPickNum(orderDetail.getPickNum().add(stockSnapshot.getShelvesNum())); + salesOrderNumbersBuilder.append(stockSnapshot.getSalesOrderNumber()).append(","); + involvedStorageIds.add(stockSnapshot.getStorageId()); } else { - BigDecimal subtract = total.subtract(goodsNum); - BigDecimal subtract1 = tMiStock1.getShelvesNum().subtract(subtract); - locationMap.put(tMiStock1.getLocationId(), subtract1); - outStockVo.setShelvesNum(subtract1); - outStockVos.add(outStockVo); - orderdetail.setPickNum(orderdetail.getPickNum().add(subtract1)); - sb.append(tMiStock1.getSalesOrderNumber()).append(","); - totalStorageList.add(tMiStock1.getStorageId()); + BigDecimal excessQuantity = accumulatedAvailableQuantity.subtract(requiredGoodsNum); + BigDecimal actualOutboundQuantity = stockSnapshot.getShelvesNum().subtract(excessQuantity); + locationOutboundQuantityMap.put(stockSnapshot.getLocationId(), actualOutboundQuantity); + outboundStock.setShelvesNum(actualOutboundQuantity); + selectedOutboundStocks.add(outboundStock); + orderDetail.setPickNum(orderDetail.getPickNum().add(actualOutboundQuantity)); + salesOrderNumbersBuilder.append(stockSnapshot.getSalesOrderNumber()).append(","); + involvedStorageIds.add(stockSnapshot.getStorageId()); break; } } - if(sb.toString().length()>1){ - String substring = sb.substring(0, sb.length()-1); - orderdetail.setBusinessId(substring); + if(salesOrderNumbersBuilder.toString().length()>1){ + String salesOrderNumbers = salesOrderNumbersBuilder.substring(0, salesOrderNumbersBuilder.length()-1); + orderDetail.setBusinessId(salesOrderNumbers); } - goodsMap.put(orderdetail.getGoodsId(), locationMap); - logger.info("更新累计出库数量:{}", orderdetail); - orderdetail.setConfirmStatus("0"); - tCkOrderdetailMapper.updateTCkOrderdetail(orderdetail); + goodsLocationQuantityMap.put(orderDetail.getGoodsId(), locationOutboundQuantityMap); + logger.info("更新累计出库数量:{}", orderDetail); + orderDetail.setConfirmStatus(OutboundConfirmStatus.PENDING.getCode()); + tCkOrderdetailMapper.updateTCkOrderdetail(orderDetail); } - if (goodsMap.isEmpty()) { + if (goodsLocationQuantityMap.isEmpty()) { logger.warn("未找到出库物料"); throw new RuntimeException("未找到出库物料,请确认!"); } //设置主表status为锁定 - TCkOrders tCkOrders1 = new TCkOrders(); - tCkOrders1.setStatus("1"); - tCkOrders1.setId(tCkOrders.getId()); - tCkOrders1.setUpdateBy(SecurityUtils.getUserNick()); - tCkOrders1.setUpdateTime(new Date()); - tCkOrdersMapper.updateById(tCkOrders1); + TCkOrders lockedOrder = new TCkOrders(); + lockedOrder.setStatus(OutboundOrderStatus.LOCKED.getCode()); + lockedOrder.setId(tCkOrders.getId()); + lockedOrder.setUpdateBy(SecurityUtils.getUserNick()); + lockedOrder.setUpdateTime(new Date()); + tCkOrdersMapper.updateById(lockedOrder); //创建出库任务 /** @@ -642,66 +639,66 @@ public class TCkOrdersServiceImpl extends ServiceImpl> locationGoodsMap = new HashMap<>(); - goodsMap.forEach((goodsId, ctlMap) -> { - ctlMap.forEach((locationId, shelvNum) -> { - AtomicBoolean isExist = new AtomicBoolean(false); - locationGoodsMap.forEach((key, value) -> { - if (locationId.equals(key)) { - isExist.set(true); - value.put(goodsId, shelvNum); + Map> locationGoodsQuantityMap = new HashMap<>(); + goodsLocationQuantityMap.forEach((goodsId, locationQuantityMap) -> { + locationQuantityMap.forEach((locationId, shelvesNum) -> { + AtomicBoolean locationExists = new AtomicBoolean(false); + locationGoodsQuantityMap.forEach((existingLocationId, goodsQuantityMap) -> { + if (locationId.equals(existingLocationId)) { + locationExists.set(true); + goodsQuantityMap.put(goodsId, shelvesNum); } }); - if (!isExist.get()) { - Map map = new HashMap<>(); - map.put(goodsId, shelvNum); - locationGoodsMap.put(locationId, map); + if (!locationExists.get()) { + Map goodsQuantityMap = new HashMap<>(); + goodsQuantityMap.put(goodsId, shelvesNum); + locationGoodsQuantityMap.put(locationId, goodsQuantityMap); } }); }); - logger.info("生成以库位编号为主键的map:{}", locationGoodsMap); + logger.info("生成以库位编号为主键的map:{}", locationGoodsQuantityMap); // 发送呼叫任务 - TCallNotice tCallNotice = new TCallNotice(); - tCallNotice.setId(IdUtils.randomUUID()); + TCallNotice callNotice = new TCallNotice(); + callNotice.setId(IdUtils.randomUUID()); //根据每个托盘创建出库任务 //1. 判断出库任务是否已产生该托盘的任务 - locationGoodsMap.forEach((key, value) -> { - TCkPickingwavegoods tCkPickingwavegoods = new TCkPickingwavegoods(); - tCkPickingwavegoods.setLocationId(key); - tCkPickingwavegoods.setGoodsIdList(new ArrayList(value.keySet())); - tCkPickingwavegoods.setOutId(tCkOrders.getId()); + locationGoodsQuantityMap.forEach((locationId, goodsQuantityMap) -> { + TCkPickingwavegoods pickingTaskQuery = new TCkPickingwavegoods(); + pickingTaskQuery.setLocationId(locationId); + pickingTaskQuery.setGoodsIdList(new ArrayList<>(goodsQuantityMap.keySet())); + pickingTaskQuery.setOutId(tCkOrders.getId()); //判断该库位编号是否产生出库任务 - List tCkPickingwavegoodsList = tCkPickingwavegoodsMapper.selectTCkPickingwavegoodsList(tCkPickingwavegoods); - if (tCkPickingwavegoodsList.size() > 0) { - logger.error("该库位已产生出库任务:{}", key); - throw new RuntimeException("该库位已产生出库任务:" + key); + List existingPickingTasks = tCkPickingwavegoodsMapper.selectTCkPickingwavegoodsList(pickingTaskQuery); + if (existingPickingTasks.size() > 0) { + logger.error("该库位已产生出库任务:{}", locationId); + throw new RuntimeException("该库位已产生出库任务:" + locationId); } //出库 添加呼叫任务号 - setCk(key, value, tCkOrders.getId(), tCkOrders.getOrderId(), tCkOrders.getCkType(), - outStockVos.stream().filter(stock -> stock.getLocationId().equals(key)).collect(Collectors.toList()), - tCallNotice.getId()); + createLocationOutboundTasks(locationId, tCkOrders.getId(), tCkOrders.getOrderId(), tCkOrders.getCkType(), + selectedOutboundStocks.stream().filter(stock -> stock.getLocationId().equals(locationId)).collect(Collectors.toList()), + callNotice.getId()); }); // 仓库ID去重 - totalStorageList = totalStorageList.stream().distinct().collect(Collectors.toList()); + involvedStorageIds = involvedStorageIds.stream().distinct().collect(Collectors.toList()); - totalStorageList.forEach((key) -> { + involvedStorageIds.forEach((storageId) -> { // 仓库id - tCallNotice.setStorageId(key); + callNotice.setStorageId(storageId); // 托盘号 // tCallNotice.setCtl(""); // pLCID // tCallNotice.setPlcid(""); // 任务类型 1:出库任务 - tCallNotice.setTaskType("1"); + callNotice.setTaskType(NoticeTaskType.OUTBOUND.getCode()); // 物料编码 // tCallNotice.setGoodsId(tCkPickingwavegoods.getGoodsId()); // 物料名称 @@ -709,17 +706,17 @@ public class TCkOrdersServiceImpl extends ServiceImpl map, - String id, String orderId, String ckType - , List outStockVos, String callNoticeId) { - if (outStockVos.size() == 0) { + private void createLocationOutboundTasks(String locationId, String outboundOrderId, String outboundNoticeId, + String outboundType, List outboundStocks, String callNoticeId) { + if (outboundStocks.size() == 0) { throw new RuntimeException("没有获取到该物料库存明细"); } // TMiStock tMiStock = new TMiStock(); @@ -815,14 +811,14 @@ public class TCkOrdersServiceImpl extends ServiceImpl tCkOrderss = tCkOrdersMapper.selectTCkOrdersList(tCkOrders); - if (tCkOrderss.size() == 0) { - setTckOrders(tCkOrders, tCkOrderdetailb1, operName); - tCkOrdersMapper.insertTCkOrders(tCkOrders); + firstImportedDetail.setDeliveryId(generateRandomHexCode(8)); + TCkOrders importedOrder = new TCkOrders(); + importedOrder.setDeliveryId(firstImportedDetail.getDeliveryId()); + List existingImportedOrders = tCkOrdersMapper.selectTCkOrdersList(importedOrder); + if (existingImportedOrders.size() == 0) { + initializeImportedOrder(importedOrder, firstImportedDetail, operName); + tCkOrdersMapper.insertTCkOrders(importedOrder); } else if (isUpdateSupport) { - List collect = tCkOrderss.stream().map(TCkOrders::getId).collect(Collectors.toList()); + List collect = existingImportedOrders.stream().map(TCkOrders::getId).collect(Collectors.toList()); tCkOrdersMapper.deleteTCkOrdersByIds(collect.toArray(new String[collect.size()])); - setTckOrders(tCkOrders, tCkOrderdetailb1, operName); - tCkOrdersMapper.insertTCkOrders(tCkOrders); + initializeImportedOrder(importedOrder, firstImportedDetail, operName); + tCkOrdersMapper.insertTCkOrders(importedOrder); } else { - throw new ServiceException("来源单号 " + tCkOrderdetailb1.getDeliveryId() + " 重复导入异常!"); + throw new ServiceException("来源单号 " + firstImportedDetail.getDeliveryId() + " 重复导入异常!"); } for (int i = 0; i < dataList.size(); i++) { try { //校验必输字段 - TCkOrderdetail tab = dataList.get(i); - checkData(i, tab); + TCkOrderdetail importedDetail = dataList.get(i); + checkData(i, importedDetail); // 验证是否存在该明细 - TCkOrderdetail tCkOrderdetail = new TCkOrderdetail(); - tCkOrderdetail.setDeliveryId(tab.getDeliveryId()); - tCkOrderdetail.setGoodsId(tab.getGoodsId()); - tCkOrderdetail.setLevelType("2"); + TCkOrderdetail detailQuery = new TCkOrderdetail(); + detailQuery.setDeliveryId(importedDetail.getDeliveryId()); + detailQuery.setGoodsId(importedDetail.getGoodsId()); + detailQuery.setLevelType(InboundLevelType.LEVEL_TWO.getCode()); - List tCkOrderdetailList = tCkOrderdetailMapper.selectTCkOrderdetailList(tCkOrderdetail); - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TMiStock::getGoodsId, tab.getGoodsId()); - TMiStock tMiStock = tMiStockMapper.selectOne(wrapper); - if (tMiStock.getStatus().equals("1")) { + List existingDetailList = tCkOrderdetailMapper.selectTCkOrderdetailList(detailQuery); + LambdaQueryWrapper stockQueryWrapper = new LambdaQueryWrapper<>(); + stockQueryWrapper.eq(TMiStock::getGoodsId, importedDetail.getGoodsId()); + TMiStock stockRecord = tMiStockMapper.selectOne(stockQueryWrapper); + if (stockRecord.getStatus().equals(OutboundResourceLockStatus.LOCKED.getCode())) { successNum++; - failureMsg.append("
" + tMiStock.getGoodsId() + "、物料编号 " + tab.getGoodsNum() + " 已锁定"); + failureMsg.append("
" + stockRecord.getGoodsId() + "、物料编号 " + importedDetail.getGoodsNum() + " 已锁定"); } - if (tCkOrderdetailList.size() == 0) { - setTab(tab, tCkOrders.getId(), operName); - tCkOrderdetailMapper.insertTCkOrderdetail(tab); + if (existingDetailList.size() == 0) { + initializeImportedOrderDetail(importedDetail, importedOrder.getId(), operName); + tCkOrderdetailMapper.insertTCkOrderdetail(importedDetail); successNum++; - successMsg.append("
" + successNum + "、物料编号 " + tab.getGoodsId() + " 导入成功"); + successMsg.append("
" + successNum + "、物料编号 " + importedDetail.getGoodsId() + " 导入成功"); } else if (isUpdateSupport) { - List collect = tCkOrderdetailList.stream().map(TCkOrderdetail::getId).collect(Collectors.toList()); + List collect = existingDetailList.stream().map(TCkOrderdetail::getId).collect(Collectors.toList()); tCkOrderdetailMapper.deleteTCkOrderdetailByIds(collect.toArray(new String[collect.size()])); - setTab(tab, tCkOrders.getId(), operName); - tCkOrderdetailMapper.insertTCkOrderdetail(tab); + initializeImportedOrderDetail(importedDetail, importedOrder.getId(), operName); + tCkOrderdetailMapper.insertTCkOrderdetail(importedDetail); successNum++; - successMsg.append("
" + successNum + "、物料编号 " + tab.getGoodsId() + " 更新成功"); + successMsg.append("
" + successNum + "、物料编号 " + importedDetail.getGoodsId() + " 更新成功"); } else { failureNum++; - failureMsg.append("
" + failureNum + "、物料编号 " + tab.getGoodsId() + " 已存在"); + failureMsg.append("
" + failureNum + "、物料编号 " + importedDetail.getGoodsId() + " 已存在"); } } catch (Exception e) { failureNum++; - String msg = "
" + failureNum + "、来源单号 " + tCkOrderdetailb1.getDeliveryId() + " 导入失败:"; + String msg = "
" + failureNum + "、来源单号 " + firstImportedDetail.getDeliveryId() + " 导入失败:"; failureMsg.append(msg + e.getMessage()); log.error(msg, e); } @@ -995,25 +991,25 @@ public class TCkOrdersServiceImpl extends ServiceImpl resultMap = new HashMap<>(); // 获取通知单信息 - TCkOrders tCkOrders = tCkOrdersMapper.selectTCkOrdersById(update.getId()); + TCkOrders currentOrder = tCkOrdersMapper.selectTCkOrdersById(update.getId()); - if (ObjectUtils.isEmpty(tCkOrders)) { + if (ObjectUtils.isEmpty(currentOrder)) { resultMap.put("error", "待发送消息的出库通知单不存在"); return resultMap; } - if (tCkOrders.getTckOrderdetailList() == null || tCkOrders.getTckOrderdetailList().isEmpty()) { + if (currentOrder.getTckOrderdetailList() == null || currentOrder.getTckOrderdetailList().isEmpty()) { resultMap.put("error", "待发送消息的出库通知单没有物料明细数据"); return resultMap; } - if (!"1".equals(tCkOrders.getIsAudit())) { + if (!OutboundAuditStatus.APPROVED.getCode().equals(currentOrder.getIsAudit())) { resultMap.put("error", "出库通知单未审核完成,不能发送到手持设备"); return resultMap; } // 发送呼叫任务 - TCallNoticeOrder tCallNotice = new TCallNoticeOrder(); + TCallNoticeOrder noticeOrder = new TCallNoticeOrder(); // 通知单编号 - tCallNotice.setTaskId(tCkOrders.getOrderId()); + noticeOrder.setTaskId(currentOrder.getOrderId()); // 任务类型 1:通知单出库 - tCallNotice.setTaskType("1"); + noticeOrder.setTaskType(NoticeTaskType.OUTBOUND.getCode()); // 状态 - tCallNotice.setStatus("0"); + noticeOrder.setStatus(NoticeTaskStatus.PENDING.getCode()); // 创建者 - tCallNotice.setCreateBy(update.getCreateBy()); - tCallNotice.setCreateTime(new Date()); - tCallNotice.setUpdateBy(update.getCreateBy()); - tCallNotice.setUpdateTime(new Date()); + noticeOrder.setCreateBy(update.getCreateBy()); + noticeOrder.setCreateTime(new Date()); + noticeOrder.setUpdateBy(update.getCreateBy()); + noticeOrder.setUpdateTime(new Date()); // 0:正常任务 - tCallNotice.setFictitious("0"); + noticeOrder.setFictitious(TaskFictitiousFlag.REAL.getCode()); // 来源单号 - tCallNotice.setDeliveryId(tCkOrders.getDeliveryId()); + noticeOrder.setDeliveryId(currentOrder.getDeliveryId()); // 部门ID - tCallNotice.setDeptId(update.getDeptId()); + noticeOrder.setDeptId(update.getDeptId()); // 订单类型 - String ckType = sysDictDataMapper.selectDictLabel("outbound_type", tCkOrders.getCkType()); - tCallNotice.setOrderType(ckType); - tNoticeOrderService.sendNotice(tCallNotice); + String outboundTypeLabel = sysDictDataMapper.selectDictLabel("outbound_type", currentOrder.getCkType()); + noticeOrder.setOrderType(outboundTypeLabel); + tNoticeOrderService.sendNotice(noticeOrder); resultMap.put("success", "消息发送成功"); resultMap.put("error", ""); @@ -1098,7 +1094,7 @@ public class TCkOrdersServiceImpl extends ServiceImpl handAddGoodsTab(TCkOrders orders) { + public Map handAddGoodsTab(TCkOrders manualOutboundOrder) { Map resultMap = new HashMap<>(); /*//托盘校验 @@ -1111,84 +1107,83 @@ public class TCkOrdersServiceImpl extends ServiceImpl list = orders.getTckOrderdetailList(); + List requestedOrderDetails = manualOutboundOrder.getTckOrderdetailList(); // 设置订单基本信息 - String orderCode = OrderCodeFactory.getOrderCode("CK", ""); - orders.setId(OrderCodeFactory.getOrderCode("CK", "")); - orders.setOrderId(generateBarcode()); - orders.setCkType("1"); - orders.setIsAudit("1"); - orders.setAuditDate(new Date()); - orders.setConfirmStatus("0"); - orders.setDeptId(getDeptId()); - orders.setCreateTime(new Date()); + manualOutboundOrder.setId(OrderCodeFactory.getOrderCode("CK", "")); + manualOutboundOrder.setOrderId(generateBarcode()); + manualOutboundOrder.setCkType(OutboundType.STANDARD.getCode()); + manualOutboundOrder.setIsAudit(OutboundAuditStatus.APPROVED.getCode()); + manualOutboundOrder.setAuditDate(new Date()); + manualOutboundOrder.setConfirmStatus(OutboundConfirmStatus.PENDING.getCode()); + manualOutboundOrder.setDeptId(getDeptId()); + manualOutboundOrder.setCreateTime(new Date()); // 更新出库单 - int inserted = insertTCkOrders(orders); + int insertedRows = insertTCkOrders(manualOutboundOrder); - if (inserted > 0) { - List orderdetails = new ArrayList(); // 移动到循环外部,以便收集所有明细 - for (TCkOrderdetail orderdetail : list) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (insertedRows > 0) { + List preparedOrderDetails = new ArrayList<>(); // 移动到循环外部,以便收集所有明细 + for (TCkOrderdetail orderDetail : requestedOrderDetails) { + LambdaQueryWrapper stockQueryWrapper = new LambdaQueryWrapper<>(); // 获取库存信息 - if (orderdetail.getCtl() != null && !orderdetail.getCtl().isEmpty()) { - wrapper.eq(TMiStock::getGoodsId, orderdetail.getGoodsId()); - wrapper.eq(TMiStock::getStorageId, orders.getStorageId()); - wrapper.eq(TMiStock::getCtl, orders.getCtl()); - wrapper.eq(TMiStock::getStatus, "0"); - wrapper.eq(TMiStock::getIsFreeze, "0"); + if (orderDetail.getCtl() != null && !orderDetail.getCtl().isEmpty()) { + stockQueryWrapper.eq(TMiStock::getGoodsId, orderDetail.getGoodsId()); + stockQueryWrapper.eq(TMiStock::getStorageId, manualOutboundOrder.getStorageId()); + stockQueryWrapper.eq(TMiStock::getCtl, manualOutboundOrder.getCtl()); + stockQueryWrapper.eq(TMiStock::getStatus, OutboundResourceLockStatus.UNLOCKED.getCode()); + stockQueryWrapper.eq(TMiStock::getIsFreeze, StockFreezeStatus.UNFROZEN.getCode()); } else { - wrapper.eq(TMiStock::getGoodsId, orderdetail.getGoodsId()); - wrapper.eq(TMiStock::getStorageId, orders.getStorageId()); + stockQueryWrapper.eq(TMiStock::getGoodsId, orderDetail.getGoodsId()); + stockQueryWrapper.eq(TMiStock::getStorageId, manualOutboundOrder.getStorageId()); } - List tMiStocks = tMiStockMapper.selectList(wrapper); + List matchedStocks = tMiStockMapper.selectList(stockQueryWrapper); - if (tMiStocks.isEmpty()) { - resultMap.put("error", "当前仓库该物料" + orderdetail.getGoodsName() + "暂无库存"); + if (matchedStocks.isEmpty()) { + resultMap.put("error", "当前仓库该物料" + orderDetail.getGoodsName() + "暂无库存"); return resultMap; } - TMiStock mergedStock = tMiStocks.get(0); - BigDecimal shelvesNum = mergedStock.getShelvesNum(); + TMiStock mergedStock = matchedStocks.get(0); + BigDecimal totalShelvesNum = mergedStock.getShelvesNum(); - for (int i = 1; i < tMiStocks.size(); i++) { - shelvesNum = shelvesNum.add(tMiStocks.get(i).getShelvesNum()); + for (int i = 1; i < matchedStocks.size(); i++) { + totalShelvesNum = totalShelvesNum.add(matchedStocks.get(i).getShelvesNum()); } - mergedStock.setShelvesNum(shelvesNum); + mergedStock.setShelvesNum(totalShelvesNum); // 设置明细表基本信息 - orderdetail.setOrderId(orders.getId()); - orderdetail.setId(OrderCodeFactory.getOrderCode("CK", "")); - orderdetail.setStockNum(mergedStock.getShelvesNum()); - orderdetail.setStorageId(mergedStock.getStorageId()); - orderdetail.setStorageShortName(mergedStock.getStorageShortName()); - orderdetail.setLocationId(mergedStock.getLocationId()); - orderdetail.setShelvesNum(orders.getSum()); - orderdetail.setGoodsNum(orders.getSum()); - orderdetail.setPickNum(BigDecimal.valueOf(0.0)); + orderDetail.setOrderId(manualOutboundOrder.getId()); + orderDetail.setId(OrderCodeFactory.getOrderCode("CK", "")); + orderDetail.setStockNum(mergedStock.getShelvesNum()); + orderDetail.setStorageId(mergedStock.getStorageId()); + orderDetail.setStorageShortName(mergedStock.getStorageShortName()); + orderDetail.setLocationId(mergedStock.getLocationId()); + orderDetail.setShelvesNum(manualOutboundOrder.getSum()); + orderDetail.setGoodsNum(manualOutboundOrder.getSum()); + orderDetail.setPickNum(BigDecimal.ZERO); - orderdetails.add(orderdetail); // 添加到列表中 - orders.setTckOrderdetailList(orderdetails); + preparedOrderDetails.add(orderDetail); // 添加到列表中 + manualOutboundOrder.setTckOrderdetailList(preparedOrderDetails); } - List tckOrderdetailList = orders.getTckOrderdetailList(); + List preparedDetailList = manualOutboundOrder.getTckOrderdetailList(); int totalInserted = 0; - for (TCkOrderdetail tCkOrderdetail : tckOrderdetailList) { - tCkOrderdetail.setPickNum(BigDecimal.valueOf(0.000)); - int insert1 = tCkOrderdetailMapper.insert(tCkOrderdetail); + for (TCkOrderdetail preparedDetail : preparedDetailList) { + preparedDetail.setPickNum(BigDecimal.ZERO); + int insertedDetailRows = tCkOrderdetailMapper.insert(preparedDetail); /* int insert1 = tCkOrderdetailMapper.inserts(tCkOrderdetail); */ - totalInserted += insert1; + totalInserted += insertedDetailRows; } - if (totalInserted == tckOrderdetailList.size()) { + if (totalInserted == preparedDetailList.size()) { // 出库任务创建,移动到循环外部 - int i = confirmOut(orders); - if (i < 1) { + int confirmResult = confirmOut(manualOutboundOrder); + if (confirmResult < 1) { resultMap.put("error", "出库失败请联系管理员"); return resultMap; } @@ -1226,58 +1221,56 @@ public class TCkOrdersServiceImpl extends ServiceImpl list = tCkOrders.getTckOrderdetailList(); + public AjaxResult send(TCkOrders outboundOrder) { + List orderDetails = outboundOrder.getTckOrderdetailList(); // 过滤出符合条件的订单详情 - List filteredList = list.stream() + List agvOrderDetails = orderDetails.stream() .filter(orderdetail -> { String isAgv = baseStorageService.getIsAgvByStorageId(orderdetail.getStorageId()); - return "1".equals(isAgv); + return StorageAgvFlag.AGV.getCode().equals(isAgv); }) .collect(Collectors.toList()); - TCkOrders orders = new TCkOrders(); - BeanUtils.copyProperties(tCkOrders, orders); - orders.setTckOrderdetailList(filteredList); + TCkOrders agvOutboundOrder = new TCkOrders(); + BeanUtils.copyProperties(outboundOrder, agvOutboundOrder); + agvOutboundOrder.setTckOrderdetailList(agvOrderDetails); - for (TCkOrderdetail ckOrderdetail : filteredList) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(TMiStock::getGoodsId, ckOrderdetail.getGoodsId()); - wrapper.eq(TMiStock::getStorageId, ckOrderdetail.getStorageId()); - wrapper.eq(TMiStock::getCtl, ckOrderdetail.getCtl()); - wrapper.eq(TMiStock::getStatus, "0"); - wrapper.eq(TMiStock::getIsFreeze, "0"); - List tMiStocks = tMiStockMapper.selectList(wrapper); - if (tMiStocks.isEmpty()) { - return AjaxResult.error(ckOrderdetail.getGoodsName() + "已冻结不能出库,请检查物料列表数据状态为非冻结状态"); + for (TCkOrderdetail orderDetail : agvOrderDetails) { + LambdaQueryWrapper stockQueryWrapper = new LambdaQueryWrapper<>(); + stockQueryWrapper.eq(TMiStock::getGoodsId, orderDetail.getGoodsId()); + stockQueryWrapper.eq(TMiStock::getStorageId, orderDetail.getStorageId()); + stockQueryWrapper.eq(TMiStock::getCtl, orderDetail.getCtl()); + stockQueryWrapper.eq(TMiStock::getStatus, OutboundResourceLockStatus.UNLOCKED.getCode()); + stockQueryWrapper.eq(TMiStock::getIsFreeze, StockFreezeStatus.UNFROZEN.getCode()); + List availableStocks = tMiStockMapper.selectList(stockQueryWrapper); + if (availableStocks.isEmpty()) { + return AjaxResult.error(orderDetail.getGoodsName() + "已冻结不能出库,请检查物料列表数据状态为非冻结状态"); } } - Map map = sendIwms(orders); + Map iwmsResult = sendIwms(agvOutboundOrder); - if (filteredList.size() == tCkOrders.getTckOrderdetailList().size()) { - if (map.containsKey("error")) { - return AjaxResult.error(map.get("error")); + if (agvOrderDetails.size() == outboundOrder.getTckOrderdetailList().size()) { + if (iwmsResult.containsKey("error")) { + return AjaxResult.error(iwmsResult.get("error")); } else { return AjaxResult.success("推送成功"); } } - List pk = list.stream() + List manualOrderDetails = orderDetails.stream() .filter(orderdetail -> { String isAgv = baseStorageService.getIsAgvByStorageId(orderdetail.getStorageId()); - return !"1".equals(isAgv); + return !StorageAgvFlag.AGV.getCode().equals(isAgv); }) .collect(Collectors.toList()); - tCkOrders.setTckOrderdetailList(pk); - confirmOut(tCkOrders); + outboundOrder.setTckOrderdetailList(manualOrderDetails); + confirmOut(outboundOrder); return AjaxResult.success("成功"); } @@ -1285,33 +1278,31 @@ public class TCkOrdersServiceImpl extends ServiceImpl { - order.setId(id); + order.setId(transferOutboundOrderId); order.setOrderId(OrderCodeFactory.getOrderCode("CK", "")); order.setApplicant(SecurityUtils.getUserNick()); order.setRecordPerson(SecurityUtils.getUserNick()); order.setDeptId(getDeptId()); order.setRecordDate(new Date()); - order.setOrderType("3"); - order.setCkType("3"); + order.setOrderType(OutboundType.TRANSFER.getCode()); + order.setCkType(OutboundType.TRANSFER.getCode()); order.setDeliveryId(generateUniqueId()); return order; }) .filter(order -> { - boolean exists = tCkOrdersMapper.selectList( + boolean deliveryIdAvailable = tCkOrdersMapper.selectList( new LambdaQueryWrapper() .eq(TCkOrders::getDeliveryId, order.getDeliveryId()) ).isEmpty(); - if (!exists) { + if (!deliveryIdAvailable) { throw new RuntimeException("来源单号已存在,请修改后再提交!"); } return true; @@ -1326,28 +1317,28 @@ public class TCkOrdersServiceImpl extends ServiceImpl new RuntimeException("创建出库单失败")); // 2. 处理订单明细 - tCkOrders.getData().stream() - .map(e -> { + transferOrderRequest.getData().stream() + .map(transferItem -> { TCkOrderdetail detail = new TCkOrderdetail(); detail.setId(OrderCodeFactory.getOrderCode("CKTM", "")); - detail.setOrderId(ckOrders.getId()); + detail.setOrderId(transferOutboundOrder.getId()); detail.setBusinessId("RK" + generateReqCode()); - detail.setGoodsId(e.getGoodsId()); - detail.setGoodsName(e.getGoodsName()); - detail.setSpecification(e.getSpecification()); - detail.setUnit(e.getUnit()); - detail.setStorageId(e.getStorageId()); - detail.setCtl(e.getCtl()); - detail.setGoodsNum(e.getTransferQuantity()); - detail.setPrice(new BigDecimal(e.getPrice()).setScale(2, RoundingMode.HALF_UP)); - detail.setShelvesNum(e.getTransferQuantity()); - detail.setConfirmStatus("0"); - detail.setStockNum(e.getShelvesNum()); - detail.setStorageShortName(Optional.ofNullable(storageMapper.getName(e.getStorageId())) + detail.setGoodsId(transferItem.getGoodsId()); + detail.setGoodsName(transferItem.getGoodsName()); + detail.setSpecification(transferItem.getSpecification()); + detail.setUnit(transferItem.getUnit()); + detail.setStorageId(transferItem.getStorageId()); + detail.setCtl(transferItem.getCtl()); + detail.setGoodsNum(transferItem.getTransferQuantity()); + detail.setPrice(new BigDecimal(transferItem.getPrice()).setScale(2, RoundingMode.HALF_UP)); + detail.setShelvesNum(transferItem.getTransferQuantity()); + detail.setConfirmStatus(OutboundConfirmStatus.PENDING.getCode()); + detail.setStockNum(transferItem.getShelvesNum()); + detail.setStorageShortName(Optional.ofNullable(storageMapper.getName(transferItem.getStorageId())) .map(TBaseStorage::getStorageName) .orElse("")); detail.setCreateBy(SecurityUtils.getUserNick()); - detail.setLocationId(e.getLocationId()); + detail.setLocationId(transferItem.getLocationId()); detail.setUpdateTime(DateUtils.getNowDate()); detail.setCreateTime(DateUtils.getNowDate()); return detail; @@ -1355,16 +1346,16 @@ public class TCkOrdersServiceImpl extends ServiceImpl { notice.setDeliveryId(generateUniqueId()); - notice.setReceivingStatus("0"); - notice.setStatus("0"); - notice.setStorageMode("4"); + notice.setReceivingStatus(InboundNoticeReceivingStatus.CREATED.getCode()); + notice.setStatus(InboundNoticeReceivingStatus.CREATED.getCode()); + notice.setStorageMode(InboundStorageMode.TRANSFER.getCode()); notice.setApplicant(SecurityUtils.getUserNick()); notice.setDeptId(getDeptId()); - notice.setId(RK); + notice.setId(transferInboundNoticeId); notice.setNoticeId(OrderCodeFactory.getOrderCode("TWO", "")); notice.setCreateBy(getUsername()); notice.setCreateTime(DateUtils.getNowDate()); @@ -1387,63 +1378,63 @@ public class TCkOrdersServiceImpl extends ServiceImpl new RuntimeException("创建入库通知单失败")); // 4. 处理通知单明细 - List iRkWareNoticeTabs = new ArrayList(); - tCkOrders.getData().stream() - .map(e -> { + List transferInboundNoticeTabs = new ArrayList(); + transferOrderRequest.getData().stream() + .map(transferItem -> { TRkWareNoticeTab tab = new TRkWareNoticeTab(); - tab.setNoticeId(RK); + tab.setNoticeId(transferInboundNoticeId); tab.setId(OrderCodeFactory.getOrderCode("TRMX", "")); tab.setSalesOrderNumber(OrderCodeFactory.getOrderCode("DBRK", "")); - tab.setGoodsId(e.getGoodsId()); - tab.setGoodsName(e.getGoodsName()); - tab.setUnit(e.getUnit()); - tab.setStorageId(tCkOrders.getTargetStorageId()); - tab.setSpecification(e.getSpecification()); - tab.setPrice(new BigDecimal(e.getPrice()).setScale(2, RoundingMode.HALF_UP)); - tab.setArraMount(e.getTransferQuantity()); - tab.setReceiver("0"); - tab.setInStatus("0"); - tab.setCtl(e.getCtl()); + tab.setGoodsId(transferItem.getGoodsId()); + tab.setGoodsName(transferItem.getGoodsName()); + tab.setUnit(transferItem.getUnit()); + tab.setStorageId(transferOrderRequest.getTargetStorageId()); + tab.setSpecification(transferItem.getSpecification()); + tab.setPrice(new BigDecimal(transferItem.getPrice()).setScale(2, RoundingMode.HALF_UP)); + tab.setArraMount(transferItem.getTransferQuantity()); + tab.setReceiver(InboundReceiverPlaceholder.UNASSIGNED.getCode()); + tab.setInStatus(InboundNoticeTabInStatus.INITIAL.getCode()); + tab.setCtl(transferItem.getCtl()); tab.setCreateBy(SecurityUtils.getUserNick()); tab.setUpdateBy(SecurityUtils.getUserNick()); tab.setCreateTime(DateUtils.getNowDate()); tab.setUpdateTime(DateUtils.getNowDate()); - tab.setLevelType(e.getLevelType()); - tab.setStorageShortName(Optional.ofNullable(storageMapper.getName(e.getStorageId())) + tab.setLevelType(transferItem.getLevelType()); + tab.setStorageShortName(Optional.ofNullable(storageMapper.getName(transferItem.getStorageId())) .map(TBaseStorage::getStorageName) .orElse("")); - iRkWareNoticeTabs.add(tab); + transferInboundNoticeTabs.add(tab); return tab; }).collect(Collectors.toList()); - rkWareNoticeMapper.batchTRkWareNoticeTab(iRkWareNoticeTabs); + rkWareNoticeMapper.batchTRkWareNoticeTab(transferInboundNoticeTabs); - TransferOrder order = new TransferOrder(); - order.setCreator(SecurityUtils.getUserNick()); - order.setCreationTime(DateUtils.getNowDate()); + TransferOrder transferOrder = new TransferOrder(); + transferOrder.setCreator(SecurityUtils.getUserNick()); + transferOrder.setCreationTime(DateUtils.getNowDate()); StringBuilder transferContentBuilder = new StringBuilder(); - tCkOrders.getData().forEach(e -> { + transferOrderRequest.getData().forEach(transferItem -> { if (transferContentBuilder.length() > 0) { transferContentBuilder.append("; "); } - TBaseStorage storage = storageMapper.getName(e.getStorageId()); - TBaseStorage storages = storageMapper.getName(tCkOrders.getTargetStorageId()); + TBaseStorage sourceStorage = storageMapper.getName(transferItem.getStorageId()); + TBaseStorage targetStorage = storageMapper.getName(transferOrderRequest.getTargetStorageId()); transferContentBuilder.append("从-->") - .append(storage.getStorageName()) + .append(sourceStorage.getStorageName()) .append("调拨物料'") - .append(e.getGoodsName()) + .append(transferItem.getGoodsName()) .append("'数量有") - .append(e.getTransferQuantity()) + .append(transferItem.getTransferQuantity()) .append("个调拨到-->") - .append(storages.getStorageName()); + .append(targetStorage.getStorageName()); }); - order.setRkId(RK); - order.setOrderId(id); + transferOrder.setRkId(transferInboundNoticeId); + transferOrder.setOrderId(transferOutboundOrderId); - order.setTransferContent(transferContentBuilder.toString()); - order.setTransferStatus("创建完成"); - transferOrderMapper.insertTransferOrder(order); + transferOrder.setTransferContent(transferContentBuilder.toString()); + transferOrder.setTransferStatus("创建完成"); + transferOrderMapper.insertTransferOrder(transferOrder); @@ -1485,53 +1476,51 @@ public class TCkOrdersServiceImpl extends ServiceImpl sendIwms(TCkOrders update) { + public Map sendIwms(TCkOrders outboundOrder) { logger.info("推送数据出库====》》》》》"); Map resultMap = new HashMap<>(); - TCkOrders tCkOrders = tCkOrdersMapper.selectTCkOrdersById(update.getId()); - if (tCkOrders!=null) { - BeanUtils.copyProperties(tCkOrders, update); + TCkOrders currentOrder = tCkOrdersMapper.selectTCkOrdersById(outboundOrder.getId()); + if (currentOrder != null) { + BeanUtils.copyProperties(currentOrder, outboundOrder); } - List list = update.getTckOrderdetailList(); + List orderDetails = outboundOrder.getTckOrderdetailList(); - List fjq = list.stream() + List agvOrderDetails = orderDetails.stream() .filter(orderdetail -> { String isAgv = baseStorageService.getIsAgvByStorageId(orderdetail.getStorageId()); - return "1".equals(isAgv); + return StorageAgvFlag.AGV.getCode().equals(isAgv); }) .collect(Collectors.toList()); - if (fjq.isEmpty()){ - resultMap.put("error", "暂无数据推送"); + if (agvOrderDetails.isEmpty()) { + resultMap.put("error", "暂无数据推送"); } List> allDataObjects = new ArrayList<>(); String reqCode = generateReqCode(); - BigDecimal goodsNum = null; - for (TCkOrderdetail tCkOrderdetail : fjq) { - goodsNum = tCkOrderdetail.getGoodsNum(); + BigDecimal latestGoodsNum = null; + for (TCkOrderdetail orderDetail : agvOrderDetails) { + latestGoodsNum = orderDetail.getGoodsNum(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(TMiStock::getGoodsId, tCkOrderdetail.getGoodsId()); - queryWrapper.eq(TMiStock::getShelvesNum, tCkOrderdetail.getStockNum()); - queryWrapper.eq(TMiStock::getGoodsName, tCkOrderdetail.getGoodsName()); - queryWrapper.eq(TMiStock::getCtl, tCkOrderdetail.getCtl()); - queryWrapper.eq(TMiStock::getStorageId, tCkOrderdetail.getStorageId()); - List tMiStocks = tMiStockMapper.selectList(queryWrapper); - if (CollectionUtils.isEmpty(tMiStocks)) { + queryWrapper.eq(TMiStock::getGoodsId, orderDetail.getGoodsId()); + queryWrapper.eq(TMiStock::getShelvesNum, orderDetail.getStockNum()); + queryWrapper.eq(TMiStock::getGoodsName, orderDetail.getGoodsName()); + queryWrapper.eq(TMiStock::getCtl, orderDetail.getCtl()); + queryWrapper.eq(TMiStock::getStorageId, orderDetail.getStorageId()); + List matchedStocks = tMiStockMapper.selectList(queryWrapper); + if (CollectionUtils.isEmpty(matchedStocks)) { resultMap.put("error", "库存不存在"); continue; // Skip this iteration and continue with the next } - TMiStock tMiStock = tMiStocks.get(0); - Map dataObject = createDataObject(tCkOrderdetail, tMiStock, update); + TMiStock matchedStock = matchedStocks.get(0); + Map dataObject = createDataObject(orderDetail, matchedStock, outboundOrder); allDataObjects.add(dataObject); } if (!allDataObjects.isEmpty()) { - sendAllDataObjects(allDataObjects, reqCode, resultMap, update, goodsNum); + sendAllDataObjects(allDataObjects, reqCode, resultMap, outboundOrder, latestGoodsNum); } else { resultMap.put("error", "没有有效的订单明细数据发送"); } @@ -1539,36 +1528,36 @@ public class TCkOrdersServiceImpl extends ServiceImpl createDataObject(TCkOrderdetail tCkOrderdetail, TMiStock tMiStock, TCkOrders update) { - Map dataObject = new HashMap<>(); - dataObject.put("operType", "A"); - dataObject.put("orderType", "50"); - dataObject.put("orderNum", update.getId()); - dataObject.put("orderItem", tCkOrderdetail.getId()); - dataObject.put("orderKeyThird", tCkOrderdetail.getBusinessId()); - if (tMiStock.getStorageId().startsWith("FJQR")) { - dataObject.put("whCode", "RZ01"); + private Map createDataObject(TCkOrderdetail orderDetail, TMiStock stockRecord, TCkOrders outboundOrder) { + Map requestLine = new HashMap<>(); + requestLine.put("operType", "A"); + requestLine.put("orderType", IwmsOutboundOrderType.OUTBOUND.getCode()); + requestLine.put("orderNum", outboundOrder.getId()); + requestLine.put("orderItem", orderDetail.getId()); + requestLine.put("orderKeyThird", orderDetail.getBusinessId()); + if (stockRecord.getStorageId().startsWith("FJQR")) { + requestLine.put("whCode", "RZ01"); } else { - dataObject.put("whCode", tMiStock.getStorageId()); + requestLine.put("whCode", stockRecord.getStorageId()); } - dataObject.put("ownerCode", "8000"); - BigDecimal goodsNum = tCkOrderdetail.getGoodsNum(); - dataObject.put("matCode", tCkOrderdetail.getGoodsId()); - dataObject.put("matQty", goodsNum); - dataObject.put("traceCode", tMiStock.getCtl()); - dataObject.put("createUser", tCkOrderdetail.getApplicant()); - if (tMiStock.getCtl().startsWith("A1")) { - dataObject.put("outOrderStr2", "KQTRAY"); - dataObject.put("batchAttr07", "1"); + requestLine.put("ownerCode", IwmsOwnerCode.DEFAULT_OWNER.getCode()); + BigDecimal outboundQuantity = orderDetail.getGoodsNum(); + requestLine.put("matCode", orderDetail.getGoodsId()); + requestLine.put("matQty", outboundQuantity); + requestLine.put("traceCode", stockRecord.getCtl()); + requestLine.put("createUser", orderDetail.getApplicant()); + if (stockRecord.getCtl().startsWith("A1")) { + requestLine.put("outOrderStr2", "KQTRAY"); + requestLine.put("batchAttr07", IwmsBatchAttr07Type.TRAY.getCode()); } else { - dataObject.put("outOrderStr2", "KQ2LBOX"); - dataObject.put("batchAttr07", "2"); + requestLine.put("outOrderStr2", "KQ2LBOX"); + requestLine.put("batchAttr07", IwmsBatchAttr07Type.BOX.getCode()); } - return dataObject; + return requestLine; } - private void sendAllDataObjects(List> allDataObjects, String reqCode, Map resultMap, TCkOrders update, BigDecimal bigDecimal) { + private void sendAllDataObjects(List> allDataObjects, String reqCode, Map resultMap, TCkOrders outboundOrder, BigDecimal pickQuantity) { final String url = "https://172.18.29.101/wms/api/RestJsonService/pushOutOrder"; ObjectMapper objectMapper = new ObjectMapper(); Map requestData = new HashMap<>(); @@ -1608,13 +1597,13 @@ public class TCkOrdersServiceImpl extends ServiceImpl list = update.getTckOrderdetailList(); - for (TCkOrderdetail ckOrderdetail : list) { - ckOrderdetail.setTrNum(ckOrderdetail.getGoodsNum()); + List orderDetails = outboundOrder.getTckOrderdetailList(); + for (TCkOrderdetail orderDetail : orderDetails) { + orderDetail.setTrNum(orderDetail.getGoodsNum()); //修改订单明细 - ckOrderdetail.setPickNum(bigDecimal); - ckOrderdetail.setCkType("1"); - tCkOrderdetailMapper.updateById(ckOrderdetail); + orderDetail.setPickNum(pickQuantity); + orderDetail.setCkType(OutboundType.STANDARD.getCode()); + tCkOrderdetailMapper.updateById(orderDetail); } } else { resultMap.put("error", message);