FeeRuleSchemeServiceImpl.java 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829
  1. package com.ydtech.modules.fee.service.impl;
  2. import com.ydtech.exception.SystemException;
  3. import com.ydtech.modules.admin.model.SysDept;
  4. import com.ydtech.modules.admin.model.SysUser;
  5. import com.ydtech.modules.admin.service.SysDeptService;
  6. import com.ydtech.modules.admin.service.SysUserService;
  7. import com.ydtech.modules.esm.model.EsmRetail;
  8. import com.ydtech.modules.esm.model.EsmUserReferrer;
  9. import com.ydtech.modules.esm.service.EsmRetailService;
  10. import com.ydtech.modules.esm.service.EsmUserReferrerService;
  11. import com.ydtech.modules.fee.dto.FeeFactorInfoDto;
  12. import com.ydtech.modules.fee.dto.FeeSchemeReqDto;
  13. import com.ydtech.modules.fee.dto.FeeSchemeResDto;
  14. import com.ydtech.modules.fee.service.FeeRuleSchemeService;
  15. import com.ydtech.modules.ins.model.vo.CarInfoVo;
  16. import com.ydtech.modules.ins.model.vo.KindInfoVo;
  17. import com.ydtech.modules.ins.model.vo.QuoteRespVo;
  18. import com.ydtech.modules.order.entity.InsFeeOrder;
  19. import com.ydtech.modules.order.entity.InsOrders;
  20. import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
  21. import com.ydtech.modules.order.service.InsFeeOrderService;
  22. import com.ydtech.modules.order.service.InsOrdersService;
  23. import com.ydtech.modules.protocol.entity.po.PtlAgreementProductCosts;
  24. import com.ydtech.modules.protocol.service.PtlAgreementProductCostsService;
  25. import org.apache.commons.lang3.StringUtils;
  26. import org.apache.commons.lang3.math.NumberUtils;
  27. import org.springframework.stereotype.Service;
  28. import javax.annotation.Resource;
  29. import java.math.BigDecimal;
  30. import java.util.*;
  31. import java.util.stream.Collectors;
  32. /**
  33. * 费用接口中相关功能的实现类
  34. */
  35. @Service
  36. public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
  37. @Resource
  38. private PtlAgreementProductCostsService ptlAgreementProductCostsService;
  39. @Resource
  40. private InsOrdersService insOrdersService;
  41. @Resource
  42. private InsFeeOrderService insFeeOrderService;
  43. @Resource
  44. private SysUserService sysUserService;
  45. @Resource
  46. private SysDeptService sysDeptService;
  47. @Resource
  48. private EsmRetailService esmRetailService;
  49. @Resource
  50. private EsmUserReferrerService esmUserReferrerService;
  51. /**
  52. * 根据跟单信息,以及配置的费用因子,获取合适的跟单费用
  53. * @param feeSchemeReqDto
  54. * @return
  55. */
  56. public FeeSchemeResDto matchTheAppropriateFees(FeeSchemeReqDto feeSchemeReqDto) {
  57. FeeSchemeResDto feeSchemeResDto=new FeeSchemeResDto();
  58. //先根据业务类别、有效期、协议编码、历史标志代码字段 获取对应费用方案列表
  59. List<PtlAgreementProductCosts> ptlAgreementProductCosts =ptlAgreementProductCostsService.selectVliadFeeFactor(feeSchemeReqDto.getBusType(),feeSchemeReqDto.getAgreementId());
  60. if (ptlAgreementProductCosts.isEmpty()) {
  61. //如果查询不到费用方案信息,则阻断算费流程,进行提示
  62. throw new SystemException("未查询到费用配置,请先配置该协议的费用方案!");
  63. }else{
  64. //符合跟单信息的方案列表
  65. List<PtlAgreementProductCosts> validSchemeList=new ArrayList();
  66. //循环符合的方案列表,再进行细化的因子匹配,获取最终可以匹配到的方案
  67. for(int i=0;i<ptlAgreementProductCosts.size();i++){
  68. PtlAgreementProductCosts factorCost=ptlAgreementProductCosts.get(i);
  69. //获取处理后的待校验因子
  70. Map<Integer, FeeFactorInfoDto> factorToBeVerified=getFactorToBeVerified(factorCost);
  71. //按规则拼接跟单信息
  72. String matchKeyStr=getMatchKeyWithInsuranceInfo(feeSchemeReqDto);
  73. //循环进行各项因子校验
  74. boolean checkFlag=checkFactorValidWithInsuranceInfo(matchKeyStr,factorToBeVerified);
  75. //如果该方案所有因子都校验通过,则放入符合校验方案列表
  76. if(checkFlag){
  77. validSchemeList.add(factorCost);
  78. }
  79. }
  80. if(validSchemeList.size()>0){
  81. //先判断匹配到的是不是只有兜底类型,如果不是则过滤掉兜底类型的费用,优先以跟单的为准,如果只有兜底类型,则按同样逻辑进行筛选
  82. //根据ProductId去重后的结果集
  83. List tempList=validSchemeList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PtlAgreementProductCosts :: getProductId))), ArrayList::new));
  84. if(tempList.size()>1){//如果有多种类型,则过滤掉兜底类型的
  85. validSchemeList=validSchemeList.stream().filter(x -> !"039999".equals(x.getProductId())).collect(Collectors.toList());
  86. }
  87. //匹配到唯一一条费用方案,直接用这条
  88. if(validSchemeList.size()==1){
  89. //进行费用比例赋值,给返回对象
  90. feeSchemeResDto=generateSchemeResDto((PtlAgreementProductCosts)validSchemeList.get(0));
  91. }else{
  92. //如果最终符合的有多条,则按特殊规则选择其中一条
  93. PtlAgreementProductCosts finalSchemeCost=changeSchemeWithSpecialRule(validSchemeList,feeSchemeReqDto);
  94. //进行费用比例赋值,给返回对象
  95. feeSchemeResDto=generateSchemeResDto(finalSchemeCost);
  96. }
  97. }else{
  98. throw new SystemException("未匹配到合适的费用方案,请先配置该协议的费用方案!");
  99. }
  100. }
  101. return feeSchemeResDto;
  102. }
  103. /**
  104. * 特殊处理选择费用方案
  105. * 如果最终符合的有多条,则先看交强、商业谁的保费多,然后根据保费多得在匹配到的方案中找费用比例大的那一条
  106. * @param validSchemeList
  107. * @param feeSchemeReqDto
  108. * @return
  109. */
  110. private PtlAgreementProductCosts changeSchemeWithSpecialRule(List<PtlAgreementProductCosts> validSchemeList, FeeSchemeReqDto feeSchemeReqDto) {
  111. PtlAgreementProductCosts finalScheme=null;
  112. //险种标志,最终取哪个险种费用比例 1取交强 2取商业
  113. String riskFlag="";
  114. //判断险种标志
  115. if("0330".equals(feeSchemeReqDto.getBusType())){//单交
  116. riskFlag="1";
  117. }else if("034001".equals(feeSchemeReqDto.getBusType())){//单商
  118. riskFlag="2";
  119. }else if("034002".equals(feeSchemeReqDto.getBusType())){//单三
  120. riskFlag="2";
  121. }else if("0330034002".equals(feeSchemeReqDto.getBusType())){//交三
  122. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  123. riskFlag="2";
  124. }else{
  125. riskFlag="1";
  126. }
  127. }else if("0330034001".equals(feeSchemeReqDto.getBusType())){//交商
  128. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  129. riskFlag="2";
  130. }else{
  131. riskFlag="1";
  132. }
  133. }
  134. //循环找出对应比例最大的
  135. for(int i=0;i<validSchemeList.size();i++){
  136. PtlAgreementProductCosts tempCostDto=validSchemeList.get(i);
  137. if(finalScheme!=null){
  138. if("1".equals(riskFlag)){//按交强比例排序,找比例最大的
  139. if(Double.parseDouble(finalScheme.getJqCostsProportion())<Double.parseDouble(tempCostDto.getJqCostsProportion())){
  140. finalScheme=tempCostDto;
  141. }
  142. }else if("2".equals(riskFlag)){//按商业比例排序,找比例最大的
  143. if(Double.parseDouble(finalScheme.getSyCostsProportion())<Double.parseDouble(tempCostDto.getSyCostsProportion())){
  144. finalScheme=tempCostDto;
  145. }
  146. }
  147. }else{
  148. finalScheme=tempCostDto;
  149. }
  150. }
  151. return finalScheme;
  152. }
  153. /**
  154. * 组装费用接口反参对象
  155. * @param agreementProductCost
  156. * @return
  157. */
  158. private FeeSchemeResDto generateSchemeResDto(PtlAgreementProductCosts agreementProductCost) {
  159. FeeSchemeResDto resDto=new FeeSchemeResDto();
  160. resDto.setAgreementId(agreementProductCost.getAgreementId());
  161. resDto.setSchemeId(agreementProductCost.getId());
  162. resDto.setJqSpilloverPremiums(agreementProductCost.getJqSpilloverPremiums());
  163. resDto.setJqSpilloverProportion(agreementProductCost.getJqSpilloverProportion());
  164. resDto.setJqNewCarCostsProportion(agreementProductCost.getJqNewCarCostsProportion());
  165. resDto.setJqOldCarCostsProportion(agreementProductCost.getJqOldCarCostsProportion());
  166. resDto.setJqCostsProportion(agreementProductCost.getJqCostsProportion());
  167. resDto.setJqNewCarOtherCostsProportion(agreementProductCost.getJqNewCarOtherCostsProportion());
  168. resDto.setJqOldCarOtherCostsProportion(agreementProductCost.getJqOldCarOtherCostsProportion());
  169. resDto.setSySpilloverPremiums(agreementProductCost.getSySpilloverPremiums());
  170. resDto.setSySpilloverProportion(agreementProductCost.getSySpilloverProportion());
  171. resDto.setSyNewCarCostsProportion(agreementProductCost.getSyNewCarCostsProportion());
  172. resDto.setSyOldCarCostsProportion(agreementProductCost.getSyOldCarCostsProportion());
  173. resDto.setSyCostsProportion(agreementProductCost.getSyCostsProportion());
  174. resDto.setSyNewCarOtherCostsProportion(agreementProductCost.getSyNewCarOtherCostsProportion());
  175. resDto.setSyOldCarOtherCostsProportion(agreementProductCost.getSyOldCarOtherCostsProportion());
  176. return resDto;
  177. }
  178. /**
  179. * 根据跟单信息,循环各项因子 校验该方案的匹配情况
  180. * @param matchKeyStr
  181. * @param factorToBeVerified
  182. * @return
  183. */
  184. private boolean checkFactorValidWithInsuranceInfo(String matchKeyStr, Map<Integer, FeeFactorInfoDto> factorToBeVerified) {
  185. boolean result=false; //默认没有匹配到
  186. String[] matchKeys= matchKeyStr.split(",");
  187. //循环待校验因子列表
  188. for(Map.Entry<Integer,FeeFactorInfoDto> entry : factorToBeVerified.entrySet()){
  189. Integer key=entry.getKey();
  190. FeeFactorInfoDto checkFactorInfo=entry.getValue();
  191. //先看该方案是否需要匹配该因子,不需要则跳过本条因子
  192. if(!checkFactorInfo.isNeedMatch()){
  193. continue;
  194. }
  195. //下面处理需要进行匹配的因子
  196. if("1".equals(checkFactorInfo.getMatchType())){//1.单字符串匹配(相等)
  197. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  198. if(checkFactorInfo.getSingleSelectVal().equals(matchKeys[key])){
  199. result=true;
  200. continue;
  201. }else{
  202. //如果需要匹配且没有匹配到,则直接跳出本次循环,该方案不符合
  203. result=false;
  204. break;
  205. }
  206. }else{
  207. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  208. result=false;
  209. break;
  210. }
  211. }else if("2".equals(checkFactorInfo.getMatchType())){//2.多字符串匹配(包含)
  212. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  213. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  214. if(checkFactorInfo.getMultipleSelectVal().indexOf(matchKeys[key])>-1){
  215. result=true;
  216. continue;
  217. }else{
  218. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  219. result=false;
  220. break;
  221. }
  222. }else{
  223. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  224. result=false;
  225. break;
  226. }
  227. }else if("3".equals(checkFactorInfo.getMatchType())){//3.区间范围比较(左闭右闭)
  228. if(matchKeys[key]!=null&&NumberUtils.isDigits(matchKeys[key])){
  229. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  230. if(Integer.parseInt(matchKeys[key])>=checkFactorInfo.getMinRangeVal()&&Integer.parseInt(matchKeys[key])<=checkFactorInfo.getMaxRangeVal()){
  231. result=true;
  232. continue;
  233. }else{
  234. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  235. result=false;
  236. break;
  237. }
  238. }else{
  239. //判断跟单信息是否为空和可转整型,如果不符,则直接没有匹配到,该方案不符合
  240. result=false;
  241. break;
  242. }
  243. }
  244. }
  245. return result;
  246. }
  247. /**
  248. * 根据跟单信息,按照约定顺序进行拼接匹配串
  249. * 新增因子时,顺序需要与getFactorToBeVerified()方法放入待校验因子一致
  250. * @param feeSchemeReqDto
  251. * @return
  252. */
  253. private String getMatchKeyWithInsuranceInfo(FeeSchemeReqDto feeSchemeReqDto) {
  254. StringBuffer result=new StringBuffer();
  255. result.append(feeSchemeReqDto.getIsTransfer()).append(",");
  256. result.append(feeSchemeReqDto.getIsNewCar()).append(",");
  257. result.append(feeSchemeReqDto.getIsNewEnergy()).append(",");
  258. result.append(feeSchemeReqDto.getIsRenewal()).append(",");
  259. result.append(feeSchemeReqDto.getVehicleCategory()).append(",");
  260. result.append(feeSchemeReqDto.getUseNature()).append(",");
  261. result.append(feeSchemeReqDto.getSeatNum()).append(",");
  262. result.append(feeSchemeReqDto.getPurchasePrice()).append(",");
  263. result.append(feeSchemeReqDto.getApprovedLoadCapacity()).append(",");
  264. result.append(feeSchemeReqDto.getJqPremium()).append(",");
  265. result.append(feeSchemeReqDto.getSumPayTax()).append(",");
  266. result.append(feeSchemeReqDto.getThirdPartyInsurance()).append(",");
  267. result.append(feeSchemeReqDto.getNoCarPremium()).append(",");
  268. result.append(feeSchemeReqDto.getSyDiscount()).append(",");
  269. result.append(feeSchemeReqDto.getJqDiscount()).append(",");
  270. result.append(feeSchemeReqDto.getInsuranceScore()).append(",");
  271. result.append(feeSchemeReqDto.getExpectedLossRate()).append(",");
  272. result.append(feeSchemeReqDto.getLicenseNo());
  273. return result.toString();
  274. }
  275. /**
  276. * 根据配置的因子表数据,组装标准的待校验因子列表
  277. * 新增因子时,顺序需要与getMatchKeyWithInsuranceInfo()方法放入跟单信息一致
  278. * @param factorCost
  279. * @return
  280. */
  281. private Map<Integer, FeeFactorInfoDto> getFactorToBeVerified(PtlAgreementProductCosts factorCost) {
  282. Map<Integer, FeeFactorInfoDto> resultMqp=new HashMap<>();
  283. //以下各项因子必须按顺序放入MAP,以便校验时关联
  284. //--------------------因子处理分割线----------------------------------
  285. FeeFactorInfoDto factor0=new FeeFactorInfoDto();
  286. factor0.setFactorName("是否过户");
  287. factor0.setMatchType("1");
  288. factor0.setMatchSequence(0);
  289. if(factorCost.getTransfer()!=null&&factorCost.getTransfer()!=9){
  290. factor0.setNeedMatch(true);
  291. factor0.setSingleSelectVal(String.valueOf(factorCost.getTransfer()));
  292. }else{
  293. //如果方案中未录入(是空或为9时),则不校验该项因子
  294. factor0.setNeedMatch(false);
  295. }
  296. resultMqp.put(0,factor0);
  297. //--------------------因子处理分割线----------------------------------
  298. FeeFactorInfoDto factor1=new FeeFactorInfoDto();
  299. factor1.setFactorName("新旧车");
  300. factor1.setMatchType("1");
  301. factor1.setMatchSequence(1);
  302. if(factorCost.getOldAndNew()!=null&&factorCost.getOldAndNew()!=9){
  303. factor1.setNeedMatch(true);
  304. factor1.setSingleSelectVal(String.valueOf(factorCost.getOldAndNew()));
  305. }else{
  306. //如果方案中未录入(是空或为9时),则不校验该项因子
  307. factor1.setNeedMatch(false);
  308. }
  309. resultMqp.put(1,factor1);
  310. //--------------------因子处理分割线----------------------------------
  311. FeeFactorInfoDto factor2=new FeeFactorInfoDto();
  312. factor2.setFactorName("是否新能源");
  313. factor2.setMatchType("1");
  314. factor2.setMatchSequence(2);
  315. if(factorCost.getNewEnergy()!=null&&factorCost.getNewEnergy()!=9){
  316. factor2.setNeedMatch(true);
  317. factor2.setSingleSelectVal(String.valueOf(factorCost.getNewEnergy()));
  318. }else{
  319. //如果方案中未录入(是空或为9时),则不校验该项因子
  320. factor2.setNeedMatch(false);
  321. }
  322. resultMqp.put(2,factor2);
  323. //--------------------因子处理分割线----------------------------------
  324. FeeFactorInfoDto factor3=new FeeFactorInfoDto();
  325. factor3.setFactorName("是否续保");
  326. factor3.setMatchType("1");
  327. factor3.setMatchSequence(3);
  328. if(factorCost.getRenewal()!=null&&factorCost.getRenewal()!=9){
  329. factor3.setNeedMatch(true);
  330. factor3.setSingleSelectVal(String.valueOf(factorCost.getRenewal()));
  331. }else{
  332. //如果方案中未录入(是空或为9时),则不校验该项因子
  333. factor3.setNeedMatch(false);
  334. }
  335. resultMqp.put(3,factor3);
  336. //--------------------因子处理分割线----------------------------------
  337. FeeFactorInfoDto factor4=new FeeFactorInfoDto();
  338. factor4.setFactorName("车辆大类");
  339. factor4.setMatchType("2");
  340. factor4.setMatchSequence(4);
  341. if(factorCost.getVehicleCategory()!=null&&!"".equals(factorCost.getVehicleCategory())){
  342. factor4.setNeedMatch(true);
  343. factor4.setMultipleSelectVal(String.valueOf(factorCost.getVehicleCategory()));
  344. }else{
  345. //如果方案中未录入,则不校验该项因子
  346. factor4.setNeedMatch(false);
  347. }
  348. resultMqp.put(4,factor4);
  349. //--------------------因子处理分割线----------------------------------
  350. FeeFactorInfoDto factor5=new FeeFactorInfoDto();
  351. factor5.setFactorName("使用性质");
  352. factor5.setMatchType("2");
  353. factor5.setMatchSequence(5);
  354. if(factorCost.getNatureOfUse()!=null&&!"".equals(factorCost.getNatureOfUse())){
  355. factor5.setNeedMatch(true);
  356. factor5.setMultipleSelectVal(String.valueOf(factorCost.getNatureOfUse()));
  357. }else{
  358. //如果方案中未录入,则不校验该项因子
  359. factor5.setNeedMatch(false);
  360. }
  361. resultMqp.put(5,factor5);
  362. //--------------------因子处理分割线----------------------------------
  363. FeeFactorInfoDto factor6=new FeeFactorInfoDto();
  364. factor6.setFactorName("客车座位数区间");
  365. factor6.setMatchType("3");
  366. factor6.setMatchSequence(6);
  367. if(checkFactorConfigWithArea(factorCost.getMinSeats(),factorCost.getMaxSeats(),factor6,factorCost)){
  368. factor6.setNeedMatch(true);
  369. factor6.setMinRangeVal(factorCost.getMinSeats());
  370. factor6.setMaxRangeVal(factorCost.getMaxSeats());
  371. }else{
  372. //如果方案中未录入,则不校验该项因子
  373. factor6.setNeedMatch(false);
  374. }
  375. resultMqp.put(6,factor6);
  376. //--------------------因子处理分割线----------------------------------
  377. FeeFactorInfoDto factor7=new FeeFactorInfoDto();
  378. factor7.setFactorName("新车购置价区间");
  379. factor7.setMatchType("3");
  380. factor7.setMatchSequence(7);
  381. if(checkFactorConfigWithArea(factorCost.getMinPurchasePrice(),factorCost.getMaxPurchasePrice(),factor7,factorCost)){
  382. factor7.setNeedMatch(true);
  383. factor7.setMinRangeVal(factorCost.getMinPurchasePrice());
  384. factor7.setMaxRangeVal(factorCost.getMaxPurchasePrice());
  385. }else{
  386. //如果方案中未录入,则不校验该项因子
  387. factor7.setNeedMatch(false);
  388. }
  389. resultMqp.put(7,factor7);
  390. //--------------------因子处理分割线----------------------------------
  391. FeeFactorInfoDto factor8=new FeeFactorInfoDto();
  392. factor8.setFactorName("核定载质量区间");
  393. factor8.setMatchType("3");
  394. factor8.setMatchSequence(8);
  395. if(checkFactorConfigWithArea(factorCost.getMinApprovedLoadCapacity(),factorCost.getMaxApprovedLoadCapacity(),factor8,factorCost)){
  396. factor8.setNeedMatch(true);
  397. factor8.setMinRangeVal(factorCost.getMinApprovedLoadCapacity());
  398. factor8.setMaxRangeVal(factorCost.getMaxApprovedLoadCapacity());
  399. }else{
  400. //如果方案中未录入,则不校验该项因子
  401. factor8.setNeedMatch(false);
  402. }
  403. resultMqp.put(8,factor8);
  404. //--------------------因子处理分割线----------------------------------
  405. FeeFactorInfoDto factor9=new FeeFactorInfoDto();
  406. factor9.setFactorName("交强险保费区间");
  407. factor9.setMatchType("3");
  408. factor9.setMatchSequence(9);
  409. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsurancePremium(),factorCost.getMaxCompulsoryInsurancePremium(),factor9,factorCost)){
  410. factor9.setNeedMatch(true);
  411. factor9.setMinRangeVal(factorCost.getMinCompulsoryInsurancePremium());
  412. factor9.setMaxRangeVal(factorCost.getMaxCompulsoryInsurancePremium());
  413. }else{
  414. //如果方案中未录入,则不校验该项因子
  415. factor9.setNeedMatch(false);
  416. }
  417. resultMqp.put(9,factor9);
  418. //--------------------因子处理分割线----------------------------------
  419. FeeFactorInfoDto factor10=new FeeFactorInfoDto();
  420. factor10.setFactorName("车船税金额区间");
  421. factor10.setMatchType("3");
  422. factor10.setMatchSequence(10);
  423. if(checkFactorConfigWithArea(factorCost.getMinTaxAmount(),factorCost.getMaxTaxAmount(),factor10,factorCost)){
  424. factor10.setNeedMatch(true);
  425. factor10.setMinRangeVal(factorCost.getMinTaxAmount());
  426. factor10.setMaxRangeVal(factorCost.getMaxTaxAmount());
  427. }else{
  428. //如果方案中未录入,则不校验该项因子
  429. factor10.setNeedMatch(false);
  430. }
  431. resultMqp.put(10,factor10);
  432. //--------------------因子处理分割线----------------------------------
  433. FeeFactorInfoDto factor11=new FeeFactorInfoDto();
  434. factor11.setFactorName("三者保额区间");
  435. factor11.setMatchType("3");
  436. factor11.setMatchSequence(11);
  437. if(checkFactorConfigWithArea(factorCost.getMinTheThreePremium(),factorCost.getMaxTheThreePremium(),factor11,factorCost)){
  438. factor11.setNeedMatch(true);
  439. factor11.setMinRangeVal(factorCost.getMinTheThreePremium());
  440. factor11.setMaxRangeVal(factorCost.getMaxTheThreePremium());
  441. }else{
  442. //如果方案中未录入,则不校验该项因子
  443. factor11.setNeedMatch(false);
  444. }
  445. resultMqp.put(11,factor11);
  446. //--------------------因子处理分割线----------------------------------
  447. FeeFactorInfoDto factor12=new FeeFactorInfoDto();
  448. factor12.setFactorName("随车产品保费区间");
  449. factor12.setMatchType("3");
  450. factor12.setMatchSequence(12);
  451. if(checkFactorConfigWithArea(factorCost.getMinOnboardProductsPremium(),factorCost.getMaxOnboardProductsPremium(),factor12,factorCost)){
  452. factor12.setNeedMatch(true);
  453. factor12.setMinRangeVal(factorCost.getMinOnboardProductsPremium());
  454. factor12.setMaxRangeVal(factorCost.getMaxOnboardProductsPremium());
  455. }else{
  456. //如果方案中未录入,则不校验该项因子
  457. factor12.setNeedMatch(false);
  458. }
  459. resultMqp.put(12,factor12);
  460. //--------------------因子处理分割线----------------------------------
  461. FeeFactorInfoDto factor13=new FeeFactorInfoDto();
  462. factor13.setFactorName("商业险折扣区间");
  463. factor13.setMatchType("3");
  464. factor13.setMatchSequence(13);
  465. if(checkFactorConfigWithArea(factorCost.getMinCommercialInsuranceDiscount(),factorCost.getMaxCommercialInsuranceDiscount(),factor13,factorCost)){
  466. factor13.setNeedMatch(true);
  467. factor13.setMinRangeVal(factorCost.getMinCommercialInsuranceDiscount());
  468. factor13.setMaxRangeVal(factorCost.getMaxCommercialInsuranceDiscount());
  469. }else{
  470. //如果方案中未录入,则不校验该项因子
  471. factor13.setNeedMatch(false);
  472. }
  473. resultMqp.put(13,factor13);
  474. //--------------------因子处理分割线----------------------------------
  475. FeeFactorInfoDto factor14=new FeeFactorInfoDto();
  476. factor14.setFactorName("交强险折扣区间");
  477. factor14.setMatchType("3");
  478. factor14.setMatchSequence(14);
  479. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsuranceDiscount(),factorCost.getMaxCompulsoryInsuranceDiscount(),factor14,factorCost)){
  480. factor14.setNeedMatch(true);
  481. factor14.setMinRangeVal(factorCost.getMinCompulsoryInsuranceDiscount());
  482. factor14.setMaxRangeVal(factorCost.getMaxCompulsoryInsuranceDiscount());
  483. }else{
  484. //如果方案中未录入,则不校验该项因子
  485. factor14.setNeedMatch(false);
  486. }
  487. resultMqp.put(14,factor14);
  488. //--------------------因子处理分割线----------------------------------
  489. FeeFactorInfoDto factor15=new FeeFactorInfoDto();
  490. factor15.setFactorName("保司评分区间");
  491. factor15.setMatchType("3");
  492. factor15.setMatchSequence(15);
  493. if(checkFactorConfigWithArea(factorCost.getMinScore(),factorCost.getMaxScore(),factor15,factorCost)){
  494. factor15.setNeedMatch(true);
  495. factor15.setMinRangeVal(factorCost.getMinScore());
  496. factor15.setMaxRangeVal(factorCost.getMaxScore());
  497. }else{
  498. //如果方案中未录入,则不校验该项因子
  499. factor15.setNeedMatch(false);
  500. }
  501. resultMqp.put(15,factor15);
  502. //--------------------因子处理分割线----------------------------------
  503. FeeFactorInfoDto factor16=new FeeFactorInfoDto();
  504. factor16.setFactorName("预期赔付率区间");
  505. factor16.setMatchType("3");
  506. factor16.setMatchSequence(16);
  507. if(checkFactorConfigWithArea(factorCost.getMinLossRation(),factorCost.getMaxLossRation(),factor16,factorCost)){
  508. factor16.setNeedMatch(true);
  509. factor16.setMinRangeVal(factorCost.getMinLossRation());
  510. factor16.setMaxRangeVal(factorCost.getMaxLossRation());
  511. }else{
  512. //如果方案中未录入,则不校验该项因子
  513. factor16.setNeedMatch(false);
  514. }
  515. resultMqp.put(16,factor16);
  516. //--------------------因子处理分割线----------------------------------
  517. FeeFactorInfoDto factor17=new FeeFactorInfoDto();
  518. factor17.setFactorName("车牌号地区");
  519. factor17.setMatchType("2");
  520. factor17.setMatchSequence(17);
  521. if(factorCost.getLicenseNumber()!=null&&!"".equals(factorCost.getLicenseNumber())){
  522. factor17.setNeedMatch(true);
  523. String matchStr=factorCost.getLicenseNumber();
  524. //考虑是否含暂未上牌标志
  525. if(factorCost.getContainNoLicense()!=null&&"1".equals(factorCost.getContainNoLicense())){
  526. matchStr=matchStr+",暂未上牌";
  527. }
  528. factor17.setMultipleSelectVal(matchStr);
  529. }else{
  530. //如果方案中未录入,则不校验该项因子
  531. factor17.setNeedMatch(false);
  532. }
  533. resultMqp.put(17,factor17);
  534. return resultMqp;
  535. }
  536. /**
  537. * 判断区间类因子是否需要匹配
  538. * @param minVal
  539. * @param maxVal
  540. * @param factorInfoDto
  541. * @param productCosts
  542. * @return
  543. */
  544. private boolean checkFactorConfigWithArea(Integer minVal, Integer maxVal,FeeFactorInfoDto factorInfoDto,PtlAgreementProductCosts productCosts) {
  545. boolean result=false; //默认不需要匹配
  546. if(minVal!=null&&maxVal!=null){
  547. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  548. result=false;
  549. }else{
  550. if(minVal<=maxVal){
  551. result=true;
  552. }else{
  553. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  554. }
  555. }
  556. }else if(minVal!=null && maxVal==null){
  557. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  558. }else if(minVal==null&&maxVal!=null){
  559. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  560. }
  561. return result;
  562. }
  563. //----------------------------------------------分割线
  564. public FeeSchemeReqDto getFeeSchemeInfo(BaseQuoteInfoVo quoteInfoVo, QuoteRespVo quoteRespVo, String agreementId, String productId){
  565. CarInfoVo carInfoVo = quoteInfoVo.getCarInfo();
  566. List<KindInfoVo> kindList = quoteInfoVo.getKindList();
  567. String thirdPartyInsurance = "";
  568. if(kindList!=null && kindList.size()>0){
  569. for(KindInfoVo kindInfoVo:kindList){
  570. if("B".equals(kindInfoVo.getKindCode())){
  571. thirdPartyInsurance = String.valueOf(kindInfoVo.getAmount());
  572. }
  573. }
  574. }
  575. FeeSchemeReqDto feeSchemeReqDto = new FeeSchemeReqDto();
  576. String isTransfer = "0";
  577. String isNewCar = "0";
  578. String isRenewal = "0";
  579. String useNature = "家庭自用";
  580. String carType="客车";
  581. String isNewEnergy = "0";
  582. feeSchemeReqDto.setBusType(productId);//"业务类型:单交0330、单商034001、单三034002、交三0330034002、交商0330034001"
  583. feeSchemeReqDto.setAgreementId(agreementId);//协议ID
  584. if(carInfoVo.isTransferFlag()){
  585. isTransfer = "1";
  586. }
  587. feeSchemeReqDto.setIsTransfer(isTransfer);//是否过户 1是 0否"
  588. if(!carInfoVo.isUsedCar()){
  589. isNewCar = "1";
  590. }
  591. feeSchemeReqDto.setIsNewCar(isNewCar);//是否新车 1是 0否
  592. if("1".equals(carInfoVo.getPowertype())||"2".equals(carInfoVo.getPowertype())||"3".equals(carInfoVo.getPowertype())){
  593. isNewEnergy = "1";
  594. }
  595. feeSchemeReqDto.setIsNewEnergy(isNewEnergy);//是否新能源 1是 0否
  596. feeSchemeReqDto.setIsRenewal("0");//是否续保 1是 0否 续保取值有争议 默认送否 暂时搁置
  597. //页面要素及中煤交互请求返参没有,先默认写死
  598. if("A0".equals(carInfoVo.getCimodelclass())){
  599. carType="客车";
  600. }
  601. feeSchemeReqDto.setVehicleCategory(carType);//车辆大类: 客车、货车、特种车、挂车、摩托车、拖拉机
  602. if("8A".equals(carInfoVo.getCarnature())){
  603. useNature = "家庭自用";
  604. }
  605. feeSchemeReqDto.setUseNature(useNature);//使用性质: 营业出租、营业租赁、营业公交、营业客运、营业货运、营业旅游、家庭自用、非营业机关事业、非营业企业、非营业个人
  606. feeSchemeReqDto.setSeatNum(String.valueOf(carInfoVo.getSeatCount()));//座位数 大概率准
  607. feeSchemeReqDto.setPurchasePrice(carInfoVo.getPurchasePrice());//新车购置价 可能再次新车筛选的时候送保司和页面带入有差异
  608. feeSchemeReqDto.setApprovedLoadCapacity(String.valueOf(carInfoVo.getLimitLoad()));//核定载质量 可能再次新车筛选的时候送保司和页面带入有差异
  609. feeSchemeReqDto.setJqPremium(String.valueOf(quoteRespVo.getJqPremium()));//交强保费
  610. feeSchemeReqDto.setSyPremium(String.valueOf(quoteRespVo.getSyPremium()));//商业保费
  611. feeSchemeReqDto.setSumPayTax(String.valueOf(quoteRespVo.getTaxAmount()));//车船税金额
  612. feeSchemeReqDto.setThirdPartyInsurance(thirdPartyInsurance);//三者险保额 准
  613. feeSchemeReqDto.setNoCarPremium("");//随车产品保费
  614. feeSchemeReqDto.setSyDiscount("");//商业险折扣
  615. feeSchemeReqDto.setJqDiscount("");//交强险折扣
  616. // feeSchemeReqDto.setInsuranceScore(quotedPriceResponse.getPlatMain().getZmScore());//保司评分 这里直接取中煤分
  617. feeSchemeReqDto.setExpectedLossRate("");//预期赔付率
  618. if(carInfoVo.getLicenseNo()!=null&&!"".equals(carInfoVo.getLicenseNo())&&!"暂未上牌".equals(carInfoVo.getLicenseNo())){
  619. feeSchemeReqDto.setLicenseNo(carInfoVo.getLicenseNo().substring(0,2));//车牌号
  620. }else{
  621. feeSchemeReqDto.setLicenseNo("暂未上牌");//车牌号
  622. }
  623. return feeSchemeReqDto;
  624. }
  625. public void dealFeeOrderInfo(BaseQuoteInfoVo quoteInfoVo, QuoteRespVo quoteRespVo, String agreementId,String businessNo){
  626. BigDecimal jqNoTaxPremium = new BigDecimal(0);
  627. BigDecimal syNoTaxPremium = new BigDecimal(0);
  628. InsOrders insOrders = insOrdersService.getById(quoteRespVo.getOrderno());
  629. FeeSchemeReqDto feeSchemeReqDto = this.getFeeSchemeInfo(quoteInfoVo,quoteRespVo,agreementId,insOrders.getProductid());
  630. FeeSchemeResDto feeSchemeResDto = this.matchTheAppropriateFees(feeSchemeReqDto);
  631. InsFeeOrder insFeeOrder = new InsFeeOrder(feeSchemeReqDto,feeSchemeResDto,businessNo);
  632. //先通过含税保费计算出不含税保费 公式 总保费/(1+增值税率) 目前增值税率是0.06
  633. if(insFeeOrder.getJqPremium().doubleValue()>0){
  634. jqNoTaxPremium = insFeeOrder.getJqPremium().divide(new BigDecimal(1+0.06),BigDecimal.ROUND_HALF_UP,2);
  635. insFeeOrder.setJqNoTaxPremium(jqNoTaxPremium);
  636. //交强险总费用
  637. insFeeOrder.setJqCostsPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqCostsProportion()));
  638. //监管费比例
  639. if("1".equals(feeSchemeReqDto.getIsNewCar())){
  640. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqNewCarCostsProportion()));
  641. }else if("0".equals(feeSchemeReqDto.getIsNewCar())){
  642. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqOldCarCostsProportion()));
  643. }else{
  644. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(0));
  645. }
  646. //监管费
  647. insFeeOrder.setJqSuperviseCostsPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqSuperviseCostsProportion()));
  648. //溢出费比例 先搁置放0
  649. insFeeOrder.setJqSpilloverProportion(new BigDecimal(feeSchemeResDto.getJqSpilloverProportion()));
  650. //溢出费 先搁置放0
  651. insFeeOrder.setJqSpilloverPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqSpilloverProportion()));
  652. }
  653. if(insFeeOrder.getSyPremium().doubleValue()>0){
  654. syNoTaxPremium = insFeeOrder.getJqPremium().divide(new BigDecimal(1+0.06),BigDecimal.ROUND_HALF_UP,2);
  655. insFeeOrder.setSyNoTaxPremium(syNoTaxPremium);
  656. //商业险总费用
  657. insFeeOrder.setSyCostsPremiums(getPremium(syNoTaxPremium,insFeeOrder.getJqCostsProportion()));
  658. //监管费比例
  659. if("1".equals(feeSchemeReqDto.getIsNewCar())){
  660. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqNewCarCostsProportion()));
  661. }else if("0".equals(feeSchemeReqDto.getIsNewCar())){
  662. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqOldCarCostsProportion()));
  663. }else{
  664. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(0));
  665. }
  666. //监管费
  667. insFeeOrder.setSySuperviseCostsPremiums(getPremium(syNoTaxPremium,insFeeOrder.getJqSuperviseCostsProportion()));
  668. //溢出费比例 先搁置放0
  669. insFeeOrder.setSySpilloverProportion(new BigDecimal(feeSchemeResDto.getJqSpilloverProportion()));
  670. //溢出费 先搁置放0
  671. insFeeOrder.setSySpilloverPremiums(getPremium(syNoTaxPremium,insFeeOrder.getJqSpilloverProportion()));
  672. }
  673. if(jqNoTaxPremium.doubleValue() >0 || syNoTaxPremium.doubleValue() >0){
  674. BigDecimal totalNoTaxPremium = jqNoTaxPremium.add(syNoTaxPremium);
  675. SysUser sysUser = sysUserService.findByUserId(insOrders.getUserid());
  676. /**
  677. * 机构管理费比例逻辑
  678. * 当前出单员的机构编码找他的上一级就是五级
  679. * 机构层级划分方式
  680. * 99 总公司 一级
  681. * 9914山西分公司 二级
  682. * 991401太原中支 三级
  683. * 99140105小店中支 四级
  684. * 9914010501 营销服务部 五级
  685. * 1团队 无机构层级
  686. */
  687. SysDept sysDept = sysDeptService.getById(sysUser.getDeptId());
  688. if(StringUtils.isNotEmpty(sysDept.getComlevel())){
  689. throw new SystemException("当前出单员归属团队有误,请检查机构层级配置!");
  690. }
  691. //得到五级机构
  692. SysDept sysDeptFifth = sysDeptService.getById(sysDept.getParentId());
  693. SysDept sysDeptForth = sysDeptService.getById(sysDeptFifth.getParentId());
  694. SysDept sysDeptThird = sysDeptService.getById(sysDeptForth.getParentId());
  695. SysDept sysDeptSecond = sysDeptService.getById(sysDeptThird.getParentId());
  696. SysDept sysDeptFirst = sysDeptService.getById(sysDeptSecond.getParentId());
  697. //五级机构管理费用比例
  698. if(sysDeptFifth!=null && "5".equals(sysDeptFifth.getComlevel())){
  699. insFeeOrder.setFifthDeptProportion(new BigDecimal(sysDeptFifth.getManagementFee()));
  700. insFeeOrder.setFifthDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFifthDeptProportion()));
  701. }
  702. //四级机构管理费用比例
  703. if(sysDeptForth!=null && "4".equals(sysDeptForth.getComlevel())){
  704. insFeeOrder.setForthDeptProportion(new BigDecimal(sysDeptForth.getManagementFee()));
  705. insFeeOrder.setForthDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getForthDeptProportion()));
  706. }
  707. //三级机构管理费用比例
  708. if(sysDeptThird!=null && "3".equals(sysDeptThird.getComlevel())){
  709. insFeeOrder.setThirdDeptProportion(new BigDecimal(sysDeptThird.getManagementFee()));
  710. insFeeOrder.setThirdDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getThirdDeptProportion()));
  711. }
  712. //二级机构管理费用比例
  713. if(sysDeptSecond!=null && "2".equals(sysDeptSecond.getComlevel())){
  714. insFeeOrder.setSecondDeptProportion(new BigDecimal(sysDeptSecond.getManagementFee()));
  715. insFeeOrder.setSecondDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getSecondDeptProportion()));
  716. }
  717. //一级机构管理费用比例
  718. if(sysDeptFirst!=null && "1".equals(sysDeptFirst.getComlevel())){
  719. insFeeOrder.setFirstDeptProportion(new BigDecimal(sysDeptFirst.getManagementFee()));
  720. insFeeOrder.setFirstDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFirstDeptProportion()));
  721. }
  722. //一级分销比例 推荐人
  723. //二级分销比例
  724. //三级分销比例
  725. /**
  726. * 分销一级、二级、三级存值取团队配置的分销佣金比例,若该团队走三级分销模式,当前出单员出单时,跟单的分销取值方式为:
  727. * 根据出单员的推荐人向上找三级,若可以找到,则跟单存一、二、三分销比例;
  728. * 若向上只能找到一级或者二级,则跟单存一级或者一级、二级
  729. * 比如 A 1 B 2 C 3 D 若D出单 则给 C 3个 B 2个 A 1个;C出单给 B 3个 A 2个
  730. * 第一步,先判断团队配置的分销模式
  731. * 第二步,根据分销模式找上级存值相应分销比例
  732. * 第三步,仅有一个上级的情况分销比例存啥
  733. */
  734. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ", new Object[]{sysUser.getDeptId()});
  735. if(esmRetailList!=null && esmRetailList.size()>0){
  736. EsmRetail esmRetail = esmRetailList.get(0);
  737. if(esmRetail!=null){
  738. int cycleIndex = 0;
  739. if("3".equals(esmRetail.getRetailtype())){//团队配置了三级分销模式
  740. cycleIndex = 3;
  741. }else if("2".equals(esmRetail.getRetailtype())){//团队配置了二级分销模式
  742. cycleIndex = 2;
  743. }else if("1".equals(esmRetail.getRetailtype())){//团队配置了一级分销模式
  744. cycleIndex = 1;
  745. }else if("0".equals(esmRetail.getRetailtype())){//团队没有配置分销模式
  746. cycleIndex = 0;
  747. }
  748. //利用当前工号,循环向上找推荐人
  749. String userId = sysUser.getId();
  750. int breakCycle = 99999999;
  751. for(int i=0;i<=cycleIndex;i++){
  752. EsmUserReferrer userReferrer = esmUserReferrerService.getById(userId);
  753. if(userReferrer.getReferrerId().equals(userReferrer.getId())){//团队长,没有上级
  754. //跳出循环
  755. breakCycle = i;
  756. break;
  757. }else {
  758. userId = userReferrer.getReferrerId();
  759. }
  760. }
  761. //breakCycle是3,当前工号的上级的上级的上级就是团队长
  762. //breakCycle是2,当前工号的上级的上级就是团队长
  763. //breakCycle是1,当前工号的上级就是团队长
  764. //breakCycle是0,当前工号就是团队长
  765. if("3".equals(esmRetail.getRetailtype())){//团队配置了三级分销模式
  766. if(breakCycle==99999999||breakCycle==3){
  767. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  768. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  769. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  770. }else if(breakCycle==2){
  771. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  772. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  773. }else if(breakCycle==1){
  774. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  775. }
  776. }else if("2".equals(esmRetail.getRetailtype())){//团队配置了二级分销模式
  777. if(breakCycle==99999999||breakCycle==3 || breakCycle==2){
  778. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  779. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  780. }else if(breakCycle==1){
  781. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  782. }
  783. }else if("1".equals(esmRetail.getRetailtype())){//团队配置了一级分销模式
  784. if(breakCycle==99999999||breakCycle==3 || breakCycle==2||breakCycle==1){
  785. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  786. }
  787. }
  788. insFeeOrder.setFirstRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFirstRetailProportion()));
  789. insFeeOrder.setSecondRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getSecondRetailProportion()));
  790. insFeeOrder.setThirdRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getThirdRetailProportion()));
  791. }
  792. }
  793. }
  794. insFeeOrderService.insertCompanyAndOrders(insFeeOrder);
  795. }
  796. private BigDecimal getPremium(BigDecimal noTaxPremium,BigDecimal costsProportion){
  797. BigDecimal premium = new BigDecimal(0);
  798. if(costsProportion!=null && costsProportion.doubleValue()>0){
  799. premium = noTaxPremium.multiply(costsProportion).divide(new BigDecimal(100),4,BigDecimal.ROUND_HALF_UP);
  800. }
  801. return premium;
  802. }
  803. }