CostsCalServiceImpl.java 13 KB

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