Commit 59ef8e3e by jianan

Merge branch 'refs/heads/test' into prod

parents 82947373 2c87d73c
......@@ -15,6 +15,7 @@ import com.yd.csf.service.dto.CustomerQueryRequest;
import com.yd.csf.service.dto.CustomerUpdateRequest;
import com.yd.csf.service.model.Customer;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.ITaxationService;
import com.yd.csf.service.vo.CustomerVO;
import io.swagger.v3.oas.annotations.Operation;
......
......@@ -703,4 +703,188 @@ public class ApiPolicyFollowController {
log.info("新单跟进-同步生成预计出账记录成功:保单号={}", policyNo);
}
}
/**
* 查询产品计划信息
*
* @param policyBizId 新单跟进业务ID
* @return 产品计划信息
*/
@GetMapping("/product_plan")
@Operation(summary = "查询产品计划信息")
public Result<PolicyDto> getProductPlan(@RequestParam("policyBizId") String policyBizId) {
if (StringUtils.isBlank(policyBizId)) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
}
return Result.success(policyFollowService.getProductPlan(policyBizId));
}
/**
* 查询投保人信息
*
* @param policyBizId 新单跟进业务ID
* @return 投保人信息
*/
@GetMapping("/policyholder")
@Operation(summary = "查询投保人信息")
public Result<PolicyPolicyholder> getPolicyPolicyholder(@RequestParam("policyBizId") String policyBizId) {
if (StringUtils.isBlank(policyBizId)) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
}
PolicyPolicyholder policyholder = policyFollowService.getPolicyPolicyholder(policyBizId);
if (policyholder == null) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "投保人信息不存在");
}
return Result.success(policyholder);
}
/**
* 查询受保人信息
*
* @param policyBizId 新单跟进业务ID
* @return 受保人信息
*/
@GetMapping("/insurant")
@Operation(summary = "查询受保人信息")
public Result<PolicyInsurant> getPolicyInsurant(@RequestParam("policyBizId") String policyBizId) {
if (StringUtils.isBlank(policyBizId)) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
}
PolicyInsurant insurant = policyFollowService.getPolicyInsurant(policyBizId);
if (insurant == null) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "受保人信息不存在");
}
return Result.success(insurant);
}
/**
* 查询受益人列表
*
* @param policyBizId 新单跟进业务ID
* @return 受益人列表
*/
@GetMapping("/beneficiary")
@Operation(summary = "查询受益人列表")
public Result<List<PolicyBeneficiary>> getPolicyBeneficiaryList(@RequestParam("policyBizId") String policyBizId) {
if (StringUtils.isBlank(policyBizId)) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
}
List<PolicyBeneficiary> beneficiaryList = policyFollowService.getPolicyBeneficiaryList(policyBizId);
return Result.success(beneficiaryList);
}
/**
* 查询第二持有人信息
*
* @param policyBizId 新单跟进业务ID
* @return 第二持有人信息
*/
@GetMapping("/second_holder")
@Operation(summary = "查询第二持有人信息")
public Result<PolicySecondHolder> getPolicySecondHolder(@RequestParam("policyBizId") String policyBizId) {
if (StringUtils.isBlank(policyBizId)) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
}
PolicySecondHolder secondHolder = policyFollowService.getPolicySecondHolder(policyBizId);
if (secondHolder == null) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "第二持有人信息不存在");
}
return Result.success(secondHolder);
}
/**
* 查询预约附件列表
*
* @param policyBizId 新单跟进业务ID
* @return 预约附件列表
*/
@GetMapping("/appointment_files")
@Operation(summary = "查询预约附件列表")
public Result<List<PolicyAppointmentFile>> getPolicyAppointmentFileList(@RequestParam("policyBizId") String policyBizId) {
if (StringUtils.isBlank(policyBizId)) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
}
List<PolicyAppointmentFile> fileList = policyFollowService.getPolicyAppointmentFileList(policyBizId);
return Result.success(fileList);
}
/**
* 更新产品计划信息
*
* @param policyUpdateRequest 产品计划更新请求
* @return 是否成功
*/
// @PostMapping("/product_plan/update")
// @Operation(summary = "更新产品计划信息")
// @Transactional(rollbackFor = Exception.class)
// public Result<Boolean> updateProductPlan(@RequestBody PolicyUpdateRequest policyUpdateRequest) {
// if (policyUpdateRequest == null || StringUtils.isBlank(policyUpdateRequest.getPolicyBizId())) {
// return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
// }
// return Result.success(policyFollowService.updateProductPlan(policyUpdateRequest));
// }
/**
* 更新投保人信息
*
* @param policyPolicyholderUpdateRequest 投保人更新请求
* @return 是否成功
*/
@PostMapping("/policyholder/update")
@Operation(summary = "更新投保人信息")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> updatePolicyPolicyholder(@RequestBody PolicyPolicyholderUpdateRequest policyPolicyholderUpdateRequest) {
if (policyPolicyholderUpdateRequest == null || StringUtils.isBlank(policyPolicyholderUpdateRequest.getPolicyPolicyholderBizId())) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyPolicyholderBizId不能为空");
}
return Result.success(policyFollowService.updatePolicyPolicyholder(policyPolicyholderUpdateRequest));
}
/**
* 更新受保人信息
*
* @param policyInsurantUpdateRequest 受保人更新请求
* @return 是否成功
*/
@PostMapping("/insurant/update")
@Operation(summary = "更新受保人信息")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> updatePolicyInsurant(@RequestBody PolicyInsurantUpdateRequest policyInsurantUpdateRequest) {
if (policyInsurantUpdateRequest == null || StringUtils.isBlank(policyInsurantUpdateRequest.getPolicyInsurantBizId())) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyInsurantBizId不能为空");
}
return Result.success(policyFollowService.updatePolicyInsurant(policyInsurantUpdateRequest));
}
/**
* 更新受益人列表
*
* @param policyBeneficiaryListUpdateRequest 受益人列表更新请求
* @return 是否成功
*/
@PostMapping("/beneficiary/update")
@Operation(summary = "更新受益人列表")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> updatePolicyBeneficiaryList(@RequestBody PolicyBeneficiaryListUpdateRequest policyBeneficiaryListUpdateRequest) {
if (policyBeneficiaryListUpdateRequest == null || StringUtils.isBlank(policyBeneficiaryListUpdateRequest.getPolicyBizId())) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policyBizId不能为空");
}
return Result.success(policyFollowService.updatePolicyBeneficiaryList(policyBeneficiaryListUpdateRequest));
}
/**
* 更新第二持有人信息
*
* @param policySecondHolderUpdateRequest 第二持有人更新请求
* @return 是否成功
*/
@PostMapping("/second_holder/update")
@Operation(summary = "更新第二持有人信息")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> updatePolicySecondHolder(@RequestBody PolicySecondHolderUpdateRequest policySecondHolderUpdateRequest) {
if (policySecondHolderUpdateRequest == null || StringUtils.isBlank(policySecondHolderUpdateRequest.getPolicySecondHolderBizId())) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), "policySecondHolderBizId不能为空");
}
return Result.success(policyFollowService.updatePolicySecondHolder(policySecondHolderUpdateRequest));
}
}
\ No newline at end of file
......@@ -6,9 +6,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.gson.reflect.TypeToken;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import com.yd.base.feign.client.relobjectcertificate.ApiRelObjectCertificateFeignClient;
import com.yd.base.feign.dto.ApiCertificateDto;
import com.yd.base.feign.request.relobjectcertificate.ApiRelObjectCertificateListAddRequest;
import com.yd.common.constant.CodeGeneratorConstants;
import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
......@@ -46,7 +43,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.validation.constraints.NotBlank;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Date;
......@@ -143,6 +139,8 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
private FnaFormService fnaFormService;
@Resource
private PolicyBrokerService policyBrokerService;
@Resource
private PolicyAppointmentFileService policyAppointmentFileService;
/**
* 预约分页查询
......@@ -366,7 +364,8 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
updateFnaBizIdAndNo(appointment.getFnaBizId(), appointment.getAppointmentBizId(), appointment.getAppointmentNo());
//新增健康问卷和预约对象关系绑定
objectSaveJkQuestion(appointment.getAppointmentBizId(),request.getApiAnswerSaveRequest());
//新增对象材料关系信息
addRelObjectMaterialList(appointment.getAppointmentBizId(),request.getMaterialDtoList());
return Result.success();
}
......@@ -760,13 +759,10 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
// 同步保存保单产品计划附加险
savePolicyAdditional(apiProductPlanAdditionalInfoDtoList, policyBizId);
// 同步转介人
savePolicyBroker(appointment.getFnaBizId(), policyBizId);
// // 同步保存保单(产品计划)
// savePolicy(productPlan, apiPolicyholderInfoDto, apiInsurantInfoDto, apiProductPlanMainInfoDto, policyBizId, policyTransfer);
// 同步保存保单(产品计划)
savePolicy(productPlan, apiPolicyholderInfoDto, apiInsurantInfoDto, apiProductPlanMainInfoDto, policyBizId, policyTransfer);
// 同步保存保单投保人
savePolicyPolicyholder(apiPolicyholderInfoDto, policyBizId);
// 同步保存保单受保人
......@@ -786,10 +782,15 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
private void savePolicyAppointmentAttachment(List<ApiAppointmentFileDto> apiAppointmentFileDtoList, String policyBizId) {
if (ObjectUtils.isNotEmpty(apiAppointmentFileDtoList)) {
List<PolicyAppointmentFile> policyAppointmentFileList = new ArrayList<>();
apiAppointmentFileDtoList.forEach(apiAppointmentFileDto -> {
// apiAppointmentFileDto.setPolicyBizId(policyBizId);
PolicyAppointmentFile policyAppointmentFile = new PolicyAppointmentFile();
BeanUtils.copyProperties(apiAppointmentFileDto, policyAppointmentFile);
policyAppointmentFile.setId(null);
policyAppointmentFile.setPolicyBizId(policyBizId);
policyAppointmentFileList.add(policyAppointmentFile);
});
// policyAppointmentFileService.saveOrUpdateBatch(apiAppointmentFileDtoList);
policyAppointmentFileService.saveOrUpdateBatch(policyAppointmentFileList);
}
}
......
......@@ -44,6 +44,11 @@ public class ApiAppointmentAddStorageRequest {
private ApiSecondHolderInfoDto apiSecondHolderInfoDto;
/**
* 附件信息
*/
private List<ApiAppointmentMaterialDto> materialDtoList;
/**
* 问卷-答题提交对象
*/
private ApiAnswerSaveRequest apiAnswerSaveRequest;
......
package com.yd.csf.service.dao;
import com.yd.csf.service.model.PolicyAppointmentFile;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Zhang Jianan
* @description 针对表【policy_appointment_file(新单跟进预约附件信息表)】的数据库操作Mapper
* @createDate 2026-02-28 16:40:45
* @Entity generator.domain.PolicyAppointmentFile
*/
public interface PolicyAppointmentFileMapper extends BaseMapper<PolicyAppointmentFile> {
}
package com.yd.csf.service.dto;
import com.yd.csf.service.model.PolicyAdditional;
import com.yd.csf.service.model.*;
import com.yd.csf.service.vo.PolicyVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;
import java.io.Serializable;
import java.util.List;
......@@ -23,4 +24,19 @@ public class PolicyDto implements Serializable {
*/
@Schema(description = "保单附加险列表")
private List<PolicyAdditional> apiProductPlanAdditionalInfoDtoList;
public static PolicyDto convertToDto(Policy policy, List<PolicyAdditional> policyAdditionals) {
PolicyDto dto = new PolicyDto();
if (ObjectUtils.isEmpty(policy)) {
return dto;
}
// 产品计划主信息
dto.setApiProductPlanMainInfoDto(PolicyVO.objToVo(policy));
// 附加险列表
dto.setApiProductPlanAdditionalInfoDtoList(policyAdditionals);
return dto;
}
}
......@@ -150,7 +150,10 @@ public class PolicyFollowDto implements Serializable {
private String insuranceCompanyBizId;
@Schema(description = "对账公司")
private String reconciliationCompany;
private String reconciliationCompanyName;
@Schema(description = "对账公司编码")
private String reconciliationCode;
@Schema(description = "对账公司业务id")
private String reconciliationCompanyBizId;
......
......@@ -83,6 +83,11 @@ public class Policy implements Serializable {
private String policyHolder;
/**
* 保單持有人年齡
*/
private Integer policyHolderAge;
/**
* 受保人
*/
private String insured;
......
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
/**
* 新单跟进预约附件信息表
* @TableName policy_appointment_file
*/
@TableName(value ="policy_appointment_file")
@Data
public class PolicyAppointmentFile implements Serializable {
/**
*
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 新单跟进业务ID
*/
private String policyBizId;
/**
* 保单号
*/
private String policyNo;
/**
* 预约信息主表唯一业务ID
*/
private String appointmentBizId;
/**
* 中台文件元数据表唯一业务ID
*/
private String ossFileBizId;
/**
* 预约附件信息表唯一业务ID
*/
private String appointmentFileBizId;
/**
* 预约-材料信息表唯一业务ID
*/
private String appointmentMaterialBizId;
/**
* 文件名
*/
private String fileName;
/**
* 文件访问路径
*/
private String fileUrl;
/**
* 通用备注
*/
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
private Integer isDeleted;
/**
* 创建人ID
*/
private String creatorId;
/**
* 创建人名称
*/
private String creatorName;
/**
* 更新人ID
*/
private String updaterId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -241,6 +241,11 @@ public class PolicyFollow implements Serializable {
private String reconciliationCompany;
/**
* 对账公司编码
*/
private String reconciliationCompanyCode;
/**
* 对账公司业务id
*/
private String reconciliationCompanyBizId;
......
package com.yd.csf.service.service;
import com.yd.csf.service.model.PolicyAppointmentFile;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author Zhang Jianan
* @description 针对表【policy_appointment_file(新单跟进预约附件信息表)】的数据库操作Service
* @createDate 2026-02-28 16:40:45
*/
public interface PolicyAppointmentFileService extends IService<PolicyAppointmentFile> {
}
......@@ -5,8 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.PolicyFollowStatusEnum;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.model.*;
import com.yd.csf.service.vo.PolicyFollowDetailVO;
import com.yd.csf.service.vo.PolicyFollowVO;
import com.yd.csf.service.vo.PolicyNumberResponseVO;
......@@ -90,4 +89,92 @@ public interface PolicyFollowService extends IService<PolicyFollow> {
List<PolicyFollow> queryList(List<String> policyNoList);
List<PolicyFollow> queryListByAppointmentBizId(String appointmentBizId);
/**
* 查询产品计划信息
*
* @param policyBizId 新单跟进业务ID
* @return 产品计划信息
*/
PolicyDto getProductPlan(String policyBizId);
/**
* 查询投保人信息
*
* @param policyBizId 新单跟进业务ID
* @return 投保人信息
*/
PolicyPolicyholder getPolicyPolicyholder(String policyBizId);
/**
* 查询受保人信息
*
* @param policyBizId 新单跟进业务ID
* @return 受保人信息
*/
PolicyInsurant getPolicyInsurant(String policyBizId);
/**
* 查询受益人列表
*
* @param policyBizId 新单跟进业务ID
* @return 受益人列表
*/
List<PolicyBeneficiary> getPolicyBeneficiaryList(String policyBizId);
/**
* 查询第二持有人信息
*
* @param policyBizId 新单跟进业务ID
* @return 第二持有人信息
*/
PolicySecondHolder getPolicySecondHolder(String policyBizId);
/**
* 查询预约附件列表
*
* @param policyBizId 新单跟进业务ID
* @return 预约附件列表
*/
List<PolicyAppointmentFile> getPolicyAppointmentFileList(String policyBizId);
/**
* 更新产品计划信息
*
* @param policyUpdateRequest 产品计划更新请求
* @return 是否成功
*/
Boolean updateProductPlan(PolicyUpdateRequest policyUpdateRequest);
/**
* 更新投保人信息
*
* @param policyPolicyholderUpdateRequest 投保人更新请求
* @return 是否成功
*/
Boolean updatePolicyPolicyholder(PolicyPolicyholderUpdateRequest policyPolicyholderUpdateRequest);
/**
* 更新受保人信息
*
* @param policyInsurantUpdateRequest 受保人更新请求
* @return 是否成功
*/
Boolean updatePolicyInsurant(PolicyInsurantUpdateRequest policyInsurantUpdateRequest);
/**
* 更新受益人列表
*
* @param policyBeneficiaryListUpdateRequest 受益人列表更新请求
* @return 是否成功
*/
Boolean updatePolicyBeneficiaryList(PolicyBeneficiaryListUpdateRequest policyBeneficiaryListUpdateRequest);
/**
* 更新第二持有人信息
*
* @param policySecondHolderUpdateRequest 第二持有人更新请求
* @return 是否成功
*/
Boolean updatePolicySecondHolder(PolicySecondHolderUpdateRequest policySecondHolderUpdateRequest);
}
......@@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yd.base.feign.client.exchangerate.ApiExchangeRateFeignClient;
import com.yd.common.constant.CommonConstant;
import com.yd.common.constant.RedisConstants;
......@@ -41,6 +43,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
......@@ -77,6 +80,9 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
@Resource
private ApiExchangeRateFeignClient apiExchangeRateFeignClient;
// 用于对象转换的ObjectMapper
private static final ObjectMapper objectMapper = new ObjectMapper();
@Override
public Page<CommissionExpectedVO> getCommissionExpectedVOPage(Page<CommissionExpected> commissionExpectedPage) {
......@@ -481,6 +487,10 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
if (paymentPremium == null) {
throw new BusinessException("保费不能为空");
}
Integer policyHolderAge = policy.getPolicyHolderAge();
if (policyHolderAge == null) {
throw new BusinessException("保單持有人年齡不能为空");
}
Date effectiveDate = policy.getEffectiveDate();
if (effectiveDate == null) {
throw new BusinessException("保单生效日期不能为空");
......@@ -501,22 +511,25 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
List<CommissionExpected> commissionExpectedList = new ArrayList<>();
if (CollUtil.isNotEmpty(expectedSpeciesList)) {
// 根据供款年期匹配规格
List<ApiExpectedSpeciesListResponse> collect = expectedSpeciesList.stream()
.filter(i -> paymentTerm.equals(i.getPaymentTerm()))
.collect(Collectors.toList());
if (ObjectUtils.isEmpty(collect)) {
throw new BusinessException(ResultCode.FAIL.getCode(), "未查询到对应供款年期的佣金规格");
// 匹配规格并获取不匹配的条件
MatchResult matchResult = matchExpectedSpecies(
expectedSpeciesList, paymentTerm, reconciliationCompanyBizId,
policyHolderAge, paymentPremium);
if (matchResult.getMatchedList().isEmpty()) {
String errorMsg = matchResult.getUnmatchedConditions().isEmpty()
? "未查询到对应供款年期的佣金规格"
: "未查询到对应供款年期的佣金规格,不匹配条件:" + String.join("、", matchResult.getUnmatchedConditions());
throw new BusinessException(ResultCode.FAIL.getCode(), errorMsg);
}
// 计算佣金总期数 list 中 endPeriod最大值
Integer maxEndPeriod = collect.stream()
Integer maxEndPeriod = matchResult.getMatchedList().stream()
.map(item -> Convert.toInt(item.getEndPeriod()))
.max(Integer::compareTo)
.orElse(0);
for (ApiExpectedSpeciesListResponse item : collect) {
for (ApiExpectedSpeciesListResponse item : matchResult.getMatchedList()) {
CommissionExpected commissionExpected = new CommissionExpected();
commissionExpected.setCommissionExpectedBizId(RandomStringGenerator.generateBizId16("commission_expected"));
commissionExpected.setReceivableNo(receivableService.generateReceivableNo("R", reconciliationCompanyCode, reconciliationCompany));
......@@ -565,6 +578,140 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
}
}
/**
* 匹配规格结果内部类
*/
private static class MatchResult {
private List<ApiExpectedSpeciesListResponse> matchedList;
private List<String> unmatchedConditions;
public MatchResult(List<ApiExpectedSpeciesListResponse> matchedList, List<String> unmatchedConditions) {
this.matchedList = matchedList;
this.unmatchedConditions = unmatchedConditions;
}
public List<ApiExpectedSpeciesListResponse> getMatchedList() {
return matchedList;
}
public List<String> getUnmatchedConditions() {
return unmatchedConditions;
}
}
/**
* 匹配预计规格并返回不匹配的条件
*
* @param expectedSpeciesList 预计规格列表
* @param paymentTerm 供款年期
* @param reconciliationCompanyId 对账公司ID
* @param policyHolderAge 保单持有人年龄
* @param paymentPremium 年缴保费
* @return 匹配结果
*/
private MatchResult matchExpectedSpecies(List<ApiExpectedSpeciesListResponse> expectedSpeciesList,
String paymentTerm, String reconciliationCompanyId,
Integer policyHolderAge, BigDecimal paymentPremium) {
List<String> unmatchedConditions = new ArrayList<>();
List<ApiExpectedSpeciesListResponse> currentList = expectedSpeciesList;
// 检查供款年期
currentList = filterAndCheck(currentList,
i -> paymentTerm.equals(i.getPaymentTerm()),
unmatchedConditions, "供款年期[" + paymentTerm + "]");
if (unmatchedConditions.size() > 0) {
return new MatchResult(Collections.emptyList(), unmatchedConditions);
}
// 检查对账公司
currentList = filterAndCheck(currentList,
i -> reconciliationCompanyId.equals(i.getReconciliationCompany()),
unmatchedConditions, "对账公司[" + reconciliationCompanyId + "]");
if (unmatchedConditions.size() > 0) {
return new MatchResult(Collections.emptyList(), unmatchedConditions);
}
// 检查年龄
currentList = filterAndCheck(currentList,
i -> containsValue(i.getSpeciesJson(), "AGE", Convert.toStr(policyHolderAge)),
unmatchedConditions, "年龄[" + policyHolderAge + "]");
if (unmatchedConditions.size() > 0) {
return new MatchResult(Collections.emptyList(), unmatchedConditions);
}
// 检查保费
currentList = filterAndCheck(currentList,
i -> containsValue(i.getSpeciesJson(), "PREMIUM", Convert.toStr(paymentPremium)),
unmatchedConditions, "保费[" + paymentPremium + "]");
return new MatchResult(currentList, unmatchedConditions);
}
/**
* 过滤列表并检查是否为空
*
* @param list 待过滤的列表
* @param predicate 过滤条件
* @param unmatchedConditions 不匹配条件列表
* @param conditionDesc 条件描述
* @return 过滤后的列表
*/
private List<ApiExpectedSpeciesListResponse> filterAndCheck(
List<ApiExpectedSpeciesListResponse> list,
java.util.function.Predicate<ApiExpectedSpeciesListResponse> predicate,
List<String> unmatchedConditions, String conditionDesc) {
List<ApiExpectedSpeciesListResponse> filtered = list.stream()
.filter(predicate)
.collect(Collectors.toList());
if (filtered.isEmpty()) {
unmatchedConditions.add(conditionDesc);
}
return filtered;
}
private static boolean containsValue(String json, String targetKey, String targetValue) {
if (json == null || json.trim().isEmpty()) return false;
try {
List<Map<String, Object>> params = objectMapper.readValue(json, new TypeReference<List<Map<String, Object>>>() {});
// AGE 和 PREMIUM 使用最小值匹配(targetValue >= value)
if (targetKey.equals("AGE") || targetKey.equals("PREMIUM")) {
return params.stream().anyMatch(p -> {
Object value = p.get("value");
if (value == null) {
return false;
}
// 转换为 BigDecimal
BigDecimal threshold;
if (value instanceof BigDecimal) {
threshold = (BigDecimal) value;
} else if (value instanceof Number) {
threshold = BigDecimal.valueOf(((Number) value).doubleValue());
} else if (value instanceof String) {
try {
threshold = new BigDecimal((String) value);
} catch (NumberFormatException e) {
return false;
}
} else {
return false;
}
// 判断是否大于等于最小值
return new BigDecimal(targetValue).compareTo(threshold) >= 0;
});
}
// 其他字段使用等于匹配
else {
return params.stream().anyMatch(p -> targetValue.equals(p.get("value")));
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
@Override
public List<ApiExpectedSpeciesListResponse> queryExpectedSpeciesByFeign(String productLaunchBizId) {
ApiExpectedSpeciesListRequest apiExpectedSpeciesListRequest = new ApiExpectedSpeciesListRequest();
......
......@@ -22,7 +22,6 @@ import com.yd.csf.service.enums.FnaStatusEnum;
import com.yd.csf.service.model.Customer;
import com.yd.csf.service.model.Fna;
import com.yd.csf.service.model.FnaForm;
import com.yd.csf.service.model.Fortune;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.FnaFormService;
import com.yd.csf.service.service.FnaService;
......
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.model.PolicyAppointmentFile;
import com.yd.csf.service.dao.PolicyAppointmentFileMapper;
import com.yd.csf.service.service.PolicyAppointmentFileService;
import org.springframework.stereotype.Service;
/**
* @author Zhang Jianan
* @description 针对表【policy_appointment_file(新单跟进预约附件信息表)】的数据库操作Service实现
* @createDate 2026-02-28 16:40:45
*/
@Service
public class PolicyAppointmentFileServiceImpl extends ServiceImpl<PolicyAppointmentFileMapper, PolicyAppointmentFile>
implements PolicyAppointmentFileService {
}
......@@ -78,6 +78,8 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
@Resource
private PolicyAdditionalService policyAdditionalService;
@Resource
private PolicyAppointmentFileService policyAppointmentFileService;
@Resource
private IExpectedFortuneService expectedFortuneService;
@Autowired
private CommissionExpectedService commissionExpectedService;
......@@ -87,6 +89,8 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
private FnaService fnaService;
@Resource
private ApiInsuranceReconciliationCompanyFeignClient apiInsuranceReconciliationCompanyFeignClient;
@Resource
private CustomerService customerService;
@Override
......@@ -197,6 +201,12 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
// 复制属性,排除系统字段
BeanUtils.copyProperties(policyFollowDto, policyFollow, "id", "policyBizId", "brokerList");
if (StringUtils.isNotBlank(policyFollowDto.getReconciliationCode())) {
policyFollow.setReconciliationCompanyCode(policyFollowDto.getReconciliationCode());
}
if (StringUtils.isNotBlank(policyFollowDto.getReconciliationCompanyName())) {
policyFollow.setReconciliationCompany(policyFollowDto.getReconciliationCompanyName());
}
// 检查保单号是否从空变为有值
String oldPolicyNo = policyFollow.getPolicyNo();
......@@ -491,25 +501,35 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
policy.setPaymentTerm(policyFollow.getIssueNumber());
policy.setUnderwritingDate(changePolicyFollowStatusRequest.getUnderwritingDate());
policy.setEffectiveDate(changePolicyFollowStatusRequest.getEffectiveDate());
policy.setPolicyHolderAge(calculatePolicyHolderAge(policyFollow.getCustomerBizId()));
if (ObjectUtils.isEmpty(policy.getInsuranceCompany()) || ObjectUtils.isEmpty(policy.getReconciliationCompanyBizId())) {
if (ObjectUtils.isEmpty(policy.getInsuranceCompany()) || ObjectUtils.isEmpty(policy.getInsuranceCompany())) {
// 获取保单产品信息,填充对账公司相关字段
PolicyProductInfo productInfo = getPolicyProductInfo(policyFollow.getProductLaunchBizId());
if (productInfo != null) {
policy.setInsuranceCompany(productInfo.getInsuranceCompany());
policy.setInsuranceCompanyBizId(productInfo.getInsuranceCompanyBizId());
policy.setReconciliationCompany(productInfo.getReconciliationCompany());
policy.setReconciliationCompanyBizId(productInfo.getReconciliationCompanyBizId());
if (ObjectUtils.isEmpty(policy.getReconciliationCompany())) {
policy.setReconciliationCompany(productInfo.getReconciliationCompany());
}
if (ObjectUtils.isEmpty(policy.getReconciliationCompanyBizId())) {
policy.setReconciliationCompanyBizId(productInfo.getReconciliationCompanyBizId());
}
}
}
if (ObjectUtils.isEmpty(policy.getReconciliationCompanyCode())) {
if (ObjectUtils.isEmpty(policy.getReconciliationCompanyBizId())) {
throw new BusinessException("对账公司业务ID不能为空");
}
// 调用对账公司 feignclient,查询对账公司编码
String reconciliationCompanyCode = queryReconciliationCompanyByFeign(policy.getReconciliationCompanyBizId());
// 调用对账公司 feignclient,查询对账公司编码
String reconciliationCompanyCode = queryReconciliationCompanyByFeign(policy.getReconciliationCompanyBizId());
// 如果仍然没有获取到编码,抛异常
if (StringUtils.isBlank(reconciliationCompanyCode)) {
throw new BusinessException("未能从对账公司服务获取编码,请补充,当前对账公司:" + productInfo.getReconciliationCompany());
}
policy.setReconciliationCompanyCode(reconciliationCompanyCode);
// 如果仍然没有获取到编码,抛异常
if (StringUtils.isBlank(reconciliationCompanyCode)) {
throw new BusinessException("未能从对账公司服务获取编码,请补充,当前对账公司:" + policy.getReconciliationCompany());
}
policy.setReconciliationCompanyCode(reconciliationCompanyCode);
}
// 保存保单
try {
......@@ -539,6 +559,18 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
return true;
}
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());
}
/**
* 调用对账公司 feignclient,查询对账公司编码
*/
......@@ -959,5 +991,85 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
return null;
}
}
@Override
public PolicyDto getProductPlan(String policyBizId) {
Policy policy = policyService.getOne(new QueryWrapper<Policy>().eq("policy_biz_id", policyBizId));
List<PolicyAdditional> policyAdditionalList = policyAdditionalService.lambdaQuery()
.eq(PolicyAdditional::getPolicyBizId, policyBizId)
.list();
// 转换为DTO
return PolicyDto.convertToDto(policy, policyAdditionalList);
}
@Override
public PolicyPolicyholder getPolicyPolicyholder(String policyBizId) {
return policyPolicyholderService.getOne(new QueryWrapper<PolicyPolicyholder>().eq("policy_biz_id", policyBizId).eq("is_deleted", 0));
}
@Override
public PolicyInsurant getPolicyInsurant(String policyBizId) {
return policyInsurantService.getOne(new QueryWrapper<PolicyInsurant>().eq("policy_biz_id", policyBizId).eq("is_deleted", 0));
}
@Override
public List<PolicyBeneficiary> getPolicyBeneficiaryList(String policyBizId) {
return policyBeneficiaryService.list(new QueryWrapper<PolicyBeneficiary>().eq("policy_biz_id", policyBizId).eq("is_deleted", 0));
}
@Override
public PolicySecondHolder getPolicySecondHolder(String policyBizId) {
return policySecondHolderService.getOne(new QueryWrapper<PolicySecondHolder>().eq("policy_biz_id", policyBizId).eq("is_deleted", 0));
}
@Override
public List<PolicyAppointmentFile> getPolicyAppointmentFileList(String policyBizId) {
return policyAppointmentFileService.list(new QueryWrapper<PolicyAppointmentFile>().eq("policy_biz_id", policyBizId).eq("is_deleted", 0));
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateProductPlan(PolicyUpdateRequest policyUpdateRequest) {
if (policyUpdateRequest == null || StringUtils.isBlank(policyUpdateRequest.getPolicyBizId())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "policyBizId不能为空");
}
return policyService.updatePolicy(policyUpdateRequest);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updatePolicyPolicyholder(PolicyPolicyholderUpdateRequest policyPolicyholderUpdateRequest) {
if (policyPolicyholderUpdateRequest == null || StringUtils.isBlank(policyPolicyholderUpdateRequest.getPolicyPolicyholderBizId())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "policyPolicyholderBizId不能为空");
}
return policyPolicyholderService.update(policyPolicyholderUpdateRequest);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updatePolicyInsurant(PolicyInsurantUpdateRequest policyInsurantUpdateRequest) {
if (policyInsurantUpdateRequest == null || StringUtils.isBlank(policyInsurantUpdateRequest.getPolicyInsurantBizId())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "policyInsurantBizId不能为空");
}
return policyInsurantService.update(policyInsurantUpdateRequest);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updatePolicyBeneficiaryList(PolicyBeneficiaryListUpdateRequest policyBeneficiaryListUpdateRequest) {
if (policyBeneficiaryListUpdateRequest == null || StringUtils.isBlank(policyBeneficiaryListUpdateRequest.getPolicyBizId())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "policyBizId不能为空");
}
return policyBeneficiaryService.updatePolicyBeneficiaryList(policyBeneficiaryListUpdateRequest);
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updatePolicySecondHolder(PolicySecondHolderUpdateRequest policySecondHolderUpdateRequest) {
if (policySecondHolderUpdateRequest == null || StringUtils.isBlank(policySecondHolderUpdateRequest.getPolicySecondHolderBizId())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "policySecondHolderBizId不能为空");
}
return policySecondHolderService.updatePolicySecondHolder(policySecondHolderUpdateRequest);
}
}
......@@ -53,7 +53,6 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
@Resource
private PolicyAdditionalService policyAdditionalService;
@Resource
private ApiRelProjectProductLaunchFeignClient apiRelProjectProductLaunchFeignClient;
......@@ -148,7 +147,6 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
policyAdditionalService.saveBatch(policyAdditionalList);
}
policy.setUpdateTime(now);
return true;
}
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.csf.service.dao.PolicyAppointmentFileMapper">
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.PolicyAppointmentFile">
<id property="id" column="id" />
<result property="policyBizId" column="policy_biz_id" />
<result property="policyNo" column="policy_no" />
<result property="appointmentBizId" column="appointment_biz_id" />
<result property="ossFileBizId" column="oss_file_biz_id" />
<result property="appointmentFileBizId" column="appointment_file_biz_id" />
<result property="appointmentMaterialBizId" column="appointment_material_biz_id" />
<result property="fileName" column="file_name" />
<result property="fileUrl" column="file_url" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
<result property="creatorId" column="creator_id" />
<result property="creatorName" column="creator_name" />
<result property="updaterId" column="updater_id" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="Base_Column_List">
id,policy_biz_id,policy_no,appointment_biz_id,oss_file_biz_id,appointment_file_biz_id,
appointment_material_biz_id,file_name,file_url,remark,is_deleted,
creator_id,creator_name,updater_id,create_time,update_time
</sql>
</mapper>
......@@ -17,6 +17,7 @@
<result property="insuranceCompanyBizId" column="insurance_company_biz_id" />
<result property="region" column="region" />
<result property="policyHolder" column="policy_holder" />
<result property="policyHolderAge" column="policy_holder_age" />
<result property="insured" column="insured" />
<result property="sumInsured" column="sum_insured" />
<result property="paymentTerm" column="payment_term" />
......@@ -55,7 +56,7 @@
<sql id="Base_Column_List">
id,policy_biz_id,policy_no,user_biz_id,product_launch_biz_id,product_code,
product_name,product_cate,insurance_company,insurance_company_biz_id,region,
policy_holder,insured,sum_insured,payment_term,payment_frequency,payment_premium,
policy_holder,policy_holder_age,insured,sum_insured,payment_term,payment_frequency,payment_premium,
status,currency,initial_premium,sign_date,issue_date,
effective_date,cooling_off_end_date,cooling_off_days,renewal_date,is_prepaid,deductibles,prepaid_term,
initial_payment_method,renewal_payment_method,dividend_distribution_method,is_backtrack,is_join,
......
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