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 99b72d520..2ddac23a3 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 @@ -438,6 +438,7 @@ public class ErrorCodeConstants { public static final ErrorCode PAY_RECHARGE_ACTIVITY_CHANNEL_MISMATCH_ERROR = new ErrorCode(1_002_043_026, "充值活动类型和支付渠道不匹配,请选择其他充值活动!"); public static final ErrorCode PAY_RECHARGE_ACTIVITY_EXPIRE_ERROR = new ErrorCode(1_002_043_027, "充值活动已结束,请选择其他充值活动!"); public static final ErrorCode INVOICE_TITLE_NOT_EXISTS_ERROR = new ErrorCode(1_002_043_028, "发票抬头不存在,请先创建发票抬头"); + public static final ErrorCode ORG_INVOICE_PURCHASE_RECORD_UPDATE_NUM_NOT_MATCH_ERROR = new ErrorCode(1_002_043_029, "当前勾选的购买记录中部分可能已开票,请查询后重新勾选提交开票"); //=========== 支付相关 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/InvoiceController.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/InvoiceController.java index f8bdbaecd..69b132d65 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/InvoiceController.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/InvoiceController.java @@ -2,8 +2,12 @@ package com.cf.imes.module.system.controller.admin.funds.invoice; import com.cf.imes.framework.common.pojo.CommonResult; +import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageReqVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageRespVO; +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceDetailsPageReqVO; +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceRecordsReqVO; +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceRecordsRespVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceTitleReqVO; import com.cf.imes.module.system.service.funds.invoice.InvoiceService; import io.swagger.v3.oas.annotations.Operation; @@ -45,6 +49,19 @@ public class InvoiceController { @GetMapping("/available/info") @Operation(summary = "获取组织的开票金额信息") public CommonResult getInvoiceAmountAndAvailablePage(@Valid InvoiceAmountAndAvailablePageReqVO pageReqVO) { - return success(invoiceService.getInvoiceAmount(pageReqVO)); + return success(invoiceService.getInvoiceAmountAndAvailablePage(pageReqVO)); + } + + @PostMapping("") + @Operation(summary = "组织申请开票") + public CommonResult insetInvoiceRecords(@Valid @RequestBody InvoiceRecordsReqVO reqVO) { + invoiceService.applyInvoice(reqVO); + return success(Boolean.TRUE); + } + + @GetMapping("/records") + @Operation(summary = "获取组织的开票记录") + public CommonResult> getInvoiceRecords(@Valid InvoiceDetailsPageReqVO pageReqVO) { + return success(invoiceService.getInvoiceRecords(pageReqVO)); } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceRecordsReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceRecordsReqVO.java new file mode 100644 index 000000000..00603013a --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceRecordsReqVO.java @@ -0,0 +1,20 @@ +package com.cf.imes.module.system.controller.admin.funds.invoice.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.Size; +import lombok.Data; + +import java.util.List; + +@Data +@Schema(description = "管理后台 - 组织申请开票 Request VO") +public class InvoiceRecordsReqVO { + + @Schema(description = "购买记录ID") + @Size(max = 300, message = "单次开票选择记录不能超过100条") + @NotEmpty + private List purchaseRecordId; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceRecordsRespVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceRecordsRespVO.java new file mode 100644 index 000000000..2149e3a9f --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/funds/invoice/vo/InvoiceRecordsRespVO.java @@ -0,0 +1,67 @@ +package com.cf.imes.module.system.controller.admin.funds.invoice.vo; + + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +@Data +@Schema(description = "管理后台 - 组织开票记录 Response VO") +public class InvoiceRecordsRespVO { + + + @Schema(description = "发票ID") + private Long id; + + + @Schema(description = "组织ID") + private Long organId; + + + @Schema(description = "组织名称") + private String organName; + + + @Schema(description = "发票申请人ID") + private Long userId; + + + @Schema(description = "发票申请人名称") + private String creator; + + + @Schema(description = "发票号") + private String invoiceNo; + + + @Schema(description = "发票金额") + private BigDecimal invoiceAmount; + + + @Schema(description = "发票状态,1待开票 2已开票 3开票失败") + private Integer status; + + + @Schema(description = "发票附件保存路径") + private String invoiceAttachmentPath; + + + @Schema(description = "开票人") + private String invoicePerson; + + + @Schema(description = "开票人用户ID") + private Long invoicePersonId; + + + @Schema(description = "开票时间") + private LocalDateTime invoiceTime; + + + @Schema(description = "备注") + private String remark; + + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayOrderUnifiedReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayOrderUnifiedReqVO.java deleted file mode 100644 index 9cd9e0fc2..000000000 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayOrderUnifiedReqVO.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.cf.imes.module.system.controller.admin.pay.vo; - -import com.cf.imes.module.system.validation.pay.PayChannelCodeValid; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.hibernate.validator.constraints.Length; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.DecimalMin; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 统一支付vo - * - * @author Gqr - * @since 2025/4/15 14:30 - */ -@Data -@Valid -public class PayOrderUnifiedReqVO { - /** - * 商品标题 - */ - @NotEmpty(message = "商品标题不能为空") - @Length(max = 32, message = "商品标题不能超过 32") - private String subject; - - /** - * 支付金额,单位:元 - */ - @NotNull(message = "支付金额不能为空") - @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") - private BigDecimal price; - - @NotNull(message = "订单失效时间不能为空") - private LocalDateTime expireTime; - - @Schema(description = "支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") - @PayChannelCodeValid - @NotNull(message = "支付渠道编码不能为空") - private Integer channelCode; -} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayRechargeOrderReqVO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayRechargeOrderReqVO.java index db851a625..ea3fb3317 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayRechargeOrderReqVO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/controller/admin/pay/vo/PayRechargeOrderReqVO.java @@ -3,7 +3,9 @@ package com.cf.imes.module.system.controller.admin.pay.vo; import com.cf.imes.module.system.validation.pay.PayChannelCodeValid; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.Valid; +import jakarta.validation.constraints.DecimalMax; import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; import jakarta.validation.constraints.NotNull; import lombok.Data; @@ -25,7 +27,9 @@ public class PayRechargeOrderReqVO { @Schema(description = "支付金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @NotNull(message = "支付金额不能为空") - @DecimalMin(value = "0", inclusive = false, message = "支付金额必须大于零") + @DecimalMin(value = "0.01", message = "支付金额必须大于零") + @DecimalMax(value = "100000", message = "支付金额不能超过十万") + @Digits(integer = 6, fraction = 2, message = "支付金额格式不正确") private BigDecimal price; @Schema(description = "支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/invoice/InvoiceRecordsDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/invoice/InvoiceRecordsDO.java new file mode 100644 index 000000000..fa4919a56 --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/invoice/InvoiceRecordsDO.java @@ -0,0 +1,121 @@ +package com.cf.imes.module.system.dal.dataobject.funds.invoice; + +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.cf.imes.framework.mybatis.core.dataobject.BaseDO; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.ToString; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * @author 开票记录表 + */ +@TableName("invoice_records") +@KeySequence("invoice_records_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 +@Data +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class InvoiceRecordsDO extends BaseDO { + + /** + * 主键 + */ + @TableId + private Long id; + + + /** + * 组织ID + */ + private Long organId; + + + /** + * 组织/发票抬头名称 + */ + private String organName; + + + /** + * 用户ID-发票申请人ID + */ + private Long userId; + + + /** + * 发票号 + */ + private String invoiceNo; + + + /** + * 购买记录单号 + */ + private String purchaseIds; + + + /** + * 发票金额 + */ + private BigDecimal invoiceAmount; + + + /** + * 发票状态,1待开票 2已开票 3开票失败 + */ + private Integer status; + + + /** + * 发票附件保存路径 + */ + private String invoiceAttachmentPath; + + + /** + * 开票人 + */ + private String invoicePerson; + + + /** + * 开票人用户ID + */ + private Long invoicePersonId; + + + /** + * 开票时间 + */ + private LocalDateTime invoiceTime; + + + + /** + * 抬头ID + */ + private Long invoiceTitleId; + + + /** + * 抬头 + */ + private String invoiceTitleInfo; + + + /** + * 备注 + */ + private String remark; + +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/purchase/PurchaseRecordDO.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/purchase/PurchaseRecordDO.java index 5b8ee766c..b88adfbf2 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/purchase/PurchaseRecordDO.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/dataobject/funds/purchase/PurchaseRecordDO.java @@ -43,18 +43,6 @@ public class PurchaseRecordDO extends BaseDO { private Long organId; - /** - * 用户ID-发票申请人ID - */ - private Long InvoiceApplicantUserId; - - - /** - * 发票申请人名称 - */ - private Long InvoiceApplicantUserName; - - /** * 产品ID */ diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/funds/invoice/InvoiceRecordsMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/funds/invoice/InvoiceRecordsMapper.java new file mode 100644 index 000000000..69010402b --- /dev/null +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/funds/invoice/InvoiceRecordsMapper.java @@ -0,0 +1,28 @@ +package com.cf.imes.module.system.dal.mysql.funds.invoice; + + +import com.cf.imes.framework.common.pojo.PageResult; +import com.cf.imes.framework.mybatis.core.mapper.BaseMapperX; +import com.cf.imes.framework.mybatis.core.query.LambdaQueryWrapperX; + +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceDetailsPageReqVO; +import com.cf.imes.module.system.dal.dataobject.funds.invoice.InvoiceRecordsDO; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface InvoiceRecordsMapper extends BaseMapperX { + + + default PageResult selectInvoiceRecordsPage(InvoiceDetailsPageReqVO pageReqVO) { + return selectPage(pageReqVO, new LambdaQueryWrapperX() + .eq(InvoiceRecordsDO::getDeleted,false) + .eqIfPresent(InvoiceRecordsDO::getOrganId,pageReqVO.getOrganId()) + .likeIfPresent(InvoiceRecordsDO::getInvoiceNo,pageReqVO.getInvoiceNo()) + .eqIfPresent(InvoiceRecordsDO::getStatus,pageReqVO.getStatus()) + .likeIfPresent(InvoiceRecordsDO::getCreator,pageReqVO.getCreator()) + .likeIfPresent(InvoiceRecordsDO::getInvoicePerson,pageReqVO.getInvoicePerson()) + .betweenIfPresent(InvoiceRecordsDO::getInvoiceAmount,pageReqVO.getInvoiceAmount()) + .betweenIfPresent(InvoiceRecordsDO::getCreateTime,pageReqVO.getCreateTime()) + .betweenIfPresent(InvoiceRecordsDO::getInvoiceTime,pageReqVO.getInvoiceTime())); + } +} diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/funds/purchase/PurchaseRecordMapper.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/funds/purchase/PurchaseRecordMapper.java index 7cd1488b9..6e13d9397 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/funds/purchase/PurchaseRecordMapper.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/dal/mysql/funds/purchase/PurchaseRecordMapper.java @@ -11,8 +11,10 @@ import com.cf.imes.module.system.controller.admin.funds.purchase.vo.PurchaseReco import com.cf.imes.module.system.dal.dataobject.funds.purchase.PurchaseRecordDO; import com.cf.imes.module.system.enums.pay.InvoiceStatusEnum; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.math.BigDecimal; +import java.util.List; /** * 购买记录 Mapper @@ -58,6 +60,7 @@ public interface PurchaseRecordMapper extends BaseMapperX { .eq(PurchaseRecordDO::getOrganId, SecurityFrameworkUtils.getUserOrganId()) .eq(PurchaseRecordDO::getDeleted, false) .in(PurchaseRecordDO::getIsInvocing, InvoiceStatusEnum.INVOICABLE.getStatus(), InvoiceStatusEnum.INVOICINGFAILED.getStatus()) + .orderByDesc(PurchaseRecordDO::getCreateTime) ); } @@ -68,4 +71,11 @@ public interface PurchaseRecordMapper extends BaseMapperX { * @return */ InvoiceAmountRespVO getOrgInvoiceAmountStatistics(Long organId); + + /** + * 查询可开票的金额 + * + * @param organId + */ + BigDecimal getInvoicableAmount(Long organId, @Param("ids") List ids); } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceService.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceService.java index e6ceb8067..852fc9037 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceService.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/invoice/InvoiceService.java @@ -5,7 +5,8 @@ import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageReqVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageRespVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceDetailsPageReqVO; -import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceDetailsRespVO; +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceRecordsReqVO; +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceRecordsRespVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceTitleReqVO; /** @@ -26,13 +27,20 @@ public interface InvoiceService { * @param invoiceAmountAndAvailablePageReqVO * @return */ - InvoiceAmountAndAvailablePageRespVO getInvoiceAmount(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO); + InvoiceAmountAndAvailablePageRespVO getInvoiceAmountAndAvailablePage(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO); /** - * 查询开票分页 + * 组织申请发票 + * + * @param reqVO + */ + void applyInvoice(InvoiceRecordsReqVO reqVO); + + /** + * 查询组织开票记录 * * @param pageReqVO * @return */ - PageResult getInvoiceDetails(InvoiceDetailsPageReqVO pageReqVO); + PageResult getInvoiceRecords(InvoiceDetailsPageReqVO pageReqVO); } 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 b954af8b8..db6484bf8 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 @@ -1,24 +1,43 @@ package com.cf.imes.module.system.service.funds.invoice; - +import cn.hutool.core.collection.CollUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.cf.imes.framework.common.exception.ServiceException; import com.cf.imes.framework.common.pojo.PageResult; import com.cf.imes.framework.common.util.Assert.AssertUtils; +import com.cf.imes.framework.common.util.date.LocalDateTimeUtils; +import com.cf.imes.framework.common.util.json.JsonUtils; import com.cf.imes.framework.common.util.object.BeanUtils; +import com.cf.imes.framework.security.core.LoginUser; import com.cf.imes.framework.security.core.util.SecurityFrameworkUtils; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageReqVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageRespVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceDetailsPageReqVO; -import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceDetailsRespVO; +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceRecordsReqVO; +import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceRecordsRespVO; import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceTitleReqVO; +import com.cf.imes.module.system.dal.dataobject.funds.invoice.InvoiceRecordsDO; import com.cf.imes.module.system.dal.dataobject.funds.invoice.InvoiceTitleInfoDO; +import com.cf.imes.module.system.dal.dataobject.funds.purchase.PurchaseRecordDO; +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.InvoiceStatusEnum; +import com.cf.imes.module.system.service.organ.OrganService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; +import java.math.BigDecimal; +import java.util.List; + +import static com.cf.imes.framework.common.util.json.JsonUtils.toJsonString; +import static com.cf.imes.framework.common.util.json.JsonUtils.zipString; import static com.cf.imes.module.system.enums.ErrorCodeConstants.INVOICE_TITLE_NOT_EXISTS_ERROR; +import static com.cf.imes.module.system.enums.ErrorCodeConstants.ORG_INVOICE_PURCHASE_RECORD_UPDATE_NUM_NOT_MATCH_ERROR; /** @@ -35,6 +54,11 @@ public class InvoiceServiceImpl implements InvoiceService { @Resource private PurchaseRecordMapper purchaseRecordMapper; + @Resource + private InvoiceRecordsMapper invoiceRecordsMapper; + + @Resource + private OrganService organService; @Override public void insetInvoiceTitle(InvoiceTitleReqVO reqVO) { @@ -77,7 +101,7 @@ public class InvoiceServiceImpl implements InvoiceService { } @Override - public InvoiceAmountAndAvailablePageRespVO getInvoiceAmount(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO) { + public InvoiceAmountAndAvailablePageRespVO getInvoiceAmountAndAvailablePage(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO) { InvoiceAmountAndAvailablePageRespVO invoiceAmountAndAvailablePageRespVO = new InvoiceAmountAndAvailablePageRespVO(); // 开票金额 invoiceAmountAndAvailablePageRespVO.setInvoiceAmountRespVO(purchaseRecordMapper.getOrgInvoiceAmountStatistics(SecurityFrameworkUtils.getUserOrganId())); @@ -89,35 +113,59 @@ public class InvoiceServiceImpl implements InvoiceService { } @Override - public PageResult getInvoiceDetails(InvoiceDetailsPageReqVO pageReqVO) { -// -// PageDTO page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); -// -// List invoiceStatus = new ArrayList<>(); -// invoiceStatus.add(InvoiceStatusEnum.INVOICABLE.getStatus()); -// invoiceStatus.add(InvoiceStatusEnum.INVOICINGFAILED.getStatus()); -// -// QueryWrapperX queryWrapperX = new QueryWrapperX<>(); -// -// pageReqVO.setCreateTime(LocalDateTimeUtils.generateTimeSection(pageReqVO.getCreateTime())); -// queryWrapperX -// .eq("ied.organId",getUserOrganId()) -// .eq("ied.deleted",false) -// .eq("ied.trade_type", TradeTypeEnum.PRODUCT.getCode()) -// .in("pr.is_invocing", invoiceStatus) -// .betweenIfPresent("ied.create_time",pageReqVO.getCreateTime()) -// .betweenIfPresent("ied.cash_amount_change",pageReqVO.getAmount()); -// -// IPage respVOIPage = incomeExpenseDetailsMapper.selectOrganInvoicable(page, queryWrapperX); -// -// List records = respVOIPage.getRecords(); -// if (CollUtil.isEmpty(records)) { -// return new PageResult<>(); -// } -// -// return new PageResult<>(records, respVOIPage.getTotal()); - return null; + public void applyInvoice(InvoiceRecordsReqVO reqVO) { + Long organId = SecurityFrameworkUtils.getUserOrganId(); + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + List purchaseRecordId = reqVO.getPurchaseRecordId(); + // 查询发票抬头 + InvoiceTitleInfoDO invoiceTitleInfoDO = invoiceTitleInfoMapper.selectOne(new LambdaQueryWrapper() + .eq(InvoiceTitleInfoDO::getOrganId, organId)); + AssertUtils.notEmpty(invoiceTitleInfoDO, INVOICE_TITLE_NOT_EXISTS_ERROR); + + // 查询可开票金额 + BigDecimal invoicableAmount = purchaseRecordMapper.getInvoicableAmount(organId, purchaseRecordId); + + // 更新购买记录表的发票状态 + int update = purchaseRecordMapper.update(new LambdaUpdateWrapper() + .eq(PurchaseRecordDO::getOrganId, organId) + .eq(PurchaseRecordDO::getDeleted, false) + .in(PurchaseRecordDO::getId, purchaseRecordId) + .set(PurchaseRecordDO::getIsInvocing, InvoiceStatusEnum.PENDINGINVOICING.getStatus())); + if (update != purchaseRecordId.size()) { + throw new ServiceException(ORG_INVOICE_PURCHASE_RECORD_UPDATE_NUM_NOT_MATCH_ERROR); + } + + // 查询组织名称 + OrganizationDO organizationDO = organService.validOrgan(organId); + + // 插入开票记录 + invoiceRecordsMapper.insert(InvoiceRecordsDO.builder() + .userId(loginUser.getId()) + .organName(organizationDO.getName()) + .organId(organId) + .purchaseIds(JsonUtils.toJsonString(purchaseRecordId)) + .invoiceAmount(invoicableAmount) + .invoiceTitleId(invoiceTitleInfoDO.getId()) + .invoiceTitleInfo(zipString(toJsonString(invoiceTitleInfoDO))) + .status(InvoiceStatusEnum.PENDINGINVOICING.getStatus()) + .build()); } + @Override + public PageResult getInvoiceRecords(InvoiceDetailsPageReqVO pageReqVO) { + // 时间类型规范为开始0点,结束12点 + pageReqVO.setCreateTime(LocalDateTimeUtils.generateTimeSection(pageReqVO.getCreateTime())); + pageReqVO.setInvoiceTime(LocalDateTimeUtils.generateTimeSection(pageReqVO.getInvoiceTime())); + + // 分页查询 + PageResult pageResult = invoiceRecordsMapper.selectInvoiceRecordsPage(pageReqVO); + List resultList = pageResult.getList(); + + if(CollUtil.isEmpty(resultList)){ + return new PageResult<>(); + } + List recordsRespVOS = BeanUtils.toBean(resultList, InvoiceRecordsRespVO.class); + return new PageResult<>(recordsRespVOS, pageResult.getTotal()); + } } diff --git a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/organamount/OrganAmountServiceImpl.java b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/organamount/OrganAmountServiceImpl.java index 7772d418e..7261806f5 100644 --- a/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/organamount/OrganAmountServiceImpl.java +++ b/cf-module-system/cf-module-system-biz/src/main/java/com/cf/imes/module/system/service/funds/organamount/OrganAmountServiceImpl.java @@ -72,7 +72,7 @@ public class OrganAmountServiceImpl implements OrganAmountService { int updated = organAmountMapper.update(new LambdaUpdateWrapperX() .eq(OrganAmountDO::getOrganId, organId) .eq(OrganAmountDO::getVersion, organAmountDO.getVersion()) - .set(OrganAmountDO::getGiftAmount, newGift) + .setIfPresent(OrganAmountDO::getGiftAmount, newGift) .set(OrganAmountDO::getAmount, newAmount) .set(OrganAmountDO::getVersion, organAmountDO.getVersion() + 1)); // 1. 首次更新失败,认为出现并发,再查一次再更新 @@ -84,7 +84,7 @@ public class OrganAmountServiceImpl implements OrganAmountService { updated = organAmountMapper.update(new LambdaUpdateWrapperX() .eq(OrganAmountDO::getOrganId, organId) .eq(OrganAmountDO::getVersion, organAmountDO.getVersion()) - .set(OrganAmountDO::getGiftAmount, newGift) + .setIfPresent(OrganAmountDO::getGiftAmount, newGift) .set(OrganAmountDO::getAmount, newAmount) .set(OrganAmountDO::getVersion, organAmountDO.getVersion() + 1)); // 2. 第二次更新失败,资金表可能不存在 diff --git a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/funds/purchase/PurchaseMapper.xml b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/funds/purchase/PurchaseMapper.xml index 9879dd996..cba3bdc7c 100644 --- a/cf-module-system/cf-module-system-biz/src/main/resources/mapper/funds/purchase/PurchaseMapper.xml +++ b/cf-module-system/cf-module-system-biz/src/main/resources/mapper/funds/purchase/PurchaseMapper.xml @@ -15,4 +15,13 @@ from purchase_record where organ_id = #{organId} + + \ No newline at end of file