package com.ydtech.modules.fnc.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.ydtech.modules.admin.model.SysUser;
import com.ydtech.modules.admin.service.SysUserService;
import com.ydtech.modules.esm.service.EsmUserReferrerService;
import com.ydtech.modules.fnc.entity.InsFeeAudit;
import com.ydtech.modules.fnc.dao.InsFeeAuditMapper;
import com.ydtech.modules.fnc.service.InsFeeAuditService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ydtech.modules.ins.model.InsCommission;
import com.ydtech.modules.ins.model.InsCompanyFee;
import com.ydtech.modules.ins.model.InsDeptFee;
import com.ydtech.modules.ins.service.InsCommissionService;
import com.ydtech.modules.ins.service.InsCompanyFeeService;
import com.ydtech.modules.ins.service.InsDeptFeeService;
import com.ydtech.modules.order.dao.InsOrdersMapper;
import com.ydtech.modules.order.entity.InsAreaCompany;
import com.ydtech.modules.order.entity.InsFeeOrder;
import com.ydtech.modules.order.entity.InsOrders;
import com.ydtech.modules.order.service.InsAreaCompanyService;
import com.ydtech.modules.order.service.InsFeeOrderService;
import com.ydtech.modules.order.service.InsOrdersService;
import com.ydtech.utils.DateUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
*
* 服务实现类
*
*
* @author gws
* @since 2023-11-22
*/
@Service
public class InsFeeAuditServiceImpl extends ServiceImpl implements InsFeeAuditService {
private final InsOrdersMapper insOrdersMapper;
private final InsFeeOrderService insFeeOrderService;
private final InsAreaCompanyService insAreaCompanyService;
private final InsDeptFeeService insDeptFeeService;
private final InsCommissionService insCommissionService;
private final InsCompanyFeeService insCompanyFeeService;
private final EsmUserReferrerService esmUserReferrerService;
private final SysUserService sysUserService;
public InsFeeAuditServiceImpl(InsAreaCompanyService insAreaCompanyService, InsOrdersMapper insOrdersMapper, InsFeeOrderService insFeeOrderService,InsDeptFeeService insDeptFeeService,EsmUserReferrerService esmUserReferrerService,SysUserService sysUserService,InsCommissionService insCommissionService,InsCompanyFeeService insCompanyFeeService) {
this.insAreaCompanyService = insAreaCompanyService;
this.insOrdersMapper = insOrdersMapper;
this.insFeeOrderService=insFeeOrderService;
this.insDeptFeeService=insDeptFeeService;
this.esmUserReferrerService=esmUserReferrerService;
this.sysUserService=sysUserService;
this.insCommissionService=insCommissionService;
this.insCompanyFeeService=insCompanyFeeService;
}
@Override
@Transactional
public void feeAudit(String orderNo, String insOrderNo) throws Exception{
InsFeeAudit insFeeAudit=new InsFeeAudit();
insFeeAudit.setOrderno(orderNo);
insFeeAudit.setInsOrderNo(insOrderNo);
insFeeAudit.setAuditstatus("1");
insFeeAudit.setAudittime(LocalDateTime.now());
insFeeAudit.setAudituser(StpUtil.getLoginId().toString());
this.save(insFeeAudit);
InsOrders order=insOrdersMapper.selectById(orderNo);
InsFeeOrder insFeeOrder=insFeeOrderService.getByInsOrderNo(insFeeAudit.getInsOrderNo());
//bigdecimal为null时设置为0
handleBigdecimal(insFeeOrder);
//生成机构费用
gene_deptfee( order, insFeeOrder);
//生成分销费用
saveRetail(order,insFeeOrder);
//个代费用生成
saveInsCompanyFee(order,insFeeOrder);
}
private void handleBigdecimal(InsFeeOrder insFeeOrder)
{
insFeeOrder.setJqCostsProportion(insFeeOrder.getJqCostsProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getJqCostsProportion());
insFeeOrder.setSyCostsProportion(insFeeOrder.getSyCostsProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getSyCostsProportion());
insFeeOrder.setJqCostsPremiums(insFeeOrder.getJqCostsPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getJqCostsPremiums());
insFeeOrder.setSyCostsPremiums(insFeeOrder.getSyCostsPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getSyCostsPremiums());
insFeeOrder.setJqPremium(insFeeOrder.getJqPremium() ==null ? BigDecimal.ZERO:insFeeOrder.getJqPremium());
insFeeOrder.setSyPremium(insFeeOrder.getSyPremium() ==null ? BigDecimal.ZERO:insFeeOrder.getSyPremium());
insFeeOrder.setJqNoTaxPremium(insFeeOrder.getJqNoTaxPremium() ==null ? BigDecimal.ZERO:insFeeOrder.getJqNoTaxPremium());
insFeeOrder.setSyNoTaxPremium(insFeeOrder.getSyNoTaxPremium() ==null ? BigDecimal.ZERO:insFeeOrder.getSyNoTaxPremium());
insFeeOrder.setJqSuperviseCostsProportion(insFeeOrder.getJqSuperviseCostsProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getJqSuperviseCostsProportion());
insFeeOrder.setJqSuperviseCostsPremiums(insFeeOrder.getJqSuperviseCostsPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getJqSuperviseCostsPremiums());
insFeeOrder.setSySuperviseCostsProportion(insFeeOrder.getSySuperviseCostsProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getSySuperviseCostsProportion());
insFeeOrder.setSySuperviseCostsPremiums(insFeeOrder.getSySuperviseCostsPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getSySuperviseCostsPremiums());
insFeeOrder.setJqSpilloverProportion(insFeeOrder.getJqSpilloverProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getJqSpilloverProportion());
insFeeOrder.setJqSpilloverPremiums(insFeeOrder.getJqSpilloverPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getJqSpilloverPremiums());
insFeeOrder.setSySpilloverProportion(insFeeOrder.getSySpilloverProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getSySpilloverProportion());
insFeeOrder.setSySpilloverPremiums(insFeeOrder.getSySpilloverPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getSySpilloverPremiums());
insFeeOrder.setFirstDeptProportion(insFeeOrder.getFirstDeptProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getFirstDeptProportion());
insFeeOrder.setFirstDeptPremiums(insFeeOrder.getFirstDeptPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getFirstDeptPremiums());
insFeeOrder.setSecondDeptProportion(insFeeOrder.getSecondDeptProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getSecondDeptProportion());
insFeeOrder.setSecondDeptPremiums(insFeeOrder.getSecondDeptPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getSecondDeptPremiums());
insFeeOrder.setThirdDeptProportion(insFeeOrder.getThirdDeptProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getThirdDeptProportion());
insFeeOrder.setThirdDeptPremiums(insFeeOrder.getThirdDeptPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getThirdDeptPremiums());
insFeeOrder.setForthDeptProportion(insFeeOrder.getForthDeptProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getForthDeptProportion());
insFeeOrder.setForthDeptPremiums(insFeeOrder.getForthDeptPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getForthDeptPremiums());
insFeeOrder.setFifthDeptProportion(insFeeOrder.getFifthDeptProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getFifthDeptProportion());
insFeeOrder.setFifthDeptPremiums(insFeeOrder.getFifthDeptPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getFifthDeptPremiums());
insFeeOrder.setFirstRetailProportion(insFeeOrder.getFirstRetailProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getFirstRetailProportion());
insFeeOrder.setFirstRetailPremiums(insFeeOrder.getFirstRetailPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getFirstRetailPremiums());
insFeeOrder.setSecondRetailProportion(insFeeOrder.getSecondRetailProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getSecondRetailProportion());
insFeeOrder.setSecondRetailPremiums(insFeeOrder.getSecondRetailPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getSecondRetailPremiums());
insFeeOrder.setThirdRetailProportion(insFeeOrder.getThirdRetailProportion() ==null ? BigDecimal.ZERO:insFeeOrder.getThirdRetailProportion());
insFeeOrder.setThirdRetailPremiums(insFeeOrder.getThirdRetailPremiums() ==null ? BigDecimal.ZERO:insFeeOrder.getThirdRetailPremiums());
}
/**
* 生成机构费用
* @param order
* @param insFeeOrder
* @throws Exception
*/
private void gene_deptfee( InsOrders order, InsFeeOrder insFeeOrder) throws Exception{
InsDeptFee deptFee = new InsDeptFee();
deptFee.setOrderno(order.getOrderno());
deptFee.setQuoteno(insFeeOrder.getInsOrderNo());
deptFee.setAgreeid(insFeeOrder.getAgreementId());
deptFee.setAuditstatus("1");
deptFee.setSettlestatus("0");
if (insFeeOrder.getFirstDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01
deptFee.setKeeprate(insFeeOrder.getFirstDeptProportion().doubleValue() * 0.01);
deptFee.setKeepamount(insFeeOrder.getFirstDeptPremiums().doubleValue());
deptFee.setComlevel("一级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getSecondDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 4)); //99140302M01D01
deptFee.setKeeprate(insFeeOrder.getSecondDeptProportion().setScale(2).doubleValue() * 0.01);
deptFee.setKeepamount(insFeeOrder.getSecondDeptPremiums().doubleValue());
deptFee.setComlevel("二级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getThirdDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 6)); //99140302M01D01
deptFee.setKeeprate(insFeeOrder.getThirdDeptProportion().doubleValue() * 0.01);
deptFee.setKeepamount(insFeeOrder.getThirdDeptPremiums().doubleValue());
deptFee.setComlevel("三级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getForthDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 8)); //99140302M01D01
deptFee.setKeeprate(insFeeOrder.getForthDeptProportion().doubleValue() * 0.01);
deptFee.setKeepamount(insFeeOrder.getForthDeptPremiums().doubleValue());
deptFee.setComlevel("四级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getFifthDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 11)); //99140302M01D01
deptFee.setKeeprate(insFeeOrder.getFifthDeptProportion().doubleValue() * 0.01);
deptFee.setKeepamount(insFeeOrder.getFifthDeptPremiums().doubleValue());
deptFee.setComlevel("五级");
insDeptFeeService.insert(deptFee);
}
}
/**
* 三级分销费用保存
*
* @param order
* @return
*/
public void saveRetail(InsOrders order,InsFeeOrder insFeeOrder) throws Exception{
List userlist=new ArrayList<>();
esmUserReferrerService.getUpUser(order.getUserid(),userlist);
//userlist:包括本人在内向上所有人
if(userlist.size()-1>0){
if(userlist.size()-1>=1
&&insFeeOrder.getThirdRetailPremiums().doubleValue()>0)
{//三级分销
SysUser user=sysUserService.getById(userlist.get(1));
InsCommission commission = new InsCommission();
commission.setOrderno(order.getOrderno());
commission.setQuoteno(insFeeOrder.getInsOrderNo());
commission.setRefereescode(user.getId());
commission.setRefereesname(user.getName());
commission.setCommissionrate(insFeeOrder.getThirdRetailProportion().doubleValue()* 0.01);
commission.setCommissionamount(insFeeOrder.getThirdRetailPremiums().doubleValue());
commission.setLevel("3");
commission.setAuditstatus("1"); //0未审核 1已审核
commission.setSettlestatus("0"); //0未结算 1已结算
commission.setInsuredtime(DateUtil.getDateFormat(new Date(),DateUtil.FULL_TIME_SPLIT_PATTERN)); //承保确认时间
insCommissionService.insert(commission);
}
if(userlist.size()-1>=2
&&insFeeOrder.getSecondRetailPremiums().doubleValue()>0)
{//二级分销
SysUser user=sysUserService.getById(userlist.get(2));
InsCommission commission = new InsCommission();
commission.setOrderno(order.getOrderno());
commission.setQuoteno(insFeeOrder.getInsOrderNo());
commission.setRefereescode(user.getId());
commission.setRefereesname(user.getName());
commission.setCommissionrate(insFeeOrder.getSecondRetailProportion().doubleValue()* 0.01);
commission.setCommissionamount(insFeeOrder.getSecondRetailPremiums().doubleValue());
commission.setLevel("2");
commission.setAuditstatus("1"); //0未审核 1已审核
commission.setSettlestatus("0"); //0未结算 1已结算
commission.setInsuredtime(DateUtil.getDateFormat(new Date(),DateUtil.FULL_TIME_SPLIT_PATTERN)); //承保确认时间
insCommissionService.insert(commission);
}
if(userlist.size()-1>=3
&&insFeeOrder.getFirstRetailPremiums().doubleValue()>0)
{//一级分销
SysUser user=sysUserService.getById(userlist.get(3));
InsCommission commission = new InsCommission();
commission.setOrderno(order.getOrderno());
commission.setQuoteno(insFeeOrder.getInsOrderNo());
commission.setRefereescode(user.getId());
commission.setRefereesname(user.getName());
commission.setCommissionrate(insFeeOrder.getFirstRetailProportion().doubleValue()* 0.01);
commission.setCommissionamount(insFeeOrder.getFirstRetailPremiums().doubleValue());
commission.setLevel("1");
commission.setAuditstatus("1"); //0未审核 1已审核
commission.setSettlestatus("0"); //0未结算 1已结算
commission.setInsuredtime(DateUtil.getDateFormat(new Date(),DateUtil.FULL_TIME_SPLIT_PATTERN)); //承保确认时间
insCommissionService.insert(commission);
}
}
}
/**
* 生成个代费用
* @param order
* @param insFeeOrder
* @throws Exception
*/
public void saveInsCompanyFee(InsOrders order,InsFeeOrder insFeeOrder) throws Exception {
InsAreaCompany insAreaCompany=insAreaCompanyService.getById(insFeeOrder.getInsOrderNo());
InsCompanyFee insCompanyFee = new InsCompanyFee();
insCompanyFee.setOrderno(order.getOrderno());
BigDecimal dept_rate=insFeeOrder.getFirstDeptProportion()
.add(insFeeOrder.getSecondDeptProportion())
.add(insFeeOrder.getThirdDeptProportion())
.add(insFeeOrder.getForthDeptProportion())
.add(insFeeOrder.getFifthDeptProportion());
BigDecimal retail_rate=insFeeOrder.getFirstRetailProportion()
.add(insFeeOrder.getSecondRetailProportion())
.add(insFeeOrder.getThirdRetailProportion());
//交强费用比例=交强险费用比例-五级机构管理费比例-三级分销比例
insCompanyFee.setFeerate(insFeeOrder.getJqCostsProportion().subtract(dept_rate).subtract(retail_rate).doubleValue());
//商业费用比例=商业险费用比例-五级机构管理费比例-三级分销比例
insCompanyFee.setDisrate(insFeeOrder.getSyCostsProportion().subtract(dept_rate).subtract(retail_rate).doubleValue());
insCompanyFee.setFeeamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getJqCostsProportion().subtract(dept_rate).subtract(retail_rate)).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
insCompanyFee.setDisamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getSyCostsProportion().subtract(dept_rate).subtract(retail_rate)).divide(new BigDecimal(100)).setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue());
insCompanyFee.setJqpremium(insFeeOrder.getJqNoTaxPremium().doubleValue());
insCompanyFee.setSypremium(insFeeOrder.getSyNoTaxPremium().doubleValue());
insCompanyFee.setFrameNo(order.getFrameno());
insCompanyFee.setLicenseNo(order.getLicenseno());
insCompanyFee.setInscompany(insAreaCompany.getCompanyId());
insCompanyFee.setAgreeid(insFeeOrder.getAgreementId());
insCompanyFee.setUserid(order.getUserid());
insCompanyFee.setUsername(order.getUsername());
insCompanyFee.setDeptid(order.getDeptid());
insCompanyFee.setDeptname(order.getDeptname());
insCompanyFee.setSettletype("B");
insCompanyFee.setSettlestatus("0");
insCompanyFee.setCreatetime(DateUtil.getDateFormat(new Date(),DateUtil.FULL_TIME_SPLIT_PATTERN));
//保存业务员费用
insCompanyFeeService.insert(insCompanyFee);
}
}