FeeRuleSchemeServiceNewImpl.java 98 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646
  1. package com.ydtech.modules.fee.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  3. import com.ydtech.constants.enums.dict.insurance.EnergyType;
  4. import com.ydtech.exception.SystemException;
  5. import com.ydtech.modules.admin.model.SysUser;
  6. import com.ydtech.modules.admin.service.SysUserAccountService;
  7. import com.ydtech.modules.admin.service.SysUserService;
  8. import com.ydtech.modules.esm.model.EsmRetail;
  9. import com.ydtech.modules.esm.model.EsmUserReferrer;
  10. import com.ydtech.modules.esm.service.EsmRetailService;
  11. import com.ydtech.modules.esm.service.EsmUserReferrerService;
  12. import com.ydtech.modules.fee.dto.vo.RuleAttrMappingVo;
  13. import com.ydtech.modules.fee.service.FeeRuleSchemeNewService;
  14. import com.ydtech.modules.fee.service.FeeRuleSchemeService;
  15. import com.ydtech.modules.order.entity.InsAreaCompany;
  16. import com.ydtech.modules.order.entity.InsOrders;
  17. import com.ydtech.modules.order.entity.vo.FeeOrderNewVo;
  18. import com.ydtech.modules.order.entity.vo.QueryOrderFeeResultVo;
  19. import com.ydtech.modules.order.entity.vo.QueryOrderFeeVo;
  20. import com.ydtech.modules.order.service.InsOrdersService;
  21. import com.ydtech.modules.protocol.entity.po.PtlAgreement;
  22. import com.ydtech.modules.protocol.entity.po.PtlNewCarJudgeRules;
  23. import com.ydtech.modules.protocol.service.PtlAgreementService;
  24. import com.ydtech.modules.protocol.service.PtlNewCarJudgeRulesService;
  25. import com.ydtech.modules.protocols.entity.po.*;
  26. import com.ydtech.modules.protocols.entity.vo.AgreementProductCosts;
  27. import com.ydtech.modules.protocols.service.*;
  28. import com.ydtech.utils.idgen.IdGenerate;
  29. import org.slf4j.Logger;
  30. import org.slf4j.LoggerFactory;
  31. import org.springframework.beans.factory.annotation.Autowired;
  32. import org.springframework.stereotype.Service;
  33. import javax.annotation.Resource;
  34. import java.math.BigDecimal;
  35. import java.util.Arrays;
  36. import java.util.Collections;
  37. import java.util.Comparator;
  38. import java.util.List;
  39. import java.util.concurrent.atomic.AtomicBoolean;
  40. import java.util.stream.Collectors;
  41. /**
  42. * @author: tz
  43. * @description: 费用接口中相关功能的实现类
  44. * @create: 2024-3-1 11:45:33
  45. */
  46. @Service
  47. public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
  48. private static final Logger log = LoggerFactory.getLogger("fee");
  49. @Resource
  50. private InsOrdersService insOrdersService;
  51. @Resource
  52. private PtlAgreementProductCostsNewService ptlAgreementProductCostsNewService;
  53. @Resource
  54. private PtlAgreementUndwrtRulesAttrService ptlAgreementUndwrtRulesAttrService;
  55. @Resource
  56. private PtlAgreementProductCostsExportService ptlAgreementProductCostsExportService;
  57. @Resource
  58. private PtlAgreementProductCostsAttrLinkService ptlAgreementProductCostsAttrLinkService;
  59. @Resource
  60. private PtlAgreementUndwrtRulesNewService ptlAgreementUndwrtRulesNewService;
  61. @Resource
  62. private SysUserService sysUserService;
  63. @Resource
  64. private EsmRetailService esmRetailService;
  65. @Resource
  66. private InsFeeOrderNewService insFeeOrderNewService;
  67. @Autowired
  68. private EsmUserReferrerService esmUserReferrerService;
  69. @Autowired
  70. private SysUserAccountService sysUserAccountService;
  71. @Autowired
  72. private PtlNewCarJudgeRulesService ptlNewCarJudgeRulesService;
  73. @Autowired
  74. private PtlAgreementService ptlAgreementService;
  75. @Autowired
  76. private FeeRuleSchemeService feeRuleSchemeService;
  77. @Override
  78. public QueryOrderFeeVo queryFeeOrderInfo(String companyId) {
  79. return null;
  80. }
  81. @Override
  82. public List<QueryOrderFeeResultVo> convertOrderFeeVoData(QueryOrderFeeVo orderFeeVo) {
  83. return null;
  84. }
  85. @Override
  86. public void compareAndUpdateFeeOrderInfo(String insOrderNo, String jqCostsProportionStr, String syCostsProportionStr, String dealUser) {
  87. }
  88. /**
  89. * 校验费用因子
  90. */
  91. @Override
  92. public void verificationCostFactor(InsAreaCompany insAreaCompany, InsOrders insOrders, StringBuilder logs) {
  93. List<AgreementProductCosts> agreementProductCosts =
  94. ptlAgreementProductCostsNewService.costsGetList(insAreaCompany.getAgreementId(), insAreaCompany.getProductid());
  95. // if(agreementProductCosts == null || agreementProductCosts.size() == 0){
  96. // throw new SystemException("协议费用因子为空");
  97. // }
  98. for (int i = 0; i < agreementProductCosts.size(); i++) {
  99. if (agreementProductCosts.get(i).getPriorityLevel() == null) {
  100. agreementProductCosts.get(i).setPriorityLevel(10);
  101. }
  102. }
  103. if (!agreementProductCosts.isEmpty()) {
  104. //按优先级进行排序
  105. Collections.sort(agreementProductCosts, Comparator.comparingInt(AgreementProductCosts::getPriorityLevel));
  106. //遍历费用因子
  107. String costsId = verificationCosts(agreementProductCosts, insAreaCompany, insOrders, logs);
  108. if (costsId != null) {
  109. calcCosts(costsId, insAreaCompany);
  110. log.debug("费用因子校验通过,子订单id:" + insAreaCompany.getId() + ",费用id:" + costsId);
  111. }
  112. } else {
  113. logs.append("没有找到该协议的费用信息" + "\n");
  114. }
  115. }
  116. /**
  117. * 校验承保规则
  118. *
  119. * @param insAreaCompany
  120. * @param insOrders
  121. */
  122. @Override
  123. public void verificationRuleFactor(InsAreaCompany insAreaCompany, InsOrders insOrders) {
  124. List<PtlAgreementUndwrtRulesNew> ptlAgreementUndwrtRules =
  125. ptlAgreementUndwrtRulesNewService.rulesList(insAreaCompany.getAgreementId());
  126. verificationRules(ptlAgreementUndwrtRules, insAreaCompany, insOrders);
  127. }
  128. //BigDecimal取两位
  129. private BigDecimal twoPeople(BigDecimal number){
  130. return number.setScale(2, BigDecimal.ROUND_DOWN);
  131. }
  132. /**
  133. * 计算费用
  134. *
  135. * @param costsId
  136. * @param insAreaCompany
  137. */
  138. @Override
  139. public void calcCosts(String costsId, InsAreaCompany insAreaCompany) {
  140. //获取协议信息
  141. PtlAgreement ptlAgreement = ptlAgreementService.getById(insAreaCompany.getAgreementId());
  142. BigDecimal taxRadio = new BigDecimal("1.00");
  143. //如果是外部订单则 不含税
  144. if (ptlAgreement.getWithTax().equals("否") && ptlAgreement.getIsExternal() == 0) {
  145. taxRadio = new BigDecimal("1.06");
  146. }
  147. //税比例 固定1.06
  148. //查找入口与出口费用比例
  149. //入口配置
  150. PtlAgreementProductCostsNew ptlAgreementProductCostsNew = ptlAgreementProductCostsNewService.getById(costsId);
  151. //出口配置
  152. PtlAgreementProductCostsExport ptlAgreementProductCostsExport =
  153. ptlAgreementProductCostsExportService.getOne(new LambdaQueryWrapper<PtlAgreementProductCostsExport>().eq(PtlAgreementProductCostsExport::getCostsId, costsId));
  154. InsFeeOrderNew insFeeOrderNew = new InsFeeOrderNew();
  155. insFeeOrderNew.setId(IdGenerate.nextId());
  156. insFeeOrderNew.setCostsId(costsId);
  157. insFeeOrderNew.setAgreementId(insAreaCompany.getAgreementId());
  158. //存储部门id与用户id
  159. InsOrders order = insOrdersService.getById(insAreaCompany.getOrderno());
  160. InsFeeOrderNew insFeeOrderNewByCompanyId = insFeeOrderNewService.getInsFeeOrderNewByCompanyId(insAreaCompany.getId());
  161. if (insFeeOrderNewByCompanyId != null) {
  162. insFeeOrderNew.setId(insFeeOrderNewByCompanyId.getId());
  163. }
  164. insFeeOrderNew.setDeptId(order.getDeptid());
  165. insFeeOrderNew.setUserId(order.getUserid());
  166. insFeeOrderNew.setInsOrderNo(insAreaCompany.getId());
  167. insFeeOrderNew.setJqPremium(insAreaCompany.getJqpremium());
  168. insFeeOrderNew.setSyPremium(insAreaCompany.getSypremium());
  169. insFeeOrderNew.setNoPremium(insAreaCompany.getJypremium());
  170. //不含税
  171. BigDecimal bigDecimal = new BigDecimal("1.06");
  172. insFeeOrderNew.setJqNoTaxPremium(insAreaCompany.getJqpremium().divide(bigDecimal, 2));
  173. insFeeOrderNew.setSyNoTaxPremium(insAreaCompany.getSypremium().divide(bigDecimal, 2));
  174. insFeeOrderNew.setNoNoTaxPremium(insAreaCompany.getJypremium().divide(bigDecimal, 2));
  175. //region 计算入口费用
  176. //交强入口信息
  177. FeeOrderNewVo.EntranceFee jqEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getJqPremium(),
  178. new BigDecimal(ptlAgreementProductCostsNew.getJqCarCostsProportion()),
  179. new BigDecimal(ptlAgreementProductCostsNew.getJqCarOtherCostsProportion()), taxRadio);
  180. insFeeOrderNew.setJqCostsProportion(jqEntranceFee.getTotalProportion());
  181. insFeeOrderNew.setJqSuperviseCostsProportion(jqEntranceFee.getSuperviseCosts());
  182. insFeeOrderNew.setJqSuperviseCostsPremiums(jqEntranceFee.getSuperviseCostsPremiums());
  183. insFeeOrderNew.setJqOtherCostsProportion(jqEntranceFee.getOtherCostsProportion());
  184. insFeeOrderNew.setJqOtherCostsPremiums(jqEntranceFee.getOtherCostsPremiums());
  185. insFeeOrderNew.setJqCostsPremiums(insFeeOrderNew.getJqSuperviseCostsPremiums().add(insFeeOrderNew.getJqOtherCostsPremiums()));
  186. //商业入口信息
  187. FeeOrderNewVo.EntranceFee syEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getSyPremium(),
  188. new BigDecimal(ptlAgreementProductCostsNew.getSyCarCostsProportion()),
  189. new BigDecimal(ptlAgreementProductCostsNew.getSyCarOtherCostsProportion()), taxRadio);
  190. insFeeOrderNew.setSyCostsProportion(syEntranceFee.getTotalProportion());
  191. insFeeOrderNew.setSySuperviseCostsProportion(syEntranceFee.getSuperviseCosts());
  192. insFeeOrderNew.setSySuperviseCostsPremiums(syEntranceFee.getSuperviseCostsPremiums());
  193. insFeeOrderNew.setSyOtherCostsProportion(syEntranceFee.getOtherCostsProportion());
  194. insFeeOrderNew.setSyOtherCostsPremiums(syEntranceFee.getOtherCostsPremiums());
  195. insFeeOrderNew.setSyCostsPremiums(insFeeOrderNew.getSySuperviseCostsPremiums().add(insFeeOrderNew.getSyOtherCostsPremiums()));
  196. //非车入口信息
  197. FeeOrderNewVo.EntranceFee noEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getNoPremium(),
  198. new BigDecimal(ptlAgreementProductCostsNew.getNoCarCostsProportion()),
  199. new BigDecimal(ptlAgreementProductCostsNew.getNoCarOtherCostsProportion()), taxRadio);
  200. insFeeOrderNew.setNoCostsProportion(noEntranceFee.getTotalProportion());
  201. insFeeOrderNew.setNoSuperviseCostsProportion(noEntranceFee.getSuperviseCosts());
  202. insFeeOrderNew.setNoSuperviseCostsPremiums(noEntranceFee.getSuperviseCostsPremiums());
  203. insFeeOrderNew.setNoOtherCostsProportion(noEntranceFee.getOtherCostsProportion());
  204. insFeeOrderNew.setNoOtherCostsPremiums(noEntranceFee.getOtherCostsPremiums());
  205. insFeeOrderNew.setNoCostsPremiums(insFeeOrderNew.getNoSuperviseCostsPremiums().add(insFeeOrderNew.getNoOtherCostsPremiums()));
  206. //endregion
  207. //region 计算分销费用
  208. InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
  209. SysUser sysUser = sysUserService.findByUserId(insOrders.getUserid());
  210. //获取分销比例
  211. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ",
  212. new Object[]{sysUser.getDeptId()});
  213. //分销总比例
  214. BigDecimal retailRadio = new BigDecimal("0");
  215. if (esmRetailList != null && !esmRetailList.isEmpty()) {
  216. EsmRetail esmRetail = esmRetailList.get(0);
  217. //分销等级
  218. insFeeOrderNew.setDistributionStatus(esmRetailList.get(0).getRetailtype());
  219. //用户分销人员id
  220. List<EsmUserReferrer> parents = esmUserReferrerService.findParents(sysUser.getId());
  221. if (esmRetail != null) {
  222. BigDecimal sumPremium = insFeeOrderNew.getJqPremium().add(insFeeOrderNew.getSyPremium()).add(insFeeOrderNew.getNoPremium());
  223. if (Integer.parseInt(esmRetail.getRetailtype()) >= 3) {
  224. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(String.valueOf(esmRetail.getDisrate3())));
  225. retailRadio = retailRadio.add(insFeeOrderNew.getThirdDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  226. BigDecimal thirdDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  227. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  228. insFeeOrderNew.getSyPremium(),
  229. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  230. insFeeOrderNew.getNoPremium(),
  231. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  232. insFeeOrderNew.getThirdDetailProportion());
  233. insFeeOrderNew.setThirdDetailPremiums(thirdDetailPremiums);
  234. if (parents != null && parents.size() > 2) {
  235. insFeeOrderNew.setThreeLevelUserId(parents.get(2).getId());
  236. }
  237. }else{
  238. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(0));
  239. }
  240. if (Integer.parseInt(esmRetail.getRetailtype()) >= 2) {
  241. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(String.valueOf(esmRetail.getDisrate2())));
  242. retailRadio = retailRadio.add(insFeeOrderNew.getSecondDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  243. BigDecimal secondDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  244. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  245. insFeeOrderNew.getSyPremium(),
  246. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  247. insFeeOrderNew.getNoPremium(),
  248. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  249. insFeeOrderNew.getSecondDetailProportion());
  250. insFeeOrderNew.setSecondDetailPremiums(secondDetailPremiums);
  251. if (parents != null && parents.size() > 1) {
  252. insFeeOrderNew.setTwoLevelUserId(parents.get(1).getId());
  253. }
  254. }else{
  255. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(0));
  256. }
  257. if (Integer.parseInt(esmRetail.getRetailtype()) >= 1) {
  258. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(String.valueOf(esmRetail.getDisrate1())));
  259. retailRadio = retailRadio.add(insFeeOrderNew.getFirstDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  260. BigDecimal firstDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  261. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  262. insFeeOrderNew.getSyPremium(),
  263. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  264. insFeeOrderNew.getNoPremium(),
  265. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  266. insFeeOrderNew.getFirstDetailProportion());
  267. insFeeOrderNew.setFirstDetailPremiums(firstDetailPremiums);
  268. if (parents != null && parents.size() > 0) {
  269. insFeeOrderNew.setFirstLevelUserId(parents.get(0).getId());
  270. }
  271. }else{
  272. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(0));
  273. }
  274. }else{
  275. insFeeOrderNew.setFirstDetailPremiums(new BigDecimal(0));
  276. insFeeOrderNew.setSecondDetailPremiums(new BigDecimal(0));
  277. insFeeOrderNew.setThirdDetailPremiums(new BigDecimal(0));
  278. }
  279. }else{
  280. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(0));
  281. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(0));
  282. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(0));
  283. }
  284. //endregion
  285. //region 设置机构管理费
  286. //交强机构管理费
  287. BigDecimal jqDeptRadio =
  288. ptlAgreementProductCostsExport.getJqExportRadioLevel1().add(ptlAgreementProductCostsExport.getJqExportRadioLevel2()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel3()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel4()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel5());
  289. FeeOrderNewVo.DeptManagerFee jqDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getJqPremium(),
  290. ptlAgreementProductCostsExport.getJqExportRadioLevel1(), ptlAgreementProductCostsExport.getJqExportRadioLevel2(),
  291. ptlAgreementProductCostsExport.getJqExportRadioLevel3(), ptlAgreementProductCostsExport.getJqExportRadioLevel4(),
  292. ptlAgreementProductCostsExport.getJqExportRadioLevel5());
  293. insFeeOrderNew.setJqDeptProportionLevel1(jqDeptManagerFee.getDeptProportionLevelOne());
  294. insFeeOrderNew.setJqDeptPremiumsLevel1(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelOne()));
  295. insFeeOrderNew.setJqDeptProportionLevel2(jqDeptManagerFee.getDeptProportionLevelTwo());
  296. insFeeOrderNew.setJqDeptPremiumsLevel2(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelTwo()));
  297. insFeeOrderNew.setJqDeptProportionLevel3(jqDeptManagerFee.getDeptProportionLevelThree());
  298. insFeeOrderNew.setJqDeptPremiumsLevel3(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelThree()));
  299. insFeeOrderNew.setJqDeptProportionLevel4(jqDeptManagerFee.getDeptProportionLevelFoure());
  300. insFeeOrderNew.setJqDeptPremiumsLevel4(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelFoure()));
  301. insFeeOrderNew.setJqDeptProportionLevel5(jqDeptManagerFee.getDeptProportionLevelFive());
  302. insFeeOrderNew.setJqDeptPremiumsLevel5(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelFive()));
  303. BigDecimal syDeptRadio =
  304. ptlAgreementProductCostsExport.getSyExportRadioLevel1().add(ptlAgreementProductCostsExport.getSyExportRadioLevel2()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel3()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel4()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel5());
  305. FeeOrderNewVo.DeptManagerFee syDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getSyPremium(),
  306. ptlAgreementProductCostsExport.getSyExportRadioLevel1(), ptlAgreementProductCostsExport.getSyExportRadioLevel2(),
  307. ptlAgreementProductCostsExport.getSyExportRadioLevel3(), ptlAgreementProductCostsExport.getSyExportRadioLevel4(),
  308. ptlAgreementProductCostsExport.getSyExportRadioLevel5());
  309. insFeeOrderNew.setSyDeptProportionLevel1(syDeptManagerFee.getDeptProportionLevelOne());
  310. insFeeOrderNew.setSyDeptPremiumsLevel1(twoPeople(syDeptManagerFee.getDeptPremiumsLevelOne()));
  311. insFeeOrderNew.setSyDeptProportionLevel2(syDeptManagerFee.getDeptProportionLevelTwo());
  312. insFeeOrderNew.setSyDeptPremiumsLevel2(twoPeople(syDeptManagerFee.getDeptPremiumsLevelTwo()));
  313. insFeeOrderNew.setSyDeptProportionLevel3(syDeptManagerFee.getDeptProportionLevelThree());
  314. insFeeOrderNew.setSyDeptPremiumsLevel3(twoPeople(syDeptManagerFee.getDeptPremiumsLevelThree()));
  315. insFeeOrderNew.setSyDeptProportionLevel4(syDeptManagerFee.getDeptProportionLevelFoure());
  316. insFeeOrderNew.setSyDeptPremiumsLevel4(twoPeople(syDeptManagerFee.getDeptPremiumsLevelFoure()));
  317. insFeeOrderNew.setSyDeptProportionLevel5(syDeptManagerFee.getDeptProportionLevelFive());
  318. insFeeOrderNew.setSyDeptPremiumsLevel5(twoPeople(syDeptManagerFee.getDeptPremiumsLevelFive()));
  319. BigDecimal noDeptRadio =
  320. ptlAgreementProductCostsExport.getNoCarExportRadioLevel1().add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel2()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel3()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel4()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel5());
  321. FeeOrderNewVo.DeptManagerFee noDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getNoPremium(),
  322. ptlAgreementProductCostsExport.getNoCarExportRadioLevel1(), ptlAgreementProductCostsExport.getNoCarExportRadioLevel2(),
  323. ptlAgreementProductCostsExport.getNoCarExportRadioLevel3(), ptlAgreementProductCostsExport.getNoCarExportRadioLevel4(),
  324. ptlAgreementProductCostsExport.getNoCarExportRadioLevel5());
  325. insFeeOrderNew.setNoDeptProportionLevel1(noDeptManagerFee.getDeptProportionLevelOne());
  326. insFeeOrderNew.setNoDeptPremiumsLevel1(twoPeople(noDeptManagerFee.getDeptPremiumsLevelOne()));
  327. insFeeOrderNew.setNoDeptProportionLevel2(noDeptManagerFee.getDeptProportionLevelTwo());
  328. insFeeOrderNew.setNoDeptPremiumsLevel2(twoPeople(noDeptManagerFee.getDeptPremiumsLevelTwo()));
  329. insFeeOrderNew.setNoDeptProportionLevel3(noDeptManagerFee.getDeptProportionLevelThree());
  330. insFeeOrderNew.setNoDeptPremiumsLevel3(twoPeople(noDeptManagerFee.getDeptPremiumsLevelThree()));
  331. insFeeOrderNew.setNoDeptProportionLevel4(noDeptManagerFee.getDeptProportionLevelFoure());
  332. insFeeOrderNew.setNoDeptPremiumsLevel4(twoPeople(noDeptManagerFee.getDeptPremiumsLevelFoure()));
  333. insFeeOrderNew.setNoDeptProportionLevel5(noDeptManagerFee.getDeptProportionLevelFive());
  334. insFeeOrderNew.setNoDeptPremiumsLevel5(twoPeople(noDeptManagerFee.getDeptPremiumsLevelFive()));
  335. //endregion
  336. //region 出口费用
  337. //交强出口手续费比例
  338. FeeOrderNewVo.ExportFee jqExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getJqPremium(), new BigDecimal(ptlAgreementProductCostsNew.getJqCostsExportProportion()),
  339. insFeeOrderNew.getJqCostsProportion(), jqDeptRadio, retailRadio, taxRadio);
  340. //商业出口手续费比例
  341. FeeOrderNewVo.ExportFee syExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getSyPremium(), new BigDecimal(ptlAgreementProductCostsNew.getSyCostsExportProportion()),
  342. insFeeOrderNew.getSyCostsProportion(), syDeptRadio, retailRadio, taxRadio);
  343. //非车出口手续费比例
  344. FeeOrderNewVo.ExportFee noExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getNoPremium(), new BigDecimal(ptlAgreementProductCostsNew.getNoCostsExportProportion()),
  345. insFeeOrderNew.getNoCostsProportion(), noDeptRadio, retailRadio, taxRadio);
  346. //出口手续费用
  347. insFeeOrderNew.setJqExportSuperviseCostsPremiums(twoPeople(jqExportFee.getSuperviseCostsPremiums()));
  348. insFeeOrderNew.setSyExportSuperviseCostsPremiums(twoPeople(syExportFee.getSuperviseCostsPremiums()));
  349. insFeeOrderNew.setNoExportSuperviseCostsPremiums(twoPeople(noExportFee.getSuperviseCostsPremiums()));
  350. //出口其他费用比例
  351. insFeeOrderNew.setJqExportOtherCostsProportion(twoPeople(jqExportFee.getOtherCostsProportion()));
  352. insFeeOrderNew.setSyExportOtherCostsProportion(twoPeople(syExportFee.getOtherCostsProportion()));
  353. insFeeOrderNew.setNoExportOtherCostsProportion(twoPeople(noExportFee.getOtherCostsProportion()));
  354. //出口其他费用
  355. insFeeOrderNew.setJqExportOtherCostsPremiums(twoPeople(jqExportFee.getOtherCostsPremiums()));
  356. insFeeOrderNew.setSyExportOtherCostsPremiums(twoPeople(syExportFee.getOtherCostsPremiums()));
  357. insFeeOrderNew.setNoExportOtherCostsPremiums(twoPeople(noExportFee.getOtherCostsPremiums()));
  358. //设置出口手续费比例
  359. insFeeOrderNew.setJqCostsExportProportion(twoPeople(jqExportFee.getSuperviseCosts()));
  360. insFeeOrderNew.setSyCostsExportProportion(twoPeople(syExportFee.getSuperviseCosts()));
  361. insFeeOrderNew.setNoCostsExportProportion(twoPeople(noExportFee.getSuperviseCosts()));
  362. //endregion
  363. //region 计算利润差值
  364. //入口 - 出口 - 机构管理费 1-5级 - 分销费 = 差值
  365. //分销交强费用
  366. //分开算 1 2 3 级
  367. BigDecimal jqFirst = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  368. BigDecimal jqSecond = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  369. BigDecimal jqThird = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  370. BigDecimal jqFenXiao = jqFirst.add(jqSecond).add(jqThird);
  371. //分销商业费用
  372. BigDecimal syFirst = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  373. BigDecimal sySecond = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  374. BigDecimal syThird = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  375. BigDecimal syFenXiao = syFirst.add(sySecond).add(syThird);
  376. //分销非车费用
  377. BigDecimal noFirst = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  378. BigDecimal noSecond = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  379. BigDecimal noThird = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  380. BigDecimal noFenXiao = noFirst.add(noSecond).add(noThird);
  381. BigDecimal jqDifference = jqEntranceFee.getTotalAmount().subtract(
  382. (jqExportFee.getSuperviseCostsPremiums().add(jqExportFee.getOtherCostsPremiums())))
  383. .subtract(
  384. (jqDeptManagerFee.getDeptPremiumsLevelOne().add(jqDeptManagerFee.getDeptPremiumsLevelTwo().add(jqDeptManagerFee.getDeptPremiumsLevelThree()).add(jqDeptManagerFee.getDeptPremiumsLevelFoure()).add(jqDeptManagerFee.getDeptPremiumsLevelFive())))
  385. )
  386. .subtract(jqFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  387. insFeeOrderNew.setJqProfitMarginPremiums(jqDifference);
  388. BigDecimal syDifference = syEntranceFee.getTotalAmount().subtract(
  389. (syExportFee.getSuperviseCostsPremiums().add(syExportFee.getOtherCostsPremiums())))
  390. .subtract(
  391. (syDeptManagerFee.getDeptPremiumsLevelOne().add(syDeptManagerFee.getDeptPremiumsLevelTwo().add(syDeptManagerFee.getDeptPremiumsLevelThree()).add(syDeptManagerFee.getDeptPremiumsLevelFoure()).add(syDeptManagerFee.getDeptPremiumsLevelFive())))
  392. )
  393. .subtract(syFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  394. insFeeOrderNew.setSyProfitMarginPremiums(syDifference);
  395. BigDecimal noDifference = noEntranceFee.getTotalAmount().subtract(
  396. (noExportFee.getSuperviseCostsPremiums().add(noExportFee.getOtherCostsPremiums())))
  397. .subtract(
  398. (noDeptManagerFee.getDeptPremiumsLevelOne().add(noDeptManagerFee.getDeptPremiumsLevelTwo().add(noDeptManagerFee.getDeptPremiumsLevelThree()).add(noDeptManagerFee.getDeptPremiumsLevelFoure()).add(noDeptManagerFee.getDeptPremiumsLevelFive())))
  399. )
  400. .subtract(noFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  401. insFeeOrderNew.setNoProfitMarginPremiums(noDifference);
  402. //endregion
  403. //region 比例逆推是否等于0
  404. if(!feeRuleSchemeService.calculateProportion(jqEntranceFee,jqDeptManagerFee,jqExportFee,retailRadio,taxRadio,insFeeOrderNew.getJqPremium()))
  405. throw new SystemException("交强比例异常");
  406. if(!feeRuleSchemeService.calculateProportion(syEntranceFee,syDeptManagerFee,syExportFee,retailRadio,taxRadio,insFeeOrderNew.getSyPremium()))
  407. throw new SystemException("商业比例异常");
  408. if(!feeRuleSchemeService.calculateProportion(noEntranceFee,noDeptManagerFee,noExportFee,retailRadio,taxRadio,insFeeOrderNew.getNoPremium()))
  409. throw new SystemException("非车比例异常");
  410. //endregion
  411. insFeeOrderNewService.saveOrUpdate(insFeeOrderNew);
  412. }
  413. /**
  414. * 计算费用测试方法 没有数据库保存操作 只带入值进行计算核对
  415. * @param costsId
  416. * @param insAreaCompany
  417. */
  418. @Override
  419. public void calcCostsTest(String costsId, InsAreaCompany insAreaCompany) {
  420. //获取协议信息
  421. PtlAgreement ptlAgreement = ptlAgreementService.getById(insAreaCompany.getAgreementId());
  422. BigDecimal taxRadio = new BigDecimal("1.00");
  423. //如果是外部订单则 不含税
  424. if (ptlAgreement.getWithTax().equals("否") && ptlAgreement.getIsExternal() == 0) {
  425. taxRadio = new BigDecimal("1.06");
  426. }
  427. //税比例 固定1.06
  428. //查找入口与出口费用比例
  429. //入口配置
  430. PtlAgreementProductCostsNew ptlAgreementProductCostsNew = ptlAgreementProductCostsNewService.getById(costsId);
  431. //出口配置
  432. PtlAgreementProductCostsExport ptlAgreementProductCostsExport =
  433. ptlAgreementProductCostsExportService.getOne(new LambdaQueryWrapper<PtlAgreementProductCostsExport>().eq(PtlAgreementProductCostsExport::getCostsId, costsId));
  434. InsFeeOrderNew insFeeOrderNew = new InsFeeOrderNew();
  435. insFeeOrderNew.setId(IdGenerate.nextId());
  436. insFeeOrderNew.setCostsId(costsId);
  437. insFeeOrderNew.setAgreementId(insAreaCompany.getAgreementId());
  438. //存储部门id与用户id
  439. InsOrders order = insOrdersService.getById(insAreaCompany.getOrderno());
  440. InsFeeOrderNew insFeeOrderNewByCompanyId = insFeeOrderNewService.getInsFeeOrderNewByCompanyId(insAreaCompany.getId());
  441. if (insFeeOrderNewByCompanyId != null) {
  442. insFeeOrderNew.setId(insFeeOrderNewByCompanyId.getId());
  443. }
  444. insFeeOrderNew.setDeptId(order.getDeptid());
  445. insFeeOrderNew.setUserId(order.getUserid());
  446. insFeeOrderNew.setInsOrderNo(insAreaCompany.getId());
  447. insFeeOrderNew.setJqPremium(insAreaCompany.getJqpremium());
  448. insFeeOrderNew.setSyPremium(insAreaCompany.getSypremium());
  449. insFeeOrderNew.setNoPremium(insAreaCompany.getJypremium());
  450. //不含税
  451. BigDecimal bigDecimal = new BigDecimal("1.06");
  452. insFeeOrderNew.setJqNoTaxPremium(insAreaCompany.getJqpremium().divide(bigDecimal, 2));
  453. insFeeOrderNew.setSyNoTaxPremium(insAreaCompany.getSypremium().divide(bigDecimal, 2));
  454. insFeeOrderNew.setNoNoTaxPremium(insAreaCompany.getJypremium().divide(bigDecimal, 2));
  455. //region 计算入口费用
  456. //交强入口信息
  457. FeeOrderNewVo.EntranceFee jqEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getJqPremium(),
  458. new BigDecimal(ptlAgreementProductCostsNew.getJqCarCostsProportion()),
  459. new BigDecimal(ptlAgreementProductCostsNew.getJqCarOtherCostsProportion()), taxRadio);
  460. insFeeOrderNew.setJqCostsProportion(jqEntranceFee.getTotalProportion());
  461. insFeeOrderNew.setJqSuperviseCostsProportion(jqEntranceFee.getSuperviseCosts());
  462. insFeeOrderNew.setJqSuperviseCostsPremiums(jqEntranceFee.getSuperviseCostsPremiums());
  463. insFeeOrderNew.setJqOtherCostsProportion(jqEntranceFee.getOtherCostsProportion());
  464. insFeeOrderNew.setJqOtherCostsPremiums(jqEntranceFee.getOtherCostsPremiums());
  465. insFeeOrderNew.setJqCostsPremiums(insFeeOrderNew.getJqSuperviseCostsPremiums().add(insFeeOrderNew.getJqOtherCostsPremiums()));
  466. //商业入口信息
  467. FeeOrderNewVo.EntranceFee syEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getSyPremium(),
  468. new BigDecimal(ptlAgreementProductCostsNew.getSyCarCostsProportion()),
  469. new BigDecimal(ptlAgreementProductCostsNew.getSyCarOtherCostsProportion()), taxRadio);
  470. insFeeOrderNew.setSyCostsProportion(syEntranceFee.getTotalProportion());
  471. insFeeOrderNew.setSySuperviseCostsProportion(syEntranceFee.getSuperviseCosts());
  472. insFeeOrderNew.setSySuperviseCostsPremiums(syEntranceFee.getSuperviseCostsPremiums());
  473. insFeeOrderNew.setSyOtherCostsProportion(syEntranceFee.getOtherCostsProportion());
  474. insFeeOrderNew.setSyOtherCostsPremiums(syEntranceFee.getOtherCostsPremiums());
  475. insFeeOrderNew.setSyCostsPremiums(insFeeOrderNew.getSySuperviseCostsPremiums().add(insFeeOrderNew.getSyOtherCostsPremiums()));
  476. //非车入口信息
  477. FeeOrderNewVo.EntranceFee noEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getNoPremium(),
  478. new BigDecimal(ptlAgreementProductCostsNew.getNoCarCostsProportion()),
  479. new BigDecimal(ptlAgreementProductCostsNew.getNoCarOtherCostsProportion()), taxRadio);
  480. insFeeOrderNew.setNoCostsProportion(noEntranceFee.getTotalProportion());
  481. insFeeOrderNew.setNoSuperviseCostsProportion(noEntranceFee.getSuperviseCosts());
  482. insFeeOrderNew.setNoSuperviseCostsPremiums(noEntranceFee.getSuperviseCostsPremiums());
  483. insFeeOrderNew.setNoOtherCostsProportion(noEntranceFee.getOtherCostsProportion());
  484. insFeeOrderNew.setNoOtherCostsPremiums(noEntranceFee.getOtherCostsPremiums());
  485. insFeeOrderNew.setNoCostsPremiums(insFeeOrderNew.getNoSuperviseCostsPremiums().add(insFeeOrderNew.getNoOtherCostsPremiums()));
  486. //endregion
  487. //region 计算分销费用
  488. InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
  489. SysUser sysUser = sysUserService.findByUserId(insOrders.getUserid());
  490. //获取分销比例
  491. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ",
  492. new Object[]{sysUser.getDeptId()});
  493. //分销总比例
  494. BigDecimal retailRadio = new BigDecimal("0");
  495. if (esmRetailList != null && !esmRetailList.isEmpty()) {
  496. EsmRetail esmRetail = esmRetailList.get(0);
  497. //分销等级
  498. insFeeOrderNew.setDistributionStatus(esmRetailList.get(0).getRetailtype());
  499. //用户分销人员id
  500. List<EsmUserReferrer> parents = esmUserReferrerService.findParents(sysUser.getId());
  501. if (esmRetail != null) {
  502. BigDecimal sumPremium = insFeeOrderNew.getJqPremium().add(insFeeOrderNew.getSyPremium()).add(insFeeOrderNew.getNoPremium());
  503. if (Integer.parseInt(esmRetail.getRetailtype()) >= 3) {
  504. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(String.valueOf(esmRetail.getDisrate3())));
  505. retailRadio = retailRadio.add(insFeeOrderNew.getThirdDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  506. BigDecimal thirdDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  507. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  508. insFeeOrderNew.getSyPremium(),
  509. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  510. insFeeOrderNew.getNoPremium(),
  511. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  512. insFeeOrderNew.getThirdDetailProportion());
  513. insFeeOrderNew.setThirdDetailPremiums(thirdDetailPremiums);
  514. if (parents != null && parents.size() > 2) {
  515. insFeeOrderNew.setThreeLevelUserId(parents.get(2).getId());
  516. }
  517. }else{
  518. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(0));
  519. }
  520. if (Integer.parseInt(esmRetail.getRetailtype()) >= 2) {
  521. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(String.valueOf(esmRetail.getDisrate2())));
  522. retailRadio = retailRadio.add(insFeeOrderNew.getSecondDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  523. BigDecimal secondDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  524. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  525. insFeeOrderNew.getSyPremium(),
  526. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  527. insFeeOrderNew.getNoPremium(),
  528. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  529. insFeeOrderNew.getSecondDetailProportion());
  530. insFeeOrderNew.setSecondDetailPremiums(secondDetailPremiums);
  531. if (parents != null && parents.size() > 1) {
  532. insFeeOrderNew.setTwoLevelUserId(parents.get(1).getId());
  533. }
  534. }else{
  535. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(0));
  536. }
  537. if (Integer.parseInt(esmRetail.getRetailtype()) >= 1) {
  538. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(String.valueOf(esmRetail.getDisrate1())));
  539. retailRadio = retailRadio.add(insFeeOrderNew.getFirstDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  540. BigDecimal firstDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  541. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  542. insFeeOrderNew.getSyPremium(),
  543. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  544. insFeeOrderNew.getNoPremium(),
  545. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  546. insFeeOrderNew.getFirstDetailProportion());
  547. insFeeOrderNew.setFirstDetailPremiums(firstDetailPremiums);
  548. if (parents != null && parents.size() > 0) {
  549. insFeeOrderNew.setFirstLevelUserId(parents.get(0).getId());
  550. }
  551. }else{
  552. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(0));
  553. }
  554. }else{
  555. insFeeOrderNew.setFirstDetailPremiums(new BigDecimal(0));
  556. insFeeOrderNew.setSecondDetailPremiums(new BigDecimal(0));
  557. insFeeOrderNew.setThirdDetailPremiums(new BigDecimal(0));
  558. }
  559. }else{
  560. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(0));
  561. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(0));
  562. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(0));
  563. }
  564. //endregion
  565. //region 设置机构管理费
  566. //交强机构管理费
  567. BigDecimal jqDeptRadio =
  568. ptlAgreementProductCostsExport.getJqExportRadioLevel1().add(ptlAgreementProductCostsExport.getJqExportRadioLevel2()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel3()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel4()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel5());
  569. FeeOrderNewVo.DeptManagerFee jqDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getJqPremium(),
  570. ptlAgreementProductCostsExport.getJqExportRadioLevel1(), ptlAgreementProductCostsExport.getJqExportRadioLevel2(),
  571. ptlAgreementProductCostsExport.getJqExportRadioLevel3(), ptlAgreementProductCostsExport.getJqExportRadioLevel4(),
  572. ptlAgreementProductCostsExport.getJqExportRadioLevel5());
  573. insFeeOrderNew.setJqDeptProportionLevel1(jqDeptManagerFee.getDeptProportionLevelOne());
  574. insFeeOrderNew.setJqDeptPremiumsLevel1(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelOne()));
  575. insFeeOrderNew.setJqDeptProportionLevel2(jqDeptManagerFee.getDeptProportionLevelTwo());
  576. insFeeOrderNew.setJqDeptPremiumsLevel2(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelTwo()));
  577. insFeeOrderNew.setJqDeptProportionLevel3(jqDeptManagerFee.getDeptProportionLevelThree());
  578. insFeeOrderNew.setJqDeptPremiumsLevel3(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelThree()));
  579. insFeeOrderNew.setJqDeptProportionLevel4(jqDeptManagerFee.getDeptProportionLevelFoure());
  580. insFeeOrderNew.setJqDeptPremiumsLevel4(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelFoure()));
  581. insFeeOrderNew.setJqDeptProportionLevel5(jqDeptManagerFee.getDeptProportionLevelFive());
  582. insFeeOrderNew.setJqDeptPremiumsLevel5(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelFive()));
  583. BigDecimal syDeptRadio =
  584. ptlAgreementProductCostsExport.getSyExportRadioLevel1().add(ptlAgreementProductCostsExport.getSyExportRadioLevel2()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel3()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel4()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel5());
  585. FeeOrderNewVo.DeptManagerFee syDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getSyPremium(),
  586. ptlAgreementProductCostsExport.getSyExportRadioLevel1(), ptlAgreementProductCostsExport.getSyExportRadioLevel2(),
  587. ptlAgreementProductCostsExport.getSyExportRadioLevel3(), ptlAgreementProductCostsExport.getSyExportRadioLevel4(),
  588. ptlAgreementProductCostsExport.getSyExportRadioLevel5());
  589. insFeeOrderNew.setSyDeptProportionLevel1(syDeptManagerFee.getDeptProportionLevelOne());
  590. insFeeOrderNew.setSyDeptPremiumsLevel1(twoPeople(syDeptManagerFee.getDeptPremiumsLevelOne()));
  591. insFeeOrderNew.setSyDeptProportionLevel2(syDeptManagerFee.getDeptProportionLevelTwo());
  592. insFeeOrderNew.setSyDeptPremiumsLevel2(twoPeople(syDeptManagerFee.getDeptPremiumsLevelTwo()));
  593. insFeeOrderNew.setSyDeptProportionLevel3(syDeptManagerFee.getDeptProportionLevelThree());
  594. insFeeOrderNew.setSyDeptPremiumsLevel3(twoPeople(syDeptManagerFee.getDeptPremiumsLevelThree()));
  595. insFeeOrderNew.setSyDeptProportionLevel4(syDeptManagerFee.getDeptProportionLevelFoure());
  596. insFeeOrderNew.setSyDeptPremiumsLevel4(twoPeople(syDeptManagerFee.getDeptPremiumsLevelFoure()));
  597. insFeeOrderNew.setSyDeptProportionLevel5(syDeptManagerFee.getDeptProportionLevelFive());
  598. insFeeOrderNew.setSyDeptPremiumsLevel5(twoPeople(syDeptManagerFee.getDeptPremiumsLevelFive()));
  599. BigDecimal noDeptRadio =
  600. ptlAgreementProductCostsExport.getNoCarExportRadioLevel1().add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel2()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel3()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel4()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel5());
  601. FeeOrderNewVo.DeptManagerFee noDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getNoPremium(),
  602. ptlAgreementProductCostsExport.getNoCarExportRadioLevel1(), ptlAgreementProductCostsExport.getNoCarExportRadioLevel2(),
  603. ptlAgreementProductCostsExport.getNoCarExportRadioLevel3(), ptlAgreementProductCostsExport.getNoCarExportRadioLevel4(),
  604. ptlAgreementProductCostsExport.getNoCarExportRadioLevel5());
  605. insFeeOrderNew.setNoDeptProportionLevel1(noDeptManagerFee.getDeptProportionLevelOne());
  606. insFeeOrderNew.setNoDeptPremiumsLevel1(twoPeople(noDeptManagerFee.getDeptPremiumsLevelOne()));
  607. insFeeOrderNew.setNoDeptProportionLevel2(noDeptManagerFee.getDeptProportionLevelTwo());
  608. insFeeOrderNew.setNoDeptPremiumsLevel2(twoPeople(noDeptManagerFee.getDeptPremiumsLevelTwo()));
  609. insFeeOrderNew.setNoDeptProportionLevel3(noDeptManagerFee.getDeptProportionLevelThree());
  610. insFeeOrderNew.setNoDeptPremiumsLevel3(twoPeople(noDeptManagerFee.getDeptPremiumsLevelThree()));
  611. insFeeOrderNew.setNoDeptProportionLevel4(noDeptManagerFee.getDeptProportionLevelFoure());
  612. insFeeOrderNew.setNoDeptPremiumsLevel4(twoPeople(noDeptManagerFee.getDeptPremiumsLevelFoure()));
  613. insFeeOrderNew.setNoDeptProportionLevel5(noDeptManagerFee.getDeptProportionLevelFive());
  614. insFeeOrderNew.setNoDeptPremiumsLevel5(twoPeople(noDeptManagerFee.getDeptPremiumsLevelFive()));
  615. //endregion
  616. //region 出口费用
  617. //交强出口手续费比例
  618. FeeOrderNewVo.ExportFee jqExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getJqPremium(), new BigDecimal(ptlAgreementProductCostsNew.getJqCostsExportProportion()),
  619. insFeeOrderNew.getJqCostsProportion(), jqDeptRadio, retailRadio, taxRadio);
  620. //商业出口手续费比例
  621. FeeOrderNewVo.ExportFee syExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getSyPremium(), new BigDecimal(ptlAgreementProductCostsNew.getSyCostsExportProportion()),
  622. insFeeOrderNew.getSyCostsProportion(), syDeptRadio, retailRadio, taxRadio);
  623. //非车出口手续费比例
  624. FeeOrderNewVo.ExportFee noExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getNoPremium(), new BigDecimal(ptlAgreementProductCostsNew.getNoCostsExportProportion()),
  625. insFeeOrderNew.getNoCostsProportion(), noDeptRadio, retailRadio, taxRadio);
  626. //出口手续费用
  627. insFeeOrderNew.setJqExportSuperviseCostsPremiums(twoPeople(jqExportFee.getSuperviseCostsPremiums()));
  628. insFeeOrderNew.setSyExportSuperviseCostsPremiums(twoPeople(syExportFee.getSuperviseCostsPremiums()));
  629. insFeeOrderNew.setNoExportSuperviseCostsPremiums(twoPeople(noExportFee.getSuperviseCostsPremiums()));
  630. //出口其他费用比例
  631. insFeeOrderNew.setJqExportOtherCostsProportion(twoPeople(jqExportFee.getOtherCostsProportion()));
  632. insFeeOrderNew.setSyExportOtherCostsProportion(twoPeople(syExportFee.getOtherCostsProportion()));
  633. insFeeOrderNew.setNoExportOtherCostsProportion(twoPeople(noExportFee.getOtherCostsProportion()));
  634. //出口其他费用
  635. insFeeOrderNew.setJqExportOtherCostsPremiums(twoPeople(jqExportFee.getOtherCostsPremiums()));
  636. insFeeOrderNew.setSyExportOtherCostsPremiums(twoPeople(syExportFee.getOtherCostsPremiums()));
  637. insFeeOrderNew.setNoExportOtherCostsPremiums(twoPeople(noExportFee.getOtherCostsPremiums()));
  638. //设置出口手续费比例
  639. insFeeOrderNew.setJqCostsExportProportion(twoPeople(jqExportFee.getSuperviseCosts()));
  640. insFeeOrderNew.setSyCostsExportProportion(twoPeople(syExportFee.getSuperviseCosts()));
  641. insFeeOrderNew.setNoCostsExportProportion(twoPeople(noExportFee.getSuperviseCosts()));
  642. //endregion
  643. //region 计算利润差值
  644. //入口 - 出口 - 机构管理费 1-5级 - 分销费 = 差值
  645. //分销交强费用
  646. //分开算 1 2 3 级
  647. BigDecimal jqFirst = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  648. BigDecimal jqSecond = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  649. BigDecimal jqThird = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  650. BigDecimal jqFenXiao = jqFirst.add(jqSecond).add(jqThird);
  651. //分销商业费用
  652. BigDecimal syFirst = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  653. BigDecimal sySecond = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  654. BigDecimal syThird = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  655. BigDecimal syFenXiao = syFirst.add(sySecond).add(syThird);
  656. //分销非车费用
  657. BigDecimal noFirst = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  658. BigDecimal noSecond = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  659. BigDecimal noThird = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  660. BigDecimal noFenXiao = noFirst.add(noSecond).add(noThird);
  661. BigDecimal jqDifference = jqEntranceFee.getTotalAmount().subtract(
  662. (jqExportFee.getSuperviseCostsPremiums().add(jqExportFee.getOtherCostsPremiums())))
  663. .subtract(
  664. (jqDeptManagerFee.getDeptPremiumsLevelOne().add(jqDeptManagerFee.getDeptPremiumsLevelTwo().add(jqDeptManagerFee.getDeptPremiumsLevelThree()).add(jqDeptManagerFee.getDeptPremiumsLevelFoure()).add(jqDeptManagerFee.getDeptPremiumsLevelFive())))
  665. )
  666. .subtract(jqFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  667. insFeeOrderNew.setJqProfitMarginPremiums(jqDifference);
  668. BigDecimal syDifference = syEntranceFee.getTotalAmount().subtract(
  669. (syExportFee.getSuperviseCostsPremiums().add(syExportFee.getOtherCostsPremiums())))
  670. .subtract(
  671. (syDeptManagerFee.getDeptPremiumsLevelOne().add(syDeptManagerFee.getDeptPremiumsLevelTwo().add(syDeptManagerFee.getDeptPremiumsLevelThree()).add(syDeptManagerFee.getDeptPremiumsLevelFoure()).add(syDeptManagerFee.getDeptPremiumsLevelFive())))
  672. )
  673. .subtract(syFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  674. insFeeOrderNew.setSyProfitMarginPremiums(syDifference);
  675. BigDecimal noDifference = noEntranceFee.getTotalAmount().subtract(
  676. (noExportFee.getSuperviseCostsPremiums().add(noExportFee.getOtherCostsPremiums())))
  677. .subtract(
  678. (noDeptManagerFee.getDeptPremiumsLevelOne().add(noDeptManagerFee.getDeptPremiumsLevelTwo().add(noDeptManagerFee.getDeptPremiumsLevelThree()).add(noDeptManagerFee.getDeptPremiumsLevelFoure()).add(noDeptManagerFee.getDeptPremiumsLevelFive())))
  679. )
  680. .subtract(noFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  681. insFeeOrderNew.setNoProfitMarginPremiums(noDifference);
  682. //endregion
  683. //region 比例逆推是否等于0
  684. if(!feeRuleSchemeService.calculateProportion(jqEntranceFee,jqDeptManagerFee,jqExportFee,retailRadio,taxRadio,insFeeOrderNew.getJqPremium()))
  685. throw new SystemException("交强比例异常");
  686. if(!feeRuleSchemeService.calculateProportion(syEntranceFee,syDeptManagerFee,syExportFee,retailRadio,taxRadio,insFeeOrderNew.getSyPremium()))
  687. throw new SystemException("商业比例异常");
  688. if(!feeRuleSchemeService.calculateProportion(noEntranceFee,noDeptManagerFee,noExportFee,retailRadio,taxRadio,insFeeOrderNew.getNoPremium()))
  689. throw new SystemException("非车比例异常");
  690. //endregion
  691. // insFeeOrderNewService.saveOrUpdate(insFeeOrderNew);
  692. }
  693. @Override
  694. public void calcCostsExternal(PtlAgreementProductCostsNew ptlAgreementProductCostsNew, InsAreaCompany insAreaCompany) {
  695. //获取协议信息
  696. PtlAgreement ptlAgreement = ptlAgreementService.getById(insAreaCompany.getAgreementId());
  697. BigDecimal taxRadio = new BigDecimal("1.00");
  698. //如果是外部订单则 不含税
  699. if (ptlAgreement.getWithTax().equals("否") && ptlAgreement.getIsExternal() == 0) {
  700. taxRadio = new BigDecimal("1.06");
  701. }
  702. //税比例 固定1.06
  703. //查找入口与出口费用比例
  704. //出口配置
  705. PtlAgreementProductCostsExport ptlAgreementProductCostsExport =
  706. ptlAgreementProductCostsExportService.getOne(new LambdaQueryWrapper<PtlAgreementProductCostsExport>().eq(PtlAgreementProductCostsExport::getCostsId, ptlAgreementProductCostsNew.getId()));
  707. InsFeeOrderNew insFeeOrderNew = new InsFeeOrderNew();
  708. insFeeOrderNew.setId(IdGenerate.nextId());
  709. insFeeOrderNew.setCostsId(ptlAgreementProductCostsNew.getId());
  710. insFeeOrderNew.setAgreementId(insAreaCompany.getAgreementId());
  711. //存储部门id与用户id
  712. InsOrders order = insOrdersService.getById(insAreaCompany.getOrderno());
  713. InsFeeOrderNew insFeeOrderNewByCompanyId = insFeeOrderNewService.getInsFeeOrderNewByCompanyId(insAreaCompany.getId());
  714. if (insFeeOrderNewByCompanyId != null) {
  715. insFeeOrderNew.setId(insFeeOrderNewByCompanyId.getId());
  716. }
  717. insFeeOrderNew.setDeptId(order.getDeptid());
  718. insFeeOrderNew.setUserId(order.getUserid());
  719. insFeeOrderNew.setInsOrderNo(insAreaCompany.getId());
  720. insFeeOrderNew.setJqPremium(insAreaCompany.getJqpremium());
  721. insFeeOrderNew.setSyPremium(insAreaCompany.getSypremium());
  722. insFeeOrderNew.setNoPremium(insAreaCompany.getJypremium());
  723. //不含税
  724. BigDecimal bigDecimal = new BigDecimal("1.06");
  725. insFeeOrderNew.setJqNoTaxPremium(insAreaCompany.getJqpremium().divide(bigDecimal, 2));
  726. insFeeOrderNew.setSyNoTaxPremium(insAreaCompany.getSypremium().divide(bigDecimal, 2));
  727. insFeeOrderNew.setNoNoTaxPremium(insAreaCompany.getJypremium().divide(bigDecimal, 2));
  728. //region 计算入口费用
  729. //交强入口信息
  730. FeeOrderNewVo.EntranceFee jqEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getJqPremium(),
  731. new BigDecimal(ptlAgreementProductCostsNew.getJqCarCostsProportion()),
  732. new BigDecimal(ptlAgreementProductCostsNew.getJqCarOtherCostsProportion()), taxRadio);
  733. insFeeOrderNew.setJqCostsProportion(jqEntranceFee.getTotalProportion());
  734. insFeeOrderNew.setJqSuperviseCostsProportion(jqEntranceFee.getSuperviseCosts());
  735. insFeeOrderNew.setJqSuperviseCostsPremiums(jqEntranceFee.getSuperviseCostsPremiums());
  736. insFeeOrderNew.setJqOtherCostsProportion(jqEntranceFee.getOtherCostsProportion());
  737. insFeeOrderNew.setJqOtherCostsPremiums(jqEntranceFee.getOtherCostsPremiums());
  738. insFeeOrderNew.setJqCostsPremiums(insFeeOrderNew.getJqSuperviseCostsPremiums().add(insFeeOrderNew.getJqOtherCostsPremiums()));
  739. //商业入口信息
  740. FeeOrderNewVo.EntranceFee syEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getSyPremium(),
  741. new BigDecimal(ptlAgreementProductCostsNew.getSyCarCostsProportion()),
  742. new BigDecimal(ptlAgreementProductCostsNew.getSyCarOtherCostsProportion()), taxRadio);
  743. insFeeOrderNew.setSyCostsProportion(syEntranceFee.getTotalProportion());
  744. insFeeOrderNew.setSySuperviseCostsProportion(syEntranceFee.getSuperviseCosts());
  745. insFeeOrderNew.setSySuperviseCostsPremiums(syEntranceFee.getSuperviseCostsPremiums());
  746. insFeeOrderNew.setSyOtherCostsProportion(syEntranceFee.getOtherCostsProportion());
  747. insFeeOrderNew.setSyOtherCostsPremiums(syEntranceFee.getOtherCostsPremiums());
  748. insFeeOrderNew.setSyCostsPremiums(insFeeOrderNew.getSySuperviseCostsPremiums().add(insFeeOrderNew.getSyOtherCostsPremiums()));
  749. //非车入口信息
  750. FeeOrderNewVo.EntranceFee noEntranceFee = feeRuleSchemeService.calcEntranceFee(insFeeOrderNew.getNoPremium(),
  751. new BigDecimal(ptlAgreementProductCostsNew.getNoCarCostsProportion()),
  752. new BigDecimal(ptlAgreementProductCostsNew.getNoCarOtherCostsProportion()), taxRadio);
  753. insFeeOrderNew.setNoCostsProportion(noEntranceFee.getTotalProportion());
  754. insFeeOrderNew.setNoSuperviseCostsProportion(noEntranceFee.getSuperviseCosts());
  755. insFeeOrderNew.setNoSuperviseCostsPremiums(noEntranceFee.getSuperviseCostsPremiums());
  756. insFeeOrderNew.setNoOtherCostsProportion(noEntranceFee.getOtherCostsProportion());
  757. insFeeOrderNew.setNoOtherCostsPremiums(noEntranceFee.getOtherCostsPremiums());
  758. insFeeOrderNew.setNoCostsPremiums(insFeeOrderNew.getNoSuperviseCostsPremiums().add(insFeeOrderNew.getNoOtherCostsPremiums()));
  759. //endregion
  760. //region 计算分销费用
  761. InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
  762. SysUser sysUser = sysUserService.findByUserId(insOrders.getUserid());
  763. //获取分销比例
  764. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ",
  765. new Object[]{sysUser.getDeptId()});
  766. //分销总比例
  767. BigDecimal retailRadio = new BigDecimal("0");
  768. if (esmRetailList != null && !esmRetailList.isEmpty()) {
  769. EsmRetail esmRetail = esmRetailList.get(0);
  770. //分销等级
  771. insFeeOrderNew.setDistributionStatus(esmRetailList.get(0).getRetailtype());
  772. //用户分销人员id
  773. List<EsmUserReferrer> parents = esmUserReferrerService.findParents(sysUser.getId());
  774. if (esmRetail != null) {
  775. BigDecimal sumPremium = insFeeOrderNew.getJqPremium().add(insFeeOrderNew.getSyPremium()).add(insFeeOrderNew.getNoPremium());
  776. if (Integer.parseInt(esmRetail.getRetailtype()) >= 3) {
  777. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  778. retailRadio = retailRadio.add(insFeeOrderNew.getThirdDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  779. BigDecimal thirdDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  780. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  781. insFeeOrderNew.getSyPremium(),
  782. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  783. insFeeOrderNew.getNoPremium(),
  784. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  785. insFeeOrderNew.getThirdDetailProportion());
  786. insFeeOrderNew.setThirdDetailPremiums(thirdDetailPremiums);
  787. if (parents != null && parents.size() > 2) {
  788. insFeeOrderNew.setThreeLevelUserId(parents.get(2).getId());
  789. }
  790. }else{
  791. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(0));
  792. }
  793. if (Integer.parseInt(esmRetail.getRetailtype()) >= 2) {
  794. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  795. retailRadio = retailRadio.add(insFeeOrderNew.getSecondDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  796. BigDecimal secondDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  797. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  798. insFeeOrderNew.getSyPremium(),
  799. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  800. insFeeOrderNew.getNoPremium(),
  801. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  802. insFeeOrderNew.getSecondDetailProportion());
  803. insFeeOrderNew.setSecondDetailPremiums(secondDetailPremiums);
  804. if (parents != null && parents.size() > 1) {
  805. insFeeOrderNew.setTwoLevelUserId(parents.get(1).getId());
  806. }
  807. }else{
  808. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(0));
  809. }
  810. if (Integer.parseInt(esmRetail.getRetailtype()) >= 1) {
  811. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  812. retailRadio = retailRadio.add(insFeeOrderNew.getFirstDetailProportion()).setScale(2, BigDecimal.ROUND_DOWN);
  813. BigDecimal firstDetailPremiums = feeRuleSchemeService.calcRetail(insFeeOrderNew.getJqPremium(),
  814. insFeeOrderNew.getJqCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()),
  815. insFeeOrderNew.getSyPremium(),
  816. insFeeOrderNew.getSyCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()),
  817. insFeeOrderNew.getNoPremium(),
  818. insFeeOrderNew.getNoCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()),
  819. insFeeOrderNew.getFirstDetailProportion());
  820. insFeeOrderNew.setFirstDetailPremiums(firstDetailPremiums);
  821. if (parents != null && parents.size() > 0) {
  822. insFeeOrderNew.setFirstLevelUserId(parents.get(0).getId());
  823. }
  824. }else{
  825. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(0));
  826. }
  827. }else{
  828. insFeeOrderNew.setFirstDetailPremiums(new BigDecimal(0));
  829. insFeeOrderNew.setSecondDetailPremiums(new BigDecimal(0));
  830. insFeeOrderNew.setThirdDetailPremiums(new BigDecimal(0));
  831. }
  832. }else{
  833. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(0));
  834. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(0));
  835. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(0));
  836. }
  837. //endregion
  838. //region 设置机构管理费
  839. //交强机构管理费
  840. BigDecimal jqDeptRadio =
  841. ptlAgreementProductCostsExport.getJqExportRadioLevel1().add(ptlAgreementProductCostsExport.getJqExportRadioLevel2()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel3()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel4()).add(ptlAgreementProductCostsExport.getJqExportRadioLevel5());
  842. FeeOrderNewVo.DeptManagerFee jqDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getJqPremium(),
  843. ptlAgreementProductCostsExport.getJqExportRadioLevel1(), ptlAgreementProductCostsExport.getJqExportRadioLevel2(),
  844. ptlAgreementProductCostsExport.getJqExportRadioLevel3(), ptlAgreementProductCostsExport.getJqExportRadioLevel4(),
  845. ptlAgreementProductCostsExport.getJqExportRadioLevel5());
  846. insFeeOrderNew.setJqDeptProportionLevel1(jqDeptManagerFee.getDeptProportionLevelOne());
  847. insFeeOrderNew.setJqDeptPremiumsLevel1(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelOne()));
  848. insFeeOrderNew.setJqDeptProportionLevel2(jqDeptManagerFee.getDeptProportionLevelTwo());
  849. insFeeOrderNew.setJqDeptPremiumsLevel2(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelTwo()));
  850. insFeeOrderNew.setJqDeptProportionLevel3(jqDeptManagerFee.getDeptProportionLevelThree());
  851. insFeeOrderNew.setJqDeptPremiumsLevel3(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelThree()));
  852. insFeeOrderNew.setJqDeptProportionLevel4(jqDeptManagerFee.getDeptProportionLevelFoure());
  853. insFeeOrderNew.setJqDeptPremiumsLevel4(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelFoure()));
  854. insFeeOrderNew.setJqDeptProportionLevel5(jqDeptManagerFee.getDeptProportionLevelFive());
  855. insFeeOrderNew.setJqDeptPremiumsLevel5(twoPeople(jqDeptManagerFee.getDeptPremiumsLevelFive()));
  856. BigDecimal syDeptRadio =
  857. ptlAgreementProductCostsExport.getSyExportRadioLevel1().add(ptlAgreementProductCostsExport.getSyExportRadioLevel2()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel3()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel4()).add(ptlAgreementProductCostsExport.getSyExportRadioLevel5());
  858. FeeOrderNewVo.DeptManagerFee syDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getSyPremium(),
  859. ptlAgreementProductCostsExport.getSyExportRadioLevel1(), ptlAgreementProductCostsExport.getSyExportRadioLevel2(),
  860. ptlAgreementProductCostsExport.getSyExportRadioLevel3(), ptlAgreementProductCostsExport.getSyExportRadioLevel4(),
  861. ptlAgreementProductCostsExport.getSyExportRadioLevel5());
  862. insFeeOrderNew.setSyDeptProportionLevel1(syDeptManagerFee.getDeptProportionLevelOne());
  863. insFeeOrderNew.setSyDeptPremiumsLevel1(twoPeople(syDeptManagerFee.getDeptPremiumsLevelOne()));
  864. insFeeOrderNew.setSyDeptProportionLevel2(syDeptManagerFee.getDeptProportionLevelTwo());
  865. insFeeOrderNew.setSyDeptPremiumsLevel2(twoPeople(syDeptManagerFee.getDeptPremiumsLevelTwo()));
  866. insFeeOrderNew.setSyDeptProportionLevel3(syDeptManagerFee.getDeptProportionLevelThree());
  867. insFeeOrderNew.setSyDeptPremiumsLevel3(twoPeople(syDeptManagerFee.getDeptPremiumsLevelThree()));
  868. insFeeOrderNew.setSyDeptProportionLevel4(syDeptManagerFee.getDeptProportionLevelFoure());
  869. insFeeOrderNew.setSyDeptPremiumsLevel4(twoPeople(syDeptManagerFee.getDeptPremiumsLevelFoure()));
  870. insFeeOrderNew.setSyDeptProportionLevel5(syDeptManagerFee.getDeptProportionLevelFive());
  871. insFeeOrderNew.setSyDeptPremiumsLevel5(twoPeople(syDeptManagerFee.getDeptPremiumsLevelFive()));
  872. BigDecimal noDeptRadio =
  873. ptlAgreementProductCostsExport.getNoCarExportRadioLevel1().add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel2()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel3()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel4()).add(ptlAgreementProductCostsExport.getNoCarExportRadioLevel5());
  874. FeeOrderNewVo.DeptManagerFee noDeptManagerFee = feeRuleSchemeService.calcDeptManagerFee(insFeeOrderNew.getNoPremium(),
  875. ptlAgreementProductCostsExport.getNoCarExportRadioLevel1(), ptlAgreementProductCostsExport.getNoCarExportRadioLevel2(),
  876. ptlAgreementProductCostsExport.getNoCarExportRadioLevel3(), ptlAgreementProductCostsExport.getNoCarExportRadioLevel4(),
  877. ptlAgreementProductCostsExport.getNoCarExportRadioLevel5());
  878. insFeeOrderNew.setNoDeptProportionLevel1(noDeptManagerFee.getDeptProportionLevelOne());
  879. insFeeOrderNew.setNoDeptPremiumsLevel1(twoPeople(noDeptManagerFee.getDeptPremiumsLevelOne()));
  880. insFeeOrderNew.setNoDeptProportionLevel2(noDeptManagerFee.getDeptProportionLevelTwo());
  881. insFeeOrderNew.setNoDeptPremiumsLevel2(twoPeople(noDeptManagerFee.getDeptPremiumsLevelTwo()));
  882. insFeeOrderNew.setNoDeptProportionLevel3(noDeptManagerFee.getDeptProportionLevelThree());
  883. insFeeOrderNew.setNoDeptPremiumsLevel3(twoPeople(noDeptManagerFee.getDeptPremiumsLevelThree()));
  884. insFeeOrderNew.setNoDeptProportionLevel4(noDeptManagerFee.getDeptProportionLevelFoure());
  885. insFeeOrderNew.setNoDeptPremiumsLevel4(twoPeople(noDeptManagerFee.getDeptPremiumsLevelFoure()));
  886. insFeeOrderNew.setNoDeptProportionLevel5(noDeptManagerFee.getDeptProportionLevelFive());
  887. insFeeOrderNew.setNoDeptPremiumsLevel5(twoPeople(noDeptManagerFee.getDeptPremiumsLevelFive()));
  888. //endregion
  889. //region 出口费用
  890. //交强出口手续费比例
  891. FeeOrderNewVo.ExportFee jqExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getJqPremium(), new BigDecimal(ptlAgreementProductCostsNew.getJqCostsExportProportion()),
  892. insFeeOrderNew.getJqCostsProportion(), jqDeptRadio, retailRadio, taxRadio);
  893. //商业出口手续费比例
  894. FeeOrderNewVo.ExportFee syExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getSyPremium(), new BigDecimal(ptlAgreementProductCostsNew.getSyCostsExportProportion()),
  895. insFeeOrderNew.getSyCostsProportion(), syDeptRadio, retailRadio, taxRadio);
  896. //非车出口手续费比例
  897. FeeOrderNewVo.ExportFee noExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getNoPremium(), new BigDecimal(ptlAgreementProductCostsNew.getNoCostsExportProportion()),
  898. insFeeOrderNew.getNoCostsProportion(), noDeptRadio, retailRadio, taxRadio);
  899. //出口手续费用
  900. insFeeOrderNew.setJqExportSuperviseCostsPremiums(twoPeople(jqExportFee.getSuperviseCostsPremiums()));
  901. insFeeOrderNew.setSyExportSuperviseCostsPremiums(twoPeople(syExportFee.getSuperviseCostsPremiums()));
  902. insFeeOrderNew.setNoExportSuperviseCostsPremiums(twoPeople(noExportFee.getSuperviseCostsPremiums()));
  903. //出口其他费用比例
  904. insFeeOrderNew.setJqExportOtherCostsProportion(twoPeople(jqExportFee.getOtherCostsProportion()));
  905. insFeeOrderNew.setSyExportOtherCostsProportion(twoPeople(syExportFee.getOtherCostsProportion()));
  906. insFeeOrderNew.setNoExportOtherCostsProportion(twoPeople(noExportFee.getOtherCostsProportion()));
  907. //出口其他费用
  908. insFeeOrderNew.setJqExportOtherCostsPremiums(twoPeople(jqExportFee.getOtherCostsPremiums()));
  909. insFeeOrderNew.setSyExportOtherCostsPremiums(twoPeople(syExportFee.getOtherCostsPremiums()));
  910. insFeeOrderNew.setNoExportOtherCostsPremiums(twoPeople(noExportFee.getOtherCostsPremiums()));
  911. //设置出口手续费比例
  912. insFeeOrderNew.setJqCostsExportProportion(twoPeople(jqExportFee.getSuperviseCosts()));
  913. insFeeOrderNew.setSyCostsExportProportion(twoPeople(syExportFee.getSuperviseCosts()));
  914. insFeeOrderNew.setNoCostsExportProportion(twoPeople(noExportFee.getSuperviseCosts()));
  915. //endregion
  916. //region 计算利润差值
  917. //入口 - 出口 - 机构管理费 1-5级 - 分销费 = 差值
  918. //分销交强费用
  919. //分开算 1 2 3 级
  920. BigDecimal jqFirst = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  921. BigDecimal jqSecond = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  922. BigDecimal jqThird = insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  923. BigDecimal jqFenXiao = jqFirst.add(jqSecond).add(jqThird);
  924. //分销商业费用
  925. BigDecimal syFirst = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  926. BigDecimal sySecond = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  927. BigDecimal syThird = insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  928. BigDecimal syFenXiao = syFirst.add(sySecond).add(syThird);
  929. //分销非车费用
  930. BigDecimal noFirst = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getFirstDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  931. BigDecimal noSecond = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getSecondDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  932. BigDecimal noThird = insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getThirdDetailProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN);
  933. BigDecimal noFenXiao = noFirst.add(noSecond).add(noThird);
  934. BigDecimal jqDifference = jqEntranceFee.getTotalAmount().subtract(
  935. (jqExportFee.getSuperviseCostsPremiums().add(jqExportFee.getOtherCostsPremiums())))
  936. .subtract(
  937. (jqDeptManagerFee.getDeptPremiumsLevelOne().add(jqDeptManagerFee.getDeptPremiumsLevelTwo().add(jqDeptManagerFee.getDeptPremiumsLevelThree()).add(jqDeptManagerFee.getDeptPremiumsLevelFoure()).add(jqDeptManagerFee.getDeptPremiumsLevelFive())))
  938. )
  939. .subtract(jqFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  940. insFeeOrderNew.setJqProfitMarginPremiums(jqDifference);
  941. BigDecimal syDifference = syEntranceFee.getTotalAmount().subtract(
  942. (syExportFee.getSuperviseCostsPremiums().add(syExportFee.getOtherCostsPremiums())))
  943. .subtract(
  944. (syDeptManagerFee.getDeptPremiumsLevelOne().add(syDeptManagerFee.getDeptPremiumsLevelTwo().add(syDeptManagerFee.getDeptPremiumsLevelThree()).add(syDeptManagerFee.getDeptPremiumsLevelFoure()).add(syDeptManagerFee.getDeptPremiumsLevelFive())))
  945. )
  946. .subtract(syFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  947. insFeeOrderNew.setSyProfitMarginPremiums(syDifference);
  948. BigDecimal noDifference = noEntranceFee.getTotalAmount().subtract(
  949. (noExportFee.getSuperviseCostsPremiums().add(noExportFee.getOtherCostsPremiums())))
  950. .subtract(
  951. (noDeptManagerFee.getDeptPremiumsLevelOne().add(noDeptManagerFee.getDeptPremiumsLevelTwo().add(noDeptManagerFee.getDeptPremiumsLevelThree()).add(noDeptManagerFee.getDeptPremiumsLevelFoure()).add(noDeptManagerFee.getDeptPremiumsLevelFive())))
  952. )
  953. .subtract(noFenXiao).setScale(5, BigDecimal.ROUND_HALF_DOWN);
  954. insFeeOrderNew.setNoProfitMarginPremiums(noDifference);
  955. //endregion
  956. //region 比例逆推是否等于0
  957. if(!feeRuleSchemeService.calculateProportion(jqEntranceFee,jqDeptManagerFee,jqExportFee,retailRadio,taxRadio,insFeeOrderNew.getJqPremium()))
  958. throw new SystemException("交强比例异常");
  959. if(!feeRuleSchemeService.calculateProportion(syEntranceFee,syDeptManagerFee,syExportFee,retailRadio,taxRadio,insFeeOrderNew.getSyPremium()))
  960. throw new SystemException("商业比例异常");
  961. if(!feeRuleSchemeService.calculateProportion(noEntranceFee,noDeptManagerFee,noExportFee,retailRadio,taxRadio,insFeeOrderNew.getNoPremium()))
  962. throw new SystemException("非车比例异常");
  963. //endregion
  964. insFeeOrderNewService.saveOrUpdate(insFeeOrderNew);
  965. }
  966. /**
  967. * 判断是否包含非车险
  968. *
  969. * @param insAreaCompany
  970. * @return
  971. */
  972. private boolean isContainNonCar(InsAreaCompany insAreaCompany) {
  973. if (insAreaCompany.getCrossInsurance() != null && insAreaCompany.getJypremium().equals(BigDecimal.ZERO)) {
  974. return false;
  975. }
  976. return true;
  977. }
  978. /**
  979. * 匹配费用因子
  980. *
  981. * @param agreementProductCosts
  982. * @param insAreaCompany
  983. * @param insOrders
  984. * @return
  985. */
  986. private String verificationCosts(List<AgreementProductCosts> agreementProductCosts, InsAreaCompany insAreaCompany,
  987. InsOrders insOrders, StringBuilder logs) {
  988. //匹配费用因子
  989. //获取所有费用属性
  990. List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = ptlAgreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
  991. //获取新旧车信息
  992. PtlNewCarJudgeRules carJudgeRule = getCarJudgeRule(insAreaCompany.getCompanyId());
  993. //获取所有费用属性关联
  994. List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(insAreaCompany, insOrders,
  995. undwrtRulesAttrList, carJudgeRule);
  996. for (int i = 0; i < agreementProductCosts.size(); i++) {
  997. //判断是否匹配
  998. log.debug("费用因子匹配开始:" + agreementProductCosts.get(i).getId());
  999. log.debug("车牌号:" + insOrders.getLicenseno());
  1000. log.debug("费用因子备注:" + agreementProductCosts.get(i).getCostsDescription());
  1001. logs.append("费用id:" + agreementProductCosts.get(i).getId() + "\n");
  1002. logs.append("费用因子描述:" + agreementProductCosts.get(i).getCostsDescription() + "\n");
  1003. if (judgements(agreementProductCosts.get(i).getCostsAttrLinks(), undwrtRulesAttrList, ruleAttrMappingVoList, logs)) {
  1004. //返回 费用id 如果需要匹配非车的情况 将返回值返回list 后赛选
  1005. return agreementProductCosts.get(i).getId();
  1006. }
  1007. log.debug("当前费用因子匹配结束\n");
  1008. }
  1009. return null;
  1010. // throw new SystemException("费用因子匹配失败");
  1011. }
  1012. private boolean verificationRules(List<PtlAgreementUndwrtRulesNew> ptlAgreementUndwrtRulesNews, InsAreaCompany insAreaCompany,
  1013. InsOrders insOrders) {
  1014. StringBuilder logs = new StringBuilder();
  1015. //匹配承保规则
  1016. //获取所有承保规则属性
  1017. List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = ptlAgreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
  1018. //获取所有费用属性关联
  1019. List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(insAreaCompany, insOrders,
  1020. undwrtRulesAttrList, getCarJudgeRule(insAreaCompany.getCompanyId()));
  1021. for (int i = 0; i < ptlAgreementUndwrtRulesNews.size(); i++) {
  1022. //判断是否匹配
  1023. if (!judgementsRules(ptlAgreementUndwrtRulesNews.get(i).getRulesAttrList(), undwrtRulesAttrList, ruleAttrMappingVoList, logs)) {
  1024. throw new SystemException(logs.toString());
  1025. }
  1026. }
  1027. return true;
  1028. }
  1029. /**
  1030. * 费用因子的对比
  1031. *
  1032. * @param ptlAgreementProductCostsAttrLinks 费用因子范围规则
  1033. * @param rulesAttrs 费用因子属性
  1034. * @param ruleAttrMappingVoList 表单提交的值
  1035. * @return
  1036. */
  1037. private boolean judgements(List<PtlAgreementProductCostsAttrLink> ptlAgreementProductCostsAttrLinks,
  1038. List<PtlAgreementUndwrtRulesAttr> rulesAttrs, List<RuleAttrMappingVo> ruleAttrMappingVoList,
  1039. StringBuilder logs) {
  1040. boolean useFlag = true;
  1041. for (PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink : ptlAgreementProductCostsAttrLinks) {
  1042. //查找规则中的 传值属性
  1043. RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream()
  1044. .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
  1045. .findFirst()
  1046. .orElse(null);
  1047. //如果查找不到 传值属性 直接费用对比失败
  1048. if (ruleAttrMappingVo == null) {
  1049. log.debug("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
  1050. log.debug("传入的值找不到该属性:" + ptlAgreementProductCostsAttrLink.getAttrCode());
  1051. List<PtlAgreementUndwrtRulesAttr> collect = rulesAttrs.stream()
  1052. .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
  1053. .collect(Collectors.toList());
  1054. if (!collect.isEmpty()) {
  1055. logs.append("规则匹配失败:" + collect.get(0).getAttrName() + "\n");
  1056. }
  1057. return false;
  1058. }
  1059. //查找 费用因子规则
  1060. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = rulesAttrs.stream()
  1061. .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
  1062. .findFirst()
  1063. .get();
  1064. useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
  1065. if (!useFlag) {
  1066. log.debug("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
  1067. log.debug("检验的值:" + ptlAgreementProductCostsAttrLink.getMin());
  1068. log.debug("传入的值:" + ruleAttrMappingVo.getValue());
  1069. List<PtlAgreementUndwrtRulesAttr> collect = rulesAttrs.stream()
  1070. .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
  1071. .collect(Collectors.toList());
  1072. if (!collect.isEmpty()) {
  1073. logs.append("规则匹配失败:" + collect.get(0).getAttrName() + "\n");
  1074. }
  1075. if (ptlAgreementProductCostsAttrLink.getMin() != null) {
  1076. logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMin() + "\n");
  1077. } else {
  1078. logs.append("检验的值:" + ptlAgreementProductCostsAttrLink.getMax() + "\n");
  1079. }
  1080. logs.append("传入的值:" + ruleAttrMappingVo.getValue() + "\n");
  1081. return false;
  1082. }
  1083. }
  1084. return useFlag;
  1085. }
  1086. /**
  1087. * 承保规则因子的对比
  1088. *
  1089. * @param ptlAgreementUndwrtRulesAttrLinks
  1090. * @param rulesAttrs
  1091. * @param ruleAttrMappingVoList
  1092. * @return
  1093. */
  1094. private boolean judgementsRules(List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementUndwrtRulesAttrLinks,
  1095. List<PtlAgreementUndwrtRulesAttr> rulesAttrs, List<RuleAttrMappingVo> ruleAttrMappingVoList,
  1096. StringBuilder logs) {
  1097. boolean useFlag = true;
  1098. for (int i = 0; i < ptlAgreementUndwrtRulesAttrLinks.size(); i++) {
  1099. int finalI = i;
  1100. //查找规则中的 传值属性
  1101. RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream().filter(x ->
  1102. x.getAttrCode().equals(ptlAgreementUndwrtRulesAttrLinks.get(finalI).getAttrCode())).findFirst().orElse(null);
  1103. //如果查找不到 传值属性 直接费用对比失败
  1104. if (ruleAttrMappingVo == null) {
  1105. return true;
  1106. }
  1107. //查找 费用因子规则
  1108. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr =
  1109. rulesAttrs.stream().filter(x -> x.getAttrCode().equals(ptlAgreementUndwrtRulesAttrLinks.get(finalI).getAttrCode())).findFirst().get();
  1110. //如果是多选 对value进行转换
  1111. if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")) {
  1112. PtlAgreementUndwrtRulesDictLabal ptlAgreementUndwrtRulesDictLabal =
  1113. ptlAgreementUndwrtRulesAttr.getDictLabal().stream().filter(x ->
  1114. x.getName().equals(ruleAttrMappingVo.getValue())).findFirst().orElse(null);
  1115. ruleAttrMappingVo.setValue(ptlAgreementUndwrtRulesDictLabal.getName());
  1116. }
  1117. //如果是单选 并且是 性别的话 转换为code
  1118. if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
  1119. if ("CarOwnersSex".equals(ptlAgreementUndwrtRulesAttr.getAttrCode()) || "ApplicantSex".equals(ptlAgreementUndwrtRulesAttr.getAttrCode()) ||
  1120. "InsuredSex".equals(ptlAgreementUndwrtRulesAttr.getAttrCode())) {
  1121. PtlAgreementUndwrtRulesDictLabal ptlAgreementUndwrtRulesDictLabal =
  1122. ptlAgreementUndwrtRulesAttr.getDictLabal().stream().filter(x ->
  1123. x.getCode().equals(ruleAttrMappingVo.getValue())).findFirst().orElse(null);
  1124. ruleAttrMappingVo.setValue(ptlAgreementUndwrtRulesDictLabal.getCode());
  1125. }
  1126. }
  1127. useFlag = attrEqual(ptlAgreementUndwrtRulesAttrLinks.get(i), ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
  1128. if (useFlag) {
  1129. return true;
  1130. } else {
  1131. logs.append("规则匹配失败:" + ptlAgreementUndwrtRulesAttrLinks.get(i).getAttrCode() + "\n");
  1132. if (ptlAgreementUndwrtRulesAttrLinks.get(i).getMin() != null) {
  1133. logs.append("校验的值:" + ptlAgreementUndwrtRulesAttrLinks.get(i).getMin() + "\n");
  1134. } else {
  1135. logs.append("校验的值:" + ptlAgreementUndwrtRulesAttrLinks.get(i).getMax() + "\n");
  1136. }
  1137. logs.append("传入的值:" + ruleAttrMappingVo.getValue());
  1138. }
  1139. }
  1140. return useFlag;
  1141. }
  1142. /**
  1143. * 费用因子的对比 强制非车险
  1144. *
  1145. * @param ptlAgreementProductCostsAttrLinks 费用因子范围规则
  1146. * @param rulesAttrs 费用因子属性
  1147. * @param ruleAttrMappingVoList 表单提交的值
  1148. * @return
  1149. */
  1150. private boolean judgementsIsNoCar(List<PtlAgreementProductCostsAttrLink> ptlAgreementProductCostsAttrLinks,
  1151. List<PtlAgreementUndwrtRulesAttr> rulesAttrs, List<RuleAttrMappingVo> ruleAttrMappingVoList) {
  1152. boolean useFlag = true;
  1153. for (int i = 0; i < ptlAgreementProductCostsAttrLinks.size(); i++) {
  1154. int finalI = i;
  1155. //查找规则中的 传值属性
  1156. RuleAttrMappingVo ruleAttrMappingVo =
  1157. ruleAttrMappingVoList.stream().filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLinks.get(finalI).getAttrCode())).findFirst().orElse(null);
  1158. //如果是强制非车险
  1159. if (ptlAgreementProductCostsAttrLinks.get(i).getAttrCode().equals("IsNonMotorInsurance"))
  1160. continue;
  1161. //如果查找不到 传值属性 直接费用对比失败
  1162. if (ruleAttrMappingVo == null)
  1163. return false;
  1164. //查找 费用因子规则
  1165. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr =
  1166. rulesAttrs.stream().filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLinks.get(finalI).getAttrCode())).findFirst().get();
  1167. //如果是多选 对value进行转换
  1168. if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")) {
  1169. PtlAgreementUndwrtRulesDictLabal ptlAgreementUndwrtRulesDictLabal =
  1170. ptlAgreementUndwrtRulesAttr.getDictLabal().stream().filter(x ->
  1171. x.getCode().equals(ruleAttrMappingVo.getValue())).findFirst().orElse(null);
  1172. ruleAttrMappingVo.setValue(ptlAgreementUndwrtRulesDictLabal.getName());
  1173. }
  1174. //如果是单选 并且是 性别的话 转换为code
  1175. if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
  1176. if ("CarOwnersSex".equals(ptlAgreementUndwrtRulesAttr.getAttrCode()) || "ApplicantSex".equals(ptlAgreementUndwrtRulesAttr.getAttrCode()) ||
  1177. "InsuredSex".equals(ptlAgreementUndwrtRulesAttr.getAttrCode())) {
  1178. PtlAgreementUndwrtRulesDictLabal ptlAgreementUndwrtRulesDictLabal =
  1179. ptlAgreementUndwrtRulesAttr.getDictLabal().stream().filter(x ->
  1180. x.getName().equals(ruleAttrMappingVo.getValue())).findFirst().orElse(null);
  1181. ruleAttrMappingVo.setValue(ptlAgreementUndwrtRulesDictLabal.getCode());
  1182. }
  1183. }
  1184. useFlag = attrEqual(ptlAgreementProductCostsAttrLinks.get(i), ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
  1185. if (!useFlag) {
  1186. System.out.printf("规则匹配失败:" + ptlAgreementProductCostsAttrLinks.get(i).getAttrCode());
  1187. return false;
  1188. }
  1189. }
  1190. return useFlag;
  1191. }
  1192. /**
  1193. * 属性比较 返回 是否匹配
  1194. *
  1195. * @param ptlAgreementProductCostsAttrLink
  1196. * @param ptlAgreementUndwrtRulesAttr
  1197. * @param value
  1198. * @return
  1199. */
  1200. private boolean attrEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink,
  1201. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value) {
  1202. if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")) {
  1203. return checkBoxEqual(ptlAgreementProductCostsAttrLink, value);
  1204. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputNumber")) {
  1205. return inputNumberEqual(ptlAgreementProductCostsAttrLink, value);
  1206. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("input")) {
  1207. //截取身份证号码
  1208. if (ptlAgreementProductCostsAttrLink.getAttrCode().equals("CarOwnersIDNumber") || ptlAgreementProductCostsAttrLink.getAttrCode().equals("ApplicantIDNumber") ||
  1209. ptlAgreementProductCostsAttrLink.getAttrCode().equals("InsuredIDNumber")) {
  1210. value = value.substring(0, ptlAgreementProductCostsAttrLink.getMin().length());
  1211. }
  1212. return inputTextEqual(ptlAgreementProductCostsAttrLink, value);
  1213. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("select")) {
  1214. //截取车牌
  1215. if (ptlAgreementUndwrtRulesAttr.getAttrCode().equals("LicenseNo")) {
  1216. value = value.substring(0, 2);
  1217. }
  1218. return selectEqual(ptlAgreementProductCostsAttrLink, value);
  1219. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
  1220. return radioEqual(ptlAgreementProductCostsAttrLink, value);
  1221. }
  1222. return false;
  1223. }
  1224. private boolean attrEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink,
  1225. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value) {
  1226. if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")) {
  1227. return checkBoxEqual(ptlAgreementUndwrtRulesAttrLink, value);
  1228. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputNumber")) {
  1229. return inputNumberEqual(ptlAgreementUndwrtRulesAttrLink, value);
  1230. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("input")) {
  1231. return inputTextEqual(ptlAgreementUndwrtRulesAttrLink, value);
  1232. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("select")) {
  1233. //截取车牌
  1234. if (ptlAgreementUndwrtRulesAttr.getAttrCode().equals("LicenseNo")) {
  1235. value = value.substring(0, 2);
  1236. }
  1237. return selectEqual(ptlAgreementUndwrtRulesAttrLink, value);
  1238. } else if (ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")) {
  1239. return radioEqual(ptlAgreementUndwrtRulesAttrLink, value);
  1240. }
  1241. return false;
  1242. }
  1243. /**
  1244. * 属性为多选判断
  1245. *
  1246. * @param ptlAgreementProductCostsAttrLink
  1247. * @param value
  1248. * @return
  1249. */
  1250. private boolean checkBoxEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
  1251. String[] split = ptlAgreementProductCostsAttrLink.getMin().split(",");
  1252. for( String sp : split)
  1253. {
  1254. if(sp.equals(value)){
  1255. return true;
  1256. }
  1257. }
  1258. return false;
  1259. }
  1260. private boolean checkBoxEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
  1261. if (!ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)) {
  1262. return true;
  1263. }
  1264. return false;
  1265. }
  1266. /**
  1267. * 属性为数值型判断
  1268. *
  1269. * @param ptlAgreementProductCostsAttrLink
  1270. * @param value
  1271. * @return
  1272. */
  1273. private boolean inputNumberEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
  1274. double v = Double.parseDouble(value);
  1275. //统一处理数值
  1276. if ("1".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
  1277. if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) <= v &&
  1278. Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) >= v) {
  1279. return true;
  1280. }
  1281. } else if ("2".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
  1282. if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) > v) {
  1283. return true;
  1284. }
  1285. } else if ("3".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
  1286. if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) >= v) {
  1287. return true;
  1288. }
  1289. } else if ("4".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
  1290. if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) < v) {
  1291. return true;
  1292. }
  1293. } else if ("5".equals(ptlAgreementProductCostsAttrLink.getOperator())) {
  1294. if (Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) <= v) {
  1295. return true;
  1296. }
  1297. }
  1298. return false;
  1299. }
  1300. private boolean inputNumberEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
  1301. double v = Double.parseDouble(value);
  1302. //统一处理数值
  1303. if ("1".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
  1304. if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) <= v &&
  1305. Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) >= v) {
  1306. return false;
  1307. }
  1308. } else if ("2".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
  1309. if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) > v) {
  1310. return false;
  1311. }
  1312. } else if ("3".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
  1313. if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) >= v) {
  1314. return false;
  1315. }
  1316. } else if ("4".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
  1317. if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) < v) {
  1318. return false;
  1319. }
  1320. } else if ("5".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())) {
  1321. if (Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) <= v) {
  1322. return false;
  1323. }
  1324. }
  1325. return true;
  1326. }
  1327. /**
  1328. * 属性为输入框判断
  1329. *
  1330. * @param ptlAgreementProductCostsAttrLink
  1331. * @param value
  1332. * @return
  1333. */
  1334. private boolean inputTextEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
  1335. //将值进行分割
  1336. String[] split = ptlAgreementProductCostsAttrLink.getMin().split(",");
  1337. AtomicBoolean returnBool = new AtomicBoolean(false);
  1338. Arrays.stream(split).forEach(x -> {
  1339. if (value.equals(x)) {
  1340. returnBool.set(true);
  1341. }
  1342. });
  1343. return returnBool.get();
  1344. }
  1345. private boolean inputTextEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
  1346. //将值进行分割
  1347. String[] split = ptlAgreementUndwrtRulesAttrLink.getMin().split(",");
  1348. AtomicBoolean returnBool = new AtomicBoolean(true);
  1349. if(ptlAgreementUndwrtRulesAttrLink.getAttrCode().equals("NatureOfUse")) {
  1350. Arrays.stream(split).forEach(x -> {
  1351. if (!x.equals("") && value.equals(x)) {
  1352. returnBool.set(false);
  1353. }
  1354. });
  1355. }else{
  1356. Arrays.stream(split).forEach(x -> {
  1357. if (!x.equals("") && value.contains(x)) {
  1358. returnBool.set(false);
  1359. }
  1360. });
  1361. }
  1362. return returnBool.get();
  1363. }
  1364. /**
  1365. * 属性为下拉框判断
  1366. *
  1367. * @param ptlAgreementProductCostsAttrLink
  1368. * @param value
  1369. * @return
  1370. */
  1371. private boolean selectEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
  1372. if (ptlAgreementProductCostsAttrLink.getMin() != null && ptlAgreementProductCostsAttrLink.getMin().contains(value)) {
  1373. return true;
  1374. }
  1375. return false;
  1376. }
  1377. /**
  1378. * 属性为选择框判断
  1379. *
  1380. * @param ptlAgreementUndwrtRulesAttrLink
  1381. * @param value
  1382. * @return
  1383. */
  1384. private boolean selectEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
  1385. if (ptlAgreementUndwrtRulesAttrLink.getMin() == null) {
  1386. return false;
  1387. }
  1388. if (!ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)) {
  1389. return true;
  1390. }
  1391. return false;
  1392. }
  1393. /**
  1394. * 属性为单选框判断
  1395. *
  1396. * @param ptlAgreementProductCostsAttrLink
  1397. * @param value
  1398. * @return
  1399. */
  1400. private boolean radioEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value) {
  1401. //新能源判断
  1402. if ("NewEnergy".equals(ptlAgreementProductCostsAttrLink.getAttrCode())) {
  1403. // 是否是新能源车
  1404. boolean newEnergy = EnergyType.isNewEnergy(value);
  1405. if (newEnergy && ptlAgreementProductCostsAttrLink.getMin().equals("1")) {
  1406. return true;
  1407. } else if (!newEnergy && ptlAgreementProductCostsAttrLink.getMin().equals("0")) {
  1408. return true;
  1409. }
  1410. } else if (ptlAgreementProductCostsAttrLink.getMin().contains(value)) {
  1411. return true;
  1412. }
  1413. return false;
  1414. }
  1415. private boolean radioEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value) {
  1416. //新能源判断
  1417. if ("NewEnergy".equals(ptlAgreementUndwrtRulesAttrLink.getAttrCode())) {
  1418. // 是否是新能源车
  1419. boolean newEnergy = EnergyType.isNewEnergy(value);
  1420. if (newEnergy && ptlAgreementUndwrtRulesAttrLink.getMin().equals("1")) {
  1421. return false;
  1422. } else if (!newEnergy && ptlAgreementUndwrtRulesAttrLink.getMin().equals("0")) {
  1423. return false;
  1424. }
  1425. } else if (ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)) {
  1426. return false;
  1427. }
  1428. return true;
  1429. }
  1430. /**
  1431. * 获取车辆新旧车信息
  1432. *
  1433. * @param companyId
  1434. * @return
  1435. */
  1436. private PtlNewCarJudgeRules getCarJudgeRule(String companyId) {
  1437. //获取车辆新旧车信息
  1438. List<PtlNewCarJudgeRules> list =
  1439. ptlNewCarJudgeRulesService.list(new LambdaQueryWrapper<PtlNewCarJudgeRules>().eq(PtlNewCarJudgeRules::getCompanyId,
  1440. companyId));
  1441. if (list.size() > 0) {
  1442. return list.get(0);
  1443. }
  1444. return null;
  1445. }
  1446. }