Commit c7598e16 by jianan

应收管理、应付管理1

parent 477ad0a9
......@@ -12,6 +12,7 @@ import com.yd.common.result.Result;
import com.yd.csf.api.dto.CommissionExcelDTO;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.CommissionStatusEnum;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionCompareRecord;
import com.yd.csf.service.model.CommissionEditRecord;
......@@ -80,6 +81,15 @@ public class ApiCommissionController {
} catch (IOException e) {
throw new RuntimeException("Excel读取失败", e);
}
// 根据来佣检核年月查询是否已存在来佣记录
List<Commission> existingCommissions = commissionService.list(new QueryWrapper<Commission>()
.eq("reconciliation_year_month", dataList.get(0).getReconciliationYearMonth()));
boolean isAllCompareSuccess = existingCommissions.stream()
.allMatch(commission -> commission.getStatus().equals(CommissionStatusEnum.COMPARE_SUCCESS.getItemValue()));
if (isAllCompareSuccess) {
// 所有来佣记录都已检核成功,不允许上传新记录
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "当前来佣检核年月所有记录都已检核成功,不允许上传新记录,若需更新请手动操作");
}
// 数据校验
validateCommissionUpload(dataList);
......@@ -88,6 +98,10 @@ public class ApiCommissionController {
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
// 先删除已存在的来佣记录
commissionService.remove(new LambdaQueryWrapper<Commission>()
.eq(Commission::getReconciliationYearMonth, dataList.get(0).getReconciliationYearMonth()));
// 数据处理
List<Commission> entities = processData(dataList, loginUserId);
......@@ -120,6 +134,10 @@ public class ApiCommissionController {
}
StringBuilder errorMsg = new StringBuilder();
for (CommissionExcelDTO excelDTO : dataList) {
// 校验入账检核年月是否为空
if (StringUtils.isBlank(excelDTO.getReconciliationYearMonth())) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行入账检核年月不能为空");
}
// 校验必填字段是否为空
if (StringUtils.isBlank(excelDTO.getPolicyNo()) ||
StringUtils.isBlank(excelDTO.getReconciliationCompany()) ||
......@@ -133,6 +151,10 @@ public class ApiCommissionController {
if (excelDTO.getAmount().compareTo(BigDecimal.ZERO) <= 0) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行来佣金额必须为正数");
}
// 如果没有保单号,应收账款编号不能为空
if (StringUtils.isBlank(excelDTO.getPolicyNo()) && StringUtils.isBlank(excelDTO.getReceivableNo())) {
errorMsg.append("第").append(dataList.indexOf(excelDTO) + 1).append("行无保单号时应收账款编号不能为空");
}
}
if (errorMsg.length() > 0) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), errorMsg.toString());
......@@ -157,19 +179,19 @@ public class ApiCommissionController {
}
/**
* 生成可出账(发佣)记录,支持手动复选框选择
* 生成实际出账(发佣)记录
*
* @param generateFortuneRequest
* @param request
* @return
*/
@PostMapping("/generate/fortune")
@Operation(summary = "生成可出账(发佣)记录,支持手动复选框选择")
@Operation(summary = "生成实际出账(发佣)记录")
public Result<Boolean> generateFortune(@RequestBody GenerateFortuneRequest generateFortuneRequest,
HttpServletRequest request) {
List<String> commissionBizIdList = generateFortuneRequest.getCommissionBizIdList();
if (CollectionUtils.isEmpty(commissionBizIdList)) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "commissionBizIdList不能为空");
if (CollectionUtils.isEmpty(commissionBizIdList) || CollectionUtils.isEmpty(generateFortuneRequest.getExpectedFortuneIdList())) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), ResultCode.PARAMS_ERROR.getMessage());
}
return Result.success(commissionService.generateFortune(generateFortuneRequest));
}
......@@ -191,6 +213,22 @@ public class ApiCommissionController {
}
/**
* 批量新增保单来佣
*
* @param customerAddRequestList
* @param request
* @return
*/
@Operation(summary = "批量新增保单来佣")
@PostMapping("/addBatch")
public Result<Boolean> addCommissionBatch(@RequestBody List<CommissionAddRequest> customerAddRequestList, HttpServletRequest request) {
if (CollectionUtils.isEmpty(customerAddRequestList)) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), "来佣数据不能为空");
}
return Result.success(commissionService.addCommissionBatch(customerAddRequestList));
}
/**
* 来佣比对记录列表
*/
@PostMapping("/compare/records")
......
......@@ -8,15 +8,14 @@ import com.yd.csf.api.dto.ApiExpectedFortuneLogDto;
import com.yd.csf.api.service.ApiExpectedFortuneLogService;
import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.feign.client.expectedfortune.ApiExpectedFortuneFeignClient;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.request.expectedfortune.ExpectedFortuneStatisticsRequest;
import com.yd.csf.feign.request.expectedfortune.*;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.feign.response.expectedfortune.ApiGenerateExpectedFortuneResponse;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
......@@ -24,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
/**
* 预计发佣信息
*
......@@ -75,17 +76,28 @@ public class ApiExpectedFortuneController implements ApiExpectedFortuneFeignClie
}
/**
* 分页查询 - 应付款管理列表(预计发佣列表)
* 分页查询 - 预计发佣
* @param request
* @return
*/
@Override
@Operation(summary = "分页查询 - 应付款管理列表(预计发佣列表)")
@Operation(summary = "分页查询 - 预计发佣")
public Result<IPage<ApiExpectedFortunePageResponse>> page(ApiExpectedFortunePageRequest request) {
return apiExpectedFortuneService.page(request);
}
/**
* 分页查询 - 应付款管理列表(预计发佣列表)
* @param request
* @return
*/
@PostMapping("/list")
@Operation(summary = "分页查询 - 应付款管理列表(预计发佣列表)")
public Result<Map<String, Object>> list(@RequestBody ApiExpectedFortunePageRequest request) {
return apiExpectedFortuneService.list(request);
}
/**
* 计算统计数据 预计发佣金额 HKD、已出账金额 HKD、待出账金额 HKD、总保单数、总保费 HKD
*/
@PostMapping("/statistics")
......@@ -98,6 +110,36 @@ public class ApiExpectedFortuneController implements ApiExpectedFortuneFeignClie
}
/**
* 新增应付账款,可批量
*
* @param request
* @return
*/
@PostMapping("/add")
@Operation(summary = "新增应付账款,可批量")
public Result<Boolean> add(@RequestBody ExpectedFortuneAddRequest request) {
if (request == null || CollectionUtils.isEmpty(request.getAddList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "新增应付账款列表不能为空");
}
return Result.success(apiExpectedFortuneService.add(request));
}
/**
* 修改出账
*
* @param request
* @return
*/
@PostMapping("/update")
@Operation(summary = "更新保单发佣信息")
public Result<Boolean> update(@RequestBody ExpectedFortuneUpdateRequest request) {
if (request == null || request.getExpectedFortuneBizId() == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
}
return Result.success(apiExpectedFortuneService.update(request));
}
/**
* 查询保单是否生成过预计发佣
* @param policyNo
* @return
......
......@@ -465,7 +465,7 @@ public class ApiFortuneController {
// 查询条件
Wrapper<Fortune> queryWrapper = fortuneService.getQueryWrapper(fortuneQueryRequest);
// 分页查询
// todo 关联预计发佣查询列表
Page<Fortune> fortunePage = fortuneService.page(new Page<>(current, size),
queryWrapper);
......
......@@ -14,6 +14,12 @@ import java.util.Date;
@Data
public class CommissionExcelDTO {
@ExcelProperty("入账检核年月")
private String reconciliationYearMonth;
@ExcelProperty("应收账款编号")
private String receivableNo;
@ExcelProperty("保单号")
private String policyNo;
......@@ -53,6 +59,8 @@ public class CommissionExcelDTO {
public static Commission convertToEntity(CommissionExcelDTO data, String loginUserId) {
Commission entity = new Commission();
// 字段映射
entity.setReconciliationYearMonth(data.getReconciliationYearMonth());
entity.setReceivableNo(data.getReceivableNo());
entity.setPolicyNo(data.getPolicyNo());
entity.setPremium(data.getPremium());
entity.setCommissionBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_COMMISSION.getCode()));
......
......@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.common.result.Result;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.feign.request.expectedfortune.ExpectedFortuneAddRequest;
import com.yd.csf.feign.request.expectedfortune.ExpectedFortuneUpdateRequest;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.feign.response.expectedfortune.ApiGenerateExpectedFortuneResponse;
import com.yd.csf.service.dto.QueryPolicyAndBrokerDto;
......@@ -12,6 +14,7 @@ import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import org.springframework.scheduling.annotation.Async;
import java.util.List;
import java.util.Map;
public interface ApiExpectedFortuneService {
Result<ApiGenerateExpectedFortuneResponse> generate(ApiGenerateExpectedFortuneRequest request);
......@@ -28,4 +31,10 @@ public interface ApiExpectedFortuneService {
Result batchDelByPolicyNo(String policyNo);
ExpectedFortuneStatisticsVO getStatistics(List<Long> expectedFortuneIds);
Boolean update(ExpectedFortuneUpdateRequest request);
Result<Map<String, Object>> list(ApiExpectedFortunePageRequest request);
Boolean add(ExpectedFortuneAddRequest request);
}
......@@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Data
public class ApiExpectedFortunePageRequest extends PageDto {
......@@ -20,27 +21,33 @@ public class ApiExpectedFortunePageRequest extends PageDto {
@Schema(description = "预估发佣结束日期")
private LocalDate payoutDateEnd;
@Schema(description = "发佣状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效")
private String status;
@Schema(description = "出账状态, 可多选 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效")
private List<String> statusList;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)")
@Schema(description = "出账期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)")
private Integer fortunePeriod;
@Schema(description = "发佣名称")
@Schema(description = "出账项目")
private String fortuneName;
@Schema(description = "出单团队")
@Schema(description = "出单团队名称")
private String team;
@Schema(description = "出单团队业务ID")
private String teamBizId;
@Schema(description = "保险公司")
private String insuranceCompany;
@Schema(description = "产品名称")
private String productName;
@Schema(description = "产品计划:产品上架信息业务ID")
private String productLaunchBizId;
/**
* 转介人名称
*/
......@@ -50,4 +57,6 @@ public class ApiExpectedFortunePageRequest extends PageDto {
@Schema(description = "签单员名称")
private String signer;
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
private String fortuneBizType;
}
package com.yd.csf.feign.request.expectedfortune;
import lombok.Data;
import java.util.List;
@Data
public class ExpectedFortuneAddRequest {
private List<ExpectedFortuneDto> addList;
}
package com.yd.csf.feign.request.expectedfortune;
import com.yd.csf.feign.response.expectedfortune.PolicyInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
public class ExpectedFortuneDto {
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
private String fortuneBizType;
/**
* 保单号
*/
@Schema(description = "policy no")
private String policyNo;
/**
* 产品上架信息业务ID
*/
@Schema(description = "产品上架信息业务ID")
private String productLaunchBizId;
/**
* 保单信息
*/
@Schema(description = "policy info")
private PolicyInfo policy;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "fortune period")
private Integer fortunePeriod;
/**
* 发佣总期数
*/
@Schema(description = "fortune total period")
private Integer fortuneTotalPeriod;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
private String broker;
/**
* 转介人业务ID
*/
@Schema(description = "broker biz id")
private String brokerBizId;
/**
* 团队名称
*/
@Schema(description = "团队名称")
private String team;
/**
* 所属团队业务ID
*/
@Schema(description = "所属团队 biz id")
private String teamBizId;
/**
* 发佣名称
*/
@Schema(description = "发佣名称")
private String fortuneName;
/**
* 发佣类型
*/
@Schema(description = "发佣类型")
private String fortuneType;
/**
* 预计应发金额
*/
@Schema(description = "预计应发金额")
private BigDecimal amount;
/**
* 发佣币种
*/
@Schema(description = "发佣币种")
private String currency;
/**
* 发佣状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效
*/
@Schema(description = "发佣状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效")
private String status;
/**
* 预计发佣日期
*/
@Schema(description = "预计发佣日期")
private LocalDate payoutDate;
/**
* 已出账金额
*/
@Schema(description = "已出账金额")
private BigDecimal paidAmount;
/**
* 待出账金额
*/
@Schema(description = "待出账金额")
private BigDecimal unpaidAmount;
/**
* 发佣比例 已发佣金额/应发佣金额
*/
@Schema(description = "发佣比例 已发佣金额/应发佣金额")
private BigDecimal paidRatio;
/**
* 基本法项目配置表唯一业务ID
*/
@Schema(description = "rule item biz id")
private String ruleItemBizId;
/**
* 创建时间
*/
@Schema(description = "create time")
private LocalDateTime createTime;
}
package com.yd.csf.feign.request.expectedfortune;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ExpectedFortuneUpdateRequest {
/**
* 预计发佣业务id
*/
@Schema(description = "预计发佣业务id")
private String expectedFortuneBizId;
/**
* 出账状态
*/
@Schema(description = "出账状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效, 字典值: csf_fortune_status")
private String status;
/**
* 当前出账金额
*/
@Schema(description = "当前出账金额")
private BigDecimal currentPaymentAmount;
/**
* 币种
*/
@Schema(description = "币种")
private String currency;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
}
......@@ -22,12 +22,30 @@ public class ApiExpectedFortunePageResponse {
private String expectedFortuneBizId;
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
private String fortuneBizType;
/**
* 保单号
*/
@Schema(description = "policy no")
private String policyNo;
/**
* 产品上架信息业务ID
*/
@Schema(description = "产品上架信息业务ID")
private String productLaunchBizId;
/**
* 保单信息
*/
@Schema(description = "policy info")
private PolicyInfo policy;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "fortune period")
......
package com.yd.csf.feign.response.expectedfortune;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class PolicyInfo {
/**
* policy id
*/
@Schema(description = "policy id")
private Long id;
/**
* 保单业务ID
*/
@Schema(description = "保单业务ID")
private String policyBizId;
/**
* 保单号
*/
@Schema(description = "保单号")
private String policyNo;
/**
* 用户业务id
*/
@Schema(description = "用户业务id")
private String userBizId;
/**
* 产品代码
*/
@Schema(description = "产品代码")
private String productCode;
/**
* 产品名称
*/
@Schema(description = "产品名称")
private String productName;
/**
* 产品类别
*/
@Schema(description = "产品类别")
private String productCate;
/**
* 保险公司
*/
@Schema(description = "保险公司")
private String insurer;
/**
* 保险公司业务id
*/
@Schema(description = "保险公司业务id")
private String insurerBizId;
/**
* 保單持有人
*/
@Schema(description = "保單持有人")
private String policyHolder;
/**
* 受保人
*/
@Schema(description = "受保人")
private String insured;
/**
* 供款年期
*/
@Schema(description = "供款年期")
private Integer paymentTerm;
/**
* 期交保费
*/
@Schema(description = "期交保费")
private BigDecimal paymentPremium;
/**
* 每期保费
*/
@Schema(description = "每期保费")
private BigDecimal eachIssuePremium;
/**
* 保单状态
*/
@Schema(description = "保单状态 生效中,保单失效,期满终止,已转出,退保,被拒保,取消申请 字典值:csf_policy_status")
private String status;
/**
* 保单币种
*/
@Schema(description = "保单币种")
private String currency;
/**
* 首期保费(不含徽费,预缴保费)
*/
@Schema(description = "首期保费(不含徽费,预缴保费)")
private Integer initialPremium;
/**
* 签单日期
*/
@Schema(description = "签单日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date signDate;
/**
* 缮发日期
*/
@Schema(description = "缮发日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date issueDate;
/**
* 生效日期
*/
@Schema(description = "生效日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date effectiveDate;
/**
* 续保日期
*/
@Schema(description = "续保日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date renewalDate;
/**
* 是否预缴: 0-否, 1-是
*/
@Schema(description = "是否预缴: 0-否, 1-是")
private Integer isPrepaid;
/**
* 是否预缴: 0-否, 1-是
*/
@Schema(description = "是否预缴: 0-否, 1-是")
private Integer isPrepay;
/**
* 预缴年期
*/
@Schema(description = "预缴年期")
private Integer prepaidTerm;
/**
* 对账公司
*/
@Schema(description = "对账公司")
private String reconciliationCompany;
/**
* 对账公司业务id
*/
@Schema(description = "对账公司业务id")
private String reconciliationCompanyBizId;
/**
* 通用备注
*/
@Schema(description = "通用备注")
private String remark;
}
......@@ -21,6 +21,12 @@ public class CommissionExpectedAddDto {
private String policyBizId;
/**
* 应收款类型 R=关联保单应收单 U=非关联保单应收单
*/
@Schema(description = "应收款类型 R=关联保单应收单 U=非关联保单应收单", requiredMode = Schema.RequiredMode.REQUIRED)
private String commissionBizType;
/**
* 保单号
*/
@Schema(description = "保单号")
......@@ -33,6 +39,12 @@ public class CommissionExpectedAddDto {
private String reconciliationCompany;
/**
* 对账公司编码
*/
@Schema(description = "对账公司编码")
private String reconciliationCompanyCode;
/**
* 对账公司业务id
*/
@Schema(description = "对账公司业务id")
......@@ -75,6 +87,12 @@ public class CommissionExpectedAddDto {
private String currency;
/**
* 来佣金额
*/
@Schema(description = "来佣金额")
private BigDecimal amount;
/**
* 来佣日期
*/
@Schema(description = "来佣日期 format:yyyy-MM-dd")
......
package com.yd.csf.service.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class CommissionExpectedQueryRequest extends PageDto {
......@@ -15,14 +17,64 @@ public class CommissionExpectedQueryRequest extends PageDto {
private String policyNo;
/**
* 来佣状态 0=待来佣 1=已来佣 2=部分来佣
* 入账状态 0=待来佣 1=已来佣 2=部分来佣
*/
@Schema(description = "来佣状态 0=待来佣 1=已来佣 2=部分来佣")
private String status;
@Schema(description = "入账状态 0=待来佣 1=已来佣 2=部分来佣 可多选")
private List<String> statusList;
/**
* 预计来佣日期 格式:yyyy-MM-dd 查询该日期及之前的预计来佣记录
* 预计来佣日期开始 格式:yyyy-MM-dd
*/
@Schema(description = "预计来佣日期 格式:yyyy-MM-dd 查询该日期及之前的预计来佣记录")
private Date commissionDate;
@Schema(description = "预计来佣日期开始 格式:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDateStart;
/**
* 预计来佣日期结束 格式:yyyy-MM-dd
*/
@Schema(description = "预计来佣日期结束 格式:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDateEnd;
/**
* 预计来佣期数
*/
@Schema(description = "预计来佣期数")
private Integer commissionPeriod;
/**
* 来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
@Schema(description = "来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)")
private String commissionName;
/**
* 对账公司
*/
@Schema(description = "对账公司")
private String reconciliationCompany;
/**
* 保险公司业务ID
*/
@Schema(description = "保险公司业务ID")
private String insurerBizId;
/**
* 产品上架信息表唯一业务ID
*/
@Schema(description = "产品计划: 产品上架信息表唯一业务ID")
private String productLaunchBizId;
/**
* 应收款类型 1=关联保单应收单 2=非关联保单应收单
*/
@Schema(description = "应收款类型 1=关联保单应收单 2=非关联保单应收单")
private Integer commissionBizType;
/**
* 转介人所属团队业务ID
*/
@Schema(description = "转介人所属团队业务ID")
private String teamBizId;
}
......@@ -16,9 +16,9 @@ import java.util.List;
@Data
public class FortuneQueryRequest extends PageDto implements Serializable {
/**
* 发佣状态
* 出账状态
*/
@Schema(description = "发佣状态 '0'-'暂不可发','1'-'可发放','2'-'已发并关账', 字典值: csf_fortune_status")
@Schema(description = "出账状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效, 字典值: csf_fortune_status")
private String status;
/**
......
......@@ -3,6 +3,7 @@ package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
@Data
......@@ -10,4 +11,10 @@ public class GenerateFortuneRequest {
@Schema(description = "佣金业务id列表")
private List<String> commissionBizIdList;
@Schema(description = "expected fortune id 列表")
private List<Long> expectedFortuneIdList;
@Schema(description = "本次发佣日期")
private LocalDate payoutDate;
}
package com.yd.csf.service.dto;
import com.yd.csf.feign.dto.appointment.ApiProductPlanAdditionalInfoDto;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyAdditional;
import com.yd.csf.service.vo.PolicyVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
......@@ -17,7 +16,7 @@ public class PolicyDto implements Serializable {
* 产品计划(保单信息)
*/
@Schema(description = "产品计划(保单信息)")
private Policy apiProductPlanMainInfoDto;
private PolicyVO apiProductPlanMainInfoDto;
/**
* 保单附加险列表
......
......@@ -2,6 +2,7 @@ package com.yd.csf.service.dto;
import com.google.gson.reflect.TypeToken;
import com.yd.csf.service.model.*;
import com.yd.csf.service.vo.PolicyVO;
import com.yd.csf.service.utils.GSONUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
......@@ -89,7 +90,7 @@ public class PolicyFollowAggregateDto implements Serializable {
if (ObjectUtils.isNotEmpty(policy)) {
PolicyDto apiProductPlanInfoDto = new PolicyDto();
// 产品计划主信息
apiProductPlanInfoDto.setApiProductPlanMainInfoDto(policy);
apiProductPlanInfoDto.setApiProductPlanMainInfoDto(PolicyVO.objToVo(policy));
// 附加险列表
apiProductPlanInfoDto.setApiProductPlanAdditionalInfoDtoList(policyAdditionals);
......
......@@ -21,12 +21,22 @@ public class Commission implements Serializable {
@TableId(type = IdType.AUTO)
private Long id;
/**
* 应收账款编号
*/
private String receivableNo;
/**
* 保单来佣业务id
*/
private String commissionBizId;
/**
* 入账检核年月 yyyy-MM
*/
private String reconciliationYearMonth;
/**
* 保单号
*/
private String policyNo;
......@@ -41,6 +51,11 @@ public class Commission implements Serializable {
*/
private String reconciliationCompany;
/**
* 对账公司编码
*/
private String reconciliationCompanyCode;
/**
* 对账公司业务id
*/
......
......@@ -81,6 +81,18 @@ public class CommissionCompareRecord implements Serializable {
@Schema(description = "入账金额")
private BigDecimal amount;
/**
* 当前来佣比例
*/
@Schema(description = "当前来佣比例")
private BigDecimal currentCommissionRatio;
/**
* 操作人
*/
@Schema(description = "操作人")
private String operatorName;
/**
* 通用备注
*/
......
......@@ -31,6 +31,16 @@ public class CommissionExpected implements Serializable {
private String commissionExpectedBizId;
/**
* 应收账款编号
*/
private String receivableNo;
/**
* 应收款类型 R=关联保单应收单 U=非关联保单应收单
*/
private String commissionBizType;
/**
* 保单号
*/
private String policyNo;
......@@ -40,6 +50,11 @@ public class CommissionExpected implements Serializable {
*/
private String reconciliationCompany;
/**
* 对账公司编码
*/
private String reconciliationCompanyCode;
/**
* 对账公司业务id
*/
......@@ -71,6 +86,11 @@ public class CommissionExpected implements Serializable {
private BigDecimal commissionRatio;
/**
* 来佣金额
*/
private BigDecimal amount;
/**
* 来佣币种
*/
private String currency;
......
......@@ -4,10 +4,12 @@ import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
......@@ -39,12 +41,30 @@ public class ExpectedFortune implements Serializable {
private String expectedFortuneBizId;
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@TableField("fortune_biz_type")
private String fortuneBizType;
/**
* 应付款编号
*/
@TableField("payable_no")
private String payableNo;
/**
* 保单号
*/
@TableField("policy_no")
private String policyNo;
/**
* 产品上架信息业务ID
*/
@TableField("product_launch_biz_id")
private String productLaunchBizId;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@TableField("fortune_period")
......@@ -117,18 +137,24 @@ public class ExpectedFortune implements Serializable {
private String currency;
/**
* 佣金发放状态 0=待出账 1=可出帐 2=已出账
* 佣金发放状态 0=待出账 1=可出帐 2=已出账 3=部分出账 4=保留 5=已失效
*/
@TableField("status")
private String status;
/**
/**
* 本次出账金额
*/
@TableField("current_payment_amount")
private BigDecimal currentPaymentAmount;
/**
* 预计发佣日期
*/
@TableField("payout_date")
private LocalDate payoutDate;
/**
/**
* 已出账金额
*/
@TableField("paid_amount")
......
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.annotation.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import lombok.Data;
......@@ -21,6 +22,11 @@ public class Fortune implements Serializable {
private Long id;
/**
* 预计发佣业务ID
*/
private String expectedFortuneBizId;
/**
* 保单发佣批次ID
*/
private String batchBizId;
......@@ -108,7 +114,7 @@ public class Fortune implements Serializable {
/**
* 发佣日期
*/
private Date payoutDate;
private LocalDate payoutDate;
/**
* 出账数据业务ID
......
......@@ -12,6 +12,7 @@ import com.yd.csf.service.model.CommissionCompareRecord;
import com.yd.csf.service.model.CommissionExpected;
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.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
......@@ -39,6 +40,94 @@ public class CommissionAsyncService {
// @Async("commonAsyncExecutor")
@Transactional(rollbackFor = Exception.class)
public void commissionCompareBatch(List<Commission> entities) {
// 根据是否有保单号,来区分比对方式
List<Commission> hasPolicyNoList = new ArrayList<>();
List<Commission> noPolicyNoList = new ArrayList<>();
for (Commission entity : entities) {
if (StringUtils.isBlank(entity.getPolicyNo())) {
noPolicyNoList.add(entity);
} else {
hasPolicyNoList.add(entity);
}
}
if (CollectionUtils.isEmpty(hasPolicyNoList)) {
normalBatch(hasPolicyNoList);
}
if (CollectionUtils.isEmpty(noPolicyNoList)) {
noPolicyNoBatch(noPolicyNoList);
}
}
/**
* 无保单号的来佣比对
* @param noPolicyNoList
*/
private void noPolicyNoBatch(List<Commission> noPolicyNoList) {
// 1.根据导入的来佣获取应收款编号集合
List<String> receivableNoList = noPolicyNoList.stream()
.map(Commission::getReceivableNo)
.collect(Collectors.toList());
// 2.根据应收款编号查询预计来佣
List<CommissionExpected> expectedList = commissionExpectedService.lambdaQuery()
.in(CommissionExpected::getReceivableNo, receivableNoList)
.list();
// 3.根据应收款编号映射预计来佣
Map<String, CommissionExpected> expectedMap = expectedList.stream()
.collect(Collectors.toMap(
CommissionExpected::getReceivableNo,
commissionExpected -> commissionExpected
));
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
// 比对记录
List<CommissionCompareRecord> compareRecords = new ArrayList<>();
// 4.遍历导入的来佣,进行比对
for (Commission commission : noPolicyNoList) {
// 根据应收款编号获取预计来佣
CommissionExpected commissionExpected = expectedMap.get(commission.getReceivableNo());
if (commissionExpected == null) {
continue;
}
// 比对来佣金额是否一致
BigDecimal expectedAmount = commissionExpected.getAmount();
BigDecimal actualAmount = commission.getAmount();
if (expectedAmount.equals(actualAmount) && commissionExpected.getCurrency().equals(commission.getCurrency())) {
// 等于预计比例时,所有来佣设置为比对成功
commission.setStatus(CommissionStatusEnum.COMPARE_SUCCESS.getItemValue());
// 创建比对记录
compareRecords.add(commissionService.getNewCompareRecord(commission, commissionExpected, currentLoginUser));
// 对应预计来佣设置为已来佣
commissionExpected.setStatus(CommissionExpectedStatusEnum.COMPARED.getItemValue());
// 待入账金额设置为 0
commissionExpected.setPaidAmount(BigDecimal.ZERO);
// 更新预计来佣
commissionExpectedService.updateById(commissionExpected);
// 更新已比对来佣记录
commissionService.updateById(commission);
} else {
// 对应预计来佣设置为部分来佣
commissionExpected.setStatus(CommissionExpectedStatusEnum.PARTIAL.getItemValue());
// 更新预计来佣
commissionExpectedService.updateById(commissionExpected);
// 来佣比对失败
commission.setStatus(CommissionStatusEnum.COMPARE_FAIL.getItemValue());
// 创建比对记录
compareRecords.add(commissionService.getNewCompareRecord(commission, commissionExpected, currentLoginUser));
// 更新已比对来佣记录
commissionService.updateById(commission);
}
}
// 保存比对记录
if (CollectionUtils.isNotEmpty(compareRecords)) {
commissionCompareRecordService.saveBatch(compareRecords);
}
}
private void normalBatch(List<Commission> entities) {
// 1.根据导入的来佣获取保单号集合
List<String> policyNoList = entities.stream()
.map(Commission::getPolicyNo)
......@@ -158,10 +247,71 @@ public class CommissionAsyncService {
}
@Transactional(rollbackFor = Exception.class)
public void commissionCompare(String commissionBizId, String policyNo, String commissionName, Integer commissionPeriod, String currency, String premium) {
log.info("开始执行比对事务,来佣ID: {}, 保单号: {}",
commissionBizId, policyNo);
public void commissionCompare(Commission commission) {
log.info("开始执行比对事务,来佣ID: {}", commission.getCommissionBizId());
if (StringUtils.isNotBlank(commission.getPolicyNo())) {
normalCommission(commission.getCommissionBizId(), commission.getPolicyNo(), commission.getCommissionName(), commission.getCommissionPeriod(), commission.getCurrency(), commission.getPremium());
} else {
// 无保单号,根据来佣名称、对账公司查询来佣记录
noPolicyNoCommission(commission);
}
}
private void noPolicyNoCommission(Commission commission) {
if (commission.getAmount() == null) {
commission.setRemark("来佣金额不能为空");
commissionService.updateById(commission);
return;
}
// 1.根据来佣名称、对账公司查询预计来佣
QueryWrapper<CommissionExpected> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("reconciliation_company", commission.getReconciliationCompany());
queryWrapper.eq("commission_name", commission.getCommissionName());
List<CommissionExpected> expectedList = commissionExpectedService.list(queryWrapper);
if (expectedList.size() != 1) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "该预计来佣记录不存在或存在多条");
}
CommissionExpected commissionExpected = expectedList.get(0);
// 更新预计来佣已入账金额
commissionExpected.setPaidAmount(commission.getAmount());
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
// 计算比对状态
if (commission.getAmount().compareTo(commissionExpected.getAmount()) == 0) {
// 等于预计金额时,所有来佣设置为比对成功
commission.setStatus(CommissionStatusEnum.COMPARE_SUCCESS.getItemValue());
// 更新来佣
commissionService.updateById(commission);
// 对应预计来佣设置为已来佣
commissionExpected.setStatus(CommissionExpectedStatusEnum.COMPARED.getItemValue());
// 待入账金额设置为 0
commissionExpected.setPaidAmount(BigDecimal.ZERO);
// 更新预计来佣
commissionExpectedService.updateById(commissionExpected);
// 保存比对记录
commissionService.saveCompareRecord(commission, commissionExpected, currentLoginUser);
} else {
// 不等于预计比例时,设置为比对失败
commission.setStatus(CommissionStatusEnum.COMPARE_FAIL.getItemValue());
// 更新来佣
commissionService.updateById(commission);
// 对应预计来佣设置为部分来佣
commissionExpected.setStatus(CommissionExpectedStatusEnum.PARTIAL.getItemValue());
// 更新预计来佣
commissionExpectedService.updateById(commissionExpected);
// 保存比对记录
commissionService.saveCompareRecord(commission, commissionExpected, currentLoginUser);
}
}
private void normalCommission(String commissionBizId, String policyNo, String commissionName, Integer commissionPeriod, String currency, String premium) {
// 查询所有已存在的来佣记录
List<Commission> existingCommissions = commissionService.list(new QueryWrapper<Commission>()
.eq("policy_no", policyNo)
......
......@@ -51,4 +51,6 @@ public interface CommissionService extends IService<Commission> {
void saveCompareRecord(Commission commission, CommissionExpected commissionExpected, AuthUserDto currentLoginUser);
CommissionCompareRecord getNewCompareRecord(Commission existingCommission, CommissionExpected commissionExpected, AuthUserDto currentLoginUser);
Boolean addCommissionBatch(List<CommissionAddRequest> customerAddRequestList);
}
......@@ -30,4 +30,6 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
Boolean batchDelByPolicyNo(String policyNo);
ExpectedFortuneStatisticsVO getStatistics(List<Long> expectedFortuneIds);
IPage<ApiExpectedFortunePageResponse> getVOPage(IPage<ExpectedFortune> iPage);
}
package com.yd.csf.service.service;
import com.yd.csf.service.dto.CommissionExpectedAddDto;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.TimeUnit;
@Component
public class ReceivableService {
@Resource
private RedisTemplate<String, String> redisTemplate;
// Redis key前缀
private static final String ADDITIONAL_NO_PREFIX = "receivable:additional:";
// 日期格式
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
public String generateReceivableNo(CommissionExpectedAddDto addDto) {
// 有保单号,应收账款编号 = 保单号 + 佣金期数
if (StringUtils.isNotBlank(addDto.getPolicyNo())) {
return addDto.getPolicyNo() + addDto.getCommissionPeriod();
}
// 无保单号,生成附加编号
return generateAdditionalReceivableNo(addDto);
}
private String generateAdditionalReceivableNo(CommissionExpectedAddDto addDto) {
LocalDate today = LocalDate.now();
String dateStr = today.format(DATE_FORMATTER);
// 获取当天流水号(从1开始)
long dailySeq = getDailySequence();
// 格式:对账公司代码-年份后两位-席号(6位数字)
return String.format("%s%s%s%06d",
"R".equals(addDto.getCommissionBizType()) ? "R-" : "U-",
getCompanyCode(addDto),
dateStr.substring(2, 4), // 取年份后两位
dailySeq);
}
public String getCompanyCode(CommissionExpectedAddDto addDto) {
if (StringUtils.isBlank(addDto.getReconciliationCompanyCode())) {
// 没有对账公司编码,使用自定义公司编码
// 取MD5前6位
String md5 = DigestUtils.md5Hex(addDto.getReconciliationCompany());
return "UNKNOWN_" + md5.substring(0, 6).toUpperCase();
} else {
// 有对账公司编码,使用对账公司编码
return addDto.getReconciliationCompanyCode();
}
}
private long getDailySequence() {
LocalDate today = LocalDate.now();
String redisKey = ADDITIONAL_NO_PREFIX + today.format(DATE_FORMATTER);
ValueOperations<String, String> ops = redisTemplate.opsForValue();
// 使用Redis的INCR命令获取自增序列
Long seq = ops.increment(redisKey, 1);
// 如果是第一次设置(值为1),设置过期时间为1天+2小时(避免跨天问题)
if (seq != null && seq == 1L) {
redisTemplate.expire(redisKey, 26, TimeUnit.HOURS); // 26小时,确保覆盖全天
}
return seq;
}
}
\ No newline at end of file
......@@ -17,14 +17,10 @@ import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.*;
import com.yd.csf.service.dao.CommissionExpectedMapper;
import com.yd.csf.service.service.CommissionService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import com.yd.csf.service.vo.CommissionExpectedVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
......@@ -39,13 +35,13 @@ import java.util.*;
import java.util.stream.Collectors;
/**
* @author Zhang Jianan
* @description 针对表【commission_expected(预计来佣表)】的数据库操作Service实现
* @createDate 2025-10-08 19:47:40
*/
* @author Zhang Jianan
* @description 针对表【commission_expected(预计来佣表)】的数据库操作Service实现
* @createDate 2025-10-08 19:47:40
*/
@Service
public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpectedMapper, CommissionExpected>
implements CommissionExpectedService{
implements CommissionExpectedService {
@Resource
private PolicyService policyService;
......@@ -56,6 +52,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
@Resource
private CommissionService commissionService;
@Resource
private ReceivableService receivableService;
@Override
......@@ -91,32 +89,44 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
* 校验数据
*
* @param commissionExpected
* @param add 对创建的数据进行校验
* @param add 对创建的数据进行校验
*/
@Override
public void validCommissionExpected(CommissionExpected commissionExpected, boolean add) {
if (commissionExpected == null) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "预计来佣对象不能为空");
}
String policyNo = commissionExpected.getPolicyNo();
if (StringUtils.isBlank(policyNo)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单号不能为空");
}
String commissionName = commissionExpected.getCommissionName();
if (StringUtils.isBlank(commissionName)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣名称不能为空");
// 来佣业务类型不能为空
String commissionBizType = commissionExpected.getCommissionBizType();
if (ObjectUtils.isEmpty(commissionBizType)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "应收款类型不能为空");
}
BigDecimal commissionRatio = commissionExpected.getCommissionRatio();
if (ObjectUtils.isEmpty(commissionRatio)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣比例不能为空");
}
Integer commissionPeriod = commissionExpected.getCommissionPeriod();
if (ObjectUtils.isEmpty(commissionPeriod)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "佣金期数不能为空");
}
Integer totalPeriod = commissionExpected.getTotalPeriod();
if (ObjectUtils.isEmpty(totalPeriod)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "总来佣期数不能为空");
if ("R".equals(commissionBizType)) {
// 关联保单应收单,保单号不能为空
String policyNo = commissionExpected.getPolicyNo();
if (StringUtils.isBlank(policyNo)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单号不能为空");
}
String commissionName = commissionExpected.getCommissionName();
if (StringUtils.isBlank(commissionName)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣名称不能为空");
}
BigDecimal commissionRatio = commissionExpected.getCommissionRatio();
if (ObjectUtils.isEmpty(commissionRatio)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣比例不能为空");
}
Integer commissionPeriod = commissionExpected.getCommissionPeriod();
if (ObjectUtils.isEmpty(commissionPeriod)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "佣金期数不能为空");
}
Integer totalPeriod = commissionExpected.getTotalPeriod();
if (ObjectUtils.isEmpty(totalPeriod)) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "总来佣期数不能为空");
}
} else if ("U".equals(commissionBizType)) {
if (ObjectUtils.isEmpty(commissionExpected.getAmount())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "来佣金额不能为空");
}
}
// 创建数据时,参数不能为空
if (add) {
......@@ -139,12 +149,27 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
}
// 获取查询参数
String policyNo = commissionExpectedQueryRequest.getPolicyNo();
String status = commissionExpectedQueryRequest.getStatus();
Date commissionDate = commissionExpectedQueryRequest.getCommissionDate();
String insurerBizId = commissionExpectedQueryRequest.getInsurerBizId();
List<String> statusList = commissionExpectedQueryRequest.getStatusList();
Date commissionDateStart = commissionExpectedQueryRequest.getCommissionDateStart();
Date commissionDateEnd = commissionExpectedQueryRequest.getCommissionDateEnd();
String productLaunchBizId = commissionExpectedQueryRequest.getProductLaunchBizId();
Integer commissionBizType = commissionExpectedQueryRequest.getCommissionBizType();
String teamBizId = commissionExpectedQueryRequest.getTeamBizId();
// 精确查询
queryWrapper.eq(ObjectUtils.isNotEmpty(policyNo), "policy_no", policyNo);
queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status);
queryWrapper.le(ObjectUtils.isNotEmpty(commissionDate), "commission_date", commissionDate);
queryWrapper.eq(ObjectUtils.isNotEmpty(insurerBizId), "insurer_biz_id", insurerBizId);
queryWrapper.eq(ObjectUtils.isNotEmpty(productLaunchBizId), "product_launch_biz_id", productLaunchBizId);
queryWrapper.eq(ObjectUtils.isNotEmpty(commissionBizType), "commission_biz_type", commissionBizType);
queryWrapper.in(ObjectUtils.isNotEmpty(statusList), "status", statusList);
// 范围查询
queryWrapper.gt(ObjectUtils.isNotEmpty(commissionDateStart), "commission_date", commissionDateStart);
queryWrapper.lt(ObjectUtils.isNotEmpty(commissionDateEnd), "commission_date", commissionDateEnd);
// 转介人所属团队业务ID 关联保单表查询
if (StringUtils.isNotBlank(teamBizId)) {
queryWrapper.apply("EXISTS (SELECT 1 FROM policy_broker pb WHERE pb.policy_no = commission_expected.policy_no AND pb.team_biz_id = {0})",
teamBizId);
}
// 默认排序规则
queryWrapper.orderByDesc("commission_date");
// 排序字段
......@@ -216,6 +241,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
validCommissionExpected(commissionExpected, true);
if (StringUtils.isBlank(addDto.getCommissionExpectedBizId())) {
// 生成应收账款编号
commissionExpected.setReceivableNo(receivableService.generateReceivableNo(addDto));
// 生成新单编号
commissionExpected.setCommissionExpectedBizId(RandomStringGenerator.generateBizId16("commission_expected"));
commissionExpected.setCreateTime(new Date());
......
package com.yd.csf.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.feign.response.expectedfortune.PolicyInfo;
import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.dao.ExpectedFortuneMapper;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.service.IExpectedFortuneService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.service.PolicyService;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.Collections;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* <p>
......@@ -27,10 +35,13 @@ import java.util.List;
@Service
public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMapper, ExpectedFortune> implements IExpectedFortuneService {
@Resource
private PolicyService policyService;
@Override
public IPage<ApiExpectedFortunePageResponse> page(Page<ApiExpectedFortunePageResponse> page,
ApiExpectedFortunePageRequest request) {
return baseMapper.page(page,request);
return baseMapper.page(page, request);
}
@Override
......@@ -40,21 +51,51 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
/**
* 查询列表
*
* @param policyNo
* @return
*/
@Override
public List<ExpectedFortune> queryList(String policyNo) {
return baseMapper.selectList(new LambdaQueryWrapper<ExpectedFortune>().eq(ExpectedFortune::getPolicyNo,policyNo));
return baseMapper.selectList(new LambdaQueryWrapper<ExpectedFortune>().eq(ExpectedFortune::getPolicyNo, policyNo));
}
@Override
public Boolean batchDelByPolicyNo(String policyNo) {
return this.remove(new LambdaQueryWrapper<ExpectedFortune>().eq(ExpectedFortune::getPolicyNo,policyNo));
return this.remove(new LambdaQueryWrapper<ExpectedFortune>().eq(ExpectedFortune::getPolicyNo, policyNo));
}
@Override
public ExpectedFortuneStatisticsVO getStatistics(List<Long> expectedFortuneIds) {
return baseMapper.getStatistics(expectedFortuneIds);
}
@Override
public IPage<ApiExpectedFortunePageResponse> getVOPage(IPage<ExpectedFortune> iPage) {
List<ExpectedFortune> expectedFortuneList = iPage.getRecords();
Page<ApiExpectedFortunePageResponse> expectedFortuneVOPage = new Page<>(iPage.getCurrent(), iPage.getSize(), iPage.getTotal());
if (CollUtil.isEmpty(expectedFortuneList)) {
return expectedFortuneVOPage;
}
// 查询关联的保单信息
List<String> policyNoList = expectedFortuneList.stream().map(ExpectedFortune::getPolicyNo).collect(Collectors.toList());
QueryWrapper<Policy> queryWrapper = new QueryWrapper<>();
queryWrapper.in("policy_no", policyNoList);
List<Policy> policyInfoList = policyService.list(queryWrapper);
Map<String, Policy> policyMap = policyInfoList.stream().collect(Collectors.toMap(Policy::getPolicyNo, Function.identity()));
List<ApiExpectedFortunePageResponse> expectedFortuneVOList = expectedFortuneList.stream().map(expectedFortune -> {
ApiExpectedFortunePageResponse expectedFortuneVO = new ApiExpectedFortunePageResponse();
BeanUtils.copyProperties(expectedFortune, expectedFortuneVO);
if (policyMap.get(expectedFortune.getPolicyNo()) != null) {
PolicyInfo policyInfo = new PolicyInfo();
BeanUtils.copyProperties(policyMap.get(expectedFortune.getPolicyNo()), policyInfo);
expectedFortuneVO.setPolicy(policyInfo);
}
return expectedFortuneVO;
}).collect(Collectors.toList());
expectedFortuneVOPage.setRecords(expectedFortuneVOList);
return expectedFortuneVOPage;
}
}
......@@ -22,6 +22,7 @@ import com.yd.csf.service.service.CommissionService;
import com.yd.csf.service.service.FortuneAccountService;
import com.yd.csf.service.service.FortuneService;
import com.yd.csf.service.dao.FortuneMapper;
import com.yd.csf.service.vo.CommissionVO;
import com.yd.csf.service.vo.FortuneVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
......@@ -80,10 +81,11 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
List<FortuneVO> fortuneVOList = fortuneList.stream().map(FortuneVO::objToVo).collect(Collectors.toList());
// 关联查询已来佣金额
List<Commission> commissionList = commissionService.list(new QueryWrapper<Commission>().in("commission_biz_id", fortuneList.stream().map(Fortune::getCommissionBizId).collect(Collectors.toList())));
Map<String, BigDecimal> commissionAmountMap = commissionList.stream().collect(Collectors.toMap(Commission::getCommissionBizId, Commission::getAmount));
Map<String, Commission> commissionMap = commissionList.stream().collect(Collectors.toMap(Commission::getCommissionBizId, commission -> commission));
fortuneVOList.forEach(fortuneVO -> {
String commissionBizId = fortuneVO.getCommissionBizId();
fortuneVO.setCommissionAmount(commissionAmountMap.getOrDefault(commissionBizId, BigDecimal.ZERO));
// fortuneVO.setCommissionAmount(commissionAmountMap.getOrDefault(commissionBizId, BigDecimal.ZERO));
fortuneVO.setCommission(CommissionVO.objToVo(commissionMap.get(commissionBizId)));
});
fortuneVOPage.setRecords(fortuneVOList);
......
......@@ -11,21 +11,21 @@ import java.math.BigDecimal;
@Data
public class CommissionExpectedStatisticsVO {
/**
* 总金额
* 预计入账金额(HKD)
*/
@Schema(description = "总金额")
@Schema(description = "预计入账金额(HKD)")
private BigDecimal totalAmount;
/**
* 总入账金额
* 已入账金额(HKD)
*/
@Schema(description = "总入账金额")
@Schema(description = "已入账金额(HKD)")
private BigDecimal totalPaidAmount;
/**
* 待入账金额
* 待入账金额(HKD)
*/
@Schema(description = "待入账金额")
@Schema(description = "待入账金额(HKD)")
private BigDecimal pendingPaidAmount;
/**
......
......@@ -28,12 +28,36 @@ public class CommissionExpectedVO implements Serializable {
private String commissionExpectedBizId;
/**
* 应收账款编号
*/
@Schema(description = "应收账款编号")
private String receivableNo;
/**
* 应收款类型 1=关联保单应收单 2=非关联保单应收单
*/
@Schema(description = "应收款类型 1=关联保单应收单 2=非关联保单应收单")
private Integer commissionBizType;
/**
* 保单号
*/
@Schema(description = "保单号")
private String policyNo;
/**
* 保险公司业务ID
*/
@Schema(description = "保险公司业务ID")
private String insurerBizId;
/**
* 产品上架信息表唯一业务ID
*/
@Schema(description = "产品计划: 产品上架信息表唯一业务ID")
private String productLaunchBizId;
/**
* 保费
*/
@Schema(description = "保费")
......@@ -70,9 +94,9 @@ public class CommissionExpectedVO implements Serializable {
private String commissionType;
/**
* 预计来佣比例 (%)
* 预计入账比例 (%)
*/
@Schema(description = "预计来佣比例 (%)")
@Schema(description = "预计入账比例 (%)")
private BigDecimal commissionRatio;
/**
......@@ -95,36 +119,36 @@ public class CommissionExpectedVO implements Serializable {
private Date commissionDate;
/**
* 预计来佣状态 0=待来佣 1=已来佣 2=部分来佣
* 入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效
*/
@Schema(description = "预计来佣状态 0=待来佣 1=已来佣 2=部分来佣")
@Schema(description = "入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效")
private String status;
/**
* 预计来佣金额
/**
* 预计入账金额(HKD)
*/
@Schema(description = "预计来佣金额")
@Schema(description = "预计入账金额(HKD)")
private BigDecimal expectedAmount;
/**
* 默认结算汇率
/**
* 结算汇率(估)
*/
@Schema(description = "默认结算汇率")
@Schema(description = "结算汇率(估)")
private BigDecimal defaultExchangeRate;
/**
* 已入账来佣金额
/**
* 已入账来佣金额(HKD)
*/
@Schema(description = "已入账来佣金额")
@Schema(description = "已入账来佣金额(HKD)")
private BigDecimal paidAmount;
/**
* 已入账来佣比例
/**
* 已入账来佣比例 (%)
*/
@Schema(description = "已入账来佣比例")
@Schema(description = "已入账来佣比例 (%)")
private BigDecimal paidRatio;
/**
/**
* 已入账来佣列表
*/
@Schema(description = "已入账来佣列表")
......
......@@ -6,15 +6,15 @@ import lombok.Data;
import java.math.BigDecimal;
/**
* 预计发佣统计VO 预计发佣金额 HKD、已出账金额 HKD、待出账金额 HKD、总保单数、总保费 HKD
* 预计出账统计VO 预计出账金额 HKD、已出账金额 HKD、待出账金额 HKD、总保单数、总保费 HKD
*/
@Data
public class ExpectedFortuneStatisticsVO {
/**
* 预计发佣金额 HKD
* 预计出账金额 HKD
*/
@Schema(description = "预计发佣金额 HKD")
@Schema(description = "预计出账金额 HKD")
private BigDecimal totalExpectedAmount;
/**
......
......@@ -39,10 +39,16 @@ public class FortuneVO implements Serializable {
private String commissionBizId;
/**
* 关联来佣信息
*/
@Schema(description = "关联来佣信息")
private CommissionVO commission;
/**
* 本次已来佣金额
*/
@Schema(description = "本次已来佣金额")
private Object commissionAmount;
// @Schema(description = "本次已来佣金额")
// private Object commissionAmount;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
......
package com.yd.csf.service.vo;
import cn.hutool.json.JSONUtil;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.model.Policy;
import io.swagger.v3.oas.annotations.media.Schema;
......@@ -84,6 +83,12 @@ public class PolicyVO {
@Schema(description = "期交保费")
private BigDecimal paymentPremium;
/**
* 每期保费
*/
@Schema(description = "每期保费")
private BigDecimal eachIssuePremium;
/**
* 保单状态
*/
......@@ -137,6 +142,12 @@ public class PolicyVO {
private Integer isPrepaid;
/**
* 是否预缴: 0-否, 1-是
*/
@Schema(description = "是否预缴: 0-否, 1-是")
private Integer isPrepay;
/**
* 预缴年期
*/
@Schema(description = "预缴年期")
......@@ -173,6 +184,8 @@ public class PolicyVO {
}
PolicyVO policyVO = new PolicyVO();
BeanUtils.copyProperties(policy, policyVO);
policyVO.setEachIssuePremium(policy.getPaymentPremium());
policyVO.setIsPrepay(policy.getIsPrepaid());
return policyVO;
}
......
......@@ -15,13 +15,15 @@
<result property="createTime" column="create_time" />
<result property="exchangeRate" column="exchange_rate" />
<result property="amount" column="amount" />
<result property="currentCommissionRatio" column="current_commission_ratio" />
<result property="operatorName" column="operator_name" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
</resultMap>
<sql id="Base_Column_List">
id,commission_expected_biz_id,commission_biz_id,commission_period,total_period,status,
currency,create_time,exchange_rate,amount,remark,
currency,create_time,exchange_rate,amount,current_commission_ratio,operator_name,remark,
is_deleted
</sql>
</mapper>
......@@ -7,14 +7,18 @@
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.CommissionExpected">
<id property="id" column="id" />
<result property="commissionExpectedBizId" column="commission_expected_biz_id" />
<result property="receivableNo" column="receivable_no" />
<result property="commissionBizType" column="commission_biz_type" />
<result property="policyNo" column="policy_no" />
<result property="reconciliationCompany" column="reconciliation_company" />
<result property="reconciliationCompanyCode" column="reconciliation_company_code" />
<result property="reconciliationCompanyBizId" column="reconciliation_company_biz_id" />
<result property="commissionPeriod" column="commission_period" />
<result property="totalPeriod" column="total_period" />
<result property="commissionName" column="commission_name" />
<result property="commissionType" column="commission_type" />
<result property="commissionRatio" column="commission_ratio" />
<result property="amount" column="amount" />
<result property="currency" column="currency" />
<result property="commissionDate" column="commission_date" />
<result property="status" column="status" />
......@@ -30,8 +34,8 @@
</resultMap>
<sql id="Base_Column_List">
id,commission_expected_biz_id,policy_no,reconciliation_company,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,commission_ratio,currency,default_exchange_rate,expected_amount,
id,commission_expected_biz_id,receivable_no,commission_biz_type,policy_no,reconciliation_company,reconciliation_company_code,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,commission_ratio,amount,currency,default_exchange_rate,expected_amount,
commission_date,status,paid_amount,remark,is_deleted,creator_id,
updater_id,create_time,update_time
</sql>
......@@ -43,10 +47,11 @@
COUNT(DISTINCT policy_no) AS totalPolicyCount
FROM
commission_expected
WHERE
<where>
id IN
<foreach collection="expectedIds" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</where>
</select>
</mapper>
......@@ -6,10 +6,13 @@
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.Commission">
<id property="id" column="id" />
<result property="receivableNo" column="receivable_no" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="reconciliationYearMonth" column="reconciliation_year_month" />
<result property="policyNo" column="policy_no" />
<result property="premium" column="premium" />
<result property="reconciliationCompany" column="reconciliation_company" />
<result property="reconciliationCompanyCode" column="reconciliation_company_code" />
<result property="reconciliationCompanyBizId" column="reconciliation_company_biz_id" />
<result property="commissionPeriod" column="commission_period" />
<result property="totalPeriod" column="total_period" />
......@@ -32,7 +35,7 @@
</resultMap>
<sql id="Base_Column_List">
id,commission_biz_id,policy_no,premium,reconciliation_company,reconciliation_company_biz_id,commission_period,
id,receivable_no,commission_biz_id,reconciliation_year_month,policy_no,premium,reconciliation_company,reconciliation_company_code,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,exchange_rate,amount,currency,
commission_date,current_commission_ratio,period_paid_ratio,period_pending_ratio,status,remark,is_deleted,creator_id,
updater_id,create_time,update_time
......
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