Commit f23d9498 by jianan

新单跟进v2

parent c46b3971
...@@ -723,11 +723,11 @@ public class ApiPolicyFollowController { ...@@ -723,11 +723,11 @@ public class ApiPolicyFollowController {
// 设置ThreadLocal Token // 设置ThreadLocal Token
FeignTokenInterceptor.setThreadLocalToken(token); FeignTokenInterceptor.setThreadLocalToken(token);
// 调用 ApiExpectedFortuneService 的 generateWithLogAndRedis(包含日志和Redis处理) // 调用 ApiExpectedFortuneService 的 generateSyncWithLogAndRedis(同步版本,包含日志和Redis处理)
ApiGenerateExpectedFortuneRequest generateExpectedFortuneRequest = new ApiGenerateExpectedFortuneRequest(); ApiGenerateExpectedFortuneRequest generateExpectedFortuneRequest = new ApiGenerateExpectedFortuneRequest();
generateExpectedFortuneRequest.setPolicyNo(policyNo); generateExpectedFortuneRequest.setPolicyNo(policyNo);
log.info("生成预计发佣generateWithLogAndRedis——>PolicyNo:{}", policyNo); log.info("生成预计发佣generateSyncWithLogAndRedis——>PolicyNo:{}", policyNo);
Result<ApiGenerateExpectedFortuneResponse> result = apiExpectedFortuneService.generateWithLogAndRedis(generateExpectedFortuneRequest); Result<ApiGenerateExpectedFortuneResponse> result = apiExpectedFortuneService.generateSyncWithLogAndRedis(generateExpectedFortuneRequest);
if (result == null || result.getCode() != 200) { if (result == null || result.getCode() != 200) {
log.error("新单跟进-同步生成预计出账记录失败:保单号={}, 响应结果={}", log.error("新单跟进-同步生成预计出账记录失败:保单号={}, 响应结果={}",
policyNo, result); policyNo, result);
......
...@@ -32,11 +32,24 @@ public interface ApiExpectedFortuneService { ...@@ -32,11 +32,24 @@ public interface ApiExpectedFortuneService {
*/ */
Result<ApiGenerateExpectedFortuneResponse> generateWithLogAndRedis(ApiGenerateExpectedFortuneRequest request); Result<ApiGenerateExpectedFortuneResponse> generateWithLogAndRedis(ApiGenerateExpectedFortuneRequest request);
Result<ApiGenerateExpectedFortuneResponse> generateSyncWithLogAndRedis(ApiGenerateExpectedFortuneRequest request);
@Async("asyncQueryExecutor") @Async("asyncQueryExecutor")
Result execute(List<QueryPolicyAndBrokerDto> queryPolicyAndBrokerDtoList, Result execute(List<QueryPolicyAndBrokerDto> queryPolicyAndBrokerDtoList,
List<CommissionRuleBinding> commissionRuleBindingList, List<CommissionRuleBinding> commissionRuleBindingList,
String policyNo); String policyNo);
/**
* 同步执行预计发佣生成
* @param queryPolicyAndBrokerDtoList 保单和转介人列表
* @param commissionRuleBindingList 基本法绑定列表
* @param policyNo 保单号
* @return 执行结果
*/
Result executeSync(List<QueryPolicyAndBrokerDto> queryPolicyAndBrokerDtoList,
List<CommissionRuleBinding> commissionRuleBindingList,
String policyNo);
Result<IPage<ApiExpectedFortunePageResponse>> page(ApiExpectedFortunePageRequest request); Result<IPage<ApiExpectedFortunePageResponse>> page(ApiExpectedFortunePageRequest request);
QueryWrapper<ExpectedFortune> getQueryWrapper(ApiExpectedFortunePageRequest request); QueryWrapper<ExpectedFortune> getQueryWrapper(ApiExpectedFortunePageRequest request);
......
...@@ -142,6 +142,51 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService ...@@ -142,6 +142,51 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
} }
/** /**
* 同步生成预计发佣
*
* @param request
* @return
*/
public Result<ApiGenerateExpectedFortuneResponse> generateSync(ApiGenerateExpectedFortuneRequest request) {
//查询当前保单号是否正在执行预计发佣的缓存,有值就说明正在执行,无值说明执行完毕或者没有执行。
String value = redisUtil.getCacheObject(RedisConstants.EXPECTED_FORTUNE + request.getPolicyNo());
if (StringUtil.isNotBlank(value)) {
//有值正在执行,提示
return Result.fail("生成预计发佣正在执行中,无需再次执行");
} else {
//无值设置值,表示正在执行
redisUtil.setCacheObject(RedisConstants.EXPECTED_FORTUNE + request.getPolicyNo(), request.getPolicyNo());
}
List<ExpectedFortune> list = iExpectedFortuneService.queryList(request.getPolicyNo());
if (!CollectionUtils.isEmpty(list)) {
throw new BusinessException("当前保单已经生成过预计发佣数据,无需再次生成");
}
//根据保单号查询保单和转介人列表信息
List<QueryPolicyAndBrokerDto> queryPolicyAndBrokerDtoList = policyService.queryPolicyBrokerList(request.getPolicyNo());
if (CollectionUtils.isEmpty(queryPolicyAndBrokerDtoList)) {
throw new BusinessException("保单和转介人信息不存在");
}
//查询所有绑定基本法的业务员(客户端用户表用户), 计算业务员绑定的所有基本法对应的计算值, 新增积分明细和发佣记录
List<CommissionRuleBinding> commissionRuleBindingList = new ArrayList<>();
//根据租户ID和项目ID查询客户端用户ID列表
Result<List<String>> result = apiClientUserFeignClient.clientUserBizIdList(TenantEnum.YD.getTenantBizId(), ProjectEnum.CSF_MINI_PROGRAM.getProjectBizId());
if (!CollectionUtils.isEmpty(result.getData())) {
commissionRuleBindingList = iCommissionRuleBindingService.queryList(CommissionRuleBindingDto.builder()
.targetIdList(result.getData())
.build());
}
if (CollectionUtils.isEmpty(commissionRuleBindingList)) {
throw new BusinessException("绑定基本法数据不存在");
}
//遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表(同步执行)
executeSync(queryPolicyAndBrokerDtoList, commissionRuleBindingList, request.getPolicyNo());
return Result.success(null, "生成预计发佣成功");
}
/**
* 生成预计发佣(包含日志记录和Redis处理) * 生成预计发佣(包含日志记录和Redis处理)
* 用于内部服务调用,会自动保存日志和异常时销毁Redis缓存 * 用于内部服务调用,会自动保存日志和异常时销毁Redis缓存
* *
...@@ -173,6 +218,37 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService ...@@ -173,6 +218,37 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
} }
/** /**
* 同步生成预计发佣(包含日志记录和Redis处理)
* 用于需要同步等待完成的场景
*
* @param request
* @return
*/
@Override
public Result<ApiGenerateExpectedFortuneResponse> generateSyncWithLogAndRedis(ApiGenerateExpectedFortuneRequest request) {
try {
Result<ApiGenerateExpectedFortuneResponse> result = generateSync(request);
// 保存预计发佣日志记录(成功)
apiExpectedFortuneLogService.saveExpectedFortuneLog(ApiExpectedFortuneLogDto.builder()
.errorMsg(result.getMsg())
.policyNo(request.getPolicyNo())
.status(2)
.build());
return result;
} catch (Exception e) {
// 抛出异常,销毁redis缓存
redisUtil.deleteObject(RedisConstants.EXPECTED_FORTUNE + request.getPolicyNo());
// 保存预计发佣日志记录(失败)
apiExpectedFortuneLogService.saveExpectedFortuneLog(ApiExpectedFortuneLogDto.builder()
.errorMsg(e.getMessage())
.policyNo(request.getPolicyNo())
.status(1)
.build());
throw new BusinessException(e.getMessage());
}
}
/**
* 异步处理-> 遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表 * 异步处理-> 遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表
* *
* @param queryPolicyAndBrokerDtoList * @param queryPolicyAndBrokerDtoList
...@@ -241,6 +317,74 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService ...@@ -241,6 +317,74 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
}); });
} }
/**
* 同步处理-> 遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表
*
* @param queryPolicyAndBrokerDtoList
* @param commissionRuleBindingList
* @param policyNo
* @return
*/
public Result executeSync(List<QueryPolicyAndBrokerDto> queryPolicyAndBrokerDtoList,
List<CommissionRuleBinding> commissionRuleBindingList,
String policyNo) {
// 使用编程式事务,确保方法内的事务一致性
return transactionTemplate.execute(status -> {
try {
for (QueryPolicyAndBrokerDto brokerDto : queryPolicyAndBrokerDtoList) {
Integer paymentTerm = brokerDto.getPaymentTerm();
if (Objects.isNull(paymentTerm)) {
throw new BusinessException("保单的供款年期不存在");
}
for (int i = 1; i <= paymentTerm; i++) {
executeBilling(ExecuteBillingDto.builder()
.name(brokerDto.getBrokerName())
.policyAndBrokerDto(brokerDto)
.issueNumber(i)
.build());
for (CommissionRuleBinding binding : commissionRuleBindingList) {
executeReward(ExecuteBillingDto.builder()
.clientUserBizId(binding.getTargetId())
.name(binding.getTargetName())
.policyAndBrokerDto(brokerDto)
.issueNumber(i)
.build());
}
}
}
//批量设置应付款编号
updatePayableNoBatch(policyNo);
//执行成功完毕,也要销毁redis缓存
redisUtil.deleteObject(RedisConstants.EXPECTED_FORTUNE + policyNo);
//保存预计发佣日志记录
//成功日志
apiExpectedFortuneLogService.saveExpectedFortuneLog(ApiExpectedFortuneLogDto.builder()
.errorMsg("")
.policyNo(policyNo)
.status(0)
.build());
return Result.success();
} catch (Exception e) {
//抛出异常,销毁redis缓存
redisUtil.deleteObject(RedisConstants.EXPECTED_FORTUNE + policyNo);
status.setRollbackOnly(); // 标记回滚
log.error("同步执行预计发佣失败,已回滚所有操作", e);
//保存预计发佣日志记录
apiExpectedFortuneLogService.saveExpectedFortuneLog(ApiExpectedFortuneLogDto.builder()
.errorMsg(e.getMessage())
.policyNo(policyNo)
.status(1)
.build());
throw new BusinessException("同步处理失败: " + e.getMessage());
}
});
}
private void updatePayableNoBatch(String policyNo) { private void updatePayableNoBatch(String policyNo) {
// 查询最新一条有 payableNo 记录 // 查询最新一条有 payableNo 记录
ExpectedFortune latest = iExpectedFortuneService.getOne( ExpectedFortune latest = iExpectedFortuneService.getOne(
......
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