FeeRuleSchemeServiceImpl.java 140 KB

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