diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java index e5f4a121a..c7df783b9 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockInOrder/repository/listener/StockInExcelListener.java @@ -92,18 +92,36 @@ public class StockInExcelListener extends AnalysisEventListener 0 + || reservationStockInOrderMapper.countByInOrderNumber(templateOrderNo) > 0; + if (duplicated) { + throw new ServiceException("入库业务单号已存在:" + templateOrderNo + ",请修改模板中的OrderNO后重新导入"); + } + } + if (templateOrderNo.isEmpty()) { + templateOrderNo = reservationStockInOrderDomainService.generateReserveOrderNumber(); + } + reservationStockInOrderDO.setInOrderNumber(templateOrderNo); + reservationStockInOrderDO.setBusinessOrderNo(templateOrderNo); reservationStockInOrderDO.setOrganizationId(loginUser.getUserPo().getOrganizationId()); reservationStockInOrderDO.setOrganizationName(loginUser.getUserPo().getOrganizationName()); reservationStockInOrderDO.setTopOrganizationId(loginUser.getUserPo().getTopOrganizationId()); @@ -510,7 +526,6 @@ public class ReservationStockInOrderImpl extends ServiceImpl orderNumbers, int prefixLength) { - if (orderNumbers == null || orderNumbers.isEmpty()) { - return 0; + private void validateTemplateOrderNo(String orderNo) { + // R + 6位年月日 + 至少3位数字序号 + if (!orderNo.matches("R\\d{9,}")) { + throw new ServiceException("入库业务单号格式不正确:" + orderNo + + ",请按照[代码R+年月日+当日累加]规则填写单号,正确格式为R+年月日+3位序号,如R260717001"); } - int maxSeq = 0; - for (String orderNumber : orderNumbers) { - if (orderNumber != null && orderNumber.length() > prefixLength) { - try { - String seqStr = orderNumber.substring(prefixLength); - int seq = Integer.parseInt(seqStr); - if (seq > maxSeq) { - maxSeq = seq; - } - } catch (NumberFormatException e) { - // 序号部分非数字,跳过 - } - } + try { + SimpleDateFormat fmt = new SimpleDateFormat("yyMMdd"); + fmt.setLenient(false); + fmt.parse(orderNo.substring(1, 7)); + } catch (java.text.ParseException e) { + throw new ServiceException("入库业务单号格式不正确:" + orderNo + + ",请按照[代码R+年月日+当日累加]规则填写单号,单号中的年月日无效,正确格式为R+年月日+3位序号,如R260717001"); } - return maxSeq; } @Transactional(rollbackFor = Exception.class) public Boolean insertDomain(ReservationStockInOrderDO stockInOrderDO) { -// if (stockInOrderDO.getInOrderNumber() == null) { - - //设置入库单号 - Long warehouseId = stockInOrderDO.getWarehouseId(); - AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); - if (!"200".equals(String.valueOf(ajaxResult.get("code")))) { - throw new ServiceException("获取仓库信息失败"); - } - //仓库信息 - WarehouseFeignPO warehouseFeignPO = com.alibaba.fastjson.JSON.parseObject(com.alibaba.fastjson2.JSONObject.toJSONString(ajaxResult.get("data")), WarehouseFeignPO.class); - String orderNoGenerateRule = warehouseFeignPO.getOrderNoGenerateRule(); - String prefix = warehouseFeignPO.getInOrderNoPrefix(); - if (prefix == null || prefix.isEmpty()) { - prefix = "RK"; - } - Long organizationId = stockInOrderDO.getOrganizationId(); - Long warehouseIdForCount = stockInOrderDO.getWarehouseId(); - if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) { - //日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1 - String dateStr = new SimpleDateFormat("yyMMdd").format(new Date()); - String datePrefix = prefix + dateStr; - List orderNumbers = reservationStockInOrderMapper.getMaxStockInOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount); - int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length()); - String seq = String.format("%03d", maxSeq + 1); - stockInOrderDO.setInOrderNumber(datePrefix + seq); - stockInOrderDO.setBusinessOrderNo(datePrefix + seq); - } else { - //历史累加: 前缀 + 历史最大序号+1 - List orderNumbers = reservationStockInOrderMapper.getMaxStockInOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount); - int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length()); - String seq = String.format("%03d", maxSeq + 1); - stockInOrderDO.setInOrderNumber(prefix + seq); - stockInOrderDO.setBusinessOrderNo(prefix + seq); - } + // 仓库信息校验(保留原有行为:仓库信息获取失败直接报错) + Long warehouseId = stockInOrderDO.getWarehouseId(); + AjaxResult ajaxResult = systemServiceFeign.getWarehouseInfoByWarehouseId(warehouseId); + if (!"200".equals(String.valueOf(ajaxResult.get("code")))) { + throw new ServiceException("获取仓库信息失败"); + } + // 入库单号:调用方已设置(如导入时优先使用模板自带OrderNO,且已校验不重复)则沿用,不再覆盖; + // 未设置时按 R+年月日+当日累加 规则生成(如R260717001、R260717002),跨reservation/reserve两表取号防撞 + if (stockInOrderDO.getInOrderNumber() == null || stockInOrderDO.getInOrderNumber().trim().isEmpty()) { stockInOrderDO.setInOrderNumber(reservationStockInOrderDomainService.generateReserveOrderNumber()); - stockInOrderDO.setBusinessOrderNo(stockInOrderDO.getInOrderNumber()); -// } -// //统计总计划数 + } + stockInOrderDO.setBusinessOrderNo(stockInOrderDO.getInOrderNumber()); + //统计总计划数 BigDecimal quantity = stockInOrderDO.getMaterialDetailList().stream().map(ReservationInMaterialDetailDO::getQuantity).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); stockInOrderDO.setQuantity(quantity); BigDecimal amount = stockInOrderDO.getMaterialDetailList().stream().map(ReservationInMaterialDetailDO::getTotalPrice).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add);