From 993746ee4162f30d0d9134c7fecea93393728b85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=A5=8E=E5=85=B4?= <2220574228@qq.com> Date: Sat, 8 Aug 2026 17:47:59 +0800 Subject: [PATCH] =?UTF-8?q?=E5=87=BA=E5=BA=93=E5=8D=95=E6=8C=89=E8=A7=84?= =?UTF-8?q?=E5=88=99=E7=94=9F=E6=88=90;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ReservationStockOutOrderDomainService.java | 66 ++++++++++++++++- .../ReserveStockInOrderDomainService.java | 62 ++++++++-------- .../mapper/ReserveStockOutOrderMapper.java | 8 ++ .../ReserveStockOutOrderDomainService.java | 73 +++++++++++++++++-- .../ReserveStockOutOrderMapper.xml | 50 +++++++++++++ 5 files changed, 218 insertions(+), 41 deletions(-) diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java index e300285e2..92d63bf49 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reservationStockOutOrder/service/ReservationStockOutOrderDomainService.java @@ -122,17 +122,75 @@ public class ReservationStockOutOrderDomainService { public List queryList(ReservationStockOutOrderDO stockOutOrderDO) { return stockOutOrderService.queryList(stockOutOrderDO); } - + /** + * 从单号列表中提取最大序号 + * 单号格式: prefix + 数字序号(如 RK260807001 中 prefix=RK260807, 序号=001) + * 即使中间有删单,也能保证序号递增不重复 + * + * @param orderNumbers 匹配的单号列表 + * @param prefixLength 前缀长度(序号从该位置开始截取) + * @return 最大序号值,列表为空时返回0 + */ + private int extractMaxSequenceNumber(List orderNumbers, int prefixLength) { + if (orderNumbers == null || orderNumbers.isEmpty()) { + return 0; + } + 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) { + // 序号部分非数字,跳过 + } + } + } + return maxSeq; + } /** * 新增出库单 */ @Transactional(rollbackFor = Exception.class) public Boolean insert(ReservationStockOutOrderDO stockOutOrderDO) { - if (stockOutOrderDO.getOutOrderNumber() == null) { - stockOutOrderDO.setOutOrderNumber(generateReserveOrderNumber()); - stockOutOrderDO.setBusinessOrderNo(stockOutOrderDO.getOutOrderNumber()); + + //设置单号 + Long warehouseId = stockOutOrderDO.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 = stockOutOrderDO.getOrganizationId(); + Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); + if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) { + //日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1 + String dateStr = new SimpleDateFormat("yyMMdd").format(new Date()); + String datePrefix = prefix + dateStr; + List orderNumbers = reserveStockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount); + int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length()); + String seq = String.format("%03d", maxSeq + 1); + stockOutOrderDO.setOutOrderNumber(datePrefix + seq); + stockOutOrderDO.setBusinessOrderNo(datePrefix + seq); + } else { + //历史累加: 前缀 + 历史最大序号+1 + List orderNumbers = reserveStockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount); + int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length()); + String seq = String.format("%03d", maxSeq + 1); + stockOutOrderDO.setOutOrderNumber(prefix + seq); + stockOutOrderDO.setBusinessOrderNo(prefix + seq); + } + // 与 update / batchInsert 一致:前端传计划数量为 quantity,非 outboundQuantity setMaterialDetailInfo(stockOutOrderDO); stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size()); diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java index d51d21285..03de10290 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockInOrder/service/ReserveStockInOrderDomainService.java @@ -103,37 +103,39 @@ public class ReserveStockInOrderDomainService { */ @Transactional(rollbackFor = Exception.class) public Boolean insert(ReserveStockInOrderDO 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); - } 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); - } +// 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); + } +// } // //设置默认值 // setDefaultValues(stockInOrderDO); // //设置物料信息 diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/mapper/ReserveStockOutOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/mapper/ReserveStockOutOrderMapper.java index 128716b68..ad3757e68 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/mapper/ReserveStockOutOrderMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/repository/mapper/ReserveStockOutOrderMapper.java @@ -50,4 +50,12 @@ public interface ReserveStockOutOrderMapper extends BaseMapper getWarehouseByType(@Param("warehouseType") String warehouseType); + + /** + * 跨4张入库单表查询指定前缀+组织+仓库的所有入库单号(用于取最大序号+1,防止删单后单号重复) + * 包含: reserve_stock_in_order, reservation_stock_in_order, execution_stock_in_order, WMS stock_in_order + */ + List getMaxStockOutOrderByPrefixAndOrgAndWarehouse(@Param("prefix") String prefix, + @Param("organizationId") Long organizationId, + @Param("warehouseId") Long warehouseId); } \ No newline at end of file diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java index cb75be175..af56d0b51 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/reserveStockOutOrder/service/ReserveStockOutOrderDomainService.java @@ -7,6 +7,7 @@ import com.mhd.common.core.exception.ServiceException; import com.mhd.common.core.utils.OrderSequence; import com.mhd.common.core.utils.StringUtils; import com.mhd.common.core.utils.bean.BeanUtils; +import com.mhd.common.core.web.domain.AjaxResult; import com.mhd.common.security.utils.SecurityUtils; import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; import com.mhd.oms.domain.reservationInMaterialDetail.entity.ReservationInMaterialDetail; @@ -34,10 +35,7 @@ import com.mhd.oms.domain.reserveStockOutOrder.repository.po.ReserveStockOutOrde import com.mhd.oms.domain.reserveStockOutOrder.repository.todo.ReserveStockOutOrderDO; import com.mhd.system.api.SystemServiceFeign; import com.mhd.system.api.WmsServiceFeign; -import com.mhd.system.api.domain.OutMaterialDetail; -import com.mhd.system.api.domain.OutMaterialDetailTZPD; -import com.mhd.system.api.domain.StockOutOrder; -import com.mhd.system.api.domain.StockOutOrderTZPD; +import com.mhd.system.api.domain.*; import com.mhd.system.api.model.LoginUser; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -78,6 +76,8 @@ public class ReserveStockOutOrderDomainService { @Autowired private ReservationStockOutOrderDomainService reservationStockOutOrderDomainService; + @Autowired + private SystemServiceFeign systemServiceFeign; /** * 分页查询出库单列表 @@ -90,15 +90,74 @@ public class ReserveStockOutOrderDomainService { return stockOutOrderService.detailsList(stockOutOrderDO); } - + /** + * 从单号列表中提取最大序号 + * 单号格式: prefix + 数字序号(如 RK260807001 中 prefix=RK260807, 序号=001) + * 即使中间有删单,也能保证序号递增不重复 + * + * @param orderNumbers 匹配的单号列表 + * @param prefixLength 前缀长度(序号从该位置开始截取) + * @return 最大序号值,列表为空时返回0 + */ + private int extractMaxSequenceNumber(List orderNumbers, int prefixLength) { + if (orderNumbers == null || orderNumbers.isEmpty()) { + return 0; + } + 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) { + // 序号部分非数字,跳过 + } + } + } + return maxSeq; + } /** * 新增出库单 */ @Transactional(rollbackFor = Exception.class) public Boolean insert(ReserveStockOutOrderDO stockOutOrderDO) { - if (stockOutOrderDO.getOutOrderNumber() == null) { - stockOutOrderDO.setOutOrderNumber(generateReserveOrderNumber()); + //设置单号 + Long warehouseId = stockOutOrderDO.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 = stockOutOrderDO.getOrganizationId(); + Long warehouseIdForCount = stockOutOrderDO.getWarehouseId(); + if (orderNoGenerateRule != null && "0".equals(orderNoGenerateRule)) { + //日期累加: 前缀 + 当前日期yymmdd + 当天最大序号+1 + String dateStr = new SimpleDateFormat("yyMMdd").format(new Date()); + String datePrefix = prefix + dateStr; + List orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(datePrefix, organizationId, warehouseIdForCount); + int maxSeq = extractMaxSequenceNumber(orderNumbers, datePrefix.length()); + String seq = String.format("%03d", maxSeq + 1); + stockOutOrderDO.setOutOrderNumber(datePrefix + seq); + stockOutOrderDO.setBusinessOrderNo(datePrefix + seq); + } else { + //历史累加: 前缀 + 历史最大序号+1 + List orderNumbers = stockOutOrderMapper.getMaxStockOutOrderByPrefixAndOrgAndWarehouse(prefix, organizationId, warehouseIdForCount); + int maxSeq = extractMaxSequenceNumber(orderNumbers, prefix.length()); + String seq = String.format("%03d", maxSeq + 1); + stockOutOrderDO.setOutOrderNumber(prefix + seq); + stockOutOrderDO.setBusinessOrderNo(prefix + seq); + } + + // 与 update / batchInsert 一致:前端传计划数量为 quantity,非 outboundQuantity setMaterialDetailInfo(stockOutOrderDO); stockOutOrderDO.setMaterialQuantity(stockOutOrderDO.getMaterialDetailList().size()); diff --git a/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml b/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml index 1c4a103dd..5d27761f8 100644 --- a/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/reserveStockOutOrder/ReserveStockOutOrderMapper.xml @@ -548,4 +548,54 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ) + + + + \ No newline at end of file