liu
2026-10-23 962f78c8383e7c884ddb08c951c15e5ba6eb4cb8
yudao-module-crm/src/main/java/cn/iocoder/yudao/module/crm/service/invoice/CrmInvoiceServiceImpl.java
@@ -166,9 +166,9 @@
        // 1.2 校验可开票金额超过上限
        validateInvoicePriceExceedsLimit(updateReqVO);
        // 1.3 只有草稿、审批中,可以编辑;
        // 1.3 只有草稿、审核不通过,可以编辑;
        if (!ObjectUtils.equalsAny(oldInvoice.getAuditStatus(), CrmAuditStatusEnum.DRAFT.getStatus(),
                CrmAuditStatusEnum.PROCESS.getStatus())) {
                CrmAuditStatusEnum.REJECT.getStatus())) {
            throw exception(INVOICE_UPDATE_FAIL_EDITING_PROHIBITED);
        }
@@ -213,6 +213,7 @@
    @Transactional(rollbackFor = Exception.class)
    @LogRecord(type = CRM_INVOICE_TYPE, subType = CRM_INVOICE_SUBMIT_SUB_TYPE, bizNo = "{{#id}}",
            success = CRM_INVOICE_SUBMIT_SUCCESS)
    @CrmPermission(bizType = CrmBizTypeEnum.CRM_INVOICE, bizId = "#id", level = CrmPermissionLevelEnum.WRITE)
    public void submitInvoice(Long id) {
        // 1. 校验存在 + 可提交状态(未提交 / 审核不通过)
        CrmInvoiceDO invoice = validateInvoiceExists(id);
@@ -229,7 +230,9 @@
        approvalConfigApi.validateApprovalEnabledAndGetApprovers(INVOICE_APPROVE_BIZ_TYPE);
        // 4. 状态置为审批中,并清空上一轮审核结果,避免残留「审核不通过」的原因
        invoiceMapper.submitAndResetAuditInfo(id, CrmAuditStatusEnum.PROCESS.getStatus());
        if (invoiceMapper.submitAndResetAuditInfo(id, CrmAuditStatusEnum.PROCESS.getStatus()) != 1) {
            throw exception(INVOICE_SUBMIT_FAIL_NOT_EDITABLE);
        }
        // 5. 记录日志
        LogRecordContext.putVariable("invoiceNo", invoice.getNo());
@@ -257,14 +260,18 @@
            if (StrUtil.isBlank(reviewRemark)) {
                throw exception(INVOICE_AUDIT_REJECT_REASON_REQUIRED);
            }
            invoiceMapper.auditInvoice(id, CrmAuditStatusEnum.REJECT.getStatus(),
                    userId, getUserNickname(userId), reviewRemark);
            if (invoiceMapper.auditInvoice(id, CrmAuditStatusEnum.REJECT.getStatus(),
                    userId, getUserNickname(userId), reviewRemark) != 1) {
                throw exception(INVOICE_AUDIT_FAIL_NOT_PROCESS);
            }
            return;
        }
        // 5. 审核通过:记录审核人与审核意见,状态置为审核通过
        //    (开票无额外后置业务逻辑,审批通过后即可用于创建回款 / 关联开票选择)
        invoiceMapper.auditInvoice(id, CrmAuditStatusEnum.APPROVE.getStatus(),
                userId, getUserNickname(userId), reviewRemark);
        if (invoiceMapper.auditInvoice(id, CrmAuditStatusEnum.APPROVE.getStatus(),
                userId, getUserNickname(userId), reviewRemark) != 1) {
            throw exception(INVOICE_AUDIT_FAIL_NOT_PROCESS);
        }
    }
    /**