FeeRuleSchemeServiceImpl.java 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. package com.ydtech.modules.fee.service.impl;
  2. import com.ydtech.exception.SystemException;
  3. import com.ydtech.modules.fee.dto.FeeFactorInfoDto;
  4. import com.ydtech.modules.fee.dto.FeeSchemeReqDto;
  5. import com.ydtech.modules.fee.dto.FeeSchemeResDto;
  6. import com.ydtech.modules.fee.service.FeeRuleSchemeService;
  7. import com.ydtech.modules.ins.model.vo.CarInfoVo;
  8. import com.ydtech.modules.ins.model.vo.KindInfoVo;
  9. import com.ydtech.modules.ins.model.vo.QuoteRespVo;
  10. import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
  11. import com.ydtech.modules.protocol.entity.po.PtlAgreementProductCosts;
  12. import com.ydtech.modules.protocol.service.PtlAgreementProductCostsService;
  13. import org.apache.commons.lang3.math.NumberUtils;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import java.util.ArrayList;
  17. import java.util.HashMap;
  18. import java.util.List;
  19. import java.util.Map;
  20. /**
  21. * 费用接口中相关功能的实现类
  22. */
  23. @Service
  24. public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
  25. @Autowired
  26. private PtlAgreementProductCostsService ptlAgreementProductCostsService;
  27. /**
  28. * 根据跟单信息,以及配置的费用因子,获取合适的跟单费用
  29. * @param feeSchemeReqDto
  30. * @return
  31. */
  32. @Override
  33. public FeeSchemeResDto matchTheAppropriateFees(FeeSchemeReqDto feeSchemeReqDto) {
  34. FeeSchemeResDto feeSchemeResDto=new FeeSchemeResDto();
  35. //先根据业务类别、有效期、协议编码、历史标志代码字段 获取对应费用方案列表
  36. List<PtlAgreementProductCosts> ptlAgreementProductCosts =ptlAgreementProductCostsService.selectVliadFeeFactor(feeSchemeReqDto.getBusType(),feeSchemeReqDto.getAgreementId());
  37. if (ptlAgreementProductCosts.isEmpty()) {
  38. //如果查询不到费用方案信息,则阻断算费流程,进行提示
  39. throw new SystemException("未查询到费用配置,请先配置该协议的费用方案!");
  40. }else{
  41. //符合跟单信息的方案列表
  42. List validSchemeList=new ArrayList();
  43. //循环符合的方案列表,再进行细化的因子匹配,获取最终可以匹配到的方案
  44. for(int i=0;i<ptlAgreementProductCosts.size();i++){
  45. PtlAgreementProductCosts factorCost=ptlAgreementProductCosts.get(i);
  46. //获取处理后的待校验因子
  47. Map<Integer, FeeFactorInfoDto> factorToBeVerified=getFactorToBeVerified(factorCost);
  48. //按规则拼接跟单信息
  49. String matchKeyStr=getMatchKeyWithInsuranceInfo(feeSchemeReqDto);
  50. //循环进行各项因子校验
  51. boolean checkFlag=checkFactorValidWithInsuranceInfo(matchKeyStr,factorToBeVerified);
  52. //如果该方案所有因子都校验通过,则放入符合校验方案列表
  53. if(checkFlag){
  54. validSchemeList.add(factorCost);
  55. }
  56. }
  57. if(validSchemeList.size()>0){
  58. //匹配到唯一一条费用方案,直接用这条
  59. if(validSchemeList.size()==1){
  60. //进行费用比例赋值,给返回对象
  61. feeSchemeResDto=generateSchemeResDto((PtlAgreementProductCosts)validSchemeList.get(0));
  62. }else{
  63. //如果最终符合的有多条,则按特殊规则选择其中一条
  64. PtlAgreementProductCosts finalSchemeCost=changeSchemeWithSpecialRule(validSchemeList,feeSchemeReqDto);
  65. //进行费用比例赋值,给返回对象
  66. feeSchemeResDto=generateSchemeResDto(finalSchemeCost);
  67. }
  68. }else{
  69. throw new SystemException("未匹配到合适的费用方案,请先配置该协议的费用方案!");
  70. }
  71. }
  72. return feeSchemeResDto;
  73. }
  74. /**
  75. * 特殊处理选择费用方案
  76. * 如果最终符合的有多条,则先看交强、商业谁的保费多,然后根据保费多得在匹配到的方案中找费用比例大的那一条
  77. * @param validSchemeList
  78. * @param feeSchemeReqDto
  79. * @return
  80. */
  81. private PtlAgreementProductCosts changeSchemeWithSpecialRule(List<PtlAgreementProductCosts> validSchemeList, FeeSchemeReqDto feeSchemeReqDto) {
  82. PtlAgreementProductCosts finalScheme=null;
  83. //险种标志,最终取哪个险种费用比例 1取交强 2取商业
  84. String riskFlag="";
  85. //判断险种标志
  86. if("0330".equals(feeSchemeReqDto.getBusType())){//单交
  87. riskFlag="1";
  88. }else if("034001".equals(feeSchemeReqDto.getBusType())){//单商
  89. riskFlag="2";
  90. }else if("034002".equals(feeSchemeReqDto.getBusType())){//单三
  91. riskFlag="2";
  92. }else if("0330034002".equals(feeSchemeReqDto.getBusType())){//交三
  93. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  94. riskFlag="2";
  95. }else{
  96. riskFlag="1";
  97. }
  98. }else if("0330034001".equals(feeSchemeReqDto.getBusType())){//交商
  99. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  100. riskFlag="2";
  101. }else{
  102. riskFlag="1";
  103. }
  104. }
  105. //循环找出对应比例最大的
  106. for(int i=0;i<validSchemeList.size();i++){
  107. PtlAgreementProductCosts tempCostDto=validSchemeList.get(i);
  108. if(finalScheme!=null){
  109. if("1".equals(riskFlag)){//按交强比例排序,找比例最大的
  110. if(Double.parseDouble(finalScheme.getJqCostsProportion())<Double.parseDouble(tempCostDto.getJqCostsProportion())){
  111. finalScheme=tempCostDto;
  112. }
  113. }else if("2".equals(riskFlag)){//按商业比例排序,找比例最大的
  114. if(Double.parseDouble(finalScheme.getSyCostsProportion())<Double.parseDouble(tempCostDto.getSyCostsProportion())){
  115. finalScheme=tempCostDto;
  116. }
  117. }
  118. }else{
  119. finalScheme=tempCostDto;
  120. }
  121. }
  122. return finalScheme;
  123. }
  124. /**
  125. * 组装费用接口反参对象
  126. * @param agreementProductCost
  127. * @return
  128. */
  129. private FeeSchemeResDto generateSchemeResDto(PtlAgreementProductCosts agreementProductCost) {
  130. FeeSchemeResDto resDto=new FeeSchemeResDto();
  131. resDto.setAgreementId(agreementProductCost.getAgreementId());
  132. resDto.setSchemeId(agreementProductCost.getId());
  133. resDto.setJqSpilloverPremiums(agreementProductCost.getJqSpilloverPremiums());
  134. resDto.setJqSpilloverProportion(agreementProductCost.getJqSpilloverProportion());
  135. resDto.setJqNewCarCostsProportion(agreementProductCost.getJqNewCarCostsProportion());
  136. resDto.setJqOldCarCostsProportion(agreementProductCost.getJqOldCarCostsProportion());
  137. resDto.setJqCostsProportion(agreementProductCost.getJqCostsProportion());
  138. resDto.setJqNewCarOtherCostsProportion(agreementProductCost.getJqNewCarOtherCostsProportion());
  139. resDto.setJqOldCarOtherCostsProportion(agreementProductCost.getJqOldCarOtherCostsProportion());
  140. resDto.setSySpilloverPremiums(agreementProductCost.getSySpilloverPremiums());
  141. resDto.setSySpilloverProportion(agreementProductCost.getSySpilloverProportion());
  142. resDto.setSyNewCarCostsProportion(agreementProductCost.getSyNewCarCostsProportion());
  143. resDto.setSyOldCarCostsProportion(agreementProductCost.getSyOldCarCostsProportion());
  144. resDto.setSyCostsProportion(agreementProductCost.getSyCostsProportion());
  145. resDto.setSyNewCarOtherCostsProportion(agreementProductCost.getSyNewCarOtherCostsProportion());
  146. resDto.setSyOldCarOtherCostsProportion(agreementProductCost.getSyOldCarOtherCostsProportion());
  147. return resDto;
  148. }
  149. /**
  150. * 根据跟单信息,循环各项因子 校验该方案的匹配情况
  151. * @param matchKeyStr
  152. * @param factorToBeVerified
  153. * @return
  154. */
  155. private boolean checkFactorValidWithInsuranceInfo(String matchKeyStr, Map<Integer, FeeFactorInfoDto> factorToBeVerified) {
  156. boolean result=false; //默认没有匹配到
  157. String[] matchKeys= matchKeyStr.split(",");
  158. //循环待校验因子列表
  159. for(Map.Entry<Integer,FeeFactorInfoDto> entry : factorToBeVerified.entrySet()){
  160. Integer key=entry.getKey();
  161. FeeFactorInfoDto checkFactorInfo=entry.getValue();
  162. //先看该方案是否需要匹配该因子,不需要则跳过本条因子
  163. if(!checkFactorInfo.isNeedMatch()){
  164. continue;
  165. }
  166. //下面处理需要进行匹配的因子
  167. if("1".equals(checkFactorInfo.getMatchType())){//1.单字符串匹配(相等)
  168. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  169. if(checkFactorInfo.getSingleSelectVal().equals(matchKeys[key])){
  170. result=true;
  171. continue;
  172. }else{
  173. //如果需要匹配且没有匹配到,则直接跳出本次循环,该方案不符合
  174. result=false;
  175. break;
  176. }
  177. }else{
  178. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  179. result=false;
  180. break;
  181. }
  182. }else if("2".equals(checkFactorInfo.getMatchType())){//2.多字符串匹配(包含)
  183. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  184. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  185. if(checkFactorInfo.getMultipleSelectVal().indexOf(matchKeys[key])>-1){
  186. result=true;
  187. continue;
  188. }else{
  189. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  190. result=false;
  191. break;
  192. }
  193. }else{
  194. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  195. result=false;
  196. break;
  197. }
  198. }else if("3".equals(checkFactorInfo.getMatchType())){//3.区间范围比较(左闭右闭)
  199. if(matchKeys[key]!=null&&NumberUtils.isDigits(matchKeys[key])){
  200. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  201. if(Integer.parseInt(matchKeys[key])>=checkFactorInfo.getMinRangeVal()&&Integer.parseInt(matchKeys[key])<=checkFactorInfo.getMaxRangeVal()){
  202. result=true;
  203. continue;
  204. }else{
  205. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  206. result=false;
  207. break;
  208. }
  209. }else{
  210. //判断跟单信息是否为空和可转整型,如果不符,则直接没有匹配到,该方案不符合
  211. result=false;
  212. break;
  213. }
  214. }
  215. }
  216. return result;
  217. }
  218. /**
  219. * 根据跟单信息,按照约定顺序进行拼接匹配串
  220. * 新增因子时,顺序需要与getFactorToBeVerified()方法放入待校验因子一致
  221. * @param feeSchemeReqDto
  222. * @return
  223. */
  224. private String getMatchKeyWithInsuranceInfo(FeeSchemeReqDto feeSchemeReqDto) {
  225. StringBuffer result=new StringBuffer();
  226. result.append(feeSchemeReqDto.getIsTransfer()).append(",");
  227. result.append(feeSchemeReqDto.getIsNewCar()).append(",");
  228. result.append(feeSchemeReqDto.getIsNewEnergy()).append(",");
  229. result.append(feeSchemeReqDto.getIsRenewal()).append(",");
  230. result.append(feeSchemeReqDto.getVehicleCategory()).append(",");
  231. result.append(feeSchemeReqDto.getUseNature()).append(",");
  232. result.append(feeSchemeReqDto.getSeatNum()).append(",");
  233. result.append(feeSchemeReqDto.getPurchasePrice()).append(",");
  234. result.append(feeSchemeReqDto.getApprovedLoadCapacity()).append(",");
  235. result.append(feeSchemeReqDto.getJqPremium()).append(",");
  236. result.append(feeSchemeReqDto.getSumPayTax()).append(",");
  237. result.append(feeSchemeReqDto.getThirdPartyInsurance()).append(",");
  238. result.append(feeSchemeReqDto.getNoCarPremium()).append(",");
  239. result.append(feeSchemeReqDto.getSyDiscount()).append(",");
  240. result.append(feeSchemeReqDto.getJqDiscount()).append(",");
  241. result.append(feeSchemeReqDto.getInsuranceScore()).append(",");
  242. result.append(feeSchemeReqDto.getExpectedLossRate()).append(",");
  243. result.append(feeSchemeReqDto.getLicenseNo());
  244. return result.toString();
  245. }
  246. /**
  247. * 根据配置的因子表数据,组装标准的待校验因子列表
  248. * 新增因子时,顺序需要与getMatchKeyWithInsuranceInfo()方法放入跟单信息一致
  249. * @param factorCost
  250. * @return
  251. */
  252. private Map<Integer, FeeFactorInfoDto> getFactorToBeVerified(PtlAgreementProductCosts factorCost) {
  253. Map<Integer, FeeFactorInfoDto> resultMqp=new HashMap<>();
  254. //以下各项因子必须按顺序放入MAP,以便校验时关联
  255. //--------------------因子处理分割线----------------------------------
  256. FeeFactorInfoDto factor0=new FeeFactorInfoDto();
  257. factor0.setFactorName("是否过户");
  258. factor0.setMatchType("1");
  259. factor0.setMatchSequence(0);
  260. if(factorCost.getTransfer()!=null){
  261. factor0.setNeedMatch(true);
  262. factor0.setSingleSelectVal(String.valueOf(factorCost.getTransfer()));
  263. }else{
  264. //如果方案中未录入,则不校验该项因子
  265. factor0.setNeedMatch(false);
  266. }
  267. resultMqp.put(0,factor0);
  268. //--------------------因子处理分割线----------------------------------
  269. FeeFactorInfoDto factor1=new FeeFactorInfoDto();
  270. factor1.setFactorName("新旧车");
  271. factor1.setMatchType("1");
  272. factor1.setMatchSequence(1);
  273. if(factorCost.getOldAndNew()!=null){
  274. factor1.setNeedMatch(true);
  275. factor1.setSingleSelectVal(String.valueOf(factorCost.getOldAndNew()));
  276. }else{
  277. //如果方案中未录入,则不校验该项因子
  278. factor1.setNeedMatch(false);
  279. }
  280. resultMqp.put(1,factor1);
  281. //--------------------因子处理分割线----------------------------------
  282. FeeFactorInfoDto factor2=new FeeFactorInfoDto();
  283. factor2.setFactorName("是否新能源");
  284. factor2.setMatchType("1");
  285. factor2.setMatchSequence(2);
  286. if(factorCost.getNewEnergy()!=null){
  287. factor2.setNeedMatch(true);
  288. factor2.setSingleSelectVal(String.valueOf(factorCost.getNewEnergy()));
  289. }else{
  290. //如果方案中未录入,则不校验该项因子
  291. factor2.setNeedMatch(false);
  292. }
  293. resultMqp.put(2,factor2);
  294. //--------------------因子处理分割线----------------------------------
  295. FeeFactorInfoDto factor3=new FeeFactorInfoDto();
  296. factor3.setFactorName("是否续保");
  297. factor3.setMatchType("1");
  298. factor3.setMatchSequence(3);
  299. if(factorCost.getRenewal()!=null){
  300. factor3.setNeedMatch(true);
  301. factor3.setSingleSelectVal(String.valueOf(factorCost.getRenewal()));
  302. }else{
  303. //如果方案中未录入,则不校验该项因子
  304. factor3.setNeedMatch(false);
  305. }
  306. resultMqp.put(3,factor3);
  307. //--------------------因子处理分割线----------------------------------
  308. FeeFactorInfoDto factor4=new FeeFactorInfoDto();
  309. factor4.setFactorName("车辆大类");
  310. factor4.setMatchType("2");
  311. factor4.setMatchSequence(4);
  312. if(factorCost.getVehicleCategory()!=null&&!"".equals(factorCost.getVehicleCategory())){
  313. factor4.setNeedMatch(true);
  314. factor4.setMultipleSelectVal(String.valueOf(factorCost.getVehicleCategory()));
  315. }else{
  316. //如果方案中未录入,则不校验该项因子
  317. factor4.setNeedMatch(false);
  318. }
  319. resultMqp.put(4,factor4);
  320. //--------------------因子处理分割线----------------------------------
  321. FeeFactorInfoDto factor5=new FeeFactorInfoDto();
  322. factor5.setFactorName("使用性质");
  323. factor5.setMatchType("2");
  324. factor5.setMatchSequence(5);
  325. if(factorCost.getNatureOfUse()!=null&&!"".equals(factorCost.getNatureOfUse())){
  326. factor5.setNeedMatch(true);
  327. factor5.setMultipleSelectVal(String.valueOf(factorCost.getNatureOfUse()));
  328. }else{
  329. //如果方案中未录入,则不校验该项因子
  330. factor5.setNeedMatch(false);
  331. }
  332. resultMqp.put(5,factor5);
  333. //--------------------因子处理分割线----------------------------------
  334. FeeFactorInfoDto factor6=new FeeFactorInfoDto();
  335. factor6.setFactorName("客车座位数区间");
  336. factor6.setMatchType("3");
  337. factor6.setMatchSequence(6);
  338. if(checkFactorConfigWithArea(factorCost.getMinSeats(),factorCost.getMaxSeats(),factor6,factorCost)){
  339. factor6.setNeedMatch(true);
  340. factor6.setMinRangeVal(factorCost.getMinSeats());
  341. factor6.setMaxRangeVal(factorCost.getMaxSeats());
  342. }else{
  343. //如果方案中未录入,则不校验该项因子
  344. factor6.setNeedMatch(false);
  345. }
  346. resultMqp.put(6,factor6);
  347. //--------------------因子处理分割线----------------------------------
  348. FeeFactorInfoDto factor7=new FeeFactorInfoDto();
  349. factor7.setFactorName("新车购置价区间");
  350. factor7.setMatchType("3");
  351. factor7.setMatchSequence(7);
  352. if(checkFactorConfigWithArea(factorCost.getMinPurchasePrice(),factorCost.getMaxPurchasePrice(),factor7,factorCost)){
  353. factor7.setNeedMatch(true);
  354. factor7.setMinRangeVal(factorCost.getMinPurchasePrice());
  355. factor7.setMaxRangeVal(factorCost.getMaxPurchasePrice());
  356. }else{
  357. //如果方案中未录入,则不校验该项因子
  358. factor7.setNeedMatch(false);
  359. }
  360. resultMqp.put(7,factor7);
  361. //--------------------因子处理分割线----------------------------------
  362. FeeFactorInfoDto factor8=new FeeFactorInfoDto();
  363. factor8.setFactorName("核定载质量区间");
  364. factor8.setMatchType("3");
  365. factor8.setMatchSequence(8);
  366. if(checkFactorConfigWithArea(factorCost.getMinApprovedLoadCapacity(),factorCost.getMaxApprovedLoadCapacity(),factor8,factorCost)){
  367. factor8.setNeedMatch(true);
  368. factor8.setMinRangeVal(factorCost.getMinApprovedLoadCapacity());
  369. factor8.setMaxRangeVal(factorCost.getMaxApprovedLoadCapacity());
  370. }else{
  371. //如果方案中未录入,则不校验该项因子
  372. factor8.setNeedMatch(false);
  373. }
  374. resultMqp.put(8,factor8);
  375. //--------------------因子处理分割线----------------------------------
  376. FeeFactorInfoDto factor9=new FeeFactorInfoDto();
  377. factor9.setFactorName("交强险保费区间");
  378. factor9.setMatchType("3");
  379. factor9.setMatchSequence(9);
  380. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsurancePremium(),factorCost.getMaxCompulsoryInsurancePremium(),factor9,factorCost)){
  381. factor9.setNeedMatch(true);
  382. factor9.setMinRangeVal(factorCost.getMinCompulsoryInsurancePremium());
  383. factor9.setMaxRangeVal(factorCost.getMaxCompulsoryInsurancePremium());
  384. }else{
  385. //如果方案中未录入,则不校验该项因子
  386. factor9.setNeedMatch(false);
  387. }
  388. resultMqp.put(9,factor9);
  389. //--------------------因子处理分割线----------------------------------
  390. FeeFactorInfoDto factor10=new FeeFactorInfoDto();
  391. factor10.setFactorName("车船税金额区间");
  392. factor10.setMatchType("3");
  393. factor10.setMatchSequence(10);
  394. if(checkFactorConfigWithArea(factorCost.getMinTaxAmount(),factorCost.getMaxTaxAmount(),factor10,factorCost)){
  395. factor10.setNeedMatch(true);
  396. factor10.setMinRangeVal(factorCost.getMinTaxAmount());
  397. factor10.setMaxRangeVal(factorCost.getMaxTaxAmount());
  398. }else{
  399. //如果方案中未录入,则不校验该项因子
  400. factor10.setNeedMatch(false);
  401. }
  402. resultMqp.put(10,factor10);
  403. //--------------------因子处理分割线----------------------------------
  404. FeeFactorInfoDto factor11=new FeeFactorInfoDto();
  405. factor11.setFactorName("三者保额区间");
  406. factor11.setMatchType("3");
  407. factor11.setMatchSequence(11);
  408. if(checkFactorConfigWithArea(factorCost.getMinTheThreePremium(),factorCost.getMaxTheThreePremium(),factor11,factorCost)){
  409. factor11.setNeedMatch(true);
  410. factor11.setMinRangeVal(factorCost.getMinTheThreePremium());
  411. factor11.setMaxRangeVal(factorCost.getMaxTheThreePremium());
  412. }else{
  413. //如果方案中未录入,则不校验该项因子
  414. factor11.setNeedMatch(false);
  415. }
  416. resultMqp.put(11,factor11);
  417. //--------------------因子处理分割线----------------------------------
  418. FeeFactorInfoDto factor12=new FeeFactorInfoDto();
  419. factor12.setFactorName("随车产品保费区间");
  420. factor12.setMatchType("3");
  421. factor12.setMatchSequence(12);
  422. if(checkFactorConfigWithArea(factorCost.getMinOnboardProductsPremium(),factorCost.getMaxOnboardProductsPremium(),factor12,factorCost)){
  423. factor12.setNeedMatch(true);
  424. factor12.setMinRangeVal(factorCost.getMinOnboardProductsPremium());
  425. factor12.setMaxRangeVal(factorCost.getMaxOnboardProductsPremium());
  426. }else{
  427. //如果方案中未录入,则不校验该项因子
  428. factor12.setNeedMatch(false);
  429. }
  430. resultMqp.put(12,factor12);
  431. //--------------------因子处理分割线----------------------------------
  432. FeeFactorInfoDto factor13=new FeeFactorInfoDto();
  433. factor13.setFactorName("商业险折扣区间");
  434. factor13.setMatchType("3");
  435. factor13.setMatchSequence(13);
  436. if(checkFactorConfigWithArea(factorCost.getMinCommercialInsuranceDiscount(),factorCost.getMaxCommercialInsuranceDiscount(),factor13,factorCost)){
  437. factor13.setNeedMatch(true);
  438. factor13.setMinRangeVal(factorCost.getMinCommercialInsuranceDiscount());
  439. factor13.setMaxRangeVal(factorCost.getMaxCommercialInsuranceDiscount());
  440. }else{
  441. //如果方案中未录入,则不校验该项因子
  442. factor13.setNeedMatch(false);
  443. }
  444. resultMqp.put(13,factor13);
  445. //--------------------因子处理分割线----------------------------------
  446. FeeFactorInfoDto factor14=new FeeFactorInfoDto();
  447. factor14.setFactorName("交强险折扣区间");
  448. factor14.setMatchType("3");
  449. factor14.setMatchSequence(14);
  450. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsuranceDiscount(),factorCost.getMaxCompulsoryInsuranceDiscount(),factor14,factorCost)){
  451. factor14.setNeedMatch(true);
  452. factor14.setMinRangeVal(factorCost.getMinCompulsoryInsuranceDiscount());
  453. factor14.setMaxRangeVal(factorCost.getMaxCompulsoryInsuranceDiscount());
  454. }else{
  455. //如果方案中未录入,则不校验该项因子
  456. factor14.setNeedMatch(false);
  457. }
  458. resultMqp.put(14,factor14);
  459. //--------------------因子处理分割线----------------------------------
  460. FeeFactorInfoDto factor15=new FeeFactorInfoDto();
  461. factor15.setFactorName("保司评分区间");
  462. factor15.setMatchType("3");
  463. factor15.setMatchSequence(15);
  464. if(checkFactorConfigWithArea(factorCost.getMinScore(),factorCost.getMaxScore(),factor15,factorCost)){
  465. factor15.setNeedMatch(true);
  466. factor15.setMinRangeVal(factorCost.getMinScore());
  467. factor15.setMaxRangeVal(factorCost.getMaxScore());
  468. }else{
  469. //如果方案中未录入,则不校验该项因子
  470. factor15.setNeedMatch(false);
  471. }
  472. resultMqp.put(15,factor15);
  473. //--------------------因子处理分割线----------------------------------
  474. FeeFactorInfoDto factor16=new FeeFactorInfoDto();
  475. factor16.setFactorName("预期赔付率区间");
  476. factor16.setMatchType("3");
  477. factor16.setMatchSequence(16);
  478. if(checkFactorConfigWithArea(factorCost.getMinLossRation(),factorCost.getMaxLossRation(),factor16,factorCost)){
  479. factor16.setNeedMatch(true);
  480. factor16.setMinRangeVal(factorCost.getMinLossRation());
  481. factor16.setMaxRangeVal(factorCost.getMaxLossRation());
  482. }else{
  483. //如果方案中未录入,则不校验该项因子
  484. factor16.setNeedMatch(false);
  485. }
  486. resultMqp.put(16,factor16);
  487. //--------------------因子处理分割线----------------------------------
  488. FeeFactorInfoDto factor17=new FeeFactorInfoDto();
  489. factor17.setFactorName("车牌号地区");
  490. factor17.setMatchType("2");
  491. factor17.setMatchSequence(17);
  492. if(factorCost.getLicenseNumber()!=null&&!"".equals(factorCost.getLicenseNumber())){
  493. factor17.setNeedMatch(true);
  494. String matchStr=factorCost.getLicenseNumber();
  495. //考虑是否含暂未上牌标志
  496. if(factorCost.getContainNoLicense()!=null&&"1".equals(factorCost.getContainNoLicense())){
  497. matchStr=matchStr+",暂未上牌";
  498. }
  499. factor17.setMultipleSelectVal(matchStr);
  500. }else{
  501. //如果方案中未录入,则不校验该项因子
  502. factor17.setNeedMatch(false);
  503. }
  504. resultMqp.put(17,factor17);
  505. return resultMqp;
  506. }
  507. /**
  508. * 判断区间类因子是否需要匹配
  509. * @param minVal
  510. * @param maxVal
  511. * @param factorInfoDto
  512. * @param productCosts
  513. * @return
  514. */
  515. private boolean checkFactorConfigWithArea(Integer minVal, Integer maxVal,FeeFactorInfoDto factorInfoDto,PtlAgreementProductCosts productCosts) {
  516. boolean result=false; //默认不需要匹配
  517. if(minVal!=null&&maxVal!=null){
  518. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  519. result=false;
  520. }else{
  521. if(minVal<=maxVal){
  522. result=true;
  523. }else{
  524. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  525. }
  526. }
  527. }else if(minVal!=null && maxVal==null){
  528. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  529. }else if(minVal==null&&maxVal!=null){
  530. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  531. }
  532. return result;
  533. }
  534. //----------------------------------------------分割线
  535. public FeeSchemeReqDto getFeeSchemeInfo(BaseQuoteInfoVo quoteInfoVo, QuoteRespVo quoteRespVo, String agreementId, String productId){
  536. CarInfoVo carInfoVo = quoteInfoVo.getCarInfo();
  537. List<KindInfoVo> kindList = quoteInfoVo.getKindList();
  538. String thirdPartyInsurance = "";
  539. if(kindList!=null && kindList.size()>0){
  540. for(KindInfoVo kindInfoVo:kindList){
  541. if("B".equals(kindInfoVo.getKindCode())){
  542. thirdPartyInsurance = String.valueOf(kindInfoVo.getAmount());
  543. }
  544. }
  545. }
  546. FeeSchemeReqDto feeSchemeReqDto = new FeeSchemeReqDto();
  547. String isTransfer = "0";
  548. String isNewCar = "0";
  549. String isRenewal = "0";
  550. String useNature = "";
  551. String carType="";
  552. String isNewEnergy = "0";
  553. feeSchemeReqDto.setBusType(productId);//"业务类型:单交0330、单商034001、单三034002、交三0330034002、交商0330034001"
  554. feeSchemeReqDto.setAgreementId(agreementId);//协议ID
  555. if(carInfoVo.isTransferFlag()){
  556. isTransfer = "1";
  557. }
  558. feeSchemeReqDto.setIsTransfer(isTransfer);//是否过户 1是 0否"
  559. if(!carInfoVo.isUsedCar()){
  560. isNewCar = "1";
  561. }
  562. feeSchemeReqDto.setIsNewCar(isNewCar);//是否新车 1是 0否
  563. if("1".equals(carInfoVo.getPowertype())||"2".equals(carInfoVo.getPowertype())||"3".equals(carInfoVo.getPowertype())){
  564. isNewEnergy = "1";
  565. }
  566. feeSchemeReqDto.setIsNewEnergy(isNewEnergy);//是否新能源 1是 0否
  567. feeSchemeReqDto.setIsRenewal("0");//是否续保 1是 0否 续保取值有争议 默认送否 暂时搁置
  568. //页面要素及中煤交互请求返参没有,先默认写死
  569. if("A0".equals(carInfoVo.getCartype())){
  570. carType="客车";
  571. }
  572. feeSchemeReqDto.setVehicleCategory(carType);//车辆大类: 客车、货车、特种车、挂车、摩托车、拖拉机
  573. if("8A".equals(carInfoVo.getCarnature())){
  574. useNature = "家庭自用";
  575. }
  576. feeSchemeReqDto.setUseNature(useNature);//使用性质: 营业出租、营业租赁、营业公交、营业客运、营业货运、营业旅游、家庭自用、非营业机关事业、非营业企业、非营业个人
  577. feeSchemeReqDto.setSeatNum(String.valueOf(carInfoVo.getSeatCount()));//座位数 大概率准
  578. feeSchemeReqDto.setPurchasePrice(carInfoVo.getPurchasePrice());//新车购置价 可能再次新车筛选的时候送保司和页面带入有差异
  579. feeSchemeReqDto.setApprovedLoadCapacity(String.valueOf(carInfoVo.getLimitLoad()));//核定载质量 可能再次新车筛选的时候送保司和页面带入有差异
  580. feeSchemeReqDto.setJqPremium(String.valueOf(quoteRespVo.getJqPremium()));//交强保费
  581. feeSchemeReqDto.setSyPremium(String.valueOf(quoteRespVo.getSyPremium()));//商业保费
  582. feeSchemeReqDto.setSumPayTax(String.valueOf(quoteRespVo.getTaxAmount()));//车船税金额
  583. feeSchemeReqDto.setThirdPartyInsurance(thirdPartyInsurance);//三者险保额 准
  584. feeSchemeReqDto.setNoCarPremium("");//随车产品保费
  585. feeSchemeReqDto.setSyDiscount("");//商业险折扣
  586. feeSchemeReqDto.setJqDiscount("");//交强险折扣
  587. // feeSchemeReqDto.setInsuranceScore(quotedPriceResponse.getPlatMain().getZmScore());//保司评分 这里直接取中煤分
  588. feeSchemeReqDto.setExpectedLossRate("");//预期赔付率
  589. if(carInfoVo.getLicenseNo()!=null&&!"".equals(carInfoVo.getLicenseNo())&&!"暂未上牌".equals(carInfoVo.getLicenseNo())){
  590. feeSchemeReqDto.setLicenseNo(carInfoVo.getLicenseNo().substring(0,2));//车牌号
  591. }else{
  592. feeSchemeReqDto.setLicenseNo("暂未上牌");//车牌号
  593. }
  594. return feeSchemeReqDto;
  595. }
  596. }