新增组织申请开票、开票记录查询接口

This commit is contained in:
gaoqr
2025-08-25 16:33:08 +08:00
parent dad5871905
commit 085fb57a4d
14 changed files with 372 additions and 96 deletions
@@ -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_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 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 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 ============ //=========== 支付相关 1-002-048-000 ============
public static final ErrorCode PAY_CHANNEL_NOT_SUPPORT = new ErrorCode(1_002_048_000, "暂不支持的支付渠道,请使用其他支付渠道"); public static final ErrorCode PAY_CHANNEL_NOT_SUPPORT = new ErrorCode(1_002_048_000, "暂不支持的支付渠道,请使用其他支付渠道");
@@ -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.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.InvoiceAmountAndAvailablePageReqVO;
import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageRespVO; 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.controller.admin.funds.invoice.vo.InvoiceTitleReqVO;
import com.cf.imes.module.system.service.funds.invoice.InvoiceService; import com.cf.imes.module.system.service.funds.invoice.InvoiceService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@@ -45,6 +49,19 @@ public class InvoiceController {
@GetMapping("/available/info") @GetMapping("/available/info")
@Operation(summary = "获取组织的开票金额信息") @Operation(summary = "获取组织的开票金额信息")
public CommonResult<InvoiceAmountAndAvailablePageRespVO> getInvoiceAmountAndAvailablePage(@Valid InvoiceAmountAndAvailablePageReqVO pageReqVO) { public CommonResult<InvoiceAmountAndAvailablePageRespVO> getInvoiceAmountAndAvailablePage(@Valid InvoiceAmountAndAvailablePageReqVO pageReqVO) {
return success(invoiceService.getInvoiceAmount(pageReqVO)); return success(invoiceService.getInvoiceAmountAndAvailablePage(pageReqVO));
}
@PostMapping("")
@Operation(summary = "组织申请开票")
public CommonResult<Boolean> insetInvoiceRecords(@Valid @RequestBody InvoiceRecordsReqVO reqVO) {
invoiceService.applyInvoice(reqVO);
return success(Boolean.TRUE);
}
@GetMapping("/records")
@Operation(summary = "获取组织的开票记录")
public CommonResult<PageResult<InvoiceRecordsRespVO>> getInvoiceRecords(@Valid InvoiceDetailsPageReqVO pageReqVO) {
return success(invoiceService.getInvoiceRecords(pageReqVO));
} }
} }
@@ -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<Long> purchaseRecordId;
}
@@ -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;
}
@@ -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;
}
@@ -3,7 +3,9 @@ package com.cf.imes.module.system.controller.admin.pay.vo;
import com.cf.imes.module.system.validation.pay.PayChannelCodeValid; import com.cf.imes.module.system.validation.pay.PayChannelCodeValid;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.validation.constraints.DecimalMax;
import jakarta.validation.constraints.DecimalMin; import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import lombok.Data; import lombok.Data;
@@ -25,7 +27,9 @@ public class PayRechargeOrderReqVO {
@Schema(description = "支付金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") @Schema(description = "支付金额,单位:元", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
@NotNull(message = "支付金额不能为空") @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; private BigDecimal price;
@Schema(description = "支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "0") @Schema(description = "支付渠道编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
@@ -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;
}
@@ -43,18 +43,6 @@ public class PurchaseRecordDO extends BaseDO {
private Long organId; private Long organId;
/**
* 用户ID-发票申请人ID
*/
private Long InvoiceApplicantUserId;
/**
* 发票申请人名称
*/
private Long InvoiceApplicantUserName;
/** /**
* 产品ID * 产品ID
*/ */
@@ -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<InvoiceRecordsDO> {
default PageResult<InvoiceRecordsDO> selectInvoiceRecordsPage(InvoiceDetailsPageReqVO pageReqVO) {
return selectPage(pageReqVO, new LambdaQueryWrapperX<InvoiceRecordsDO>()
.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()));
}
}
@@ -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.dal.dataobject.funds.purchase.PurchaseRecordDO;
import com.cf.imes.module.system.enums.pay.InvoiceStatusEnum; import com.cf.imes.module.system.enums.pay.InvoiceStatusEnum;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
/** /**
* 购买记录 Mapper * 购买记录 Mapper
@@ -58,6 +60,7 @@ public interface PurchaseRecordMapper extends BaseMapperX<PurchaseRecordDO> {
.eq(PurchaseRecordDO::getOrganId, SecurityFrameworkUtils.getUserOrganId()) .eq(PurchaseRecordDO::getOrganId, SecurityFrameworkUtils.getUserOrganId())
.eq(PurchaseRecordDO::getDeleted, false) .eq(PurchaseRecordDO::getDeleted, false)
.in(PurchaseRecordDO::getIsInvocing, InvoiceStatusEnum.INVOICABLE.getStatus(), InvoiceStatusEnum.INVOICINGFAILED.getStatus()) .in(PurchaseRecordDO::getIsInvocing, InvoiceStatusEnum.INVOICABLE.getStatus(), InvoiceStatusEnum.INVOICINGFAILED.getStatus())
.orderByDesc(PurchaseRecordDO::getCreateTime)
); );
} }
@@ -68,4 +71,11 @@ public interface PurchaseRecordMapper extends BaseMapperX<PurchaseRecordDO> {
* @return * @return
*/ */
InvoiceAmountRespVO getOrgInvoiceAmountStatistics(Long organId); InvoiceAmountRespVO getOrgInvoiceAmountStatistics(Long organId);
/**
* 查询可开票的金额
*
* @param organId
*/
BigDecimal getInvoicableAmount(Long organId, @Param("ids") List<Long> ids);
} }
@@ -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.InvoiceAmountAndAvailablePageReqVO;
import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageRespVO; 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.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.controller.admin.funds.invoice.vo.InvoiceTitleReqVO;
/** /**
@@ -26,13 +27,20 @@ public interface InvoiceService {
* @param invoiceAmountAndAvailablePageReqVO * @param invoiceAmountAndAvailablePageReqVO
* @return * @return
*/ */
InvoiceAmountAndAvailablePageRespVO getInvoiceAmount(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO); InvoiceAmountAndAvailablePageRespVO getInvoiceAmountAndAvailablePage(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO);
/** /**
* 查询开票分页 * 组织申请发票
*
* @param reqVO
*/
void applyInvoice(InvoiceRecordsReqVO reqVO);
/**
* 查询组织开票记录
* *
* @param pageReqVO * @param pageReqVO
* @return * @return
*/ */
PageResult<InvoiceDetailsRespVO> getInvoiceDetails(InvoiceDetailsPageReqVO pageReqVO); PageResult<InvoiceRecordsRespVO> getInvoiceRecords(InvoiceDetailsPageReqVO pageReqVO);
} }
@@ -1,24 +1,43 @@
package com.cf.imes.module.system.service.funds.invoice; 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.pojo.PageResult;
import com.cf.imes.framework.common.util.Assert.AssertUtils; 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.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.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.InvoiceAmountAndAvailablePageReqVO;
import com.cf.imes.module.system.controller.admin.funds.invoice.vo.InvoiceAmountAndAvailablePageRespVO; 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.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.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.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.invoice.InvoiceTitleInfoMapper;
import com.cf.imes.module.system.dal.mysql.funds.purchase.PurchaseRecordMapper; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import jakarta.annotation.Resource; 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.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 @Resource
private PurchaseRecordMapper purchaseRecordMapper; private PurchaseRecordMapper purchaseRecordMapper;
@Resource
private InvoiceRecordsMapper invoiceRecordsMapper;
@Resource
private OrganService organService;
@Override @Override
public void insetInvoiceTitle(InvoiceTitleReqVO reqVO) { public void insetInvoiceTitle(InvoiceTitleReqVO reqVO) {
@@ -77,7 +101,7 @@ public class InvoiceServiceImpl implements InvoiceService {
} }
@Override @Override
public InvoiceAmountAndAvailablePageRespVO getInvoiceAmount(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO) { public InvoiceAmountAndAvailablePageRespVO getInvoiceAmountAndAvailablePage(InvoiceAmountAndAvailablePageReqVO invoiceAmountAndAvailablePageReqVO) {
InvoiceAmountAndAvailablePageRespVO invoiceAmountAndAvailablePageRespVO = new InvoiceAmountAndAvailablePageRespVO(); InvoiceAmountAndAvailablePageRespVO invoiceAmountAndAvailablePageRespVO = new InvoiceAmountAndAvailablePageRespVO();
// 开票金额 // 开票金额
invoiceAmountAndAvailablePageRespVO.setInvoiceAmountRespVO(purchaseRecordMapper.getOrgInvoiceAmountStatistics(SecurityFrameworkUtils.getUserOrganId())); invoiceAmountAndAvailablePageRespVO.setInvoiceAmountRespVO(purchaseRecordMapper.getOrgInvoiceAmountStatistics(SecurityFrameworkUtils.getUserOrganId()));
@@ -89,35 +113,59 @@ public class InvoiceServiceImpl implements InvoiceService {
} }
@Override @Override
public PageResult<InvoiceDetailsRespVO> getInvoiceDetails(InvoiceDetailsPageReqVO pageReqVO) { public void applyInvoice(InvoiceRecordsReqVO reqVO) {
// Long organId = SecurityFrameworkUtils.getUserOrganId();
// PageDTO<InvoiceDetailsRespVO> page = new PageDTO<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()); LoginUser loginUser = SecurityFrameworkUtils.getLoginUser();
// List<Long> purchaseRecordId = reqVO.getPurchaseRecordId();
// List<Integer> invoiceStatus = new ArrayList<>(); // 查询发票抬头
// invoiceStatus.add(InvoiceStatusEnum.INVOICABLE.getStatus()); InvoiceTitleInfoDO invoiceTitleInfoDO = invoiceTitleInfoMapper.selectOne(new LambdaQueryWrapper<InvoiceTitleInfoDO>()
// invoiceStatus.add(InvoiceStatusEnum.INVOICINGFAILED.getStatus()); .eq(InvoiceTitleInfoDO::getOrganId, organId));
//
// QueryWrapperX<IncomeExpenseDetailsDO> 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<InvoiceDetailsRespVO> respVOIPage = incomeExpenseDetailsMapper.selectOrganInvoicable(page, queryWrapperX);
//
// List<InvoiceDetailsRespVO> records = respVOIPage.getRecords();
// if (CollUtil.isEmpty(records)) {
// return new PageResult<>();
// }
//
// return new PageResult<>(records, respVOIPage.getTotal());
return null;
AssertUtils.notEmpty(invoiceTitleInfoDO, INVOICE_TITLE_NOT_EXISTS_ERROR);
// 查询可开票金额
BigDecimal invoicableAmount = purchaseRecordMapper.getInvoicableAmount(organId, purchaseRecordId);
// 更新购买记录表的发票状态
int update = purchaseRecordMapper.update(new LambdaUpdateWrapper<PurchaseRecordDO>()
.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<InvoiceRecordsRespVO> getInvoiceRecords(InvoiceDetailsPageReqVO pageReqVO) {
// 时间类型规范为开始0点,结束12点
pageReqVO.setCreateTime(LocalDateTimeUtils.generateTimeSection(pageReqVO.getCreateTime()));
pageReqVO.setInvoiceTime(LocalDateTimeUtils.generateTimeSection(pageReqVO.getInvoiceTime()));
// 分页查询
PageResult<InvoiceRecordsDO> pageResult = invoiceRecordsMapper.selectInvoiceRecordsPage(pageReqVO);
List<InvoiceRecordsDO> resultList = pageResult.getList();
if(CollUtil.isEmpty(resultList)){
return new PageResult<>();
}
List<InvoiceRecordsRespVO> recordsRespVOS = BeanUtils.toBean(resultList, InvoiceRecordsRespVO.class);
return new PageResult<>(recordsRespVOS, pageResult.getTotal());
}
} }
@@ -72,7 +72,7 @@ public class OrganAmountServiceImpl implements OrganAmountService {
int updated = organAmountMapper.update(new LambdaUpdateWrapperX<OrganAmountDO>() int updated = organAmountMapper.update(new LambdaUpdateWrapperX<OrganAmountDO>()
.eq(OrganAmountDO::getOrganId, organId) .eq(OrganAmountDO::getOrganId, organId)
.eq(OrganAmountDO::getVersion, organAmountDO.getVersion()) .eq(OrganAmountDO::getVersion, organAmountDO.getVersion())
.set(OrganAmountDO::getGiftAmount, newGift) .setIfPresent(OrganAmountDO::getGiftAmount, newGift)
.set(OrganAmountDO::getAmount, newAmount) .set(OrganAmountDO::getAmount, newAmount)
.set(OrganAmountDO::getVersion, organAmountDO.getVersion() + 1)); .set(OrganAmountDO::getVersion, organAmountDO.getVersion() + 1));
// 1. 首次更新失败,认为出现并发,再查一次再更新 // 1. 首次更新失败,认为出现并发,再查一次再更新
@@ -84,7 +84,7 @@ public class OrganAmountServiceImpl implements OrganAmountService {
updated = organAmountMapper.update(new LambdaUpdateWrapperX<OrganAmountDO>() updated = organAmountMapper.update(new LambdaUpdateWrapperX<OrganAmountDO>()
.eq(OrganAmountDO::getOrganId, organId) .eq(OrganAmountDO::getOrganId, organId)
.eq(OrganAmountDO::getVersion, organAmountDO.getVersion()) .eq(OrganAmountDO::getVersion, organAmountDO.getVersion())
.set(OrganAmountDO::getGiftAmount, newGift) .setIfPresent(OrganAmountDO::getGiftAmount, newGift)
.set(OrganAmountDO::getAmount, newAmount) .set(OrganAmountDO::getAmount, newAmount)
.set(OrganAmountDO::getVersion, organAmountDO.getVersion() + 1)); .set(OrganAmountDO::getVersion, organAmountDO.getVersion() + 1));
// 2. 第二次更新失败,资金表可能不存在 // 2. 第二次更新失败,资金表可能不存在
@@ -15,4 +15,13 @@
from purchase_record from purchase_record
where organ_id = #{organId} where organ_id = #{organId}
</select> </select>
<select id="getInvoicableAmount" resultType="java.math.BigDecimal">
select sum(account_balance_spent) from purchase_record
where organ_id = #{organId} and is_invocing = '${@com.cf.imes.module.system.enums.pay.InvoiceStatusEnum@INVOICABLE.status}'
and id in
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
</mapper> </mapper>