package com.ydtech.modules.fee.service.impl; import com.ydtech.exception.SystemException; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.admin.service.SysDeptService; import com.ydtech.modules.admin.service.SysUserService; import com.ydtech.modules.esm.model.EsmRetail; import com.ydtech.modules.esm.model.EsmUserReferrer; import com.ydtech.modules.esm.service.EsmRetailService; import com.ydtech.modules.esm.service.EsmUserReferrerService; import com.ydtech.modules.fee.dto.FeeFactorInfoDto; import com.ydtech.modules.fee.dto.FeeSchemeReqDto; import com.ydtech.modules.fee.dto.FeeSchemeResDto; import com.ydtech.modules.fee.dto.vo.DeptManagerFee; import com.ydtech.modules.fee.dto.vo.EntranceFee; import com.ydtech.modules.fee.dto.vo.ExportFee; import com.ydtech.modules.fee.dto.vo.RetailStoreFee; import com.ydtech.modules.fee.service.CostsCalcService; import com.ydtech.modules.fee.service.FeeRuleSchemeNewService; import com.ydtech.modules.fee.service.FeeRuleSchemeService; import com.ydtech.modules.ins.model.vo.CarInfoVo; import com.ydtech.modules.ins.model.vo.KindInfoVo; import com.ydtech.modules.ins.model.vo.QuoteRespVo; import com.ydtech.modules.order.entity.InsCopyFeeOrder; import com.ydtech.modules.order.entity.InsFeeOrder; import com.ydtech.modules.order.entity.InsOrders; import com.ydtech.modules.order.entity.vo.*; import com.ydtech.modules.order.service.InsAreaCompanyService; import com.ydtech.modules.order.service.InsCopyFeeOrderService; import com.ydtech.modules.order.service.InsFeeOrderService; import com.ydtech.modules.order.service.InsOrdersService; import com.ydtech.modules.protocol.entity.po.*; import com.ydtech.modules.protocol.service.*; import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew; import com.ydtech.modules.protocols.entity.po.PtlAgreementProductCostsNew; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; /** * 费用接口中相关功能的实现类 */ @Service public class CostsCalServiceImpl implements CostsCalcService { @Autowired private SysUserService sysUserService; @Autowired private EsmRetailService esmRetailService; @Autowired private EsmUserReferrerService esmUserReferrerService; @Autowired private PtlAgreementService ptlAgreementService; @Autowired private FeeRuleSchemeService feeRuleSchemeService; @Autowired private FeeRuleSchemeNewService feeRuleSchemeNewService; @Override public EntranceFee getEntranceFee(String insuranceType, BigDecimal jqPremium, BigDecimal feeRadio, BigDecimal documentFeeRadio) { EntranceFee entranceFee = new EntranceFee(); entranceFee.setInsuranceType(insuranceType); entranceFee.setPremium(jqPremium); entranceFee.setTotalProportion(feeRadio.add(documentFeeRadio)); entranceFee.setSuperviseCosts(feeRadio); entranceFee.setSySuperviseCostsPremiums(jqPremium.multiply(feeRadio.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); entranceFee.setOtherCostsProportion(documentFeeRadio); entranceFee.setOtherCostsPremiums(jqPremium.multiply(documentFeeRadio.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); entranceFee.setTotalAmount(entranceFee.getSySuperviseCostsPremiums().add(entranceFee.getOtherCostsPremiums())); entranceFee.setExportSuperviseCosts(BigDecimal.ZERO); return entranceFee; } @Override public DeptManagerFee getDeptManagerFee(String insuranceType, BigDecimal premium, BigDecimal deptRadioLevel1, BigDecimal deptRadioLevel2, BigDecimal deptRadioLevel3, BigDecimal deptRadioLevel4, BigDecimal deptRadioLevel5) { DeptManagerFee deptManagerFee = new DeptManagerFee(); deptManagerFee.setInsuranceType(insuranceType); deptManagerFee.setDeptManagerRadioLevel1(deptRadioLevel1); deptManagerFee.setDeptManagerRadioLevel2(deptRadioLevel2); deptManagerFee.setDeptManagerRadioLevel3(deptRadioLevel3); deptManagerFee.setDeptManagerRadioLevel4(deptRadioLevel4); deptManagerFee.setDeptManagerRadioLevel5(deptRadioLevel5); deptManagerFee.setDeptManagerRadio(deptRadioLevel1.add(deptRadioLevel2).add(deptRadioLevel3).add(deptRadioLevel4).add(deptRadioLevel5)); deptManagerFee.setDeptManagerFeeLevel1(premium.multiply(deptRadioLevel1.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); deptManagerFee.setDeptManagerFeeLevel2(premium.multiply(deptRadioLevel2.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); deptManagerFee.setDeptManagerFeeLevel3(premium.multiply(deptRadioLevel3.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); deptManagerFee.setDeptManagerFeeLevel4(premium.multiply(deptRadioLevel4.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); deptManagerFee.setDeptManagerFeeLevel5(premium.multiply(deptRadioLevel5.divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); deptManagerFee.setDeptManagerFee(premium.multiply(deptManagerFee.getDeptManagerRadio().divide(new BigDecimal(100))).setScale(2, BigDecimal.ROUND_DOWN)); return deptManagerFee; } @Override public RetailStoreFee getRetailStoreFee(String userId,BigDecimal sumPremium) { RetailStoreFee retailStoreFee = new RetailStoreFee(); //计算分销费用 SysUser sysUser = sysUserService.findByUserId(userId); //获取分销比例 List esmRetailList = esmRetailService.selectList(" where t.deptid=? and t.status = '1' ", new Object[]{sysUser.getDeptId()}); if (esmRetailList != null && !esmRetailList.isEmpty()) { EsmRetail esmRetail = esmRetailList.get(0); //用户分销人员id List parents = esmUserReferrerService.findParents(sysUser.getId()); if (esmRetail != null) { // BigDecimal sumPremium = insFeeOrderNew.getJqPremium().add(insFeeOrderNew.getSyPremium()).add(insFeeOrderNew.getNoPremium()); if (Integer.parseInt(esmRetail.getRetailtype()) >= 3) { retailStoreFee.setRetailStoreRadioLevel3(new BigDecimal(esmRetail.getDisrate3())); retailStoreFee.setRetailStoreFeeLevel3(sumPremium.multiply(new BigDecimal(esmRetail.getDisrate3())).divide(new BigDecimal("100"))); if (parents != null && parents.size() > 2) { retailStoreFee.setRetailStoreUserIdLevel3(parents.get(2).getId()); } }else{ retailStoreFee.setRetailStoreRadioLevel3(new BigDecimal(0)); retailStoreFee.setRetailStoreFeeLevel3(new BigDecimal(0)); } if (Integer.parseInt(esmRetail.getRetailtype()) >= 2) { retailStoreFee.setRetailStoreRadioLevel2(new BigDecimal(esmRetail.getDisrate2())); retailStoreFee.setRetailStoreFeeLevel2(sumPremium.multiply(new BigDecimal(esmRetail.getDisrate2())).divide(new BigDecimal("100"))); if (parents != null && parents.size() > 1) { retailStoreFee.setRetailStoreUserIdLevel2(parents.get(1).getId()); } }else{ retailStoreFee.setRetailStoreRadioLevel2(new BigDecimal(0)); retailStoreFee.setRetailStoreFeeLevel2(new BigDecimal(0)); } if (Integer.parseInt(esmRetail.getRetailtype()) >= 1) { retailStoreFee.setRetailStoreRadioLevel1(new BigDecimal(esmRetail.getDisrate1())); retailStoreFee.setRetailStoreFeeLevel1(sumPremium.multiply(new BigDecimal(esmRetail.getDisrate1())).divide(new BigDecimal("100"))); if (parents != null && parents.size() > 0) { retailStoreFee.setRetailStoreUserIdLevel1(parents.get(0).getId()); } }else{ retailStoreFee.setRetailStoreRadioLevel1(new BigDecimal(0)); retailStoreFee.setRetailStoreFeeLevel1(new BigDecimal(0)); } } BigDecimal retailStore = (retailStoreFee.getRetailStoreRadioLevel1() != null ? retailStoreFee.getRetailStoreRadioLevel1() : new BigDecimal(0)) .add(retailStoreFee.getRetailStoreRadioLevel2() != null ? retailStoreFee.getRetailStoreRadioLevel2() : new BigDecimal(0)) .add(retailStoreFee.getRetailStoreRadioLevel3() != null ? retailStoreFee.getRetailStoreRadioLevel3() : new BigDecimal(0)); retailStoreFee.setRetailStoreRadio(retailStore); }else{ retailStoreFee.setRetailStoreFee(BigDecimal.ZERO); retailStoreFee.setRetailStoreRadio(BigDecimal.ZERO); retailStoreFee.setRetailStoreRadioLevel1(BigDecimal.ZERO); retailStoreFee.setRetailStoreRadioLevel2(BigDecimal.ZERO); retailStoreFee.setRetailStoreRadioLevel3(BigDecimal.ZERO); retailStoreFee.setRetailStoreFeeLevel1(BigDecimal.ZERO); retailStoreFee.setRetailStoreFeeLevel2(BigDecimal.ZERO); retailStoreFee.setRetailStoreFeeLevel3(BigDecimal.ZERO); retailStoreFee.setRetailStoreUserIdLevel1(""); retailStoreFee.setRetailStoreUserIdLevel2(""); retailStoreFee.setRetailStoreUserIdLevel3(""); } return retailStoreFee; } @Override public ExportFee getExportFee(String insuranceType,EntranceFee entranceFee,DeptManagerFee deptManagerFee, RetailStoreFee retailStoreFee,BigDecimal exportProceduresRadio) { ExportFee exportFee = new ExportFee(); //计算出口费用 //出口比例 BigDecimal exportRadio = entranceFee.getTotalProportion().subtract(deptManagerFee.getDeptManagerRadio()).subtract(retailStoreFee.getRetailStoreRadio()); //出口费用 exportFee.setSuperviseCosts(exportProceduresRadio); exportFee.setSuperviseCostsPremiums(entranceFee.getPremium().multiply(exportProceduresRadio.divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN)); //跟单比例 exportFee.setOtherCostsProportion(exportRadio.subtract(exportProceduresRadio)); //跟单费用 exportFee.setOtherCostsPremiums(entranceFee.getPremium().multiply(exportFee.getOtherCostsProportion().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN)); //总比例 exportFee.setTotalProportion(exportFee.getSuperviseCosts().add(exportFee.getOtherCostsProportion())); //总费用 exportFee.setTotalAmount(exportFee.getSuperviseCostsPremiums().add(exportFee.getOtherCostsPremiums().divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN)); return exportFee; } // @Override // public SubOrderExportFeeVo getExportFee(InsFeeOrderNew insFeeOrderNew) { // //查询协议是否包含税 // PtlAgreement ptlAgreement = ptlAgreementService.getById(insFeeOrderNew.getAgreementId()); // BigDecimal taxRadio = new BigDecimal("1.00"); // if(ptlAgreement.getWithTax().equals("否")){ // taxRadio = new BigDecimal("1.06"); // } // SubOrderExportFeeVo subOrderExportFeeVo = new SubOrderExportFeeVo(); // // //计算出口费用 // // //分销管理比例总和 // BigDecimal retailStoreProportion = insFeeOrderNew.getFirstDetailProportion().add(insFeeOrderNew.getSecondDetailProportion()). // add(insFeeOrderNew.getThirdDetailProportion()); // // // //交强机构管理费 // BigDecimal jqDeptProportion = insFeeOrderNew.getJqDeptProportionLevel1().add(insFeeOrderNew.getJqDeptProportionLevel2()).add(insFeeOrderNew.getJqDeptProportionLevel3()).add(insFeeOrderNew.getJqDeptProportionLevel4()).add(insFeeOrderNew.getJqDeptProportionLevel5()); // //商业部门管理比例总和 // BigDecimal syDeptProportion = insFeeOrderNew.getSyDeptProportionLevel1().add(insFeeOrderNew.getSyDeptProportionLevel2()).add(insFeeOrderNew.getSyDeptProportionLevel3()).add(insFeeOrderNew.getSyDeptProportionLevel4()).add(insFeeOrderNew.getSyDeptProportionLevel5()); // //非车部门比例总和 // BigDecimal noDeptProportion = insFeeOrderNew.getNoDeptProportionLevel1().add(insFeeOrderNew.getNoDeptProportionLevel2()).add(insFeeOrderNew.getNoDeptProportionLevel3()).add(insFeeOrderNew.getNoDeptProportionLevel4()).add(insFeeOrderNew.getNoDeptProportionLevel5()); // // //交强出口费用 // FeeOrderNewVo.ExportFee jqExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getJqPremium(), insFeeOrderNew.getJqCostsExportProportion(), // insFeeOrderNew.getJqCostsProportion(), jqDeptProportion, retailStoreProportion, taxRadio); // subOrderExportFeeVo.setJqExportCosts(jqExportFee.getTotalAmount()); // // //商业出口费用 // FeeOrderNewVo.ExportFee syExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getSyPremium(), insFeeOrderNew.getSyCostsExportProportion(), // insFeeOrderNew.getSyCostsProportion(), syDeptProportion, retailStoreProportion, taxRadio); // subOrderExportFeeVo.setSyExportCosts(syExportFee.getTotalAmount()); // // //非车出口费用 // FeeOrderNewVo.ExportFee noExportFee = feeRuleSchemeService.calcExportFee(insFeeOrderNew.getNoPremium(), insFeeOrderNew.getNoCostsExportProportion(), // insFeeOrderNew.getNoCostsProportion(), noDeptProportion, retailStoreProportion, taxRadio); // subOrderExportFeeVo.setNoExportCosts(noExportFee.getTotalAmount()); // // // // return subOrderExportFeeVo; // } @Override public SubOrderExportFeeVo getExportFee(InsFeeOrderNew insFeeOrderNew) { SubOrderExportFeeVo subOrderExportFeeVo = new SubOrderExportFeeVo(); if(!Objects.isNull(insFeeOrderNew)) { if (insFeeOrderNew.getJqExportSuperviseCostsPremiums() == null) { insFeeOrderNew.setJqExportSuperviseCostsPremiums(BigDecimal.ZERO); } if (insFeeOrderNew.getJqExportOtherCostsPremiums() == null) { insFeeOrderNew.setJqExportOtherCostsPremiums(BigDecimal.ZERO); } if (insFeeOrderNew.getSyExportSuperviseCostsPremiums() == null) { insFeeOrderNew.setSyExportSuperviseCostsPremiums(BigDecimal.ZERO); } if (insFeeOrderNew.getSyExportOtherCostsPremiums() == null) { insFeeOrderNew.setSyExportOtherCostsPremiums(BigDecimal.ZERO); } if (insFeeOrderNew.getNoExportSuperviseCostsPremiums() == null) { insFeeOrderNew.setNoExportSuperviseCostsPremiums(BigDecimal.ZERO); } if (insFeeOrderNew.getNoExportOtherCostsPremiums() == null) { insFeeOrderNew.setNoExportOtherCostsPremiums(BigDecimal.ZERO); } subOrderExportFeeVo.setJqExportCosts(insFeeOrderNew.getJqExportSuperviseCostsPremiums().add(insFeeOrderNew.getJqExportOtherCostsPremiums())); subOrderExportFeeVo.setSyExportCosts(insFeeOrderNew.getSyExportSuperviseCostsPremiums().add(insFeeOrderNew.getSyExportOtherCostsPremiums())); subOrderExportFeeVo.setNoExportCosts(insFeeOrderNew.getNoExportSuperviseCostsPremiums().add(insFeeOrderNew.getNoExportOtherCostsPremiums())); subOrderExportFeeVo.setJqExportRadio(insFeeOrderNew.getJqCostsExportProportion().add(insFeeOrderNew.getJqExportOtherCostsProportion())); subOrderExportFeeVo.setSyExportRadio(insFeeOrderNew.getSyCostsExportProportion().add(insFeeOrderNew.getSyExportOtherCostsProportion())); subOrderExportFeeVo.setNoExportRadio(insFeeOrderNew.getNoCostsExportProportion().add(insFeeOrderNew.getNoExportOtherCostsProportion())); return subOrderExportFeeVo; } return new SubOrderExportFeeVo(); } }