Commit cb3bd375 by zhangxingmin

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

parents 403370fd 85895940
...@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -399,11 +400,17 @@ public class ApiCommissionExpectedController { ...@@ -399,11 +400,17 @@ public class ApiCommissionExpectedController {
@GetMapping("/test_expected_commission") @GetMapping("/test_expected_commission")
@Operation(summary = "测试佣金匹配") @Operation(summary = "测试佣金匹配")
public Result<Boolean> testExpectedCommission(@RequestParam("policyNo") String policyNo) { public Result<Boolean> testExpectedCommission(@RequestParam("policyNo") String policyNo,
@RequestParam("effectiveDate") String effectiveDate,
@RequestParam("coolingOffEndDate") String coolingOffEndDate) {
if (StringUtils.isBlank(policyNo)) { if (StringUtils.isBlank(policyNo)) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyNo不能为空"); return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyNo不能为空");
} }
commissionExpectedService.testExpectedCommission(policyNo); try {
commissionExpectedService.testExpectedCommission(policyNo, effectiveDate, coolingOffEndDate);
} catch (IOException e) {
return Result.fail(ResultCode.FAIL.getCode(), "读取文件失败");
}
return Result.success(true); return Result.success(true);
} }
......
...@@ -23,6 +23,7 @@ import com.yd.csf.api.dto.CommissionExcelDTO; ...@@ -23,6 +23,7 @@ import com.yd.csf.api.dto.CommissionExcelDTO;
import com.yd.csf.api.dto.PolicyExcelDTO; import com.yd.csf.api.dto.PolicyExcelDTO;
import com.yd.csf.api.dto.PolicyFollowDTO; import com.yd.csf.api.dto.PolicyFollowDTO;
import com.yd.csf.api.listener.PolicyDataListener; import com.yd.csf.api.listener.PolicyDataListener;
import com.yd.csf.api.service.ApiCommissionConditionService;
import com.yd.csf.api.service.ApiExpectedFortuneService; import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.api.service.ApiPolicyFollowService; import com.yd.csf.api.service.ApiPolicyFollowService;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest; import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
...@@ -52,6 +53,7 @@ import org.apache.commons.lang3.StringUtils; ...@@ -52,6 +53,7 @@ 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.beans.factory.annotation.Autowired;
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;
...@@ -105,6 +107,9 @@ public class ApiPolicyFollowController { ...@@ -105,6 +107,9 @@ public class ApiPolicyFollowController {
@Resource @Resource
private ApiExpectedFortuneAsyncService apiExpectedFortuneAsyncService; private ApiExpectedFortuneAsyncService apiExpectedFortuneAsyncService;
@Autowired
private ApiCommissionConditionService apiCommissionConditionService;
@PostMapping("/upload/excel") @PostMapping("/upload/excel")
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
...@@ -548,16 +553,18 @@ public class ApiPolicyFollowController { ...@@ -548,16 +553,18 @@ 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(); ApiAnnouncementCommissionRatioListRequest announcementRatioListRequest = new ApiAnnouncementCommissionRatioListRequest();
announcementRatioListRequest.setProductLaunchBizId(productLaunchBizId); announcementRatioListRequest.setProductLaunchBizId(productLaunchBizId);
announcementRatioListRequest.setEffectiveDate(changePolicyFollowStatusRequest.getEffectiveDate()); announcementRatioListRequest.setEffectiveDate(changePolicyFollowStatusRequest.getEffectiveDate());
announcementRatioListRequest.setPaymentTerm(String.valueOf(policyFollow.getIssueNumber())); announcementRatioListRequest.setPaymentTerm(String.valueOf(policyFollow.getIssueNumber()));
try { try {
feignResultHelper.extractListData( apiCommissionConditionService.getCommissionRatioList(policyFollow.getPolicyNo(),changePolicyFollowStatusRequest.getEffectiveDate());
apiAnnouncementCommissionRatioFeignClient.list(announcementRatioListRequest), // feignResultHelper.extractListData(
ApiAnnouncementCommissionRatioListResponse.class // apiAnnouncementCommissionRatioFeignClient.list(announcementRatioListRequest),
); // ApiAnnouncementCommissionRatioListResponse.class
// );
} catch (BusinessException e) { } catch (BusinessException e) {
log.info("===== 进入BusinessException catch块 ====="); log.info("===== 进入BusinessException catch块 =====");
log.info("查询结算币种->保单号:{},入参request:{}", policyFollow.getPolicyNo(), JSON.toJSONString(announcementRatioListRequest)); log.info("查询结算币种->保单号:{},入参request:{}", policyFollow.getPolicyNo(), JSON.toJSONString(announcementRatioListRequest));
......
package com.yd.csf.api.service;
import com.yd.common.result.Result;
import com.yd.product.feign.response.announcementcommissionratio.ApiAnnouncementCommissionRatioListResponse;
import java.util.Date;
import java.util.List;
public interface ApiCommissionConditionService {
Result<List<ApiAnnouncementCommissionRatioListResponse>> getCommissionRatioList(String policyNo, Date effectiveDate);
}
package com.yd.csf.api.service.impl;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.csf.api.service.ApiCommissionConditionService;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.model.PolicyPolicyholder;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyPolicyholderService;
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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 佣金条件服务类
*/
@Slf4j
@Service
public class ApiCommissionConditionServiceImpl implements ApiCommissionConditionService {
@Autowired
private ApiAnnouncementCommissionRatioFeignClient ratioFeignClient;
@Autowired
private PolicyFollowService policyFollowService;
@Autowired
private PolicyPolicyholderService policyPolicyholderService;
/**
* 根据保单号查询保单所参与过滤产品发佣率数据筛选的字段列表数据
* @param policyNo
* @return
*/
@Override
public Result<List<ApiAnnouncementCommissionRatioListResponse>> getCommissionRatioList(String policyNo, Date effectiveDate) {
//根据保单号查询保单跟进表数据
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyNo);
if (policyFollow == null) {
throw new BusinessException("新单跟进表信息不存在");
}
//列出固定几个需要参与发佣率筛选数据的保单字段
//供款年期(数字)
String paymentTerm = policyFollow.getIssueNumber().toString();
//投保年龄(区间值)查询保单投保人表数据 0-64 64-
PolicyPolicyholder policyPolicyholder = policyPolicyholderService.queryOne(policyFollow.getPolicyBizId());
String age = "";
if (policyPolicyholder != null) {
age = policyPolicyholder.getAge();
}
//期缴保费(区间值)例:0-10000 10000-
BigDecimal eachIssuePremium = policyFollow.getEachIssuePremium();
//专业投资者(Yes/No)(选项)
String professionalInvestor = policyFollow.getProfessionalInvestor();
//保单币种(选项)
String policyCurrency = policyFollow.getPolicyCurrency();
//保障年期(数字)
String guaranteePeriod = policyFollow.getGuaranteePeriod();
ApiAnnouncementCommissionRatioListRequest ratioListRequest = new ApiAnnouncementCommissionRatioListRequest();
ratioListRequest.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
ratioListRequest.setEffectiveDate(effectiveDate !=null ? effectiveDate:policyFollow.getEffectiveDate());
ratioListRequest.setPaymentTerm(paymentTerm);
ratioListRequest.setAge(age);
ratioListRequest.setEachIssuePremium(eachIssuePremium);
ratioListRequest.setGuaranteePeriod(guaranteePeriod);
ratioListRequest.setPolicyCurrency(policyCurrency);
ratioListRequest.setProfessionalInvestor(professionalInvestor);
Result<List<ApiAnnouncementCommissionRatioListResponse>> result = ratioFeignClient.list(ratioListRequest);
return result;
}
}
...@@ -20,6 +20,7 @@ import com.yd.common.utils.RandomStringGenerator; ...@@ -20,6 +20,7 @@ import com.yd.common.utils.RandomStringGenerator;
import com.yd.common.utils.RedisUtil; import com.yd.common.utils.RedisUtil;
import com.yd.csf.api.dto.*; import com.yd.csf.api.dto.*;
import com.yd.csf.api.service.ApiBasicLawCalculateService; import com.yd.csf.api.service.ApiBasicLawCalculateService;
import com.yd.csf.api.service.ApiCommissionConditionService;
import com.yd.csf.api.service.ApiExpectedFortuneLogService; import com.yd.csf.api.service.ApiExpectedFortuneLogService;
import com.yd.csf.api.service.ApiExpectedFortuneService; import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.feign.request.expectedfortune.*; import com.yd.csf.feign.request.expectedfortune.*;
...@@ -113,6 +114,9 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService ...@@ -113,6 +114,9 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
@Resource @Resource
private ApiAnnouncementCommissionRatioFeignClient ratioFeignClient; private ApiAnnouncementCommissionRatioFeignClient ratioFeignClient;
@Autowired
private ApiCommissionConditionService apiCommissionConditionService;
/** /**
* 生成预计发佣 * 生成预计发佣
* *
...@@ -220,53 +224,76 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService ...@@ -220,53 +224,76 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
// throw new BusinessException("绑定基本法数据不存在"); // throw new BusinessException("绑定基本法数据不存在");
// } // }
Integer paymentTerm = 0;
List<ApiAnnouncementCommissionRatioListResponse> announcementRatioList = new ArrayList<>();
Result<List<ApiAnnouncementCommissionRatioListResponse>> listResult = apiCommissionConditionService.getCommissionRatioList(request.getPolicyNo(),null);
if (listResult != null && !CollectionUtils.isEmpty(listResult.getData())) {
announcementRatioList = listResult.getData();
//取 endPeriod 的最大值作为总期数
paymentTerm = listResult.getData().stream()
.map(item -> {
try {
return Integer.parseInt(item.getEndPeriod());
} catch (NumberFormatException e) {
log.warn("endPeriod 格式错误: {}", item.getEndPeriod());
return 0;
}
})
.max(Integer::compareTo)
.orElse(0);
}
log.info("查询产品发佣配置,获取结算币种==========>,{}",JSON.toJSONString(announcementRatioList));
//查询产品发佣配置,获取结算币种 //查询产品发佣配置,获取结算币种
QueryPolicyAndBrokerDto queryPolicyAndBrokerDto = queryPolicyAndBrokerDtoList.get(0); // QueryPolicyAndBrokerDto queryPolicyAndBrokerDto = queryPolicyAndBrokerDtoList.get(0);
ApiAnnouncementCommissionRatioListRequest announcementRatioListRequest = new ApiAnnouncementCommissionRatioListRequest(); // ApiAnnouncementCommissionRatioListRequest announcementRatioListRequest = new ApiAnnouncementCommissionRatioListRequest();
announcementRatioListRequest.setProductLaunchBizId(queryPolicyAndBrokerDto.getPlanBizId()); // announcementRatioListRequest.setProductLaunchBizId(queryPolicyAndBrokerDto.getPlanBizId());
announcementRatioListRequest.setEffectiveDate(Date.from(queryPolicyAndBrokerDto.getEffectiveDate().atStartOfDay(ZoneId.systemDefault()).toInstant())); // announcementRatioListRequest.setEffectiveDate(Date.from(queryPolicyAndBrokerDto.getEffectiveDate().atStartOfDay(ZoneId.systemDefault()).toInstant()));
announcementRatioListRequest.setPaymentTerm(String.valueOf(queryPolicyAndBrokerDto.getPaymentTerm())); // announcementRatioListRequest.setPaymentTerm(String.valueOf(queryPolicyAndBrokerDto.getPaymentTerm()));
//
// HttpServletRequest request1 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
// String token = request1.getHeader("Authorization");
// log.info("HttpServletRequest token==============,{}",token);
// List<ApiAnnouncementCommissionRatioListResponse> announcementRatioList;
// try {
// announcementRatioList = feignResultHelper.extractListData(
// apiAnnouncementCommissionRatioFeignClient.list(announcementRatioListRequest),
// ApiAnnouncementCommissionRatioListResponse.class
// );
// } catch (Exception e) {
// log.info("查询结算币种->保单号:{},入参request:{}", request.getPolicyNo(), JSON.toJSONString(announcementRatioListRequest));
// throw new BusinessException("未查询到产品发佣配置,查询条件:" + JSON.toJSONString(announcementRatioListRequest));
// }
// Integer paymentTerm = 0;
// PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(request.getPolicyNo());
// if (policyFollow != null) {
// ApiAnnouncementCommissionRatioListRequest ratioListRequest = new ApiAnnouncementCommissionRatioListRequest();
// ratioListRequest.setEffectiveDate(policyFollow.getEffectiveDate());
// ratioListRequest.setPaymentTerm(policyFollow.getIssueNumber().toString()); // 保留原有过滤条件(可根据业务决定是否需要)
// ratioListRequest.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
// Result<List<ApiAnnouncementCommissionRatioListResponse>> listResult = ratioFeignClient.list(ratioListRequest);
// if (listResult != null && !CollectionUtils.isEmpty(listResult.getData())) {
// // 取 endPeriod 的最大值作为总期数
// paymentTerm = listResult.getData().stream()
// .map(item -> {
// try {
// return Integer.parseInt(item.getEndPeriod()); // 将字符串转为整数
// } catch (NumberFormatException e) {
// // 若转换失败,记录日志并返回0,避免影响最大值计算
// log.warn("endPeriod 格式错误: {}", item.getEndPeriod());
// return 0;
// }
// })
// .max(Integer::compareTo)
// .orElse(0); // 若无有效值,默认0
// }
// }
HttpServletRequest request1 = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request1.getHeader("Authorization");
log.info("HttpServletRequest token==============,{}",token);
List<ApiAnnouncementCommissionRatioListResponse> announcementRatioList;
try {
announcementRatioList = feignResultHelper.extractListData(
apiAnnouncementCommissionRatioFeignClient.list(announcementRatioListRequest),
ApiAnnouncementCommissionRatioListResponse.class
);
} catch (Exception e) {
log.info("查询结算币种->保单号:{},入参request:{}", request.getPolicyNo(), JSON.toJSONString(announcementRatioListRequest));
throw new BusinessException("未查询到产品发佣配置,查询条件:" + JSON.toJSONString(announcementRatioListRequest));
}
log.info("查询产品发佣配置,获取结算币种==========>,{}",JSON.toJSONString(announcementRatioList));
Integer paymentTerm = 0;
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(request.getPolicyNo());
if (policyFollow != null) {
ApiAnnouncementCommissionRatioListRequest ratioListRequest = new ApiAnnouncementCommissionRatioListRequest();
ratioListRequest.setEffectiveDate(policyFollow.getEffectiveDate());
ratioListRequest.setPaymentTerm(policyFollow.getIssueNumber().toString()); // 保留原有过滤条件(可根据业务决定是否需要)
ratioListRequest.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
Result<List<ApiAnnouncementCommissionRatioListResponse>> listResult = ratioFeignClient.list(ratioListRequest);
if (listResult != null && !CollectionUtils.isEmpty(listResult.getData())) {
// 取 endPeriod 的最大值作为总期数
paymentTerm = listResult.getData().stream()
.map(item -> {
try {
return Integer.parseInt(item.getEndPeriod()); // 将字符串转为整数
} catch (NumberFormatException e) {
// 若转换失败,记录日志并返回0,避免影响最大值计算
log.warn("endPeriod 格式错误: {}", item.getEndPeriod());
return 0;
}
})
.max(Integer::compareTo)
.orElse(0); // 若无有效值,默认0
}
}
//遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表(同步执行) //遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表(同步执行)
......
...@@ -40,11 +40,11 @@ public class SpeciesConditionMatcher { ...@@ -40,11 +40,11 @@ public class SpeciesConditionMatcher {
/** /**
* 范围匹配 * 范围匹配
* 支持格式: * 支持格式:
* - "0-10" 表示 [0, 10] 闭区间 * - "0-10" 表示 (0, 10] 左开右闭区间
* - "10-" 表示 >= 10 * - "10-" 表示 > 10
* - "-10" 表示 <= 10 * - "-10" 表示 <= 10
* - "10" 表示等于 10 * - "10" 表示等于 10
* - "0-64岁" 表示 [0, 64] 闭区间 * - "0-64岁" 表示 (0, 64] 左开右闭区间
*/ */
private static boolean matchesRange(String conditionValue, Object actualValue) { private static boolean matchesRange(String conditionValue, Object actualValue) {
try { try {
...@@ -59,7 +59,7 @@ public class SpeciesConditionMatcher { ...@@ -59,7 +59,7 @@ public class SpeciesConditionMatcher {
return actual.compareTo(value) == 0; return actual.compareTo(value) == 0;
} }
String[] parts = expression.split("-"); String[] parts = expression.split("-", -1);
if (parts.length != 2) { if (parts.length != 2) {
return false; return false;
} }
...@@ -75,14 +75,14 @@ public class SpeciesConditionMatcher { ...@@ -75,14 +75,14 @@ public class SpeciesConditionMatcher {
BigDecimal max = new BigDecimal(right); BigDecimal max = new BigDecimal(right);
return actual.compareTo(max) <= 0; return actual.compareTo(max) <= 0;
} else if (right.isEmpty()) { } else if (right.isEmpty()) {
// "10-" 表示 >= 10 // "10-" 表示 > 10
BigDecimal min = new BigDecimal(left); BigDecimal min = new BigDecimal(left);
return actual.compareTo(min) >= 0; return actual.compareTo(min) > 0;
} else { } else {
// "0-10" 表示 [0, 10] // "0-10" 表示 (0, 10]
BigDecimal min = new BigDecimal(left); BigDecimal min = new BigDecimal(left);
BigDecimal max = new BigDecimal(right); BigDecimal max = new BigDecimal(right);
return actual.compareTo(min) >= 0 && actual.compareTo(max) <= 0; return actual.compareTo(min) > 0 && actual.compareTo(max) <= 0;
} }
} catch (Exception e) { } catch (Exception e) {
return false; return false;
...@@ -124,7 +124,7 @@ public class SpeciesConditionMatcher { ...@@ -124,7 +124,7 @@ public class SpeciesConditionMatcher {
return "专业投资者"; return "专业投资者";
case "POLICY_CURRENCY": case "POLICY_CURRENCY":
return "保单币种"; return "保单币种";
case "PROTECTION_PERIOD": case "GUARANTEE_PERIOD":
return "保障年期"; return "保障年期";
default: default:
return typeCode; return typeCode;
......
...@@ -14,6 +14,7 @@ import com.yd.csf.service.vo.CommissionExpectedVO; ...@@ -14,6 +14,7 @@ import com.yd.csf.service.vo.CommissionExpectedVO;
import com.yd.csf.service.vo.ReceivableReportVO; import com.yd.csf.service.vo.ReceivableReportVO;
import com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse; import com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse;
import java.io.IOException;
import java.util.List; import java.util.List;
/** /**
...@@ -79,5 +80,5 @@ public interface CommissionExpectedService extends IService<CommissionExpected> ...@@ -79,5 +80,5 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
*/ */
IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page, List<Long> expectedIds); IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page, List<Long> expectedIds);
void testExpectedCommission(String policyNo); void testExpectedCommission(String policyNo,String effectiveDate,String coolingOffEndDate) throws IOException;
} }
...@@ -18,4 +18,5 @@ public interface PolicyPolicyholderService extends IService<PolicyPolicyholder> ...@@ -18,4 +18,5 @@ public interface PolicyPolicyholderService extends IService<PolicyPolicyholder>
*/ */
boolean update(PolicyPolicyholderUpdateRequest policyPolicyholderUpdateRequest); boolean update(PolicyPolicyholderUpdateRequest policyPolicyholderUpdateRequest);
PolicyPolicyholder queryOne(String policyBizId);
} }
package com.yd.csf.service.service.impl; package com.yd.csf.service.service.impl;
import cn.hutool.core.bean.BeanUtil;
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.DatePattern;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
...@@ -22,6 +24,7 @@ import com.yd.common.utils.RedisUtil; ...@@ -22,6 +24,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.enums.PolicyStatusEnum;
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.dao.CommissionExpectedMapper; import com.yd.csf.service.dao.CommissionExpectedMapper;
...@@ -43,13 +46,16 @@ import org.apache.commons.collections4.CollectionUtils; ...@@ -43,13 +46,16 @@ 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.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.core.io.ClassPathResource;
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.util.StreamUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.IOException; import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.ZoneId; import java.time.ZoneId;
...@@ -85,6 +91,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -85,6 +91,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
private ApiExchangeRateFeignClient apiExchangeRateFeignClient; private ApiExchangeRateFeignClient apiExchangeRateFeignClient;
@Resource @Resource
private ApiInsuranceReconciliationCompanyFeignClient companyFeignClient; private ApiInsuranceReconciliationCompanyFeignClient companyFeignClient;
@Resource
private CustomerService customerService;
// 用于对象转换的ObjectMapper // 用于对象转换的ObjectMapper
private static final ObjectMapper objectMapper = new ObjectMapper(); private static final ObjectMapper objectMapper = new ObjectMapper();
...@@ -814,14 +822,21 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -814,14 +822,21 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
map.put("PAYMENT_TERM", policy.getPaymentTerm() != null ? String.valueOf(policy.getPaymentTerm()) : null); map.put("PAYMENT_TERM", policy.getPaymentTerm() != null ? String.valueOf(policy.getPaymentTerm()) : null);
map.put("RECONCILIATION_COMPANY", policy.getReconciliationCompanyBizId()); map.put("RECONCILIATION_COMPANY", policy.getReconciliationCompanyBizId());
map.put("AGE", policy.getPolicyHolderAge()); map.put("AGE", policy.getPolicyHolderAge());
map.put("PREMIUM", policy.getPaymentPremium()); map.put("PREMIUM", calculateInitialPremiumInHkd(policy.getPaymentPremium(), policy.getCurrency()));
map.put("PROFESSIONAL", professionalInvestor); map.put("PROFESSIONAL", professionalInvestor);
map.put("POLICY_CURRENCY", policy.getCurrency()); map.put("POLICY_CURRENCY", policy.getCurrency());
map.put("PROTECTION_PERIOD", policy.getGuaranteePeriod()); map.put("GUARANTEE_PERIOD", policy.getGuaranteePeriod());
map.put("PROTECTION_PLAN", policy.getProductName()); map.put("PROTECTION_PLAN", policy.getProductName());
return map; return map;
} }
// 匹配来佣规格 - 计算期交保费港币金额
private BigDecimal calculateInitialPremiumInHkd(BigDecimal paymentPremium, String policyCurrency) {
// 查汇率
BigDecimal exchangeRate = queryExchangeRateByFeign(policyCurrency, "HKD");
return paymentPremium.multiply(exchangeRate);
}
/** /**
* 根据species条件过滤列表 * 根据species条件过滤列表
*/ */
...@@ -990,16 +1005,29 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -990,16 +1005,29 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
} }
@Override @Override
public void testExpectedCommission(String policyNo) { public void testExpectedCommission(String policyNo,String effectiveDate,String coolingOffEndDate) throws IOException {
Policy policy = policyService.queryOne(policyNo); PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyNo);
String productLaunchBizId = policy.getProductLaunchBizId(); String productLaunchBizId = policyFollow.getProductLaunchBizId();
if (StringUtils.isNotBlank(productLaunchBizId)) { if (StringUtils.isNotBlank(productLaunchBizId)) {
Policy policy = convertPolicy(policyFollow,effectiveDate,coolingOffEndDate);
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyNo);
String professionalInvestor = policyFollow.getProfessionalInvestor(); String professionalInvestor = policyFollow.getProfessionalInvestor();
List<ApiExpectedSpeciesListResponse> expectedSpeciesList = queryExpectedSpeciesByFeign(productLaunchBizId); // List<ApiExpectedSpeciesListResponse> expectedSpeciesList = queryExpectedSpeciesByFeign(productLaunchBizId);
List<ApiExpectedSpeciesListResponse> expectedSpeciesList = new ArrayList<>();
// 读取text
try {
ClassPathResource resource = new ClassPathResource("TestExpectedSpecies.txt");
String text = StreamUtils.copyToString(resource.getInputStream(), StandardCharsets.UTF_8);
expectedSpeciesList = JSONUtil.toList(text, ApiExpectedSpeciesListResponse.class);
} catch (IOException e) {
throw new RuntimeException("初始化预期来佣规格列表失败", e);
}
if (CollUtil.isNotEmpty(expectedSpeciesList)) { if (CollUtil.isNotEmpty(expectedSpeciesList)) {
// 匹配规格并获取不匹配的条件 // 匹配规格并获取不匹配的条件
CommissionExpectedServiceImpl.MatchResult matchResult = matchExpectedSpecies(expectedSpeciesList, policy, professionalInvestor); CommissionExpectedServiceImpl.MatchResult matchResult = matchExpectedSpecies(expectedSpeciesList, policy, professionalInvestor);
...@@ -1017,6 +1045,48 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -1017,6 +1045,48 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
} }
} }
private Policy convertPolicy(PolicyFollow policyFollow,String effectiveDate,String coolingOffEndDate) {
Policy policy = new Policy();
BeanUtil.copyProperties(policyFollow, policy);
policy.setPolicyNo(policyFollow.getPolicyNo());
policy.setPolicyHolderAge(calculatePolicyHolderAge(policyFollow.getCustomerBizId()));
policy.setCoolingOffEndDate(policyFollow.getCoolingOffEndDate());
policy.setReconciliationCompanyBizId(policyFollow.getReconciliationCompanyBizId());
policy.setReconciliationCompanyCode(policyFollow.getReconciliationCompanyCode());
policy.setReconciliationCompany(policyFollow.getReconciliationCompany());
policy.setInsuranceCompanyBizId(policyFollow.getInsuranceCompanyBizId());
policy.setInsuranceCompany(policyFollow.getInsuranceCompany());
policy.setProductName(policyFollow.getProductName());
// 更新保单状态为生效
policy.setStatus(PolicyStatusEnum.INFORCE.getItemValue());
// 手动映射不同名的字段
policy.setPaymentPremium(policyFollow.getInitialPremium());
policy.setCurrency(policyFollow.getPolicyCurrency());
policy.setPaymentTerm(policyFollow.getIssueNumber());
log.info("effectiveDate:{}",DateUtil.parse(effectiveDate, DatePattern.NORM_DATE_PATTERN));
policy.setEffectiveDate(DateUtil.parse(effectiveDate, DatePattern.NORM_DATE_PATTERN));
//冷静期结束日期
log.info("coolingOffEndDate:{}",DateUtil.parse(coolingOffEndDate, DatePattern.NORM_DATE_PATTERN));
policy.setCoolingOffEndDate(DateUtil.parse(coolingOffEndDate, DatePattern.NORM_DATE_PATTERN));
return policy;
}
private Integer calculatePolicyHolderAge(String customerBizId) {
Customer customer = customerService.getByCustomerBizId(customerBizId);
if (customer == null) {
throw new BusinessException("客户不存在");
}
if (customer.getBirthday() == null) {
throw new BusinessException("客户生日不能为空");
}
// 根据生日计算年龄
return DateUtil.ageOfNow(customer.getBirthday());
}
} }
......
package com.yd.csf.service.service.impl; package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.common.enums.ResultCode; import com.yd.common.enums.ResultCode;
...@@ -41,6 +42,12 @@ public class PolicyPolicyholderServiceImpl extends ServiceImpl<PolicyPolicyholde ...@@ -41,6 +42,12 @@ public class PolicyPolicyholderServiceImpl extends ServiceImpl<PolicyPolicyholde
policyPolicyholder.setUpdateTime(new Date()); policyPolicyholder.setUpdateTime(new Date());
return this.updateById(policyPolicyholder); return this.updateById(policyPolicyholder);
} }
@Override
public PolicyPolicyholder queryOne(String policyBizId) {
return this.baseMapper.selectOne(new LambdaQueryWrapper<PolicyPolicyholder>()
.eq(PolicyPolicyholder::getPolicyBizId,policyBizId).last(" limit 1 "));
}
} }
......
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