From 6aceb9ad034347f2fbac0fb3c197de2c516be3bf Mon Sep 17 00:00:00 2001 From: gaoqr <13665037151@163.com> Date: Thu, 9 Oct 2025 14:33:58 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=8F=91=E7=A5=A8=E6=8A=AC=E5=A4=B4?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E7=BA=B3=E7=A8=8E=E5=8F=B7=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E4=B8=BA=E7=BB=9F=E4=B8=80=E4=BF=A1=E7=94=A8=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=EF=BC=8C=E5=8F=AA=E6=9C=89=E4=BC=81=E4=B8=9A=E5=8F=91=E7=A5=A8?= =?UTF-8?q?=E6=89=8D=E6=A3=80=E6=9F=A5=E5=94=AF=E4=B8=80=E5=92=8C=E9=9D=9E?= =?UTF-8?q?=E7=A9=BA=EF=BC=9B2=E3=80=81=E4=BA=A7=E5=93=81=E8=B4=AD?= =?UTF-8?q?=E4=B9=B0=E7=BA=AF=E7=AC=AC=E4=B8=89=E6=96=B9=E6=94=AF=E4=BB=98?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E7=94=9F=E6=88=90=E6=94=B6=E6=94=AF=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/util/Assert/AssertUtils.java | 7 +++++ .../system/enums/ErrorCodeConstants.java | 3 +- .../funds/invoice/vo/InvoiceTitleInfo.java | 4 +-- .../invoice/vo/InvoiceTitleSaveReqVO.java | 7 ++--- .../admin/organ/vo/organ/OrganSaveReqVO.java | 2 +- .../funds/invoice/InvoiceTitleInfoDO.java | 4 +-- .../funds/invoice/InvoiceServiceImpl.java | 31 ++++++++++++------- .../service/pay/PayOrderServiceImpl.java | 21 +++++++++++++ .../src/main/resources/application-dev.yaml | 1 + .../src/main/resources/application-local.yaml | 1 + 10 files changed, 59 insertions(+), 22 deletions(-) diff --git a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/Assert/AssertUtils.java b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/Assert/AssertUtils.java index fb977e2d7..c90069d9c 100644 --- a/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/Assert/AssertUtils.java +++ b/cf-framework/cf-common/src/main/java/com/cf/imes/framework/common/util/Assert/AssertUtils.java @@ -4,6 +4,7 @@ package com.cf.imes.framework.common.util.Assert; import cn.hutool.core.util.ObjectUtil; import com.cf.imes.framework.common.exception.ErrorCode; import com.cf.imes.framework.common.exception.util.ServiceExceptionUtil; +import org.apache.commons.lang3.StringUtils; import org.springframework.util.ObjectUtils; import java.util.List; @@ -72,6 +73,12 @@ public class AssertUtils { } } + public static void notEmpty(String str, ErrorCode errorCode) { + if (StringUtils.isEmpty(str)) { + throw exception(errorCode); + } + } + public static void notEquals(Object obj1, Object obj2, ErrorCode errorCode) { if (ObjectUtil.notEqual(obj1, obj2)) { throw exception(errorCode); diff --git a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java index 6fb0e4b45..7e82afdcd 100644 --- a/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java +++ b/cf-module-system/cf-module-system-api/src/main/java/com/cf/imes/module/system/enums/ErrorCodeConstants.java @@ -441,9 +441,10 @@ public class ErrorCodeConstants { public static final ErrorCode ORG_INVOICE_PURCHASE_RECORD_UPDATE_NUM_NOT_MATCH_ERROR = new ErrorCode(1_002_043_029, "当前勾选的购买记录中部分可能已开票,请查询后重新勾选提交开票"); public static final ErrorCode ORG_INVOICE_AGREE_FILE_NULL_ERROR = new ErrorCode(1_002_043_030, "确认开票发票附件不能为空,请上传后再提交"); public static final ErrorCode INVOICE_TITLE_ORG_EXISTS_ERROR = new ErrorCode(1_002_043_031, "组织下已存在发票抬头,请刷新后编辑抬头内容"); - public static final ErrorCode INVOICE_TITLE_TAXPAYERID_EXISTS_ERROR = new ErrorCode(1_002_043_032, "纳税人识别号已存在,请检查"); + public static final ErrorCode INVOICE_TITLE_TAXPAYERID_EXISTS_ERROR = new ErrorCode(1_002_043_032, "统一社会信用代码已存在,请检查"); public static final ErrorCode PRODUCTS_NOT_NOLIST = new ErrorCode(1_002_043_033, "当前产品未上架"); public static final ErrorCode ORG_PRODUCT_PURCHASE_LOCK_ERROR = new ErrorCode(1_002_043_034, "组织下存在购买中的产品操作,请稍后再试"); + public static final ErrorCode INVOICE_TITLE_ENTERPRISE_TAXNUMBER_EMPTY_ERROR = new ErrorCode(1_002_043_035, "企业统一信用代码不能为空"); //=========== 支付相关 1-002-048-000 ============ public static final ErrorCode PAY_CHANNEL_NOT_SUPPORT = new ErrorCode(1_002_048_000, "暂不支持的支付渠道,请使用其他支付渠道"); diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleInfo.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleInfo.java index f3f9bf3fa..04d1bc969 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleInfo.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleInfo.java @@ -28,8 +28,8 @@ public class InvoiceTitleInfo { private Integer invoiceType; - @Schema(description = "纳税人识别号") - private String taxpayerId; + @Schema(description = "统一社会信用代码") + private String taxNumber; @Schema(description = "开户银行名称") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleSaveReqVO.java index a0ef77b3d..476cbd39c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceTitleSaveReqVO.java @@ -38,10 +38,9 @@ public class InvoiceTitleSaveReqVO { private Integer invoiceType; - @Schema(description = "纳税人识别号") - @NotNull(message = "纳税人识别号不能为空") - @Size(max = 20, message = "纳税人识别号长度不能超过20个字符") - private String taxpayerId; + @Schema(description = "统一社会信用代码") + @Size(max = 20, message = "统一社会信用代码长度不能超过18个字符") + private String taxNumber; @Schema(description = "开户银行名称") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java index aee3834eb..a1933ad46 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/organ/vo/organ/OrganSaveReqVO.java @@ -113,7 +113,7 @@ public class OrganSaveReqVO { private Integer grayStatus; @Schema(description = "产品购买列表") - @Size(max = 10, message = "创建组织时最少需要购买1个产品,最多可购买10个产品") + @Size(min = 1, max = 10, message = "创建组织时最少需要购买1个产品", groups = {OrganSaveCreateGroup.class}) @Valid private List productPurchaseReqVOS; } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/invoice/InvoiceTitleInfoDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/invoice/InvoiceTitleInfoDO.java index 6f84e30f2..d1897ef61 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/invoice/InvoiceTitleInfoDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/invoice/InvoiceTitleInfoDO.java @@ -53,9 +53,9 @@ public class InvoiceTitleInfoDO extends BaseDO { /** - * 纳税人识别号 + * 统一社会信用代码 */ - private String taxpayerId; + private String taxNumber; /** diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceServiceImpl.java index 1fddfd5a4..ef57e5188 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceServiceImpl.java @@ -34,6 +34,7 @@ import com.cf.imes.module.system.dal.dataobject.organ.OrganizationDO; import com.cf.imes.module.system.dal.mysql.funds.invoice.InvoiceRecordsMapper; import com.cf.imes.module.system.dal.mysql.funds.invoice.InvoiceTitleInfoMapper; import com.cf.imes.module.system.dal.mysql.funds.purchase.PurchaseRecordMapper; +import com.cf.imes.module.system.enums.pay.InvoiceIssueTypeEnum; import com.cf.imes.module.system.enums.pay.InvoiceStatusEnum; import com.cf.imes.module.system.enums.pay.TradeTypeEnum; import com.cf.imes.module.system.service.organ.OrganService; @@ -55,8 +56,8 @@ import static com.cf.imes.framework.common.util.json.JsonUtils.parseObject; import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; import static com.cf.imes.framework.common.util.json.JsonUtils.unzipString; import static com.cf.imes.framework.common.util.json.JsonUtils.zipString; -import static com.cf.imes.framework.security.core.util.SecurityFrameworkUtils.getUserOrganId; import static com.cf.imes.module.system.enums.ErrorCodeConstants.INVOICE_NO_EXIST; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.INVOICE_TITLE_ENTERPRISE_TAXNUMBER_EMPTY_ERROR; import static com.cf.imes.module.system.enums.ErrorCodeConstants.INVOICE_TITLE_NOT_EXISTS_ERROR; import static com.cf.imes.module.system.enums.ErrorCodeConstants.INVOICE_TITLE_ORG_EXISTS_ERROR; import static com.cf.imes.module.system.enums.ErrorCodeConstants.INVOICE_TITLE_TAXPAYERID_EXISTS_ERROR; @@ -103,8 +104,12 @@ public class InvoiceServiceImpl implements InvoiceService { Long id = reqVO.getId(); - // 校验纳税人识别号和组织id是否唯一 - validOrgAndTaxpayerNo(id, organId, reqVO.getTaxpayerId()); + Integer issueType = reqVO.getIssueType(); + // 企业发票抬头校验统一社会信用代码非空 + AssertUtils.notEmpty(InvoiceIssueTypeEnum.ENTERPRISE.getValue().equals(issueType) ? reqVO.getTaxNumber() : "0", INVOICE_TITLE_ENTERPRISE_TAXNUMBER_EMPTY_ERROR); + + // 校验统一社会信用代码和组织id是否唯一 + validOrgAndTaxpayerNo(id, organId, reqVO.getTaxNumber(), issueType); if (id != null) { validTitleOrg(id, organId); @@ -119,8 +124,8 @@ public class InvoiceServiceImpl implements InvoiceService { .organId(organId) .invoiceTitle(reqVO.getInvoiceTitle()) .invoiceType(reqVO.getInvoiceType()) - .issueType(reqVO.getIssueType()) - .taxpayerId(reqVO.getTaxpayerId()) + .issueType(issueType) + .taxNumber(reqVO.getTaxNumber()) .bankName(reqVO.getBankName()) .bankAccount(reqVO.getBankAccount()) .registeredAddress(reqVO.getRegisteredAddress()) @@ -130,13 +135,14 @@ public class InvoiceServiceImpl implements InvoiceService { } /** - * 校验组织和纳税人识别号唯一 + * 校验组织和统一社会信用代码 * - * @param id 发票抬头id - * @param organId 组织id - * @param taxpayerId 纳税人识别号 + * @param id 发票抬头id + * @param organId 组织id + * @param taxNumber 统一社会信用代码 + * @param issueType 开具类型 */ - private void validOrgAndTaxpayerNo(Long id, Long organId, String taxpayerId) { + private void validOrgAndTaxpayerNo(Long id, Long organId, String taxNumber, Integer issueType) { InvoiceTitleInfoDO exist = invoiceTitleInfoMapper.selectOne(new LambdaQueryWrapperX() .neIfPresent(InvoiceTitleInfoDO::getId, id) .eq(InvoiceTitleInfoDO::getOrganId, organId)); @@ -146,8 +152,9 @@ public class InvoiceServiceImpl implements InvoiceService { } exist = invoiceTitleInfoMapper.selectOne(new LambdaQueryWrapperX() .neIfPresent(InvoiceTitleInfoDO::getId, id) - .eq(InvoiceTitleInfoDO::getTaxpayerId, taxpayerId)); - if (ObjectUtil.isNotNull(exist)) { + .eq(InvoiceTitleInfoDO::getTaxNumber, taxNumber)); + // 开具企业类型发票校验统一社会信用代码 + if (InvoiceIssueTypeEnum.ENTERPRISE.getValue().equals(issueType) && ObjectUtil.isNotNull(exist)) { throw new ServiceException(INVOICE_TITLE_TAXPAYERID_EXISTS_ERROR); } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java index 3b2010d20..4ba1f8cd7 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/pay/PayOrderServiceImpl.java @@ -643,6 +643,11 @@ public class PayOrderServiceImpl implements PayOrderService { if (ObjectUtil.isNotNull(payOrderDO) && ObjectUtil.isNotNull(payOrderDO.getPurchaseId())) { Long organId = payOrderDO.getOrganId(); + // 支付订单的金额 + BigDecimal price = payOrderDO.getPrice(); + // 订单流水号 + String payNo = payOrderDO.getPayNo(); + // 1、更新购买记录的开票状态 long purchaseId = payOrderDO.getPurchaseId(); purchaseService.updateRecordInvoicable(purchaseId, organId); @@ -658,6 +663,22 @@ public class PayOrderServiceImpl implements PayOrderService { // 4、激活本次的购买记录 purchaseService.activateHistoryOrganProductPurchaseRecord(organId, purchaseId); + + // 5.如果是纯第三方支付需要新增收支明细 + Integer paymentMethod = record.getPaymentMethod(); + if (PayProductChannelCodeEnum.ALIPAY_PC.getCode().equals(paymentMethod) || PayProductChannelCodeEnum.WECHAT_NATIVE.getCode().equals(paymentMethod)) { + IncomeExpenseDetailsDO incomeExpenseDetailsDO = IncomeExpenseDetailsDO.builder() + .organId(organId) + .orderNo(payNo) + .businessNo(snowflakeSerialNoWorker3rd.nextSerialNo()) + .tradeType(TradeTypeEnum.PRODUCT.getCode()) + .incomeExpenseType(IncomeExpenseTypeEnum.EXPENSES.getCode()) + .cashAmountChange(price) + .build(); + incomeExpenseDetailsDO.setCreator(payOrderDO.getCreator()); + incomeExpenseDetailsDO.setUpdater(payOrderDO.getUpdater()); + incomeExpenseService.createDetail(incomeExpenseDetailsDO); + } } } diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/application-dev.yaml b/cf-module-system/cf-module-system-biz/src/main/resources/application-dev.yaml index 1f87502d5..ba1b2270c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/application-dev.yaml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/application-dev.yaml @@ -243,6 +243,7 @@ chenfeng: - income_expense_details - system_organization_amount - product_delay_record + - invoice_title_info use-data-code: imes_prod #动态数据源标识,后期添加的数据源需要修改此值 xss: diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/application-local.yaml b/cf-module-system/cf-module-system-biz/src/main/resources/application-local.yaml index cbd45fb44..c582a850e 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/application-local.yaml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/application-local.yaml @@ -259,6 +259,7 @@ chenfeng: - income_expense_details - system_organization_amount - product_delay_record + - invoice_title_info use-data-code: imes_prod #动态数据源标识,后期添加的数据源需要修改此值 env: # 多环境的配置项