Commit 3ea990f6 by zhangxingmin

Merge remote-tracking branch 'origin/dev' into prod

parents 60a764a9 760e13be
...@@ -12,9 +12,7 @@ import org.springframework.scheduling.annotation.EnableScheduling; ...@@ -12,9 +12,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(scanBasePackages = "com.yd") @SpringBootApplication(scanBasePackages = "com.yd")
@MapperScan("com.yd.**.dao") @MapperScan("com.yd.**.dao")
@EnableFeignClients(basePackages = "com.yd") @EnableFeignClients(basePackages = "com.yd")
@ComponentScan(basePackages = { @ComponentScan(basePackages = {"com.yd.auth.core", "com.yd.csf.service.config"})
"com.yd.auth.core" // 包含认证模块的包路径
})
public class CsfApiApplication { public class CsfApiApplication {
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -30,6 +30,8 @@ import org.redisson.api.RedissonClient; ...@@ -30,6 +30,8 @@ import org.redisson.api.RedissonClient;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate; import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -151,26 +153,28 @@ public class ApiCommissionController { ...@@ -151,26 +153,28 @@ public class ApiCommissionController {
// 数据处理 // 数据处理
List<Commission> entities = processData(dataList, loginUserId, reconciliationYearMonth); List<Commission> entities = processData(dataList, loginUserId, reconciliationYearMonth);
transactionTemplate.execute(status -> { // 1. 先保存主数据
// 保存来佣数据 commissionService.saveBatch(entities);
commissionService.saveBatch(entities);
return null;
});
// // 转换为 VO // // 转换为 VO
// List<CommissionVO> commissionVOList = commissionService.getCommissionList(entities); // List<CommissionVO> commissionVOList = commissionService.getCommissionList(entities);
// 开启新事务,比对数据
transactionTemplate.execute(status -> { // 2. 事务提交后执行比对
try { TransactionSynchronizationManager.registerSynchronization(
commissionAsyncService.commissionCompareBatch(entities); new TransactionSynchronization() {
} catch (Exception e) { @Override
// 比对失败不影响主事务,记录日志即可 public void afterCommit() {
e.printStackTrace(); try {
log.error("批量导入, 比对操作执行失败, error: {}", e.getMessage()); // 这里会开启新事务执行更新
} commissionAsyncService.commissionCompareBatch(entities);
return null; } catch (Exception e) {
}); log.error("批量导入, 比对操作执行失败, error: {}", e.getMessage());
// 可以发送告警或记录失败任务
}
}
}
);
return Result.success(true); return Result.success(true);
} }
......
...@@ -283,7 +283,7 @@ public class ApiCommissionExpectedController { ...@@ -283,7 +283,7 @@ public class ApiCommissionExpectedController {
if (!CollectionUtils.isEmpty(allExpectedIdList)) { if (!CollectionUtils.isEmpty(allExpectedIdList)) {
receivableReportPage = commissionExpectedService.receivableReportPage(reportPage, allExpectedIdList); receivableReportPage = commissionExpectedService.receivableReportPage(reportPage, allExpectedIdList);
} }
enrichReceivableReportWithCompanyName(receivableReportPage); // enrichReceivableReportWithCompanyName(receivableReportPage);
receivableReportPage = convertProductName(receivableReportPage); receivableReportPage = convertProductName(receivableReportPage);
// 组装返回结果 // 组装返回结果
ReceivableReportResponse response = new ReceivableReportResponse(); ReceivableReportResponse response = new ReceivableReportResponse();
......
...@@ -530,6 +530,7 @@ public class ApiFortuneController { ...@@ -530,6 +530,7 @@ public class ApiFortuneController {
QueryWrapper<Fortune> queryWrapper = new QueryWrapper<>(); QueryWrapper<Fortune> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("expected_fortune_biz_id", fortuneQueryRequest.getExpectedFortuneBizId()); queryWrapper.eq("expected_fortune_biz_id", fortuneQueryRequest.getExpectedFortuneBizId());
queryWrapper.eq("status", FortuneStatusEnum.SENT.getItemValue()); queryWrapper.eq("status", FortuneStatusEnum.SENT.getItemValue());
queryWrapper.or().eq("status", FortuneStatusEnum.CHECKED.getItemValue());
Page<Fortune> fortunePage = fortuneService.page(new Page<>(current, size), Page<Fortune> fortunePage = fortuneService.page(new Page<>(current, size),
queryWrapper); queryWrapper);
// 组装返回值 // 组装返回值
......
package com.yd.csf.api.controller; package com.yd.csf.api.controller;
import cn.hutool.core.date.DateField; import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader; import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.ReadSheet; import com.alibaba.excel.read.metadata.ReadSheet;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.auth.core.dto.AuthUserDto; import com.yd.auth.core.dto.AuthUserDto;
...@@ -28,15 +30,18 @@ import com.yd.csf.service.common.ErrorCode; ...@@ -28,15 +30,18 @@ import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.component.PolicyReportPdfService; import com.yd.csf.service.component.PolicyReportPdfService;
import com.yd.csf.service.dto.*; import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.PolicyFollowStatusEnum; import com.yd.csf.service.enums.PolicyFollowStatusEnum;
import com.yd.csf.service.helper.FeignResultHelper;
import com.yd.csf.service.model.*; import com.yd.csf.service.model.*;
import com.yd.csf.service.service.*; import com.yd.csf.service.service.*;
import com.yd.csf.service.vo.PolicyFollowDetailVO; import com.yd.csf.service.vo.PolicyFollowDetailVO;
import com.yd.csf.service.vo.PolicyFollowRecordVO; import com.yd.csf.service.vo.PolicyFollowRecordVO;
import com.yd.csf.service.vo.PolicyFollowVO; import com.yd.csf.service.vo.PolicyFollowVO;
import com.yd.csf.service.vo.PolicyNumberResponseVO; import com.yd.csf.service.vo.PolicyNumberResponseVO;
import com.yd.feign.config.FeignTokenInterceptor;
import com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyFeignClient; import com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyFeignClient;
import com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest; import com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest;
import com.yd.product.feign.client.announcementcommissionratio.ApiAnnouncementCommissionRatioFeignClient;
import com.yd.product.feign.request.announcementcommissionratio.ApiAnnouncementCommissionRatioListRequest;
import com.yd.product.feign.response.announcementcommissionratio.ApiAnnouncementCommissionRatioListResponse;
import com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse; import com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
...@@ -46,7 +51,6 @@ import org.apache.commons.lang3.StringUtils; ...@@ -46,7 +51,6 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
...@@ -91,9 +95,12 @@ public class ApiPolicyFollowController { ...@@ -91,9 +95,12 @@ public class ApiPolicyFollowController {
private CommissionExpectedService commissionExpectedService; private CommissionExpectedService commissionExpectedService;
@Resource @Resource
private ApiPolicyFollowService apiPolicyFollowService; private ApiPolicyFollowService apiPolicyFollowService;
@Resource @Resource
private ApiExpectedFortuneService apiExpectedFortuneService; private ApiExpectedFortuneService apiExpectedFortuneService;
@Resource
private ApiAnnouncementCommissionRatioFeignClient apiAnnouncementCommissionRatioFeignClient;
@Resource
private FeignResultHelper feignResultHelper;
@PostMapping("/upload/excel") @PostMapping("/upload/excel")
...@@ -538,6 +545,25 @@ public class ApiPolicyFollowController { ...@@ -538,6 +545,25 @@ public class ApiPolicyFollowController {
if (!hasCommissionInfo) { if (!hasCommissionInfo) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "产品未维护发佣信息"); return Result.fail(ResultCode.NULL_ERROR.getCode(), "产品未维护发佣信息");
} }
//查询产品发佣配置,获取结算币种
ApiAnnouncementCommissionRatioListRequest announcementRatioListRequest = new ApiAnnouncementCommissionRatioListRequest();
announcementRatioListRequest.setProductLaunchBizId(productLaunchBizId);
announcementRatioListRequest.setEffectiveDate(changePolicyFollowStatusRequest.getEffectiveDate());
announcementRatioListRequest.setPaymentTerm(String.valueOf(policyFollow.getIssueNumber()));
try {
feignResultHelper.extractListData(
apiAnnouncementCommissionRatioFeignClient.list(announcementRatioListRequest),
ApiAnnouncementCommissionRatioListResponse.class
);
} catch (BusinessException e) {
log.info("===== 进入BusinessException catch块 =====");
log.info("查询结算币种->保单号:{},入参request:{}", policyFollow.getPolicyNo(), JSON.toJSONString(announcementRatioListRequest));
return Result.fail("未查询到产品发佣配置,查询条件:" + transferMsg(announcementRatioListRequest, policyFollow));
} catch (Exception e) {
log.info("===== 进入Exception catch块 =====");
log.info("查询结算币种->保单号:{},入参request:{}", policyFollow.getPolicyNo(), JSON.toJSONString(announcementRatioListRequest));
return Result.fail("未查询到产品发佣配置,查询条件:" + transferMsg(announcementRatioListRequest, policyFollow));
}
} }
// 修改逻辑 // 修改逻辑
...@@ -554,6 +580,13 @@ public class ApiPolicyFollowController { ...@@ -554,6 +580,13 @@ public class ApiPolicyFollowController {
return Result.success(true); return Result.success(true);
} }
private String transferMsg(ApiAnnouncementCommissionRatioListRequest announcementRatioListRequest, PolicyFollow policyFollow) {
return String.format("保单生效日: %s, 供款年期: %s, 产品名称: %s, ",
DateUtil.format(announcementRatioListRequest.getEffectiveDate(), DatePattern.NORM_DATE_PATTERN),
policyFollow.getIssueNumber(),
policyFollow.getProductName());
}
/** /**
* 异步处理 * 异步处理
* *
......
...@@ -31,6 +31,16 @@ public class GenerateExpectedFortuneDto { ...@@ -31,6 +31,16 @@ public class GenerateExpectedFortuneDto {
private String policyNo; private String policyNo;
/** /**
* 产品业务id
*/
private String productLaunchBizId;
/**
* 保险公司业务id
*/
private String insuranceCompanyBizId;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年) * 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/ */
private Integer fortunePeriod; private Integer fortunePeriod;
......
...@@ -15,11 +15,11 @@ import com.yd.csf.service.dto.QueryPolicyAndBrokerDto; ...@@ -15,11 +15,11 @@ import com.yd.csf.service.dto.QueryPolicyAndBrokerDto;
import com.yd.csf.service.model.CommissionRuleBinding; import com.yd.csf.service.model.CommissionRuleBinding;
import com.yd.csf.service.model.ExpectedFortune; import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO; import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.product.feign.response.announcementcommissionratio.ApiAnnouncementCommissionRatioListResponse;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
import java.util.Map;
public interface ApiExpectedFortuneService { public interface ApiExpectedFortuneService {
Result<ApiGenerateExpectedFortuneResponse> generate(ApiGenerateExpectedFortuneRequest request); Result<ApiGenerateExpectedFortuneResponse> generate(ApiGenerateExpectedFortuneRequest request);
...@@ -37,7 +37,8 @@ public interface ApiExpectedFortuneService { ...@@ -37,7 +37,8 @@ public interface ApiExpectedFortuneService {
@Async("asyncQueryExecutor") @Async("asyncQueryExecutor")
Result execute(List<QueryPolicyAndBrokerDto> queryPolicyAndBrokerDtoList, Result execute(List<QueryPolicyAndBrokerDto> queryPolicyAndBrokerDtoList,
List<CommissionRuleBinding> commissionRuleBindingList, List<CommissionRuleBinding> commissionRuleBindingList,
String policyNo); String policyNo,
List<ApiAnnouncementCommissionRatioListResponse> announcementRatioList);
/** /**
* 同步执行预计发佣生成 * 同步执行预计发佣生成
......
...@@ -18,6 +18,7 @@ import com.yd.csf.feign.dto.appointment.*; ...@@ -18,6 +18,7 @@ import com.yd.csf.feign.dto.appointment.*;
import com.yd.csf.feign.dto.appointmentfile.ApiAppointmentFileDto; import com.yd.csf.feign.dto.appointmentfile.ApiAppointmentFileDto;
import com.yd.csf.feign.request.appointment.*; import com.yd.csf.feign.request.appointment.*;
import com.yd.csf.feign.response.appointment.*; import com.yd.csf.feign.response.appointment.*;
import com.yd.csf.service.dao.AppointmentMapper;
import com.yd.csf.service.dto.PolicySigner; import com.yd.csf.service.dto.PolicySigner;
import com.yd.csf.service.enums.AppointmentStatusEnum; import com.yd.csf.service.enums.AppointmentStatusEnum;
import com.yd.csf.service.enums.FnaStatusEnum; import com.yd.csf.service.enums.FnaStatusEnum;
...@@ -141,6 +142,8 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService { ...@@ -141,6 +142,8 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
private PolicyBrokerService policyBrokerService; private PolicyBrokerService policyBrokerService;
@Resource @Resource
private PolicyAppointmentFileService policyAppointmentFileService; private PolicyAppointmentFileService policyAppointmentFileService;
@Resource
private AppointmentMapper appointmentMapper;
/** /**
* 预约分页查询 * 预约分页查询
......
...@@ -12,6 +12,13 @@ ...@@ -12,6 +12,13 @@
<artifactId>yd-csf-service</artifactId> <artifactId>yd-csf-service</artifactId>
<dependencies> <dependencies>
<!-- Java 8 时间类型支持 -->
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.13.2</version>
</dependency>
<!-- 公共工具类 --> <!-- 公共工具类 -->
<dependency> <dependency>
<groupId>commons-io</groupId> <groupId>commons-io</groupId>
......
...@@ -18,6 +18,7 @@ import org.apache.commons.collections4.CollectionUtils; ...@@ -18,6 +18,7 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
...@@ -40,7 +41,7 @@ public class CommissionAsyncService { ...@@ -40,7 +41,7 @@ public class CommissionAsyncService {
private CommissionCompareRecordService commissionCompareRecordService; private CommissionCompareRecordService commissionCompareRecordService;
// @Async("commonAsyncExecutor") // @Async("commonAsyncExecutor")
@Transactional(rollbackFor = Exception.class) @Transactional(propagation = Propagation.REQUIRES_NEW)
public void commissionCompareBatch(List<Commission> entities) { public void commissionCompareBatch(List<Commission> entities) {
// 根据是否关联保单号,来区分比对方式 // 根据是否关联保单号,来区分比对方式
List<Commission> hasPolicyNoList = new ArrayList<>(); List<Commission> hasPolicyNoList = new ArrayList<>();
......
package com.yd.csf.service.config; package com.yd.csf.service.config;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.reflection.MetaObject;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@Slf4j
@Configuration @Configuration
public class CsfMybatisPlusConfig { public class CsfMybatisPlusConfig {
...@@ -25,21 +31,35 @@ public class CsfMybatisPlusConfig { ...@@ -25,21 +31,35 @@ public class CsfMybatisPlusConfig {
} }
/** /**
* 自动填充字段配置(如创建时间、更新时间 * 自动填充字段配置(如创建人、更新人等
*/ */
@Bean @Bean
@Primary
public MetaObjectHandler metaObjectHandler() { public MetaObjectHandler metaObjectHandler() {
log.info("MetaObjectHandler Bean 正在创建...","MetaObjectHandler Bean 正在创建==========");
return new MetaObjectHandler() { return new MetaObjectHandler() {
@Override @Override
public void insertFill(MetaObject metaObject) { public void insertFill(MetaObject metaObject) {
//获取Security上下文当前用户的登录信息
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
log.info("metaObjectHandler=======insertFill自动填充获取用户信息:{}", JSON.toJSONString(authUserDto));
if (authUserDto != null) {
//自动注入创建人和创建用户名
this.strictInsertFill(metaObject, "creatorId", String.class, authUserDto.getUserBizId());
this.strictInsertFill(metaObject, "creatorName", String.class, authUserDto.getUsername());
}
} }
@Override @Override
public void updateFill(MetaObject metaObject) { public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); //获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
log.info("metaObjectHandler=======updateFill自动填充获取用户信息:{}", JSON.toJSONString(authUserDto));
if (authUserDto != null) {
//自动注入更新人和更新用户名
this.strictUpdateFill(metaObject, "updaterId", String.class, authUserDto.getUserBizId());
this.strictUpdateFill(metaObject, "updaterName", String.class, authUserDto.getUsername());
}
} }
}; };
} }
......
package com.yd.csf.service.dto; package com.yd.csf.service.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.common.dto.PageDto; import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import java.time.LocalDate;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
...@@ -32,15 +32,13 @@ public class CommissionExpectedQueryRequest extends PageDto { ...@@ -32,15 +32,13 @@ public class CommissionExpectedQueryRequest extends PageDto {
* 预计入账日期开始 格式:yyyy-MM-dd * 预计入账日期开始 格式:yyyy-MM-dd
*/ */
@Schema(description = "预计入账日期开始 格式:yyyy-MM-dd") @Schema(description = "预计入账日期开始 格式:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDate commissionDateStart;
private Date commissionDateStart;
/** /**
* 预计入账日期结束 格式:yyyy-MM-dd * 预计入账日期结束 格式:yyyy-MM-dd
*/ */
@Schema(description = "预计入账日期结束 格式:yyyy-MM-dd") @Schema(description = "预计入账日期结束 格式:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private LocalDate commissionDateEnd;
private Date commissionDateEnd;
/** /**
* 入账期数 * 入账期数
......
...@@ -17,9 +17,13 @@ public class FortuneAccountExportDTO implements Serializable { ...@@ -17,9 +17,13 @@ public class FortuneAccountExportDTO implements Serializable {
@ExcelProperty("转介人") @ExcelProperty("转介人")
private String broker; private String broker;
private String brokerBizId;
@ExcelProperty("所属团队") @ExcelProperty("所属团队")
private String team; private String team;
private String teamBizId;
@ExcelProperty("出账币种") @ExcelProperty("出账币种")
private String currency; private String currency;
......
...@@ -53,8 +53,7 @@ public class PolicyFollowQueryRequest extends PageDto implements Serializable { ...@@ -53,8 +53,7 @@ public class PolicyFollowQueryRequest extends PageDto implements Serializable {
* 最晚缴费日期 * 最晚缴费日期
*/ */
@Schema(description = "最晚缴费日期 格式: yyyy-MM-dd", example = "2023-01-01", format = "yyyy-MM-dd") @Schema(description = "最晚缴费日期 格式: yyyy-MM-dd", example = "2023-01-01", format = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") private String latestPaymentDate;
private Date latestPaymentDate;
/** /**
* 投保人业务id列表 * 投保人业务id列表
...@@ -84,7 +83,7 @@ public class PolicyFollowQueryRequest extends PageDto implements Serializable { ...@@ -84,7 +83,7 @@ public class PolicyFollowQueryRequest extends PageDto implements Serializable {
* 缴费年期 * 缴费年期
*/ */
@Schema(description = "缴费年期") @Schema(description = "缴费年期")
private String issueNumber; private Integer issueNumber;
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
} }
\ No newline at end of file
...@@ -35,6 +35,11 @@ public class QueryPolicyAndBrokerDto { ...@@ -35,6 +35,11 @@ public class QueryPolicyAndBrokerDto {
private String productCode; private String productCode;
/** /**
* 保险公司业务id
*/
private String insuranceCompanyBizId;
/**
* 供款年期(字典) * 供款年期(字典)
*/ */
private Integer paymentTerm; private Integer paymentTerm;
......
...@@ -30,4 +30,13 @@ public enum CommissionStatusEnum { ...@@ -30,4 +30,13 @@ public enum CommissionStatusEnum {
public String getItemValue() { public String getItemValue() {
return itemValue; return itemValue;
} }
public static String toLabel(String itemValue) {
for (CommissionStatusEnum anEnum : CommissionStatusEnum.values()) {
if (anEnum.itemValue.equals(itemValue)) {
return anEnum.getItemLabel();
}
}
return "";
}
} }
...@@ -17,8 +17,8 @@ import org.apache.commons.lang3.ObjectUtils; ...@@ -17,8 +17,8 @@ import org.apache.commons.lang3.ObjectUtils;
public enum CurrencyEnum { public enum CurrencyEnum {
// 货币枚举 // 货币枚举
USD("美元", "USD"), USD("美元", "USD"),
CNY("人民", "CNY"), CNY("人民", "CNY"),
HKD("港", "HKD"), HKD("港", "HKD"),
AUD("澳元", "AUD"), AUD("澳元", "AUD"),
JPY("日元", "JPY"), JPY("日元", "JPY"),
CAD("加元", "CAD"), CAD("加元", "CAD"),
...@@ -65,4 +65,13 @@ public enum CurrencyEnum { ...@@ -65,4 +65,13 @@ public enum CurrencyEnum {
public String getItemValue() { public String getItemValue() {
return itemValue; return itemValue;
} }
public static String toLabel(String itemValue) {
for (CurrencyEnum anEnum : CurrencyEnum.values()) {
if (anEnum.itemValue.equalsIgnoreCase(itemValue)) {
return anEnum.getItemLabel();
}
}
return "";
}
} }
package com.yd.csf.service.helper;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Component
public class FeignResultHelper {
@Resource
private ObjectMapper objectMapper;
public <T> T extractData(Result<T> result) {
if (result == null) {
throw new BusinessException(ResultCode.FAIL.getCode(), "远程调用返回null");
}
if (result.getCode() != ResultCode.SUCCESS.getCode()) {
throw new BusinessException(result.getCode(), result.getMsg());
}
return result.getData();
}
public <T> List<T> extractListData(Result<?> result, Class<T> elementType) {
if (result == null) {
throw new BusinessException(ResultCode.FAIL.getCode(), "远程调用返回null");
}
if (result.getCode() != ResultCode.SUCCESS.getCode()) {
throw new BusinessException(result.getCode(), result.getMsg());
}
Object data = result.getData();
if (data == null) {
throw new BusinessException(ResultCode.FAIL.getCode(), "远程调用 result.getData() 为 null");
}
if (data instanceof List) {
if (((List<?>) data).isEmpty()) {
throw new BusinessException(ResultCode.FAIL.getCode(), "远程调用 result.getData() 为 []");
}
return objectMapper.convertValue(
data,
objectMapper.getTypeFactory().constructCollectionType(
List.class, elementType
)
);
} else {
throw new BusinessException(ResultCode.FAIL.getCode(), "返回数据类型错误");
}
}
}
\ No newline at end of file
package com.yd.csf.service.model; package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
...@@ -342,19 +339,19 @@ public class Appointment implements Serializable { ...@@ -342,19 +339,19 @@ public class Appointment implements Serializable {
/** /**
* 创建人ID * 创建人ID
*/ */
@TableField("creator_id") @TableField(value = "creator_id", fill = FieldFill.INSERT)
private String creatorId; private String creatorId;
/** /**
* 创建人用户名 * 创建人用户名
*/ */
@TableField("creator_name") @TableField(value = "creator_name", fill = FieldFill.INSERT)
private String creatorName; private String creatorName;
/** /**
* 更新人ID * 更新人ID
*/ */
@TableField("updater_id") @TableField(value = "updater_id", fill = FieldFill.UPDATE)
private String updaterId; private String updaterId;
/** /**
......
...@@ -51,6 +51,11 @@ public class CommissionExpected implements Serializable { ...@@ -51,6 +51,11 @@ public class CommissionExpected implements Serializable {
private BigDecimal premium; private BigDecimal premium;
/** /**
* 保单币种
*/
private String policyCurrency;
/**
* 保险公司业务id * 保险公司业务id
*/ */
private String insuranceCompanyBizId; private String insuranceCompanyBizId;
......
...@@ -34,11 +34,21 @@ public class FortuneAccount implements Serializable { ...@@ -34,11 +34,21 @@ public class FortuneAccount implements Serializable {
private String broker; private String broker;
/** /**
* 转介人业务id
*/
private String brokerBizId;
/**
* 所属团队 * 所属团队
*/ */
private String team; private String team;
/** /**
* 所属团队业务id
*/
private String teamBizId;
/**
* 出账币种 * 出账币种
*/ */
private String currency; private String currency;
......
...@@ -37,7 +37,7 @@ public class PolicyBroker implements Serializable { ...@@ -37,7 +37,7 @@ public class PolicyBroker implements Serializable {
private String brokerName; private String brokerName;
/** /**
* 转介人业务ID(客户端用户表唯一业务ID) * 转介人业务ID
*/ */
private String brokerBizId; private String brokerBizId;
......
...@@ -2,6 +2,8 @@ package com.yd.csf.service.service.impl; ...@@ -2,6 +2,8 @@ package com.yd.csf.service.service.impl;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
...@@ -20,10 +22,7 @@ import com.yd.common.utils.RedisUtil; ...@@ -20,10 +22,7 @@ import com.yd.common.utils.RedisUtil;
import com.yd.csf.service.component.ReceivableService; import com.yd.csf.service.component.ReceivableService;
import com.yd.csf.service.dto.*; import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.CommissionExpectedStatusEnum; import com.yd.csf.service.enums.CommissionExpectedStatusEnum;
import com.yd.csf.service.model.Commission; import com.yd.csf.service.model.*;
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.*; import com.yd.csf.service.service.*;
import com.yd.csf.service.dao.CommissionExpectedMapper; import com.yd.csf.service.dao.CommissionExpectedMapper;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO; import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
...@@ -297,8 +296,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -297,8 +296,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
List<String> insurerCompanyBizIdList = commissionExpectedQueryRequest.getInsurerCompanyBizIdList(); List<String> insurerCompanyBizIdList = commissionExpectedQueryRequest.getInsurerCompanyBizIdList();
List<String> reconciliationCompanyBizIdList = commissionExpectedQueryRequest.getReconciliationCompanyBizIdList(); List<String> reconciliationCompanyBizIdList = commissionExpectedQueryRequest.getReconciliationCompanyBizIdList();
List<String> statusList = commissionExpectedQueryRequest.getStatusList(); List<String> statusList = commissionExpectedQueryRequest.getStatusList();
Date commissionDateStart = commissionExpectedQueryRequest.getCommissionDateStart(); LocalDate commissionDateStart = commissionExpectedQueryRequest.getCommissionDateStart();
Date commissionDateEnd = commissionExpectedQueryRequest.getCommissionDateEnd(); LocalDate commissionDateEnd = commissionExpectedQueryRequest.getCommissionDateEnd();
Integer commissionPeriod = commissionExpectedQueryRequest.getCommissionPeriod(); Integer commissionPeriod = commissionExpectedQueryRequest.getCommissionPeriod();
String productLaunchBizId = commissionExpectedQueryRequest.getProductLaunchBizId(); String productLaunchBizId = commissionExpectedQueryRequest.getProductLaunchBizId();
String commissionBizType = commissionExpectedQueryRequest.getCommissionBizType(); String commissionBizType = commissionExpectedQueryRequest.getCommissionBizType();
...@@ -314,8 +313,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -314,8 +313,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
queryWrapper.eq(ObjectUtils.isNotEmpty(commissionBizType), "commission_biz_type", commissionBizType); queryWrapper.eq(ObjectUtils.isNotEmpty(commissionBizType), "commission_biz_type", commissionBizType);
queryWrapper.in(ObjectUtils.isNotEmpty(statusList), "status", statusList); queryWrapper.in(ObjectUtils.isNotEmpty(statusList), "status", statusList);
// 范围查询 // 范围查询
queryWrapper.gt(ObjectUtils.isNotEmpty(commissionDateStart), "commission_date", commissionDateStart); queryWrapper.ge(ObjectUtils.isNotEmpty(commissionDateStart), "commission_date", commissionDateStart);
queryWrapper.lt(ObjectUtils.isNotEmpty(commissionDateEnd), "commission_date", commissionDateEnd); queryWrapper.le(ObjectUtils.isNotEmpty(commissionDateEnd), "commission_date", commissionDateEnd);
// 转介人所属团队业务ID 关联保单表查询 // 转介人所属团队业务ID 关联保单表查询
if (StringUtils.isNotBlank(teamBizId)) { 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})", queryWrapper.apply("EXISTS (SELECT 1 FROM policy_broker pb WHERE pb.policy_no = commission_expected.policy_no AND pb.team_biz_id = {0})",
...@@ -545,11 +544,37 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -545,11 +544,37 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
expectedStatisticsVO.setPendingPaidAmount(BigDecimal.ZERO); expectedStatisticsVO.setPendingPaidAmount(BigDecimal.ZERO);
expectedStatisticsVO.setPaidAmountRatio(BigDecimal.ZERO); expectedStatisticsVO.setPaidAmountRatio(BigDecimal.ZERO);
expectedStatisticsVO.setTotalPolicyCount(0); expectedStatisticsVO.setTotalPolicyCount(0);
expectedStatisticsVO.setTotalPremium(BigDecimal.ZERO);
return expectedStatisticsVO; return expectedStatisticsVO;
} }
// 自定义统计数据 // 自定义统计数据
CommissionExpectedStatisticsVO commissionStatistics = baseMapper.getExpectedStatistics(expectedIds); CommissionExpectedStatisticsVO commissionStatistics = baseMapper.getExpectedStatistics(expectedIds);
// 计算总保费
String policyNos = commissionStatistics.getPolicyNos();
if (ObjectUtils.isNotEmpty(policyNos)) {
List<CommissionExpected> commissionExpectedList = this.listByIds(expectedIds);
Map<String, BigDecimal> exchangeRateMap = new HashMap<>();
for (CommissionExpected commissionExpected : commissionExpectedList) {
exchangeRateMap.put(commissionExpected.getPolicyNo(), commissionExpected.getDefaultExchangeRate());
}
Set<String> policyNoSet = commissionExpectedList.stream().map(CommissionExpected::getPolicyNo).collect(Collectors.toSet());
// 查询总保费
List<Policy> policyList = policyService.lambdaQuery().in(Policy::getPolicyNo, policyNoSet).list();
BigDecimal totalPremium = BigDecimal.ZERO;
if (CollectionUtils.isNotEmpty(policyList)) {
for (Policy policy : policyList) {
BigDecimal exchangeRate = exchangeRateMap.getOrDefault(policy.getPolicyNo(), BigDecimal.ONE);
totalPremium = totalPremium.add(policy.getTotalPaymentPremium().multiply(exchangeRate));
}
commissionStatistics.setTotalPremium(totalPremium);
}
} else {
commissionStatistics.setTotalPremium(BigDecimal.ZERO);
}
BigDecimal totalAmount = commissionStatistics.getTotalAmount(); BigDecimal totalAmount = commissionStatistics.getTotalAmount();
BigDecimal totalPaidAmount = commissionStatistics.getTotalPaidAmount(); BigDecimal totalPaidAmount = commissionStatistics.getTotalPaidAmount();
// 计算待入账金额 // 计算待入账金额
...@@ -608,12 +633,15 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -608,12 +633,15 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
// 匹配规格并获取不匹配的条件 // 匹配规格并获取不匹配的条件
MatchResult matchResult = matchExpectedSpecies( MatchResult matchResult = matchExpectedSpecies(
expectedSpeciesList, paymentTerm, reconciliationCompanyBizId, expectedSpeciesList, paymentTerm, reconciliationCompanyBizId,
policyHolderAge, paymentPremium, effectiveDate); policyHolderAge, paymentPremium, effectiveDate, policy);
if (matchResult.getMatchedList().isEmpty()) { if (matchResult.getMatchedList().isEmpty()) {
String errorMsg = matchResult.getUnmatchedConditions().isEmpty() String errorMsg = matchResult.getUnmatchedConditions().isEmpty()
? "未查询到对应供款年期的佣金规格" ? "未查询到对应供款年期的佣金规格"
: "未查询到对应供款年期的佣金规格,不匹配条件:" + String.join("、", matchResult.getUnmatchedConditions()); : "未查询到对应供款年期的佣金规格,不匹配条件:" + String.join("、", matchResult.getUnmatchedConditions());
log.info("未查询到对应供款年期的佣金规格,当前规格:{}", JSONUtil.toJsonStr(expectedSpeciesList));
throw new BusinessException(ResultCode.FAIL.getCode(), errorMsg); throw new BusinessException(ResultCode.FAIL.getCode(), errorMsg);
} }
...@@ -630,6 +658,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -630,6 +658,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
commissionExpected.setCommissionBizType("R"); commissionExpected.setCommissionBizType("R");
commissionExpected.setPolicyNo(policyNo); commissionExpected.setPolicyNo(policyNo);
commissionExpected.setPremium(paymentPremium); commissionExpected.setPremium(paymentPremium);
commissionExpected.setPolicyCurrency(policy.getCurrency());
commissionExpected.setInsuranceCompanyBizId(insuranceCompanyBizId); commissionExpected.setInsuranceCompanyBizId(insuranceCompanyBizId);
commissionExpected.setProductLaunchBizId(productLaunchBizId); commissionExpected.setProductLaunchBizId(productLaunchBizId);
commissionExpected.setReconciliationCompany(reconciliationCompany); commissionExpected.setReconciliationCompany(reconciliationCompany);
...@@ -705,7 +734,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -705,7 +734,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
*/ */
private MatchResult matchExpectedSpecies(List<ApiExpectedSpeciesListResponse> expectedSpeciesList, private MatchResult matchExpectedSpecies(List<ApiExpectedSpeciesListResponse> expectedSpeciesList,
String paymentTerm, String reconciliationCompanyId, String paymentTerm, String reconciliationCompanyId,
Integer policyHolderAge, BigDecimal paymentPremium, Date effectiveDate) { Integer policyHolderAge, BigDecimal paymentPremium, Date effectiveDate, Policy policy) {
List<String> unmatchedConditions = new ArrayList<>(); List<String> unmatchedConditions = new ArrayList<>();
List<ApiExpectedSpeciesListResponse> currentList = expectedSpeciesList; List<ApiExpectedSpeciesListResponse> currentList = expectedSpeciesList;
...@@ -720,7 +749,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -720,7 +749,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
// 检查对账公司 // 检查对账公司
currentList = filterAndCheck(currentList, currentList = filterAndCheck(currentList,
i -> reconciliationCompanyId.equals(i.getReconciliationCompany()), i -> reconciliationCompanyId.equals(i.getReconciliationCompany()),
unmatchedConditions, "对账公司[" + reconciliationCompanyId + "]"); unmatchedConditions, "对账公司[" + policy.getReconciliationCompany() + "]");
if (unmatchedConditions.size() > 0) { if (unmatchedConditions.size() > 0) {
return new MatchResult(Collections.emptyList(), unmatchedConditions); return new MatchResult(Collections.emptyList(), unmatchedConditions);
} }
...@@ -741,7 +770,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -741,7 +770,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
// 检查生效日期 // 检查生效日期
currentList = filterAndCheck(currentList, currentList = filterAndCheck(currentList,
i -> isEffective(i.getEffectiveStart(), i.getEffectiveEnd(), effectiveDate), i -> isEffective(i.getEffectiveStart(), i.getEffectiveEnd(), effectiveDate),
unmatchedConditions, "生效日期[" + effectiveDate + "]"); unmatchedConditions, "生效日期[" + DateUtil.format(effectiveDate, "yyyy-MM-dd") + "]");
if (unmatchedConditions.size() > 0) { if (unmatchedConditions.size() > 0) {
return new MatchResult(Collections.emptyList(), unmatchedConditions); return new MatchResult(Collections.emptyList(), unmatchedConditions);
} }
......
...@@ -28,15 +28,12 @@ import com.yd.csf.service.vo.CommissionStatisticsVO; ...@@ -28,15 +28,12 @@ import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO; import com.yd.csf.service.vo.CommissionVO;
import com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyFeignClient; import com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyFeignClient;
import com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest; import com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest;
import com.yd.user.feign.client.sysdict.ApiSysDictFeignClient;
import com.yd.user.feign.response.sysdict.GetDictItemListByDictTypeResponse;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils; import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronization;
...@@ -272,7 +269,6 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -272,7 +269,6 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (policy != null) { if (policy != null) {
// 填充保费、产品名称、保险公司、对账公司 // 填充保费、产品名称、保险公司、对账公司
commission.setPremium(String.valueOf(policy.getPaymentPremium())); commission.setPremium(String.valueOf(policy.getPaymentPremium()));
commission.setCurrency(policy.getCurrency());
commission.setPolicyCurrency(policy.getCurrency()); commission.setPolicyCurrency(policy.getCurrency());
commission.setProductLaunchBizId(policy.getProductLaunchBizId()); commission.setProductLaunchBizId(policy.getProductLaunchBizId());
commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId()); commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
...@@ -299,7 +295,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -299,7 +295,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
} }
// 计算来佣金额(港币) // 计算来佣金额(港币)
commission.setHkdAmount(calculateHKDAmount(commission.getAmount(), commission.getExchangeRate(), commission.getCurrency())); commission.setHkdAmount(calculateHKDAmount(commission.getAmount(), commission.getCurrency()));
} }
} }
...@@ -378,11 +374,13 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -378,11 +374,13 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (commission == null) { if (commission == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到该来佣记录"); throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "未找到该来佣记录");
} }
Policy policy = null;
if (StringUtils.isNotBlank(commission.getPolicyNo())) { if (StringUtils.isNotBlank(commission.getPolicyNo())) {
Policy policy = policyService.lambdaQuery().eq(Policy::getPolicyNo, commission.getPolicyNo()).one(); policy = policyService.lambdaQuery().eq(Policy::getPolicyNo, commission.getPolicyNo()).one();
if (policy == null) { if (policy == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "保单不存在:" + commission.getPolicyNo()); throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "保单不存在:" + commission.getPolicyNo());
} }
commission.setPolicyCurrency(policy.getCurrency());
} }
BigDecimal requestAmount = commissionUpdateRequest.getAmount(); BigDecimal requestAmount = commissionUpdateRequest.getAmount();
...@@ -401,10 +399,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -401,10 +399,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
} }
} }
// 计算来佣金额(港币) // 计算来佣金额(港币)
commission.setHkdAmount(calculateHKDAmount( commission.setHkdAmount(calculateHKDAmount(requestAmount, commissionUpdateRequest.getCurrency()));
requestAmount,
commissionUpdateRequest.getExchangeRate(),
commissionUpdateRequest.getCurrency()));
// 获取当前登录用户 // 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser(); AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
...@@ -442,10 +437,14 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -442,10 +437,14 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
return true; return true;
} }
private BigDecimal calculateHKDAmount(BigDecimal requestAmount, BigDecimal exchangeRate, String currency) { private BigDecimal calculateHKDAmount(BigDecimal requestAmount, String currency) {
if ("HKD".equalsIgnoreCase(currency)) { if ("HKD".equalsIgnoreCase(currency)) {
return requestAmount; return requestAmount;
} }
// 查询入账币种到港币的汇率
BigDecimal exchangeRate = queryExchangeRateByFeign(currency, "HKD");
return requestAmount.multiply(exchangeRate); return requestAmount.multiply(exchangeRate);
} }
...@@ -629,6 +628,15 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -629,6 +628,15 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
} }
filteredExpectedFortuneList2.add(expectedFortune); filteredExpectedFortuneList2.add(expectedFortune);
} }
// 2.3 校验预计发佣记录是否有出账币种、默认结算汇率
for (ExpectedFortune expectedFortune : filteredExpectedFortuneList2) {
if (StringUtils.isBlank(expectedFortune.getCurrency())) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计发佣记录" + expectedFortune.getExpectedFortuneBizId() + "未配置出账币种");
}
if (expectedFortune.getDefaultExchangeRate() == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计发佣记录" + expectedFortune.getExpectedFortuneBizId() + "未配置默认结算汇率");
}
}
// 3. 构建实际的初始发佣记录 // 3. 构建实际的初始发佣记录
List<Fortune> newFortuneList = buildNewFortunes(filteredExpectedFortuneList2, commissions); List<Fortune> newFortuneList = buildNewFortunes(filteredExpectedFortuneList2, commissions);
...@@ -721,7 +729,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -721,7 +729,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (result != null && result.getData() != null) { if (result != null && result.getData() != null) {
return result.getData(); return result.getData();
} }
return null; return BigDecimal.ONE;
} }
/** /**
...@@ -748,7 +756,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -748,7 +756,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "当前结算汇率不能为空"); throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "当前结算汇率不能为空");
} }
// 获取保单币种 // 获取保单币种
String currency = commissionExpected.getCurrency(); String currency = commissionExpected.getPolicyCurrency();
// 如果当前入账币种等于保单币种,直接计算来佣比例 // 如果当前入账币种等于保单币种,直接计算来佣比例
if (StringUtils.equalsIgnoreCase(currentCurrency, currency)) { if (StringUtils.equalsIgnoreCase(currentCurrency, currency)) {
...@@ -824,8 +832,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -824,8 +832,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
for (CommissionAddRequest request : customerAddRequestList) { for (CommissionAddRequest request : customerAddRequestList) {
Commission commission = new Commission(); Commission commission = new Commission();
BeanUtils.copyProperties(request, commission); BeanUtils.copyProperties(request, commission);
// 计算来佣金额(港币) // 计算来佣金额(港币)
commission.setHkdAmount(calculateHKDAmount(request.getAmount(), request.getExchangeRate(), request.getCurrency())); commission.setHkdAmount(calculateHKDAmount(request.getAmount(), request.getCurrency()));
// 入账业务id // 入账业务id
commission.setCommissionBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_COMMISSION.getCode())); commission.setCommissionBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_COMMISSION.getCode()));
// 关联业务id // 关联业务id
...@@ -838,7 +847,6 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -838,7 +847,6 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commission.setProductLaunchBizId(policy.getProductLaunchBizId()); commission.setProductLaunchBizId(policy.getProductLaunchBizId());
commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId()); commission.setInsuranceCompanyBizId(policy.getInsuranceCompanyBizId());
commission.setPremium(Convert.toStr(policy.getPaymentPremium())); commission.setPremium(Convert.toStr(policy.getPaymentPremium()));
commission.setCurrency(policy.getCurrency());
commission.setPolicyCurrency(policy.getCurrency()); commission.setPolicyCurrency(policy.getCurrency());
} else { } else {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单不存在, policyNo: " + request.getPolicyNo()); throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "保单不存在, policyNo: " + request.getPolicyNo());
...@@ -857,23 +865,24 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -857,23 +865,24 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
commissionList.add(commission); commissionList.add(commission);
} }
// 提交事务,保存数据 // 1. 先保存主数据
transactionTemplate.execute(status -> { saveOrUpdateBatch(commissionList);
saveOrUpdateBatch(commissionList);
return null;
});
// 开启新事务,比对数据 // 2. 事务提交后执行比对
transactionTemplate.execute(status -> { TransactionSynchronizationManager.registerSynchronization(
try { new TransactionSynchronization() {
commissionAsyncService.commissionCompareBatch(commissionList); @Override
} catch (Exception e) { public void afterCommit() {
// 比对失败不影响主事务,记录日志即可 try {
e.printStackTrace(); // 这里会开启新事务执行更新
log.error("批量新增, 比对操作执行失败, error: {}", e.getMessage()); commissionAsyncService.commissionCompareBatch(commissionList);
} } catch (Exception e) {
return null; log.error("比对更新失败", e);
}); // 可以发送告警或记录失败任务
}
}
}
);
return commissionList; return commissionList;
} }
...@@ -941,6 +950,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -941,6 +950,9 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
if (ObjectUtils.isEmpty(request.getAmount())) { if (ObjectUtils.isEmpty(request.getAmount())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "入账金额不能为空"); throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "入账金额不能为空");
} }
if (ObjectUtils.isEmpty(request.getExchangeRate())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "结算汇率不能为空");
}
if ("R".equals(request.getCommissionBizType())) { if ("R".equals(request.getCommissionBizType())) {
// 校验保单号是否存在 // 校验保单号是否存在
if (ObjectUtils.isEmpty(request.getExchangeRate())) { if (ObjectUtils.isEmpty(request.getExchangeRate())) {
......
...@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; ...@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest; import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse; import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.service.enums.CurrencyEnum;
import com.yd.csf.service.model.ExpectedFortune; import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.dao.ExpectedFortuneMapper; import com.yd.csf.service.dao.ExpectedFortuneMapper;
import com.yd.csf.service.model.Policy; import com.yd.csf.service.model.Policy;
...@@ -133,6 +134,8 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe ...@@ -133,6 +134,8 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
ApiExpectedFortunePageResponse vo = new ApiExpectedFortunePageResponse(); ApiExpectedFortunePageResponse vo = new ApiExpectedFortunePageResponse();
BeanUtils.copyProperties(ef, vo); BeanUtils.copyProperties(ef, vo);
vo.setCurrency(CurrencyEnum.toLabel(ef.getCurrency()));
String ratio = finalBrokerRatioMap.get(ef.getBrokerBizId()); String ratio = finalBrokerRatioMap.get(ef.getBrokerBizId());
vo.setCommissionRatio(ratio); vo.setCommissionRatio(ratio);
......
...@@ -122,7 +122,9 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper, ...@@ -122,7 +122,9 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
FortuneAccount fortuneAccount = new FortuneAccount(); FortuneAccount fortuneAccount = new FortuneAccount();
fortuneAccount.setFortuneAccountBizId(RandomStringGenerator.generateBizId16("fortune_account")); fortuneAccount.setFortuneAccountBizId(RandomStringGenerator.generateBizId16("fortune_account"));
fortuneAccount.setBroker(accountExportDTO.getBroker()); fortuneAccount.setBroker(accountExportDTO.getBroker());
fortuneAccount.setBrokerBizId(accountExportDTO.getBrokerBizId());
fortuneAccount.setTeam(accountExportDTO.getTeam()); fortuneAccount.setTeam(accountExportDTO.getTeam());
fortuneAccount.setTeamBizId(accountExportDTO.getTeamBizId());
fortuneAccount.setCurrency(accountExportDTO.getCurrency()); fortuneAccount.setCurrency(accountExportDTO.getCurrency());
fortuneAccount.setHkdAmount(accountExportDTO.getAmount()); fortuneAccount.setHkdAmount(accountExportDTO.getAmount());
fortuneAccount.setFortuneAccountDate(currentDate); fortuneAccount.setFortuneAccountDate(currentDate);
...@@ -161,6 +163,10 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper, ...@@ -161,6 +163,10 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
updateFortune.setId(item.getId()); updateFortune.setId(item.getId());
updateFortune.setFortuneAccountBizId(fortuneAccountBizId); updateFortune.setFortuneAccountBizId(fortuneAccountBizId);
updateFortune.setStatus(FortuneStatusEnum.CHECKED.getItemValue()); updateFortune.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
// 处理金额字段
updateFortune.setCurrentPaymentHkdAmount(item.getHkdAmount());
updateFortune.setCurrentPaymentRatio(BigDecimal.valueOf(100));
updateFortune.setReconciliationOperator(currentLoginUser.getUsername());
updateFortuneList.add(updateFortune); updateFortuneList.add(updateFortune);
} }
} }
...@@ -283,6 +289,10 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper, ...@@ -283,6 +289,10 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
.list(); .list();
if (CollectionUtils.isNotEmpty(fortunes)) { if (CollectionUtils.isNotEmpty(fortunes)) {
fortunes.forEach(f -> { fortunes.forEach(f -> {
if (f.getCurrentPaymentHkdAmount() == null) {
f.setCurrentPaymentHkdAmount(f.getHkdAmount());
f.setCurrentPaymentRatio(BigDecimal.valueOf(100));
}
f.setStatus(FortuneStatusEnum.SENT.getItemValue()); f.setStatus(FortuneStatusEnum.SENT.getItemValue());
f.setActualPayoutDate(new Date()); f.setActualPayoutDate(new Date());
f.setUpdaterId(loginUserId.toString()); f.setUpdaterId(loginUserId.toString());
...@@ -306,20 +316,20 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper, ...@@ -306,20 +316,20 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
.last("FOR UPDATE") .last("FOR UPDATE")
.list(); .list();
// 4.3 全量汇总:把同一 expected_fortune 下所有 fortune 的 current_payment_amount 求和 // 4.3 全量汇总:把同一 expected_fortune 下所有 fortune 的 current_payment_hkd_amount 求和
Map<String, BigDecimal> paidMap = fortuneService.lambdaQuery() Map<String, BigDecimal> paidMap = fortuneService.lambdaQuery()
.in(Fortune::getExpectedFortuneBizId, expectedIds) .in(Fortune::getExpectedFortuneBizId, expectedIds)
.eq(Fortune::getStatus, FortuneStatusEnum.SENT.getItemValue()) .eq(Fortune::getStatus, FortuneStatusEnum.SENT.getItemValue())
.list() .list()
.stream() .stream()
.collect(Collectors.groupingBy(Fortune::getExpectedFortuneBizId, .collect(Collectors.groupingBy(Fortune::getExpectedFortuneBizId,
Collectors.mapping(Fortune::getCurrentPaymentAmount, Collectors.mapping(Fortune::getCurrentPaymentHkdAmount,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add)))); Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
// 4.4 反写 expected_fortune // 4.4 反写 expected_fortune
expectedList.forEach(ef -> { expectedList.forEach(ef -> {
BigDecimal totalPaid = paidMap.getOrDefault(ef.getExpectedFortuneBizId(), BigDecimal.ZERO); BigDecimal totalPaid = paidMap.getOrDefault(ef.getExpectedFortuneBizId(), BigDecimal.ZERO);
BigDecimal totalAmount = ef.getAmount(); BigDecimal totalAmount = ef.getHkdAmount();
BigDecimal unpaid = totalAmount.subtract(totalPaid); BigDecimal unpaid = totalAmount.subtract(totalPaid);
String newStatus; String newStatus;
...@@ -339,6 +349,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper, ...@@ -339,6 +349,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
.set(ExpectedFortune::getUnpaidRatio, .set(ExpectedFortune::getUnpaidRatio,
unpaid.divide(totalAmount, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100))) unpaid.divide(totalAmount, 4, RoundingMode.HALF_UP).multiply(BigDecimal.valueOf(100)))
.set(ExpectedFortune::getStatus, newStatus) .set(ExpectedFortune::getStatus, newStatus)
.set(ExpectedFortune::getActualPayoutDate, new Date())
.set(ExpectedFortune::getUpdaterId, loginUserId.toString()) .set(ExpectedFortune::getUpdaterId, loginUserId.toString())
.set(ExpectedFortune::getUpdateTime, LocalDateTime.now()) .set(ExpectedFortune::getUpdateTime, LocalDateTime.now())
.eq(ExpectedFortune::getId, ef.getId()) .eq(ExpectedFortune::getId, ef.getId())
......
...@@ -113,17 +113,17 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -113,17 +113,17 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
String appointmentNo = policyFollowQueryRequest.getAppointmentNo(); String appointmentNo = policyFollowQueryRequest.getAppointmentNo();
Date signDateStart = policyFollowQueryRequest.getSignDateStart(); Date signDateStart = policyFollowQueryRequest.getSignDateStart();
Date signDateEnd = policyFollowQueryRequest.getSignDateEnd(); Date signDateEnd = policyFollowQueryRequest.getSignDateEnd();
Date latestPaymentDate = policyFollowQueryRequest.getLatestPaymentDate(); String latestPaymentDate = policyFollowQueryRequest.getLatestPaymentDate();
List<String> insuranceCompanyBizIdList = policyFollowQueryRequest.getInsuranceCompanyBizIdList(); List<String> insuranceCompanyBizIdList = policyFollowQueryRequest.getInsuranceCompanyBizIdList();
List<String> productLaunchBizIdList = policyFollowQueryRequest.getProductLaunchBizIdList(); List<String> productLaunchBizIdList = policyFollowQueryRequest.getProductLaunchBizIdList();
String issueNumber = policyFollowQueryRequest.getIssueNumber(); Integer issueNumber = policyFollowQueryRequest.getIssueNumber();
queryWrapper.like(ObjectUtils.isNotEmpty(policyNo), "policy_no", policyNo); queryWrapper.like(ObjectUtils.isNotEmpty(policyNo), "policy_no", policyNo);
queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status); queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status);
queryWrapper.eq(ObjectUtils.isNotEmpty(appointmentNo), "appointment_no", appointmentNo); queryWrapper.eq(ObjectUtils.isNotEmpty(appointmentNo), "appointment_no", appointmentNo);
queryWrapper.ge(ObjectUtils.isNotEmpty(signDateStart), "sign_date", signDateStart); queryWrapper.ge(ObjectUtils.isNotEmpty(signDateStart), "sign_date", signDateStart);
queryWrapper.le(ObjectUtils.isNotEmpty(signDateEnd), "sign_date", signDateEnd); queryWrapper.le(ObjectUtils.isNotEmpty(signDateEnd), "sign_date", signDateEnd);
queryWrapper.ge(ObjectUtils.isNotEmpty(latestPaymentDate), "latest_payment_date", latestPaymentDate); queryWrapper.eq(ObjectUtils.isNotEmpty(latestPaymentDate), "latest_payment_date", latestPaymentDate);
if (CollectionUtils.isNotEmpty(insuranceCompanyBizIdList)) { if (CollectionUtils.isNotEmpty(insuranceCompanyBizIdList)) {
queryWrapper.in("insurance_company_biz_id", insuranceCompanyBizIdList); queryWrapper.in("insurance_company_biz_id", insuranceCompanyBizIdList);
...@@ -503,20 +503,21 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -503,20 +503,21 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
if (policy == null) { if (policy == null) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR.getCode(), "policy不存在"); throw new BusinessException(ErrorCode.NOT_FOUND_ERROR.getCode(), "policy不存在");
} }
BigDecimal paymentPremium = policy.getPaymentPremium(); // 新单跟进,校验 policy 数据
if (paymentPremium == null) { policyFollowChangeStatusValidPolicy(policy);
throw new BusinessException("期交保费不能为空");
} // 新单跟进,校验 policyFollow 数据
Object paymentTerm = policy.getPaymentTerm(); policyFollowChangeStatusValidPolicyFollow(policyFollow);
if (paymentTerm == null) {
throw new BusinessException("供款期数不能为空");
}
policy.setPolicyNo(policyFollow.getPolicyNo()); policy.setPolicyNo(policyFollow.getPolicyNo());
policy.setPolicyHolderAge(calculatePolicyHolderAge(policyFollow.getCustomerBizId())); policy.setPolicyHolderAge(calculatePolicyHolderAge(policyFollow.getCustomerBizId()));
policy.setCoolingOffEndDate(policyFollow.getCoolingOffEndDate()); policy.setCoolingOffEndDate(policyFollow.getCoolingOffEndDate());
policy.setReconciliationCompanyBizId(policyFollow.getReconciliationCompanyBizId()); policy.setReconciliationCompanyBizId(policyFollow.getReconciliationCompanyBizId());
policy.setReconciliationCompanyCode(policyFollow.getReconciliationCompanyCode()); policy.setReconciliationCompanyCode(policyFollow.getReconciliationCompanyCode());
policy.setReconciliationCompany(policyFollow.getReconciliationCompany()); policy.setReconciliationCompany(policyFollow.getReconciliationCompany());
policy.setInsuranceCompanyBizId(policyFollow.getInsuranceCompanyBizId());
policy.setInsuranceCompany(policyFollow.getInsuranceCompany());
policy.setProductName(policyFollow.getProductName());
// 更新保单状态为生效 // 更新保单状态为生效
policy.setStatus(PolicyStatusEnum.INFORCE.getItemValue()); policy.setStatus(PolicyStatusEnum.INFORCE.getItemValue());
// 手动映射不同名的字段 // 手动映射不同名的字段
...@@ -529,20 +530,24 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -529,20 +530,24 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
//冷静期结束日期 //冷静期结束日期
policy.setCoolingOffEndDate(changePolicyFollowStatusRequest.getCoolingOffEndDate() != null ? changePolicyFollowStatusRequest.getCoolingOffEndDate() : policy.getCoolingOffEndDate()); policy.setCoolingOffEndDate(changePolicyFollowStatusRequest.getCoolingOffEndDate() != null ? changePolicyFollowStatusRequest.getCoolingOffEndDate() : policy.getCoolingOffEndDate());
if (ObjectUtils.isEmpty(policy.getInsuranceCompany()) || ObjectUtils.isEmpty(policy.getInsuranceCompany())) { // if (ObjectUtils.isEmpty(policy.getInsuranceCompany()) || ObjectUtils.isEmpty(policy.getInsuranceCompanyBizId())) {
// 获取保单产品信息,填充对账公司相关字段 // // 获取保单产品信息,填充对账公司相关字段
PolicyProductInfo productInfo = getPolicyProductInfo(policyFollow.getProductLaunchBizId()); // PolicyProductInfo productInfo = getPolicyProductInfo(policyFollow.getProductLaunchBizId());
if (productInfo != null) { // if (productInfo != null) {
policy.setInsuranceCompany(productInfo.getInsuranceCompany()); // if (ObjectUtils.isNotEmpty(productInfo.getInsuranceCompany())) {
policy.setInsuranceCompanyBizId(productInfo.getInsuranceCompanyBizId()); // policy.setInsuranceCompany(productInfo.getInsuranceCompany());
if (ObjectUtils.isEmpty(policy.getReconciliationCompany())) { // }
policy.setReconciliationCompany(productInfo.getReconciliationCompany()); // if (ObjectUtils.isNotEmpty(productInfo.getInsuranceCompanyBizId())) {
} // policy.setInsuranceCompanyBizId(productInfo.getInsuranceCompanyBizId());
if (ObjectUtils.isEmpty(policy.getReconciliationCompanyBizId())) { // }
policy.setReconciliationCompanyBizId(productInfo.getReconciliationCompanyBizId()); // if (ObjectUtils.isNotEmpty(productInfo.getReconciliationCompanyBizId())) {
} // policy.setReconciliationCompany(productInfo.getReconciliationCompany());
} // }
} // if (ObjectUtils.isNotEmpty(productInfo.getReconciliationCompanyBizId())) {
// policy.setReconciliationCompanyBizId(productInfo.getReconciliationCompanyBizId());
// }
// }
// }
// 保存保单 // 保存保单
policyService.updateById(policy); policyService.updateById(policy);
...@@ -573,6 +578,41 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -573,6 +578,41 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
return true; return true;
} }
private void policyFollowChangeStatusValidPolicyFollow(PolicyFollow policyFollow) {
if (ObjectUtils.isEmpty(policyFollow.getReconciliationCompanyBizId())) {
throw new BusinessException("新单跟进-基础数据,reconciliationCompanyBizId 不能为空");
}
if (ObjectUtils.isEmpty(policyFollow.getReconciliationCompanyCode())) {
throw new BusinessException("新单跟进-基础数据,reconciliationCompanyCode 不能为空");
}
if (ObjectUtils.isEmpty(policyFollow.getReconciliationCompany())) {
throw new BusinessException("新单跟进-基础数据,reconciliationCompany 不能为空");
}
if (ObjectUtils.isEmpty(policyFollow.getInsuranceCompanyBizId())) {
throw new BusinessException("新单跟进-基础数据,insuranceCompanyBizId 不能为空");
}
if (ObjectUtils.isEmpty(policyFollow.getInsuranceCompany())) {
throw new BusinessException("新单跟进-基础数据,insuranceCompany 不能为空");
}
if (ObjectUtils.isEmpty(policyFollow.getProductName())) {
throw new BusinessException("新单跟进-基础数据,productName 不能为空");
}
if (ObjectUtils.isEmpty(policyFollow.getProductLaunchBizId())) {
throw new BusinessException("新单跟进-基础数据,productLaunchBizId 不能为空");
}
}
private void policyFollowChangeStatusValidPolicy(Policy policy) {
BigDecimal paymentPremium = policy.getPaymentPremium();
if (paymentPremium == null) {
throw new BusinessException("期交保费不能为空");
}
Object paymentTerm = policy.getPaymentTerm();
if (paymentTerm == null) {
throw new BusinessException("供款期数不能为空");
}
}
private BigDecimal calculateTotalPaymentPremium(Policy policy) { private BigDecimal calculateTotalPaymentPremium(Policy policy) {
BigDecimal paymentPremium = policy.getPaymentPremium(); BigDecimal paymentPremium = policy.getPaymentPremium();
Object paymentTerm = policy.getPaymentTerm(); Object paymentTerm = policy.getPaymentTerm();
...@@ -667,9 +707,11 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -667,9 +707,11 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
currency = "USD"; currency = "USD";
break; break;
case "人民幣": case "人民幣":
case "人民币":
currency = "CNY"; currency = "CNY";
break; break;
case "港幣": case "港幣":
case "港币":
currency = "HKD"; currency = "HKD";
break; break;
case "澳元": case "澳元":
...@@ -682,6 +724,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -682,6 +724,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
currency = "EUR"; currency = "EUR";
break; break;
case "英鎊": case "英鎊":
case "英镑":
currency = "GBP"; currency = "GBP";
break; break;
case "新加坡元": case "新加坡元":
......
package com.yd.csf.service.vo; package com.yd.csf.service.vo;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
...@@ -39,4 +40,13 @@ public class CommissionExpectedStatisticsVO { ...@@ -39,4 +40,13 @@ public class CommissionExpectedStatisticsVO {
*/ */
@Schema(description = "总保单数") @Schema(description = "总保单数")
private Integer totalPolicyCount; private Integer totalPolicyCount;
/**
* 总保费(HKD)
*/
@Schema(description = "总保费(HKD)")
private BigDecimal totalPremium;
@JsonIgnore
private String policyNos;
} }
package com.yd.csf.service.vo; package com.yd.csf.service.vo;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.enums.CommissionStatusEnum;
import com.yd.csf.service.model.Commission; import com.yd.csf.service.model.Commission;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
...@@ -165,6 +166,12 @@ public class CommissionVO implements Serializable { ...@@ -165,6 +166,12 @@ public class CommissionVO implements Serializable {
private String commissionStatus; private String commissionStatus;
/** /**
* 比对状态名称
*/
@Schema(description = "比对状态 0=未比对 1=比对成功 2=比对失败 3=未匹配到预计入账记录 字典值: csf_commission_status")
private String commissionStatusName;
/**
* 预计来佣业务id * 预计来佣业务id
*/ */
@Schema(description = "预计来佣业务id") @Schema(description = "预计来佣业务id")
...@@ -246,7 +253,9 @@ public class CommissionVO implements Serializable { ...@@ -246,7 +253,9 @@ public class CommissionVO implements Serializable {
} }
CommissionVO commissionVO = new CommissionVO(); CommissionVO commissionVO = new CommissionVO();
BeanUtils.copyProperties(commission, commissionVO); BeanUtils.copyProperties(commission, commissionVO);
commissionVO.setCommissionStatus(commission.getStatus()); commissionVO.setCommissionStatus(commission.getStatus());
commissionVO.setCommissionStatusName(CommissionStatusEnum.toLabel(commission.getStatus()));
return commissionVO; return commissionVO;
} }
} }
package com.yd.csf.service.vo; package com.yd.csf.service.vo;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.csf.service.model.ExpectedFortune; import com.yd.csf.service.enums.CurrencyEnum;
import com.yd.csf.service.model.Fortune; import com.yd.csf.service.model.Fortune;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
...@@ -9,7 +11,6 @@ import org.springframework.beans.BeanUtils; ...@@ -9,7 +11,6 @@ import org.springframework.beans.BeanUtils;
import java.io.Serializable; import java.io.Serializable;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.Date; import java.util.Date;
...@@ -232,7 +233,7 @@ public class FortuneVO implements Serializable { ...@@ -232,7 +233,7 @@ public class FortuneVO implements Serializable {
*/ */
@Schema(description = "出账日(实)") @Schema(description = "出账日(实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate actualPayoutDate; private Date actualPayoutDate;
/** /**
* 是否含税 0=No, 1=Yes * 是否含税 0=No, 1=Yes
...@@ -328,12 +329,16 @@ public class FortuneVO implements Serializable { ...@@ -328,12 +329,16 @@ public class FortuneVO implements Serializable {
} }
FortuneVO fortuneVO = new FortuneVO(); FortuneVO fortuneVO = new FortuneVO();
BeanUtils.copyProperties(fortune, fortuneVO); BeanUtils.copyProperties(fortune, fortuneVO);
// 待出账比例 // 计算待出账比例
if (fortuneVO.getCurrentPaymentRatio() != null) { BigDecimal currentPaymentRatio = ObjectUtil.defaultIfNull(fortuneVO.getCurrentPaymentRatio(), BigDecimal.ZERO);
fortuneVO.setFortuneUnpaidRatio(BigDecimal.valueOf(100).subtract(fortuneVO.getCurrentPaymentRatio())); fortuneVO.setCurrentPaymentRatio(currentPaymentRatio);
} else { fortuneVO.setFortuneUnpaidRatio(BigDecimal.valueOf(100).subtract(currentPaymentRatio));
fortuneVO.setFortuneUnpaidRatio(BigDecimal.valueOf(100));
} fortuneVO.setFortunePaidAmount(fortune.getCurrentPaymentHkdAmount());
fortuneVO.setFortuneUnpaidAmount(NumberUtil.sub(fortune.getHkdAmount(), fortune.getCurrentPaymentHkdAmount()));
fortuneVO.setCurrency(CurrencyEnum.toLabel(fortune.getCurrency()));
fortuneVO.setPolicyCurrency((CurrencyEnum.toLabel(fortune.getPolicyCurrency())));
return fortuneVO; return fortuneVO;
} }
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
<result property="commissionBizType" column="commission_biz_type" /> <result property="commissionBizType" column="commission_biz_type" />
<result property="policyNo" column="policy_no" /> <result property="policyNo" column="policy_no" />
<result property="premium" column="premium" /> <result property="premium" column="premium" />
<result property="policyCurrency" column="policy_currency" />
<result property="insuranceCompanyBizId" column="insurance_company_biz_id" /> <result property="insuranceCompanyBizId" column="insurance_company_biz_id" />
<result property="productLaunchBizId" column="product_launch_biz_id" /> <result property="productLaunchBizId" column="product_launch_biz_id" />
<result property="reconciliationCompany" column="reconciliation_company" /> <result property="reconciliationCompany" column="reconciliation_company" />
...@@ -41,7 +42,7 @@ ...@@ -41,7 +42,7 @@
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id,commission_expected_biz_id,receivable_no,commission_biz_type, id,commission_expected_biz_id,receivable_no,commission_biz_type,
policy_no,premium,insurance_company_biz_id,product_launch_biz_id, policy_no,premium,policy_currency,insurance_company_biz_id,product_launch_biz_id,
reconciliation_company,reconciliation_company_code,reconciliation_company_biz_id,commission_period, 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, total_period,commission_name,commission_type,commission_ratio,amount,currency,default_exchange_rate,expected_amount,
commission_date,status,status_desc,paid_amount,paid_ratio,remark,is_deleted,creator_id, commission_date,status,status_desc,paid_amount,paid_ratio,remark,is_deleted,creator_id,
...@@ -52,9 +53,10 @@ ...@@ -52,9 +53,10 @@
SELECT SELECT
IFNULL(SUM(expected_amount),0) AS totalAmount, IFNULL(SUM(expected_amount),0) AS totalAmount,
IFNULL(SUM(paid_amount),0) AS totalPaidAmount, IFNULL(SUM(paid_amount),0) AS totalPaidAmount,
COUNT(DISTINCT policy_no) AS totalPolicyCount COUNT(DISTINCT policy_no) AS totalPolicyCount,
GROUP_CONCAT(DISTINCT policy_no) AS policyNos
FROM FROM
commission_expected commission_expected ce
<where> <where>
<if test="expectedIds != null and expectedIds.size > 0"> <if test="expectedIds != null and expectedIds.size > 0">
id IN id IN
...@@ -73,7 +75,7 @@ ...@@ -73,7 +75,7 @@
MAX(ce.reconciliation_company_biz_id) as reconciliationCompanyBizId, MAX(ce.reconciliation_company_biz_id) as reconciliationCompanyBizId,
ce.commission_period as commissionPeriod, ce.commission_period as commissionPeriod,
MAX(ce.total_period) as totalPeriod, MAX(ce.total_period) as totalPeriod,
DATE_ADD(DATE_ADD(MAX(p.effective_date), INTERVAL 2 MONTH), INTERVAL (ce.commission_period - 1) YEAR) as commissionDate, MAX(ce.commission_date) as commissionDate,
ifnull(avg(ce.commission_ratio), 0) as commissionRatio, ifnull(avg(ce.commission_ratio), 0) as commissionRatio,
ifnull(sum(ce.amount), 0) as amount, ifnull(sum(ce.amount), 0) as amount,
MAX(ce.currency) as currency, MAX(ce.currency) as currency,
......
...@@ -107,7 +107,7 @@ ...@@ -107,7 +107,7 @@
) as expectePaidAmount, ) as expectePaidAmount,
COUNT(DISTINCT c.policy_no) as totalPolicyCount, COUNT(DISTINCT c.policy_no) as totalPolicyCount,
COALESCE(p.total_payment_premium * e.default_exchange_rate, 0) AS totalPremium, COALESCE(p.total_payment_premium * e.default_exchange_rate, 0) AS totalPremium,
COUNT(DISTINCT c.reconciliation_company) as reconciliationCompanyCount, COUNT(DISTINCT c.reconciliation_company_code) as reconciliationCompanyCount,
COUNT(DISTINCT c.id) as totalCompareCommissionCount, COUNT(DISTINCT c.id) as totalCompareCommissionCount,
SUM(CASE WHEN c.status = '1' THEN 1 ELSE 0 END) as successCompareCommissionCount, SUM(CASE WHEN c.status = '1' THEN 1 ELSE 0 END) as successCompareCommissionCount,
SUM(CASE WHEN c.status = '2' THEN 1 ELSE 0 END) as failedCompareCommissionCount SUM(CASE WHEN c.status = '2' THEN 1 ELSE 0 END) as failedCompareCommissionCount
......
...@@ -8,6 +8,9 @@ ...@@ -8,6 +8,9 @@
<id property="id" column="id" /> <id property="id" column="id" />
<result property="fortuneAccountBizId" column="fortune_account_biz_id" /> <result property="fortuneAccountBizId" column="fortune_account_biz_id" />
<result property="broker" column="broker" /> <result property="broker" column="broker" />
<result property="brokerBizId" column="broker_biz_id" />
<result property="team" column="team" />
<result property="teamBizId" column="team_biz_id" />
<result property="currency" column="currency" /> <result property="currency" column="currency" />
<result property="amount" column="amount" /> <result property="amount" column="amount" />
<result property="hkdAmount" column="hkd_amount" /> <result property="hkdAmount" column="hkd_amount" />
...@@ -23,7 +26,8 @@ ...@@ -23,7 +26,8 @@
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
id,fortune_account_biz_id,broker,currency,amount,hkd_amount,status,fortune_account_date,content,remark, id,fortune_account_biz_id,broker,broker_biz_id,team,team_biz_id,
currency,amount,hkd_amount,status,fortune_account_date,content,remark,
is_deleted,creator_id,updater_id,create_time,update_time is_deleted,creator_id,updater_id,create_time,update_time
</sql> </sql>
</mapper> </mapper>
...@@ -63,13 +63,13 @@ ...@@ -63,13 +63,13 @@
<select id="getFortuneStatistics" resultType="com.yd.csf.service.dto.FortuneStatisticsVO"> <select id="getFortuneStatistics" resultType="com.yd.csf.service.dto.FortuneStatisticsVO">
SELECT SELECT
f.policy_no, f.policy_no,
SUM(CASE WHEN f.is_part = '0' THEN f.hkd_amount ELSE 0 END) AS amount, IFNULL(SUM(CASE WHEN f.is_part = '0' THEN f.hkd_amount ELSE 0 END),0) AS amount,
SUM(CASE WHEN f.status = '2' THEN f.current_payment_hkd_amount ELSE 0 END) AS sentAmount, SUM(CASE WHEN f.status = '2' THEN f.current_payment_hkd_amount ELSE 0 END) AS sentAmount,
IFNULL( IFNULL(
(select sum(unpaid_amount) (select sum(unpaid_amount)
from expected_fortune where status = '0' and policy_no = f.policy_no from expected_fortune where status = '0' and policy_no = f.policy_no
),0) AS pendingOutAmount, ),0) AS pendingOutAmount,
SUM(CASE WHEN f.status in ('6','1') THEN f.current_payment_hkd_amount ELSE 0 END) AS availableOutAmount, IFNULL(SUM(CASE WHEN f.status in ('6','1') THEN f.current_payment_hkd_amount ELSE 0 END),0) AS availableOutAmount,
COUNT(DISTINCT f.policy_no) AS totalPolicyCount COUNT(DISTINCT f.policy_no) AS totalPolicyCount
FROM fortune f FROM fortune f
WHERE 1 = 1 WHERE 1 = 1
......
...@@ -82,6 +82,7 @@ ...@@ -82,6 +82,7 @@
<result property="updaterId" column="updater_id" /> <result property="updaterId" column="updater_id" />
<result property="createTime" column="create_time" /> <result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" /> <result property="updateTime" column="update_time" />
<result property="policyType" column="policy_type" />
</resultMap> </resultMap>
<sql id="Base_Column_List"> <sql id="Base_Column_List">
...@@ -99,7 +100,7 @@ ...@@ -99,7 +100,7 @@
mailing_method,renewal_payment_method,dividend_distribution_method,delivery_no, mailing_method,renewal_payment_method,dividend_distribution_method,delivery_no,
policy_levy,initial_premium_paid,initial_premium_due,latest_payment_date,broker_sign_date, policy_levy,initial_premium_paid,initial_premium_due,latest_payment_date,broker_sign_date,
insurer_mailing_date,customer_sign_date,attachments,remark,is_deleted, insurer_mailing_date,customer_sign_date,attachments,remark,is_deleted,
creator_id,updater_id,create_time,update_time creator_id,updater_id,create_time,update_time,policy_type
</sql> </sql>
<select id="queryPolicyReportData" resultType="com.yd.csf.service.dto.PolicyReportData"> <select id="queryPolicyReportData" resultType="com.yd.csf.service.dto.PolicyReportData">
......
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