CostsCalServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package com.ydtech.modules.fee.service.impl;
  2. import com.ydtech.exception.SystemException;
  3. import com.ydtech.modules.admin.model.SysUser;
  4. import com.ydtech.modules.admin.service.SysDeptService;
  5. import com.ydtech.modules.admin.service.SysUserService;
  6. import com.ydtech.modules.esm.model.EsmRetail;
  7. import com.ydtech.modules.esm.model.EsmUserReferrer;
  8. import com.ydtech.modules.esm.service.EsmRetailService;
  9. import com.ydtech.modules.esm.service.EsmUserReferrerService;
  10. import com.ydtech.modules.fee.dto.FeeFactorInfoDto;
  11. import com.ydtech.modules.fee.dto.FeeSchemeReqDto;
  12. import com.ydtech.modules.fee.dto.FeeSchemeResDto;
  13. import com.ydtech.modules.fee.dto.vo.DeptManagerFee;
  14. import com.ydtech.modules.fee.dto.vo.EntranceFee;
  15. import com.ydtech.modules.fee.dto.vo.ExportFee;
  16. import com.ydtech.modules.fee.dto.vo.RetailStoreFee;
  17. import com.ydtech.modules.fee.service.CostsCalcService;
  18. import com.ydtech.modules.fee.service.FeeRuleSchemeNewService;
  19. import com.ydtech.modules.fee.service.FeeRuleSchemeService;
  20. import com.ydtech.modules.ins.model.vo.CarInfoVo;
  21. import com.ydtech.modules.ins.model.vo.KindInfoVo;
  22. import com.ydtech.modules.ins.model.vo.QuoteRespVo;
  23. import com.ydtech.modules.order.entity.InsCopyFeeOrder;
  24. import com.ydtech.modules.order.entity.InsFeeOrder;
  25. import com.ydtech.modules.order.entity.InsOrders;
  26. import com.ydtech.modules.order.entity.vo.*;
  27. import com.ydtech.modules.order.service.InsAreaCompanyService;
  28. import com.ydtech.modules.order.service.InsCopyFeeOrderService;
  29. import com.ydtech.modules.order.service.InsFeeOrderService;
  30. import com.ydtech.modules.order.service.InsOrdersService;
  31. import com.ydtech.modules.protocol.entity.po.*;
  32. import com.ydtech.modules.protocol.service.*;
  33. import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
  34. import com.ydtech.modules.protocols.entity.po.PtlAgreementProductCostsNew;
  35. import org.apache.commons.lang3.ObjectUtils;
  36. import org.apache.commons.lang3.StringUtils;
  37. import org.apache.commons.lang3.math.NumberUtils;
  38. import org.springframework.beans.factory.annotation.Autowired;
  39. import org.springframework.stereotype.Service;
  40. import javax.annotation.Resource;
  41. import java.math.BigDecimal;
  42. import java.math.RoundingMode;
  43. import java.text.SimpleDateFormat;
  44. import java.time.LocalDate;
  45. import java.time.format.DateTimeFormatter;
  46. import java.util.*;
  47. import java.util.stream.Collectors;
  48. /**
  49. * 费用接口中相关功能的实现类
  50. */
  51. @Service
  52. public class CostsCalServiceImpl implements CostsCalcService {
  53. @Autowired
  54. private SysUserService sysUserService;
  55. @Autowired
  56. private EsmRetailService esmRetailService;
  57. @Autowired
  58. private EsmUserReferrerService esmUserReferrerService;
  59. @Autowired
  60. private PtlAgreementService ptlAgreementService;
  61. @Autowired
  62. private FeeRuleSchemeService feeRuleSchemeService;
  63. @Autowired
  64. private FeeRuleSchemeNewService feeRuleSchemeNewService;
  65. @Override
  66. public EntranceFee getEntranceFee(String insuranceType, BigDecimal jqPremium, BigDecimal feeRadio, BigDecimal documentFeeRadio) {
  67. EntranceFee entranceFee = new EntranceFee();
  68. entranceFee.setInsuranceType(insuranceType);
  69. entranceFee.setPremium(jqPremium);
  70. entranceFee.setTotalProportion(feeRadio.add(documentFeeRadio));
  71. entranceFee.setSuperviseCosts(feeRadio);
  72. entranceFee.setSySuperviseCostsPremiums(jqPremium.multiply(feeRadio.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  73. entranceFee.setOtherCostsProportion(documentFeeRadio);
  74. entranceFee.setOtherCostsPremiums(jqPremium.multiply(documentFeeRadio.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  75. entranceFee.setTotalAmount(entranceFee.getSySuperviseCostsPremiums().add(entranceFee.getOtherCostsPremiums()));
  76. entranceFee.setExportSuperviseCosts(BigDecimal.ZERO);
  77. return entranceFee;
  78. }
  79. @Override
  80. public DeptManagerFee getDeptManagerFee(String insuranceType, BigDecimal premium, BigDecimal deptRadioLevel1, BigDecimal deptRadioLevel2, BigDecimal deptRadioLevel3, BigDecimal deptRadioLevel4, BigDecimal deptRadioLevel5) {
  81. DeptManagerFee deptManagerFee = new DeptManagerFee();
  82. deptManagerFee.setInsuranceType(insuranceType);
  83. deptManagerFee.setDeptManagerRadioLevel1(deptRadioLevel1);
  84. deptManagerFee.setDeptManagerRadioLevel2(deptRadioLevel2);
  85. deptManagerFee.setDeptManagerRadioLevel3(deptRadioLevel3);
  86. deptManagerFee.setDeptManagerRadioLevel4(deptRadioLevel4);
  87. deptManagerFee.setDeptManagerRadioLevel5(deptRadioLevel5);
  88. deptManagerFee.setDeptManagerRadio(deptRadioLevel1.add(deptRadioLevel2).add(deptRadioLevel3).add(deptRadioLevel4).add(deptRadioLevel5));
  89. deptManagerFee.setDeptManagerFeeLevel1(premium.multiply(deptRadioLevel1.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  90. deptManagerFee.setDeptManagerFeeLevel2(premium.multiply(deptRadioLevel2.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  91. deptManagerFee.setDeptManagerFeeLevel3(premium.multiply(deptRadioLevel3.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  92. deptManagerFee.setDeptManagerFeeLevel4(premium.multiply(deptRadioLevel4.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  93. deptManagerFee.setDeptManagerFeeLevel5(premium.multiply(deptRadioLevel5.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  94. deptManagerFee.setDeptManagerFee(premium.multiply(deptManagerFee.getDeptManagerRadio().divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN));
  95. return deptManagerFee;
  96. }
  97. @Override
  98. public RetailStoreFee getRetailStoreFee(String userId,BigDecimal sumPremium) {
  99. RetailStoreFee retailStoreFee = new RetailStoreFee();
  100. //计算分销费用
  101. SysUser sysUser = sysUserService.findByUserId(userId);
  102. //获取分销比例
  103. List<EsmRetail> esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ",
  104. new Object[]{sysUser.getDeptId()});
  105. if (esmRetailList != null && !esmRetailList.isEmpty()) {
  106. EsmRetail esmRetail = esmRetailList.get(0);
  107. //用户分销人员id
  108. List<EsmUserReferrer> parents = esmUserReferrerService.findParents(sysUser.getId());
  109. if (esmRetail != null) {
  110. // BigDecimal sumPremium = insFeeOrderNew.getJqPremium().add(insFeeOrderNew.getSyPremium()).add(insFeeOrderNew.getNoPremium());
  111. if (Integer.parseInt(esmRetail.getRetailtype()) >= 3) {
  112. retailStoreFee.setRetailStoreRadioLevel3(new BigDecimal(esmRetail.getDisrate3()));
  113. retailStoreFee.setRetailStoreFeeLevel3(sumPremium.multiply(new BigDecimal(esmRetail.getDisrate3())).divide(new BigDecimal("100")));
  114. if (parents != null && parents.size() > 2) {
  115. retailStoreFee.setRetailStoreUserIdLevel3(parents.get(2).getId());
  116. }
  117. }else{
  118. retailStoreFee.setRetailStoreRadioLevel3(new BigDecimal(0));
  119. retailStoreFee.setRetailStoreFeeLevel3(new BigDecimal(0));
  120. }
  121. if (Integer.parseInt(esmRetail.getRetailtype()) >= 2) {
  122. retailStoreFee.setRetailStoreRadioLevel2(new BigDecimal(esmRetail.getDisrate2()));
  123. retailStoreFee.setRetailStoreFeeLevel2(sumPremium.multiply(new BigDecimal(esmRetail.getDisrate2())).divide(new BigDecimal("100")));
  124. if (parents != null && parents.size() > 1) {
  125. retailStoreFee.setRetailStoreUserIdLevel2(parents.get(1).getId());
  126. }
  127. }else{
  128. retailStoreFee.setRetailStoreRadioLevel2(new BigDecimal(0));
  129. retailStoreFee.setRetailStoreFeeLevel2(new BigDecimal(0));
  130. }
  131. if (Integer.parseInt(esmRetail.getRetailtype()) >= 1) {
  132. retailStoreFee.setRetailStoreRadioLevel1(new BigDecimal(esmRetail.getDisrate1()));
  133. retailStoreFee.setRetailStoreFeeLevel1(sumPremium.multiply(new BigDecimal(esmRetail.getDisrate1())).divide(new BigDecimal("100")));
  134. if (parents != null && parents.size() > 0) {
  135. retailStoreFee.setRetailStoreUserIdLevel1(parents.get(0).getId());
  136. }
  137. }else{
  138. retailStoreFee.setRetailStoreRadioLevel1(new BigDecimal(0));
  139. retailStoreFee.setRetailStoreFeeLevel1(new BigDecimal(0));
  140. }
  141. }
  142. BigDecimal retailStore = (retailStoreFee.getRetailStoreRadioLevel1() != null ? retailStoreFee.getRetailStoreRadioLevel1() : new BigDecimal(0))
  143. .add(retailStoreFee.getRetailStoreRadioLevel2() != null ? retailStoreFee.getRetailStoreRadioLevel2() : new BigDecimal(0))
  144. .add(retailStoreFee.getRetailStoreRadioLevel3() != null ? retailStoreFee.getRetailStoreRadioLevel3() : new BigDecimal(0));
  145. retailStoreFee.setRetailStoreRadio(retailStore);
  146. }else{
  147. retailStoreFee.setRetailStoreFee(BigDecimal.ZERO);
  148. retailStoreFee.setRetailStoreRadio(BigDecimal.ZERO);
  149. retailStoreFee.setRetailStoreRadioLevel1(BigDecimal.ZERO);
  150. retailStoreFee.setRetailStoreRadioLevel2(BigDecimal.ZERO);
  151. retailStoreFee.setRetailStoreRadioLevel3(BigDecimal.ZERO);
  152. retailStoreFee.setRetailStoreFeeLevel1(BigDecimal.ZERO);
  153. retailStoreFee.setRetailStoreFeeLevel2(BigDecimal.ZERO);
  154. retailStoreFee.setRetailStoreFeeLevel3(BigDecimal.ZERO);
  155. retailStoreFee.setRetailStoreUserIdLevel1("");
  156. retailStoreFee.setRetailStoreUserIdLevel2("");
  157. retailStoreFee.setRetailStoreUserIdLevel3("");
  158. }
  159. return retailStoreFee;
  160. }
  161. @Override
  162. public ExportFee getExportFee(String insuranceType,EntranceFee entranceFee,DeptManagerFee deptManagerFee, RetailStoreFee retailStoreFee,BigDecimal exportProceduresRadio) {
  163. ExportFee exportFee = new ExportFee();
  164. //计算出口费用
  165. //出口比例
  166. BigDecimal exportRadio = entranceFee.getTotalProportion().subtract(deptManagerFee.getDeptManagerRadio()).subtract(retailStoreFee.getRetailStoreRadio());
  167. //出口费用
  168. exportFee.setSuperviseCosts(exportProceduresRadio);
  169. exportFee.setSuperviseCostsPremiums(entranceFee.getPremium().multiply(exportProceduresRadio.divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN));
  170. //跟单比例
  171. exportFee.setOtherCostsProportion(exportRadio.subtract(exportProceduresRadio));
  172. //跟单费用
  173. exportFee.setOtherCostsPremiums(entranceFee.getPremium().multiply(exportFee.getOtherCostsProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN));
  174. //总比例
  175. exportFee.setTotalProportion(exportFee.getSuperviseCosts().add(exportFee.getOtherCostsProportion()));
  176. //总费用
  177. exportFee.setTotalAmount(exportFee.getSuperviseCostsPremiums().add(exportFee.getOtherCostsPremiums().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN));
  178. return exportFee;
  179. }
  180. // @Override
  181. // public SubOrderExportFeeVo getExportFee(InsFeeOrderNew insFeeOrderNew) {
  182. // //查询协议是否包含税
  183. // PtlAgreement ptlAgreement = ptlAgreementService.getById(insFeeOrderNew.getAgreementId());
  184. // BigDecimal taxRadio = new BigDecimal("1.00");
  185. // if(ptlAgreement.getWithTax().equals("否")){
  186. // taxRadio = new BigDecimal("1.06");
  187. // }
  188. // SubOrderExportFeeVo subOrderExportFeeVo = new SubOrderExportFeeVo();
  189. //
  190. // //计算出口费用
  191. //
  192. // //分销管理比例总和
  193. // BigDecimal retailStoreProportion = insFeeOrderNew.getFirstDetailProportion().add(insFeeOrderNew.getSecondDetailProportion()).
  194. // add(insFeeOrderNew.getThirdDetailProportion());
  195. //
  196. //
  197. // //交强机构管理费
  198. // BigDecimal jqDeptProportion = insFeeOrderNew.getJqDeptProportionLevel1().add(insFeeOrderNew.getJqDeptProportionLevel2()).add(insFeeOrderNew.getJqDeptProportionLevel3()).add(insFeeOrderNew.getJqDeptProportionLevel4()).add(insFeeOrderNew.getJqDeptProportionLevel5());
  199. // //商业部门管理比例总和
  200. // BigDecimal syDeptProportion = insFeeOrderNew.getSyDeptProportionLevel1().add(insFeeOrderNew.getSyDeptProportionLevel2()).add(insFeeOrderNew.getSyDeptProportionLevel3()).add(insFeeOrderNew.getSyDeptProportionLevel4()).add(insFeeOrderNew.getSyDeptProportionLevel5());
  201. // //非车部门比例总和
  202. // BigDecimal noDeptProportion = insFeeOrderNew.getNoDeptProportionLevel1().add(insFeeOrderNew.getNoDeptProportionLevel2()).add(insFeeOrderNew.getNoDeptProportionLevel3()).add(insFeeOrderNew.getNoDeptProportionLevel4()).add(insFeeOrderNew.getNoDeptProportionLevel5());
  203. //
  204. // //交强出口费用
  205. // FeeOrderNewVo.ExportFee jqExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getJqPremium(), insFeeOrderNew.getJqCostsExportProportion(),
  206. // insFeeOrderNew.getJqCostsProportion(), jqDeptProportion, retailStoreProportion, taxRadio);
  207. // subOrderExportFeeVo.setJqExportCosts(jqExportFee.getTotalAmount());
  208. //
  209. // //商业出口费用
  210. // FeeOrderNewVo.ExportFee syExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getSyPremium(), insFeeOrderNew.getSyCostsExportProportion(),
  211. // insFeeOrderNew.getSyCostsProportion(), syDeptProportion, retailStoreProportion, taxRadio);
  212. // subOrderExportFeeVo.setSyExportCosts(syExportFee.getTotalAmount());
  213. //
  214. // //非车出口费用
  215. // FeeOrderNewVo.ExportFee noExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getNoPremium(), insFeeOrderNew.getNoCostsExportProportion(),
  216. // insFeeOrderNew.getNoCostsProportion(), noDeptProportion, retailStoreProportion, taxRadio);
  217. // subOrderExportFeeVo.setNoExportCosts(noExportFee.getTotalAmount());
  218. //
  219. //
  220. //
  221. // return subOrderExportFeeVo;
  222. // }
  223. @Override
  224. public SubOrderExportFeeVo getExportFee(InsFeeOrderNew insFeeOrderNew) {
  225. SubOrderExportFeeVo subOrderExportFeeVo = new SubOrderExportFeeVo();
  226. subOrderExportFeeVo.setJqExportCosts(insFeeOrderNew.getJqExportSuperviseCostsPremiums().add(insFeeOrderNew.getJqExportOtherCostsPremiums()));
  227. subOrderExportFeeVo.setSyExportCosts(insFeeOrderNew.getSyExportSuperviseCostsPremiums().add(insFeeOrderNew.getSyExportOtherCostsPremiums()));
  228. subOrderExportFeeVo.setNoExportCosts(insFeeOrderNew.getNoExportSuperviseCostsPremiums().add(insFeeOrderNew.getNoExportOtherCostsPremiums()));
  229. subOrderExportFeeVo.setJqExportRadio(insFeeOrderNew.getJqCostsExportProportion().add(insFeeOrderNew.getJqExportOtherCostsProportion()));
  230. subOrderExportFeeVo.setSyExportRadio(insFeeOrderNew.getSyCostsExportProportion().add(insFeeOrderNew.getSyExportOtherCostsProportion()));
  231. subOrderExportFeeVo.setNoExportRadio(insFeeOrderNew.getNoCostsExportProportion().add(insFeeOrderNew.getNoExportOtherCostsProportion()));
  232. return subOrderExportFeeVo;
  233. }
  234. }