FeeRuleSchemeServiceImpl.java 78 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289
  1. package com.ydtech.modules.fee.service.impl;
  2. import com.ydtech.exception.SystemException;
  3. import com.ydtech.modules.admin.model.SysDept;
  4. import com.ydtech.modules.admin.model.SysUser;
  5. import com.ydtech.modules.admin.service.SysDeptService;
  6. import com.ydtech.modules.admin.service.SysUserService;
  7. import com.ydtech.modules.esm.model.EsmRetail;
  8. import com.ydtech.modules.esm.model.EsmUserReferrer;
  9. import com.ydtech.modules.esm.service.EsmRetailService;
  10. import com.ydtech.modules.esm.service.EsmUserReferrerService;
  11. import com.ydtech.modules.fee.dto.FeeFactorInfoDto;
  12. import com.ydtech.modules.fee.dto.FeeSchemeReqDto;
  13. import com.ydtech.modules.fee.dto.FeeSchemeResDto;
  14. import com.ydtech.modules.fee.service.FeeRuleSchemeService;
  15. import com.ydtech.modules.ins.model.vo.CarInfoVo;
  16. import com.ydtech.modules.ins.model.vo.KindInfoVo;
  17. import com.ydtech.modules.ins.model.vo.QuoteRespVo;
  18. import com.ydtech.modules.order.entity.InsAreaCompany;
  19. import com.ydtech.modules.order.entity.InsFeeOrder;
  20. import com.ydtech.modules.order.entity.InsOrders;
  21. import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
  22. import com.ydtech.modules.order.entity.vo.OrderFeeVo;
  23. import com.ydtech.modules.order.entity.vo.QueryOrderFeeResultVo;
  24. import com.ydtech.modules.order.entity.vo.QueryOrderFeeVo;
  25. import com.ydtech.modules.order.service.InsAreaCompanyService;
  26. import com.ydtech.modules.order.service.InsFeeOrderService;
  27. import com.ydtech.modules.order.service.InsOrdersService;
  28. import com.ydtech.modules.protocol.entity.po.PtlAgreement;
  29. import com.ydtech.modules.protocol.entity.po.PtlAgreementProductCosts;
  30. import com.ydtech.modules.protocol.service.PtlAgreementProductCostsService;
  31. import com.ydtech.modules.protocol.service.PtlAgreementService;
  32. import org.apache.commons.lang3.StringUtils;
  33. import org.apache.commons.lang3.math.NumberUtils;
  34. import org.springframework.stereotype.Service;
  35. import javax.annotation.Resource;
  36. import java.math.BigDecimal;
  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 SysUserService sysUserService;
  54. @Resource
  55. private SysDeptService sysDeptService;
  56. @Resource
  57. private EsmRetailService esmRetailService;
  58. @Resource
  59. private EsmUserReferrerService esmUserReferrerService;
  60. @Resource
  61. private InsAreaCompanyService insAreaCompanyService;
  62. @Resource
  63. private PtlAgreementService ptlAgreementService;
  64. /**
  65. * 根据跟单信息,以及配置的费用因子,获取合适的跟单费用
  66. * @param feeSchemeReqDto
  67. * @return
  68. */
  69. public FeeSchemeResDto matchTheAppropriateFees(FeeSchemeReqDto feeSchemeReqDto) {
  70. FeeSchemeResDto feeSchemeResDto=new FeeSchemeResDto();
  71. //先根据业务类别、有效期、协议编码、历史标志代码字段 获取对应费用方案列表
  72. List<PtlAgreementProductCosts> ptlAgreementProductCosts =ptlAgreementProductCostsService.selectVliadFeeFactor(feeSchemeReqDto.getBusType(),feeSchemeReqDto.getAgreementId());
  73. if (ptlAgreementProductCosts.isEmpty()) {
  74. //如果查询不到费用方案信息,则阻断算费流程,进行提示
  75. throw new SystemException("未查询到费用配置,请先配置该协议的费用方案!");
  76. }else{
  77. //符合跟单信息的方案列表
  78. List<PtlAgreementProductCosts> validSchemeList=new ArrayList();
  79. //循环符合的方案列表,再进行细化的因子匹配,获取最终可以匹配到的方案
  80. for(int i=0;i<ptlAgreementProductCosts.size();i++){
  81. PtlAgreementProductCosts factorCost=ptlAgreementProductCosts.get(i);
  82. //获取处理后的待校验因子
  83. Map<Integer, FeeFactorInfoDto> factorToBeVerified=getFactorToBeVerified(factorCost);
  84. //按规则拼接跟单信息
  85. String matchKeyStr=getMatchKeyWithInsuranceInfo(feeSchemeReqDto);
  86. //循环进行各项因子校验
  87. boolean checkFlag=checkFactorValidWithInsuranceInfo(matchKeyStr,factorToBeVerified);
  88. //如果该方案所有因子都校验通过,则放入符合校验方案列表
  89. if(checkFlag){
  90. validSchemeList.add(factorCost);
  91. }
  92. }
  93. if(validSchemeList.size()>0){
  94. //先判断匹配到的是不是只有兜底类型,如果不是则过滤掉兜底类型的费用,优先以跟单的为准,如果只有兜底类型,则按同样逻辑进行筛选
  95. //根据ProductId去重后的结果集
  96. List tempList=validSchemeList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(PtlAgreementProductCosts :: getProductId))), ArrayList::new));
  97. if(tempList.size()>1){//如果有多种类型,则过滤掉兜底类型的
  98. validSchemeList=validSchemeList.stream().filter(x -> !"039999".equals(x.getProductId())).collect(Collectors.toList());
  99. }
  100. //匹配到唯一一条费用方案,直接用这条
  101. if(validSchemeList.size()==1){
  102. //进行费用比例赋值,给返回对象
  103. feeSchemeResDto=generateSchemeResDto((PtlAgreementProductCosts)validSchemeList.get(0));
  104. }else{
  105. //如果最终符合的有多条,则按特殊规则选择其中一条
  106. PtlAgreementProductCosts finalSchemeCost=changeSchemeWithSpecialRule(validSchemeList,feeSchemeReqDto);
  107. //进行费用比例赋值,给返回对象
  108. feeSchemeResDto=generateSchemeResDto(finalSchemeCost);
  109. }
  110. }else{
  111. throw new SystemException("未匹配到合适的费用方案,请先配置该协议的费用方案!");
  112. }
  113. }
  114. return feeSchemeResDto;
  115. }
  116. /**
  117. * 特殊处理选择费用方案
  118. * 如果最终符合的有多条,则先看交强、商业谁的保费多,然后根据保费多得在匹配到的方案中找费用比例大的那一条
  119. * @param validSchemeList
  120. * @param feeSchemeReqDto
  121. * @return
  122. */
  123. private PtlAgreementProductCosts changeSchemeWithSpecialRule(List<PtlAgreementProductCosts> validSchemeList, FeeSchemeReqDto feeSchemeReqDto) {
  124. PtlAgreementProductCosts finalScheme=null;
  125. //险种标志,最终取哪个险种费用比例 1取交强 2取商业
  126. String riskFlag="";
  127. //判断险种标志
  128. if("0330".equals(feeSchemeReqDto.getBusType())){//单交
  129. riskFlag="1";
  130. }else if("034001".equals(feeSchemeReqDto.getBusType())){//单商
  131. riskFlag="2";
  132. }else if("034002".equals(feeSchemeReqDto.getBusType())){//单三
  133. riskFlag="2";
  134. }else if("0330034002".equals(feeSchemeReqDto.getBusType())){//交三
  135. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  136. riskFlag="2";
  137. }else{
  138. riskFlag="1";
  139. }
  140. }else if("0330034001".equals(feeSchemeReqDto.getBusType())){//交商
  141. if(Double.parseDouble(feeSchemeReqDto.getJqPremium())<=Double.parseDouble(feeSchemeReqDto.getSyPremium())){
  142. riskFlag="2";
  143. }else{
  144. riskFlag="1";
  145. }
  146. }
  147. //循环找出对应比例最大的
  148. for(int i=0;i<validSchemeList.size();i++){
  149. PtlAgreementProductCosts tempCostDto=validSchemeList.get(i);
  150. if(finalScheme!=null){
  151. if("1".equals(riskFlag)){//按交强比例排序,找比例最大的
  152. if(Double.parseDouble(finalScheme.getJqCostsProportion())<Double.parseDouble(tempCostDto.getJqCostsProportion())){
  153. finalScheme=tempCostDto;
  154. }
  155. }else if("2".equals(riskFlag)){//按商业比例排序,找比例最大的
  156. if(Double.parseDouble(finalScheme.getSyCostsProportion())<Double.parseDouble(tempCostDto.getSyCostsProportion())){
  157. finalScheme=tempCostDto;
  158. }
  159. }
  160. }else{
  161. finalScheme=tempCostDto;
  162. }
  163. }
  164. return finalScheme;
  165. }
  166. /**
  167. * 组装费用接口反参对象
  168. * @param agreementProductCost
  169. * @return
  170. */
  171. private FeeSchemeResDto generateSchemeResDto(PtlAgreementProductCosts agreementProductCost) {
  172. FeeSchemeResDto resDto=new FeeSchemeResDto();
  173. resDto.setAgreementId(agreementProductCost.getAgreementId());
  174. resDto.setSchemeId(agreementProductCost.getId());
  175. resDto.setJqSpilloverPremiums(agreementProductCost.getJqSpilloverPremiums());
  176. resDto.setJqSpilloverProportion(agreementProductCost.getJqSpilloverProportion());
  177. resDto.setJqNewCarCostsProportion(agreementProductCost.getJqNewCarCostsProportion());
  178. resDto.setJqOldCarCostsProportion(agreementProductCost.getJqOldCarCostsProportion());
  179. resDto.setJqCostsProportion(agreementProductCost.getJqCostsProportion());
  180. resDto.setJqNewCarOtherCostsProportion(agreementProductCost.getJqNewCarOtherCostsProportion());
  181. resDto.setJqOldCarOtherCostsProportion(agreementProductCost.getJqOldCarOtherCostsProportion());
  182. resDto.setSySpilloverPremiums(agreementProductCost.getSySpilloverPremiums());
  183. resDto.setSySpilloverProportion(agreementProductCost.getSySpilloverProportion());
  184. resDto.setSyNewCarCostsProportion(agreementProductCost.getSyNewCarCostsProportion());
  185. resDto.setSyOldCarCostsProportion(agreementProductCost.getSyOldCarCostsProportion());
  186. resDto.setSyCostsProportion(agreementProductCost.getSyCostsProportion());
  187. resDto.setSyNewCarOtherCostsProportion(agreementProductCost.getSyNewCarOtherCostsProportion());
  188. resDto.setSyOldCarOtherCostsProportion(agreementProductCost.getSyOldCarOtherCostsProportion());
  189. return resDto;
  190. }
  191. /**
  192. * 根据跟单信息,循环各项因子 校验该方案的匹配情况
  193. * @param matchKeyStr
  194. * @param factorToBeVerified
  195. * @return
  196. */
  197. private boolean checkFactorValidWithInsuranceInfo(String matchKeyStr, Map<Integer, FeeFactorInfoDto> factorToBeVerified) {
  198. boolean result=false; //默认没有匹配到
  199. String[] matchKeys= matchKeyStr.split(",");
  200. //循环待校验因子列表
  201. for(Map.Entry<Integer,FeeFactorInfoDto> entry : factorToBeVerified.entrySet()){
  202. Integer key=entry.getKey();
  203. FeeFactorInfoDto checkFactorInfo=entry.getValue();
  204. //特殊处理,如果跟单是客车时,不关注配置的核定载质量字段
  205. if("客车".equals(matchKeys[4])){
  206. if(checkFactorInfo.getMatchSequence()==8){
  207. continue;
  208. }
  209. }
  210. //先看该方案是否需要匹配该因子,不需要则跳过本条因子
  211. if(!checkFactorInfo.isNeedMatch()){
  212. continue;
  213. }
  214. //下面处理需要进行匹配的因子
  215. if("1".equals(checkFactorInfo.getMatchType())){//1.单字符串匹配(相等)
  216. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  217. if(checkFactorInfo.getSingleSelectVal().equals(matchKeys[key])){
  218. result=true;
  219. continue;
  220. }else{
  221. //如果需要匹配且没有匹配到,则直接跳出本次循环,该方案不符合
  222. result=false;
  223. break;
  224. }
  225. }else{
  226. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  227. result=false;
  228. break;
  229. }
  230. }else if("2".equals(checkFactorInfo.getMatchType())){//2.多字符串匹配(包含)
  231. if(matchKeys[key]!=null&&!"".equals(matchKeys[key])){
  232. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  233. if(checkFactorInfo.getMultipleSelectVal().indexOf(matchKeys[key])>-1){
  234. result=true;
  235. continue;
  236. }else{
  237. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  238. result=false;
  239. break;
  240. }
  241. }else{
  242. //判断跟单信息是否为空,如果为空,则直接没有匹配到,该方案不符合
  243. result=false;
  244. break;
  245. }
  246. }else if("3".equals(checkFactorInfo.getMatchType())){//3.区间范围比较(左闭右闭)
  247. if(matchKeys[key]!=null&&NumberUtils.isCreatable(matchKeys[key])){
  248. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  249. if(Double.parseDouble(matchKeys[key])>=checkFactorInfo.getMinRangeVal()&&Double.parseDouble(matchKeys[key])<=checkFactorInfo.getMaxRangeVal()){
  250. result=true;
  251. continue;
  252. }else{
  253. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  254. result=false;
  255. break;
  256. }
  257. }else{
  258. //判断跟单信息是否为空和可转整型,如果不符,则直接没有匹配到,该方案不符合
  259. result=false;
  260. break;
  261. }
  262. }else if("4".equals(checkFactorInfo.getMatchType())){//4.特殊规则,司乘险校验,存在关联关系需要单独判断
  263. if(matchKeys[key]!=null){
  264. //先获取跟单司机、乘客保额
  265. String[] kindAmountStr= matchKeys[key].split("-");
  266. String driverAmount="NULL".equals(kindAmountStr[0])?"0":kindAmountStr[0];
  267. String passengerAmount="NULL".equals(kindAmountStr[1])?"0":kindAmountStr[1];
  268. if("0".equals(checkFactorInfo.getDriverPassengerRelation())){//无关系,则各自校验各自,有一个不符合,则方案不符合
  269. if(NumberUtils.isCreatable(driverAmount)){//如果司机保额是数字,则可以进行校验
  270. if(checkFactorInfo.isDriverIsNeedMatch()){
  271. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  272. if(Double.parseDouble(driverAmount)>=checkFactorInfo.getDriverMinRangeVal()&&Double.parseDouble(driverAmount)<=checkFactorInfo.getDriverMaxRangeVal()){
  273. result=true;
  274. continue;
  275. }else{
  276. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  277. result=false;
  278. break;
  279. }
  280. }
  281. }
  282. if(NumberUtils.isCreatable(passengerAmount)){//如果司机保额是数字,则可以进行校验
  283. if(checkFactorInfo.isPassengerIsNeedMatch()){
  284. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  285. if(Double.parseDouble(passengerAmount)>=checkFactorInfo.getPassengerMinRangeVal()&&Double.parseDouble(passengerAmount)<=checkFactorInfo.getPassengerMaxRangeVal()){
  286. result=true;
  287. continue;
  288. }else{
  289. //如果需要匹配且没有匹配到,则直接跳出循环,该方案不符合
  290. result=false;
  291. break;
  292. }
  293. }
  294. }
  295. }else if("1".equals(checkFactorInfo.getDriverPassengerRelation())){//或的关系 2个里面有一个通过则通过
  296. boolean isDriverPass=false;
  297. boolean isPassengerPass=false;
  298. if(NumberUtils.isCreatable(driverAmount)){//如果司机保额是数字,则可以进行校验
  299. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  300. if(Double.parseDouble(driverAmount)>=checkFactorInfo.getDriverMinRangeVal()&&Double.parseDouble(driverAmount)<=checkFactorInfo.getDriverMaxRangeVal()){
  301. isDriverPass=true;
  302. }
  303. }
  304. if(NumberUtils.isCreatable(passengerAmount)){//如果司机保额是数字,则可以进行校验
  305. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  306. if(Double.parseDouble(passengerAmount)>=checkFactorInfo.getPassengerMinRangeVal()&&Double.parseDouble(passengerAmount)<=checkFactorInfo.getPassengerMaxRangeVal()){
  307. isPassengerPass=true;
  308. }
  309. }
  310. if(!isDriverPass&&!isPassengerPass){//两项都不通过的时候,才不符合
  311. result=false;
  312. break;
  313. }else{
  314. result=true;
  315. continue;
  316. }
  317. }else if("2".equals(checkFactorInfo.getDriverPassengerRelation())){//且的关系 2个全部通过才算通过
  318. boolean isDriverPass=false;
  319. boolean isPassengerPass=false;
  320. if(NumberUtils.isCreatable(driverAmount)){//如果司机保额是数字,则可以进行校验
  321. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  322. if(Double.parseDouble(driverAmount)>=checkFactorInfo.getDriverMinRangeVal()&&Double.parseDouble(driverAmount)<=checkFactorInfo.getDriverMaxRangeVal()){
  323. isDriverPass=true;
  324. }
  325. }
  326. if(NumberUtils.isCreatable(passengerAmount)){//如果司机保额是数字,则可以进行校验
  327. //如果需要匹配,且匹配成功,则跳过本次循环,继续校验下一因子
  328. if(Double.parseDouble(passengerAmount)>=checkFactorInfo.getPassengerMinRangeVal()&&Double.parseDouble(passengerAmount)<=checkFactorInfo.getPassengerMaxRangeVal()){
  329. isPassengerPass=true;
  330. }
  331. }
  332. if(isDriverPass&&isPassengerPass){//两项都通过的时候,才符合
  333. result=true;
  334. continue;
  335. }else{
  336. result=false;
  337. break;
  338. }
  339. }
  340. }
  341. }
  342. }
  343. return result;
  344. }
  345. /**
  346. * 根据跟单信息,按照约定顺序进行拼接匹配串
  347. * 新增因子时,顺序需要与getFactorToBeVerified()方法放入待校验因子一致
  348. * @param feeSchemeReqDto
  349. * @return
  350. */
  351. private String getMatchKeyWithInsuranceInfo(FeeSchemeReqDto feeSchemeReqDto) {
  352. StringBuffer result=new StringBuffer();
  353. result.append(feeSchemeReqDto.getIsTransfer()).append(",");
  354. result.append(feeSchemeReqDto.getIsNewCar()).append(",");
  355. result.append(feeSchemeReqDto.getIsNewEnergy()).append(",");
  356. result.append(feeSchemeReqDto.getIsRenewal()).append(",");
  357. result.append(feeSchemeReqDto.getVehicleCategory()).append(",");
  358. result.append(feeSchemeReqDto.getUseNature()).append(",");
  359. result.append(feeSchemeReqDto.getSeatNum()).append(",");
  360. result.append(feeSchemeReqDto.getPurchasePrice()).append(",");
  361. result.append(feeSchemeReqDto.getApprovedLoadCapacity()).append(",");
  362. result.append(feeSchemeReqDto.getJqPremium()).append(",");
  363. result.append(feeSchemeReqDto.getSumPayTax()).append(",");
  364. result.append(feeSchemeReqDto.getThirdPartyInsurance()).append(",");
  365. result.append(feeSchemeReqDto.getNoCarPremium()).append(",");
  366. result.append(feeSchemeReqDto.getSyDiscount()).append(",");
  367. result.append(feeSchemeReqDto.getJqDiscount()).append(",");
  368. result.append(feeSchemeReqDto.getInsuranceScore()).append(",");
  369. result.append(feeSchemeReqDto.getExpectedLossRate()).append(",");
  370. result.append(feeSchemeReqDto.getLicenseNo()).append(",");
  371. result.append(StringUtils.isNotEmpty(feeSchemeReqDto.getDriverAmount())?feeSchemeReqDto.getDriverAmount():"NULL").append("-").append(StringUtils.isNotEmpty(feeSchemeReqDto.getPassengerAmount())?feeSchemeReqDto.getPassengerAmount():"NULL");//司乘险保额因子,特殊处理
  372. return result.toString();
  373. }
  374. /**
  375. * 根据配置的因子表数据,组装标准的待校验因子列表
  376. * 新增因子时,顺序需要与getMatchKeyWithInsuranceInfo()方法放入跟单信息一致
  377. * @param factorCost
  378. * @return
  379. */
  380. private Map<Integer, FeeFactorInfoDto> getFactorToBeVerified(PtlAgreementProductCosts factorCost) {
  381. Map<Integer, FeeFactorInfoDto> resultMqp=new HashMap<>();
  382. //以下各项因子必须按顺序放入MAP,以便校验时关联
  383. //--------------------因子处理分割线----------------------------------
  384. FeeFactorInfoDto factor0=new FeeFactorInfoDto();
  385. factor0.setFactorName("是否过户");
  386. factor0.setMatchType("1");
  387. factor0.setMatchSequence(0);
  388. if(factorCost.getTransfer()!=null&&factorCost.getTransfer()!=9){
  389. factor0.setNeedMatch(true);
  390. factor0.setSingleSelectVal(String.valueOf(factorCost.getTransfer()));
  391. }else{
  392. //如果方案中未录入(是空或为9时),则不校验该项因子
  393. factor0.setNeedMatch(false);
  394. }
  395. resultMqp.put(0,factor0);
  396. //--------------------因子处理分割线----------------------------------
  397. FeeFactorInfoDto factor1=new FeeFactorInfoDto();
  398. factor1.setFactorName("新旧车");
  399. factor1.setMatchType("1");
  400. factor1.setMatchSequence(1);
  401. if(factorCost.getOldAndNew()!=null&&factorCost.getOldAndNew()!=9){
  402. factor1.setNeedMatch(true);
  403. factor1.setSingleSelectVal(String.valueOf(factorCost.getOldAndNew()));
  404. }else{
  405. //如果方案中未录入(是空或为9时),则不校验该项因子
  406. factor1.setNeedMatch(false);
  407. }
  408. resultMqp.put(1,factor1);
  409. //--------------------因子处理分割线----------------------------------
  410. FeeFactorInfoDto factor2=new FeeFactorInfoDto();
  411. factor2.setFactorName("是否新能源");
  412. factor2.setMatchType("1");
  413. factor2.setMatchSequence(2);
  414. if(factorCost.getNewEnergy()!=null&&factorCost.getNewEnergy()!=9){
  415. factor2.setNeedMatch(true);
  416. factor2.setSingleSelectVal(String.valueOf(factorCost.getNewEnergy()));
  417. }else{
  418. //如果方案中未录入(是空或为9时),则不校验该项因子
  419. factor2.setNeedMatch(false);
  420. }
  421. resultMqp.put(2,factor2);
  422. //--------------------因子处理分割线----------------------------------
  423. FeeFactorInfoDto factor3=new FeeFactorInfoDto();
  424. factor3.setFactorName("是否续保");
  425. factor3.setMatchType("1");
  426. factor3.setMatchSequence(3);
  427. if(factorCost.getRenewal()!=null&&factorCost.getRenewal()!=9){
  428. factor3.setNeedMatch(true);
  429. factor3.setSingleSelectVal(String.valueOf(factorCost.getRenewal()));
  430. }else{
  431. //如果方案中未录入(是空或为9时),则不校验该项因子
  432. factor3.setNeedMatch(false);
  433. }
  434. resultMqp.put(3,factor3);
  435. //--------------------因子处理分割线----------------------------------
  436. FeeFactorInfoDto factor4=new FeeFactorInfoDto();
  437. factor4.setFactorName("车辆大类");
  438. factor4.setMatchType("2");
  439. factor4.setMatchSequence(4);
  440. if(factorCost.getVehicleCategory()!=null&&!"".equals(factorCost.getVehicleCategory())){
  441. factor4.setNeedMatch(true);
  442. factor4.setMultipleSelectVal(String.valueOf(factorCost.getVehicleCategory()));
  443. }else{
  444. //如果方案中未录入,则不校验该项因子
  445. factor4.setNeedMatch(false);
  446. }
  447. resultMqp.put(4,factor4);
  448. //--------------------因子处理分割线----------------------------------
  449. FeeFactorInfoDto factor5=new FeeFactorInfoDto();
  450. factor5.setFactorName("使用性质");
  451. factor5.setMatchType("2");
  452. factor5.setMatchSequence(5);
  453. if(factorCost.getNatureOfUse()!=null&&!"".equals(factorCost.getNatureOfUse())){
  454. factor5.setNeedMatch(true);
  455. factor5.setMultipleSelectVal(String.valueOf(factorCost.getNatureOfUse()));
  456. }else{
  457. //如果方案中未录入,则不校验该项因子
  458. factor5.setNeedMatch(false);
  459. }
  460. resultMqp.put(5,factor5);
  461. //--------------------因子处理分割线----------------------------------
  462. FeeFactorInfoDto factor6=new FeeFactorInfoDto();
  463. factor6.setFactorName("客车座位数区间");
  464. factor6.setMatchType("3");
  465. factor6.setMatchSequence(6);
  466. if(checkFactorConfigWithArea(factorCost.getMinSeats(),factorCost.getMaxSeats(),factor6,factorCost)){
  467. factor6.setNeedMatch(true);
  468. factor6.setMinRangeVal((double)factorCost.getMinSeats());
  469. factor6.setMaxRangeVal((double)factorCost.getMaxSeats());
  470. }else{
  471. //如果方案中未录入,则不校验该项因子
  472. factor6.setNeedMatch(false);
  473. }
  474. resultMqp.put(6,factor6);
  475. //--------------------因子处理分割线----------------------------------
  476. FeeFactorInfoDto factor7=new FeeFactorInfoDto();
  477. factor7.setFactorName("新车购置价区间");
  478. factor7.setMatchType("3");
  479. factor7.setMatchSequence(7);
  480. if(checkFactorConfigWithArea(factorCost.getMinPurchasePrice(),factorCost.getMaxPurchasePrice(),factor7,factorCost)){
  481. factor7.setNeedMatch(true);
  482. factor7.setMinRangeVal((double)factorCost.getMinPurchasePrice());
  483. factor7.setMaxRangeVal((double)factorCost.getMaxPurchasePrice());
  484. }else{
  485. //如果方案中未录入,则不校验该项因子
  486. factor7.setNeedMatch(false);
  487. }
  488. resultMqp.put(7,factor7);
  489. //--------------------因子处理分割线----------------------------------
  490. FeeFactorInfoDto factor8=new FeeFactorInfoDto();
  491. factor8.setFactorName("核定载质量区间");
  492. factor8.setMatchType("3");
  493. factor8.setMatchSequence(8);
  494. if(checkFactorConfigWithArea(factorCost.getMinApprovedLoadCapacity(),factorCost.getMaxApprovedLoadCapacity(),factor8,factorCost)){
  495. factor8.setNeedMatch(true);
  496. factor8.setMinRangeVal((double)factorCost.getMinApprovedLoadCapacity());
  497. factor8.setMaxRangeVal((double)factorCost.getMaxApprovedLoadCapacity());
  498. }else{
  499. //如果方案中未录入,则不校验该项因子
  500. factor8.setNeedMatch(false);
  501. }
  502. resultMqp.put(8,factor8);
  503. //--------------------因子处理分割线----------------------------------
  504. FeeFactorInfoDto factor9=new FeeFactorInfoDto();
  505. factor9.setFactorName("交强险保费区间");
  506. factor9.setMatchType("3");
  507. factor9.setMatchSequence(9);
  508. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsurancePremium(),factorCost.getMaxCompulsoryInsurancePremium(),factor9,factorCost)){
  509. factor9.setNeedMatch(true);
  510. factor9.setMinRangeVal((double)factorCost.getMinCompulsoryInsurancePremium());
  511. factor9.setMaxRangeVal((double)factorCost.getMaxCompulsoryInsurancePremium());
  512. }else{
  513. //如果方案中未录入,则不校验该项因子
  514. factor9.setNeedMatch(false);
  515. }
  516. resultMqp.put(9,factor9);
  517. //--------------------因子处理分割线----------------------------------
  518. FeeFactorInfoDto factor10=new FeeFactorInfoDto();
  519. factor10.setFactorName("车船税金额区间");
  520. factor10.setMatchType("3");
  521. factor10.setMatchSequence(10);
  522. if(checkFactorConfigWithArea(factorCost.getMinTaxAmount(),factorCost.getMaxTaxAmount(),factor10,factorCost)){
  523. factor10.setNeedMatch(true);
  524. factor10.setMinRangeVal((double)factorCost.getMinTaxAmount());
  525. factor10.setMaxRangeVal((double)factorCost.getMaxTaxAmount());
  526. }else{
  527. //如果方案中未录入,则不校验该项因子
  528. factor10.setNeedMatch(false);
  529. }
  530. resultMqp.put(10,factor10);
  531. //--------------------因子处理分割线----------------------------------
  532. FeeFactorInfoDto factor11=new FeeFactorInfoDto();
  533. factor11.setFactorName("三者保额区间");
  534. factor11.setMatchType("3");
  535. factor11.setMatchSequence(11);
  536. if(checkFactorConfigWithArea(factorCost.getMinTheThreePremium(),factorCost.getMaxTheThreePremium(),factor11,factorCost)){
  537. factor11.setNeedMatch(true);
  538. factor11.setMinRangeVal((double)factorCost.getMinTheThreePremium()*10000);
  539. factor11.setMaxRangeVal((double)factorCost.getMaxTheThreePremium()*10000);
  540. }else{
  541. //如果方案中未录入,则不校验该项因子
  542. factor11.setNeedMatch(false);
  543. }
  544. resultMqp.put(11,factor11);
  545. //--------------------因子处理分割线----------------------------------
  546. FeeFactorInfoDto factor12=new FeeFactorInfoDto();
  547. factor12.setFactorName("随车产品保费区间");
  548. factor12.setMatchType("3");
  549. factor12.setMatchSequence(12);
  550. if(checkFactorConfigWithArea(factorCost.getMinOnboardProductsPremium(),factorCost.getMaxOnboardProductsPremium(),factor12,factorCost)){
  551. factor12.setNeedMatch(true);
  552. factor12.setMinRangeVal((double)factorCost.getMinOnboardProductsPremium());
  553. factor12.setMaxRangeVal((double)factorCost.getMaxOnboardProductsPremium());
  554. }else{
  555. //如果方案中未录入,则不校验该项因子
  556. factor12.setNeedMatch(false);
  557. }
  558. resultMqp.put(12,factor12);
  559. //--------------------因子处理分割线----------------------------------
  560. FeeFactorInfoDto factor13=new FeeFactorInfoDto();
  561. factor13.setFactorName("商业险折扣区间");
  562. factor13.setMatchType("3");
  563. factor13.setMatchSequence(13);
  564. if(checkFactorConfigWithArea(factorCost.getMinCommercialInsuranceDiscount(),factorCost.getMaxCommercialInsuranceDiscount(),factor13,factorCost)){
  565. factor13.setNeedMatch(true);
  566. factor13.setMinRangeVal((double)factorCost.getMinCommercialInsuranceDiscount());
  567. factor13.setMaxRangeVal((double)factorCost.getMaxCommercialInsuranceDiscount());
  568. }else{
  569. //如果方案中未录入,则不校验该项因子
  570. factor13.setNeedMatch(false);
  571. }
  572. resultMqp.put(13,factor13);
  573. //--------------------因子处理分割线----------------------------------
  574. FeeFactorInfoDto factor14=new FeeFactorInfoDto();
  575. factor14.setFactorName("交强险折扣区间");
  576. factor14.setMatchType("3");
  577. factor14.setMatchSequence(14);
  578. if(checkFactorConfigWithArea(factorCost.getMinCompulsoryInsuranceDiscount(),factorCost.getMaxCompulsoryInsuranceDiscount(),factor14,factorCost)){
  579. factor14.setNeedMatch(true);
  580. factor14.setMinRangeVal(factorCost.getMinCompulsoryInsuranceDiscount());
  581. factor14.setMaxRangeVal(factorCost.getMaxCompulsoryInsuranceDiscount());
  582. }else{
  583. //如果方案中未录入,则不校验该项因子
  584. factor14.setNeedMatch(false);
  585. }
  586. resultMqp.put(14,factor14);
  587. //--------------------因子处理分割线----------------------------------
  588. FeeFactorInfoDto factor15=new FeeFactorInfoDto();
  589. factor15.setFactorName("保司评分区间");
  590. factor15.setMatchType("3");
  591. factor15.setMatchSequence(15);
  592. if(checkFactorConfigWithArea(factorCost.getMinScore(),factorCost.getMaxScore(),factor15,factorCost)){
  593. factor15.setNeedMatch(true);
  594. factor15.setMinRangeVal((double)factorCost.getMinScore());
  595. factor15.setMaxRangeVal((double)factorCost.getMaxScore());
  596. }else{
  597. //如果方案中未录入,则不校验该项因子
  598. factor15.setNeedMatch(false);
  599. }
  600. resultMqp.put(15,factor15);
  601. //--------------------因子处理分割线----------------------------------
  602. FeeFactorInfoDto factor16=new FeeFactorInfoDto();
  603. factor16.setFactorName("预期赔付率区间");
  604. factor16.setMatchType("3");
  605. factor16.setMatchSequence(16);
  606. if(checkFactorConfigWithArea(factorCost.getMinLossRation(),factorCost.getMaxLossRation(),factor16,factorCost)){
  607. factor16.setNeedMatch(true);
  608. factor16.setMinRangeVal((double)factorCost.getMinLossRation());
  609. factor16.setMaxRangeVal((double)factorCost.getMaxLossRation());
  610. }else{
  611. //如果方案中未录入,则不校验该项因子
  612. factor16.setNeedMatch(false);
  613. }
  614. resultMqp.put(16,factor16);
  615. //--------------------因子处理分割线----------------------------------
  616. FeeFactorInfoDto factor17=new FeeFactorInfoDto();
  617. factor17.setFactorName("车牌号地区");
  618. factor17.setMatchType("2");
  619. factor17.setMatchSequence(17);
  620. if(factorCost.getLicenseNumber()!=null&&!"".equals(factorCost.getLicenseNumber())){
  621. factor17.setNeedMatch(true);
  622. String matchStr=factorCost.getLicenseNumber();
  623. //考虑是否含暂未上牌标志
  624. if(factorCost.getContainNoLicense()!=null&&"1".equals(factorCost.getContainNoLicense())){
  625. matchStr=matchStr+",暂未上牌";
  626. }
  627. factor17.setMultipleSelectVal(matchStr);
  628. }else{
  629. //如果方案中未录入,则不校验该项因子
  630. factor17.setNeedMatch(false);
  631. }
  632. resultMqp.put(17,factor17);
  633. //--------------------因子处理分割线----------------------------------
  634. FeeFactorInfoDto factor18=new FeeFactorInfoDto();
  635. factor18.setMatchType("4");
  636. factor18.setMatchSequence(18);
  637. boolean driverCheckFlag=true;//司机保额是否需要校验
  638. boolean passengerCheckFlag=true;//乘客保额是否需要校验
  639. //临时赋值,下面方法中使用需要区分
  640. factor18.setFactorName("人员司机险保额");
  641. if(checkFactorConfigWithArea(factorCost.getMinDriverAmount(),factorCost.getMaxDriverAmount(),factor18,factorCost)){
  642. factor18.setDriverMinRangeVal(factorCost.getMinDriverAmount()*10000);
  643. factor18.setDriverMaxRangeVal(factorCost.getMaxDriverAmount()*10000);
  644. }else{
  645. driverCheckFlag=false;
  646. }
  647. //临时赋值,下面方法中使用需要区分
  648. factor18.setFactorName("人员乘客险保额");
  649. if(checkFactorConfigWithArea(factorCost.getMinPassengerAmount(),factorCost.getMaxPassengerAmount(),factor18,factorCost)){
  650. factor18.setPassengerMinRangeVal(factorCost.getMinPassengerAmount()*10000);
  651. factor18.setPassengerMaxRangeVal(factorCost.getMaxPassengerAmount()*10000);
  652. }else{
  653. passengerCheckFlag=false;
  654. }
  655. //最终给因子赋值
  656. factor18.setFactorName("司乘险保额");
  657. factor18.setDriverIsNeedMatch(driverCheckFlag);
  658. factor18.setPassengerIsNeedMatch(passengerCheckFlag);
  659. //司机、乘客都不需要校验时,不校验该因子
  660. if(!driverCheckFlag&&!passengerCheckFlag){
  661. factor18.setNeedMatch(false);
  662. }else{//需要校验时,需要考虑俩者关联关系
  663. if(factorCost.getDriverPassengerRelation()!=null&&!"".equals(factorCost.getDriverPassengerRelation())){
  664. //赋值该因子参数关联关系
  665. factor18.setDriverPassengerRelation(factorCost.getDriverPassengerRelation());
  666. factor18.setNeedMatch(true);
  667. }else{
  668. throw new SystemException("协议ID:"+factorCost.getAgreementId()+" 方案序号:"+factorCost.getId()+" 费用因子:"+factor18.getFactorName()+"关联关系配置有问题,请检查!");
  669. }
  670. }
  671. resultMqp.put(18,factor18);
  672. //--------------------因子处理分割线----------------------------------
  673. return resultMqp;
  674. }
  675. /**
  676. * 判断区间类因子是否需要匹配
  677. * @param minVal
  678. * @param maxVal
  679. * @param factorInfoDto
  680. * @param productCosts
  681. * @return
  682. */
  683. private boolean checkFactorConfigWithArea(Integer minVal, Integer maxVal,FeeFactorInfoDto factorInfoDto,PtlAgreementProductCosts productCosts) {
  684. boolean result=false; //默认不需要匹配
  685. if(minVal!=null&&maxVal!=null){
  686. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  687. result=false;
  688. }else{
  689. if(minVal<=maxVal){
  690. result=true;
  691. }else{
  692. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  693. }
  694. }
  695. }else if(minVal!=null && maxVal==null){
  696. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  697. }else if(minVal==null&&maxVal!=null){
  698. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  699. }
  700. return result;
  701. }
  702. /**
  703. * 判断区间类因子是否需要匹配
  704. * @param minVal
  705. * @param maxVal
  706. * @param factorInfoDto
  707. * @param productCosts
  708. * @return
  709. */
  710. private boolean checkFactorConfigWithArea(Double minVal, Double maxVal,FeeFactorInfoDto factorInfoDto,PtlAgreementProductCosts productCosts) {
  711. boolean result=false; //默认不需要匹配
  712. if(minVal!=null&&maxVal!=null){
  713. if(minVal==0&&maxVal==0){//初始化没有配置的时候,全部默认的0,这种不需要匹配
  714. result=false;
  715. }else{
  716. if(minVal<=maxVal){
  717. result=true;
  718. }else{
  719. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  720. }
  721. }
  722. }else if(minVal!=null && maxVal==null){
  723. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  724. }else if(minVal==null&&maxVal!=null){
  725. throw new SystemException("协议ID:"+productCosts.getAgreementId()+" 方案序号:"+productCosts.getId()+" 费用因子:"+factorInfoDto.getFactorName()+"配置有问题,请检查!");
  726. }
  727. return result;
  728. }
  729. //----------------------------------------------分割线
  730. public FeeSchemeReqDto getFeeSchemeInfo(BaseQuoteInfoVo quoteInfoVo, QuoteRespVo quoteRespVo, String agreementId, String productId){
  731. CarInfoVo carInfoVo = quoteInfoVo.getCarInfo();
  732. List<KindInfoVo> kindList = quoteInfoVo.getKindList();
  733. String thirdPartyInsurance = "";
  734. String driverAmount="";
  735. String passengerAmount="";
  736. if(kindList!=null && kindList.size()>0){
  737. for(KindInfoVo kindInfoVo:kindList){
  738. //三者保额
  739. if("B".equals(kindInfoVo.getKindCode())){
  740. thirdPartyInsurance = String.valueOf(kindInfoVo.getAmount());
  741. }
  742. //司机保额
  743. if("D3".equals(kindInfoVo.getKindCode())){
  744. driverAmount = String.valueOf(kindInfoVo.getAmount());
  745. }
  746. //乘客保额
  747. if("D4".equals(kindInfoVo.getKindCode())){
  748. int quantity = Integer.parseInt(carInfoVo.getSeatCount())-1;
  749. passengerAmount = String.valueOf(kindInfoVo.getUnitAmount()*quantity);
  750. }
  751. }
  752. }
  753. FeeSchemeReqDto feeSchemeReqDto = new FeeSchemeReqDto();
  754. String isTransfer = "0";
  755. String isNewCar = "0";
  756. String isRenewal = "0";
  757. String useNature = "家庭自用";
  758. String carType="客车";
  759. String isNewEnergy = "0";
  760. feeSchemeReqDto.setBusType(productId);//"业务类型:单交0330、单商034001、单三034002、交三0330034002、交商0330034001"
  761. feeSchemeReqDto.setAgreementId(agreementId);//协议ID
  762. if(carInfoVo.isTransferFlag()){
  763. isTransfer = "1";
  764. }
  765. feeSchemeReqDto.setIsTransfer(isTransfer);//是否过户 1是 0否"
  766. //新旧车判断逻辑,初登日期小于当前日期加9个月
  767. if(StringUtils.isNotEmpty(carInfoVo.getRegisterDate())){
  768. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  769. LocalDate registerDate = LocalDate.parse(carInfoVo.getRegisterDate(), formatter).plusMonths(9);
  770. LocalDate currentDate = LocalDate.now();
  771. if(currentDate.isBefore(registerDate)){
  772. isNewCar = "1";
  773. }
  774. }
  775. feeSchemeReqDto.setIsNewCar(isNewCar);//是否新车 1是 0否
  776. if("1".equals(carInfoVo.getPowertype())||"2".equals(carInfoVo.getPowertype())||"3".equals(carInfoVo.getPowertype())){
  777. isNewEnergy = "1";
  778. }
  779. feeSchemeReqDto.setIsNewEnergy(isNewEnergy);//是否新能源 1是 0否
  780. feeSchemeReqDto.setIsRenewal("0");//是否续保 1是 0否 续保取值有争议 默认送否 暂时搁置
  781. //页面要素及中煤交互请求返参没有,先默认写死
  782. if("A0".equals(carInfoVo.getCimodelclass())){
  783. carType="客车";
  784. }
  785. feeSchemeReqDto.setVehicleCategory(carType);//车辆大类: 客车、货车、特种车、挂车、摩托车、拖拉机
  786. if("8A".equals(carInfoVo.getCarnature())){
  787. useNature = "家庭自用";
  788. }
  789. feeSchemeReqDto.setUseNature(useNature);//使用性质: 营业出租、营业租赁、营业公交、营业客运、营业货运、营业旅游、家庭自用、非营业机关事业、非营业企业、非营业个人
  790. feeSchemeReqDto.setSeatNum(String.valueOf(carInfoVo.getSeatCount()));//座位数 大概率准
  791. feeSchemeReqDto.setPurchasePrice(carInfoVo.getPurchasePrice());//新车购置价 可能再次新车筛选的时候送保司和页面带入有差异
  792. feeSchemeReqDto.setApprovedLoadCapacity(String.valueOf(carInfoVo.getLimitLoad()));//核定载质量 可能再次新车筛选的时候送保司和页面带入有差异
  793. feeSchemeReqDto.setJqPremium(String.valueOf(quoteRespVo.getJqPremium()));//交强保费
  794. feeSchemeReqDto.setSyPremium(String.valueOf(quoteRespVo.getSyPremium()));//商业保费
  795. feeSchemeReqDto.setSumPayTax(String.valueOf(quoteRespVo.getTaxAmount()));//车船税金额
  796. feeSchemeReqDto.setThirdPartyInsurance(thirdPartyInsurance);//三者险保额 准
  797. feeSchemeReqDto.setNoCarPremium("");//随车产品保费
  798. feeSchemeReqDto.setSyDiscount("");//商业险折扣
  799. feeSchemeReqDto.setJqDiscount("");//交强险折扣
  800. // feeSchemeReqDto.setInsuranceScore(quotedPriceResponse.getPlatMain().getZmScore());//保司评分 这里直接取中煤分
  801. feeSchemeReqDto.setExpectedLossRate("");//预期赔付率
  802. if(carInfoVo.getLicenseNo()!=null&&!"".equals(carInfoVo.getLicenseNo())&&!"暂未上牌".equals(carInfoVo.getLicenseNo())){
  803. feeSchemeReqDto.setLicenseNo(carInfoVo.getLicenseNo().substring(0,2));//车牌号
  804. }else{
  805. feeSchemeReqDto.setLicenseNo("暂未上牌");//车牌号
  806. }
  807. feeSchemeReqDto.setDriverAmount(driverAmount);//人员司机险保额 准
  808. feeSchemeReqDto.setPassengerAmount(passengerAmount);//人员乘客险保额 准
  809. return feeSchemeReqDto;
  810. }
  811. public void dealFeeOrderInfo(BaseQuoteInfoVo quoteInfoVo, QuoteRespVo quoteRespVo, String agreementId,String businessNo){
  812. BigDecimal jqNoTaxPremium = new BigDecimal(0);
  813. BigDecimal syNoTaxPremium = new BigDecimal(0);
  814. InsOrders insOrders = insOrdersService.getById(quoteRespVo.getOrderno());
  815. FeeSchemeReqDto feeSchemeReqDto = this.getFeeSchemeInfo(quoteInfoVo,quoteRespVo,agreementId,insOrders.getProductid());
  816. FeeSchemeResDto feeSchemeResDto = this.matchTheAppropriateFees(feeSchemeReqDto);
  817. InsFeeOrder insFeeOrder = new InsFeeOrder(feeSchemeReqDto,feeSchemeResDto,businessNo);
  818. PtlAgreement agreement=ptlAgreementService.getById(agreementId);
  819. //先通过含税保费计算出不含税保费 公式 总保费/(1+增值税率) 目前增值税率是0.06
  820. if(insFeeOrder.getJqPremium().doubleValue()>0){
  821. //默认用含税保费计算
  822. jqNoTaxPremium=insFeeOrder.getJqPremium();
  823. //如果协议中配置为不含税结算时,计算不含税保费
  824. if(StringUtils.isNotEmpty(agreement.getWithTax())&&"否".equals(agreement.getWithTax())){
  825. jqNoTaxPremium = insFeeOrder.getJqPremium().divide(new BigDecimal(1+0.06),BigDecimal.ROUND_HALF_UP,2);
  826. }
  827. insFeeOrder.setJqNoTaxPremium(jqNoTaxPremium);
  828. //交强险总费用
  829. insFeeOrder.setJqCostsPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqCostsProportion()));
  830. //监管费比例
  831. if("1".equals(feeSchemeReqDto.getIsNewCar())){
  832. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqNewCarCostsProportion()));
  833. }else if("0".equals(feeSchemeReqDto.getIsNewCar())){
  834. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getJqOldCarCostsProportion()));
  835. }else{
  836. insFeeOrder.setJqSuperviseCostsProportion(new BigDecimal(0));
  837. }
  838. //监管费
  839. insFeeOrder.setJqSuperviseCostsPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqSuperviseCostsProportion()));
  840. //溢出费比例 先搁置放0
  841. insFeeOrder.setJqSpilloverProportion(new BigDecimal(feeSchemeResDto.getJqSpilloverProportion()));
  842. //溢出费 先搁置放0
  843. insFeeOrder.setJqSpilloverPremiums(getPremium(jqNoTaxPremium,insFeeOrder.getJqSpilloverProportion()));
  844. }
  845. if(insFeeOrder.getSyPremium().doubleValue()>0){
  846. //默认用含税保费计算
  847. syNoTaxPremium = insFeeOrder.getSyPremium();
  848. //如果协议中配置为不含税结算时,计算不含税保费
  849. if(StringUtils.isNotEmpty(agreement.getWithTax())&&"否".equals(agreement.getWithTax())){
  850. syNoTaxPremium = insFeeOrder.getSyPremium().divide(new BigDecimal(1+0.06),BigDecimal.ROUND_HALF_UP,2);
  851. }
  852. insFeeOrder.setSyNoTaxPremium(syNoTaxPremium);
  853. //商业险总费用
  854. insFeeOrder.setSyCostsPremiums(getPremium(syNoTaxPremium,insFeeOrder.getSyCostsProportion()));
  855. //监管费比例
  856. if("1".equals(feeSchemeReqDto.getIsNewCar())){
  857. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getSyNewCarCostsProportion()));
  858. }else if("0".equals(feeSchemeReqDto.getIsNewCar())){
  859. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(feeSchemeResDto.getSyOldCarCostsProportion()));
  860. }else{
  861. insFeeOrder.setSySuperviseCostsProportion(new BigDecimal(0));
  862. }
  863. //监管费
  864. insFeeOrder.setSySuperviseCostsPremiums(getPremium(syNoTaxPremium,insFeeOrder.getSySuperviseCostsProportion()));
  865. //溢出费比例 先搁置放0
  866. insFeeOrder.setSySpilloverProportion(new BigDecimal(feeSchemeResDto.getSySpilloverProportion()));
  867. //溢出费 先搁置放0
  868. insFeeOrder.setSySpilloverPremiums(getPremium(syNoTaxPremium,insFeeOrder.getSySpilloverProportion()));
  869. }
  870. if(jqNoTaxPremium.doubleValue() >0 || syNoTaxPremium.doubleValue() >0){
  871. BigDecimal totalNoTaxPremium = jqNoTaxPremium.add(syNoTaxPremium);
  872. SysUser sysUser = sysUserService.findByUserId(insOrders.getUserid());
  873. /**
  874. * 机构管理费比例逻辑
  875. * 当前出单员的机构编码找他的上一级就是五级
  876. * 机构层级划分方式
  877. * 99 总公司 一级
  878. * 9914山西分公司 二级
  879. * 991401太原中支 三级
  880. * 99140105小店中支 四级
  881. * 9914010501 营销服务部 五级
  882. * 1团队 无机构层级
  883. */
  884. //判断出单员归属机构层级
  885. String parentId = sysUser.getDeptId();
  886. String comlevel = "";
  887. do{//循环操作
  888. SysDept sysDeptTemp = sysDeptService.getById(parentId);
  889. if(sysDeptTemp!=null&&StringUtils.isNotEmpty(sysDeptTemp.getParentId())){
  890. parentId = sysDeptTemp.getParentId();
  891. }else{
  892. break;
  893. }
  894. if(StringUtils.isEmpty(sysDeptTemp.getComlevel())){
  895. continue;
  896. }else {
  897. comlevel = sysDeptTemp.getComlevel();
  898. }
  899. //五级机构管理费用比例
  900. if(sysDeptTemp!=null && "5".equals(sysDeptTemp.getComlevel())){
  901. insFeeOrder.setFifthDeptProportion(new BigDecimal(sysDeptTemp.getManagementFee()));
  902. insFeeOrder.setFifthDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFifthDeptProportion()));
  903. }
  904. //四级机构管理费用比例
  905. if(sysDeptTemp!=null && "4".equals(sysDeptTemp.getComlevel())){
  906. insFeeOrder.setForthDeptProportion(new BigDecimal(sysDeptTemp.getManagementFee()));
  907. insFeeOrder.setForthDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getForthDeptProportion()));
  908. }
  909. //三级机构管理费用比例
  910. if(sysDeptTemp!=null && "3".equals(sysDeptTemp.getComlevel())){
  911. insFeeOrder.setThirdDeptProportion(new BigDecimal(sysDeptTemp.getManagementFee()));
  912. insFeeOrder.setThirdDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getThirdDeptProportion()));
  913. }
  914. //二级机构管理费用比例
  915. if(sysDeptTemp!=null && "2".equals(sysDeptTemp.getComlevel())){
  916. insFeeOrder.setSecondDeptProportion(new BigDecimal(sysDeptTemp.getManagementFee()));
  917. insFeeOrder.setSecondDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getSecondDeptProportion()));
  918. }
  919. //一级机构管理费用比例
  920. if(sysDeptTemp!=null && "1".equals(sysDeptTemp.getComlevel())){
  921. insFeeOrder.setFirstDeptProportion(new BigDecimal(sysDeptTemp.getManagementFee()));
  922. insFeeOrder.setFirstDeptPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFirstDeptProportion()));
  923. //取到第一层级时结束
  924. break;
  925. }
  926. }while (!"1".equals(comlevel));
  927. //一级分销比例 推荐人
  928. //二级分销比例
  929. //三级分销比例
  930. /**
  931. * 分销一级、二级、三级存值取团队配置的分销佣金比例,若该团队走三级分销模式,当前出单员出单时,跟单的分销取值方式为:
  932. * 根据出单员的推荐人向上找三级,若可以找到,则跟单存一、二、三分销比例;
  933. * 若向上只能找到一级或者二级,则跟单存一级或者一级、二级
  934. * 比如 A 1 B 2 C 3 D 若D出单 则给 C 3个 B 2个 A 1个;C出单给 B 3个 A 2个
  935. * 第一步,先判断团队配置的分销模式
  936. * 第二步,根据分销模式找上级存值相应分销比例
  937. * 第三步,仅有一个上级的情况分销比例存啥
  938. */
  939. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ", new Object[]{sysUser.getDeptId()});
  940. if(esmRetailList!=null && esmRetailList.size()>0){
  941. EsmRetail esmRetail = esmRetailList.get(0);
  942. if(esmRetail!=null){
  943. int cycleIndex = 0;
  944. if("3".equals(esmRetail.getRetailtype())){//团队配置了三级分销模式
  945. cycleIndex = 3;
  946. }else if("2".equals(esmRetail.getRetailtype())){//团队配置了二级分销模式
  947. cycleIndex = 2;
  948. }else if("1".equals(esmRetail.getRetailtype())){//团队配置了一级分销模式
  949. cycleIndex = 1;
  950. }else if("0".equals(esmRetail.getRetailtype())){//团队没有配置分销模式
  951. cycleIndex = 0;
  952. }
  953. //利用当前工号,循环向上找推荐人
  954. String userId = sysUser.getId();
  955. int breakCycle = 99999999;
  956. for(int i=0;i<=cycleIndex;i++){
  957. EsmUserReferrer userReferrer = esmUserReferrerService.getById(userId);
  958. if(userReferrer.getReferrerId().equals(userReferrer.getId())){//团队长,没有上级
  959. //跳出循环
  960. breakCycle = i;
  961. break;
  962. }else {
  963. userId = userReferrer.getReferrerId();
  964. }
  965. }
  966. //breakCycle是3,当前工号的上级的上级的上级就是团队长
  967. //breakCycle是2,当前工号的上级的上级就是团队长
  968. //breakCycle是1,当前工号的上级就是团队长
  969. //breakCycle是0,当前工号就是团队长
  970. if("3".equals(esmRetail.getRetailtype())){//团队配置了三级分销模式
  971. if(breakCycle==99999999||breakCycle==3){
  972. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  973. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  974. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  975. }else if(breakCycle==2){
  976. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  977. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  978. }else if(breakCycle==1){
  979. insFeeOrder.setThirdRetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  980. }
  981. }else if("2".equals(esmRetail.getRetailtype())){//团队配置了二级分销模式
  982. if(breakCycle==99999999||breakCycle==3 || breakCycle==2){
  983. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  984. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  985. }else if(breakCycle==1){
  986. insFeeOrder.setSecondRetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  987. }
  988. }else if("1".equals(esmRetail.getRetailtype())){//团队配置了一级分销模式
  989. if(breakCycle==99999999||breakCycle==3 || breakCycle==2||breakCycle==1){
  990. insFeeOrder.setFirstRetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  991. }
  992. }
  993. insFeeOrder.setFirstRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getFirstRetailProportion()));
  994. insFeeOrder.setSecondRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getSecondRetailProportion()));
  995. insFeeOrder.setThirdRetailPremiums(getPremium(totalNoTaxPremium,insFeeOrder.getThirdRetailProportion()));
  996. }
  997. }
  998. }
  999. insFeeOrderService.insertCompanyAndOrders(insFeeOrder);
  1000. }
  1001. private BigDecimal getPremium(BigDecimal noTaxPremium,BigDecimal costsProportion){
  1002. BigDecimal premium = new BigDecimal(0);
  1003. if(costsProportion!=null && costsProportion.doubleValue()>0){
  1004. premium = noTaxPremium.multiply(costsProportion).divide(new BigDecimal(100),4,BigDecimal.ROUND_HALF_UP);
  1005. }
  1006. return premium;
  1007. }
  1008. private BigDecimal getPremiumForSubtract(BigDecimal former,BigDecimal latter){
  1009. BigDecimal premium = new BigDecimal(0);
  1010. if(former!=null && latter!=null){
  1011. premium = former.subtract(latter);
  1012. }
  1013. return premium;
  1014. }
  1015. public List<QueryOrderFeeResultVo> queryFeeOrderInfo(String companyId){
  1016. QueryOrderFeeVo queryOrderFeeVo = new QueryOrderFeeVo();
  1017. OrderFeeVo jqOrderFeeVo = new OrderFeeVo();
  1018. OrderFeeVo syOrderFeeVo = new OrderFeeVo();
  1019. OrderFeeVo fcOrderFeeVo = new OrderFeeVo();
  1020. InsAreaCompany insAreaCompany = insAreaCompanyService.getByIdIsExist(companyId);
  1021. InsFeeOrder insFeeOrder = insFeeOrderService.getByInsOrderNo(insAreaCompany.getInsOrderNo());
  1022. if(insFeeOrder!=null){
  1023. if(insFeeOrder.getJqPremium()!=null && insFeeOrder.getJqPremium().doubleValue()>0 && insFeeOrder.getSyPremium()!=null && insFeeOrder.getSyPremium().doubleValue()==0){//当为单交业务时
  1024. jqOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1025. jqOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getJqCostsPremiums()));
  1026. jqOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getJqCostsProportion()));
  1027. }else if(insFeeOrder.getSyPremium()!=null && insFeeOrder.getSyPremium().doubleValue()>0 && insFeeOrder.getJqPremium()!=null && insFeeOrder.getJqPremium().doubleValue()==0){//当为单商业务时
  1028. syOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1029. syOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getSyCostsPremiums()));
  1030. syOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getSyCostsProportion()));
  1031. }else if(insFeeOrder.getJqPremium()!=null && insFeeOrder.getJqPremium().doubleValue()>0 && insFeeOrder.getSyPremium()!=null && insFeeOrder.getSyPremium().doubleValue()>0){//当为交商业务时
  1032. QueryOrderFeeVo queryOrderFeeVoTemp = packageOrderFeeInfoAll(insFeeOrder);
  1033. //获取交强险费用明细
  1034. jqOrderFeeVo = queryOrderFeeVoTemp.getJqCoderFeeVo();
  1035. jqOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getJqCostsPremiums()));
  1036. jqOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getJqCostsProportion()));
  1037. //获取商业险费用明细
  1038. syOrderFeeVo = queryOrderFeeVoTemp.getSyCoderFeeVo();
  1039. syOrderFeeVo.setCostsPremiums(convertToString(insFeeOrder.getSyCostsPremiums()));
  1040. syOrderFeeVo.setCostsProportion(convertToString(insFeeOrder.getSyCostsProportion()));
  1041. }
  1042. queryOrderFeeVo.setJqCoderFeeVo(jqOrderFeeVo);
  1043. queryOrderFeeVo.setSyCoderFeeVo(syOrderFeeVo);
  1044. queryOrderFeeVo.setFcCoderFeeVo(fcOrderFeeVo);
  1045. }
  1046. List<QueryOrderFeeResultVo> resultList=convertOrderFeeVoData(queryOrderFeeVo);
  1047. return resultList;
  1048. }
  1049. //把取出的费用信息转换为页面需要展示的数据
  1050. private List<QueryOrderFeeResultVo> convertOrderFeeVoData(QueryOrderFeeVo orderFeeVo) {
  1051. List<QueryOrderFeeResultVo> resultList=new ArrayList<>();
  1052. OrderFeeVo jqOrderFeeVo = orderFeeVo.getJqCoderFeeVo();
  1053. OrderFeeVo syOrderFeeVo = orderFeeVo.getSyCoderFeeVo();
  1054. OrderFeeVo fcOrderFeeVo = orderFeeVo.getFcCoderFeeVo();
  1055. //总费用
  1056. QueryOrderFeeResultVo feeResultVo1=new QueryOrderFeeResultVo();
  1057. feeResultVo1.setDescSerialNo("1");
  1058. feeResultVo1.setFeeTypeName("总费用");
  1059. feeResultVo1.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getCostsProportion()!=null?jqOrderFeeVo.getCostsProportion():"-");
  1060. feeResultVo1.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getCostsPremiums()!=null?jqOrderFeeVo.getCostsPremiums():"-");
  1061. feeResultVo1.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getCostsProportion()!=null?syOrderFeeVo.getCostsProportion():"-");
  1062. feeResultVo1.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getCostsPremiums()!=null?syOrderFeeVo.getCostsPremiums():"-");
  1063. feeResultVo1.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getCostsProportion()!=null?fcOrderFeeVo.getCostsProportion():"-");
  1064. feeResultVo1.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getCostsPremiums()!=null?fcOrderFeeVo.getCostsPremiums():"-");
  1065. resultList.add(feeResultVo1);
  1066. //一级管理费用
  1067. QueryOrderFeeResultVo feeResultVo2=new QueryOrderFeeResultVo();
  1068. feeResultVo2.setDescSerialNo("2");
  1069. feeResultVo2.setFeeTypeName("一级管理费");
  1070. feeResultVo2.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstDeptProportion()!=null?jqOrderFeeVo.getFirstDeptProportion():"-");
  1071. feeResultVo2.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstDeptPremiums()!=null?jqOrderFeeVo.getFirstDeptPremiums():"-");
  1072. feeResultVo2.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getFirstDeptProportion()!=null?syOrderFeeVo.getFirstDeptProportion():"-");
  1073. feeResultVo2.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getFirstDeptPremiums()!=null?syOrderFeeVo.getFirstDeptPremiums():"-");
  1074. feeResultVo2.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstDeptProportion()!=null?fcOrderFeeVo.getFirstDeptProportion():"-");
  1075. feeResultVo2.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstDeptPremiums()!=null?fcOrderFeeVo.getFirstDeptPremiums():"-");
  1076. resultList.add(feeResultVo2);
  1077. //二级管理费用
  1078. QueryOrderFeeResultVo feeResultVo3=new QueryOrderFeeResultVo();
  1079. feeResultVo3.setDescSerialNo("3");
  1080. feeResultVo3.setFeeTypeName("二级管理费");
  1081. feeResultVo3.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondDeptProportion()!=null?jqOrderFeeVo.getSecondDeptProportion():"-");
  1082. feeResultVo3.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondDeptPremiums()!=null?jqOrderFeeVo.getSecondDeptPremiums():"-");
  1083. feeResultVo3.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getSecondDeptProportion()!=null?syOrderFeeVo.getSecondDeptProportion():"-");
  1084. feeResultVo3.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getSecondDeptPremiums()!=null?syOrderFeeVo.getSecondDeptPremiums():"-");
  1085. feeResultVo3.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondDeptProportion()!=null?fcOrderFeeVo.getSecondDeptProportion():"-");
  1086. feeResultVo3.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondDeptPremiums()!=null?fcOrderFeeVo.getSecondDeptPremiums():"-");
  1087. resultList.add(feeResultVo3);
  1088. //三级管理费用
  1089. QueryOrderFeeResultVo feeResultVo4=new QueryOrderFeeResultVo();
  1090. feeResultVo4.setDescSerialNo("4");
  1091. feeResultVo4.setFeeTypeName("三级管理费");
  1092. feeResultVo4.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdDeptProportion()!=null?jqOrderFeeVo.getThirdDeptProportion():"-");
  1093. feeResultVo4.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdDeptPremiums()!=null?jqOrderFeeVo.getThirdDeptPremiums():"-");
  1094. feeResultVo4.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getThirdDeptProportion()!=null?syOrderFeeVo.getThirdDeptProportion():"-");
  1095. feeResultVo4.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getThirdDeptPremiums()!=null?syOrderFeeVo.getThirdDeptPremiums():"-");
  1096. feeResultVo4.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdDeptProportion()!=null?fcOrderFeeVo.getThirdDeptProportion():"-");
  1097. feeResultVo4.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdDeptPremiums()!=null?fcOrderFeeVo.getThirdDeptPremiums():"-");
  1098. resultList.add(feeResultVo4);
  1099. //四级管理费用
  1100. QueryOrderFeeResultVo feeResultVo5=new QueryOrderFeeResultVo();
  1101. feeResultVo5.setDescSerialNo("5");
  1102. feeResultVo5.setFeeTypeName("四级管理费");
  1103. feeResultVo5.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getForthDeptProportion()!=null?jqOrderFeeVo.getForthDeptProportion():"-");
  1104. feeResultVo5.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getForthDeptPremiums()!=null?jqOrderFeeVo.getForthDeptPremiums():"-");
  1105. feeResultVo5.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getForthDeptProportion()!=null?syOrderFeeVo.getForthDeptProportion():"-");
  1106. feeResultVo5.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getForthDeptPremiums()!=null?syOrderFeeVo.getForthDeptPremiums():"-");
  1107. feeResultVo5.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getForthDeptProportion()!=null?fcOrderFeeVo.getForthDeptProportion():"-");
  1108. feeResultVo5.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getForthDeptPremiums()!=null?fcOrderFeeVo.getForthDeptPremiums():"-");
  1109. resultList.add(feeResultVo5);
  1110. //五级管理费用
  1111. QueryOrderFeeResultVo feeResultVo6=new QueryOrderFeeResultVo();
  1112. feeResultVo6.setDescSerialNo("6");
  1113. feeResultVo6.setFeeTypeName("五级管理费");
  1114. feeResultVo6.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getFifthDeptProportion()!=null?jqOrderFeeVo.getFifthDeptProportion():"-");
  1115. feeResultVo6.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getFifthDeptPremiums()!=null?jqOrderFeeVo.getFifthDeptPremiums():"-");
  1116. feeResultVo6.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getFifthDeptProportion()!=null?syOrderFeeVo.getFifthDeptProportion():"-");
  1117. feeResultVo6.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getFifthDeptPremiums()!=null?syOrderFeeVo.getFifthDeptPremiums():"-");
  1118. feeResultVo6.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getFifthDeptProportion()!=null?fcOrderFeeVo.getFifthDeptProportion():"-");
  1119. feeResultVo6.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getFifthDeptPremiums()!=null?fcOrderFeeVo.getFifthDeptPremiums():"-");
  1120. resultList.add(feeResultVo6);
  1121. //一级分销费
  1122. QueryOrderFeeResultVo feeResultVo7=new QueryOrderFeeResultVo();
  1123. feeResultVo7.setDescSerialNo("7");
  1124. feeResultVo7.setFeeTypeName("一级分销费");
  1125. feeResultVo7.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstRetailProportion()!=null?jqOrderFeeVo.getFirstRetailProportion():"-");
  1126. feeResultVo7.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getFirstRetailPremiums()!=null?jqOrderFeeVo.getFirstRetailPremiums():"-");
  1127. feeResultVo7.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getFirstRetailProportion()!=null?syOrderFeeVo.getFirstRetailProportion():"-");
  1128. feeResultVo7.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getFirstRetailPremiums()!=null?syOrderFeeVo.getFirstRetailPremiums():"-");
  1129. feeResultVo7.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstRetailProportion()!=null?fcOrderFeeVo.getFirstRetailProportion():"-");
  1130. feeResultVo7.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getFirstRetailPremiums()!=null?fcOrderFeeVo.getFirstRetailPremiums():"-");
  1131. resultList.add(feeResultVo7);
  1132. //二级分销费
  1133. QueryOrderFeeResultVo feeResultVo8=new QueryOrderFeeResultVo();
  1134. feeResultVo8.setDescSerialNo("8");
  1135. feeResultVo8.setFeeTypeName("二级分销费");
  1136. feeResultVo8.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondRetailProportion()!=null?jqOrderFeeVo.getSecondRetailProportion():"-");
  1137. feeResultVo8.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getSecondRetailPremiums()!=null?jqOrderFeeVo.getSecondRetailPremiums():"-");
  1138. feeResultVo8.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getSecondRetailProportion()!=null?syOrderFeeVo.getSecondRetailProportion():"-");
  1139. feeResultVo8.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getSecondRetailPremiums()!=null?syOrderFeeVo.getSecondRetailPremiums():"-");
  1140. feeResultVo8.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondRetailProportion()!=null?fcOrderFeeVo.getSecondRetailProportion():"-");
  1141. feeResultVo8.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getSecondRetailPremiums()!=null?fcOrderFeeVo.getSecondRetailPremiums():"-");
  1142. resultList.add(feeResultVo8);
  1143. //三级分销费
  1144. QueryOrderFeeResultVo feeResultVo9=new QueryOrderFeeResultVo();
  1145. feeResultVo9.setDescSerialNo("9");
  1146. feeResultVo9.setFeeTypeName("三级分销费");
  1147. feeResultVo9.setJqFeeRate(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdRetailProportion()!=null?jqOrderFeeVo.getThirdRetailProportion():"-");
  1148. feeResultVo9.setJqFeeAmount(jqOrderFeeVo!=null&&jqOrderFeeVo.getThirdRetailPremiums()!=null?jqOrderFeeVo.getThirdRetailPremiums():"-");
  1149. feeResultVo9.setSyFeeRate(syOrderFeeVo!=null&&syOrderFeeVo.getThirdRetailProportion()!=null?syOrderFeeVo.getThirdRetailProportion():"-");
  1150. feeResultVo9.setSyFeeAmount(syOrderFeeVo!=null&&syOrderFeeVo.getThirdRetailPremiums()!=null?syOrderFeeVo.getThirdRetailPremiums():"-");
  1151. feeResultVo9.setFcFeeRate(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdRetailProportion()!=null?fcOrderFeeVo.getThirdRetailProportion():"-");
  1152. feeResultVo9.setFcFeeAmount(fcOrderFeeVo!=null&&fcOrderFeeVo.getThirdRetailPremiums()!=null?fcOrderFeeVo.getThirdRetailPremiums():"-");
  1153. resultList.add(feeResultVo9);
  1154. return resultList;
  1155. }
  1156. /**
  1157. * 按照组合单模式获取费用明细
  1158. * @param insFeeOrder
  1159. * @return
  1160. */
  1161. private QueryOrderFeeVo packageOrderFeeInfoAll(InsFeeOrder insFeeOrder){
  1162. QueryOrderFeeVo queryOrderFeeVo = new QueryOrderFeeVo();
  1163. InsFeeOrder jqInsFeeOrderTemp = new InsFeeOrder();
  1164. //先利用交强费重算费用
  1165. jqInsFeeOrderTemp.setFirstDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFirstDeptProportion()));
  1166. jqInsFeeOrderTemp.setSecondDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getSecondDeptProportion()));
  1167. jqInsFeeOrderTemp.setThirdDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getThirdDeptProportion()));
  1168. jqInsFeeOrderTemp.setForthDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getForthDeptProportion()));
  1169. jqInsFeeOrderTemp.setFifthDeptPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFifthDeptProportion()));
  1170. jqInsFeeOrderTemp.setFirstRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getFirstRetailProportion()));
  1171. jqInsFeeOrderTemp.setSecondRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getSecondRetailProportion()));
  1172. jqInsFeeOrderTemp.setThirdRetailPremiums(getPremium(insFeeOrder.getJqNoTaxPremium(),insFeeOrder.getThirdRetailProportion()));
  1173. //再利用总费-交强费,得出商业费
  1174. InsFeeOrder syInsFeeOrderTemp = new InsFeeOrder();
  1175. syInsFeeOrderTemp.setFirstDeptPremiums(getPremiumForSubtract(insFeeOrder.getFirstDeptPremiums(),jqInsFeeOrderTemp.getFirstDeptPremiums()));
  1176. syInsFeeOrderTemp.setSecondDeptPremiums(getPremiumForSubtract(insFeeOrder.getSecondDeptPremiums(),jqInsFeeOrderTemp.getSecondDeptPremiums()));
  1177. syInsFeeOrderTemp.setThirdDeptPremiums(getPremiumForSubtract(insFeeOrder.getThirdDeptPremiums(),jqInsFeeOrderTemp.getThirdDeptPremiums()));
  1178. syInsFeeOrderTemp.setForthDeptPremiums(getPremiumForSubtract(insFeeOrder.getForthDeptPremiums(),jqInsFeeOrderTemp.getForthDeptPremiums()));
  1179. syInsFeeOrderTemp.setFifthDeptPremiums(getPremiumForSubtract(insFeeOrder.getFifthDeptPremiums(),jqInsFeeOrderTemp.getFifthDeptPremiums()));
  1180. syInsFeeOrderTemp.setFirstRetailPremiums(getPremiumForSubtract(insFeeOrder.getFirstRetailPremiums(),jqInsFeeOrderTemp.getFirstRetailPremiums()));
  1181. syInsFeeOrderTemp.setSecondRetailPremiums(getPremiumForSubtract(insFeeOrder.getSecondRetailPremiums(),jqInsFeeOrderTemp.getSecondRetailPremiums()));
  1182. syInsFeeOrderTemp.setThirdRetailPremiums(getPremiumForSubtract(insFeeOrder.getThirdRetailPremiums(),jqInsFeeOrderTemp.getThirdRetailPremiums()));
  1183. //交强费转换赋值
  1184. OrderFeeVo jqOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1185. jqOrderFeeVo.setFirstDeptPremiums(convertToString(jqInsFeeOrderTemp.getFirstDeptPremiums()));
  1186. jqOrderFeeVo.setSecondDeptPremiums(convertToString(jqInsFeeOrderTemp.getSecondDeptPremiums()));
  1187. jqOrderFeeVo.setThirdDeptPremiums(convertToString(jqInsFeeOrderTemp.getThirdDeptPremiums()));
  1188. jqOrderFeeVo.setForthDeptPremiums(convertToString(jqInsFeeOrderTemp.getForthDeptPremiums()));
  1189. jqOrderFeeVo.setFifthDeptPremiums(convertToString(jqInsFeeOrderTemp.getFifthDeptPremiums()));
  1190. jqOrderFeeVo.setFirstRetailPremiums(convertToString(jqInsFeeOrderTemp.getFirstRetailPremiums()));
  1191. jqOrderFeeVo.setSecondRetailPremiums(convertToString(jqInsFeeOrderTemp.getSecondRetailPremiums()));
  1192. jqOrderFeeVo.setThirdRetailPremiums(convertToString(jqInsFeeOrderTemp.getThirdRetailPremiums()));
  1193. //商业费转换赋值
  1194. OrderFeeVo syOrderFeeVo = packageOrderFeeInfoOne(insFeeOrder);
  1195. syOrderFeeVo.setFirstDeptPremiums(convertToString(syInsFeeOrderTemp.getFirstDeptPremiums()));
  1196. syOrderFeeVo.setSecondDeptPremiums(convertToString(syInsFeeOrderTemp.getSecondDeptPremiums()));
  1197. syOrderFeeVo.setThirdDeptPremiums(convertToString(syInsFeeOrderTemp.getThirdDeptPremiums()));
  1198. syOrderFeeVo.setForthDeptPremiums(convertToString(syInsFeeOrderTemp.getForthDeptPremiums()));
  1199. syOrderFeeVo.setFifthDeptPremiums(convertToString(syInsFeeOrderTemp.getFifthDeptPremiums()));
  1200. syOrderFeeVo.setFirstRetailPremiums(convertToString(syInsFeeOrderTemp.getFirstRetailPremiums()));
  1201. syOrderFeeVo.setSecondRetailPremiums(convertToString(syInsFeeOrderTemp.getSecondRetailPremiums()));
  1202. syOrderFeeVo.setThirdRetailPremiums(convertToString(syInsFeeOrderTemp.getThirdRetailPremiums()));
  1203. queryOrderFeeVo.setJqCoderFeeVo(jqOrderFeeVo);
  1204. queryOrderFeeVo.setSyCoderFeeVo(syOrderFeeVo);
  1205. return queryOrderFeeVo;
  1206. }
  1207. /**
  1208. * 按照单险种方式获取费用明细
  1209. * @param insFeeOrder
  1210. * @return
  1211. */
  1212. private OrderFeeVo packageOrderFeeInfoOne(InsFeeOrder insFeeOrder){
  1213. OrderFeeVo orderFeeVo = new OrderFeeVo();
  1214. orderFeeVo.setFirstDeptPremiums(convertToString(insFeeOrder.getFirstDeptPremiums()));
  1215. orderFeeVo.setFirstDeptProportion(convertToString(insFeeOrder.getFirstDeptProportion()));
  1216. orderFeeVo.setSecondDeptPremiums(convertToString(insFeeOrder.getSecondDeptPremiums()));
  1217. orderFeeVo.setSecondDeptProportion(convertToString(insFeeOrder.getSecondDeptProportion()));
  1218. orderFeeVo.setThirdDeptPremiums(convertToString(insFeeOrder.getThirdDeptPremiums()));
  1219. orderFeeVo.setThirdDeptProportion(convertToString(insFeeOrder.getThirdDeptProportion()));
  1220. orderFeeVo.setForthDeptPremiums(convertToString(insFeeOrder.getForthDeptPremiums()));
  1221. orderFeeVo.setForthDeptProportion(convertToString(insFeeOrder.getForthDeptProportion()));
  1222. orderFeeVo.setFifthDeptPremiums(convertToString(insFeeOrder.getFifthDeptPremiums()));
  1223. orderFeeVo.setFifthDeptProportion(convertToString(insFeeOrder.getFifthDeptProportion()));
  1224. orderFeeVo.setFirstRetailPremiums(convertToString(insFeeOrder.getFirstRetailPremiums()));
  1225. orderFeeVo.setFirstRetailProportion(convertToString(insFeeOrder.getFirstRetailProportion()));
  1226. orderFeeVo.setSecondRetailPremiums(convertToString(insFeeOrder.getSecondRetailPremiums()));
  1227. orderFeeVo.setSecondRetailProportion(convertToString(insFeeOrder.getSecondRetailProportion()));
  1228. orderFeeVo.setThirdRetailPremiums(convertToString(insFeeOrder.getThirdRetailPremiums()));
  1229. orderFeeVo.setThirdRetailProportion(convertToString(insFeeOrder.getThirdRetailProportion()));
  1230. return orderFeeVo;
  1231. }
  1232. private String convertToString(BigDecimal b){
  1233. if(b!=null){
  1234. if(b.doubleValue()==0){
  1235. return null;
  1236. }else {
  1237. return b.toString();
  1238. }
  1239. }else{
  1240. return null;
  1241. }
  1242. }
  1243. }