Commit a0ec9de3 by jianan

新单跟进v2

parent 591181d8
...@@ -689,7 +689,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService { ...@@ -689,7 +689,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
&& !response.getApiAppointmentInfoDto().getUserSignDtoList().isEmpty()) { && !response.getApiAppointmentInfoDto().getUserSignDtoList().isEmpty()) {
ApiAppointmentUserSignDto firstSigner = response.getApiAppointmentInfoDto().getUserSignDtoList().get(0); ApiAppointmentUserSignDto firstSigner = response.getApiAppointmentInfoDto().getUserSignDtoList().get(0);
follow.setSigner(firstSigner.getName()); follow.setSigner(firstSigner.getName());
follow.setSignerBizId(firstSigner.getUserBizId()); follow.setSignerBizId(firstSigner.getAppointmentUserSignBizId());
follow.setSignerRegNo(firstSigner.getPracticeCode()); follow.setSignerRegNo(firstSigner.getPracticeCode());
} }
...@@ -741,10 +741,11 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService { ...@@ -741,10 +741,11 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
policyFollowService.saveOrUpdate(follow); policyFollowService.saveOrUpdate(follow);
// 同步保存保单产品计划附加险
savePolicyAdditional(apiProductPlanAdditionalInfoDtoList, policyBizId);
// // 同步保存保单(产品计划) // // 同步保存保单(产品计划)
// savePolicy(productPlan, apiPolicyholderInfoDto, apiInsurantInfoDto, apiProductPlanMainInfoDto, policyBizId, policyTransfer); // savePolicy(productPlan, apiPolicyholderInfoDto, apiInsurantInfoDto, apiProductPlanMainInfoDto, policyBizId, policyTransfer);
// // 同步保存保单产品计划附加险
// savePolicyAdditional(apiProductPlanAdditionalInfoDtoList, policyBizId);
// // 同步保存保单投保人 // // 同步保存保单投保人
// savePolicyPolicyholder(apiPolicyholderInfoDto, policyBizId); // savePolicyPolicyholder(apiPolicyholderInfoDto, policyBizId);
// // 同步保存保单受保人 // // 同步保存保单受保人
......
...@@ -49,6 +49,11 @@ public class PolicyProductInfo { ...@@ -49,6 +49,11 @@ public class PolicyProductInfo {
private String reconciliationCompanyBizId; private String reconciliationCompanyBizId;
/** /**
* 对账公司编码
*/
private String reconciliationCompanyCode;
/**
* 产品计划类型 * 产品计划类型
*/ */
private String productPlanType; private String productPlanType;
......
...@@ -786,7 +786,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss ...@@ -786,7 +786,7 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
} }
// 关联预计来佣信息 // 关联预计来佣信息
CommissionExpected expected = getCommissionExpectedBizIdBatch(request, policyNoSet, commission); CommissionExpected expected = getCommissionExpectedBizIdBatch(request, policyNoSet, commission);
if (expected != null) { if (expected != null && "R".equals(expected.getCommissionBizType())) {
// 本次入账比例 // 本次入账比例
commission.setCurrentCommissionRatio(calculateCurrentCommissionRatio( commission.setCurrentCommissionRatio(calculateCurrentCommissionRatio(
commission.getPremium(), commission.getAmount(), commission.getCurrency(), commission.getExchangeRate(), expected)); commission.getPremium(), commission.getAmount(), commission.getCurrency(), commission.getExchangeRate(), expected));
......
...@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateField; ...@@ -6,6 +6,7 @@ import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.auth.core.dto.AuthUserDto; import com.yd.auth.core.dto.AuthUserDto;
...@@ -13,7 +14,10 @@ import com.yd.auth.core.utils.SecurityUtil; ...@@ -13,7 +14,10 @@ import com.yd.auth.core.utils.SecurityUtil;
import com.yd.common.enums.CommonEnum; import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode; import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException; import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator; import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.feign.client.expectedfortune.ApiExpectedFortuneFeignClient;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.service.common.ErrorCode; import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*; import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.FnaStatusEnum; import com.yd.csf.service.enums.FnaStatusEnum;
...@@ -26,6 +30,9 @@ import com.yd.csf.service.utils.GSONUtil; ...@@ -26,6 +30,9 @@ import com.yd.csf.service.utils.GSONUtil;
import com.yd.csf.service.vo.PolicyAdditionalVO; import com.yd.csf.service.vo.PolicyAdditionalVO;
import com.yd.csf.service.vo.PolicyFollowDetailVO; import com.yd.csf.service.vo.PolicyFollowDetailVO;
import com.yd.csf.service.vo.PolicyFollowVO; import com.yd.csf.service.vo.PolicyFollowVO;
import com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyFeignClient;
import com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest;
import com.yd.insurance.base.feign.response.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageResponse;
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.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
...@@ -37,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional; ...@@ -37,6 +44,7 @@ import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -79,6 +87,10 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -79,6 +87,10 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
private IAppointmentService appointmentService; private IAppointmentService appointmentService;
@Resource @Resource
private FnaService fnaService; private FnaService fnaService;
@Resource
private ApiInsuranceReconciliationCompanyFeignClient apiInsuranceReconciliationCompanyFeignClient;
@Resource
private ApiExpectedFortuneFeignClient apiExpectedFortuneFeignClient;
@Override @Override
public PolicyFollow getByPolicyBizId(String policyBizId) { public PolicyFollow getByPolicyBizId(String policyBizId) {
...@@ -450,9 +462,72 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -450,9 +462,72 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
policyFollow.setUpdaterId(loginUserId); policyFollow.setUpdaterId(loginUserId);
policyFollowService.updateById(policyFollow); policyFollowService.updateById(policyFollow);
// 如果是生效状态,同步到保单库 // 如果是生效状态,同步保单、预计发佣、预计来佣
if (PolicyFollowStatusEnum.EFFECTIVE.equals(policyFollowStatusEnum)) { if (PolicyFollowStatusEnum.EFFECTIVE.equals(policyFollowStatusEnum)) {
addToPolicy(Collections.singletonList(policyFollow.getPolicyNo())); Policy policy = new Policy();
BeanUtils.copyProperties(policyFollow, policy, "id");
if (ObjectUtils.isEmpty(policy.getInsuranceCompany()) || ObjectUtils.isEmpty(policy.getReconciliationCompany())) {
// 获取保单产品信息,填充对账公司相关字段
PolicyProductInfo productInfo = getPolicyProductInfo(policyFollow.getProductLaunchBizId());
if (productInfo != null) {
policy.setInsuranceCompany(productInfo.getInsuranceCompany());
policy.setInsuranceCompanyBizId(productInfo.getInsuranceCompanyBizId());
policy.setReconciliationCompany(productInfo.getReconciliationCompany());
policy.setReconciliationCompanyBizId(productInfo.getReconciliationCompanyBizId());
// 设置对账公司编码
String reconciliationCompanyCode = productInfo.getReconciliationCompanyCode();
if (StringUtils.isBlank(reconciliationCompanyCode)) {
// 如果产品信息中没有编码,则调用对账公司 feignclient
ApiInsuranceReconciliationCompanyPageRequest reconciliationCompanyPageRequest = new ApiInsuranceReconciliationCompanyPageRequest();
reconciliationCompanyPageRequest.setPageNo(1);
reconciliationCompanyPageRequest.setPageSize(999);
Result iPageResult = apiInsuranceReconciliationCompanyFeignClient.page(reconciliationCompanyPageRequest);
// 解析响应获取对账公司编码
if (iPageResult != null && iPageResult.getCode() == 200) {
IPage<ApiInsuranceReconciliationCompanyPageResponse> page = (IPage<ApiInsuranceReconciliationCompanyPageResponse>) iPageResult.getData();
if (page != null && CollectionUtils.isNotEmpty(page.getRecords())) {
// 遍历分页结果,找到匹配的对账公司
String targetBizId = productInfo.getReconciliationCompanyBizId();
for (ApiInsuranceReconciliationCompanyPageResponse response : page.getRecords()) {
if (response != null && targetBizId.equals(response.getReconciliationCompanyBizId())) {
// 尝试从响应中获取对账公司编码
reconciliationCompanyCode = response.getCode();
log.info("从对账公司服务获取编码: reconciliationCompanyBizId={}, code={}",
targetBizId, reconciliationCompanyCode);
break; // 找到后跳出循环
}
}
}
}
// 如果仍然没有获取到编码,抛异常
if (StringUtils.isBlank(reconciliationCompanyCode)) {
throw new BusinessException("未能从对账公司服务获取编码,请补充,当前对账公司:" + productInfo.getReconciliationCompany());
}
}
policy.setReconciliationCompanyCode(reconciliationCompanyCode);
}
}
// 保存保单
policyService.save(policy);
// 根据保单生成预计入账记录
generateExpectedCommission(policyFollow, policy);
// 异步:根据保单生成预计出账记录
CompletableFuture.runAsync(() -> {
try {
ApiGenerateExpectedFortuneRequest getExpectedFortuneRequest = new ApiGenerateExpectedFortuneRequest();
getExpectedFortuneRequest.setPolicyNo(policyFollow.getPolicyNo());
apiExpectedFortuneFeignClient.generate(getExpectedFortuneRequest);
} catch (Exception e) {
log.error("新单跟进-异步生成预计出账记录失败: {}", e.getMessage());
}
});
} }
// 新增新单状态记录 // 新增新单状态记录
...@@ -724,5 +799,74 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol ...@@ -724,5 +799,74 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
return policyBrokerService.saveBatch(brokerList); return policyBrokerService.saveBatch(brokerList);
} }
/**
* 根据保单生成预计入账记录
*
* @param policyFollow 保单跟进信息
*/
private void generateExpectedCommission(PolicyFollow policyFollow, Policy policy) {
if (policyFollow == null) {
return;
}
// 获取必要的参数
String policyNo = policyFollow.getPolicyNo();
String productLaunchBizId = policyFollow.getProductLaunchBizId();
String insuranceCompanyBizId = policyFollow.getInsuranceCompanyBizId();
String reconciliationCompany = policy.getReconciliationCompany();
String reconciliationCompanyCode = policy.getReconciliationCompanyCode();
String reconciliationCompanyBizId = policy.getReconciliationCompanyBizId();
// 调用预计入账服务生成记录
commissionExpectedService.getExpectedCommissionByProductlaunchId(
policyNo,
productLaunchBizId,
insuranceCompanyBizId,
reconciliationCompany,
reconciliationCompanyCode,
reconciliationCompanyBizId
);
}
/**
* 获取单个保单产品信息
*
* @param productLaunchBizId 产品上架业务ID
* @return 产品信息,如果未找到则返回 null
*/
private PolicyProductInfo getPolicyProductInfo(String productLaunchBizId) {
if (StringUtils.isBlank(productLaunchBizId)) {
log.warn("产品上架业务ID为空,无法获取产品信息");
return null;
}
try {
// 调用 PolicyService 的批量查询方法,传入单个 ID
Map<String, PolicyProductInfo> productInfoMap = policyService.getPolicyProductInfoMap(
Collections.singletonList(productLaunchBizId)
);
if (productInfoMap == null || productInfoMap.isEmpty()) {
log.warn("未找到产品信息,productLaunchBizId: {}", productLaunchBizId);
return null;
}
PolicyProductInfo productInfo = productInfoMap.get(productLaunchBizId);
if (productInfo == null) {
log.warn("产品信息为空,productLaunchBizId: {}", productLaunchBizId);
return null;
}
log.info("成功获取产品信息: productLaunchBizId={}, reconciliationCompany={}, reconciliationCompanyCode={}",
productLaunchBizId,
productInfo.getReconciliationCompany(),
productInfo.getReconciliationCompanyCode());
return productInfo;
} catch (Exception e) {
log.error("获取产品信息失败,productLaunchBizId: {}, error: {}", productLaunchBizId, e.getMessage(), e);
return null;
}
}
} }
...@@ -272,6 +272,13 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy> ...@@ -272,6 +272,13 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
case "对账公司": case "对账公司":
productInfo.setReconciliationCompany(value); productInfo.setReconciliationCompany(value);
productInfo.setReconciliationCompanyBizId(attribute.getStr("fieldValueBizId")); productInfo.setReconciliationCompanyBizId(attribute.getStr("fieldValueBizId"));
// 尝试获取对账公司编码(如果 API 响应中有 fieldValueCode 字段)
String reconciliationCompanyCode = attribute.getStr("fieldValueCode");
if (StringUtils.isBlank(reconciliationCompanyCode)) {
// 如果没有 fieldValueCode,尝试从其他字段获取
reconciliationCompanyCode = attribute.getStr("code");
}
productInfo.setReconciliationCompanyCode(reconciliationCompanyCode);
break; break;
case "产品计划类型": case "产品计划类型":
productInfo.setProductPlanType(value); productInfo.setProductPlanType(value);
......
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