Commit 8d0d7161 by zhangxingmin

基本法 - 算法接口

parent bc285116
package com.yd.csf.api.dto; package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
...@@ -17,6 +16,11 @@ import java.util.List; ...@@ -17,6 +16,11 @@ import java.util.List;
public class AlgorithmDto { public class AlgorithmDto {
/** /**
* 保单发佣批次ID
*/
private String batchBizId;
/**
* 转介人业务ID(客户端用户表唯一业务ID) * 转介人业务ID(客户端用户表唯一业务ID)
*/ */
private String brokerBizId; private String brokerBizId;
......
package com.yd.csf.api.dto; package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data; import lombok.Data;
import java.math.BigDecimal; import java.math.BigDecimal;
...@@ -23,12 +24,18 @@ public class AlgorithmResDto { ...@@ -23,12 +24,18 @@ public class AlgorithmResDto {
private String ruleItemBizId; private String ruleItemBizId;
/** /**
* 基本法项目名称
*/
private String itemName;
/**
* 计算值 - sqlAlgorithmResultDtoList集合里面的计算值和值 * 计算值 - sqlAlgorithmResultDtoList集合里面的计算值和值
*/ */
private BigDecimal calculatedValue; private BigDecimal calculatedValue;
/** /**
* 当前变量绑定的SQL模板计算结果集合列表(含计算值,以及计算值的提供者等等)(sql语句返回多个值作为算子计算) * 当前变量绑定的SQL模板计算结果集合列表(含计算值,以及计算值的提供者等等)(sql语句返回多个值作为算子计算)
* SQL计算结果按照积分贡献者或者其他维度分组的集合计算结果列表
*/ */
private List<SqlAlgorithmResultDto> sqlAlgorithmResultDtoList; private List<SqlAlgorithmResultDto> sqlAlgorithmResultDtoList;
} }
package com.yd.csf.api.dto;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyBroker;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExecuteBillingDto {
private PolicyBroker policyBroker;
private Policy policy;
private Commission commission;
private String batchBizId;
}
package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class GenerateFortuneDto {
/**
* 保单发佣批次ID
*/
private String batchBizId;
/**
* 保单发佣业务id
*/
private String fortuneBizId;
/**
* 保单号
*/
private String policyNo;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
private Integer fortunePeriod;
/**
* 发佣总期数
*/
private Integer fortuneTotalPeriod;
/**
* 转介人
*/
private String broker;
/**
* 转介人业务ID
*/
private String brokerBizId;
/**
* 所属团队
*/
private String team;
/**
* 所属团队业务ID
*/
private String teamBizId;
/**
* 来佣名称
*/
private String fortuneName;
/**
* 发佣类型
*/
private String fortuneType;
/**
* 发佣金额
*/
private BigDecimal amount;
/**
* 发佣币种
*/
private String currency;
/**
* 佣金发放状态 0=待出账 1=可出账 2=已出账
*/
private String status;
/**
* 发佣日期
*/
private Date payoutDate;
/**
* 基本法项目配置表唯一业务ID
*/
private String ruleItemBizId;
/**
* 转介人绑定的基本法列表对应计算值
*/
private List<AlgorithmResDto> algorithmResDtoList;
}
...@@ -65,8 +65,8 @@ public class ApiAgentDetailFycServiceImpl implements ApiAgentDetailFycService { ...@@ -65,8 +65,8 @@ public class ApiAgentDetailFycServiceImpl implements ApiAgentDetailFycService {
agentDetailFyc.setRuleItemBizId(algorithmResDto.getRuleItemBizId()); agentDetailFyc.setRuleItemBizId(algorithmResDto.getRuleItemBizId());
//保单发佣批次ID //保单发佣批次ID
agentDetailFyc.setBatchBizId(dto.getBatchBizId()); agentDetailFyc.setBatchBizId(dto.getBatchBizId());
//积分提供保单表唯一业务ID //积分提供的保单号
agentDetailFyc.setPolicyBizId(dto.getPolicyBizId()); agentDetailFyc.setPolicyNo(dto.getPolicyNo());
//积分提供者(客户端用户表唯一业务ID) //积分提供者(客户端用户表唯一业务ID)
agentDetailFyc.setProvideId(sqlAlgorithmResultDto.getProvider()); agentDetailFyc.setProvideId(sqlAlgorithmResultDto.getProvider());
agentDetailFycList.add(agentDetailFyc); agentDetailFycList.add(agentDetailFyc);
...@@ -89,8 +89,8 @@ public class ApiAgentDetailFycServiceImpl implements ApiAgentDetailFycService { ...@@ -89,8 +89,8 @@ public class ApiAgentDetailFycServiceImpl implements ApiAgentDetailFycService {
agentDetailFyc.setRuleItemBizId(algorithmResDto.getRuleItemBizId()); agentDetailFyc.setRuleItemBizId(algorithmResDto.getRuleItemBizId());
//保单发佣批次ID //保单发佣批次ID
agentDetailFyc.setBatchBizId(dto.getBatchBizId()); agentDetailFyc.setBatchBizId(dto.getBatchBizId());
//积分提供保单表唯一业务ID //积分提供的保单号
agentDetailFyc.setPolicyBizId(dto.getPolicyBizId()); agentDetailFyc.setPolicyNo(dto.getPolicyNo());
//积分提供者(客户端用户表唯一业务ID) //积分提供者(客户端用户表唯一业务ID)
// agentDetailFyc.setProvideId(sqlAlgorithmResultDto.getProvider()); // agentDetailFyc.setProvideId(sqlAlgorithmResultDto.getProvider());
agentDetailFycList.add(agentDetailFyc); agentDetailFycList.add(agentDetailFyc);
......
package com.yd.csf.api.service.impl; package com.yd.csf.api.service.impl;
import com.yd.common.constant.CodeGeneratorConstants;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException; import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result; import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.dto.*; import com.yd.csf.api.dto.*;
import com.yd.csf.api.service.ApiAgentDetailFycService; import com.yd.csf.api.service.ApiAgentDetailFycService;
import com.yd.csf.api.service.ApiBasicLawCalculateService; import com.yd.csf.api.service.ApiBasicLawCalculateService;
...@@ -10,6 +13,7 @@ import com.yd.csf.feign.enums.VariableEnum; ...@@ -10,6 +13,7 @@ import com.yd.csf.feign.enums.VariableEnum;
import com.yd.csf.feign.request.basiclawcalculate.ApiGenerateBillingRequest; import com.yd.csf.feign.request.basiclawcalculate.ApiGenerateBillingRequest;
import com.yd.csf.feign.response.basiclawcalculate.ApiGenerateBillingResponse; import com.yd.csf.feign.response.basiclawcalculate.ApiGenerateBillingResponse;
import com.yd.csf.service.dto.*; import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.FortuneStatusEnum;
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.insurance.base.feign.client.ApiRelProductAnnouncementFeignClient; import com.yd.insurance.base.feign.client.ApiRelProductAnnouncementFeignClient;
...@@ -19,6 +23,7 @@ import org.springframework.beans.BeanUtils; ...@@ -19,6 +23,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.script.ScriptEngine; import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager; import javax.script.ScriptEngineManager;
...@@ -40,9 +45,6 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ ...@@ -40,9 +45,6 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
private CommissionService commissionService; private CommissionService commissionService;
@Autowired @Autowired
private ApiRelProductAnnouncementFeignClient apiRelProductAnnouncementFeignClient;
@Autowired
private PolicyBrokerService policyBrokerService; private PolicyBrokerService policyBrokerService;
@Autowired @Autowired
...@@ -72,6 +74,12 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ ...@@ -72,6 +74,12 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
@Autowired @Autowired
private ApiAgentDetailFycService apiAgentDetailFycService; private ApiAgentDetailFycService apiAgentDetailFycService;
@Autowired
private FortuneService fortuneService;
@Autowired
private TransactionTemplate transactionTemplate;
/** /**
* 获取JdbcTemplate(需要注入) * 获取JdbcTemplate(需要注入)
*/ */
...@@ -106,8 +114,11 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ ...@@ -106,8 +114,11 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
//获取保单号列表 //获取保单号列表
List<String> policyNoList = distinctCommissionList.stream().map(Commission::getPolicyNo).collect(Collectors.toList()); List<String> policyNoList = distinctCommissionList.stream().map(Commission::getPolicyNo).collect(Collectors.toList());
//查询保单列表信息 //查询保单列表信息
List<Policy> policyList = policyService.queryList(PolicyDto.builder().policyNoList(policyNoList).build()); List<Policy> policyList = policyService.queryList(QueryPolicyDto.builder().policyNoList(policyNoList).build());
//保单绑定的转介人去重列表(用于奖励基本法项目计算)
List<PolicyBroker> policyBrokerDistinctList = new ArrayList<>();
//保单发佣批次ID
String batchBizId = RandomStringGenerator.generateBizId16(CodeGeneratorConstants.PREFIX_FORTUNE_BATCH_BIZ_ID);
if (!CollectionUtils.isEmpty(policyList)) { if (!CollectionUtils.isEmpty(policyList)) {
//查询保单转介人(销售人员)关系数据 //查询保单转介人(销售人员)关系数据
List<PolicyBroker> policyBrokerList = policyBrokerService.queryList(QueryPolicyBrokerDto.builder().policyNoList(policyNoList).build()); List<PolicyBroker> policyBrokerList = policyBrokerService.queryList(QueryPolicyBrokerDto.builder().policyNoList(policyNoList).build());
...@@ -117,40 +128,244 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ ...@@ -117,40 +128,244 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
if (!CollectionUtils.isEmpty(policyBrokerList)) { if (!CollectionUtils.isEmpty(policyBrokerList)) {
thisPolicyBrokerList = policyBrokerList.stream().filter(d -> d.getPolicyNo().equals(policy.getPolicyNo())).collect(Collectors.toList()); thisPolicyBrokerList = policyBrokerList.stream().filter(d -> d.getPolicyNo().equals(policy.getPolicyNo())).collect(Collectors.toList());
} }
//根据保单号获取来佣记录(获取币种等信息)
List<Commission> thisPolicyCommissionList = new ArrayList<>();
Commission commission = null;
if (!CollectionUtils.isEmpty(distinctCommissionList)) {
thisPolicyCommissionList = distinctCommissionList.stream().filter(d -> d.getPolicyNo().equals(policy.getPolicyNo())).collect(Collectors.toList());
commission = thisPolicyCommissionList.get(0);
}
if (!CollectionUtils.isEmpty(thisPolicyBrokerList)) { if (!CollectionUtils.isEmpty(thisPolicyBrokerList)) {
//遍历当前保单绑定的转介人列表,根据人绑定的基本法项目(计算销售佣金,推荐佣金,辅导员佣金,终身推荐奖等。)绑定什么项目算什么金额,按照佣金项目执行顺序来计算。 //遍历当前保单绑定的转介人列表,根据人绑定的基本法项目(计算销售佣金,推荐佣金,辅导员佣金,终身推荐奖等。)绑定什么项目算什么金额,按照佣金项目执行顺序来计算。
for (PolicyBroker policyBroker : thisPolicyBrokerList) { for (PolicyBroker policyBroker : thisPolicyBrokerList) {
//构造销售佣金基本法项目的顺序下标值执行 //执行 - 销售佣金 - 出账
List<Integer> executionOrderList = new ArrayList<>(); executeBilling(ExecuteBillingDto.builder()
executionOrderList.add(1); .batchBizId(batchBizId)
.commission(commission)
//保单出账先执行销售佣金基本法项目,入完到积分明细表里后,再执行保单绑定人的其他基本法项目 .policy(policy)
Result<List<AlgorithmResDto>> result = policyBrokerAlgorithm(AlgorithmDto.builder() .policyBroker(policyBroker)
.brokerBizId(policyBroker.getBrokerBizId())
.executionOrderList(executionOrderList)
.isNegateExecutionOrderList(false)
.build()); .build());
policyBrokerDistinctList.add(policyBroker);
}
}
}
}
//生成业务员(转介人)积分明细表记录(销售积分) // 在事务外部先处理好去重逻辑
generateAgentDetailFyc(GenerateAgentDetailFycDto.builder() List<PolicyBroker> distinctBrokers = policyBrokerDistinctList.stream()
.agentId(policyBroker.getBrokerBizId()) .collect(Collectors.collectingAndThen(
.policyNo(policy.getPolicyNo()) Collectors.toMap(
.algorithmResDtoList(result.getData()) PolicyBroker::getBrokerBizId,
// .sourceType() Function.identity(),
.build()); (existing, replacement) -> existing
),
map -> new ArrayList<>(map.values())));
// 以上数据库事务执行完毕后再执行以下事务
transactionTemplate.execute(status -> {
if (!CollectionUtils.isEmpty(distinctBrokers)) {
for (PolicyBroker policyBroker : distinctBrokers) {
//执行 - 奖励
executeReward(ExecuteBillingDto.builder()
.batchBizId(batchBizId)
.policyBroker(policyBroker)
.build());
}
}
return null;
});
return Result.success();
}
/**
* 执行 - 奖励
* @param dto
* @return
*/
public Result executeReward(ExecuteBillingDto dto) {
PolicyBroker policyBroker = dto.getPolicyBroker();
// Policy policy = dto.getPolicy();
// Commission commission = dto.getCommission();
String batchBizId = dto.getBatchBizId();
//构造销售佣金基本法项目的顺序下标值执行
List<Integer> executionOrderList = new ArrayList<>();
executionOrderList.add(1);
//执行保单绑定人的非销售佣金基本法项目
Result<List<AlgorithmResDto>> result = policyBrokerAlgorithm(AlgorithmDto.builder()
.batchBizId(batchBizId)
.brokerBizId(policyBroker.getBrokerBizId())
.executionOrderList(executionOrderList)
.isNegateExecutionOrderList(true)
.build());
//生成业务员(转介人)积分明细表记录
generateAgentDetailFyc(GenerateAgentDetailFycDto.builder()
.batchBizId(batchBizId)
.agentId(policyBroker.getBrokerBizId())
// .policyNo(policy.getPolicyNo())
.algorithmResDtoList(result.getData())
// .sourceType()
.build());
//生成销售-保单发佣表记录
generateFortune(GenerateFortuneDto.builder()
//转介人绑定的基本法列表对应计算值
.algorithmResDtoList(result.getData())
//保单发佣批次ID
.batchBizId(batchBizId)
//转介人姓名
.broker(policyBroker.getBrokerName())
//转介人业务ID
.brokerBizId(policyBroker.getBrokerBizId())
//发佣币种
// .currency(!Objects.isNull(commission) ? commission.getCurrency() : "")
//保单发佣业务id
.fortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()))
//来佣名称
// .fortuneName("销售佣金")
//发佣期数
// .fortunePeriod(!Objects.isNull(commission) ? commission.getCommissionPeriod() : 0)
//发佣总期数
// .fortuneTotalPeriod(!Objects.isNull(commission) ? commission.getTotalPeriod() : 0)
//发佣类型 TODO
// .fortuneType()
//发佣日期
.payoutDate(new Date())
//保单号
// .policyNo(policy.getPolicyNo())
//佣金发放状态 0=待出账 1=可出账 2=已出账
.status(FortuneStatusEnum.WAIT.getItemValue())
//所属团队 TODO
// .team()
//所属团队业务ID TODO
// .teamBizId()
.build());
return Result.success();
}
/**
* 执行 - 销售佣金 - 出账
* @param dto
* @return
*/
public Result executeBilling(ExecuteBillingDto dto) {
PolicyBroker policyBroker = dto.getPolicyBroker();
Policy policy = dto.getPolicy();
Commission commission = dto.getCommission();
String batchBizId = dto.getBatchBizId();
//构造销售佣金基本法项目的顺序下标值执行
List<Integer> executionOrderList = new ArrayList<>();
executionOrderList.add(1);
//保单出账先执行销售佣金基本法项目,入完到积分明细表里后,再执行保单绑定人的其他基本法项目
Result<List<AlgorithmResDto>> result = policyBrokerAlgorithm(AlgorithmDto.builder()
.brokerBizId(policyBroker.getBrokerBizId())
.executionOrderList(executionOrderList)
.isNegateExecutionOrderList(false)
.build());
//生成业务员(转介人)积分明细表记录(销售积分)
generateAgentDetailFyc(GenerateAgentDetailFycDto.builder()
.agentId(policyBroker.getBrokerBizId())
.policyNo(policy.getPolicyNo())
.algorithmResDtoList(result.getData())
// .sourceType()
.build());
//生成销售-保单发佣表记录
generateFortune(GenerateFortuneDto.builder()
//转介人绑定的基本法列表对应计算值
.algorithmResDtoList(result.getData())
//保单发佣批次ID
.batchBizId(batchBizId)
//转介人姓名
.broker(policyBroker.getBrokerName())
//转介人业务ID
.brokerBizId(policyBroker.getBrokerBizId())
//发佣币种
.currency(!Objects.isNull(commission) ? commission.getCurrency() : "")
//保单发佣业务id
.fortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()))
//来佣名称
.fortuneName("销售佣金")
//发佣期数
.fortunePeriod(!Objects.isNull(commission) ? commission.getCommissionPeriod() : 0)
//发佣总期数
.fortuneTotalPeriod(!Objects.isNull(commission) ? commission.getTotalPeriod() : 0)
//发佣类型 TODO
// .fortuneType()
//发佣日期
.payoutDate(new Date())
//保单号
.policyNo(policy.getPolicyNo())
//佣金发放状态 0=待出账 1=可出账 2=已出账
.status(FortuneStatusEnum.WAIT.getItemValue())
//所属团队 TODO
// .team()
//所属团队业务ID TODO
// .teamBizId()
.build());
//生成保单发佣表记录 return Result.success();
}
/**
* 生成保单发佣表记录(出账记录)
* @return
*/
public Result generateFortune(GenerateFortuneDto fortuneDto) {
if (!CollectionUtils.isEmpty(fortuneDto.getAlgorithmResDtoList())
&& fortuneDto.getAlgorithmResDtoList().size() == 1) {
//单个基本法项目绑定,新增单个发拥记录
//转介人绑定的基本法列表对应计算值列表不为空,且集合数量只有一条数据
AlgorithmResDto algorithmResDto = fortuneDto.getAlgorithmResDtoList().get(0);
if (!Objects.isNull(algorithmResDto)) {
//发佣金额 = 基本法计算值
fortuneDto.setAmount(algorithmResDto.getCalculatedValue());
//基本法项目配置表唯一业务ID
fortuneDto.setRuleItemBizId(algorithmResDto.getRuleItemBizId());
}
Fortune fortune = new Fortune();
BeanUtils.copyProperties(fortuneDto,fortune);
fortuneService.saveOrUpdate(fortune);
}else {
List<Fortune> fortuneList = new ArrayList<>();
//多个基本法项目绑定,批量新增多个发拥记录(每个基本法项目计算对象如果存在SQL模板计算多个结果列表(按照积分贡献者维度分组返回计算结果))
for (AlgorithmResDto algorithmResDto : fortuneDto.getAlgorithmResDtoList()) {
if (!CollectionUtils.isEmpty(algorithmResDto.getSqlAlgorithmResultDtoList())
&& algorithmResDto.getSqlAlgorithmResultDtoList().size() > 1) {
//SQL执行结果有多条(大于1条)计算值记录(按照积分贡献者维度分组返回的记录)- 新增发佣记录也按照这个维度新增记录
for (SqlAlgorithmResultDto sqlAlgorithmResultDto : algorithmResDto.getSqlAlgorithmResultDtoList()) {
Fortune fortune = new Fortune();
//发佣金额 - 根据积分贡献者维度提供的积分新增发佣金记录
fortuneDto.setAmount(new BigDecimal(sqlAlgorithmResultDto.getCalculatedValue()));
//来佣名称 - 基本法项目名称
fortuneDto.setFortuneName(algorithmResDto.getItemName());
BeanUtils.copyProperties(fortuneDto,fortune);
fortuneList.add(fortune);
} }
}else {
List<SqlAlgorithmResultDto> sqlAlgorithmResultDtoList = algorithmResDto.getSqlAlgorithmResultDtoList();
SqlAlgorithmResultDto resultDto = sqlAlgorithmResultDtoList.get(0);
Fortune fortune = new Fortune();
//发佣金额 - 根据基本法项目维度计算的值来取值
fortuneDto.setAmount(algorithmResDto.getCalculatedValue());
//来佣名称 - 基本法项目名称
fortuneDto.setFortuneName(algorithmResDto.getItemName());
BeanUtils.copyProperties(fortuneDto,fortune);
fortuneList.add(fortune);
} }
} }
if (!CollectionUtils.isEmpty(fortuneList)) {
fortuneService.saveOrUpdateBatch(fortuneList);
}
} }
return null; return Result.success();
} }
public Result saveBatchFortune() {
}
/** /**
* 生成业务员(转介人)积分明细表记录 * 生成业务员(转介人)积分明细表记录
* @return * @return
...@@ -214,6 +429,11 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ ...@@ -214,6 +429,11 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
algorithmDto.setRuleItemBizId(ruleItemConfig.getRuleItemBizId()); algorithmDto.setRuleItemBizId(ruleItemConfig.getRuleItemBizId());
//算法-计算-基本法项目 //算法-计算-基本法项目
Result<AlgorithmResDto> result = ruleItemAlgorithm(algorithmDto); Result<AlgorithmResDto> result = ruleItemAlgorithm(algorithmDto);
AlgorithmResDto algorithmResDto = result.getData();
if (!Objects.isNull(algorithmResDto)) {
//基本法项目名称
algorithmResDto.setItemName(ruleItemConfig.getItemName());
}
algorithmResDtoList.add(result.getData()); algorithmResDtoList.add(result.getData());
} }
return Result.success(algorithmResDtoList); return Result.success(algorithmResDtoList);
...@@ -237,6 +457,7 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ ...@@ -237,6 +457,7 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
RelObjectFormula relObjectFormula = relObjectFormulaList.get(0); RelObjectFormula relObjectFormula = relObjectFormulaList.get(0);
//公式配置表唯一业务ID //公式配置表唯一业务ID
algorithmDto.setFormulaBizId(relObjectFormula.getFormulaBizId()); algorithmDto.setFormulaBizId(relObjectFormula.getFormulaBizId());
//算法-计算-公式
Result<AlgorithmResDto> result = calculationFormulaAlgorithm(algorithmDto); Result<AlgorithmResDto> result = calculationFormulaAlgorithm(algorithmDto);
AlgorithmResDto dto = result.getData(); AlgorithmResDto dto = result.getData();
dto.setRuleBizId(algorithmDto.getRuleBizId()); dto.setRuleBizId(algorithmDto.getRuleBizId());
...@@ -291,12 +512,54 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ ...@@ -291,12 +512,54 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
resDto.setCalculatedValue(result); resDto.setCalculatedValue(result);
//TODO 前变量绑定的SQL模板计算结果集合列表(含计算值,以及计算值的提供者等等) //通过计算公式-计算变量绑定的SQL模板计算结果集合列表
// resDto.setSqlAlgorithmResultDtoList(); Result<List<SqlAlgorithmResultDto>> listResult = calculateSqlAlgorithmResultDtoList(calculationFormulaBizId,variableValues);
resDto.setSqlAlgorithmResultDtoList(listResult.getData());
return Result.success(resDto); return Result.success(resDto);
} }
/** /**
* 通过计算公式-计算变量绑定的SQL模板计算结果集合列表(大于一条SQL结果记录需要按照积分贡献者或者其他分组情况维度计算,一条SQL结果不需要这样计算,单独调用方法计算)
* @param calculationFormulaBizId
* @param variableValues
* @return
*/
public Result<List<SqlAlgorithmResultDto>> calculateSqlAlgorithmResultDtoList(String calculationFormulaBizId,
List<VariableAlgorithmDto> variableValues) {
List<SqlAlgorithmResultDto> sqlAlgorithmResultDtoList = new ArrayList<>();
//查询出绑定的SQL模板计算结果集合列表长度大于1的记录
List<VariableAlgorithmDto> filterList = variableValues.stream()
.filter(dto -> !CollectionUtils.isEmpty(dto.getSqlAlgorithmResultDtoList())
&& dto.getSqlAlgorithmResultDtoList().size() > 1).collect(Collectors.toList());
//查询出绑定的SQL模板计算结果集合列表长度小于等于1的记录(作为SQL模板计算结果集合列表长度大于1的记录的公式算子)
List<VariableAlgorithmDto> otherList = variableValues.stream()
.filter(dto -> !CollectionUtils.isEmpty(dto.getSqlAlgorithmResultDtoList())
&& dto.getSqlAlgorithmResultDtoList().size() <= 1).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(filterList) && filterList.size() == 1) {
VariableAlgorithmDto algorithmDto = filterList.get(0);
if (!CollectionUtils.isEmpty(algorithmDto.getSqlAlgorithmResultDtoList())) {
for (SqlAlgorithmResultDto sqlAlgorithmResultDto : algorithmDto.getSqlAlgorithmResultDtoList()) {
List<VariableAlgorithmDto> dtoList = new ArrayList<>();
dtoList.addAll(otherList);
//构造evaluateFormula计算方法的VariableAlgorithmDto对象
VariableAlgorithmDto dto = new VariableAlgorithmDto();
dto.setCalculatedValue(sqlAlgorithmResultDto.getCalculatedValue());
dto.setVariableBizId(algorithmDto.getVariableBizId());
dtoList.add(dto);
//计算公式 - 将变量值代入公式进行计算
BigDecimal result = evaluateFormula(calculationFormulaBizId,dtoList);
SqlAlgorithmResultDto resultDto = new SqlAlgorithmResultDto();
resultDto.setCalculatedValue(result.toString());
resultDto.setProvider(sqlAlgorithmResultDto.getProvider());
sqlAlgorithmResultDtoList.add(resultDto);
}
}
}
return Result.success(sqlAlgorithmResultDtoList);
}
/**
* 计算公式 - 将变量值代入公式进行计算 * 计算公式 - 将变量值代入公式进行计算
* @param formula 公式字符串,如:"(variable_1001 + variable_2123) * variable_4455" * @param formula 公式字符串,如:"(variable_1001 + variable_2123) * variable_4455"
* @param variableValues 变量值列表 * @param variableValues 变量值列表
......
package com.yd.csf.service.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class QueryPolicyDto {
/**
* 保单号列表
*/
private List<String> policyNoList;
}
...@@ -146,6 +146,11 @@ public class Fortune implements Serializable { ...@@ -146,6 +146,11 @@ public class Fortune implements Serializable {
private String calculationFormula; private String calculationFormula;
/** /**
* 基本法项目配置表唯一业务ID
*/
private String ruleItemBizId;
/**
* 通用备注 * 通用备注
*/ */
private String remark; private String remark;
......
...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; ...@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.service.dto.PolicyDto; import com.yd.csf.service.dto.PolicyDto;
import com.yd.csf.service.dto.PolicyQueryRequest; import com.yd.csf.service.dto.PolicyQueryRequest;
import com.yd.csf.service.dto.PolicyUpdateRequest; import com.yd.csf.service.dto.PolicyUpdateRequest;
import com.yd.csf.service.dto.QueryPolicyDto;
import com.yd.csf.service.model.Policy; import com.yd.csf.service.model.Policy;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.vo.PolicyVO; import com.yd.csf.service.vo.PolicyVO;
...@@ -25,5 +26,5 @@ public interface PolicyService extends IService<Policy> { ...@@ -25,5 +26,5 @@ public interface PolicyService extends IService<Policy> {
Boolean updatePolicy(PolicyUpdateRequest policyUpdateRequest); Boolean updatePolicy(PolicyUpdateRequest policyUpdateRequest);
List<Policy> queryList(PolicyDto dto); List<Policy> queryList(QueryPolicyDto dto);
} }
...@@ -10,6 +10,7 @@ import com.yd.common.exception.BusinessException; ...@@ -10,6 +10,7 @@ import com.yd.common.exception.BusinessException;
import com.yd.csf.service.dto.PolicyDto; import com.yd.csf.service.dto.PolicyDto;
import com.yd.csf.service.dto.PolicyQueryRequest; import com.yd.csf.service.dto.PolicyQueryRequest;
import com.yd.csf.service.dto.PolicyUpdateRequest; import com.yd.csf.service.dto.PolicyUpdateRequest;
import com.yd.csf.service.dto.QueryPolicyDto;
import com.yd.csf.service.model.AppointmentFile; import com.yd.csf.service.model.AppointmentFile;
import com.yd.csf.service.model.Policy; import com.yd.csf.service.model.Policy;
import com.yd.csf.service.service.PolicyPolicyholderService; import com.yd.csf.service.service.PolicyPolicyholderService;
...@@ -106,7 +107,7 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy> ...@@ -106,7 +107,7 @@ public class PolicyServiceImpl extends ServiceImpl<PolicyMapper, Policy>
* @return * @return
*/ */
@Override @Override
public List<Policy> queryList(PolicyDto dto) { public List<Policy> queryList(QueryPolicyDto dto) {
List<Policy> list = baseMapper.selectList(new LambdaQueryWrapper<Policy>() List<Policy> list = baseMapper.selectList(new LambdaQueryWrapper<Policy>()
.in(!CollectionUtils.isEmpty(dto.getPolicyNoList()),Policy::getPolicyNo,dto.getPolicyNoList()) .in(!CollectionUtils.isEmpty(dto.getPolicyNoList()),Policy::getPolicyNo,dto.getPolicyNoList())
); );
......
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