diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java index 5d887bacd..3d11a02d8 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/repository/mapper/BusinessDocumentOrderMapper.java @@ -37,4 +37,10 @@ public interface BusinessDocumentOrderMapper extends BaseMapper ids, Long reviewStatus, String SalesManager,String reviewOpinion ) { LoginUser loginUser = SecurityUtils.getLoginUser();//获取登录人 @@ -225,7 +207,6 @@ public class BusinessDocumentOrderImpl extends ServiceImpl checkOrderCodes = businessDocumentOrderMapper.selectList( - new QueryWrapper().eq("goods_number", orderCode) - ); - - if (CollectionUtils.isEmpty(checkOrderCodes)) { - break; - } - - if (retryCount >= maxRetryCount) { - throw new com.aliyun.oss.ServiceException("生成唯一订单编号失败,已达到最大重试次数:" + maxRetryCount); - } - } - - //生成货源单号 + //生成子单货源单号(yyMMdd + 当日顺序号) + String orderCode = goodsNumberGenerator.generateUniqueGoodsNumber(subOrder.getDocumentDate()); subOrder.setGoodsNumber(orderCode); - businessDocumentOrderMapper.insert(subOrder); subOrderCount++; // 增加子单计数 diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java index 0befdc8f8..2f4012cff 100644 --- a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/BusinessDocumentOrderDomainService.java @@ -102,6 +102,9 @@ public class BusinessDocumentOrderDomainService { @Autowired private UserServiceFeign userServiceFeign; + @Autowired + private GoodsNumberGenerator goodsNumberGenerator; + /** * 分页查询【请填写功能名称】列表 */ @@ -109,26 +112,6 @@ public class BusinessDocumentOrderDomainService { return businessDocumentOrderService.queryList(businessDocumentOrderDO); } - public static String getOrderCodeByDate(Date date){ - return new StringBuffer() - .append(getSecondPartByDate(date)) - .append(getThreePart()) - .toString(); - } - private static String getSecondPartByDate(Date date) { - if (date == null) { - date = new Date(); - } - String temp_current_time = DateUtil.format(date, datePattern()); - return temp_current_time.substring(2, temp_current_time.length()); - } - private static String datePattern() { - return "yyyyMMddHHmmss"; - } - private static String getThreePart() { - return RandomUtil.randomNumbers(4); - } - /** * 新增【请填写功能名称】 */ @@ -302,30 +285,8 @@ public class BusinessDocumentOrderDomainService { } } - //生成货源单号 - - String orderCode = null; - int maxRetryCount = 100; - int retryCount = 0; - - while (retryCount < maxRetryCount) { - orderCode = getOrderCodeByDate(tmsOrder.getDocumentDate()); - retryCount++; - - List checkOrderCodes = businessDocumentOrderMapper.selectList( - new QueryWrapper().eq("goods_number", orderCode) - ); - - if (CollectionUtils.isEmpty(checkOrderCodes)) { - break; - } - - if (retryCount >= maxRetryCount) { - throw new ServiceException("生成唯一订单编号失败,已达到最大重试次数:" + maxRetryCount); - } - } - - //生成货源单号 + //生成货源单号(yyMMdd + 当日顺序号,每日重置) + String orderCode = goodsNumberGenerator.generateUniqueGoodsNumber(tmsOrder.getDocumentDate()); tmsOrder.setGoodsNumber(orderCode); ReservationStockOutOrder reservationStockOutOrder = reservationStockOutOrderMapper.selectOne(new LambdaQueryWrapper() @@ -774,28 +735,8 @@ public class BusinessDocumentOrderDomainService { // boolean istrue=businessDocumentOrderService.update(businessDocumentOrderDO); - String orderCode = null; - int maxRetryCount = 100; - int retryCount = 0; - - while (retryCount < maxRetryCount) { - orderCode = getOrderCodeByDate(tmsOrder.getDocumentDate()); - retryCount++; - - List checkOrderCodes = businessDocumentOrderMapper.selectList( - new QueryWrapper().eq("goods_number", orderCode) - ); - - if (CollectionUtils.isEmpty(checkOrderCodes)) { - break; - } - - if (retryCount >= maxRetryCount) { - throw new ServiceException("生成唯一订单编号失败,已达到最大重试次数:" + maxRetryCount); - } - } - - //生成货源单号 + //生成货源单号(yyMMdd + 当日顺序号,每日重置) 原更新操作会将 电脑更细为当日的日期。默认和之前的逻辑一样保持不变 + String orderCode = goodsNumberGenerator.generateUniqueGoodsNumber(tmsOrder.getDocumentDate()); tmsOrder.setGoodsNumber(orderCode); ReservationStockOutOrder reservationStockOutOrder = reservationStockOutOrderMapper.selectOne(new LambdaQueryWrapper() diff --git a/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/GoodsNumberGenerator.java b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/GoodsNumberGenerator.java new file mode 100644 index 000000000..285c8a89f --- /dev/null +++ b/mhd_oms/src/main/java/com/mhd/oms/domain/businessDocumentOrder/service/GoodsNumberGenerator.java @@ -0,0 +1,53 @@ +package com.mhd.oms.domain.businessDocumentOrder.service; + +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mhd.common.core.exception.ServiceException; +import com.mhd.oms.domain.businessDocumentOrder.entity.BusinessDocumentOrder; +import com.mhd.oms.domain.businessDocumentOrder.repository.mapper.BusinessDocumentOrderMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Date; +import java.util.List; + +/** + * 业务单据订单(goodsNumber)单号生成器 + * 规则: yyMMdd(取自单据日期) + 当日顺序号(每日重置, 3位起步, 超999自动扩位) + * 示例: 260804001、260804999、2608041000 + */ +@Component +public class GoodsNumberGenerator { + + private static final int MAX_RETRY = 100; + + @Autowired + private BusinessDocumentOrderMapper businessDocumentOrderMapper; + + /** + * 生成唯一业务单号 + * @param documentDate 单据日期(为空取当前日期) + */ + public String generateUniqueGoodsNumber(Date documentDate) { + Date date = (documentDate == null) ? new Date() : documentDate; + String datePart = DateUtil.format(date, "yyMMdd"); + + // count 只查一次作为序号基线 + long seq = (long) businessDocumentOrderMapper.countByGoodsNumberPrefix(datePart) + 1; + int retryCount = 0; + while (retryCount < MAX_RETRY) { + String orderCode = datePart + String.format("%03d", seq); + retryCount++; + + List exist = businessDocumentOrderMapper.selectList( + new QueryWrapper().eq("goods_number", orderCode) + ); + if (CollectionUtils.isEmpty(exist)) { + return orderCode; + } + seq++; // ← 关键:查重失败,序号往后递增找空位,而不是重新count + } + throw new ServiceException("生成唯一业务单号失败,已达到最大重试次数:" + MAX_RETRY); + } +} \ No newline at end of file diff --git a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml index 144f5917d..e000874e1 100644 --- a/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml +++ b/mhd_oms/src/main/resources/mapper/businessDocumentOrder/BusinessDocumentOrderMapper.xml @@ -1272,4 +1272,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select PUSH_VERIFY from NGWL_TEST_PRODUCT.SYS_ORGANIZATION where ORGANIZATION_ID = #{organizationId} + +