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.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; @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.setRetailStoreRadioLevel1(new BigDecimal(esmRetail.getDisrate1())); retailStoreFee.setRetailStoreFeeLevel1(sumPremium.multiply(new BigDecimal(esmRetail.getDisrate1())).divide(new BigDecimal("100"))); if (parents != null && parents.size() > 2) { retailStoreFee.setRetailStoreUserIdLevel3(parents.get(2).getId()); } } 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()); } } 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.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 jqEntranceProportion = insFeeOrderNew.getJqSuperviseCostsProportion().add(insFeeOrderNew.getJqOtherCostsProportion()).divide(taxRadio,2, RoundingMode.HALF_DOWN); //交强出口总比例 BigDecimal jqExportProportion = jqEntranceProportion.subtract(jqDeptProportion).subtract(retailStoreProportion); //交强出口金额 subOrderExportFeeVo.setJqExportCosts(insFeeOrderNew.getJqPremium().multiply(taxRadio).multiply(jqExportProportion.divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN)); //商业入口比例总和 BigDecimal syEntranceProportion = insFeeOrderNew.getSySuperviseCostsProportion().add(insFeeOrderNew.getSyOtherCostsProportion()).divide(taxRadio,2, RoundingMode.HALF_DOWN); //商业部门管理比例总和 BigDecimal syDeptProportion = insFeeOrderNew.getSyDeptProportionLevel1().add(insFeeOrderNew.getSyDeptProportionLevel2()).add(insFeeOrderNew.getSyDeptProportionLevel3()).add(insFeeOrderNew.getSyDeptProportionLevel4()).add(insFeeOrderNew.getSyDeptProportionLevel5()); //商业出口比例总和 BigDecimal syExportProportion = syEntranceProportion.subtract(syDeptProportion).subtract(retailStoreProportion); //商业出口金额 subOrderExportFeeVo.setSyExportCosts(insFeeOrderNew.getSyPremium().multiply(taxRadio).multiply(syExportProportion.divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN)); //非车入口比例总和 BigDecimal noEntranceProportion = insFeeOrderNew.getNoSuperviseCostsProportion().add(insFeeOrderNew.getNoOtherCostsProportion()).divide(taxRadio,2, RoundingMode.HALF_DOWN); //非车部门比例总和 BigDecimal noDeptProportion = insFeeOrderNew.getNoDeptProportionLevel1().add(insFeeOrderNew.getNoDeptProportionLevel2()).add(insFeeOrderNew.getNoDeptProportionLevel3()).add(insFeeOrderNew.getNoDeptProportionLevel4()).add(insFeeOrderNew.getNoDeptProportionLevel5()); //非车出口比例总和 BigDecimal noExportProportion = noEntranceProportion.subtract(noDeptProportion).subtract(retailStoreProportion); //非车出口金额 subOrderExportFeeVo.setNoExportCosts(insFeeOrderNew.getNoPremium().multiply(taxRadio).multiply(noExportProportion.divide(new BigDecimal(100))).setScale(2,BigDecimal.ROUND_DOWN)); return subOrderExportFeeVo; } }