gaoluyang
2026-10-30 cbadfd8e691ab335965202a984db16e55ac8e42c
yudao-module-erp/src/main/java/cn/iocoder/yudao/module/erp/service/purchase/ErpPurchaseOrderServiceImpl.java
@@ -81,6 +81,8 @@
    private ErpPurchaseOrderMapper purchaseOrderMapper;
    @Resource
    private ErpPurchaseOrderItemMapper purchaseOrderItemMapper;
    @Resource
    private ErpSupplierContractService supplierContractService;
    @Resource
    private ErpNoRedisDAO noRedisDAO;
@@ -125,6 +127,8 @@
        if (createReqVO.getAccountId() != null) {
            accountService.validateAccount(createReqVO.getAccountId());
        }
        // 1.3.1 校验并解析关联合同(订单必须与合同属于同一供应商)
        String contractNo = resolveContractNo(createReqVO.getContractId(), createReqVO.getSupplierId());
        // 1.4 生成订单号,并校验唯一性
        String no = noRedisDAO.generate(ErpNoRedisDAO.PURCHASE_ORDER_NO_PREFIX);
        if (purchaseOrderMapper.selectByNo(no) != null) {
@@ -134,7 +138,8 @@
        // 2.1 插入订单(采购订单创建后为未审核状态,需要提交审批)
        ErpPurchaseOrderDO purchaseOrder = BeanUtils.toBean(createReqVO, ErpPurchaseOrderDO.class, in -> in
                .setNo(no).setStatus(ErpAuditStatus.PROCESS.getStatus())
                .setInCount(BigDecimal.ZERO).setInStatus(ErpPurchaseOrderInStatusEnum.NOT_IN.getStatus()));
                .setInCount(BigDecimal.ZERO).setInStatus(ErpPurchaseOrderInStatusEnum.NOT_IN.getStatus())
                .setContractNo(contractNo));
        calculateTotalPrice(purchaseOrder, purchaseOrderItems);
        purchaseOrderMapper.insert(purchaseOrder);
        // 2.2 插入订单项
@@ -167,9 +172,12 @@
        }
        // 1.4 校验订单项的有效性
        List<ErpPurchaseOrderItemDO> purchaseOrderItems = validatePurchaseOrderItems(updateReqVO.getItems());
        // 1.5 校验并解析关联合同
        String contractNo = resolveContractNo(updateReqVO.getContractId(), updateReqVO.getSupplierId());
        // 2.1 更新订单
        ErpPurchaseOrderDO updateObj = BeanUtils.toBean(updateReqVO, ErpPurchaseOrderDO.class);
        updateObj.setContractNo(contractNo);
        calculateTotalPrice(updateObj, purchaseOrderItems);
        purchaseOrderMapper.updateById(updateObj);
        // 2.2 更新订单项
@@ -599,6 +607,21 @@
        });
    }
    /**
     * 校验关联合同,返回冗余的合同编码;未关联合同时返回 null
     */
    private String resolveContractNo(Long contractId, Long supplierId) {
        if (contractId == null) {
            return null;
        }
        cn.iocoder.yudao.module.erp.dal.dataobject.purchase.ErpSupplierContractDO contract =
                supplierContractService.validateContractExists(contractId);
        if (!Objects.equals(contract.getSupplierId(), supplierId)) {
            throw exception(SUPPLIER_CONTRACT_SUPPLIER_MISMATCH);
        }
        return contract.getCode();
    }
    private ErpPurchaseOrderDO validatePurchaseOrderExists(Long id) {
        ErpPurchaseOrderDO purchaseOrder = purchaseOrderMapper.selectById(id);
        if (purchaseOrder == null) {