FeeRuleSchemeServiceNewImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732
  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.SysDept;
  6. import com.ydtech.modules.admin.model.SysUser;
  7. import com.ydtech.modules.admin.service.SysDeptService;
  8. import com.ydtech.modules.admin.service.SysUserService;
  9. import com.ydtech.modules.esm.model.EsmRetail;
  10. import com.ydtech.modules.esm.service.EsmRetailService;
  11. import com.ydtech.modules.fee.dto.vo.RuleAttrMappingVo;
  12. import com.ydtech.modules.fee.service.FeeRuleSchemeNewService;
  13. import com.ydtech.modules.order.entity.InsAreaCompany;
  14. import com.ydtech.modules.order.entity.InsOrders;
  15. import com.ydtech.modules.order.entity.vo.*;
  16. import com.ydtech.modules.order.service.InsOrdersService;
  17. import com.ydtech.modules.protocol.service.*;
  18. import com.ydtech.modules.protocols.entity.po.*;
  19. import com.ydtech.modules.protocols.entity.vo.AgreementProductCosts;
  20. import com.ydtech.modules.protocols.service.*;
  21. import com.ydtech.utils.idgen.IdGenerate;
  22. import org.springframework.stereotype.Service;
  23. import javax.annotation.Resource;
  24. import java.math.BigDecimal;
  25. import java.util.*;
  26. import java.util.concurrent.atomic.AtomicBoolean;
  27. /**
  28. *@author: tz
  29. *@description: 费用接口中相关功能的实现类
  30. *@create: 2024-3-1 11:45:33
  31. */
  32. @Service
  33. public class FeeRuleSchemeServiceNewImpl implements FeeRuleSchemeNewService {
  34. @Resource
  35. private InsOrdersService insOrdersService;
  36. @Resource
  37. private PtlAgreementProductCostsNewService ptlAgreementProductCostsNewService;
  38. @Resource
  39. private PtlAgreementUndwrtRulesAttrService ptlAgreementUndwrtRulesAttrService;
  40. @Resource
  41. private PtlAgreementProductCostsExportService ptlAgreementProductCostsExportService;
  42. @Resource
  43. private PtlAgreementProductCostsAttrLinkService ptlAgreementProductCostsAttrLinkService;
  44. @Resource
  45. private PtlAgreementUndwrtRulesNewService ptlAgreementUndwrtRulesNewService;
  46. @Resource
  47. private SysUserService sysUserService;
  48. @Resource
  49. private EsmRetailService esmRetailService;
  50. @Resource
  51. private InsFeeOrderNewService insFeeOrderNewService;
  52. @Override
  53. public QueryOrderFeeVo queryFeeOrderInfo(String companyId) {
  54. return null;
  55. }
  56. @Override
  57. public List<QueryOrderFeeResultVo> convertOrderFeeVoData(QueryOrderFeeVo orderFeeVo) {
  58. return null;
  59. }
  60. @Override
  61. public void compareAndUpdateFeeOrderInfo(String insOrderNo, String jqCostsProportionStr, String syCostsProportionStr, String dealUser) {
  62. }
  63. /**
  64. * 校验费用因子
  65. */
  66. @Override
  67. public void verificationCostFactor(InsAreaCompany insAreaCompany,InsOrders insOrders){
  68. List<AgreementProductCosts> agreementProductCosts = ptlAgreementProductCostsNewService.costsGetList(insAreaCompany.getAgreementId(),insOrders.getProductid());
  69. if(agreementProductCosts == null || agreementProductCosts.size() == 0){
  70. throw new SystemException("协议费用因子为空");
  71. }
  72. //按优先级进行排序
  73. Collections.sort(agreementProductCosts, Comparator.comparingInt(AgreementProductCosts::getPriorityLevel).reversed());
  74. //遍历费用因子
  75. String costsId = verificationCosts(agreementProductCosts, insAreaCompany,insOrders);
  76. calcCosts(costsId,insAreaCompany);
  77. }
  78. /**
  79. * 校验承保规则
  80. * @param insAreaCompany
  81. * @param insOrders
  82. */
  83. @Override
  84. public void verificationRuleFactor(InsAreaCompany insAreaCompany, InsOrders insOrders) {
  85. List<PtlAgreementUndwrtRulesNew> ptlAgreementUndwrtRules = ptlAgreementUndwrtRulesNewService.rulesList(insAreaCompany.getAgreementId());
  86. verificationRules(ptlAgreementUndwrtRules, insAreaCompany,insOrders);
  87. }
  88. /**
  89. * 计算费用
  90. * @param costsId
  91. * @param insAreaCompany
  92. */
  93. @Override
  94. public void calcCosts(String costsId,InsAreaCompany insAreaCompany) {
  95. //税比例 固定1.06
  96. BigDecimal taxRadio = new BigDecimal("1.06");
  97. //查找入口与出口费用比例
  98. //入口配置
  99. PtlAgreementProductCostsNew ptlAgreementProductCostsNew = ptlAgreementProductCostsNewService.getById(costsId);
  100. //出口配置
  101. PtlAgreementProductCostsExport ptlAgreementProductCostsExport = ptlAgreementProductCostsExportService.getOne(new LambdaQueryWrapper<PtlAgreementProductCostsExport>().eq(PtlAgreementProductCostsExport::getCostsId, costsId));
  102. InsFeeOrderNew insFeeOrderNew = new InsFeeOrderNew();
  103. insFeeOrderNew.setId(IdGenerate.nextId());
  104. insFeeOrderNew.setAgreementId(ptlAgreementProductCostsNew.getAgreementId());
  105. //存储部门id与用户id
  106. InsOrders order = insOrdersService.getById(insAreaCompany.getOrderno());
  107. insFeeOrderNew.setDeptId(order.getDeptid());
  108. insFeeOrderNew.setUserId(order.getUserid());
  109. insFeeOrderNew.setInsOrderNo(insAreaCompany.getId());
  110. insFeeOrderNew.setJqPremium(insAreaCompany.getJqpremium());
  111. insFeeOrderNew.setSyPremium(insAreaCompany.getSypremium());
  112. insFeeOrderNew.setNoPremium(insAreaCompany.getJypremium());
  113. //不含税
  114. insFeeOrderNew.setJqNoTaxPremium(insAreaCompany.getJqpremium().divide(taxRadio,2));
  115. insFeeOrderNew.setSyNoTaxPremium(insAreaCompany.getSypremium().divide(taxRadio,2));
  116. insFeeOrderNew.setNoNoTaxPremium(insAreaCompany.getJypremium().divide(taxRadio,2));
  117. //计算入口费用
  118. //交强险总费用比例 + 加投比例
  119. insFeeOrderNew.setJqCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getJqCostsProportion()));
  120. BigDecimal jqCostsProportion = new BigDecimal(ptlAgreementProductCostsNew.getJqCostsProportion());
  121. jqCostsProportion = isContainNonCar(insAreaCompany) ?
  122. jqCostsProportion.add(new BigDecimal(ptlAgreementProductCostsNew.getJqCostsProportionAddInvsestment())).divide(new BigDecimal("100")) :
  123. jqCostsProportion.divide(new BigDecimal("100"));
  124. insFeeOrderNew.setJqCostsPremiums(insFeeOrderNew.getJqNoTaxPremium().multiply(jqCostsProportion));
  125. //商业险总费用比例 + 加投比例
  126. insFeeOrderNew.setSyCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getSyCostsProportion()));
  127. BigDecimal syCostsProportion = new BigDecimal(ptlAgreementProductCostsNew.getSyCostsProportion());
  128. syCostsProportion = isContainNonCar(insAreaCompany) ?
  129. syCostsProportion.add(new BigDecimal(ptlAgreementProductCostsNew.getSyCostsProportionAddInvsestment())).divide(new BigDecimal("100")) :
  130. syCostsProportion.divide(new BigDecimal("100"));
  131. insFeeOrderNew.setSyCostsPremiums(insFeeOrderNew.getSyNoTaxPremium().multiply(syCostsProportion));
  132. //非车险总费用比例
  133. insFeeOrderNew.setNoCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getNoCostsProportion()));
  134. insFeeOrderNew.setNoCostsPremiums(insFeeOrderNew.getNoNoTaxPremium().multiply
  135. (new BigDecimal(ptlAgreementProductCostsNew.getNoCostsProportion()).divide(new BigDecimal("100"))));
  136. //交强监管费比例
  137. insFeeOrderNew.setJqSuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getJqCarCostsProportion()));
  138. insFeeOrderNew.setJqSuperviseCostsPremiums(insFeeOrderNew.getJqNoTaxPremium().multiply(
  139. new BigDecimal(ptlAgreementProductCostsNew.getJqCarCostsProportion()).divide(new BigDecimal("100"))
  140. ));
  141. //商业监管费比例
  142. insFeeOrderNew.setSySuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getSyCarCostsProportion()));
  143. insFeeOrderNew.setSySuperviseCostsPremiums(insFeeOrderNew.getSyNoTaxPremium().multiply(
  144. new BigDecimal(ptlAgreementProductCostsNew.getSyCarCostsProportion()).divide(new BigDecimal("100"))
  145. ));
  146. //非车监管费比例
  147. insFeeOrderNew.setNoSuperviseCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getNoCarCostsProportion()));
  148. insFeeOrderNew.setNoSuperviseCostsPremiums(insFeeOrderNew.getNoNoTaxPremium().multiply(
  149. new BigDecimal(ptlAgreementProductCostsNew.getNoCarCostsProportion()).divide(new BigDecimal("100"))
  150. ));
  151. //交强其他费用比例
  152. insFeeOrderNew.setJqOtherCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getJqCarOtherCostsProportion()));
  153. insFeeOrderNew.setJqOtherCostsPremiums(insFeeOrderNew.getJqNoTaxPremium().multiply(
  154. new BigDecimal(ptlAgreementProductCostsNew.getJqCarOtherCostsProportion()).divide(new BigDecimal("100"))
  155. ));
  156. //商业其他费用比例
  157. insFeeOrderNew.setSyOtherCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getSyCarOtherCostsProportion()));
  158. insFeeOrderNew.setSyOtherCostsPremiums(insFeeOrderNew.getSyNoTaxPremium().multiply(
  159. new BigDecimal(ptlAgreementProductCostsNew.getSyCarOtherCostsProportion()).divide(new BigDecimal("100"))
  160. ));
  161. //非车其他费用比例
  162. insFeeOrderNew.setNoOtherCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getNoCarOtherCostsProportion()));
  163. insFeeOrderNew.setNoOtherCostsPremiums(insFeeOrderNew.getNoNoTaxPremium().multiply(
  164. new BigDecimal(ptlAgreementProductCostsNew.getNoCarOtherCostsProportion()).divide(new BigDecimal("100"))
  165. ));
  166. //交强加投比例
  167. insFeeOrderNew.setJqInvestmentCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getJqCostsProportionAddInvsestment()));
  168. insFeeOrderNew.setJqInvestmentCostsPremiums(insFeeOrderNew.getJqNoTaxPremium().multiply(
  169. new BigDecimal(ptlAgreementProductCostsNew.getJqCostsProportionAddInvsestment()).divide(new BigDecimal("100"))
  170. ));
  171. //商业加投比例
  172. insFeeOrderNew.setSyInvestmentCostsProportion(new BigDecimal(ptlAgreementProductCostsNew.getSyCostsProportionAddInvsestment()));
  173. insFeeOrderNew.setSyInvestmentCostsPremiums(insFeeOrderNew.getSyNoTaxPremium().multiply(
  174. new BigDecimal(ptlAgreementProductCostsNew.getSyCostsProportionAddInvsestment()).divide(new BigDecimal("100"))
  175. ));
  176. //设置出口费用
  177. //每级的加投费用为 计算出每级管理费的占比 * 加投费用
  178. //(一级管理费比例 / 总费用比例) * 加投费用
  179. BigDecimal jqInvestmentCostsLevel1 = new BigDecimal(0);
  180. BigDecimal jqInvestmentCostsLevel2 = new BigDecimal(0);
  181. BigDecimal jqInvestmentCostsLevel3 = new BigDecimal(0);
  182. BigDecimal jqInvestmentCostsLevel4 = new BigDecimal(0);
  183. BigDecimal jqInvestmentCostsLevel5 = new BigDecimal(0);
  184. BigDecimal syInvestmentCostsLevel1 = new BigDecimal(0);
  185. BigDecimal syInvestmentCostsLevel2 = new BigDecimal(0);
  186. BigDecimal syInvestmentCostsLevel3 = new BigDecimal(0);
  187. BigDecimal syInvestmentCostsLevel4 = new BigDecimal(0);
  188. BigDecimal syInvestmentCostsLevel5 = new BigDecimal(0);
  189. if(insFeeOrderNew.getJqInvestmentCostsProportion().compareTo(BigDecimal.ZERO) != 0)
  190. {
  191. jqInvestmentCostsLevel1 = ptlAgreementProductCostsExport.getJqExportRadioLevel1().divide(insFeeOrderNew.getJqCostsProportion()).multiply(insFeeOrderNew.getJqInvestmentCostsPremiums());
  192. jqInvestmentCostsLevel2 = ptlAgreementProductCostsExport.getJqExportRadioLevel2().divide(insFeeOrderNew.getJqCostsProportion()).multiply(insFeeOrderNew.getJqInvestmentCostsPremiums());
  193. jqInvestmentCostsLevel3 = ptlAgreementProductCostsExport.getJqExportRadioLevel3().divide(insFeeOrderNew.getJqCostsProportion()).multiply(insFeeOrderNew.getJqInvestmentCostsPremiums());
  194. jqInvestmentCostsLevel4 = ptlAgreementProductCostsExport.getJqExportRadioLevel4().divide(insFeeOrderNew.getJqCostsProportion()).multiply(insFeeOrderNew.getJqInvestmentCostsPremiums());
  195. jqInvestmentCostsLevel5 = ptlAgreementProductCostsExport.getJqExportRadioLevel5().divide(insFeeOrderNew.getJqCostsProportion()).multiply(insFeeOrderNew.getJqInvestmentCostsPremiums());
  196. }
  197. if(insFeeOrderNew.getSyInvestmentCostsProportion().compareTo(BigDecimal.ZERO) != 0)
  198. {
  199. syInvestmentCostsLevel1 = ptlAgreementProductCostsExport.getSyExportRadioLevel1().divide(insFeeOrderNew.getSyCostsProportion()).multiply(insFeeOrderNew.getSyInvestmentCostsPremiums());
  200. syInvestmentCostsLevel2 = ptlAgreementProductCostsExport.getSyExportRadioLevel2().divide(insFeeOrderNew.getSyCostsProportion()).multiply(insFeeOrderNew.getSyInvestmentCostsPremiums());
  201. syInvestmentCostsLevel3 = ptlAgreementProductCostsExport.getSyExportRadioLevel3().divide(insFeeOrderNew.getSyCostsProportion()).multiply(insFeeOrderNew.getSyInvestmentCostsPremiums());
  202. syInvestmentCostsLevel4 = ptlAgreementProductCostsExport.getSyExportRadioLevel4().divide(insFeeOrderNew.getSyCostsProportion()).multiply(insFeeOrderNew.getSyInvestmentCostsPremiums());
  203. syInvestmentCostsLevel5 = ptlAgreementProductCostsExport.getSyExportRadioLevel5().divide(insFeeOrderNew.getSyCostsProportion()).multiply(insFeeOrderNew.getSyInvestmentCostsPremiums());
  204. }
  205. //交强出口比例
  206. insFeeOrderNew.setJqDeptProportionLevel1(ptlAgreementProductCostsExport.getJqExportRadioLevel1());
  207. insFeeOrderNew.setJqDeptPremiumsLevel1(
  208. insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getJqDeptProportionLevel1()).divide(new BigDecimal("100")).add(jqInvestmentCostsLevel1)
  209. );
  210. insFeeOrderNew.setJqDeptProportionLevel2(ptlAgreementProductCostsExport.getJqExportRadioLevel2());
  211. insFeeOrderNew.setJqDeptPremiumsLevel2(
  212. insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getJqDeptProportionLevel2()).divide(new BigDecimal("100")).add(jqInvestmentCostsLevel2)
  213. );
  214. insFeeOrderNew.setJqDeptProportionLevel3(ptlAgreementProductCostsExport.getJqExportRadioLevel3());
  215. insFeeOrderNew.setJqDeptPremiumsLevel3(
  216. insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getJqDeptProportionLevel3()).divide(new BigDecimal("100")).add(jqInvestmentCostsLevel3)
  217. );
  218. insFeeOrderNew.setJqDeptProportionLevel4(ptlAgreementProductCostsExport.getJqExportRadioLevel4());
  219. insFeeOrderNew.setJqDeptPremiumsLevel4(
  220. insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getJqDeptProportionLevel4()).divide(new BigDecimal("100")).add(jqInvestmentCostsLevel4)
  221. );
  222. insFeeOrderNew.setJqDeptProportionLevel5(ptlAgreementProductCostsExport.getJqExportRadioLevel5());
  223. insFeeOrderNew.setJqDeptPremiumsLevel5(
  224. insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getJqDeptProportionLevel5()).divide(new BigDecimal("100")).add(jqInvestmentCostsLevel5)
  225. );
  226. insFeeOrderNew.setJqExportInvestmentProportion(ptlAgreementProductCostsExport.getJqExportInvestmentRadio());
  227. insFeeOrderNew.setJqExportInvestmentPremiums(
  228. insFeeOrderNew.getJqPremium().multiply(insFeeOrderNew.getJqExportInvestmentProportion()).divide(new BigDecimal("100"))
  229. );
  230. //商业出口比例
  231. insFeeOrderNew.setSyDeptProportionLevel1(ptlAgreementProductCostsExport.getSyExportRadioLevel1());
  232. insFeeOrderNew.setSyDeptPremiumsLevel1(
  233. insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSyDeptProportionLevel1()).divide(new BigDecimal("100")).add(syInvestmentCostsLevel1)
  234. );
  235. insFeeOrderNew.setSyDeptProportionLevel2(ptlAgreementProductCostsExport.getSyExportRadioLevel2());
  236. insFeeOrderNew.setSyDeptPremiumsLevel2(
  237. insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSyDeptProportionLevel2()).divide(new BigDecimal("100")).add(syInvestmentCostsLevel2)
  238. );
  239. insFeeOrderNew.setSyDeptProportionLevel3(ptlAgreementProductCostsExport.getSyExportRadioLevel3());
  240. insFeeOrderNew.setSyDeptPremiumsLevel3(
  241. insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSyDeptProportionLevel3()).divide(new BigDecimal("100")).add(syInvestmentCostsLevel3)
  242. );
  243. insFeeOrderNew.setSyDeptProportionLevel4(ptlAgreementProductCostsExport.getSyExportRadioLevel4());
  244. insFeeOrderNew.setSyDeptPremiumsLevel4(
  245. insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSyDeptProportionLevel4()).divide(new BigDecimal("100")).add(syInvestmentCostsLevel4)
  246. );
  247. insFeeOrderNew.setSyDeptProportionLevel5(ptlAgreementProductCostsExport.getSyExportRadioLevel5());
  248. insFeeOrderNew.setSyDeptPremiumsLevel5(
  249. insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSyDeptProportionLevel5()).divide(new BigDecimal("100")).add(syInvestmentCostsLevel5)
  250. );
  251. insFeeOrderNew.setSyExportInvestmentProportion(ptlAgreementProductCostsExport.getSyExportInvestmentRadio());
  252. insFeeOrderNew.setSyExportInvestmentPremiums(
  253. insFeeOrderNew.getSyPremium().multiply(insFeeOrderNew.getSyExportInvestmentProportion()).divide(new BigDecimal("100"))
  254. );
  255. //非车出口比例
  256. insFeeOrderNew.setNoDeptProportionLevel1(ptlAgreementProductCostsExport.getNoCarExportRadioLevel1());
  257. insFeeOrderNew.setNoDeptPremiumsLevel1(
  258. insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getNoDeptProportionLevel1()).divide(new BigDecimal("100"))
  259. );
  260. insFeeOrderNew.setNoDeptProportionLevel2(ptlAgreementProductCostsExport.getNoCarExportRadioLevel2());
  261. insFeeOrderNew.setNoDeptPremiumsLevel2(
  262. insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getNoDeptProportionLevel2()).divide(new BigDecimal("100"))
  263. );
  264. insFeeOrderNew.setNoDeptProportionLevel3(ptlAgreementProductCostsExport.getNoCarExportRadioLevel3());
  265. insFeeOrderNew.setNoDeptPremiumsLevel3(
  266. insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getNoDeptProportionLevel3()).divide(new BigDecimal("100"))
  267. );
  268. insFeeOrderNew.setNoDeptProportionLevel4(ptlAgreementProductCostsExport.getNoCarExportRadioLevel4());
  269. insFeeOrderNew.setNoDeptPremiumsLevel4(
  270. insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getNoDeptProportionLevel4()).divide(new BigDecimal("100"))
  271. );
  272. insFeeOrderNew.setNoDeptProportionLevel5(ptlAgreementProductCostsExport.getNoCarExportRadioLevel5());
  273. insFeeOrderNew.setNoDeptPremiumsLevel5(
  274. insFeeOrderNew.getNoPremium().multiply(insFeeOrderNew.getNoDeptProportionLevel5()).divide(new BigDecimal("100"))
  275. );
  276. //计算分销费用
  277. InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
  278. SysUser sysUser = sysUserService.findByUserId(insOrders.getUserid());
  279. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ",
  280. new Object[]{sysUser.getDeptId()});
  281. if (esmRetailList != null && !esmRetailList.isEmpty()) {
  282. EsmRetail esmRetail = esmRetailList.get(0);
  283. if (esmRetail != null) {
  284. if(Integer.parseInt(esmRetail.getRetailtype()) >= 3){
  285. insFeeOrderNew.setFirstDetailProportion(new BigDecimal(esmRetail.getDisrate1()));
  286. insFeeOrderNew.setFirstDetailPremiums(insFeeOrderNew.getJqNoTaxPremium().multiply(new BigDecimal(esmRetail.getDisrate1())).divide(new BigDecimal("100")));
  287. }
  288. if(Integer.parseInt(esmRetail.getRetailtype()) >= 2){
  289. insFeeOrderNew.setSecondDetailProportion(new BigDecimal(esmRetail.getDisrate2()));
  290. insFeeOrderNew.setSecondDetailPremiums(insFeeOrderNew.getJqNoTaxPremium().multiply(new BigDecimal(esmRetail.getDisrate2())).divide(new BigDecimal("100")));
  291. }
  292. if(Integer.parseInt(esmRetail.getRetailtype()) >= 1){
  293. insFeeOrderNew.setThirdDetailProportion(new BigDecimal(esmRetail.getDisrate3()));
  294. insFeeOrderNew.setThirdDetailPremiums(insFeeOrderNew.getJqNoTaxPremium().multiply(new BigDecimal(esmRetail.getDisrate3())).divide(new BigDecimal("100")));
  295. }
  296. }
  297. }
  298. insFeeOrderNewService.saveOrUpdate(insFeeOrderNew);
  299. }
  300. /**
  301. * 判断是否包含非车险
  302. * @param insAreaCompany
  303. * @return
  304. */
  305. private boolean isContainNonCar(InsAreaCompany insAreaCompany){
  306. if(insAreaCompany.getCrossInsurance() != null && insAreaCompany.getJypremium().equals(BigDecimal.ZERO)){
  307. return false;
  308. }
  309. return true;
  310. }
  311. /**
  312. * 匹配费用因子
  313. * @param agreementProductCosts
  314. * @param insAreaCompany
  315. * @param insOrders
  316. * @return
  317. */
  318. private String verificationCosts(List<AgreementProductCosts> agreementProductCosts,InsAreaCompany insAreaCompany,InsOrders insOrders){
  319. //匹配费用因子
  320. //获取所有费用属性
  321. List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = ptlAgreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
  322. //获取所有费用属性关联
  323. List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(insAreaCompany, insOrders);
  324. List<AgreementProductCosts> filterAgreementProductCosts = new ArrayList<>();
  325. boolean isNoCar = false;
  326. //查找是否有强制非车因子
  327. for(int i=0;i<agreementProductCosts.size();i++) {
  328. PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink =
  329. agreementProductCosts.get(i).getCostsAttrLinks().stream().filter(x -> x.getAttrCode().equals("IsNonMotorInsurance")).findFirst().orElse(null);
  330. if(!Objects.isNull(ptlAgreementProductCostsAttrLink)){
  331. if(ptlAgreementProductCostsAttrLink.getMin().equals("1")){
  332. //只走强制非车的费用因子
  333. AgreementProductCosts productCosts = agreementProductCosts.get(i);
  334. filterAgreementProductCosts.add(productCosts);
  335. isNoCar = true;
  336. }
  337. }
  338. }
  339. if(filterAgreementProductCosts.isEmpty()){
  340. filterAgreementProductCosts = agreementProductCosts;
  341. }
  342. //是否强制走非车
  343. if(isNoCar) {
  344. if(judgementsIsNoCar(filterAgreementProductCosts.get(0).getCostsAttrLinks(),undwrtRulesAttrList,ruleAttrMappingVoList)){
  345. return filterAgreementProductCosts.get(0).getId();
  346. }
  347. }else{
  348. for (int i = 0; i < filterAgreementProductCosts.size(); i++) {
  349. //判断是否匹配
  350. if (judgements(filterAgreementProductCosts.get(i).getCostsAttrLinks(), undwrtRulesAttrList, ruleAttrMappingVoList)) {
  351. //返回 费用id 如果需要匹配非车的情况 将返回值返回list 后赛选
  352. return filterAgreementProductCosts.get(i).getId();
  353. }
  354. }
  355. }
  356. throw new SystemException("费用因子匹配失败");
  357. }
  358. private boolean verificationRules(List<PtlAgreementUndwrtRulesNew> ptlAgreementUndwrtRulesNews,InsAreaCompany insAreaCompany,InsOrders insOrders){
  359. //匹配承保规则
  360. //获取所有承保规则属性
  361. List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList = ptlAgreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
  362. //获取所有费用属性关联
  363. List<RuleAttrMappingVo> ruleAttrMappingVoList = RuleAttrMappingVo.getRuleAttrMappingVoList(insAreaCompany, insOrders);
  364. for (int i = 0; i < ptlAgreementUndwrtRulesNews.size(); i++) {
  365. //判断是否匹配
  366. if (judgementsRules(ptlAgreementUndwrtRulesNews.get(i).getRulesAttrList(), undwrtRulesAttrList, ruleAttrMappingVoList)) {
  367. //返回 费用id 如果需要匹配非车的情况 将返回值返回list 后赛选
  368. return true;
  369. }
  370. }
  371. throw new SystemException("承保规则校验失败");
  372. }
  373. /**
  374. * 费用因子的对比
  375. * @param ptlAgreementProductCostsAttrLinks 费用因子范围规则
  376. * @param rulesAttrs 费用因子属性
  377. * @param ruleAttrMappingVoList 表单提交的值
  378. * @return
  379. */
  380. private boolean judgements(List<PtlAgreementProductCostsAttrLink> ptlAgreementProductCostsAttrLinks,
  381. List<PtlAgreementUndwrtRulesAttr> rulesAttrs, List<RuleAttrMappingVo> ruleAttrMappingVoList){
  382. boolean useFlag = true;
  383. for(int i=0;i<ptlAgreementProductCostsAttrLinks.size();i++){
  384. int finalI = i;
  385. //查找规则中的 传值属性
  386. RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream().filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLinks.get(finalI).getAttrCode())).findFirst().orElse(null);
  387. //如果查找不到 传值属性 直接费用对比失败
  388. if(ruleAttrMappingVo == null)
  389. return false;
  390. //查找 费用因子规则
  391. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = rulesAttrs.stream().filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLinks.get(finalI).getAttrCode())).findFirst().get();
  392. useFlag = attrEqual(ptlAgreementProductCostsAttrLinks.get(i), ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
  393. if(!useFlag)
  394. return false;
  395. }
  396. return useFlag;
  397. }
  398. /**
  399. * 承保规则因子的对比
  400. * @param ptlAgreementUndwrtRulesAttrLinks
  401. * @param rulesAttrs
  402. * @param ruleAttrMappingVoList
  403. * @return
  404. */
  405. private boolean judgementsRules(List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementUndwrtRulesAttrLinks,
  406. List<PtlAgreementUndwrtRulesAttr> rulesAttrs, List<RuleAttrMappingVo> ruleAttrMappingVoList){
  407. boolean useFlag = true;
  408. for(int i=0;i<ptlAgreementUndwrtRulesAttrLinks.size();i++){
  409. int finalI = i;
  410. //查找规则中的 传值属性
  411. RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream().filter(x -> x.getAttrCode().equals(ptlAgreementUndwrtRulesAttrLinks.get(finalI).getAttrCode())).findFirst().orElse(null);
  412. //如果查找不到 传值属性 直接费用对比失败
  413. if(ruleAttrMappingVo == null)
  414. continue;
  415. //查找 费用因子规则
  416. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = rulesAttrs.stream().filter(x -> x.getAttrCode().equals(ptlAgreementUndwrtRulesAttrLinks.get(finalI).getAttrCode())).findFirst().get();
  417. useFlag = attrEqual(ptlAgreementUndwrtRulesAttrLinks.get(i), ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
  418. if(!useFlag)
  419. return false;
  420. }
  421. return useFlag;
  422. }
  423. /**
  424. * 费用因子的对比 强制非车险
  425. * @param ptlAgreementProductCostsAttrLinks 费用因子范围规则
  426. * @param rulesAttrs 费用因子属性
  427. * @param ruleAttrMappingVoList 表单提交的值
  428. * @return
  429. */
  430. private boolean judgementsIsNoCar(List<PtlAgreementProductCostsAttrLink> ptlAgreementProductCostsAttrLinks,
  431. List<PtlAgreementUndwrtRulesAttr> rulesAttrs, List<RuleAttrMappingVo> ruleAttrMappingVoList){
  432. boolean useFlag = true;
  433. for(int i=0;i<ptlAgreementProductCostsAttrLinks.size();i++){
  434. int finalI = i;
  435. //查找规则中的 传值属性
  436. RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream().filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLinks.get(finalI).getAttrCode())).findFirst().orElse(null);
  437. //如果是强制非车险
  438. if(ptlAgreementProductCostsAttrLinks.get(i).getAttrCode().equals("IsNonMotorInsurance"))
  439. continue;
  440. //如果查找不到 传值属性 直接费用对比失败
  441. if(ruleAttrMappingVo == null)
  442. return false;
  443. //查找 费用因子规则
  444. PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr = rulesAttrs.stream().filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLinks.get(finalI).getAttrCode())).findFirst().get();
  445. useFlag = attrEqual(ptlAgreementProductCostsAttrLinks.get(i), ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue());
  446. if(!useFlag)
  447. return false;
  448. }
  449. return useFlag;
  450. }
  451. /**
  452. * 属性比较 返回 是否匹配
  453. * @param ptlAgreementProductCostsAttrLink
  454. * @param ptlAgreementUndwrtRulesAttr
  455. * @param value
  456. * @return
  457. */
  458. private boolean attrEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink,PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value){
  459. if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")){
  460. return checkBoxEqual(ptlAgreementProductCostsAttrLink,value);
  461. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputNumber")){
  462. return inputNumberEqual(ptlAgreementProductCostsAttrLink,value);
  463. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("input")){
  464. return inputTextEqual(ptlAgreementProductCostsAttrLink,value);
  465. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("select")){
  466. return selectEqual(ptlAgreementProductCostsAttrLink,value);
  467. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")){
  468. return radioEqual(ptlAgreementProductCostsAttrLink,value);
  469. }
  470. return false;
  471. }
  472. private boolean attrEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink,PtlAgreementUndwrtRulesAttr ptlAgreementUndwrtRulesAttr, String value){
  473. if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("checkbox")){
  474. return checkBoxEqual(ptlAgreementUndwrtRulesAttrLink,value);
  475. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("inputNumber")){
  476. return inputNumberEqual(ptlAgreementUndwrtRulesAttrLink,value);
  477. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("input")){
  478. return inputTextEqual(ptlAgreementUndwrtRulesAttrLink,value);
  479. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("select")){
  480. return selectEqual(ptlAgreementUndwrtRulesAttrLink,value);
  481. }else if(ptlAgreementUndwrtRulesAttr.getAttrType().equals("radio")){
  482. return radioEqual(ptlAgreementUndwrtRulesAttrLink,value);
  483. }
  484. return false;
  485. }
  486. /**
  487. * 属性为多选判断
  488. * @param ptlAgreementProductCostsAttrLink
  489. * @param value
  490. * @return
  491. */
  492. private boolean checkBoxEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value){
  493. if(ptlAgreementProductCostsAttrLink.getMin().contains(value)){
  494. return true;
  495. }
  496. return false;
  497. }
  498. private boolean checkBoxEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value){
  499. if(ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)){
  500. return false;
  501. }
  502. return true;
  503. }
  504. /**
  505. * 属性为数值型判断
  506. * @param ptlAgreementProductCostsAttrLink
  507. * @param value
  508. * @return
  509. */
  510. private boolean inputNumberEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value){
  511. double v = Double.parseDouble(value);
  512. //统一处理数值
  513. if("1".equals(ptlAgreementProductCostsAttrLink.getOperator())){
  514. if(Integer.parseInt(ptlAgreementProductCostsAttrLink.getMin()) <= v &&
  515. Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) >= v){
  516. return true;
  517. }
  518. }else if("2".equals(ptlAgreementProductCostsAttrLink.getOperator())){
  519. if(Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) > v){
  520. return true;
  521. }
  522. }else if("3".equals(ptlAgreementProductCostsAttrLink.getOperator())){
  523. if(Double.parseDouble(ptlAgreementProductCostsAttrLink.getMin()) >= v){
  524. return true;
  525. }
  526. }else if("4".equals(ptlAgreementProductCostsAttrLink.getOperator())){
  527. if(Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) < v){
  528. return true;
  529. }
  530. }else if("5".equals(ptlAgreementProductCostsAttrLink.getOperator())){
  531. if(Double.parseDouble(ptlAgreementProductCostsAttrLink.getMax()) <= v){
  532. return true;
  533. }
  534. }
  535. return false;
  536. }
  537. private boolean inputNumberEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value){
  538. double v = Double.parseDouble(value);
  539. //统一处理数值
  540. if("1".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())){
  541. if(Integer.parseInt(ptlAgreementUndwrtRulesAttrLink.getMin()) <= v &&
  542. Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) >= v){
  543. return false;
  544. }
  545. }else if("2".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())){
  546. if(Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) > v){
  547. return false;
  548. }
  549. }else if("3".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())){
  550. if(Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMin()) >= v){
  551. return false;
  552. }
  553. }else if("4".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())){
  554. if(Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) < v){
  555. return false;
  556. }
  557. }else if("5".equals(ptlAgreementUndwrtRulesAttrLink.getOperator())){
  558. if(Double.parseDouble(ptlAgreementUndwrtRulesAttrLink.getMax()) <= v){
  559. return false;
  560. }
  561. }
  562. return true;
  563. }
  564. /**
  565. * 属性为输入框判断
  566. * @param ptlAgreementProductCostsAttrLink
  567. * @param value
  568. * @return
  569. */
  570. private boolean inputTextEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value){
  571. //将值进行分割
  572. String[] split = ptlAgreementProductCostsAttrLink.getMin().split(",");
  573. AtomicBoolean returnBool = new AtomicBoolean(false);
  574. Arrays.stream(split).forEach(x -> {
  575. if(x.contains(value)){
  576. returnBool.set(true);
  577. }
  578. });
  579. return returnBool.get();
  580. }
  581. private boolean inputTextEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value){
  582. //将值进行分割
  583. String[] split = ptlAgreementUndwrtRulesAttrLink.getMin().split(",");
  584. AtomicBoolean returnBool = new AtomicBoolean(true);
  585. Arrays.stream(split).forEach(x -> {
  586. if(x.contains(value)){
  587. returnBool.set(false);
  588. }
  589. });
  590. return returnBool.get();
  591. }
  592. /**
  593. * 属性为下拉框判断
  594. * @param ptlAgreementProductCostsAttrLink
  595. * @param value
  596. * @return
  597. */
  598. private boolean selectEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value){
  599. if(ptlAgreementProductCostsAttrLink.getMin().contains(value)){
  600. return true;
  601. }
  602. return false;
  603. }
  604. private boolean selectEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value){
  605. if(ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)){
  606. return false;
  607. }
  608. return true;
  609. }
  610. private boolean radioEqual(PtlAgreementProductCostsAttrLink ptlAgreementProductCostsAttrLink, String value){
  611. //新能源判断
  612. if("NewEnergy".equals(ptlAgreementProductCostsAttrLink.getAttrCode())){
  613. if(EnergyType.isNewEnergy(ptlAgreementProductCostsAttrLink.getMin())){
  614. return true;
  615. }
  616. }else
  617. if(ptlAgreementProductCostsAttrLink.getMin().contains(value)){
  618. return true;
  619. }
  620. return false;
  621. }
  622. private boolean radioEqual(PtlAgreementUndwrtRulesAttrLink ptlAgreementUndwrtRulesAttrLink, String value){
  623. //新能源判断
  624. if("NewEnergy".equals(ptlAgreementUndwrtRulesAttrLink.getAttrCode())){
  625. if(EnergyType.isNewEnergy(ptlAgreementUndwrtRulesAttrLink.getMin())){
  626. return false;
  627. }
  628. }else
  629. if(ptlAgreementUndwrtRulesAttrLink.getMin().contains(value)){
  630. return false;
  631. }
  632. return true;
  633. }
  634. }