Commit 573a4dc7 by jianan

来佣规格匹配

parent c6c0951a
......@@ -34,6 +34,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
......@@ -399,11 +400,17 @@ public class ApiCommissionExpectedController {
@GetMapping("/test_expected_commission")
@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)) {
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);
}
......
......@@ -40,11 +40,11 @@ public class SpeciesConditionMatcher {
/**
* 范围匹配
* 支持格式:
* - "0-10" 表示 [0, 10] 闭区间
* - "10-" 表示 >= 10
* - "0-10" 表示 (0, 10] 左开右闭区间
* - "10-" 表示 > 10
* - "-10" 表示 <= 10
* - "10" 表示等于 10
* - "0-64岁" 表示 [0, 64] 闭区间
* - "0-64岁" 表示 (0, 64] 左开右闭区间
*/
private static boolean matchesRange(String conditionValue, Object actualValue) {
try {
......@@ -59,7 +59,7 @@ public class SpeciesConditionMatcher {
return actual.compareTo(value) == 0;
}
String[] parts = expression.split("-");
String[] parts = expression.split("-", -1);
if (parts.length != 2) {
return false;
}
......@@ -75,14 +75,14 @@ public class SpeciesConditionMatcher {
BigDecimal max = new BigDecimal(right);
return actual.compareTo(max) <= 0;
} else if (right.isEmpty()) {
// "10-" 表示 >= 10
// "10-" 表示 > 10
BigDecimal min = new BigDecimal(left);
return actual.compareTo(min) >= 0;
return actual.compareTo(min) > 0;
} else {
// "0-10" 表示 [0, 10]
// "0-10" 表示 (0, 10]
BigDecimal min = new BigDecimal(left);
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) {
return false;
......
......@@ -14,6 +14,7 @@ import com.yd.csf.service.vo.CommissionExpectedVO;
import com.yd.csf.service.vo.ReceivableReportVO;
import com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse;
import java.io.IOException;
import java.util.List;
/**
......@@ -79,5 +80,5 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
*/
IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page, List<Long> expectedIds);
void testExpectedCommission(String policyNo);
void testExpectedCommission(String policyNo,String effectiveDate,String coolingOffEndDate) throws IOException;
}
package com.yd.csf.service.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
......@@ -22,6 +24,7 @@ import com.yd.common.utils.RedisUtil;
import com.yd.csf.service.component.ReceivableService;
import com.yd.csf.service.dto.*;
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.service.*;
import com.yd.csf.service.dao.CommissionExpectedMapper;
......@@ -43,13 +46,16 @@ import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StreamUtils;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
......@@ -85,6 +91,8 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
private ApiExchangeRateFeignClient apiExchangeRateFeignClient;
@Resource
private ApiInsuranceReconciliationCompanyFeignClient companyFeignClient;
@Resource
private CustomerService customerService;
// 用于对象转换的ObjectMapper
private static final ObjectMapper objectMapper = new ObjectMapper();
......@@ -990,16 +998,29 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
}
@Override
public void testExpectedCommission(String policyNo) {
Policy policy = policyService.queryOne(policyNo);
String productLaunchBizId = policy.getProductLaunchBizId();
public void testExpectedCommission(String policyNo,String effectiveDate,String coolingOffEndDate) throws IOException {
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyNo);
String productLaunchBizId = policyFollow.getProductLaunchBizId();
if (StringUtils.isNotBlank(productLaunchBizId)) {
Policy policy = convertPolicy(policyFollow,effectiveDate,coolingOffEndDate);
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyNo);
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)) {
// 匹配规格并获取不匹配的条件
CommissionExpectedServiceImpl.MatchResult matchResult = matchExpectedSpecies(expectedSpeciesList, policy, professionalInvestor);
......@@ -1017,6 +1038,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());
}
}
......
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