From 7353021d92ac4e35cc118ae444f121cd97f678d6 Mon Sep 17 00:00:00 2001 From: rcx <3084692334@qq.com> Date: Tue, 25 Aug 2026 16:11:19 +0800 Subject: [PATCH] =?UTF-8?q?feat(oms):=E5=85=A5=E5=BA=93=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=AF=BC=E5=85=A5=E6=94=AF=E6=8C=81=E6=A8=A1=E6=9D=BF=E8=87=AA?= =?UTF-8?q?=E5=B8=A6=E4=B8=9A=E5=8A=A1=E5=8D=95=E5=8F=B7=EF=BC=8C=E9=87=8D?= =?UTF-8?q?=E5=A4=8D=E6=8B=A6=E6=88=AA=E5=B9=B6=E6=8C=89R+=E5=B9=B4?= =?UTF-8?q?=E6=9C=88=E6=97=A5=E8=A7=84=E5=88=99=E7=94=9F=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 模板OrderNO解析兼容无标签新模板(E1直接为单号值) 2. 导入单号优先模板自带:先校验R+年月日+3位序号格式(含年月日有效性), 再跨reservation/reserve两表查重,重复提示"入库业务单号已存在" 3. 模板无单号时按R+年月日+当日累加生成(insertDomain不再无条件覆盖已设置单号,清理无效的仓库规则生成死代码) --- .../listener/StockInExcelListener.java | 28 ++++- .../ReservationStockInOrderImpl.java | 113 ++++++++---------- 2 files changed, 70 insertions(+), 71 deletions(-) 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);