liu
2 天以前 b490500184a57b740c016bb281765fe29731eab5
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/sale/ErpSaleOrderServiceImpl.java
@@ -23,10 +23,14 @@
import cn.iocoder.yudao.module.mes.api.mps.dto.MesProMpsCreateReqDTO;
import cn.iocoder.yudao.module.system.api.storage.StorageAttachmentApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
@@ -44,7 +48,7 @@
/**
 * ERP 销售订单 Service 实现类
 *
 * @author 芋道源码
 * @author 超级管理员
 */
@Service
@Validated
@@ -75,6 +79,22 @@
    private MesProMpsApi mpsApi;
    @Resource
    private PlatformTransactionManager transactionManager;
    /**
     * MPS 创建使用独立事务(REQUIRES_NEW):
     * 审核时自动创建 MPS 属于尽力而为的联动,失败仅记录日志并回滚自身,
     * 不能污染销售订单审核事务(否则内层异常会把外层事务标记为 rollback-only,导致整个审核被回滚)
     */
    private TransactionTemplate mpsTransactionTemplate;
    @PostConstruct
    public void initMpsTransactionTemplate() {
        mpsTransactionTemplate = new TransactionTemplate(transactionManager);
        mpsTransactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    }
    @Resource
    private StorageAttachmentApi storageAttachmentApi;
    @Override
@@ -101,6 +121,7 @@
        // 2.1 插入订单
        ErpSaleOrderDO saleOrder = BeanUtils.toBean(createReqVO, ErpSaleOrderDO.class, in -> in
                .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())
                .setDepositPrice(ObjectUtil.defaultIfNull(createReqVO.getDepositPrice(), BigDecimal.ZERO))
                .setOutCount(BigDecimal.ZERO).setOutStatus(ErpSaleOrderOutStatusEnum.NOT_OUT.getStatus()));
        calculateTotalPrice(saleOrder, saleOrderItems);
        saleOrderMapper.insert(saleOrder);
@@ -136,6 +157,7 @@
        // 2.1 更新订单
        ErpSaleOrderDO updateObj = BeanUtils.toBean(updateReqVO, ErpSaleOrderDO.class);
        updateObj.setDepositPrice(ObjectUtil.defaultIfNull(updateReqVO.getDepositPrice(), BigDecimal.ZERO));
        calculateTotalPrice(updateObj, saleOrderItems);
        saleOrderMapper.updateById(updateObj);
        // 2.2 更新订单项
@@ -204,13 +226,19 @@
                continue;
            }
            try {
                Long mpsId = createMpsForSaleOrderItem(saleOrder, item);
                // 独立事务创建 MPS:失败只回滚 MPS 自身,不影响审核事务
                Long mpsId = mpsTransactionTemplate.execute(txStatus -> {
                    Long newMpsId = createMpsForSaleOrderItem(saleOrder, item);
                    if (newMpsId != null) {
                        // 更新销售订单明细的 MPS 关联
                        saleOrderItemMapper.updateById(new ErpSaleOrderItemDO()
                                .setId(item.getId())
                                .setMpsId(newMpsId));
                    }
                    return newMpsId;
                });
                if (mpsId != null) {
                    mpsCount++;
                    // 更新销售订单明细的 MPS 关联
                    saleOrderItemMapper.updateById(new ErpSaleOrderItemDO()
                            .setId(item.getId())
                            .setMpsId(mpsId));
                }
            } catch (Exception e) {
                log.error("[createMpsForSaleOrder] 创建 MPS 失败,saleOrderItemId={}", item.getId(), e);
@@ -478,4 +506,4 @@
        }
    }
}
}