package com.ydtech.modules.fnc.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ydtech.modules.admin.model.SysDept;
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.service.EsmUserReferrerService;
import com.ydtech.modules.fnc.dao.FncInsAreaCompanyMapper;
import com.ydtech.modules.fnc.dao.InsPlyIncomeMapper;
import com.ydtech.modules.fnc.entity.InsFeeAudit;
import com.ydtech.modules.fnc.dao.InsFeeAuditMapper;
import com.ydtech.modules.fnc.entity.InsPlyIncome;
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.fnc.entity.InsAreaCompany;
import com.ydtech.modules.order.entity.InsFeeOrder;
import com.ydtech.modules.order.entity.InsOrders;
import com.ydtech.modules.order.service.InsFeeOrderService;
import com.ydtech.modules.order.service.InsOrdersService;
import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
import com.ydtech.modules.protocols.service.InsFeeOrderNewService;
import com.ydtech.utils.DateUtil;
import com.ydtech.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
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 InsPlyIncomeMapper insPlyIncomeMapper;
private final InsFeeOrderService insFeeOrderService;
private final FncInsAreaCompanyMapper insAreaCompanyMapper;
private final InsDeptFeeService insDeptFeeService;
private final InsCommissionService insCommissionService;
private final InsCompanyFeeService insCompanyFeeService;
private final EsmUserReferrerService esmUserReferrerService;
private final SysUserService sysUserService;
@Autowired
private InsFeeOrderNewService insFeeOrderNewService;
@Autowired
private SysDeptService sysDeptService;
public InsFeeAuditServiceImpl(FncInsAreaCompanyMapper insAreaCompanyMapper, InsOrdersMapper insOrdersMapper, InsFeeOrderService insFeeOrderService,InsDeptFeeService insDeptFeeService,EsmUserReferrerService esmUserReferrerService,SysUserService sysUserService,InsCommissionService insCommissionService,InsCompanyFeeService insCompanyFeeService,InsPlyIncomeMapper insPlyIncomeMapper) {
this.insAreaCompanyMapper = insAreaCompanyMapper;
this.insOrdersMapper = insOrdersMapper;
this.insFeeOrderService=insFeeOrderService;
this.insDeptFeeService=insDeptFeeService;
this.esmUserReferrerService=esmUserReferrerService;
this.sysUserService=sysUserService;
this.insCommissionService=insCommissionService;
this.insCompanyFeeService=insCompanyFeeService;
this.insPlyIncomeMapper=insPlyIncomeMapper;
}
@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());
InsAreaCompany insAreaCompany=insAreaCompanyMapper.selectById(insFeeAudit.getInsOrderNo());
//获取该订单的费用
InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getOne(new LambdaQueryWrapper()
.eq(InsFeeOrderNew::getInsOrderNo, insFeeAudit.getInsOrderNo()));
//获取操作人员的机构来源
String deptId=order.getDeptid();
List teamList = sysDeptService.findTeamList(deptId);
teamList.forEach(sysDept -> {
if(sysDept.getComlevel().equals("1")){
BigDecimal jqDeptPremiumsLevel1 = insFeeOrderNew.getJqDeptPremiumsLevel1();
}
});
//bigdecimal为null时设置为0
// handleBigdecimal(insFeeOrder);
//生成保司费用(应收费用)
gene_orderIncome( order, insFeeOrder,insAreaCompany);
//生成机构费用
gene_deptfee( order, insFeeOrder,insAreaCompany);
//生成分销费用
saveRetail(order,insFeeOrder,insAreaCompany);
//个代费用生成
saveInsCompanyFee(order,insFeeOrder,insAreaCompany);
}
/**
* 生成保司费用(应收费用)
* @param order
* @param insFeeOrder
* @throws Exception
*/
private void gene_orderIncome( InsOrders order, InsFeeOrder insFeeOrder,InsAreaCompany plyDto) throws Exception{
InsPlyIncome insPlyIncome =new InsPlyIncome();
insPlyIncome.setOrderno(order.getOrderno());
insPlyIncome.setDeptId(order.getDeptid());
insPlyIncome.setCompanyId(plyDto.getCompanyId());
insPlyIncome.setAgreementId(String.valueOf(plyDto.getAgreementId()));
insPlyIncome.setLicenseno(order.getLicenseno());
insPlyIncome.setPayDate(StringUtils.isNullOrEmpty(plyDto.getPayDate())?plyDto.getCreatetime():plyDto.getPayDate());
insPlyIncome.setSignDate(StringUtils.isNullOrEmpty(plyDto.getInsidePayTime())?plyDto.getPayDate():plyDto.getInsidePayTime());
insPlyIncome.setCreateTime(LocalDateTime.now() );
if(StringUtils.isNotEmpty(plyDto.getJqpolicyno())){
insPlyIncome.setPolicyno(plyDto.getJqpolicyno());
insPlyIncome.setRiskcode("交强");
insPlyIncome.setTaxamount(plyDto.getTaxamount());
insPlyIncome.setNoTaxPremium(insFeeOrder.getJqNoTaxPremium());
insPlyIncome.setCommissionFeerate(insFeeOrder.getJqSuperviseCostsProportion());
insPlyIncome.setOtherFeerate(insFeeOrder.getJqCostsProportion().subtract(insFeeOrder.getJqSuperviseCostsProportion()));
insPlyIncome.setCommissionFeevalue(insFeeOrder.getJqSuperviseCostsPremiums());
insPlyIncome.setOtherFeevalue(insFeeOrder.getJqCostsPremiums().subtract(insFeeOrder.getJqSuperviseCostsPremiums()));
insPlyIncome.setAllFeeValue(insFeeOrder.getJqCostsPremiums());
insPlyIncomeMapper.insert(insPlyIncome);
}
if(StringUtils.isNotEmpty(plyDto.getSypolicyno())){
insPlyIncome.setPolicyno(plyDto.getSypolicyno());
insPlyIncome.setRiskcode("商业");
insPlyIncome.setTaxamount(new BigDecimal(0));
insPlyIncome.setNoTaxPremium(insFeeOrder.getSyNoTaxPremium());
insPlyIncome.setCommissionFeerate(insFeeOrder.getSySuperviseCostsProportion());
insPlyIncome.setOtherFeerate(insFeeOrder.getSyCostsProportion().subtract(insFeeOrder.getSySuperviseCostsProportion()));
insPlyIncome.setCommissionFeevalue(insFeeOrder.getSySuperviseCostsPremiums());
insPlyIncome.setOtherFeevalue(insFeeOrder.getSyCostsPremiums().subtract(insFeeOrder.getSySuperviseCostsPremiums()));
insPlyIncome.setAllFeeValue(insFeeOrder.getSyCostsPremiums());
insPlyIncomeMapper.insert(insPlyIncome);
}
}
/**
* 生成机构费用
* @param order
* @param insFeeOrder
* @throws Exception
*/
private void gene_deptfee( InsOrders order, InsFeeOrder insFeeOrder,InsAreaCompany plyDto) throws Exception{
InsDeptFee deptFee = new InsDeptFee();
deptFee.setOrderno(order.getOrderno());
deptFee.setQuoteno(insFeeOrder.getInsOrderNo());
deptFee.setAgreeid(String.valueOf(plyDto.getAgreementId()));
deptFee.setAuditstatus("1");
deptFee.setSettlestatus("0");
deptFee.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(),DateUtil.FULL_TIME_SPLIT_PATTERN));
deptFee.setInscompany(plyDto.getCompanyId());
if(StringUtils.isNotEmpty(plyDto.getJqpolicyno())){
deptFee.setPolicyno(plyDto.getJqpolicyno());
deptFee.setRiskcode("交强");
deptFee.setLicenseno(order.getLicenseno());
geneInsDeptFee(order, insFeeOrder, deptFee);
}
if(StringUtils.isNotEmpty(plyDto.getSypolicyno())){
deptFee.setPolicyno(plyDto.getSypolicyno());
deptFee.setRiskcode("商业");
deptFee.setLicenseno(order.getLicenseno());
geneInsDeptFee(order, insFeeOrder, deptFee);
}
}
private void geneInsDeptFee(InsOrders order, InsFeeOrder insFeeOrder, InsDeptFee deptFee) {
if (insFeeOrder.getFirstDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01
deptFee.setComlevel("一级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getSecondDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 4)); //99140302M01D01
deptFee.setComlevel("二级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getThirdDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 6)); //99140302M01D01
deptFee.setComlevel("三级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getForthDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 8)); //99140302M01D01
deptFee.setComlevel("四级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getFifthDeptPremiums().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 11)); //99140302M01D01
deptFee.setComlevel("五级");
insDeptFeeService.insert(deptFee);
}
}
/**
* 三级分销费用保存
*
* @param order
* @return
*/
public void saveRetail(InsOrders order,InsFeeOrder insFeeOrder,InsAreaCompany plyDto) 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.setDeptid(order.getDeptid());
commission.setDeptname(order.getDeptname());
commission.setInscompany(plyDto.getCompanyId());
commission.setAgreeid(String.valueOf(plyDto.getAgreementId()));
commission.setRefereescode(user.getId());
commission.setRefereesname(user.getName());
commission.setLevel("3");
commission.setAuditstatus("1"); //0未审核 1已审核
commission.setSettlestatus("0"); //0未结算 1已结算
commission.setInsuredtime(DateUtil.formatFullTime(plyDto.getPayDate(),DateUtil.FULL_TIME_SPLIT_PATTERN));
commission.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(),DateUtil.FULL_TIME_SPLIT_PATTERN));
if(StringUtils.isNotEmpty(plyDto.getJqpolicyno())){
commission.setPolicyno(plyDto.getJqpolicyno());
commission.setRiskcode("交强");
commission.setLicenseno(order.getLicenseno());
commission.setCommissionrate(insFeeOrder.getThirdRetailProportion().doubleValue());
commission.setCommissionamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getThirdRetailProportion()).divide(new BigDecimal(100)).doubleValue());
insCommissionService.insert(commission);
}
if(StringUtils.isNotEmpty(plyDto.getSypolicyno())){
commission.setPolicyno(plyDto.getSypolicyno());
commission.setRiskcode("商业");
commission.setLicenseno(order.getLicenseno());
commission.setCommissionrate(insFeeOrder.getThirdRetailProportion().doubleValue());
commission.setCommissionamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getThirdRetailProportion()).divide(new BigDecimal(100)).doubleValue());
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.setDeptid(order.getDeptid());
commission.setDeptname(order.getDeptname());
commission.setInscompany(plyDto.getCompanyId());
commission.setAgreeid(String.valueOf(plyDto.getAgreementId()));
commission.setRefereescode(user.getId());
commission.setRefereesname(user.getName());
// commission.setCommissionrate(insFeeOrder.getSecondRetailProportion().doubleValue());
// commission.setCommissionamount(insFeeOrder.getSecondRetailPremiums().doubleValue());
commission.setLevel("2");
commission.setAuditstatus("1"); //0未审核 1已审核
commission.setSettlestatus("0"); //0未结算 1已结算
commission.setInsuredtime(DateUtil.formatFullTime(plyDto.getPayDate(),DateUtil.FULL_TIME_SPLIT_PATTERN));
commission.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(),DateUtil.FULL_TIME_SPLIT_PATTERN));
if(StringUtils.isNotEmpty(plyDto.getJqpolicyno())){
commission.setPolicyno(plyDto.getJqpolicyno());
commission.setRiskcode("交强");
commission.setLicenseno(order.getLicenseno());
commission.setCommissionrate(insFeeOrder.getSecondRetailProportion().doubleValue());
commission.setCommissionamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getSecondRetailProportion()).divide(new BigDecimal(100)).doubleValue());
insCommissionService.insert(commission);
}
if(StringUtils.isNotEmpty(plyDto.getSypolicyno())){
commission.setPolicyno(plyDto.getSypolicyno());
commission.setRiskcode("商业");
commission.setLicenseno(order.getLicenseno());
commission.setCommissionrate(insFeeOrder.getSecondRetailProportion().doubleValue());
commission.setCommissionamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getSecondRetailProportion()).divide(new BigDecimal(100)).doubleValue());
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.setDeptid(order.getDeptid());
commission.setDeptname(order.getDeptname());
commission.setInscompany(plyDto.getCompanyId());
commission.setAgreeid(String.valueOf(plyDto.getAgreementId()));
commission.setRefereescode(user.getId());
commission.setRefereesname(user.getName());
// commission.setCommissionrate(insFeeOrder.getFirstRetailProportion().doubleValue());
// commission.setCommissionamount(insFeeOrder.getFirstRetailPremiums().doubleValue());
commission.setLevel("1");
commission.setAuditstatus("1"); //0未审核 1已审核
commission.setSettlestatus("0"); //0未结算 1已结算
commission.setInsuredtime(DateUtil.formatFullTime(plyDto.getPayDate(),DateUtil.FULL_TIME_SPLIT_PATTERN));
commission.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(),DateUtil.FULL_TIME_SPLIT_PATTERN));
if(StringUtils.isNotEmpty(plyDto.getJqpolicyno())){
commission.setPolicyno(plyDto.getJqpolicyno());
commission.setRiskcode("交强");
commission.setLicenseno(order.getLicenseno());
commission.setCommissionrate(insFeeOrder.getFirstRetailProportion().doubleValue());
commission.setCommissionamount(insFeeOrder.getJqNoTaxPremium().multiply(insFeeOrder.getFirstRetailProportion()).divide(new BigDecimal(100)).doubleValue());
insCommissionService.insert(commission);
}
if(StringUtils.isNotEmpty(plyDto.getSypolicyno())){
commission.setPolicyno(plyDto.getSypolicyno());
commission.setRiskcode("商业");
commission.setLicenseno(order.getLicenseno());
commission.setCommissionrate(insFeeOrder.getFirstRetailProportion().doubleValue());
commission.setCommissionamount(insFeeOrder.getSyNoTaxPremium().multiply(insFeeOrder.getFirstRetailProportion()).divide(new BigDecimal(100)).doubleValue());
insCommissionService.insert(commission);
}
}
}
}
/**
* 生成个代费用
* @param order
* @param insFeeOrder
* @throws Exception
*/
public void saveInsCompanyFee(InsOrders order,InsFeeOrder insFeeOrder,InsAreaCompany plyDto) throws Exception {
InsCompanyFee insCompanyFee = new InsCompanyFee();
insCompanyFee.setOrderno(order.getOrderno());
insCompanyFee.setFrameNo(order.getFrameno());
insCompanyFee.setLicenseNo(order.getLicenseno());
insCompanyFee.setInscompany(plyDto.getCompanyId());
insCompanyFee.setAgreeid(String.valueOf(plyDto.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));
insCompanyFee.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(),DateUtil.FULL_TIME_SPLIT_PATTERN));
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());
if(StringUtils.isNotEmpty(plyDto.getJqpolicyno())){
insCompanyFee.setPolicyno(plyDto.getJqpolicyno());
insCompanyFee.setRiskcode("交强");
//交强费用比例=交强险费用比例-五级机构管理费比例-三级分销比例
insCompanyFee.setFeerate(insFeeOrder.getJqCostsProportion().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.setJqpremium(insFeeOrder.getJqNoTaxPremium().doubleValue());
//保存业务员费用
insCompanyFeeService.insert(insCompanyFee);
}
if(StringUtils.isNotEmpty(plyDto.getSypolicyno())){
insCompanyFee.setPolicyno(plyDto.getSypolicyno());
insCompanyFee.setRiskcode("商业");
insCompanyFee.setFeerate(0);
insCompanyFee.setFeeamount(0);
insCompanyFee.setJqpremium(0);
//商业费用比例=商业险费用比例-五级机构管理费比例-三级分销比例
insCompanyFee.setDisrate(insFeeOrder.getSyCostsProportion().subtract(dept_rate).subtract(retail_rate).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.setSypremium(insFeeOrder.getSyNoTaxPremium().doubleValue());
//保存业务员费用
insCompanyFeeService.insert(insCompanyFee);
}
}
}