Commit 2a6e171a by zhangxingmin

push

parent e39120dc
......@@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.common.enums.ResultCode;
import com.yd.common.result.Result;
import com.yd.csf.api.dto.QueryCommissionExpectedByPageNewResponse;
import com.yd.csf.api.dto.QueryCommissionExpectedByPageResponse;
import com.yd.csf.api.dto.ReceivableReportResponse;
import com.yd.csf.service.common.ErrorCode;
......@@ -29,6 +30,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
......@@ -213,6 +215,40 @@ public class ApiCommissionExpectedController {
}
/**
* 应收款管理列表查询
*
* @param commissionExpectedQueryRequest
* @return
*/
@PostMapping("/queryCommissionExpectedByPage/new")
@Operation(summary = "应收款管理列表查询")
public Result<QueryCommissionExpectedByPageNewResponse> queryCommissionExpectedByPageNew(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest) {
long current = commissionExpectedQueryRequest.getPageNo();
long size = commissionExpectedQueryRequest.getPageSize();
// 查询列表数据
QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService.getQueryWrapper(commissionExpectedQueryRequest);
Page<CommissionExpected> commissionExpectedPage = commissionExpectedService.page(new Page<>(current, size),
queryWrapper);
// 查询统计数据
List<CommissionExpected> commissionExpectedList = commissionExpectedService.list(queryWrapper);
// 计算统计数据
List<Long> expectedIds = commissionExpectedList.stream().map(CommissionExpected::getId).collect(Collectors.toList());
CommissionExpectedStatisticsVO expectedStatisticsVO = commissionExpectedService.getExpectedStatistics(expectedIds);
CommissionExpectedStatisticsNewVO statisticsNewVO = null;
if (expectedStatisticsVO != null) {
statisticsNewVO = new CommissionExpectedStatisticsNewVO();
BeanUtils.copyProperties(expectedStatisticsVO,statisticsNewVO);
}
// 组装返回值
QueryCommissionExpectedByPageNewResponse response = new QueryCommissionExpectedByPageNewResponse();
response.setExpectedStatisticsVO(statisticsNewVO);
response.setPage(commissionExpectedService.getCommissionExpectedVONewPage(commissionExpectedPage));
return Result.success(response);
}
/**
* 应收款导出
*
* @param commissionExpectedQueryRequest
......
package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.service.vo.CommissionExpectedNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import com.yd.csf.service.vo.CommissionExpectedVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "查询预计来佣分页响应")
public class QueryCommissionExpectedByPageNewResponse {
@Schema(description = "预计来佣统计信息")
private CommissionExpectedStatisticsNewVO expectedStatisticsVO;
@Schema(description = "预计来佣分页列表")
private Page<CommissionExpectedNewVO> page;
}
......@@ -10,6 +10,7 @@ import com.yd.csf.service.dto.CommissionExpectedUpdateRequest;
import com.yd.csf.service.model.CommissionExpected;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.vo.CommissionExpectedNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import com.yd.csf.service.vo.CommissionExpectedVO;
import com.yd.csf.service.vo.ReceivableReportVO;
......@@ -27,6 +28,8 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
Page<CommissionExpectedVO> getCommissionExpectedVOPage(Page<CommissionExpected> commissionExpectedPage);
Page<CommissionExpectedNewVO> getCommissionExpectedVONewPage(Page<CommissionExpected> commissionExpectedPage);
/**
* 校验数据
*
......
......@@ -30,6 +30,7 @@ import com.yd.csf.service.service.*;
import com.yd.csf.service.dao.CommissionExpectedMapper;
import com.yd.csf.service.model.SpeciesCondition;
import com.yd.csf.service.helper.SpeciesConditionMatcher;
import com.yd.csf.service.vo.CommissionExpectedNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import com.yd.csf.service.vo.CommissionExpectedVO;
import com.yd.csf.service.vo.ReceivableReportVO;
......@@ -149,6 +150,169 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
return CommissionExpectedVOPage;
}
//要返回CommissionExpectedNewVO分页记录,现在有一张预计来用表和一张保单来用表。两张表通过commission_expected_biz_id关联,现在要做查询合并两个表结果集,
//预计来用表和保单来用表是1对多的关系,现在想合并两个结果集合,预计来用的主记录在上面下面紧跟着保单来用记录。
//getCommissionExpectedVOPage是之前查询预计来用表记录的逻辑,pageByCommissionexpectedBizId是查询之前保单来用表的逻辑,可以参考这两个逻辑合并写到getCommissionExpectedVONewPage中
//返回记录里面 来佣类型:1-预计(预计来佣表记录) 2-实际(保单来佣表记录)
//
@Override
public Page<CommissionExpectedNewVO> getCommissionExpectedVONewPage(Page<CommissionExpected> commissionExpectedPage) {
List<CommissionExpected> commissionExpectedList = commissionExpectedPage.getRecords();
Page<CommissionExpectedNewVO> resultPage = new Page<>(
commissionExpectedPage.getCurrent(),
commissionExpectedPage.getSize(),
commissionExpectedPage.getTotal()
);
if (CollUtil.isEmpty(commissionExpectedList)) {
return resultPage;
}
// 1. 批量查询实际来佣记录(按预计来佣业务ID分组)
List<String> expectedBizIdList = commissionExpectedList.stream()
.map(CommissionExpected::getCommissionExpectedBizId)
.collect(Collectors.toList());
List<Commission> allCommissions = commissionService.lambdaQuery()
.in(Commission::getCommissionExpectedBizId, expectedBizIdList)
.orderByAsc(Commission::getCreateTime) // 按创建时间升序,保证从记录顺序
.list();
Map<String, List<Commission>> commissionMap = allCommissions.stream()
.collect(Collectors.groupingBy(Commission::getCommissionExpectedBizId));
// 2. 批量查询保单信息(用于填充产品名、保险公司名等)
Set<String> policyNoSet = new HashSet<>();
commissionExpectedList.forEach(e -> policyNoSet.add(e.getPolicyNo()));
allCommissions.forEach(c -> policyNoSet.add(c.getPolicyNo()));
policyNoSet.remove(null);
Map<String, Policy> policyMap = new HashMap<>();
Map<String, PolicyFollow> policyFollowMap = new HashMap<>();
if (CollUtil.isNotEmpty(policyNoSet)) {
List<Policy> policyList = policyService.lambdaQuery()
.in(Policy::getPolicyNo, policyNoSet)
.list();
policyMap = policyList.stream()
.collect(Collectors.toMap(Policy::getPolicyNo, Function.identity(), (v1, v2) -> v1));
List<PolicyFollow> policyFollowList = policyFollowService.lambdaQuery()
.in(PolicyFollow::getPolicyNo, policyNoSet)
.list();
policyFollowMap = policyFollowList.stream()
.collect(Collectors.toMap(PolicyFollow::getPolicyNo, Function.identity(), (v1, v2) -> v1));
}
// 3. 构建混合结果列表
List<CommissionExpectedNewVO> mixedRecords = new ArrayList<>();
for (CommissionExpected expected : commissionExpectedList) {
// 3.1 构建主记录(预计来佣)
CommissionExpectedNewVO mainVo = buildMainVo(expected, policyMap, policyFollowMap);
mixedRecords.add(mainVo);
// 3.2 构建从记录(实际来佣)
List<Commission> commissions = commissionMap.getOrDefault(expected.getCommissionExpectedBizId(), Collections.emptyList());
int subIndex = 1;
for (Commission commission : commissions) {
CommissionExpectedNewVO subVo = buildSubVo(commission, policyMap, policyFollowMap, mainVo);
// 编号:主编号-序号
subVo.setNo(mainVo.getNo() + "-" + subIndex);
subVo.setType(2);
mixedRecords.add(subVo);
subIndex++;
}
}
resultPage.setRecords(mixedRecords);
return resultPage;
}
/**
* 构建主记录(预计来佣,type=1)
*/
private CommissionExpectedNewVO buildMainVo(CommissionExpected expected,
Map<String, Policy> policyMap,
Map<String, PolicyFollow> policyFollowMap) {
CommissionExpectedNewVO vo = new CommissionExpectedNewVO();
BeanUtils.copyProperties(expected, vo);
vo.setType(1);
// 主记录编号:可使用应收账款编号,若为空则用业务ID
vo.setNo(StringUtils.isNotBlank(expected.getReceivableNo()) ? expected.getReceivableNo() : expected.getCommissionExpectedBizId());
// 填充保单相关公共字段
Policy policy = policyMap.get(expected.getPolicyNo());
if (policy != null) {
vo.setPremium(policy.getPaymentPremium());
vo.setPolicyCurrency(policy.getCurrency());
vo.setInsuranceCompany(policy.getInsuranceCompany());
vo.setReconciliationCompany(policy.getReconciliationCompany());
}
PolicyFollow policyFollow = policyFollowMap.get(expected.getPolicyNo());
if (policyFollow != null) {
vo.setProductName(policyFollow.getProductName());
vo.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
}
// 计算待入账比例/金额等
BigDecimal paidAmount = ObjectUtils.defaultIfNull(expected.getPaidAmount(), BigDecimal.ZERO);
BigDecimal paidRatio = ObjectUtils.defaultIfNull(expected.getPaidRatio(), BigDecimal.ZERO);
if (expected.getCommissionRatio() != null) {
vo.setPaidRatio(paidRatio);
vo.setPendingRatio(expected.getCommissionRatio().subtract(paidRatio));
if (expected.getExpectedAmount() != null) {
vo.setPaidAmount(paidAmount);
vo.setPendingAmount(expected.getExpectedAmount().subtract(paidAmount));
}
} else {
vo.setPaidAmount(paidAmount);
if (expected.getAmount() != null) {
vo.setPendingAmount(expected.getAmount().subtract(paidAmount));
}
}
return vo;
}
/**
* 构建从记录(实际来佣,type=2)
* 公共字段从主记录复制,实际特有字段使用 commission 数据覆盖
*/
private CommissionExpectedNewVO buildSubVo(Commission commission,
Map<String, Policy> policyMap,
Map<String, PolicyFollow> policyFollowMap,
CommissionExpectedNewVO mainVo) {
// 1. 从主记录复制所有公共字段(避免重复查询保单信息)
CommissionExpectedNewVO vo = new CommissionExpectedNewVO();
BeanUtils.copyProperties(mainVo, vo, "type", "no",
"realReconciliationYearMonth", "realCommissionDate", "realExchangeRate",
"realAmount", "realCurrentCommissionRatio", "realUpdateTime", "realUpdaterName");
// 2. 覆盖实际记录自己的业务字段(从 commission 获取)
// 检核年月、日期、汇率、金额、比例等
vo.setRealReconciliationYearMonth(commission.getReconciliationYearMonth());
vo.setRealCommissionDate(commission.getCommissionDate());
vo.setRealExchangeRate(commission.getExchangeRate());
vo.setRealAmount(commission.getAmount());
vo.setRealCurrentCommissionRatio(commission.getCurrentCommissionRatio());
vo.setRealUpdateTime(commission.getUpdateTime());
vo.setRealUpdaterName(commission.getUpdaterId()); // 如有用户服务可查名称
// 同时覆盖公共字段中的金额、日期、汇率等,以便前端直接展示实际值
vo.setAmount(commission.getAmount());
vo.setCommissionDate(commission.getCommissionDate());
vo.setExchangeRate(commission.getExchangeRate());
vo.setCurrentCommissionRatio(commission.getCurrentCommissionRatio()); // 实际入账比例
// 如果实际记录有更准确的期数、名称等,也一并覆盖(实际表中这些字段应与预计一致,但以防万一)
vo.setCommissionPeriod(commission.getCommissionPeriod());
vo.setCommissionName(commission.getCommissionName());
vo.setCommissionType(commission.getCommissionType());
vo.setCurrency(commission.getCurrency());
vo.setRemark(commission.getRemark());
// 保单号以实际记录为准
vo.setPolicyNo(commission.getPolicyNo());
// 3. 其他展示字段(产品名、保险公司等)已从主记录复制,无需额外处理
return vo;
}
private void enrichReceivableReportWithCompanyName(IPage<CommissionExpectedVO> page) {
if (page == null || CollectionUtils.isEmpty(page.getRecords())) {
return;
......
package com.yd.csf.service.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@Schema(description = "预计来佣响应")
public class CommissionExpectedNewVO implements Serializable {
//===========公共字段=============
//来佣类型:1-预计(预计来佣表记录) 2-实际(保单来佣表记录)
private Integer type;
/**
* 编号 规则: 预计来佣表记录作为主记录,保单来佣表记录作为从记录,主记录比如生产编号为A267897 从记录第一条为A267897-1 第二条为A267897-2
*/
private String no;
//===========以下是预计来佣表记录=============
/**
* 预计来佣id
*/
@Schema(description = "预计来佣id")
private Long id;
/**
* 预计来佣业务id
*/
@Schema(description = "预计来佣业务id")
private String commissionExpectedBizId;
/**
* 应收账款编号
*/
@Schema(description = "应收账款编号")
private String receivableNo;
/**
* 应收款类型 R=关联保单应收单 U=非关联保单应收单
*/
@Schema(description = "应收款类型 R=关联保单应收单 U=非关联保单应收单")
private String commissionBizType;
/**
* 保单号
*/
@Schema(description = "保单号")
private String policyNo;
/**
* 期交保费
*/
@Schema(description = "期交保费")
private Object premium;
/**
* 保单币种
*/
@Schema(description = "保单币种")
private String policyCurrency;
/**
* 产品计划名称
*/
@Schema(description = "产品计划名称")
private String productName;
/**
* 保险公司业务ID
*/
@Schema(description = "保险公司业务ID")
private String insuranceCompanyBizId;
/**
* 保险公司
*/
@Schema(description = "保险公司")
private String insuranceCompany;
/**
* 产品上架信息表唯一业务ID
*/
@Schema(description = "产品计划: 产品上架信息表唯一业务ID")
private String productLaunchBizId;
/**
* 对账公司
*/
@Schema(description = "对账公司")
private String reconciliationCompany;
/**
* 对账公司业务ID
*/
@Schema(description = "对账公司业务ID")
private String reconciliationCompanyBizId;
/**
* 佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)")
private Integer commissionPeriod;
/**
* 总来佣期数
*/
@Schema(description = "总来佣期数")
private Integer totalPeriod;
/**
* 来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
@Schema(description = "来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)")
private String commissionName;
/**
* 来佣类型(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
@Schema(description = "来佣类型(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)")
private String commissionType;
/**
* 预计入账比例 (%)
*/
@Schema(description = "预计入账比例 (%)")
private BigDecimal commissionRatio;
/**
* 预计入账金额
*/
@Schema(description = "预计入账金额 HKD(如果不关联保单,就没有预计入账比例,此时记录预计入账金额)")
private BigDecimal amount;
/**
* 来佣币种
*/
@Schema(description = "来佣币种")
private String currency;
/**
* 预计来佣日期
*/
@Schema(description = "预计来佣日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDate;
/**
* 入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效
*/
@Schema(description = "入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效 字典值: csf_expected_commission_status")
private String status;
/**
* 设置入账状态-修改理由
*/
@Schema(description = "设置入账状态-修改理由")
private String statusDesc;
/**
* 预计入账金额(HKD)
*/
@Schema(description = "预计入账金额(HKD)")
private BigDecimal expectedAmount;
/**
* 结算汇率(估)
*/
@Schema(description = "结算汇率(估)")
private BigDecimal defaultExchangeRate;
/**
* 已入账来佣金额(HKD)
*/
@Schema(description = "已入账来佣金额(HKD)")
private BigDecimal paidAmount;
/**
* 已入账来佣比例 (%)
*/
@Schema(description = "已入账来佣比例 (%)")
private BigDecimal paidRatio;
/**
* 待入账金额
*/
@Schema(description = "待入账金额")
private BigDecimal pendingAmount;
/**
* 待入账比例
*/
@Schema(description = "待入账比例")
private BigDecimal pendingRatio;
/**
* 已入账来佣列表
*/
@Schema(description = "已入账来佣列表")
private List<Commission> commissionList;
/**
* 通用备注
*/
@Schema(description = "备注")
private String remark;
/**
* 创建人ID
*/
@Schema(description = "创建人ID")
private String creatorId;
/**
* 更新人ID
*/
@Schema(description = "更新人ID")
private String updaterId;
/**
* 创建时间
*/
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 更新时间
*/
@Schema(description = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
//===========以下是入账检核(保单来佣)记录=============
/**
* 入账检核记录-入账检核年月 yyyy-MM
*/
@Schema(description = "入账检核年月 yyyy-MM")
private String realReconciliationYearMonth;
/**
* 入账检核记录-来佣日期(入账日实)
*/
@Schema(description = "来佣日期(入账日实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date realCommissionDate;
/**
* 入账检核记录-当前结算汇率(结算汇率(实))
*/
@Schema(description = "当前结算汇率")
private BigDecimal realExchangeRate;
/**
* 来佣金额(入账金额)
*/
@Schema(description = "来佣金额")
private BigDecimal realAmount;
/**
* 当前来佣比例 (实佣率=实际入账金额/结算汇率/每期保费)(入账比例)
*/
@Schema(description = "当前来佣比例 (实佣率=实际入账金额/结算汇率/每期保费)")
private BigDecimal realCurrentCommissionRatio;
/**
* 更新人ID
*/
private String realUpdaterName;
/**
* 更新时间
*/
@Schema(description = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date realUpdateTime;
private static final long serialVersionUID = 1L;
/**
* 对象转封装类
*
* @param commissionExpected
* @return
*/
public static CommissionExpectedNewVO objToVo(CommissionExpected commissionExpected) {
if (commissionExpected == null) {
return null;
}
CommissionExpectedNewVO commissionVO = new CommissionExpectedNewVO();
BeanUtils.copyProperties(commissionExpected, commissionVO);
BigDecimal paidAmount1 = ObjectUtils.defaultIfNull(commissionExpected.getPaidAmount(), BigDecimal.ZERO);
BigDecimal paidRatio1 = ObjectUtils.defaultIfNull(commissionExpected.getPaidRatio(), BigDecimal.ZERO);
// 待入账比例、待入账金额
if (commissionExpected.getCommissionRatio() != null) {
commissionVO.setPaidRatio(paidRatio1);
commissionVO.setPendingRatio(commissionExpected.getCommissionRatio().subtract(paidRatio1));
if (commissionExpected.getExpectedAmount() != null) {
commissionVO.setPaidAmount(paidAmount1);
commissionVO.setPendingAmount(commissionExpected.getExpectedAmount().subtract(paidAmount1));
}
return commissionVO;
} else {
commissionVO.setPaidAmount(paidAmount1);
commissionVO.setPendingAmount(commissionExpected.getAmount().subtract(paidAmount1));
return commissionVO;
}
}
}
package com.yd.csf.service.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* 应收款管理统计VO
*/
@Data
public class CommissionExpectedStatisticsNewVO {
/**
* 预计入账金额(HKD)
*/
@Schema(description = "预计入账金额(HKD)")
private BigDecimal totalAmount;
/**
* 已入账金额(HKD)
*/
@Schema(description = "已入账金额(HKD)")
private BigDecimal totalPaidAmount;
/**
* 待入账金额(HKD)
*/
@Schema(description = "待入账金额(HKD)")
private BigDecimal pendingPaidAmount;
/**
* 已入账比例 %(已入账金额/总金额)
*/
@Schema(description = "已入账比例 %(已入账金额/总金额)")
private BigDecimal paidAmountRatio;
/**
* 总保单数
*/
@Schema(description = "总保单数")
private Integer totalPolicyCount;
/**
* 总保费(HKD)
*/
@Schema(description = "总保费(HKD)")
private BigDecimal totalPremium;
@JsonIgnore
private String policyNos;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment