xiaoyi
3 天以前 14c80fbd16a51a355138345ecf69df9ca37746bf
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/salesnotice/MesWmSalesNoticeServiceImpl.java
@@ -66,7 +66,9 @@
    private MesWmSalesNoticeLineMapper salesNoticeLineMapper;
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long createSalesNotice(MesWmSalesNoticeSaveReqVO createReqVO) {
        lockReferencedSaleOrder(createReqVO, null);
        // 校验数据
        validateSalesNoticeSave(createReqVO);
@@ -78,9 +80,11 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateSalesNotice(MesWmSalesNoticeSaveReqVO updateReqVO) {
        // 校验存在 + 草稿状态
        validateSalesNoticeExistsAndDraft(updateReqVO.getId());
        MesWmSalesNoticeDO existing = validateSalesNoticeExistsAndDraft(updateReqVO.getId());
        lockReferencedSaleOrder(updateReqVO, existing);
        // 校验数据
        validateSalesNoticeSave(updateReqVO);
@@ -170,6 +174,21 @@
        }
    }
    /** 与订单作废使用同一订单行锁;支持历史请求仅传订单号。 */
    private void lockReferencedSaleOrder(MesWmSalesNoticeSaveReqVO request, MesWmSalesNoticeDO existing) {
        Long orderId = request.getSaleOrderId();
        String orderNo = request.getSaleOrderCode();
        if (orderId == null && (orderNo == null || orderNo.isBlank()) && existing != null) {
            orderId = existing.getSaleOrderId();
            orderNo = existing.getSaleOrderCode();
        }
        if (orderId == null && (orderNo == null || orderNo.isBlank())) return;
        ErpSaleOrderRespDTO order = saleOrderApi.lockSaleOrderForNotice(orderId, orderNo).getCheckedData();
        if (order == null) throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS);
        request.setSaleOrderId(order.getId());
        request.setSaleOrderCode(order.getNo());
    }
    private void validateNoticeCodeUnique(Long id, String code) {
        MesWmSalesNoticeDO notice = salesNoticeMapper.selectByCode(code);
        if (notice == null) {
@@ -183,16 +202,13 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Long generateSalesNoticeFromSaleOrder(Long saleOrderId) {
        // 先锁定订单,再检查通知;与订单作废串行执行。
        ErpSaleOrderRespDTO saleOrder = saleOrderApi.lockSaleOrderForNotice(saleOrderId, null).getCheckedData();
        if (saleOrder == null) throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS);
        // 1. 校验是否已生成过发货通知单(防止重复生成)
        MesWmSalesNoticeDO existNotice = salesNoticeMapper.selectBySaleOrderId(saleOrderId);
        if (existNotice != null) {
            throw exception(WM_SALES_NOTICE_ALREADY_EXISTS);
        }
        // 2. 获取销售订单信息
        ErpSaleOrderRespDTO saleOrder = saleOrderApi.getSaleOrder(saleOrderId).getCheckedData();
        if (saleOrder == null) {
            throw exception(WM_SALES_NOTICE_SALE_ORDER_NOT_EXISTS);
        }
        // 3. 获取销售订单明细