FeeRuleSchemeServiceImpl.java 139 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315
  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.AccidentResponseVo;
  16. import com.ydtech.modules.ins.model.vo.CarInfoVo;
  17. import com.ydtech.modules.ins.model.vo.KindInfoVo;
  18. import com.ydtech.modules.ins.model.vo.QuoteRespVo;
  19. import com.ydtech.modules.order.entity.InsAreaCompany;
  20. import com.ydtech.modules.order.entity.InsFeeOrder;
  21. import com.ydtech.modules.order.entity.InsOrders;
  22. import com.ydtech.modules.order.entity.vo.*;
  23. import com.ydtech.modules.order.service.InsAreaCompanyService;
  24. import com.ydtech.modules.order.service.InsFeeOrderService;
  25. import com.ydtech.modules.order.service.InsOrdersService;
  26. import com.ydtech.modules.protocol.entity.po.*;
  27. import com.ydtech.modules.protocol.service.*;
  28. import org.apache.commons.lang3.StringUtils;
  29. import org.apache.commons.lang3.math.NumberUtils;
  30. import org.joda.time.DateTime;
  31. import org.springframework.stereotype.Service;
  32. import javax.annotation.Resource;
  33. import java.math.BigDecimal;
  34. import java.text.SimpleDateFormat;
  35. import java.time.LocalDate;
  36. import java.time.format.DateTimeFormatter;
  37. import java.util.*;
  38. import java.util.stream.Collectors;
  39. /**
  40. * 费用接口中相关功能的实现类
  41. */
  42. @Service
  43. public class FeeRuleSchemeServiceImpl implements FeeRuleSchemeService {
  44. @Resource
  45. private PtlAgreementProductCostsService ptlAgreementProductCostsService;
  46. @Resource
  47. private InsOrdersService insOrdersService;
  48. @Resource
  49. private InsFeeOrderService insFeeOrderService;
  50. @Resource
  51. private SysUserService sysUserService;
  52. @Resource
  53. private SysDeptService sysDeptService;
  54. @Resource
  55. private EsmRetailService esmRetailService;
  56. @Resource
  57. private EsmUserReferrerService esmUserReferrerService;
  58. @Resource
  59. private InsAreaCompanyService insAreaCompanyService;
  60. @Resource
  61. private PtlAgreementService ptlAgreementService;
  62. @Resource
  63. private PtlNewCarJudgeRulesService ptlNewCarJudgeRulesService;
  64. @Resource
  65. private PtlAgreementAttributionService ptlAgreementAttributionService;
  66. @Resource
  67. private PtlAgreementUndwrtRulesService ptlAgreementUndwrtRulesService;
  68. /**
  69. * 根据跟单信息,以及配置的费用因子,获取合适的跟单费用
  70. * @param feeSchemeReqDto
  71. * @return
  72. */
  73. public FeeSchemeResDto matchTheAppropriateFees(FeeSchemeReqDto feeSchemeReqDto) {
  74. FeeSchemeResDto feeSchemeResDto=new FeeSchemeResDto();
  75. //先根据业务类别、有效期、协议编码、历史标志代码字段 获取对应费用方案列表
  76. List<PtlAgreementProductCosts> ptlAgreementProductCosts =ptlAgreementProductCostsService.selectVliadFeeFactor(feeSchemeReqDto.getBusType(),feeSchemeReqDto.getAgreementId());
  77. if (ptlAgreementProductCosts.isEmpty()) {
  78. //如果查询不到费用方案信息,则阻断算费流程,进行提示
  79. throw new SystemException("未查询到费用配置,请先配置该协议的费用方案!");
  80. }else{
  81. //符合跟单信息的方案列表
  82. List<PtlAgreementProductCosts> validSchemeList=new ArrayList();
  83. //循环符合的方案列表,再进行细化的因子匹配,获取最终可以匹配到的方案
  84. for(int i=0;i<ptlAgreementProductCosts.size();i++){
  85. PtlAgreementProductCosts factorCost=ptlAgreementProductCosts.get(i);
  86. //获取处理后的待校验因子
  87. Map<Integer, FeeFactorInfoDto> factorToBeVerified=getFactorToBeVerified(factorCost);
  88. //按规则拼接跟单信息
  89. String matchKeyStr=getMatchKeyWithInsuranceInfo(feeSchemeReqDto);
  90. //循环进行各项因子校验
  91. boolean checkFlag=checkFactorValidWithInsuranceInfo(matchKeyStr,factorToBeVerified,factorCost.getProductId());
  92. //如果该方案所有因子都校验通过,则放入符合校验方案列表
  93. if(checkFlag){
  94. validSchemeList.add(factorCost);
  95. }
  96. }
  97. if(validSchemeList.size()>0){
  98. //先判断匹配到的是不是只有兜底类型,如果不是则过滤掉兜底类型的费用,优先以跟单的为准,如果只有兜底类型,则按同样逻辑进行筛选
  99. //根据ProductId去重后的结果集
  100. List tempList=validSchemeList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PtlAgreementProductCosts :: getProductId))), ArrayList::new));
  101. if(tempList.size()>1){//如果有多种类型,则过滤掉兜底类型的
  102. validSchemeList=validSchemeList.stream().filter(x -> !"039999".equals(x.getProductId())).collect(Collectors.toList());
  103. }
  104. //匹配到唯一一条费用方案,直接用这条
  105. if(validSchemeList.size()==1){
  106. //进行费用比例赋值,给返回对象
  107. feeSchemeResDto=generateSchemeResDto((PtlAgreementProductCosts)validSchemeList.get(0));
  108. }else{
  109. /* //如果最终符合的有多条,则按特殊规则选择其中一条 (原来使用保费多少判断优先的停用)
  110. PtlAgreementProductCosts finalSchemeCost=changeSchemeWithSpecialRule(validSchemeList,feeSchemeReqDto);*/
  111. PtlAgreementProductCosts finalSchemeCost=null;
  112. //调整为使用协议方案中优先级字段判断优先方案(循环找出对应优先级最高的)
  113. for(int i=0;i<validSchemeList.size();i++){
  114. PtlAgreementProductCosts tempCostDto=validSchemeList.get(i);
  115. int currentLevel=tempCostDto.getPriorityLevel()==null?0:tempCostDto.getPriorityLevel();
  116. if(finalSchemeCost!=null){
  117. int oldLevel=finalSchemeCost.getPriorityLevel()==null?0:finalSchemeCost.getPriorityLevel();
  118. if(oldLevel>currentLevel){
  119. finalSchemeCost=tempCostDto;
  120. }
  121. }else{
  122. finalSchemeCost=tempCostDto;
  123. }
  124. }
  125. //进行费用比例赋值,给返回对象
  126. feeSchemeResDto=generateSchemeResDto(finalSchemeCost);
  127. }
  128. }else{
  129. throw new SystemException("未匹配到合适的费用方案,请先配置该协议的费用方案!");
  130. }
  131. }
  132. return feeSchemeResDto;
  133. }
  134. /**
  135. * 特殊处理选择费用方案
  136. * 如果最终符合的有多条,则先看交强、商业谁的保费多,然后根据保费多得在匹配到的方案中找费用比例大的那一条
  137. * @param validSchemeList
  138. * @param feeSchemeReqDto
  139. * @return
  140. */
  141. private PtlAgreementProductCosts changeSchemeWithSpecialRule(List<PtlAgreementProductCosts> validSchemeList, FeeSchemeReqDto feeSchemeReqDto) {
  142. PtlAgreementProductCosts finalScheme=null;
  143. //险种标志,最终取哪个险种费用比例 1取交强 2取商业
  144. String riskFlag="";
  145. //判断险种标志
  146. if("0330".equals(feeSchemeReqDto.getBusType())){//单交
  147. riskFlag="1";
  148. }else if("034001".equals(feeSchemeReqDto.getBusType())){//单商
  149. riskFlag="2";
  150. }else if("034002".equals(feeSchemeReqDto.getBusType())){//单三
  151. riskFlag="2";
  152. }else if("0330034002".equals(feeSchemeReqDto.getBusType())){//交三
  153. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  154. riskFlag="2";
  155. }else{
  156. riskFlag="1";
  157. }
  158. }else if("0330034001".equals(feeSchemeReqDto.getBusType())){//交商
  159. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  160. riskFlag="2";
  161. }else{
  162. riskFlag="1";
  163. }
  164. }
  165. //循环找出对应比例最大的
  166. for(int i=0;i<validSchemeList.size();i++){
  167. PtlAgreementProductCosts tempCostDto=validSchemeList.get(i);
  168. if(finalScheme!=null){
  169. if("1".equals(riskFlag)){//按交强比例排序,找比例最大的
  170. if(Double.parseDouble(finalScheme.getJqCostsProportion())<Double.parseDouble(tempCostDto.getJqCostsProportion())){
  171. finalScheme=tempCostDto;
  172. }
  173. }else if("2".equals(riskFlag)){//按商业比例排序,找比例最大的
  174. if(Double.parseDouble(finalScheme.getSyCostsProportion())<Double.parseDouble(tempCostDto.getSyCostsProportion())){
  175. finalScheme=tempCostDto;
  176. }
  177. }
  178. }else{
  179. finalScheme=tempCostDto;
  180. }
  181. }
  182. return finalScheme;
  183. }
  184. /**
  185. * 组装费用接口反参对象
  186. * @param agreementProductCost
  187. * @return
  188. */
  189. private FeeSchemeResDto generateSchemeResDto(PtlAgreementProductCosts agreementProductCost) {
  190. FeeSchemeResDto resDto=new FeeSchemeResDto();
  191. resDto.setAgreementId(agreementProductCost.getAgreementId());
  192. resDto.setSchemeId(agreementProductCost.getId());
  193. resDto.setJqSpilloverPremiums(agreementProductCost.getJqSpilloverPremiums());
  194. resDto.setJqSpilloverProportion(agreementProductCost.getJqSpilloverProportion());
  195. resDto.setJqNewCarCostsProportion(agreementProductCost.getJqNewCarCostsProportion());
  196. resDto.setJqOldCarCostsProportion(agreementProductCost.getJqOldCarCostsProportion());
  197. resDto.setJqCostsProportion(agreementProductCost.getJqCostsProportion());
  198. resDto.setJqNewCarOtherCostsProportion(agreementProductCost.getJqNewCarOtherCostsProportion());
  199. resDto.setJqOldCarOtherCostsProportion(agreementProductCost.getJqOldCarOtherCostsProportion());
  200. resDto.setSySpilloverPremiums(agreementProductCost.getSySpilloverPremiums());
  201. resDto.setSySpilloverProportion(agreementProductCost.getSySpilloverProportion());
  202. resDto.setSyNewCarCostsProportion(agreementProductCost.getSyNewCarCostsProportion());
  203. resDto.setSyOldCarCostsProportion(agreementProductCost.getSyOldCarCostsProportion());
  204. resDto.setSyCostsProportion(agreementProductCost.getSyCostsProportion());
  205. resDto.setSyNewCarOtherCostsProportion(agreementProductCost.getSyNewCarOtherCostsProportion());
  206. resDto.setSyOldCarOtherCostsProportion(agreementProductCost.getSyOldCarOtherCostsProportion());
  207. return resDto;
  208. }
  209. /**
  210. * 根据跟单信息,循环各项因子 校验该方案的匹配情况
  211. * @param matchKeyStr
  212. * @param factorToBeVerified
  213. * @return
  214. */
  215. private boolean checkFactorValidWithInsuranceInfo(String matchKeyStr, Map<Integer, FeeFactorInfoDto> factorToBeVerified,String productId) {
  216. boolean result=false; //默认没有匹配到
  217. boolean isConfigFactor=false;//是否配置了因子校验项 默认否
  218. String[] matchKeys= matchKeyStr.split(",");
  219. //循环待校验因子列表
  220. for(Map.Entry<Integer,FeeFactorInfoDto> entry : factorToBeVerified.entrySet()){
  221. Integer key=entry.getKey();
  222. FeeFactorInfoDto checkFactorInfo=entry.getValue();
  223. //特殊处理,如果跟单是客车时,不关注配置的核定载质量字段
  224. if("客车".equals(matchKeys[4])){
  225. if(checkFactorInfo.getMatchSequence()==8){
  226. continue;
  227. }
  228. }
  229. //先看该方案是否需要匹配该因子,不需要则跳过本条因子
  230. if(!checkFactorInfo.isNeedMatch()){
  231. continue;
  232. }else {
  233. isConfigFactor=true;//不跳过因子时,则有配置的因子项
  234. }
  235. //下面处理需要进行匹配的因子
  236. if("1".equals(checkFactorInfo.getMatchType())){//1.单字符串匹配(相等)
  237. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  238. if(checkFactorInfo.getSingleSelectVal().equals(matchKeys[key])){
  239. result=true;
  240. continue;
  241. }else{
  242. //如果需要匹配且没有匹配到,则直接跳出本次循环,该方案不符合
  243. result=false;
  244. break;
  245. }
  246. }else{
  247. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  248. result=false;
  249. break;
  250. }
  251. }else if("2".equals(checkFactorInfo.getMatchType())){//2.多字符串匹配(包含)
  252. //如果匹配的是业务类型,需要全字符匹配
  253. //业务类型:单交0330、单商034001、单三034002、交三0330034002、交商0330034001
  254. //034002,0330
  255. if("业务类型".equals(checkFactorInfo.getFactorName())){
  256. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  257. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  258. if(checkFactorInfo.getMultipleSelectVal().indexOf(matchKeys[key]+",")>-1){
  259. result=true;
  260. continue;
  261. }else{
  262. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  263. result=false;
  264. break;
  265. }
  266. }else{
  267. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  268. result=false;
  269. break;
  270. }
  271. }else{
  272. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  273. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  274. if(checkFactorInfo.getMultipleSelectVal().indexOf(matchKeys[key])>-1){
  275. result=true;
  276. continue;
  277. }else{
  278. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  279. result=false;
  280. break;
  281. }
  282. }else{
  283. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  284. result=false;
  285. break;
  286. }
  287. }
  288. }else if("3".equals(checkFactorInfo.getMatchType())){//3.区间范围比较(左闭右闭)
  289. if(matchKeys[key]!=null&&NumberUtils.isCreatable(matchKeys[key])){
  290. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  291. if(Double.parseDouble(matchKeys[key])>=checkFactorInfo.getMinRangeVal()&&Double.parseDouble(matchKeys[key])<=checkFactorInfo.getMaxRangeVal()){
  292. result=true;
  293. continue;
  294. }else{
  295. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  296. result=false;
  297. break;
  298. }
  299. }else{
  300. //判断跟单信息是否为空和可转整型,如果不符,则直接没有匹配到,该方案不符合
  301. result=false;
  302. break;
  303. }
  304. }else if("4".equals(checkFactorInfo.getMatchType())){//4.特殊规则,司乘险校验,存在关联关系需要单独判断
  305. if(matchKeys[key]!=null){
  306. //先获取跟单司机、乘客保额
  307. String[] kindAmountStr= matchKeys[key].split("-");
  308. String driverAmount="NULL".equals(kindAmountStr[0])?"0":kindAmountStr[0];
  309. String passengerAmount="NULL".equals(kindAmountStr[1])?"0":kindAmountStr[1];
  310. if("0".equals(checkFactorInfo.getDriverPassengerRelation())){//无关系,则各自校验各自,有一个不符合,则方案不符合
  311. if(NumberUtils.isCreatable(driverAmount)){//如果司机保额是数字,则可以进行校验
  312. if(checkFactorInfo.isDriverIsNeedMatch()){
  313. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  314. if(Double.parseDouble(driverAmount)>=checkFactorInfo.getDriverMinRangeVal()&&Double.parseDouble(driverAmount)<=checkFactorInfo.getDriverMaxRangeVal()){
  315. result=true;
  316. continue;
  317. }else{
  318. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  319. result=false;
  320. break;
  321. }
  322. }
  323. }
  324. if(NumberUtils.isCreatable(passengerAmount)){//如果司机保额是数字,则可以进行校验
  325. if(checkFactorInfo.isPassengerIsNeedMatch()){
  326. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  327. if(Double.parseDouble(passengerAmount)>=checkFactorInfo.getPassengerMinRangeVal()&&Double.parseDouble(passengerAmount)<=checkFactorInfo.getPassengerMaxRangeVal()){
  328. result=true;
  329. continue;
  330. }else{
  331. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  332. result=false;
  333. break;
  334. }
  335. }
  336. }
  337. }else if("1".equals(checkFactorInfo.getDriverPassengerRelation())){//或的关系 2个里面有一个通过则通过
  338. boolean isDriverPass=false;
  339. boolean isPassengerPass=false;
  340. if(NumberUtils.isCreatable(driverAmount)){//如果司机保额是数字,则可以进行校验
  341. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  342. if(Double.parseDouble(driverAmount)>=checkFactorInfo.getDriverMinRangeVal()&&Double.parseDouble(driverAmount)<=checkFactorInfo.getDriverMaxRangeVal()){
  343. isDriverPass=true;
  344. }
  345. }
  346. if(NumberUtils.isCreatable(passengerAmount)){//如果司机保额是数字,则可以进行校验
  347. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  348. if(Double.parseDouble(passengerAmount)>=checkFactorInfo.getPassengerMinRangeVal()&&Double.parseDouble(passengerAmount)<=checkFactorInfo.getPassengerMaxRangeVal()){
  349. isPassengerPass=true;
  350. }
  351. }
  352. if(!isDriverPass&&!isPassengerPass){//两项都不通过的时候,才不符合
  353. result=false;
  354. break;
  355. }else{
  356. result=true;
  357. continue;
  358. }
  359. }else if("2".equals(checkFactorInfo.getDriverPassengerRelation())){//且的关系 2个全部通过才算通过
  360. boolean isDriverPass=false;
  361. boolean isPassengerPass=false;
  362. if(NumberUtils.isCreatable(driverAmount)){//如果司机保额是数字,则可以进行校验
  363. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  364. if(Double.parseDouble(driverAmount)>=checkFactorInfo.getDriverMinRangeVal()&&Double.parseDouble(driverAmount)<=checkFactorInfo.getDriverMaxRangeVal()){
  365. isDriverPass=true;
  366. }
  367. }
  368. if(NumberUtils.isCreatable(passengerAmount)){//如果司机保额是数字,则可以进行校验
  369. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  370. if(Double.parseDouble(passengerAmount)>=checkFactorInfo.getPassengerMinRangeVal()&&Double.parseDouble(passengerAmount)<=checkFactorInfo.getPassengerMaxRangeVal()){
  371. isPassengerPass=true;
  372. }
  373. }
  374. if(isDriverPass&&isPassengerPass){//两项都通过的时候,才符合
  375. result=true;
  376. continue;
  377. }else{
  378. result=false;
  379. break;
  380. }
  381. }
  382. }
  383. }else if("5".equals(checkFactorInfo.getMatchType())) {//5.特殊规则,医保外用校验,存在互斥关系需要单独判断
  384. if(matchKeys[key]!=null){
  385. //先获取跟单医保外用保额 三者-司机-乘客
  386. String[] kindAmountStr= matchKeys[key].split("-");
  387. String thirdMedicalAmount="NULL".equals(kindAmountStr[0])?"0":kindAmountStr[0];
  388. String driverMedicalAmount="NULL".equals(kindAmountStr[1])?"0":kindAmountStr[1];
  389. String passengerMedicalAmount="NULL".equals(kindAmountStr[2])?"0":kindAmountStr[2];
  390. if(checkFactorInfo.getAnyMedicalAmountVal()!=null){//不为空时,为任意险别符合即可 三者 司机 乘客 三者为 或的关系
  391. boolean isThirdPass=false;
  392. boolean isDriverPass=false;
  393. boolean isPassengerPass=false;
  394. if(NumberUtils.isCreatable(thirdMedicalAmount)){//如果医保外用三者保额是数字,则可以进行校验
  395. if(Double.parseDouble(thirdMedicalAmount)>=checkFactorInfo.getAnyMedicalAmountVal()){
  396. isThirdPass=true;
  397. }
  398. }
  399. if(NumberUtils.isCreatable(driverMedicalAmount)){//如果医保外用保额是数字,则可以进行校验
  400. if(Double.parseDouble(driverMedicalAmount)>=checkFactorInfo.getAnyMedicalAmountVal()){
  401. isDriverPass=true;
  402. }
  403. }
  404. if(NumberUtils.isCreatable(passengerMedicalAmount)){//如果医保外用乘客保额是数字,则可以进行校验
  405. if(Double.parseDouble(passengerMedicalAmount)>=checkFactorInfo.getAnyMedicalAmountVal()){
  406. isPassengerPass=true;
  407. }
  408. }
  409. if(!isThirdPass&&!isDriverPass&&!isPassengerPass){//三项都不通过的时候,才不符合
  410. result=false;
  411. break;
  412. }else{
  413. result=true;
  414. continue;
  415. }
  416. }else {//看指定险别的判断 三者 司机 乘客 三者为 且的关系
  417. boolean isThirdPass=false;
  418. boolean isDriverPass=false;
  419. boolean isPassengerPass=false;
  420. if(NumberUtils.isCreatable(thirdMedicalAmount)){//如果医保外用三者保额是数字,则可以进行校验
  421. if(checkFactorInfo.getThirdMedicalAmountVal()!=null){
  422. if(Double.parseDouble(thirdMedicalAmount)>=checkFactorInfo.getThirdMedicalAmountVal()){
  423. isThirdPass=true;
  424. }
  425. }else{
  426. isThirdPass=true;
  427. }
  428. }
  429. if(NumberUtils.isCreatable(driverMedicalAmount)){//如果医保外用保额是数字,则可以进行校验
  430. if(checkFactorInfo.getDriverMedicalAmountVal()!=null){
  431. if(Double.parseDouble(driverMedicalAmount)>=checkFactorInfo.getDriverMedicalAmountVal()){
  432. isDriverPass=true;
  433. }
  434. }else{
  435. isDriverPass=true;
  436. }
  437. }
  438. if(NumberUtils.isCreatable(passengerMedicalAmount)){//如果医保外用乘客保额是数字,则可以进行校验
  439. if(checkFactorInfo.getPassengerMedicalAmountVal()!=null){
  440. if(Double.parseDouble(passengerMedicalAmount)>=checkFactorInfo.getPassengerMedicalAmountVal()){
  441. isPassengerPass=true;
  442. }
  443. }else{
  444. isPassengerPass=true;
  445. }
  446. }
  447. if(isThirdPass&&isDriverPass&&isPassengerPass){//三项都通过的时候,才符合
  448. result=true;
  449. continue;
  450. }else{
  451. result=false;
  452. break;
  453. }
  454. }
  455. }
  456. }
  457. }
  458. if(productId!=null&&"039999".equals(productId)){
  459. if(!isConfigFactor){//如果是兜底配置 且 没有配置因子项时,则认为匹配到
  460. result=true;
  461. }
  462. }
  463. return result;
  464. }
  465. /**
  466. * 根据跟单信息,按照约定顺序进行拼接匹配串
  467. * 新增因子时,顺序需要与getFactorToBeVerified()方法放入待校验因子一致
  468. * @param feeSchemeReqDto
  469. * @return
  470. */
  471. private String getMatchKeyWithInsuranceInfo(FeeSchemeReqDto feeSchemeReqDto) {
  472. StringBuffer result=new StringBuffer();
  473. result.append(feeSchemeReqDto.getIsTransfer()).append(",");
  474. result.append(feeSchemeReqDto.getIsNewCar()).append(",");
  475. result.append(feeSchemeReqDto.getIsNewEnergy()).append(",");
  476. result.append(feeSchemeReqDto.getIsRenewal()).append(",");
  477. result.append(feeSchemeReqDto.getVehicleCategory()).append(",");
  478. result.append(feeSchemeReqDto.getUseNature()).append(",");
  479. result.append(feeSchemeReqDto.getSeatNum()).append(",");
  480. result.append(feeSchemeReqDto.getPurchasePrice()).append(",");
  481. result.append(feeSchemeReqDto.getApprovedLoadCapacity()).append(",");
  482. result.append(feeSchemeReqDto.getJqPremium()).append(",");
  483. result.append(feeSchemeReqDto.getSumPayTax()).append(",");
  484. result.append(feeSchemeReqDto.getThirdPartyInsurance()).append(",");
  485. result.append(feeSchemeReqDto.getNoCarPremium()).append(",");
  486. result.append(feeSchemeReqDto.getSyDiscount()).append(",");
  487. result.append(feeSchemeReqDto.getJqDiscount()).append(",");
  488. result.append(feeSchemeReqDto.getInsuranceScore()).append(",");
  489. result.append(feeSchemeReqDto.getExpectedLossRate()).append(",");
  490. result.append(feeSchemeReqDto.getLicenseNo()).append(",");
  491. //司乘险保额因子,特殊处理(司机保额-乘客保额)
  492. result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverAmount())?feeSchemeReqDto.getDriverAmount():"NULL").append("-").append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerAmount())?feeSchemeReqDto.getPassengerAmount():"NULL").append(",");
  493. result.append(feeSchemeReqDto.getInsureAge()).append(",");
  494. result.append(feeSchemeReqDto.getCarOwnerAge()).append(",");
  495. //医保外用险保额因子,特殊处理(三者保额-司机保额-乘客保额)
  496. result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getThirdMedicalAmount())?feeSchemeReqDto.getThirdMedicalAmount():"NULL").append("-")
  497. .append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverMedicalAmount())?feeSchemeReqDto.getDriverMedicalAmount():"NULL").append("-")
  498. .append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerMedicalAmount())?feeSchemeReqDto.getPassengerMedicalAmount():"NULL");
  499. return result.toString();
  500. }
  501. /**
  502. * 根据配置的因子表数据,组装标准的待校验因子列表
  503. * 新增因子时,顺序需要与getMatchKeyWithInsuranceInfo()方法放入跟单信息一致
  504. * @param factorCost
  505. * @return
  506. */
  507. private Map<Integer, FeeFactorInfoDto> getFactorToBeVerified(PtlAgreementProductCosts factorCost) {
  508. Map<Integer, FeeFactorInfoDto> resultMqp=new HashMap<>();
  509. //以下各项因子必须按顺序放入MAP,以便校验时关联
  510. //--------------------因子处理分割线----------------------------------
  511. FeeFactorInfoDto factor0=new FeeFactorInfoDto();
  512. factor0.setFactorName("是否过户");
  513. factor0.setMatchType("1");
  514. factor0.setMatchSequence(0);
  515. if(factorCost.getTransfer()!=null&&factorCost.getTransfer()!=9){
  516. factor0.setNeedMatch(true);
  517. factor0.setSingleSelectVal(String.valueOf(factorCost.getTransfer()));
  518. }else{
  519. //如果方案中未录入(是空或为9时),则不校验该项因子
  520. factor0.setNeedMatch(false);
  521. }
  522. resultMqp.put(0,factor0);
  523. //--------------------因子处理分割线----------------------------------
  524. FeeFactorInfoDto factor1=new FeeFactorInfoDto();
  525. factor1.setFactorName("新旧车");
  526. factor1.setMatchType("1");
  527. factor1.setMatchSequence(1);
  528. if(factorCost.getOldAndNew()!=null&&factorCost.getOldAndNew()!=9){
  529. factor1.setNeedMatch(true);
  530. factor1.setSingleSelectVal(String.valueOf(factorCost.getOldAndNew()));
  531. }else{
  532. //如果方案中未录入(是空或为9时),则不校验该项因子
  533. factor1.setNeedMatch(false);
  534. }
  535. resultMqp.put(1,factor1);
  536. //--------------------因子处理分割线----------------------------------
  537. FeeFactorInfoDto factor2=new FeeFactorInfoDto();
  538. factor2.setFactorName("是否新能源");
  539. factor2.setMatchType("1");
  540. factor2.setMatchSequence(2);
  541. if(factorCost.getNewEnergy()!=null&&factorCost.getNewEnergy()!=9){
  542. factor2.setNeedMatch(true);
  543. factor2.setSingleSelectVal(String.valueOf(factorCost.getNewEnergy()));
  544. }else{
  545. //如果方案中未录入(是空或为9时),则不校验该项因子
  546. factor2.setNeedMatch(false);
  547. }
  548. resultMqp.put(2,factor2);
  549. //--------------------因子处理分割线----------------------------------
  550. FeeFactorInfoDto factor3=new FeeFactorInfoDto();
  551. factor3.setFactorName("是否续保");
  552. factor3.setMatchType("1");
  553. factor3.setMatchSequence(3);
  554. if(factorCost.getRenewal()!=null&&factorCost.getRenewal()!=9){
  555. factor3.setNeedMatch(true);
  556. factor3.setSingleSelectVal(String.valueOf(factorCost.getRenewal()));
  557. }else{
  558. //如果方案中未录入(是空或为9时),则不校验该项因子
  559. factor3.setNeedMatch(false);
  560. }
  561. resultMqp.put(3,factor3);
  562. //--------------------因子处理分割线----------------------------------
  563. FeeFactorInfoDto factor4=new FeeFactorInfoDto();
  564. factor4.setFactorName("车辆大类");
  565. factor4.setMatchType("2");
  566. factor4.setMatchSequence(4);
  567. if(factorCost.getVehicleCategory()!=null&&!"".equals(factorCost.getVehicleCategory())){
  568. factor4.setNeedMatch(true);
  569. factor4.setMultipleSelectVal(String.valueOf(factorCost.getVehicleCategory()));
  570. }else{
  571. //如果方案中未录入,则不校验该项因子
  572. factor4.setNeedMatch(false);
  573. }
  574. resultMqp.put(4,factor4);
  575. //--------------------因子处理分割线----------------------------------
  576. FeeFactorInfoDto factor5=new FeeFactorInfoDto();
  577. factor5.setFactorName("使用性质");
  578. factor5.setMatchType("2");
  579. factor5.setMatchSequence(5);
  580. if(factorCost.getNatureOfUse()!=null&&!"".equals(factorCost.getNatureOfUse())){
  581. factor5.setNeedMatch(true);
  582. factor5.setMultipleSelectVal(String.valueOf(factorCost.getNatureOfUse()));
  583. }else{
  584. //如果方案中未录入,则不校验该项因子
  585. factor5.setNeedMatch(false);
  586. }
  587. resultMqp.put(5,factor5);
  588. //--------------------因子处理分割线----------------------------------
  589. FeeFactorInfoDto factor6=new FeeFactorInfoDto();
  590. factor6.setFactorName("客车座位数区间");
  591. factor6.setMatchType("3");
  592. factor6.setMatchSequence(6);
  593. if(checkFactorConfigWithArea(factorCost.getMinSeats(),factorCost.getMaxSeats(),factor6,factorCost)){
  594. factor6.setNeedMatch(true);
  595. factor6.setMinRangeVal((double)factorCost.getMinSeats());
  596. factor6.setMaxRangeVal((double)factorCost.getMaxSeats());
  597. }else{
  598. //如果方案中未录入,则不校验该项因子
  599. factor6.setNeedMatch(false);
  600. }
  601. resultMqp.put(6,factor6);
  602. //--------------------因子处理分割线----------------------------------
  603. FeeFactorInfoDto factor7=new FeeFactorInfoDto();
  604. factor7.setFactorName("新车购置价区间");
  605. factor7.setMatchType("3");
  606. factor7.setMatchSequence(7);
  607. if(checkFactorConfigWithArea(factorCost.getMinPurchasePrice(),factorCost.getMaxPurchasePrice(),factor7,factorCost)){
  608. factor7.setNeedMatch(true);
  609. factor7.setMinRangeVal((double)factorCost.getMinPurchasePrice());
  610. factor7.setMaxRangeVal((double)factorCost.getMaxPurchasePrice());
  611. }else{
  612. //如果方案中未录入,则不校验该项因子
  613. factor7.setNeedMatch(false);
  614. }
  615. resultMqp.put(7,factor7);
  616. //--------------------因子处理分割线----------------------------------
  617. FeeFactorInfoDto factor8=new FeeFactorInfoDto();
  618. factor8.setFactorName("核定载质量区间");
  619. factor8.setMatchType("3");
  620. factor8.setMatchSequence(8);
  621. if(checkFactorConfigWithArea(factorCost.getMinApprovedLoadCapacity(),factorCost.getMaxApprovedLoadCapacity(),factor8,factorCost)){
  622. factor8.setNeedMatch(true);
  623. factor8.setMinRangeVal((double)factorCost.getMinApprovedLoadCapacity());
  624. factor8.setMaxRangeVal((double)factorCost.getMaxApprovedLoadCapacity());
  625. }else{
  626. //如果方案中未录入,则不校验该项因子
  627. factor8.setNeedMatch(false);
  628. }
  629. resultMqp.put(8,factor8);
  630. //--------------------因子处理分割线----------------------------------
  631. FeeFactorInfoDto factor9=new FeeFactorInfoDto();
  632. factor9.setFactorName("交强险保费区间");
  633. factor9.setMatchType("3");
  634. factor9.setMatchSequence(9);
  635. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsurancePremium(),factorCost.getMaxCompulsoryInsurancePremium(),factor9,factorCost)){
  636. factor9.setNeedMatch(true);
  637. factor9.setMinRangeVal((double)factorCost.getMinCompulsoryInsurancePremium());
  638. factor9.setMaxRangeVal((double)factorCost.getMaxCompulsoryInsurancePremium());
  639. }else{
  640. //如果方案中未录入,则不校验该项因子
  641. factor9.setNeedMatch(false);
  642. }
  643. resultMqp.put(9,factor9);
  644. //--------------------因子处理分割线----------------------------------
  645. FeeFactorInfoDto factor10=new FeeFactorInfoDto();
  646. factor10.setFactorName("车船税金额区间");
  647. factor10.setMatchType("3");
  648. factor10.setMatchSequence(10);
  649. if(checkFactorConfigWithArea(factorCost.getMinTaxAmount(),factorCost.getMaxTaxAmount(),factor10,factorCost)){
  650. factor10.setNeedMatch(true);
  651. factor10.setMinRangeVal((double)factorCost.getMinTaxAmount());
  652. factor10.setMaxRangeVal((double)factorCost.getMaxTaxAmount());
  653. }else{
  654. //如果方案中未录入,则不校验该项因子
  655. factor10.setNeedMatch(false);
  656. }
  657. resultMqp.put(10,factor10);
  658. //--------------------因子处理分割线----------------------------------
  659. FeeFactorInfoDto factor11=new FeeFactorInfoDto();
  660. factor11.setFactorName("三者保额区间");
  661. factor11.setMatchType("3");
  662. factor11.setMatchSequence(11);
  663. if(checkFactorConfigWithArea(factorCost.getMinTheThreePremium(),factorCost.getMaxTheThreePremium(),factor11,factorCost)){
  664. factor11.setNeedMatch(true);
  665. factor11.setMinRangeVal((double)factorCost.getMinTheThreePremium()*10000);
  666. factor11.setMaxRangeVal((double)factorCost.getMaxTheThreePremium()*10000);
  667. }else{
  668. //如果方案中未录入,则不校验该项因子
  669. factor11.setNeedMatch(false);
  670. }
  671. resultMqp.put(11,factor11);
  672. //--------------------因子处理分割线----------------------------------
  673. FeeFactorInfoDto factor12=new FeeFactorInfoDto();
  674. factor12.setFactorName("随车产品保费区间");
  675. factor12.setMatchType("3");
  676. factor12.setMatchSequence(12);
  677. if(checkFactorConfigWithArea(factorCost.getMinOnboardProductsPremium(),factorCost.getMaxOnboardProductsPremium(),factor12,factorCost)){
  678. factor12.setNeedMatch(true);
  679. factor12.setMinRangeVal((double)factorCost.getMinOnboardProductsPremium());
  680. factor12.setMaxRangeVal((double)factorCost.getMaxOnboardProductsPremium());
  681. }else{
  682. //如果方案中未录入,则不校验该项因子
  683. factor12.setNeedMatch(false);
  684. }
  685. resultMqp.put(12,factor12);
  686. //--------------------因子处理分割线----------------------------------
  687. FeeFactorInfoDto factor13=new FeeFactorInfoDto();
  688. factor13.setFactorName("商业险折扣区间");
  689. factor13.setMatchType("3");
  690. factor13.setMatchSequence(13);
  691. if(checkFactorConfigWithArea(factorCost.getMinCommercialInsuranceDiscount(),factorCost.getMaxCommercialInsuranceDiscount(),factor13,factorCost)){
  692. factor13.setNeedMatch(true);
  693. factor13.setMinRangeVal((double)factorCost.getMinCommercialInsuranceDiscount());
  694. factor13.setMaxRangeVal((double)factorCost.getMaxCommercialInsuranceDiscount());
  695. }else{
  696. //如果方案中未录入,则不校验该项因子
  697. factor13.setNeedMatch(false);
  698. }
  699. resultMqp.put(13,factor13);
  700. //--------------------因子处理分割线----------------------------------
  701. FeeFactorInfoDto factor14=new FeeFactorInfoDto();
  702. factor14.setFactorName("交强险折扣区间");
  703. factor14.setMatchType("3");
  704. factor14.setMatchSequence(14);
  705. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsuranceDiscount(),factorCost.getMaxCompulsoryInsuranceDiscount(),factor14,factorCost)){
  706. factor14.setNeedMatch(true);
  707. factor14.setMinRangeVal(factorCost.getMinCompulsoryInsuranceDiscount());
  708. factor14.setMaxRangeVal(factorCost.getMaxCompulsoryInsuranceDiscount());
  709. }else{
  710. //如果方案中未录入,则不校验该项因子
  711. factor14.setNeedMatch(false);
  712. }
  713. resultMqp.put(14,factor14);
  714. //--------------------因子处理分割线----------------------------------
  715. FeeFactorInfoDto factor15=new FeeFactorInfoDto();
  716. factor15.setFactorName("保司评分区间");
  717. factor15.setMatchType("3");
  718. factor15.setMatchSequence(15);
  719. if(checkFactorConfigWithArea(factorCost.getMinScore(),factorCost.getMaxScore(),factor15,factorCost)){
  720. factor15.setNeedMatch(true);
  721. factor15.setMinRangeVal((double)factorCost.getMinScore());
  722. factor15.setMaxRangeVal((double)factorCost.getMaxScore());
  723. }else{
  724. //如果方案中未录入,则不校验该项因子
  725. factor15.setNeedMatch(false);
  726. }
  727. resultMqp.put(15,factor15);
  728. //--------------------因子处理分割线----------------------------------
  729. FeeFactorInfoDto factor16=new FeeFactorInfoDto();
  730. factor16.setFactorName("预期赔付率区间");
  731. factor16.setMatchType("3");
  732. factor16.setMatchSequence(16);
  733. if(checkFactorConfigWithArea(factorCost.getMinLossRation(),factorCost.getMaxLossRation(),factor16,factorCost)){
  734. factor16.setNeedMatch(true);
  735. factor16.setMinRangeVal((double)factorCost.getMinLossRation());
  736. factor16.setMaxRangeVal((double)factorCost.getMaxLossRation());
  737. }else{
  738. //如果方案中未录入,则不校验该项因子
  739. factor16.setNeedMatch(false);
  740. }
  741. resultMqp.put(16,factor16);
  742. //--------------------因子处理分割线----------------------------------
  743. FeeFactorInfoDto factor17=new FeeFactorInfoDto();
  744. factor17.setFactorName("车牌号地区");
  745. factor17.setMatchType("2");
  746. factor17.setMatchSequence(17);
  747. if(factorCost.getLicenseNumber()!=null&&!"".equals(factorCost.getLicenseNumber())){
  748. factor17.setNeedMatch(true);
  749. String matchStr=factorCost.getLicenseNumber();
  750. //考虑是否含暂未上牌标志
  751. if(factorCost.getContainNoLicense()!=null&&"1".equals(factorCost.getContainNoLicense())){
  752. matchStr=matchStr+",暂未上牌";
  753. }
  754. factor17.setMultipleSelectVal(matchStr);
  755. }else{
  756. //如果方案中未录入,则不校验该项因子
  757. factor17.setNeedMatch(false);
  758. }
  759. resultMqp.put(17,factor17);
  760. //--------------------因子处理分割线----------------------------------
  761. FeeFactorInfoDto factor18=new FeeFactorInfoDto();
  762. factor18.setMatchType("4");
  763. factor18.setMatchSequence(18);
  764. boolean driverCheckFlag=true;//司机保额是否需要校验
  765. boolean passengerCheckFlag=true;//乘客保额是否需要校验
  766. //临时赋值,下面方法中使用需要区分
  767. factor18.setFactorName("人员司机险保额");
  768. if(checkFactorConfigWithArea(factorCost.getMinDriverAmount(),factorCost.getMaxDriverAmount(),factor18,factorCost)){
  769. factor18.setDriverMinRangeVal(factorCost.getMinDriverAmount()*10000);
  770. factor18.setDriverMaxRangeVal(factorCost.getMaxDriverAmount()*10000);
  771. }else{
  772. driverCheckFlag=false;
  773. }
  774. //临时赋值,下面方法中使用需要区分
  775. factor18.setFactorName("人员乘客险保额");
  776. if(checkFactorConfigWithArea(factorCost.getMinPassengerAmount(),factorCost.getMaxPassengerAmount(),factor18,factorCost)){
  777. factor18.setPassengerMinRangeVal(factorCost.getMinPassengerAmount()*10000);
  778. factor18.setPassengerMaxRangeVal(factorCost.getMaxPassengerAmount()*10000);
  779. }else{
  780. passengerCheckFlag=false;
  781. }
  782. //最终给因子赋值
  783. factor18.setFactorName("司乘险保额");
  784. factor18.setDriverIsNeedMatch(driverCheckFlag);
  785. factor18.setPassengerIsNeedMatch(passengerCheckFlag);
  786. //司机、乘客都不需要校验时,不校验该因子
  787. if(!driverCheckFlag&&!passengerCheckFlag){
  788. factor18.setNeedMatch(false);
  789. }else{//需要校验时,需要考虑俩者关联关系
  790. if(factorCost.getDriverPassengerRelation()!=null&&!"".equals(factorCost.getDriverPassengerRelation())){
  791. //赋值该因子参数关联关系
  792. factor18.setDriverPassengerRelation(factorCost.getDriverPassengerRelation());
  793. factor18.setNeedMatch(true);
  794. }else{
  795. throw new SystemException("协议ID:"+factorCost.getAgreementId()+" 方案序号:"+factorCost.getId()+" 费用因子:"+factor18.getFactorName()+"关联关系配置有问题,请检查!");
  796. }
  797. }
  798. resultMqp.put(18,factor18);
  799. //--------------------因子处理分割线----------------------------------
  800. FeeFactorInfoDto factor19=new FeeFactorInfoDto();
  801. factor19.setFactorName("被保人年龄");
  802. factor19.setMatchType("3");
  803. factor19.setMatchSequence(19);
  804. if(checkFactorConfigWithArea(factorCost.getMinInsureAge(),factorCost.getMaxInsureAge(),factor19,factorCost)){
  805. factor19.setNeedMatch(true);
  806. factor19.setMinRangeVal((double)factorCost.getMinInsureAge());
  807. factor19.setMaxRangeVal((double)factorCost.getMaxInsureAge());
  808. }else{
  809. //如果方案中未录入,则不校验该项因子
  810. factor19.setNeedMatch(false);
  811. }
  812. resultMqp.put(19,factor19);
  813. //--------------------因子处理分割线----------------------------------
  814. FeeFactorInfoDto factor20=new FeeFactorInfoDto();
  815. factor20.setFactorName("车主年龄");
  816. factor20.setMatchType("3");
  817. factor20.setMatchSequence(20);
  818. if(checkFactorConfigWithArea(factorCost.getMinCarOwnerAge(),factorCost.getMaxCarOwnerAge(),factor20,factorCost)){
  819. factor20.setNeedMatch(true);
  820. factor20.setMinRangeVal((double)factorCost.getMinCarOwnerAge());
  821. factor20.setMaxRangeVal((double)factorCost.getMaxCarOwnerAge());
  822. }else{
  823. //如果方案中未录入,则不校验该项因子
  824. factor20.setNeedMatch(false);
  825. }
  826. resultMqp.put(20,factor20);
  827. //--------------------因子处理分割线----------------------------------
  828. FeeFactorInfoDto factor21=new FeeFactorInfoDto();
  829. boolean thirdMCheckFlag=true;//三者医保外用保额是否需要校验
  830. boolean driverMCheckFlag=true;//司机医保外用保额是否需要校验
  831. boolean passengerMCheckFlag=true;//乘客医保外用保额是否需要校验
  832. boolean anyMCheckFlag=true;//任意医保外用保额是否需要校验
  833. factor21.setMatchType("5");
  834. factor21.setMatchSequence(21);
  835. //三者
  836. if(factorCost.getThirdMedicalAmount()!=null&&factorCost.getThirdMedicalAmount()!=0){
  837. factor21.setThirdMedicalAmountVal(factorCost.getThirdMedicalAmount()*10000);
  838. }else{
  839. factor21.setThirdMedicalAmountVal(null);
  840. thirdMCheckFlag=false;
  841. }
  842. //司机
  843. if(factorCost.getDriverMedicalAmount()!=null&&factorCost.getDriverMedicalAmount()!=0){
  844. factor21.setDriverMedicalAmountVal(factorCost.getDriverMedicalAmount()*10000);
  845. }else{
  846. factor21.setDriverMedicalAmountVal(null);
  847. driverMCheckFlag=false;
  848. }
  849. //乘客
  850. if(factorCost.getPassengerMedicalAmount()!=null&&factorCost.getPassengerMedicalAmount()!=0){
  851. factor21.setPassengerMedicalAmountVal(factorCost.getPassengerMedicalAmount()*10000);
  852. }else{
  853. factor21.setPassengerMedicalAmountVal(null);
  854. passengerMCheckFlag=false;
  855. }
  856. //任意
  857. if(factorCost.getAnyMedicalAmount()!=null&&factorCost.getAnyMedicalAmount()!=0){
  858. factor21.setAnyMedicalAmountVal(factorCost.getAnyMedicalAmount()*10000);
  859. }else{
  860. factor21.setAnyMedicalAmountVal(null);
  861. anyMCheckFlag=false;
  862. }
  863. //最终给因子赋值
  864. factor21.setFactorName("医保外用保额");
  865. if(!thirdMCheckFlag&&!driverMCheckFlag&&!passengerMCheckFlag&&!anyMCheckFlag){//如果四项都没有配置时,不需要校验
  866. factor21.setNeedMatch(false);
  867. }else{
  868. factor21.setNeedMatch(true);
  869. }
  870. resultMqp.put(21,factor21);
  871. //--------------------因子处理分割线----------------------------------
  872. return resultMqp;
  873. }
  874. /**
  875. * 判断区间类因子是否需要匹配
  876. * @param minVal
  877. * @param maxVal
  878. * @param factorInfoDto
  879. * @param productCosts
  880. * @return
  881. */
  882. private boolean checkFactorConfigWithArea(Integer minVal, Integer maxVal,FeeFactorInfoDto factorInfoDto,PtlAgreementProductCosts productCosts) {
  883. boolean result=false; //默认不需要匹配
  884. if(minVal!=null&&maxVal!=null){
  885. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  886. result=false;
  887. }else{
  888. if(minVal<=maxVal){
  889. result=true;
  890. }else{
  891. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  892. }
  893. }
  894. }else if(minVal!=null && maxVal==null){
  895. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  896. }else if(minVal==null&&maxVal!=null){
  897. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  898. }
  899. return result;
  900. }
  901. /**
  902. * 判断区间类因子是否需要匹配
  903. * @param minVal
  904. * @param maxVal
  905. * @param factorInfoDto
  906. * @param productCosts
  907. * @return
  908. */
  909. private boolean checkFactorConfigWithArea(Double minVal, Double maxVal,FeeFactorInfoDto factorInfoDto,PtlAgreementProductCosts productCosts) {
  910. boolean result=false; //默认不需要匹配
  911. if(minVal!=null&&maxVal!=null){
  912. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  913. result=false;
  914. }else{
  915. if(minVal<=maxVal){
  916. result=true;
  917. }else{
  918. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  919. }
  920. }
  921. }else if(minVal!=null && maxVal==null){
  922. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  923. }else if(minVal==null&&maxVal!=null){
  924. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  925. }
  926. return result;
  927. }
  928. //----------------------------------------------分割线
  929. public FeeSchemeReqDto getFeeSchemeInfo(BaseQuoteInfoVo quoteInfoVo, QuoteRespVo quoteRespVo, String agreementId, String productId){
  930. PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(agreementId);
  931. CarInfoVo carInfoVo = quoteInfoVo.getCarInfo();
  932. List<KindInfoVo> kindList = quoteInfoVo.getKindList();
  933. String thirdPartyInsurance = "";
  934. String driverAmount="";
  935. String passengerAmount="";
  936. String thirdMedicalAmount="";
  937. String driverMedicalAmount="";
  938. String passengerMedicalAmount="";
  939. if(kindList!=null && kindList.size()>0){
  940. for(KindInfoVo kindInfoVo:kindList){
  941. //三者保额
  942. if("B".equals(kindInfoVo.getKindCode())){
  943. thirdPartyInsurance = String.valueOf(kindInfoVo.getAmount());
  944. }
  945. //司机保额
  946. if("D3".equals(kindInfoVo.getKindCode())){
  947. driverAmount = String.valueOf(kindInfoVo.getAmount());
  948. }
  949. //乘客保额
  950. if("D4".equals(kindInfoVo.getKindCode())){
  951. int quantity = Integer.parseInt(carInfoVo.getSeatCount())-1;
  952. passengerAmount = String.valueOf(kindInfoVo.getUnitAmount()*quantity);
  953. }
  954. //三者医保外用
  955. if("SY_FJ_YBW1".equals(kindInfoVo.getKindCode())){
  956. thirdMedicalAmount = String.valueOf(kindInfoVo.getAmount());
  957. }
  958. //司机医保外用
  959. if("SY_FJ_YBW3".equals(kindInfoVo.getKindCode())){
  960. driverMedicalAmount = String.valueOf(kindInfoVo.getAmount());
  961. }
  962. //乘客医保外用
  963. if("SY_FJ_YBW2".equals(kindInfoVo.getKindCode())){
  964. int quantity = Integer.parseInt(carInfoVo.getSeatCount())-1;
  965. passengerMedicalAmount = String.valueOf(kindInfoVo.getUnitAmount()*quantity);
  966. }
  967. }
  968. }
  969. FeeSchemeReqDto feeSchemeReqDto = new FeeSchemeReqDto();
  970. String isTransfer = "0";
  971. String isNewCar = "0";
  972. String isRenewal = "0";
  973. String useNature = "家庭自用";
  974. String carType="客车";
  975. String isNewEnergy = "0";
  976. feeSchemeReqDto.setBusType(productId);//"业务类型:单交0330、单商034001、单三034002、交三0330034002、交商0330034001"
  977. feeSchemeReqDto.setAgreementId(agreementId);//协议ID
  978. if(carInfoVo.isTransferFlag()){
  979. isTransfer = "1";
  980. }
  981. feeSchemeReqDto.setIsTransfer(isTransfer);//是否过户 1是 0否"
  982. //新旧车判断逻辑,初登日期小于起保日期加9个月
  983. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  984. LocalDate currentDate = LocalDate.now();
  985. //有交强日期时取交强,没有交强时取商业
  986. if(StringUtils.isNotEmpty(quoteRespVo.getStartDateJq())){
  987. try {
  988. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  989. Date startDate=sdf.parse(quoteRespVo.getStartDateJq());
  990. String jqStartDate = sdf.format(startDate);
  991. currentDate=LocalDate.parse(jqStartDate, formatter);
  992. }catch (Exception e){
  993. }
  994. }else if(StringUtils.isNotEmpty(quoteRespVo.getStartDateSy())){
  995. try {
  996. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  997. Date startDate=sdf.parse(quoteRespVo.getStartDateSy());
  998. String jqStartDate = sdf.format(startDate);
  999. currentDate=LocalDate.parse(jqStartDate, formatter);
  1000. }catch (Exception e){
  1001. }
  1002. }
  1003. if(StringUtils.isNotEmpty(carInfoVo.getRegisterDate())){
  1004. LocalDate registerDate = LocalDate.parse(carInfoVo.getRegisterDate(), formatter).plusMonths(9);
  1005. if(currentDate.isBefore(registerDate)){
  1006. isNewCar = "1";
  1007. }
  1008. }
  1009. List<PtlNewCarJudgeRules> ptlNewCarJudgeRulesList = ptlNewCarJudgeRulesService.getByCompanyId(ptlAgreementAttribution.getInsCompanyId());
  1010. if(ptlNewCarJudgeRulesList!=null &&ptlNewCarJudgeRulesList.size()>0){
  1011. PtlNewCarJudgeRules ptlNewCarJudgeRules = ptlNewCarJudgeRulesList.get(0);
  1012. if("月".equals(ptlNewCarJudgeRules.getUnitTypeCode())){
  1013. LocalDate registerDate = LocalDate.parse(carInfoVo.getRegisterDate(), formatter).plusMonths(Integer.parseInt(ptlNewCarJudgeRules.getUnitTypeValue()));
  1014. if(currentDate.isBefore(registerDate)){
  1015. isNewCar = "1";
  1016. }
  1017. }else{
  1018. LocalDate registerDate = LocalDate.parse(carInfoVo.getRegisterDate(), formatter).plusDays(Integer.parseInt(ptlNewCarJudgeRules.getUnitTypeValue()));
  1019. if(currentDate.isBefore(registerDate)){
  1020. isNewCar = "1";
  1021. }
  1022. }
  1023. }
  1024. feeSchemeReqDto.setIsNewCar(isNewCar);//是否新车 1是 0否
  1025. if("1".equals(carInfoVo.getPowertype())||"2".equals(carInfoVo.getPowertype())||"3".equals(carInfoVo.getPowertype())){
  1026. isNewEnergy = "1";
  1027. }
  1028. feeSchemeReqDto.setIsNewEnergy(isNewEnergy);//是否新能源 1是 0否
  1029. feeSchemeReqDto.setIsRenewal("0");//是否续保 1是 0否 续保取值有争议 默认送否 暂时搁置
  1030. //页面要素及中煤交互请求返参没有,先默认写死
  1031. if("A0".equals(carInfoVo.getCimodelclass())){
  1032. carType="客车";
  1033. }
  1034. feeSchemeReqDto.setVehicleCategory(carType);//车辆大类: 客车、货车、特种车、挂车、摩托车、拖拉机
  1035. if("8A".equals(carInfoVo.getCarnature())){
  1036. useNature = "家庭自用";
  1037. }
  1038. feeSchemeReqDto.setUseNature(useNature);//使用性质: 营业出租、营业租赁、营业公交、营业客运、营业货运、营业旅游、家庭自用、非营业机关事业、非营业企业、非营业个人
  1039. feeSchemeReqDto.setSeatNum(String.valueOf(carInfoVo.getSeatCount()));//座位数 大概率准
  1040. feeSchemeReqDto.setPurchasePrice(carInfoVo.getPurchasePrice());//新车购置价 可能再次新车筛选的时候送保司和页面带入有差异
  1041. feeSchemeReqDto.setApprovedLoadCapacity(String.valueOf(carInfoVo.getLimitLoad()));//核定载质量 可能再次新车筛选的时候送保司和页面带入有差异
  1042. feeSchemeReqDto.setJqPremium(String.valueOf(quoteRespVo.getJqPremium()));//交强保费
  1043. feeSchemeReqDto.setSyPremium(String.valueOf(quoteRespVo.getSyPremium()));//商业保费
  1044. feeSchemeReqDto.setSumPayTax(String.valueOf(quoteRespVo.getTaxAmount()));//车船税金额
  1045. feeSchemeReqDto.setThirdPartyInsurance(thirdPartyInsurance);//三者险保额 准
  1046. feeSchemeReqDto.setNoCarPremium(String.valueOf(quoteRespVo.getJyPremium()));//随车产品保费
  1047. feeSchemeReqDto.setSyDiscount(quoteRespVo.getSyAdjustRate());//商业险折扣
  1048. feeSchemeReqDto.setJqDiscount(quoteRespVo.getJqAdjustRate());//交强险折扣
  1049. feeSchemeReqDto.setInsuranceScore(quoteRespVo.getILogPreUdwMess());//保司评分
  1050. feeSchemeReqDto.setExpectedLossRate(String.valueOf(quoteRespVo.getLossRation()));//预期赔付率
  1051. if(carInfoVo.getLicenseNo()!=null&&!"".equals(carInfoVo.getLicenseNo())&&!"暂未上牌".equals(carInfoVo.getLicenseNo())){
  1052. feeSchemeReqDto.setLicenseNo(carInfoVo.getLicenseNo().substring(0,2));//车牌号
  1053. }else{
  1054. feeSchemeReqDto.setLicenseNo("暂未上牌");//车牌号
  1055. }
  1056. feeSchemeReqDto.setDriverAmount(driverAmount);//人员司机险保额 准
  1057. feeSchemeReqDto.setPassengerAmount(passengerAmount);//人员乘客险保额 准
  1058. feeSchemeReqDto.setThirdMedicalAmount(thirdMedicalAmount);//三者医保外用 准
  1059. feeSchemeReqDto.setDriverMedicalAmount(driverMedicalAmount);//司机医保外用 准
  1060. feeSchemeReqDto.setPassengerMedicalAmount(passengerMedicalAmount);//乘客医保外用 准
  1061. feeSchemeReqDto.setInsureAge(quoteInfoVo.getInsuredPersonInfo().getAge());//被保人年龄
  1062. feeSchemeReqDto.setCarOwnerAge(quoteInfoVo.getOwnerInfo().getAge());//车主年龄
  1063. return feeSchemeReqDto;
  1064. }
  1065. public void dealFeeOrderInfo(BaseQuoteInfoVo quoteInfoVo, QuoteRespVo quoteRespVo, String agreementId,String businessNo){
  1066. BigDecimal jqNoTaxPremium = new BigDecimal(0);
  1067. BigDecimal syNoTaxPremium = new BigDecimal(0);
  1068. InsOrders insOrders = insOrdersService.getById(quoteRespVo.getOrderno());
  1069. List<AccidentResponseVo> accidentList = quoteRespVo.getAccident();
  1070. /*BigDecimal accidentActualPremium = new BigDecimal(0);
  1071. for(AccidentResponseVo accidentResponseVo: accidentList){
  1072. accidentActualPremium = new BigDecimal(accidentResponseVo.getActualPremium());
  1073. }*/
  1074. FeeSchemeReqDto feeSchemeReqDto = this.getFeeSchemeInfo(quoteInfoVo,quoteRespVo,agreementId,insOrders.getProductid());
  1075. matchTheUndwrtRules(feeSchemeReqDto);
  1076. FeeSchemeResDto feeSchemeResDto = this.matchTheAppropriateFees(feeSchemeReqDto);
  1077. InsFeeOrder insFeeOrder = new InsFeeOrder(feeSchemeReqDto,feeSchemeResDto,businessNo);
  1078. PtlAgreement agreement=ptlAgreementService.getById(agreementId);
  1079. //先通过含税保费计算出不含税保费 公式 总保费/(1+增值税率) 目前增值税率是0.06
  1080. if(insFeeOrder.getJqPremium().doubleValue()>0){
  1081. //默认用含税保费计算
  1082. jqNoTaxPremium=insFeeOrder.getJqPremium();
  1083. //如果协议中配置为不含税结算时,计算不含税保费
  1084. if(StringUtils.isNotEmpty(agreement.getWithTax())&&"否".equals(agreement.getWithTax())){
  1085. jqNoTaxPremium = insFeeOrder.getJqPremium().divide(new BigDecimal(1+0.06),BigDecimal.ROUND_HALF_UP,2);
  1086. }
  1087. insFeeOrder.setJqNoTaxPremium(jqNoTaxPremium);
  1088. //交强险总费用
  1089. insFeeOrder.setJqCostsPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqCostsProportion()));
  1090. //监管费比例
  1091. if("1".equals(feeSchemeReqDto.getIsNewCar())){
  1092. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqNewCarCostsProportion()));
  1093. }else if("0".equals(feeSchemeReqDto.getIsNewCar())){
  1094. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqOldCarCostsProportion()));
  1095. }else{
  1096. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(0));
  1097. }
  1098. //监管费
  1099. insFeeOrder.setJqSuperviseCostsPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqSuperviseCostsProportion()));
  1100. //溢出费比例 先搁置放0
  1101. insFeeOrder.setJqSpilloverProportion(new BigDecimal(feeSchemeResDto.getJqSpilloverProportion()));
  1102. //溢出费 先搁置放0
  1103. insFeeOrder.setJqSpilloverPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqSpilloverProportion()));
  1104. }
  1105. if(insFeeOrder.getSyPremium().doubleValue()>0){
  1106. //默认用含税保费计算
  1107. syNoTaxPremium = insFeeOrder.getSyPremium();
  1108. //如果协议中配置为不含税结算时,计算不含税保费
  1109. if(StringUtils.isNotEmpty(agreement.getWithTax())&&"否".equals(agreement.getWithTax())){
  1110. syNoTaxPremium = insFeeOrder.getSyPremium().divide(new BigDecimal(1+0.06),BigDecimal.ROUND_HALF_UP,2);
  1111. }
  1112. insFeeOrder.setSyNoTaxPremium(syNoTaxPremium);
  1113. //商业险总费用
  1114. insFeeOrder.setSyCostsPremiums(getPremium(syNoTaxPremium,insFeeOrder.getSyCostsProportion()));
  1115. //监管费比例
  1116. if("1".equals(feeSchemeReqDto.getIsNewCar())){
  1117. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getSyNewCarCostsProportion()));
  1118. }else if("0".equals(feeSchemeReqDto.getIsNewCar())){
  1119. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getSyOldCarCostsProportion()));
  1120. }else{
  1121. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(0));
  1122. }
  1123. //监管费
  1124. insFeeOrder.setSySuperviseCostsPremiums(getPremium(syNoTaxPremium,insFeeOrder.getSySuperviseCostsProportion()));
  1125. //溢出费比例 先搁置放0
  1126. insFeeOrder.setSySpilloverProportion(new BigDecimal(feeSchemeResDto.getSySpilloverProportion()));
  1127. //溢出费 先搁置放0
  1128. insFeeOrder.setSySpilloverPremiums(getPremium(syNoTaxPremium,insFeeOrder.getSySpilloverProportion()));
  1129. }
  1130. if(jqNoTaxPremium.doubleValue() >0 || syNoTaxPremium.doubleValue() >0){
  1131. BigDecimal totalNoTaxPremium = jqNoTaxPremium.add(syNoTaxPremium);
  1132. SysUser sysUser = sysUserService.findByUserId(insOrders.getUserid());
  1133. /**
  1134. * 机构管理费比例逻辑
  1135. * 当前出单员的机构编码找他的上一级就是五级
  1136. * 机构层级划分方式
  1137. * 99 总公司 一级
  1138. * 9914山西分公司 二级
  1139. * 991401太原中支 三级
  1140. * 99140105小店中支 四级
  1141. * 9914010501 营销服务部 五级
  1142. * 1团队 无机构层级
  1143. */
  1144. //判断出单员归属机构层级
  1145. String parentId = sysUser.getDeptId();
  1146. String comlevel = "";
  1147. do{//循环操作
  1148. SysDept sysDeptTemp = sysDeptService.getById(parentId);
  1149. if(sysDeptTemp!=null&&StringUtils.isNotEmpty(sysDeptTemp.getParentId())){
  1150. parentId = sysDeptTemp.getParentId();
  1151. }else{
  1152. break;
  1153. }
  1154. if(StringUtils.isEmpty(sysDeptTemp.getComlevel())){
  1155. continue;
  1156. }else {
  1157. comlevel = sysDeptTemp.getComlevel();
  1158. }
  1159. //当机构层级为五级的时候,获取所有的机构费用比例
  1160. if(sysDeptTemp!=null && "5".equals(sysDeptTemp.getComlevel())){
  1161. //五级机构管理费用比例
  1162. insFeeOrder.setFifthDeptProportion(new BigDecimal(sysDeptTemp.getManagementFeeFifth()));
  1163. insFeeOrder.setFifthDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFifthDeptProportion()));
  1164. //四级机构管理费用比例
  1165. insFeeOrder.setForthDeptProportion(new BigDecimal(sysDeptTemp.getManagementFeeForth()));
  1166. insFeeOrder.setForthDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getForthDeptProportion()));
  1167. //三级机构管理费用比例
  1168. insFeeOrder.setThirdDeptProportion(new BigDecimal(sysDeptTemp.getManagementFeeThird()));
  1169. insFeeOrder.setThirdDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getThirdDeptProportion()));
  1170. //二级机构管理费用比例
  1171. insFeeOrder.setSecondDeptProportion(new BigDecimal(sysDeptTemp.getManagementFeeSecond()));
  1172. insFeeOrder.setSecondDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getSecondDeptProportion()));
  1173. //一级机构管理费用比例
  1174. insFeeOrder.setFirstDeptProportion(new BigDecimal(sysDeptTemp.getManagementFee()));
  1175. insFeeOrder.setFirstDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFirstDeptProportion()));
  1176. //取到第一层级时结束
  1177. break;
  1178. }
  1179. }while (!"1".equals(comlevel));
  1180. //一级分销比例 推荐人
  1181. //二级分销比例
  1182. //三级分销比例
  1183. /**
  1184. * 分销一级、二级、三级存值取团队配置的分销佣金比例,若该团队走三级分销模式,当前出单员出单时,跟单的分销取值方式为:
  1185. * 根据出单员的推荐人向上找三级,若可以找到,则跟单存一、二、三分销比例;
  1186. * 若向上只能找到一级或者二级,则跟单存一级或者一级、二级
  1187. * 比如 A 1 B 2 C 3 D 若D出单 则给 C 3个 B 2个 A 1个;C出单给 B 3个 A 2个
  1188. * 第一步,先判断团队配置的分销模式
  1189. * 第二步,根据分销模式找上级存值相应分销比例
  1190. * 第三步,仅有一个上级的情况分销比例存啥
  1191. */
  1192. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ", new Object[]{sysUser.getDeptId()});
  1193. if(esmRetailList!=null && esmRetailList.size()>0){
  1194. EsmRetail esmRetail = esmRetailList.get(0);
  1195. if(esmRetail!=null){
  1196. int cycleIndex = 0;
  1197. if("3".equals(esmRetail.getRetailtype())){//团队配置了三级分销模式
  1198. cycleIndex = 3;
  1199. }else if("2".equals(esmRetail.getRetailtype())){//团队配置了二级分销模式
  1200. cycleIndex = 2;
  1201. }else if("1".equals(esmRetail.getRetailtype())){//团队配置了一级分销模式
  1202. cycleIndex = 1;
  1203. }else if("0".equals(esmRetail.getRetailtype())){//团队没有配置分销模式
  1204. cycleIndex = 0;
  1205. }
  1206. //利用当前工号,循环向上找推荐人
  1207. String userId = sysUser.getId();
  1208. int breakCycle = 99999999;
  1209. for(int i=0;i<=cycleIndex;i++){
  1210. EsmUserReferrer userReferrer = esmUserReferrerService.getById(userId);
  1211. if(userReferrer.getReferrerId().equals(userReferrer.getId())){//团队长,没有上级
  1212. //跳出循环
  1213. breakCycle = i;
  1214. break;
  1215. }else {
  1216. userId = userReferrer.getReferrerId();
  1217. }
  1218. }
  1219. //breakCycle是3,当前工号的上级的上级的上级就是团队长
  1220. //breakCycle是2,当前工号的上级的上级就是团队长
  1221. //breakCycle是1,当前工号的上级就是团队长
  1222. //breakCycle是0,当前工号就是团队长
  1223. if("3".equals(esmRetail.getRetailtype())){//团队配置了三级分销模式
  1224. if(breakCycle==99999999||breakCycle==3){
  1225. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  1226. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  1227. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  1228. }else if(breakCycle==2){
  1229. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  1230. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  1231. }else if(breakCycle==1){
  1232. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  1233. }
  1234. }else if("2".equals(esmRetail.getRetailtype())){//团队配置了二级分销模式
  1235. if(breakCycle==99999999||breakCycle==3 || breakCycle==2){
  1236. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  1237. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  1238. }else if(breakCycle==1){
  1239. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  1240. }
  1241. }else if("1".equals(esmRetail.getRetailtype())){//团队配置了一级分销模式
  1242. if(breakCycle==99999999||breakCycle==3 || breakCycle==2||breakCycle==1){
  1243. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  1244. }
  1245. }
  1246. insFeeOrder.setFirstRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFirstRetailProportion()));
  1247. insFeeOrder.setSecondRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getSecondRetailProportion()));
  1248. insFeeOrder.setThirdRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getThirdRetailProportion()));
  1249. }
  1250. }
  1251. }
  1252. insFeeOrderService.insertCompanyAndOrders(insFeeOrder);
  1253. }
  1254. public void compareAndUpdateFeeOrderInfo( String insOrderNo,String jqCostsProportionStr,String syCostsProportionStr ){
  1255. InsFeeOrder insFeeOrder = insFeeOrderService.getByInsOrderNo(insOrderNo);
  1256. boolean updateFlag = false;
  1257. if(insFeeOrder.getJqPremium().doubleValue()>0 && StringUtils.isNotEmpty(jqCostsProportionStr)){
  1258. BigDecimal JqCostsProportion = new BigDecimal(jqCostsProportionStr);
  1259. //比较传入的交强总费用比例是否与原费用比例相等,不相等进行更新
  1260. if(JqCostsProportion.compareTo(insFeeOrder.getJqCostsProportion())!=0){
  1261. updateFlag = true;
  1262. //交强总费用比例
  1263. insFeeOrder.setJqCostsProportion(JqCostsProportion);
  1264. //交强险总费用
  1265. insFeeOrder.setJqCostsPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getJqCostsProportion()));
  1266. }
  1267. }
  1268. if(insFeeOrder.getSyPremium().doubleValue()>0 && StringUtils.isNotEmpty(syCostsProportionStr)){
  1269. BigDecimal SyCostsProportion = new BigDecimal(syCostsProportionStr);
  1270. //比较传入的商业总费用比例是否与原费用比例相等,不相等进行更新
  1271. if(SyCostsProportion.compareTo(insFeeOrder.getSyCostsProportion())!=0){
  1272. updateFlag = true;
  1273. //商业总费用比例
  1274. insFeeOrder.setSyCostsProportion(SyCostsProportion);
  1275. //商业险总费用
  1276. insFeeOrder.setSyCostsPremiums(getPremium(insFeeOrder.getSyNoTaxPremium(),insFeeOrder.getSyCostsProportion()));
  1277. }
  1278. }
  1279. if(updateFlag){
  1280. insFeeOrderService.updateById(insFeeOrder);
  1281. }
  1282. }
  1283. private BigDecimal getPremium(BigDecimal noTaxPremium,BigDecimal costsProportion){
  1284. BigDecimal premium = new BigDecimal(0);
  1285. if(costsProportion!=null && costsProportion.doubleValue()>0){
  1286. premium = noTaxPremium.multiply(costsProportion).divide(new BigDecimal(100),4,BigDecimal.ROUND_HALF_UP);
  1287. }
  1288. return premium;
  1289. }
  1290. private BigDecimal getPremiumForSubtract(BigDecimal former,BigDecimal latter){
  1291. BigDecimal premium = new BigDecimal(0);
  1292. if(former!=null && latter!=null){
  1293. premium = former.subtract(latter);
  1294. }
  1295. return premium;
  1296. }
  1297. public QueryOrderFeeVo queryFeeOrderInfo(String companyId){
  1298. QueryOrderFeeVo queryOrderFeeVo = new QueryOrderFeeVo();
  1299. QueryOrderCommissionVo orderCommissionVo = new QueryOrderCommissionVo();
  1300. OrderFeeVo jqOrderFeeVo = new OrderFeeVo();
  1301. OrderFeeVo syOrderFeeVo = new OrderFeeVo();
  1302. OrderFeeVo fcOrderFeeVo = new OrderFeeVo();
  1303. AdjustFeeDescVo adjustFeeDescVo=new AdjustFeeDescVo();//费用审核时使用
  1304. InsAreaCompany insAreaCompany = insAreaCompanyService.getByIdIsExist(companyId);
  1305. InsFeeOrder insFeeOrder = insFeeOrderService.getByInsOrderNo(insAreaCompany.getId());
  1306. if(insFeeOrder!=null){
  1307. if(insFeeOrder.getJqPremium()!=null && insFeeOrder.getJqPremium().doubleValue()>0 && insFeeOrder.getSyPremium()!=null && insFeeOrder.getSyPremium().doubleValue()==0){//当为单交业务时
  1308. jqOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1309. jqOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getJqCostsPremiums()));
  1310. jqOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getJqCostsProportion()));
  1311. jqOrderFeeVo.setCostsPremiumsAll(convertToString(insFeeOrder.getJqSuperviseCostsPremiums())+"元 / "+convertToString(insFeeOrder.getJqCostsPremiums().subtract(insFeeOrder.getJqSuperviseCostsPremiums()))+"元 / "+convertToString(insFeeOrder.getJqCostsPremiums())+"元");
  1312. jqOrderFeeVo.setCostsProportionAll(convertToString(insFeeOrder.getJqSuperviseCostsProportion())+" / "+convertToString(insFeeOrder.getJqCostsProportion().subtract(insFeeOrder.getJqSuperviseCostsProportion()))+" / "+convertToString(insFeeOrder.getJqCostsProportion()));
  1313. /*出单员手续费比例=总费用比例-各级管理费-各级分销费-溢出费*/
  1314. orderCommissionVo = getQueryOrderCommission(orderCommissionVo,insFeeOrder,"JQ");
  1315. }else if(insFeeOrder.getSyPremium()!=null && insFeeOrder.getSyPremium().doubleValue()>0 && insFeeOrder.getJqPremium()!=null && insFeeOrder.getJqPremium().doubleValue()==0){//当为单商业务时
  1316. syOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1317. syOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getSyCostsPremiums()));
  1318. syOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getSyCostsProportion()));
  1319. syOrderFeeVo.setCostsPremiumsAll(convertToString(insFeeOrder.getSySuperviseCostsPremiums())+"元 / "+convertToString(insFeeOrder.getSyCostsPremiums().subtract(insFeeOrder.getSySuperviseCostsPremiums()))+"元 / "+convertToString(insFeeOrder.getSyCostsPremiums())+"元");
  1320. syOrderFeeVo.setCostsProportionAll(convertToString(insFeeOrder.getSySuperviseCostsProportion())+" / "+convertToString(insFeeOrder.getSyCostsProportion().subtract(insFeeOrder.getSySuperviseCostsProportion()))+" / "+convertToString(insFeeOrder.getSyCostsProportion()));
  1321. /*出单员手续费比例=总费用比例-各级管理费-各级分销费-溢出费*/
  1322. orderCommissionVo = getQueryOrderCommission(orderCommissionVo,insFeeOrder,"SY");
  1323. }else if(insFeeOrder.getJqPremium()!=null && insFeeOrder.getJqPremium().doubleValue()>0 && insFeeOrder.getSyPremium()!=null && insFeeOrder.getSyPremium().doubleValue()>0){//当为交商业务时
  1324. QueryOrderFeeVo queryOrderFeeVoTemp = packageOrderFeeInfoAll(insFeeOrder);
  1325. //获取交强险费用明细
  1326. jqOrderFeeVo = queryOrderFeeVoTemp.getJqCoderFeeVo();
  1327. jqOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getJqCostsPremiums()));
  1328. jqOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getJqCostsProportion()));
  1329. jqOrderFeeVo.setCostsPremiumsAll(convertToString(insFeeOrder.getJqSuperviseCostsPremiums())+"元 / "+convertToString(insFeeOrder.getJqCostsPremiums().subtract(insFeeOrder.getJqSuperviseCostsPremiums()))+"元 / "+convertToString(insFeeOrder.getJqCostsPremiums())+"元");
  1330. jqOrderFeeVo.setCostsProportionAll(convertToString(insFeeOrder.getJqSuperviseCostsProportion())+" / "+convertToString(insFeeOrder.getJqCostsProportion().subtract(insFeeOrder.getJqSuperviseCostsProportion()))+" / "+convertToString(insFeeOrder.getJqCostsProportion()));
  1331. //获取商业险费用明细
  1332. syOrderFeeVo = queryOrderFeeVoTemp.getSyCoderFeeVo();
  1333. syOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getSyCostsPremiums()));
  1334. syOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getSyCostsProportion()));
  1335. syOrderFeeVo.setCostsPremiumsAll(convertToString(insFeeOrder.getSySuperviseCostsPremiums())+"元 / "+convertToString(insFeeOrder.getSyCostsPremiums().subtract(insFeeOrder.getSySuperviseCostsPremiums()))+"元 / "+convertToString(insFeeOrder.getSyCostsPremiums())+"元");
  1336. syOrderFeeVo.setCostsProportionAll(convertToString(insFeeOrder.getSySuperviseCostsProportion())+" / "+convertToString(insFeeOrder.getSyCostsProportion().subtract(insFeeOrder.getSySuperviseCostsProportion()))+" / "+convertToString(insFeeOrder.getSyCostsProportion()));
  1337. /*出单员手续费比例=总费用比例-各级管理费-各级分销费-溢出费*/
  1338. orderCommissionVo = getQueryOrderCommission(orderCommissionVo,insFeeOrder,"ALL");
  1339. }
  1340. queryOrderFeeVo.setJqCoderFeeVo(jqOrderFeeVo);
  1341. queryOrderFeeVo.setSyCoderFeeVo(syOrderFeeVo);
  1342. queryOrderFeeVo.setFcCoderFeeVo(fcOrderFeeVo);
  1343. queryOrderFeeVo.setOrderCommissionVo(orderCommissionVo);
  1344. //添加费用审核时 使用参数
  1345. if(insFeeOrder.getJqPremium()!=null && insFeeOrder.getJqPremium().doubleValue()>0 ){
  1346. adjustFeeDescVo.setJqPremium(convertToString(insFeeOrder.getJqNoTaxPremium()));
  1347. adjustFeeDescVo.setJqCommissionRate(convertToString(insFeeOrder.getJqSuperviseCostsProportion()));
  1348. adjustFeeDescVo.setJqCommissionAmount(convertToString(insFeeOrder.getJqSuperviseCostsPremiums()));
  1349. adjustFeeDescVo.setJqOtherFeeRate(convertToString(insFeeOrder.getJqCostsProportion().subtract(insFeeOrder.getJqSuperviseCostsProportion())));
  1350. adjustFeeDescVo.setJqOtherFeeAmount(convertToString(insFeeOrder.getJqCostsPremiums().subtract(insFeeOrder.getJqSuperviseCostsPremiums())));
  1351. adjustFeeDescVo.setJqAllFeeRate(convertToString(insFeeOrder.getJqCostsProportion()));
  1352. adjustFeeDescVo.setJqAllFeeAmount(convertToString(insFeeOrder.getJqCostsPremiums()));
  1353. }
  1354. if(insFeeOrder.getSyPremium()!=null && insFeeOrder.getSyPremium().doubleValue()>0){
  1355. adjustFeeDescVo.setSyPremium(convertToString(insFeeOrder.getSyNoTaxPremium()));
  1356. adjustFeeDescVo.setSyCommissionRate(convertToString(insFeeOrder.getSySuperviseCostsProportion()));
  1357. adjustFeeDescVo.setSyCommissionAmount(convertToString(insFeeOrder.getSySuperviseCostsPremiums()));
  1358. adjustFeeDescVo.setSyOtherFeeRate(convertToString(insFeeOrder.getSyCostsProportion().subtract(insFeeOrder.getSySuperviseCostsProportion())));
  1359. adjustFeeDescVo.setSyOtherFeeAmount(convertToString(insFeeOrder.getSyCostsPremiums().subtract(insFeeOrder.getSySuperviseCostsPremiums())));
  1360. adjustFeeDescVo.setSyAllFeeRate(convertToString(insFeeOrder.getSyCostsProportion()));
  1361. adjustFeeDescVo.setSyAllFeeAmount(convertToString(insFeeOrder.getSyCostsPremiums()));
  1362. }
  1363. queryOrderFeeVo.setAdjustFeeDescVo(adjustFeeDescVo);
  1364. }
  1365. return queryOrderFeeVo;
  1366. }
  1367. private QueryOrderCommissionVo getQueryOrderCommission(QueryOrderCommissionVo orderCommissionVo,InsFeeOrder insFeeOrder,String businessType){
  1368. /**
  1369. *单保交商时,insFeeOrder 存的就是单交商的各级管理费及分销费
  1370. *同保交商时,insFeeOrder 存的金额是交商总金额,需要扣减
  1371. */
  1372. /*出单员手续费比例=总费用比例-各级管理费-各级分销费-溢出费*/
  1373. if("JQ".equals(businessType)){
  1374. BigDecimal costsPremiums = insFeeOrder.getJqCostsPremiums();
  1375. BigDecimal costsProportion = insFeeOrder.getJqCostsProportion();
  1376. BigDecimal totalCostsProportion = getCostsProportion(insFeeOrder);
  1377. BigDecimal totalCostsPremiums = getCostsPremiumsOne(insFeeOrder);
  1378. if(insFeeOrder.getJqSpilloverPremiums()!=null){
  1379. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getJqSpilloverPremiums());
  1380. }
  1381. if(insFeeOrder.getJqSpilloverProportion()!=null){
  1382. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getJqSpilloverProportion());
  1383. }
  1384. BigDecimal userCostsPremiums = costsPremiums.subtract(totalCostsPremiums);
  1385. BigDecimal userCostsProportion = costsProportion.subtract(totalCostsProportion);
  1386. orderCommissionVo.setJqFeePremium(userCostsPremiums.toString());
  1387. orderCommissionVo.setJqFeeRate(userCostsProportion.toString());
  1388. orderCommissionVo.setTotalFeePremium(userCostsPremiums.toString());
  1389. }else if("SY".equals(businessType)){
  1390. BigDecimal costsPremiums = insFeeOrder.getSyCostsPremiums();
  1391. BigDecimal costsProportion = insFeeOrder.getSyCostsProportion();
  1392. BigDecimal totalCostsProportion = getCostsProportion(insFeeOrder);
  1393. BigDecimal totalCostsPremiums = getCostsPremiumsOne(insFeeOrder);
  1394. if(insFeeOrder.getSySpilloverPremiums()!=null){
  1395. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getSySpilloverPremiums());
  1396. }
  1397. if(insFeeOrder.getSySpilloverProportion()!=null){
  1398. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getSySpilloverProportion());
  1399. }
  1400. BigDecimal userCostsPremiums = costsPremiums.subtract(totalCostsPremiums);
  1401. BigDecimal userCostsProportion = costsProportion.subtract(totalCostsProportion);
  1402. orderCommissionVo.setSyFeePremium(userCostsPremiums.toString());
  1403. orderCommissionVo.setSyFeeRate(userCostsProportion.toString());
  1404. orderCommissionVo.setTotalFeePremium(userCostsPremiums.toString());
  1405. }else if("ALL".equals(businessType)){
  1406. BigDecimal jqCostsPremiums = insFeeOrder.getJqCostsPremiums();
  1407. BigDecimal jqCostsProportion = insFeeOrder.getJqCostsProportion();
  1408. BigDecimal syCostsPremiums = insFeeOrder.getSyCostsPremiums();
  1409. BigDecimal syCostsProportion = insFeeOrder.getSyCostsProportion();
  1410. BigDecimal totalCostsProportion = getCostsProportion(insFeeOrder);
  1411. BigDecimal jqTotalCostsProportion = totalCostsProportion;
  1412. BigDecimal syTotalCostsProportion = totalCostsProportion;
  1413. HashMap<String,BigDecimal> costsPremiumsMap = getCostsPremiumsAll(insFeeOrder);
  1414. BigDecimal jqTotalCostsPremiums = costsPremiumsMap.get("JQ");
  1415. if(insFeeOrder.getJqSpilloverPremiums()!=null){
  1416. jqTotalCostsPremiums = jqTotalCostsPremiums.add(insFeeOrder.getJqSpilloverPremiums());
  1417. }
  1418. if(insFeeOrder.getJqSpilloverProportion()!=null){
  1419. jqTotalCostsProportion = jqTotalCostsProportion.add(insFeeOrder.getJqSpilloverProportion());
  1420. }
  1421. BigDecimal syTotalCostsPremiums = costsPremiumsMap.get("SY");
  1422. if(insFeeOrder.getJqSpilloverPremiums()!=null){
  1423. syTotalCostsPremiums = syTotalCostsPremiums.add(insFeeOrder.getJqSpilloverPremiums());
  1424. }
  1425. if(insFeeOrder.getJqSpilloverProportion()!=null){
  1426. syTotalCostsProportion = syTotalCostsProportion.add(insFeeOrder.getJqSpilloverProportion());
  1427. }
  1428. BigDecimal jqUserCostsPremiums = jqCostsPremiums.subtract(jqTotalCostsPremiums);
  1429. BigDecimal jqUserCostsProportion = jqCostsProportion.subtract(jqTotalCostsProportion);
  1430. BigDecimal syUserCostsPremiums = syCostsPremiums.subtract(syTotalCostsPremiums);
  1431. BigDecimal syUserCostsProportion = syCostsProportion.subtract(syTotalCostsProportion);
  1432. orderCommissionVo.setJqFeePremium(jqUserCostsPremiums.toString());
  1433. orderCommissionVo.setJqFeeRate(jqUserCostsProportion.toString());
  1434. orderCommissionVo.setSyFeePremium(syUserCostsPremiums.toString());
  1435. orderCommissionVo.setSyFeeRate(syUserCostsProportion.toString());
  1436. orderCommissionVo.setTotalFeePremium(jqUserCostsPremiums.add(syUserCostsPremiums).toString());
  1437. }
  1438. return orderCommissionVo;
  1439. }
  1440. private HashMap<String,BigDecimal> getCostsPremiumsAll(InsFeeOrder insFeeOrder){
  1441. HashMap<String,BigDecimal> costsPremiumsMap = new HashMap<>();
  1442. InsFeeOrder jqInsFeeOrderTemp = new InsFeeOrder();
  1443. //先利用交强费重算费用
  1444. jqInsFeeOrderTemp.setFirstDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFirstDeptProportion()));
  1445. jqInsFeeOrderTemp.setSecondDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getSecondDeptProportion()));
  1446. jqInsFeeOrderTemp.setThirdDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getThirdDeptProportion()));
  1447. jqInsFeeOrderTemp.setForthDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getForthDeptProportion()));
  1448. jqInsFeeOrderTemp.setFifthDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFifthDeptProportion()));
  1449. jqInsFeeOrderTemp.setFirstRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFirstRetailProportion()));
  1450. jqInsFeeOrderTemp.setSecondRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getSecondRetailProportion()));
  1451. jqInsFeeOrderTemp.setThirdRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getThirdRetailProportion()));
  1452. BigDecimal jqCostsPremiums = getCostsPremiumsOne(jqInsFeeOrderTemp);
  1453. costsPremiumsMap.put("JQ",jqCostsPremiums);
  1454. //再利用总费-交强费,得出商业费
  1455. InsFeeOrder syInsFeeOrderTemp = new InsFeeOrder();
  1456. syInsFeeOrderTemp.setFirstDeptPremiums(getPremiumForSubtract(insFeeOrder.getFirstDeptPremiums(),jqInsFeeOrderTemp.getFirstDeptPremiums()));
  1457. syInsFeeOrderTemp.setSecondDeptPremiums(getPremiumForSubtract(insFeeOrder.getSecondDeptPremiums(),jqInsFeeOrderTemp.getSecondDeptPremiums()));
  1458. syInsFeeOrderTemp.setThirdDeptPremiums(getPremiumForSubtract(insFeeOrder.getThirdDeptPremiums(),jqInsFeeOrderTemp.getThirdDeptPremiums()));
  1459. syInsFeeOrderTemp.setForthDeptPremiums(getPremiumForSubtract(insFeeOrder.getForthDeptPremiums(),jqInsFeeOrderTemp.getForthDeptPremiums()));
  1460. syInsFeeOrderTemp.setFifthDeptPremiums(getPremiumForSubtract(insFeeOrder.getFifthDeptPremiums(),jqInsFeeOrderTemp.getFifthDeptPremiums()));
  1461. syInsFeeOrderTemp.setFirstRetailPremiums(getPremiumForSubtract(insFeeOrder.getFirstRetailPremiums(),jqInsFeeOrderTemp.getFirstRetailPremiums()));
  1462. syInsFeeOrderTemp.setSecondRetailPremiums(getPremiumForSubtract(insFeeOrder.getSecondRetailPremiums(),jqInsFeeOrderTemp.getSecondRetailPremiums()));
  1463. syInsFeeOrderTemp.setThirdRetailPremiums(getPremiumForSubtract(insFeeOrder.getThirdRetailPremiums(),jqInsFeeOrderTemp.getThirdRetailPremiums()));
  1464. BigDecimal syCostsPremiums = getCostsPremiumsOne(syInsFeeOrderTemp);
  1465. costsPremiumsMap.put("SY",syCostsPremiums);
  1466. return costsPremiumsMap;
  1467. }
  1468. private BigDecimal getCostsProportion(InsFeeOrder insFeeOrder){
  1469. BigDecimal totalCostsProportion = new BigDecimal(0);
  1470. if(insFeeOrder.getFirstDeptProportion()!=null){
  1471. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getFirstDeptProportion());
  1472. }
  1473. if(insFeeOrder.getSecondDeptProportion()!=null){
  1474. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getSecondDeptProportion());
  1475. }
  1476. if(insFeeOrder.getThirdDeptProportion()!=null){
  1477. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getThirdDeptProportion());
  1478. }
  1479. if(insFeeOrder.getForthDeptProportion()!=null){
  1480. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getForthDeptProportion());
  1481. }
  1482. if(insFeeOrder.getFifthDeptProportion()!=null){
  1483. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getFifthDeptProportion());
  1484. }
  1485. if(insFeeOrder.getFirstRetailProportion()!=null){
  1486. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getFirstRetailProportion());
  1487. }
  1488. if(insFeeOrder.getSecondRetailProportion()!=null){
  1489. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getSecondRetailProportion());
  1490. }
  1491. if(insFeeOrder.getThirdRetailProportion()!=null){
  1492. totalCostsProportion = totalCostsProportion.add(insFeeOrder.getThirdRetailProportion());
  1493. }
  1494. return totalCostsProportion;
  1495. }
  1496. private BigDecimal getCostsPremiumsOne(InsFeeOrder insFeeOrder){
  1497. BigDecimal totalCostsPremiums = new BigDecimal(0);
  1498. if(insFeeOrder.getFirstDeptPremiums()!=null){
  1499. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getFirstDeptPremiums());
  1500. }
  1501. if(insFeeOrder.getSecondDeptPremiums()!=null){
  1502. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getSecondDeptPremiums());
  1503. }
  1504. if(insFeeOrder.getThirdDeptPremiums()!=null){
  1505. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getThirdDeptPremiums());
  1506. }
  1507. if(insFeeOrder.getForthDeptPremiums()!=null){
  1508. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getForthDeptPremiums());
  1509. }
  1510. if(insFeeOrder.getFifthDeptPremiums()!=null){
  1511. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getFifthDeptPremiums());
  1512. }
  1513. if(insFeeOrder.getFirstRetailPremiums()!=null){
  1514. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getFirstRetailPremiums());
  1515. }
  1516. if(insFeeOrder.getSecondRetailPremiums()!=null){
  1517. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getSecondRetailPremiums());
  1518. }
  1519. if(insFeeOrder.getThirdRetailPremiums()!=null){
  1520. totalCostsPremiums = totalCostsPremiums.add(insFeeOrder.getThirdRetailPremiums());
  1521. }
  1522. return totalCostsPremiums;
  1523. }
  1524. //把取出的费用信息转换为页面需要展示的数据
  1525. public List<QueryOrderFeeResultVo> convertOrderFeeVoData(QueryOrderFeeVo orderFeeVo) {
  1526. List<QueryOrderFeeResultVo> resultList=new ArrayList<>();
  1527. OrderFeeVo jqOrderFeeVo = orderFeeVo.getJqCoderFeeVo();
  1528. OrderFeeVo syOrderFeeVo = orderFeeVo.getSyCoderFeeVo();
  1529. OrderFeeVo fcOrderFeeVo = orderFeeVo.getFcCoderFeeVo();
  1530. //总费用
  1531. QueryOrderFeeResultVo feeResultVo1=new QueryOrderFeeResultVo();
  1532. feeResultVo1.setDescSerialNo("1");
  1533. feeResultVo1.setFeeTypeName("总费用");
  1534. feeResultVo1.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getCostsProportion()!=null?jqOrderFeeVo.getCostsProportion():"-");
  1535. feeResultVo1.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getCostsPremiums()!=null?jqOrderFeeVo.getCostsPremiums():"-");
  1536. feeResultVo1.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getCostsProportion()!=null?syOrderFeeVo.getCostsProportion():"-");
  1537. feeResultVo1.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getCostsPremiums()!=null?syOrderFeeVo.getCostsPremiums():"-");
  1538. feeResultVo1.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getCostsProportion()!=null?fcOrderFeeVo.getCostsProportion():"-");
  1539. feeResultVo1.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getCostsPremiums()!=null?fcOrderFeeVo.getCostsPremiums():"-");
  1540. feeResultVo1.setJqFeeRateAll(jqOrderFeeVo!=null&&jqOrderFeeVo.getCostsProportionAll()!=null?jqOrderFeeVo.getCostsProportionAll():"-");
  1541. feeResultVo1.setJqFeeAmountAll(jqOrderFeeVo!=null&&jqOrderFeeVo.getCostsPremiumsAll()!=null?jqOrderFeeVo.getCostsPremiumsAll():"-");
  1542. feeResultVo1.setSyFeeRateAll(syOrderFeeVo!=null&&syOrderFeeVo.getCostsProportionAll()!=null?syOrderFeeVo.getCostsProportionAll():"-");
  1543. feeResultVo1.setSyFeeAmountAll(syOrderFeeVo!=null&&syOrderFeeVo.getCostsPremiumsAll()!=null?syOrderFeeVo.getCostsPremiumsAll():"-");
  1544. feeResultVo1.setFcFeeRateAll(fcOrderFeeVo!=null&&fcOrderFeeVo.getCostsProportionAll()!=null?fcOrderFeeVo.getCostsProportionAll():"-");
  1545. feeResultVo1.setFcFeeAmountAll(fcOrderFeeVo!=null&&fcOrderFeeVo.getCostsPremiumsAll()!=null?fcOrderFeeVo.getCostsPremiumsAll():"-");
  1546. resultList.add(feeResultVo1);
  1547. //一级管理费用
  1548. QueryOrderFeeResultVo feeResultVo2=new QueryOrderFeeResultVo();
  1549. feeResultVo2.setDescSerialNo("2");
  1550. feeResultVo2.setFeeTypeName("一级管理费");
  1551. feeResultVo2.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstDeptProportion()!=null?jqOrderFeeVo.getFirstDeptProportion():"-");
  1552. feeResultVo2.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstDeptPremiums()!=null?jqOrderFeeVo.getFirstDeptPremiums():"-");
  1553. feeResultVo2.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getFirstDeptProportion()!=null?syOrderFeeVo.getFirstDeptProportion():"-");
  1554. feeResultVo2.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getFirstDeptPremiums()!=null?syOrderFeeVo.getFirstDeptPremiums():"-");
  1555. feeResultVo2.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstDeptProportion()!=null?fcOrderFeeVo.getFirstDeptProportion():"-");
  1556. feeResultVo2.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstDeptPremiums()!=null?fcOrderFeeVo.getFirstDeptPremiums():"-");
  1557. feeResultVo2.setJqFeeRateAll(feeResultVo2.getJqFeeRate());
  1558. feeResultVo2.setJqFeeAmountAll(feeResultVo2.getJqFeeAmount());
  1559. feeResultVo2.setSyFeeRateAll(feeResultVo2.getSyFeeRate());
  1560. feeResultVo2.setSyFeeAmountAll(feeResultVo2.getSyFeeAmount());
  1561. feeResultVo2.setFcFeeRateAll(feeResultVo2.getFcFeeRate());
  1562. feeResultVo2.setFcFeeAmountAll(feeResultVo2.getFcFeeAmount());
  1563. resultList.add(feeResultVo2);
  1564. //二级管理费用
  1565. QueryOrderFeeResultVo feeResultVo3=new QueryOrderFeeResultVo();
  1566. feeResultVo3.setDescSerialNo("3");
  1567. feeResultVo3.setFeeTypeName("二级管理费");
  1568. feeResultVo3.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondDeptProportion()!=null?jqOrderFeeVo.getSecondDeptProportion():"-");
  1569. feeResultVo3.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondDeptPremiums()!=null?jqOrderFeeVo.getSecondDeptPremiums():"-");
  1570. feeResultVo3.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getSecondDeptProportion()!=null?syOrderFeeVo.getSecondDeptProportion():"-");
  1571. feeResultVo3.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getSecondDeptPremiums()!=null?syOrderFeeVo.getSecondDeptPremiums():"-");
  1572. feeResultVo3.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondDeptProportion()!=null?fcOrderFeeVo.getSecondDeptProportion():"-");
  1573. feeResultVo3.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondDeptPremiums()!=null?fcOrderFeeVo.getSecondDeptPremiums():"-");
  1574. feeResultVo3.setJqFeeRateAll(feeResultVo3.getJqFeeRate());
  1575. feeResultVo3.setJqFeeAmountAll(feeResultVo3.getJqFeeAmount());
  1576. feeResultVo3.setSyFeeRateAll(feeResultVo3.getSyFeeRate());
  1577. feeResultVo3.setSyFeeAmountAll(feeResultVo3.getSyFeeAmount());
  1578. feeResultVo3.setFcFeeRateAll(feeResultVo3.getFcFeeRate());
  1579. feeResultVo3.setFcFeeAmountAll(feeResultVo3.getFcFeeAmount());
  1580. resultList.add(feeResultVo3);
  1581. //三级管理费用
  1582. QueryOrderFeeResultVo feeResultVo4=new QueryOrderFeeResultVo();
  1583. feeResultVo4.setDescSerialNo("4");
  1584. feeResultVo4.setFeeTypeName("三级管理费");
  1585. feeResultVo4.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdDeptProportion()!=null?jqOrderFeeVo.getThirdDeptProportion():"-");
  1586. feeResultVo4.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdDeptPremiums()!=null?jqOrderFeeVo.getThirdDeptPremiums():"-");
  1587. feeResultVo4.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getThirdDeptProportion()!=null?syOrderFeeVo.getThirdDeptProportion():"-");
  1588. feeResultVo4.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getThirdDeptPremiums()!=null?syOrderFeeVo.getThirdDeptPremiums():"-");
  1589. feeResultVo4.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdDeptProportion()!=null?fcOrderFeeVo.getThirdDeptProportion():"-");
  1590. feeResultVo4.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdDeptPremiums()!=null?fcOrderFeeVo.getThirdDeptPremiums():"-");
  1591. feeResultVo4.setJqFeeRateAll(feeResultVo4.getJqFeeRate());
  1592. feeResultVo4.setJqFeeAmountAll(feeResultVo4.getJqFeeAmount());
  1593. feeResultVo4.setSyFeeRateAll(feeResultVo4.getSyFeeRate());
  1594. feeResultVo4.setSyFeeAmountAll(feeResultVo4.getSyFeeAmount());
  1595. feeResultVo4.setFcFeeRateAll(feeResultVo4.getFcFeeRate());
  1596. feeResultVo4.setFcFeeAmountAll(feeResultVo4.getFcFeeAmount());
  1597. resultList.add(feeResultVo4);
  1598. //四级管理费用
  1599. QueryOrderFeeResultVo feeResultVo5=new QueryOrderFeeResultVo();
  1600. feeResultVo5.setDescSerialNo("5");
  1601. feeResultVo5.setFeeTypeName("四级管理费");
  1602. feeResultVo5.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getForthDeptProportion()!=null?jqOrderFeeVo.getForthDeptProportion():"-");
  1603. feeResultVo5.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getForthDeptPremiums()!=null?jqOrderFeeVo.getForthDeptPremiums():"-");
  1604. feeResultVo5.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getForthDeptProportion()!=null?syOrderFeeVo.getForthDeptProportion():"-");
  1605. feeResultVo5.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getForthDeptPremiums()!=null?syOrderFeeVo.getForthDeptPremiums():"-");
  1606. feeResultVo5.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getForthDeptProportion()!=null?fcOrderFeeVo.getForthDeptProportion():"-");
  1607. feeResultVo5.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getForthDeptPremiums()!=null?fcOrderFeeVo.getForthDeptPremiums():"-");
  1608. feeResultVo5.setJqFeeRateAll(feeResultVo5.getJqFeeRate());
  1609. feeResultVo5.setJqFeeAmountAll(feeResultVo5.getJqFeeAmount());
  1610. feeResultVo5.setSyFeeRateAll(feeResultVo5.getSyFeeRate());
  1611. feeResultVo5.setSyFeeAmountAll(feeResultVo5.getSyFeeAmount());
  1612. feeResultVo5.setFcFeeRateAll(feeResultVo5.getFcFeeRate());
  1613. feeResultVo5.setFcFeeAmountAll(feeResultVo5.getFcFeeAmount());
  1614. resultList.add(feeResultVo5);
  1615. //五级管理费用
  1616. QueryOrderFeeResultVo feeResultVo6=new QueryOrderFeeResultVo();
  1617. feeResultVo6.setDescSerialNo("6");
  1618. feeResultVo6.setFeeTypeName("五级管理费");
  1619. feeResultVo6.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getFifthDeptProportion()!=null?jqOrderFeeVo.getFifthDeptProportion():"-");
  1620. feeResultVo6.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getFifthDeptPremiums()!=null?jqOrderFeeVo.getFifthDeptPremiums():"-");
  1621. feeResultVo6.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getFifthDeptProportion()!=null?syOrderFeeVo.getFifthDeptProportion():"-");
  1622. feeResultVo6.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getFifthDeptPremiums()!=null?syOrderFeeVo.getFifthDeptPremiums():"-");
  1623. feeResultVo6.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getFifthDeptProportion()!=null?fcOrderFeeVo.getFifthDeptProportion():"-");
  1624. feeResultVo6.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getFifthDeptPremiums()!=null?fcOrderFeeVo.getFifthDeptPremiums():"-");
  1625. feeResultVo6.setJqFeeRateAll(feeResultVo6.getJqFeeRate());
  1626. feeResultVo6.setJqFeeAmountAll(feeResultVo6.getJqFeeAmount());
  1627. feeResultVo6.setSyFeeRateAll(feeResultVo6.getSyFeeRate());
  1628. feeResultVo6.setSyFeeAmountAll(feeResultVo6.getSyFeeAmount());
  1629. feeResultVo6.setFcFeeRateAll(feeResultVo6.getFcFeeRate());
  1630. feeResultVo6.setFcFeeAmountAll(feeResultVo6.getFcFeeAmount());
  1631. resultList.add(feeResultVo6);
  1632. //一级分销费
  1633. QueryOrderFeeResultVo feeResultVo7=new QueryOrderFeeResultVo();
  1634. feeResultVo7.setDescSerialNo("7");
  1635. feeResultVo7.setFeeTypeName("一级分销费");
  1636. feeResultVo7.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstRetailProportion()!=null?jqOrderFeeVo.getFirstRetailProportion():"-");
  1637. feeResultVo7.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstRetailPremiums()!=null?jqOrderFeeVo.getFirstRetailPremiums():"-");
  1638. feeResultVo7.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getFirstRetailProportion()!=null?syOrderFeeVo.getFirstRetailProportion():"-");
  1639. feeResultVo7.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getFirstRetailPremiums()!=null?syOrderFeeVo.getFirstRetailPremiums():"-");
  1640. feeResultVo7.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstRetailProportion()!=null?fcOrderFeeVo.getFirstRetailProportion():"-");
  1641. feeResultVo7.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstRetailPremiums()!=null?fcOrderFeeVo.getFirstRetailPremiums():"-");
  1642. feeResultVo7.setJqFeeRateAll(feeResultVo7.getJqFeeRate());
  1643. feeResultVo7.setJqFeeAmountAll(feeResultVo7.getJqFeeAmount());
  1644. feeResultVo7.setSyFeeRateAll(feeResultVo7.getSyFeeRate());
  1645. feeResultVo7.setSyFeeAmountAll(feeResultVo7.getSyFeeAmount());
  1646. feeResultVo7.setFcFeeRateAll(feeResultVo7.getFcFeeRate());
  1647. feeResultVo7.setFcFeeAmountAll(feeResultVo7.getFcFeeAmount());
  1648. resultList.add(feeResultVo7);
  1649. //二级分销费
  1650. QueryOrderFeeResultVo feeResultVo8=new QueryOrderFeeResultVo();
  1651. feeResultVo8.setDescSerialNo("8");
  1652. feeResultVo8.setFeeTypeName("二级分销费");
  1653. feeResultVo8.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondRetailProportion()!=null?jqOrderFeeVo.getSecondRetailProportion():"-");
  1654. feeResultVo8.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondRetailPremiums()!=null?jqOrderFeeVo.getSecondRetailPremiums():"-");
  1655. feeResultVo8.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getSecondRetailProportion()!=null?syOrderFeeVo.getSecondRetailProportion():"-");
  1656. feeResultVo8.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getSecondRetailPremiums()!=null?syOrderFeeVo.getSecondRetailPremiums():"-");
  1657. feeResultVo8.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondRetailProportion()!=null?fcOrderFeeVo.getSecondRetailProportion():"-");
  1658. feeResultVo8.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondRetailPremiums()!=null?fcOrderFeeVo.getSecondRetailPremiums():"-");
  1659. feeResultVo8.setJqFeeRateAll(feeResultVo8.getJqFeeRate());
  1660. feeResultVo8.setJqFeeAmountAll(feeResultVo8.getJqFeeAmount());
  1661. feeResultVo8.setSyFeeRateAll(feeResultVo8.getSyFeeRate());
  1662. feeResultVo8.setSyFeeAmountAll(feeResultVo8.getSyFeeAmount());
  1663. feeResultVo8.setFcFeeRateAll(feeResultVo8.getFcFeeRate());
  1664. feeResultVo8.setFcFeeAmountAll(feeResultVo8.getFcFeeAmount());
  1665. resultList.add(feeResultVo8);
  1666. //三级分销费
  1667. QueryOrderFeeResultVo feeResultVo9=new QueryOrderFeeResultVo();
  1668. feeResultVo9.setDescSerialNo("9");
  1669. feeResultVo9.setFeeTypeName("三级分销费");
  1670. feeResultVo9.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdRetailProportion()!=null?jqOrderFeeVo.getThirdRetailProportion():"-");
  1671. feeResultVo9.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdRetailPremiums()!=null?jqOrderFeeVo.getThirdRetailPremiums():"-");
  1672. feeResultVo9.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getThirdRetailProportion()!=null?syOrderFeeVo.getThirdRetailProportion():"-");
  1673. feeResultVo9.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getThirdRetailPremiums()!=null?syOrderFeeVo.getThirdRetailPremiums():"-");
  1674. feeResultVo9.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdRetailProportion()!=null?fcOrderFeeVo.getThirdRetailProportion():"-");
  1675. feeResultVo9.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdRetailPremiums()!=null?fcOrderFeeVo.getThirdRetailPremiums():"-");
  1676. feeResultVo9.setJqFeeRateAll(feeResultVo9.getJqFeeRate());
  1677. feeResultVo9.setJqFeeAmountAll(feeResultVo9.getJqFeeAmount());
  1678. feeResultVo9.setSyFeeRateAll(feeResultVo9.getSyFeeRate());
  1679. feeResultVo9.setSyFeeAmountAll(feeResultVo9.getSyFeeAmount());
  1680. feeResultVo9.setFcFeeRateAll(feeResultVo9.getFcFeeRate());
  1681. feeResultVo9.setFcFeeAmountAll(feeResultVo9.getFcFeeAmount());
  1682. resultList.add(feeResultVo9);
  1683. return resultList;
  1684. }
  1685. /**
  1686. * 按照组合单模式获取费用明细
  1687. * @param insFeeOrder
  1688. * @return
  1689. */
  1690. private QueryOrderFeeVo packageOrderFeeInfoAll(InsFeeOrder insFeeOrder){
  1691. QueryOrderFeeVo queryOrderFeeVo = new QueryOrderFeeVo();
  1692. InsFeeOrder jqInsFeeOrderTemp = new InsFeeOrder();
  1693. //先利用交强费重算费用
  1694. jqInsFeeOrderTemp.setFirstDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFirstDeptProportion()));
  1695. jqInsFeeOrderTemp.setSecondDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getSecondDeptProportion()));
  1696. jqInsFeeOrderTemp.setThirdDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getThirdDeptProportion()));
  1697. jqInsFeeOrderTemp.setForthDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getForthDeptProportion()));
  1698. jqInsFeeOrderTemp.setFifthDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFifthDeptProportion()));
  1699. jqInsFeeOrderTemp.setFirstRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFirstRetailProportion()));
  1700. jqInsFeeOrderTemp.setSecondRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getSecondRetailProportion()));
  1701. jqInsFeeOrderTemp.setThirdRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getThirdRetailProportion()));
  1702. //再利用总费-交强费,得出商业费
  1703. InsFeeOrder syInsFeeOrderTemp = new InsFeeOrder();
  1704. syInsFeeOrderTemp.setFirstDeptPremiums(getPremiumForSubtract(insFeeOrder.getFirstDeptPremiums(),jqInsFeeOrderTemp.getFirstDeptPremiums()));
  1705. syInsFeeOrderTemp.setSecondDeptPremiums(getPremiumForSubtract(insFeeOrder.getSecondDeptPremiums(),jqInsFeeOrderTemp.getSecondDeptPremiums()));
  1706. syInsFeeOrderTemp.setThirdDeptPremiums(getPremiumForSubtract(insFeeOrder.getThirdDeptPremiums(),jqInsFeeOrderTemp.getThirdDeptPremiums()));
  1707. syInsFeeOrderTemp.setForthDeptPremiums(getPremiumForSubtract(insFeeOrder.getForthDeptPremiums(),jqInsFeeOrderTemp.getForthDeptPremiums()));
  1708. syInsFeeOrderTemp.setFifthDeptPremiums(getPremiumForSubtract(insFeeOrder.getFifthDeptPremiums(),jqInsFeeOrderTemp.getFifthDeptPremiums()));
  1709. syInsFeeOrderTemp.setFirstRetailPremiums(getPremiumForSubtract(insFeeOrder.getFirstRetailPremiums(),jqInsFeeOrderTemp.getFirstRetailPremiums()));
  1710. syInsFeeOrderTemp.setSecondRetailPremiums(getPremiumForSubtract(insFeeOrder.getSecondRetailPremiums(),jqInsFeeOrderTemp.getSecondRetailPremiums()));
  1711. syInsFeeOrderTemp.setThirdRetailPremiums(getPremiumForSubtract(insFeeOrder.getThirdRetailPremiums(),jqInsFeeOrderTemp.getThirdRetailPremiums()));
  1712. //交强费转换赋值
  1713. OrderFeeVo jqOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1714. jqOrderFeeVo.setFirstDeptPremiums(convertToString(jqInsFeeOrderTemp.getFirstDeptPremiums()));
  1715. jqOrderFeeVo.setSecondDeptPremiums(convertToString(jqInsFeeOrderTemp.getSecondDeptPremiums()));
  1716. jqOrderFeeVo.setThirdDeptPremiums(convertToString(jqInsFeeOrderTemp.getThirdDeptPremiums()));
  1717. jqOrderFeeVo.setForthDeptPremiums(convertToString(jqInsFeeOrderTemp.getForthDeptPremiums()));
  1718. jqOrderFeeVo.setFifthDeptPremiums(convertToString(jqInsFeeOrderTemp.getFifthDeptPremiums()));
  1719. jqOrderFeeVo.setFirstRetailPremiums(convertToString(jqInsFeeOrderTemp.getFirstRetailPremiums()));
  1720. jqOrderFeeVo.setSecondRetailPremiums(convertToString(jqInsFeeOrderTemp.getSecondRetailPremiums()));
  1721. jqOrderFeeVo.setThirdRetailPremiums(convertToString(jqInsFeeOrderTemp.getThirdRetailPremiums()));
  1722. //商业费转换赋值
  1723. OrderFeeVo syOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1724. syOrderFeeVo.setFirstDeptPremiums(convertToString(syInsFeeOrderTemp.getFirstDeptPremiums()));
  1725. syOrderFeeVo.setSecondDeptPremiums(convertToString(syInsFeeOrderTemp.getSecondDeptPremiums()));
  1726. syOrderFeeVo.setThirdDeptPremiums(convertToString(syInsFeeOrderTemp.getThirdDeptPremiums()));
  1727. syOrderFeeVo.setForthDeptPremiums(convertToString(syInsFeeOrderTemp.getForthDeptPremiums()));
  1728. syOrderFeeVo.setFifthDeptPremiums(convertToString(syInsFeeOrderTemp.getFifthDeptPremiums()));
  1729. syOrderFeeVo.setFirstRetailPremiums(convertToString(syInsFeeOrderTemp.getFirstRetailPremiums()));
  1730. syOrderFeeVo.setSecondRetailPremiums(convertToString(syInsFeeOrderTemp.getSecondRetailPremiums()));
  1731. syOrderFeeVo.setThirdRetailPremiums(convertToString(syInsFeeOrderTemp.getThirdRetailPremiums()));
  1732. queryOrderFeeVo.setJqCoderFeeVo(jqOrderFeeVo);
  1733. queryOrderFeeVo.setSyCoderFeeVo(syOrderFeeVo);
  1734. return queryOrderFeeVo;
  1735. }
  1736. /**
  1737. * 按照单险种方式获取费用明细
  1738. * @param insFeeOrder
  1739. * @return
  1740. */
  1741. private OrderFeeVo packageOrderFeeInfoOne(InsFeeOrder insFeeOrder){
  1742. OrderFeeVo orderFeeVo = new OrderFeeVo();
  1743. orderFeeVo.setFirstDeptPremiums(convertToString(insFeeOrder.getFirstDeptPremiums()));
  1744. orderFeeVo.setFirstDeptProportion(convertToString(insFeeOrder.getFirstDeptProportion()));
  1745. orderFeeVo.setSecondDeptPremiums(convertToString(insFeeOrder.getSecondDeptPremiums()));
  1746. orderFeeVo.setSecondDeptProportion(convertToString(insFeeOrder.getSecondDeptProportion()));
  1747. orderFeeVo.setThirdDeptPremiums(convertToString(insFeeOrder.getThirdDeptPremiums()));
  1748. orderFeeVo.setThirdDeptProportion(convertToString(insFeeOrder.getThirdDeptProportion()));
  1749. orderFeeVo.setForthDeptPremiums(convertToString(insFeeOrder.getForthDeptPremiums()));
  1750. orderFeeVo.setForthDeptProportion(convertToString(insFeeOrder.getForthDeptProportion()));
  1751. orderFeeVo.setFifthDeptPremiums(convertToString(insFeeOrder.getFifthDeptPremiums()));
  1752. orderFeeVo.setFifthDeptProportion(convertToString(insFeeOrder.getFifthDeptProportion()));
  1753. orderFeeVo.setFirstRetailPremiums(convertToString(insFeeOrder.getFirstRetailPremiums()));
  1754. orderFeeVo.setFirstRetailProportion(convertToString(insFeeOrder.getFirstRetailProportion()));
  1755. orderFeeVo.setSecondRetailPremiums(convertToString(insFeeOrder.getSecondRetailPremiums()));
  1756. orderFeeVo.setSecondRetailProportion(convertToString(insFeeOrder.getSecondRetailProportion()));
  1757. orderFeeVo.setThirdRetailPremiums(convertToString(insFeeOrder.getThirdRetailPremiums()));
  1758. orderFeeVo.setThirdRetailProportion(convertToString(insFeeOrder.getThirdRetailProportion()));
  1759. return orderFeeVo;
  1760. }
  1761. private String convertToString(BigDecimal b){
  1762. if(b!=null){
  1763. if(b.doubleValue()==0){
  1764. return null;
  1765. }else {
  1766. return b.toString();
  1767. }
  1768. }else{
  1769. return null;
  1770. }
  1771. }
  1772. public void matchTheUndwrtRules(FeeSchemeReqDto feeSchemeReqDto) {
  1773. //根据协议号获取有效的规则
  1774. List<PtlAgreementUndwrtRules> ptlAgreementUndwrtRulesList =ptlAgreementUndwrtRulesService.selectVliadRules(feeSchemeReqDto.getAgreementId());
  1775. if (ptlAgreementUndwrtRulesList.isEmpty()) {
  1776. //没有有效的核保规则,直接抛出
  1777. return;
  1778. }else{
  1779. //循环有效的规则列表,进行因子匹配,抛出匹配到的因子项
  1780. for(int i=0;i<ptlAgreementUndwrtRulesList.size();i++){
  1781. PtlAgreementUndwrtRules undwrtRules = ptlAgreementUndwrtRulesList.get(i);
  1782. //获取处理后的待校验因子
  1783. Map<Integer, FeeFactorInfoDto> factorToBeVerified=getFactorToBeVerifiedForRules(undwrtRules);
  1784. //按规则拼接跟单信息
  1785. String matchKeyStr=getMatchKeyWithInsuranceInfoForRules(feeSchemeReqDto);
  1786. //循环进行各项因子校验
  1787. boolean checkFlag=checkFactorValidWithInsuranceInfo(matchKeyStr,factorToBeVerified,"");
  1788. //如果该方案所有因子都校验通过,则放入符合校验方案列表
  1789. if(checkFlag){
  1790. //validSchemeList.add(undwrtRules);
  1791. throw new SystemException("拒保提示:"+undwrtRules.getRuleDescription()+",请联系业管!");
  1792. }
  1793. }
  1794. }
  1795. }
  1796. /**
  1797. * 根据配置的因子表数据,组装标准的待校验因子列表
  1798. * 新增因子时,顺序需要与getMatchKeyWithInsuranceInfoForRules()方法放入跟单信息一致
  1799. * @param rulesFactor
  1800. * @return
  1801. */
  1802. private Map<Integer, FeeFactorInfoDto> getFactorToBeVerifiedForRules(PtlAgreementUndwrtRules rulesFactor) {
  1803. Map<Integer, FeeFactorInfoDto> resultMqp=new HashMap<>();
  1804. //以下各项因子必须按顺序放入MAP,以便校验时关联
  1805. //--------------------因子处理分割线----------------------------------
  1806. FeeFactorInfoDto factor0=new FeeFactorInfoDto();
  1807. factor0.setFactorName("是否过户");
  1808. factor0.setMatchType("1");
  1809. factor0.setMatchSequence(0);
  1810. if(rulesFactor.getTransfer()!=null&&rulesFactor.getTransfer()!=9){
  1811. factor0.setNeedMatch(true);
  1812. factor0.setSingleSelectVal(String.valueOf(rulesFactor.getTransfer()));
  1813. }else{
  1814. //如果方案中未录入(是空或为9时),则不校验该项因子
  1815. factor0.setNeedMatch(false);
  1816. }
  1817. resultMqp.put(0,factor0);
  1818. //--------------------因子处理分割线----------------------------------
  1819. FeeFactorInfoDto factor1=new FeeFactorInfoDto();
  1820. factor1.setFactorName("新旧车");
  1821. factor1.setMatchType("1");
  1822. factor1.setMatchSequence(1);
  1823. if(rulesFactor.getOldAndNew()!=null&&rulesFactor.getOldAndNew()!=9){
  1824. factor1.setNeedMatch(true);
  1825. factor1.setSingleSelectVal(String.valueOf(rulesFactor.getOldAndNew()));
  1826. }else{
  1827. //如果方案中未录入(是空或为9时),则不校验该项因子
  1828. factor1.setNeedMatch(false);
  1829. }
  1830. resultMqp.put(1,factor1);
  1831. //--------------------因子处理分割线----------------------------------
  1832. FeeFactorInfoDto factor2=new FeeFactorInfoDto();
  1833. factor2.setFactorName("是否新能源");
  1834. factor2.setMatchType("1");
  1835. factor2.setMatchSequence(2);
  1836. if(rulesFactor.getNewEnergy()!=null&&rulesFactor.getNewEnergy()!=9){
  1837. factor2.setNeedMatch(true);
  1838. factor2.setSingleSelectVal(String.valueOf(rulesFactor.getNewEnergy()));
  1839. }else{
  1840. //如果方案中未录入(是空或为9时),则不校验该项因子
  1841. factor2.setNeedMatch(false);
  1842. }
  1843. resultMqp.put(2,factor2);
  1844. //--------------------因子处理分割线----------------------------------
  1845. FeeFactorInfoDto factor3=new FeeFactorInfoDto();
  1846. factor3.setFactorName("是否续保");
  1847. factor3.setMatchType("1");
  1848. factor3.setMatchSequence(3);
  1849. if(rulesFactor.getRenewal()!=null&&rulesFactor.getRenewal()!=9){
  1850. factor3.setNeedMatch(true);
  1851. factor3.setSingleSelectVal(String.valueOf(rulesFactor.getRenewal()));
  1852. }else{
  1853. //如果方案中未录入(是空或为9时),则不校验该项因子
  1854. factor3.setNeedMatch(false);
  1855. }
  1856. resultMqp.put(3,factor3);
  1857. //--------------------因子处理分割线----------------------------------
  1858. FeeFactorInfoDto factor4=new FeeFactorInfoDto();
  1859. factor4.setFactorName("车辆大类");
  1860. factor4.setMatchType("2");
  1861. factor4.setMatchSequence(4);
  1862. if(rulesFactor.getVehicleCategory()!=null&&!"".equals(rulesFactor.getVehicleCategory())){
  1863. factor4.setNeedMatch(true);
  1864. factor4.setMultipleSelectVal(String.valueOf(rulesFactor.getVehicleCategory()));
  1865. }else{
  1866. //如果方案中未录入,则不校验该项因子
  1867. factor4.setNeedMatch(false);
  1868. }
  1869. resultMqp.put(4,factor4);
  1870. //--------------------因子处理分割线----------------------------------
  1871. FeeFactorInfoDto factor5=new FeeFactorInfoDto();
  1872. factor5.setFactorName("使用性质");
  1873. factor5.setMatchType("2");
  1874. factor5.setMatchSequence(5);
  1875. if(rulesFactor.getNatureOfUse()!=null&&!"".equals(rulesFactor.getNatureOfUse())){
  1876. factor5.setNeedMatch(true);
  1877. factor5.setMultipleSelectVal(String.valueOf(rulesFactor.getNatureOfUse()));
  1878. }else{
  1879. //如果方案中未录入,则不校验该项因子
  1880. factor5.setNeedMatch(false);
  1881. }
  1882. resultMqp.put(5,factor5);
  1883. //--------------------因子处理分割线----------------------------------
  1884. FeeFactorInfoDto factor6=new FeeFactorInfoDto();
  1885. factor6.setFactorName("客车座位数区间");
  1886. factor6.setMatchType("3");
  1887. factor6.setMatchSequence(6);
  1888. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinSeats(),rulesFactor.getMaxSeats())){
  1889. factor6.setNeedMatch(true);
  1890. factor6.setMinRangeVal((double)rulesFactor.getMinSeats());
  1891. factor6.setMaxRangeVal((double)rulesFactor.getMaxSeats());
  1892. }else{
  1893. //如果方案中未录入,则不校验该项因子
  1894. factor6.setNeedMatch(false);
  1895. }
  1896. resultMqp.put(6,factor6);
  1897. //--------------------因子处理分割线----------------------------------
  1898. FeeFactorInfoDto factor7=new FeeFactorInfoDto();
  1899. factor7.setFactorName("新车购置价区间");
  1900. factor7.setMatchType("3");
  1901. factor7.setMatchSequence(7);
  1902. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinPurchasePrice(),rulesFactor.getMaxPurchasePrice())){
  1903. factor7.setNeedMatch(true);
  1904. factor7.setMinRangeVal((double)rulesFactor.getMinPurchasePrice());
  1905. factor7.setMaxRangeVal((double)rulesFactor.getMaxPurchasePrice());
  1906. }else{
  1907. //如果方案中未录入,则不校验该项因子
  1908. factor7.setNeedMatch(false);
  1909. }
  1910. resultMqp.put(7,factor7);
  1911. //--------------------因子处理分割线----------------------------------
  1912. FeeFactorInfoDto factor8=new FeeFactorInfoDto();
  1913. factor8.setFactorName("核定载质量区间");
  1914. factor8.setMatchType("3");
  1915. factor8.setMatchSequence(8);
  1916. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinApprovedLoadCapacity(),rulesFactor.getMaxApprovedLoadCapacity())){
  1917. factor8.setNeedMatch(true);
  1918. factor8.setMinRangeVal((double)rulesFactor.getMinApprovedLoadCapacity());
  1919. factor8.setMaxRangeVal((double)rulesFactor.getMaxApprovedLoadCapacity());
  1920. }else{
  1921. //如果方案中未录入,则不校验该项因子
  1922. factor8.setNeedMatch(false);
  1923. }
  1924. resultMqp.put(8,factor8);
  1925. //--------------------因子处理分割线----------------------------------
  1926. FeeFactorInfoDto factor9=new FeeFactorInfoDto();
  1927. factor9.setFactorName("交强险保费区间");
  1928. factor9.setMatchType("3");
  1929. factor9.setMatchSequence(9);
  1930. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinCompulsoryInsurancePremium(),rulesFactor.getMaxCompulsoryInsurancePremium())){
  1931. factor9.setNeedMatch(true);
  1932. factor9.setMinRangeVal((double)rulesFactor.getMinCompulsoryInsurancePremium());
  1933. factor9.setMaxRangeVal((double)rulesFactor.getMaxCompulsoryInsurancePremium());
  1934. }else{
  1935. //如果方案中未录入,则不校验该项因子
  1936. factor9.setNeedMatch(false);
  1937. }
  1938. resultMqp.put(9,factor9);
  1939. //--------------------因子处理分割线----------------------------------
  1940. FeeFactorInfoDto factor10=new FeeFactorInfoDto();
  1941. factor10.setFactorName("车船税金额区间");
  1942. factor10.setMatchType("3");
  1943. factor10.setMatchSequence(10);
  1944. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinTaxAmount(),rulesFactor.getMaxTaxAmount())){
  1945. factor10.setNeedMatch(true);
  1946. factor10.setMinRangeVal((double)rulesFactor.getMinTaxAmount());
  1947. factor10.setMaxRangeVal((double)rulesFactor.getMaxTaxAmount());
  1948. }else{
  1949. //如果方案中未录入,则不校验该项因子
  1950. factor10.setNeedMatch(false);
  1951. }
  1952. resultMqp.put(10,factor10);
  1953. //--------------------因子处理分割线----------------------------------
  1954. FeeFactorInfoDto factor11=new FeeFactorInfoDto();
  1955. factor11.setFactorName("三者保额区间");
  1956. factor11.setMatchType("3");
  1957. factor11.setMatchSequence(11);
  1958. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinTheThreePremium(),rulesFactor.getMaxTheThreePremium())){
  1959. factor11.setNeedMatch(true);
  1960. factor11.setMinRangeVal((double)rulesFactor.getMinTheThreePremium()*10000);
  1961. factor11.setMaxRangeVal((double)rulesFactor.getMaxTheThreePremium()*10000);
  1962. }else{
  1963. //如果方案中未录入,则不校验该项因子
  1964. factor11.setNeedMatch(false);
  1965. }
  1966. resultMqp.put(11,factor11);
  1967. //--------------------因子处理分割线----------------------------------
  1968. FeeFactorInfoDto factor12=new FeeFactorInfoDto();
  1969. factor12.setFactorName("随车产品保费区间");
  1970. factor12.setMatchType("3");
  1971. factor12.setMatchSequence(12);
  1972. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinOnboardProductsPremium(),rulesFactor.getMaxOnboardProductsPremium())){
  1973. factor12.setNeedMatch(true);
  1974. factor12.setMinRangeVal((double)rulesFactor.getMinOnboardProductsPremium());
  1975. factor12.setMaxRangeVal((double)rulesFactor.getMaxOnboardProductsPremium());
  1976. }else{
  1977. //如果方案中未录入,则不校验该项因子
  1978. factor12.setNeedMatch(false);
  1979. }
  1980. resultMqp.put(12,factor12);
  1981. //--------------------因子处理分割线----------------------------------
  1982. FeeFactorInfoDto factor13=new FeeFactorInfoDto();
  1983. factor13.setFactorName("商业险折扣区间");
  1984. factor13.setMatchType("3");
  1985. factor13.setMatchSequence(13);
  1986. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinCommercialInsuranceDiscount(),rulesFactor.getMaxCommercialInsuranceDiscount())){
  1987. factor13.setNeedMatch(true);
  1988. factor13.setMinRangeVal((double)rulesFactor.getMinCommercialInsuranceDiscount());
  1989. factor13.setMaxRangeVal((double)rulesFactor.getMaxCommercialInsuranceDiscount());
  1990. }else{
  1991. //如果方案中未录入,则不校验该项因子
  1992. factor13.setNeedMatch(false);
  1993. }
  1994. resultMqp.put(13,factor13);
  1995. //--------------------因子处理分割线----------------------------------
  1996. FeeFactorInfoDto factor14=new FeeFactorInfoDto();
  1997. factor14.setFactorName("交强险折扣区间");
  1998. factor14.setMatchType("3");
  1999. factor14.setMatchSequence(14);
  2000. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinCompulsoryInsuranceDiscount(),rulesFactor.getMaxCompulsoryInsuranceDiscount())){
  2001. factor14.setNeedMatch(true);
  2002. factor14.setMinRangeVal(rulesFactor.getMinCompulsoryInsuranceDiscount());
  2003. factor14.setMaxRangeVal(rulesFactor.getMaxCompulsoryInsuranceDiscount());
  2004. }else{
  2005. //如果方案中未录入,则不校验该项因子
  2006. factor14.setNeedMatch(false);
  2007. }
  2008. resultMqp.put(14,factor14);
  2009. //--------------------因子处理分割线----------------------------------
  2010. FeeFactorInfoDto factor15=new FeeFactorInfoDto();
  2011. factor15.setFactorName("保司评分区间");
  2012. factor15.setMatchType("3");
  2013. factor15.setMatchSequence(15);
  2014. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinScore(),rulesFactor.getMaxScore())){
  2015. factor15.setNeedMatch(true);
  2016. factor15.setMinRangeVal((double)rulesFactor.getMinScore());
  2017. factor15.setMaxRangeVal((double)rulesFactor.getMaxScore());
  2018. }else{
  2019. //如果方案中未录入,则不校验该项因子
  2020. factor15.setNeedMatch(false);
  2021. }
  2022. resultMqp.put(15,factor15);
  2023. //--------------------因子处理分割线----------------------------------
  2024. FeeFactorInfoDto factor16=new FeeFactorInfoDto();
  2025. factor16.setFactorName("预期赔付率区间");
  2026. factor16.setMatchType("3");
  2027. factor16.setMatchSequence(16);
  2028. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinLossRation(),rulesFactor.getMaxLossRation())){
  2029. factor16.setNeedMatch(true);
  2030. factor16.setMinRangeVal((double)rulesFactor.getMinLossRation());
  2031. factor16.setMaxRangeVal((double)rulesFactor.getMaxLossRation());
  2032. }else{
  2033. //如果方案中未录入,则不校验该项因子
  2034. factor16.setNeedMatch(false);
  2035. }
  2036. resultMqp.put(16,factor16);
  2037. //--------------------因子处理分割线----------------------------------
  2038. FeeFactorInfoDto factor17=new FeeFactorInfoDto();
  2039. factor17.setFactorName("车牌号地区");
  2040. factor17.setMatchType("2");
  2041. factor17.setMatchSequence(17);
  2042. if(rulesFactor.getLicenseNumber()!=null&&!"".equals(rulesFactor.getLicenseNumber())){
  2043. factor17.setNeedMatch(true);
  2044. String matchStr=rulesFactor.getLicenseNumber();
  2045. //考虑是否含暂未上牌标志
  2046. if(rulesFactor.getContainNoLicense()!=null&&"1".equals(rulesFactor.getContainNoLicense())){
  2047. matchStr=matchStr+",暂未上牌";
  2048. }
  2049. factor17.setMultipleSelectVal(matchStr);
  2050. }else{
  2051. //如果方案中未录入,则不校验该项因子
  2052. factor17.setNeedMatch(false);
  2053. }
  2054. resultMqp.put(17,factor17);
  2055. //--------------------因子处理分割线----------------------------------
  2056. FeeFactorInfoDto factor18=new FeeFactorInfoDto();
  2057. factor18.setMatchType("4");
  2058. factor18.setMatchSequence(18);
  2059. boolean driverCheckFlag=true;//司机保额是否需要校验
  2060. boolean passengerCheckFlag=true;//乘客保额是否需要校验
  2061. //临时赋值,下面方法中使用需要区分
  2062. factor18.setFactorName("人员司机险保额");
  2063. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinDriverAmount(),rulesFactor.getMaxDriverAmount())){
  2064. factor18.setDriverMinRangeVal(rulesFactor.getMinDriverAmount()*10000);
  2065. factor18.setDriverMaxRangeVal(rulesFactor.getMaxDriverAmount()*10000);
  2066. }else{
  2067. driverCheckFlag=false;
  2068. }
  2069. //临时赋值,下面方法中使用需要区分
  2070. factor18.setFactorName("人员乘客险保额");
  2071. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinPassengerAmount(),rulesFactor.getMaxPassengerAmount())){
  2072. factor18.setPassengerMinRangeVal(rulesFactor.getMinPassengerAmount()*10000);
  2073. factor18.setPassengerMaxRangeVal(rulesFactor.getMaxPassengerAmount()*10000);
  2074. }else{
  2075. passengerCheckFlag=false;
  2076. }
  2077. //最终给因子赋值
  2078. factor18.setFactorName("司乘险保额");
  2079. factor18.setDriverIsNeedMatch(driverCheckFlag);
  2080. factor18.setPassengerIsNeedMatch(passengerCheckFlag);
  2081. //司机、乘客都不需要校验时,不校验该因子
  2082. if(!driverCheckFlag&&!passengerCheckFlag){
  2083. factor18.setNeedMatch(false);
  2084. }else{//需要校验时,需要考虑俩者关联关系
  2085. if(rulesFactor.getDriverPassengerRelation()!=null&&!"".equals(rulesFactor.getDriverPassengerRelation())){
  2086. //赋值该因子参数关联关系
  2087. factor18.setDriverPassengerRelation(rulesFactor.getDriverPassengerRelation());
  2088. factor18.setNeedMatch(true);
  2089. }else{
  2090. factor18.setNeedMatch(false);
  2091. }
  2092. }
  2093. resultMqp.put(18,factor18);
  2094. //--------------------因子处理分割线----------------------------------
  2095. FeeFactorInfoDto factor19=new FeeFactorInfoDto();
  2096. factor19.setFactorName("被保人年龄");
  2097. factor19.setMatchType("3");
  2098. factor19.setMatchSequence(19);
  2099. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinInsureAge(),rulesFactor.getMaxInsureAge())){
  2100. factor19.setNeedMatch(true);
  2101. factor19.setMinRangeVal((double)rulesFactor.getMinInsureAge());
  2102. factor19.setMaxRangeVal((double)rulesFactor.getMaxInsureAge());
  2103. }else{
  2104. //如果方案中未录入,则不校验该项因子
  2105. factor19.setNeedMatch(false);
  2106. }
  2107. resultMqp.put(19,factor19);
  2108. //--------------------因子处理分割线----------------------------------
  2109. FeeFactorInfoDto factor20=new FeeFactorInfoDto();
  2110. factor20.setFactorName("车主年龄");
  2111. factor20.setMatchType("3");
  2112. factor20.setMatchSequence(20);
  2113. if(checkFactorConfigWithAreaForRules(rulesFactor.getMinCarOwnerAge(),rulesFactor.getMaxCarOwnerAge())){
  2114. factor20.setNeedMatch(true);
  2115. factor20.setMinRangeVal((double)rulesFactor.getMinCarOwnerAge());
  2116. factor20.setMaxRangeVal((double)rulesFactor.getMaxCarOwnerAge());
  2117. }else{
  2118. //如果方案中未录入,则不校验该项因子
  2119. factor20.setNeedMatch(false);
  2120. }
  2121. resultMqp.put(20,factor20);
  2122. //--------------------因子处理分割线----------------------------------
  2123. FeeFactorInfoDto factor21=new FeeFactorInfoDto();
  2124. boolean thirdMCheckFlag=true;//三者医保外用保额是否需要校验
  2125. boolean driverMCheckFlag=true;//司机医保外用保额是否需要校验
  2126. boolean passengerMCheckFlag=true;//乘客医保外用保额是否需要校验
  2127. boolean anyMCheckFlag=true;//任意医保外用保额是否需要校验
  2128. factor21.setMatchType("5");
  2129. factor21.setMatchSequence(21);
  2130. //三者
  2131. if(rulesFactor.getThirdMedicalAmount()!=null&&rulesFactor.getThirdMedicalAmount()!=0){
  2132. factor21.setThirdMedicalAmountVal(rulesFactor.getThirdMedicalAmount()*10000);
  2133. }else{
  2134. factor21.setThirdMedicalAmountVal(null);
  2135. thirdMCheckFlag=false;
  2136. }
  2137. //司机
  2138. if(rulesFactor.getDriverMedicalAmount()!=null&&rulesFactor.getDriverMedicalAmount()!=0){
  2139. factor21.setDriverMedicalAmountVal(rulesFactor.getDriverMedicalAmount()*10000);
  2140. }else{
  2141. factor21.setDriverMedicalAmountVal(null);
  2142. driverMCheckFlag=false;
  2143. }
  2144. //乘客
  2145. if(rulesFactor.getPassengerMedicalAmount()!=null&&rulesFactor.getPassengerMedicalAmount()!=0){
  2146. factor21.setPassengerMedicalAmountVal(rulesFactor.getPassengerMedicalAmount()*10000);
  2147. }else{
  2148. factor21.setPassengerMedicalAmountVal(null);
  2149. passengerMCheckFlag=false;
  2150. }
  2151. //任意
  2152. if(rulesFactor.getAnyMedicalAmount()!=null&&rulesFactor.getAnyMedicalAmount()!=0){
  2153. factor21.setAnyMedicalAmountVal(rulesFactor.getAnyMedicalAmount()*10000);
  2154. }else{
  2155. factor21.setAnyMedicalAmountVal(null);
  2156. anyMCheckFlag=false;
  2157. }
  2158. //最终给因子赋值
  2159. factor21.setFactorName("医保外用保额");
  2160. if(!thirdMCheckFlag&&!driverMCheckFlag&&!passengerMCheckFlag&&!anyMCheckFlag){//如果四项都没有配置时,不需要校验
  2161. factor21.setNeedMatch(false);
  2162. }else{
  2163. factor21.setNeedMatch(true);
  2164. }
  2165. resultMqp.put(21,factor21);
  2166. //--------------------因子处理分割线----------------------------------
  2167. FeeFactorInfoDto factor22=new FeeFactorInfoDto();
  2168. factor22.setFactorName("业务类型");
  2169. factor22.setMatchType("2");
  2170. factor22.setMatchSequence(22);
  2171. if(rulesFactor.getProductType()!=null&&!"".equals(rulesFactor.getProductType())){
  2172. factor22.setNeedMatch(true);
  2173. factor22.setMultipleSelectVal(String.valueOf(rulesFactor.getProductType()+","));
  2174. }else{
  2175. //如果方案中未录入,则不校验该项因子
  2176. factor22.setNeedMatch(false);
  2177. }
  2178. resultMqp.put(22,factor22);
  2179. //--------------------因子处理分割线----------------------------------
  2180. return resultMqp;
  2181. }
  2182. /**
  2183. * 判断区间类因子是否需要匹配
  2184. * @param minVal
  2185. * @param maxVal
  2186. * @return
  2187. */
  2188. private boolean checkFactorConfigWithAreaForRules(Double minVal, Double maxVal) {
  2189. boolean result=false; //默认不需要匹配
  2190. if(minVal!=null&&maxVal!=null){
  2191. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  2192. result=false;
  2193. }else{
  2194. if(minVal<=maxVal){
  2195. result=true;
  2196. }
  2197. }
  2198. }
  2199. return result;
  2200. }
  2201. /**
  2202. * 判断区间类因子是否需要匹配
  2203. * @param minVal
  2204. * @param maxVal
  2205. * @return
  2206. */
  2207. private boolean checkFactorConfigWithAreaForRules(Integer minVal, Integer maxVal) {
  2208. boolean result=false; //默认不需要匹配
  2209. if(minVal!=null&&maxVal!=null){
  2210. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  2211. result=false;
  2212. }else{
  2213. if(minVal<=maxVal){
  2214. result=true;
  2215. }
  2216. }
  2217. }
  2218. return result;
  2219. }
  2220. /**
  2221. * 根据跟单信息,按照约定顺序进行拼接匹配串
  2222. * 新增因子时,顺序需要与getFactorToBeVerifiedForRules()方法放入待校验因子一致
  2223. * @param feeSchemeReqDto
  2224. * @return
  2225. */
  2226. private String getMatchKeyWithInsuranceInfoForRules(FeeSchemeReqDto feeSchemeReqDto) {
  2227. StringBuffer result=new StringBuffer();
  2228. result.append(feeSchemeReqDto.getIsTransfer()).append(",");
  2229. result.append(feeSchemeReqDto.getIsNewCar()).append(",");
  2230. result.append(feeSchemeReqDto.getIsNewEnergy()).append(",");
  2231. result.append(feeSchemeReqDto.getIsRenewal()).append(",");
  2232. result.append(feeSchemeReqDto.getVehicleCategory()).append(",");
  2233. result.append(feeSchemeReqDto.getUseNature()).append(",");
  2234. result.append(feeSchemeReqDto.getSeatNum()).append(",");
  2235. result.append(feeSchemeReqDto.getPurchasePrice()).append(",");
  2236. result.append(feeSchemeReqDto.getApprovedLoadCapacity()).append(",");
  2237. result.append(feeSchemeReqDto.getJqPremium()).append(",");
  2238. result.append(feeSchemeReqDto.getSumPayTax()).append(",");
  2239. result.append(feeSchemeReqDto.getThirdPartyInsurance()).append(",");
  2240. result.append(feeSchemeReqDto.getNoCarPremium()).append(",");
  2241. result.append(feeSchemeReqDto.getSyDiscount()).append(",");
  2242. result.append(feeSchemeReqDto.getJqDiscount()).append(",");
  2243. result.append(feeSchemeReqDto.getInsuranceScore()).append(",");
  2244. result.append(feeSchemeReqDto.getExpectedLossRate()).append(",");
  2245. result.append(feeSchemeReqDto.getLicenseNo()).append(",");
  2246. //司乘险保额因子,特殊处理(司机保额-乘客保额)
  2247. result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverAmount())?feeSchemeReqDto.getDriverAmount():"NULL").append("-").append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerAmount())?feeSchemeReqDto.getPassengerAmount():"NULL").append(",");
  2248. result.append(feeSchemeReqDto.getInsureAge()).append(",");
  2249. result.append(feeSchemeReqDto.getCarOwnerAge()).append(",");
  2250. //医保外用险保额因子,特殊处理(三者保额-司机保额-乘客保额)
  2251. result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getThirdMedicalAmount())?feeSchemeReqDto.getThirdMedicalAmount():"NULL").append("-")
  2252. .append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverMedicalAmount())?feeSchemeReqDto.getDriverMedicalAmount():"NULL").append("-")
  2253. .append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerMedicalAmount())?feeSchemeReqDto.getPassengerMedicalAmount():"NULL").append(",");
  2254. result.append(feeSchemeReqDto.getBusType());
  2255. return result.toString();
  2256. }
  2257. }