package com.ydtech.modules.fnc.service.impl;
import cn.dev33.satoken.stp.StpUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ydtech.constants.enums.dict.ins.InsFeeAuditDistributionStatusEnum;
import com.ydtech.exception.SystemException;
import com.ydtech.modules.admin.model.SysDept;
import com.ydtech.modules.admin.model.SysDeptAccount;
import com.ydtech.modules.admin.model.SysUser;
import com.ydtech.modules.admin.model.po.SysUserAccount;
import com.ydtech.modules.admin.model.vo.SysUserBaseVO;
import com.ydtech.modules.admin.service.*;
import com.ydtech.modules.base.controller.BaseController;
import com.ydtech.modules.esm.service.EsmUserReferrerService;
import com.ydtech.modules.fnc.dao.FncInsAreaCompanyMapper;
import com.ydtech.modules.fnc.dao.InsFeeAuditMapper;
import com.ydtech.modules.fnc.dao.InsPlyIncomeMapper;
import com.ydtech.modules.fnc.entity.InsAreaCompany;
import com.ydtech.modules.fnc.entity.InsFeeAudit;
import com.ydtech.modules.fnc.entity.InsFeeAuditHistory;
import com.ydtech.modules.fnc.entity.InsPlyIncome;
import com.ydtech.modules.fnc.service.InsFeeAuditHistoryService;
import com.ydtech.modules.fnc.service.InsFeeAuditService;
import com.ydtech.modules.fnc.service.InsPlyIncomeService;
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.InsFeeOrder;
import com.ydtech.modules.order.entity.InsOrders;
import com.ydtech.modules.protocol.service.PtlAgreementService;
import com.ydtech.modules.protocols.entity.po.InsFeeOrderNew;
import com.ydtech.modules.protocols.entity.po.InsFeeOrderNewDistribution;
import com.ydtech.modules.protocols.service.InsFeeOrderNewDistributionService;
import com.ydtech.modules.protocols.service.InsFeeOrderNewService;
import com.ydtech.utils.DateUtil;
import com.ydtech.utils.StringUtils;
import com.ydtech.utils.idgen.IdGenerate;
import org.apache.commons.lang3.ObjectUtils;
import org.redisson.Redisson;
import org.redisson.api.RLock;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
*
* 服务实现类
*
*
* @author gws
* @since 2023-11-22
*/
@Service
public class InsFeeAuditServiceImpl extends ServiceImpl implements InsFeeAuditService {
private final InsOrdersMapper insOrdersMapper;
private final InsPlyIncomeMapper insPlyIncomeMapper;
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 SysUserAccountService sysUserAccountService;
@Autowired
private SysDeptService sysDeptService;
@Autowired
private SysDeptAccountService sysDeptAccountService;
@Autowired
private SysDeptAccountHistoryService sysDeptAccountHistoryService;
@Autowired
private InsPlyIncomeService insPlyIncomeService;
@Autowired
private InsFeeAuditHistoryService insFeeAuditHistoryService;
@Autowired
private PtlAgreementService ptlAgreementService;
@Autowired
private Redisson redisson;
@Resource
private InsFeeOrderNewDistributionService insFeeOrderNewDistributionService;
public InsFeeAuditServiceImpl(FncInsAreaCompanyMapper insAreaCompanyMapper, InsOrdersMapper insOrdersMapper,
InsDeptFeeService insDeptFeeService, EsmUserReferrerService esmUserReferrerService,
SysUserService sysUserService, InsCommissionService insCommissionService,
InsCompanyFeeService insCompanyFeeService, InsPlyIncomeMapper insPlyIncomeMapper) {
this.insAreaCompanyMapper = insAreaCompanyMapper;
this.insOrdersMapper = insOrdersMapper;
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, boolean isAutoAudit, String auditStatus) {
RLock locked = redisson.getLock("feeAudit."+insOrderNo);
try {
boolean isLock = locked.tryLock(60, 10, TimeUnit.SECONDS);
if(!isLock){
throw new SystemException("当前业务繁忙,请稍后重试\n");
}
//添加费用审核表及轨迹信息
InsFeeAudit insFeeAudit = saveInsFeeAuditAndHistory(orderNo, insOrderNo, isAutoAudit, auditStatus);
InsOrders order = insOrdersMapper.selectById(orderNo);
InsAreaCompany insAreaCompany = insAreaCompanyMapper.selectById(insFeeAudit.getInsOrderNo());
//获取该订单的费用
InsFeeOrderNew insFeeOrderNew = insFeeOrderNewService.getOne(new LambdaQueryWrapper()
.eq(InsFeeOrderNew::getInsOrderNo, insFeeAudit.getInsOrderNo()));
//生成机构费用
gene_deptfee(order, insFeeOrderNew, insAreaCompany);
//结算费用生成
insPlyIncomeService.saveBalanceNew(order, insFeeOrderNew, insAreaCompany);
//生成 用户账户表 数据
if (StringUtils.isNotEmpty(order.getUserid())) {
//用戶賬戶表
SysUserAccount sysUserAccount = new SysUserAccount();
//add by hxl 2024-05-07 begin ==========
//判断当前用户是否是出单员,如果是直接给团队长结算 角色id为19为出单员
String userId = "";
SysUserBaseVO sysUserBaseVO = sysUserService.selectUserById(order.getUserid());
SysUser user = sysUserService.getById(order.getUserid());
SysDept dept = sysDeptService.getById(user.getDeptId());
//出单员是19 且是渠道的话,给渠道团队长
if ("19".equals(sysUserBaseVO.getRoleId()) && "1".equals(dept.getManagementSource())) {
//查找该出单员的的团队长
//找到上级
userId = user.getOperatorCode();
//if (userId == null || "".equals(userId)) {
// throw new SystemException("出单员" + sysUserBaseVO.getName() + "所在机构缺少团队长,请设置!!!");
//}
} else {
userId = order.getUserid();
}
sysUserAccount.setUserId(userId);
// add by hxl 2024-05-07 end ==================
if (ObjectUtils.isNotEmpty(insFeeOrderNew)) {
//用户出口手续费
BigDecimal totalPremiumAmount = new BigDecimal(0);
totalPremiumAmount = totalPremiumAmount.add(insFeeOrderNew.getJqExportSuperviseCostsPremiums())
.add(insFeeOrderNew.getSyExportSuperviseCostsPremiums()).add(insFeeOrderNew.getNoExportSuperviseCostsPremiums());
//用户出口跟单费
BigDecimal totalOtherPremiumAmount = new BigDecimal(0);
totalOtherPremiumAmount =
totalOtherPremiumAmount.add(insFeeOrderNew.getJqExportOtherCostsPremiums()).add(insFeeOrderNew.getSyExportOtherCostsPremiums()).add(insFeeOrderNew.getNoExportOtherCostsPremiums());
//用戶
//算佣金
this.countUserAmount(insFeeOrderNew, insAreaCompany.getId());
sysUserAccount.setHandlingFee(totalPremiumAmount);
sysUserAccount.setDocumentary(totalOtherPremiumAmount);
sysUserAccount.setDocumentaryStatus("2"); // 收入
sysUserAccount.setSuborderId(insAreaCompany.getId()); // 订单Id
sysUserAccountService.addOrUpdate(sysUserAccount);
if (insFeeOrderNew.getDistributionStatus() != null) {
createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order, order.getUserid(), BigDecimal.ZERO, BigDecimal.ZERO, "0");
if (insFeeOrderNew.getFirstLevelUserId() != null) {
createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order,
insFeeOrderNew.getFirstLevelUserId(), insFeeOrderNew.getFirstDetailProportion(),
insFeeOrderNew.getFirstDetailPremiums(), "1");
}
if (insFeeOrderNew.getTwoLevelUserId() != null) {
createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order,
insFeeOrderNew.getTwoLevelUserId(), insFeeOrderNew.getSecondDetailProportion(),
insFeeOrderNew.getSecondDetailPremiums(), "2");
}
if (insFeeOrderNew.getThreeLevelUserId() != null) {
createInsFeeOrderNewDistribution(insFeeOrderNew, insAreaCompany, order,
insFeeOrderNew.getThreeLevelUserId(), insFeeOrderNew.getThirdDetailProportion(),
insFeeOrderNew.getThirdDetailPremiums(), "3");
}
}
String deptid = insFeeOrderNew.getDeptId();
// 定义一个数组来存储各级机构的管理费
BigDecimal[] jqDeptPremiumsLevels = {insFeeOrderNew.getJqDeptPremiumsLevel1(), insFeeOrderNew.getJqDeptPremiumsLevel2(),
insFeeOrderNew.getJqDeptPremiumsLevel3(), insFeeOrderNew.getJqDeptPremiumsLevel4(),
insFeeOrderNew.getJqDeptPremiumsLevel5()};
BigDecimal[] syDeptPremiumsLevels = {insFeeOrderNew.getSyDeptPremiumsLevel1(), insFeeOrderNew.getSyDeptPremiumsLevel2(),
insFeeOrderNew.getSyDeptPremiumsLevel3(), insFeeOrderNew.getSyDeptPremiumsLevel4(),
insFeeOrderNew.getSyDeptPremiumsLevel5()};
BigDecimal[] noDeptPremiumsLevels = {insFeeOrderNew.getNoDeptPremiumsLevel1(), insFeeOrderNew.getNoDeptPremiumsLevel2(),
insFeeOrderNew.getNoDeptPremiumsLevel3(), insFeeOrderNew.getNoDeptPremiumsLevel4(),
insFeeOrderNew.getNoDeptPremiumsLevel5()};
for (int i = 1; i <= 5; i++) {
// 根据循环次数确定机构ID的长度,第五级为11
String levelDeptId = deptid.substring(0, (i == 5) ? 11 : i * 2);
// 获取对应级别的机构信息
SysDeptAccount levelSysDeptAccount = sysDeptAccountService.getOne(new LambdaQueryWrapper()
.eq(SysDeptAccount::getDeptId, levelDeptId));
// 初始化管理费总额为0
BigDecimal sumManagementFee = BigDecimal.ZERO;
// 根据分销等级和分销用户情况计算分销费用
BigDecimal distributionFee = BigDecimal.ZERO;
if (i == 1) {
if (insFeeOrderNew.getFirstLevelUserId() == null) {
distributionFee = distributionFee.add(insFeeOrderNew.getFirstDetailPremiums());
}
if (insFeeOrderNew.getTwoLevelUserId() == null) {
distributionFee = distributionFee.add(insFeeOrderNew.getSecondDetailPremiums());
}
if (insFeeOrderNew.getThreeLevelUserId() == null) {
distributionFee = distributionFee.add(insFeeOrderNew.getThirdDetailPremiums());
}
}
// 根据分销等级计算管理费总额
sumManagementFee = sumManagementFee.add(jqDeptPremiumsLevels[i - 1])
.add(syDeptPremiumsLevels[i - 1])
.add(noDeptPremiumsLevels[i - 1]);
if (i == 1) {
sumManagementFee = sumManagementFee.add(distributionFee);
}
// 如果机构信息不为空,更新管理费并记录历史
if (levelSysDeptAccount != null) {
levelSysDeptAccount.setManagementFee(levelSysDeptAccount.getManagementFee().add(sumManagementFee));
sysDeptAccountService.updateById(levelSysDeptAccount);
} else {
// 如果机构信息为空,新建机构信息并记录历史
levelSysDeptAccount = new SysDeptAccount();
levelSysDeptAccount.setDeptId(levelDeptId);
levelSysDeptAccount.setManagementFee(sumManagementFee);
levelSysDeptAccount.setCreateTime(new Date());
sysDeptAccountService.save(levelSysDeptAccount);
}
// 记录历史信息
// 拼接备注
String remark = this.getDeptFeeHistoryLog(i, jqDeptPremiumsLevels, syDeptPremiumsLevels, noDeptPremiumsLevels,
distributionFee);
sysDeptAccountHistoryService.addHistory(levelDeptId, sumManagementFee, levelSysDeptAccount.getManagementFee(), "2",
insOrderNo, BaseController.getUser().getId(), remark);
}
}
}
}catch (Exception e){
throw new SystemException("当前业务繁忙,请稍后重试");
}finally {
//释放锁
if(locked.isHeldByCurrentThread()){
locked.unlock();
}
}
}
private void createInsFeeOrderNewDistribution(InsFeeOrderNew insFeeOrderNew, InsAreaCompany insAreaCompany, InsOrders insOrders,
String userId, BigDecimal commissionRate, BigDecimal commissionAmount,
String commissionLevel) {
InsFeeOrderNewDistribution insFeeOrderNewDistribution = new InsFeeOrderNewDistribution();
insFeeOrderNewDistribution.setId(IdGenerate.nextId());
insFeeOrderNewDistribution.setOrderNo(insFeeOrderNew.getInsOrderNo());
insFeeOrderNewDistribution.setJqPolicyNo(insAreaCompany.getJqpolicyno());
insFeeOrderNewDistribution.setSyPolicyNo(insAreaCompany.getSypolicyno());
insFeeOrderNewDistribution.setOperator(insOrders.getUserid());
insFeeOrderNewDistribution.setLicenseNo(insOrders.getLicenseno());
insFeeOrderNewDistribution.setProductId(insAreaCompany.getProductid());
insFeeOrderNewDistribution.setProduct(insAreaCompany.getProduct());
insFeeOrderNewDistribution.setSignTime(insAreaCompany.getSigningTime());
insFeeOrderNewDistribution.setInsCompany(insAreaCompany.getInscompany());
insFeeOrderNewDistribution.setUserId(userId);
insFeeOrderNewDistribution.setCommissionRate(commissionRate);
insFeeOrderNewDistribution.setCommissionAmount(commissionAmount);
insFeeOrderNewDistribution.setCommissionLevel(commissionLevel);
insFeeOrderNewDistribution.setCreateTime(new Date());
// 保存insFeeOrderNewDistribution
insFeeOrderNewDistributionService.save(insFeeOrderNewDistribution);
}
private String getDeptFeeHistoryLog(Integer index, BigDecimal[] jqDeptPremiumsLevels, BigDecimal[] syDeptPremiumsLevels,
BigDecimal[] noDeptPremiumsLevels, BigDecimal distributionFee) {
StringBuilder remarkBuilder = new StringBuilder();
if (jqDeptPremiumsLevels[index - 1].compareTo(BigDecimal.ZERO) != 0) {
remarkBuilder.append("交强").append(index).append("级机构管理费:");
remarkBuilder.append(jqDeptPremiumsLevels[index - 1]).append(",");
}
if (syDeptPremiumsLevels[index - 1].compareTo(BigDecimal.ZERO) != 0) {
remarkBuilder.append("商业").append(index).append("级机构管理费:");
remarkBuilder.append(syDeptPremiumsLevels[index - 1]).append(",");
}
if (noDeptPremiumsLevels[index - 1].compareTo(BigDecimal.ZERO) != 0) {
remarkBuilder.append("非车").append(index).append("级机构管理费:");
remarkBuilder.append(noDeptPremiumsLevels[index - 1]).append(",");
}
if (distributionFee.compareTo(BigDecimal.ZERO) != 0) {
remarkBuilder.append("分销费:").append(distributionFee).append(",");
}
String remark = remarkBuilder.toString();
if (remark.endsWith(",")) {
remark = remark.substring(0, remark.length() - 1);
}
return remark;
}
private void countUserAmount(InsFeeOrderNew insFeeOrderNew, String orderNo) {
String distributionStatus = insFeeOrderNew.getDistributionStatus();
if (StringUtils.isNotEmpty(distributionStatus)) {
if (InsFeeAuditDistributionStatusEnum.DS_3.getCode().equals(distributionStatus)) {
BigDecimal totalDept = BigDecimal.ZERO;
if (StringUtils.isNotEmpty(insFeeOrderNew.getFirstLevelUserId())) {
String firstLevelUserId = insFeeOrderNew.getFirstLevelUserId();
BigDecimal firstDetailPremiums = insFeeOrderNew.getFirstDetailPremiums();
this.saveUpdateAccount(firstLevelUserId, firstDetailPremiums, orderNo);
} else {
totalDept = totalDept.add(insFeeOrderNew.getFirstDetailPremiums());
}
if (StringUtils.isNotEmpty(insFeeOrderNew.getTwoLevelUserId())) {
String twoLevelUserId = insFeeOrderNew.getTwoLevelUserId();
BigDecimal secondDetailProportion = insFeeOrderNew.getSecondDetailPremiums();
this.saveUpdateAccount(twoLevelUserId, secondDetailProportion, orderNo);
} else {
totalDept = totalDept.add(insFeeOrderNew.getSecondDetailPremiums());
}
if (StringUtils.isNotEmpty(insFeeOrderNew.getThreeLevelUserId())) {
String threeLevelUserId = insFeeOrderNew.getThreeLevelUserId();
BigDecimal threeDetailPremiums = insFeeOrderNew.getThirdDetailPremiums();
this.saveUpdateAccount(threeLevelUserId, threeDetailPremiums, orderNo);
} else {
totalDept = totalDept.add(insFeeOrderNew.getThirdDetailPremiums());
}
// 机构管理 费用给五级交钱机构管理费
if (totalDept.compareTo(BigDecimal.ZERO) == 0) {
BigDecimal jqDeptPremiumsLevel5 = insFeeOrderNew.getJqDeptPremiumsLevel5();
jqDeptPremiumsLevel5.add(totalDept);
insFeeOrderNewService.updateById(insFeeOrderNew);
}
} else if (InsFeeAuditDistributionStatusEnum.DS_2.getCode().equals(distributionStatus)) {
BigDecimal totalDept = BigDecimal.ZERO;
if (StringUtils.isNotEmpty(insFeeOrderNew.getFirstLevelUserId())) {
String firstLevelUserId = insFeeOrderNew.getFirstLevelUserId();
BigDecimal firstDetailPremiums = insFeeOrderNew.getFirstDetailPremiums();
this.saveUpdateAccount(firstLevelUserId, firstDetailPremiums, orderNo);
} else {
totalDept = totalDept.add(insFeeOrderNew.getFirstDetailPremiums());
}
if (StringUtils.isNotEmpty(insFeeOrderNew.getTwoLevelUserId())) {
String twoLevelUserId = insFeeOrderNew.getTwoLevelUserId();
BigDecimal secondDetailProportion = insFeeOrderNew.getSecondDetailPremiums();
this.saveUpdateAccount(twoLevelUserId, secondDetailProportion, orderNo);
} else {
totalDept = totalDept.add(insFeeOrderNew.getSecondDetailPremiums());
}
// 机构管理 费用给五级交钱机构管理费
if (totalDept.compareTo(BigDecimal.ZERO) == 0) {
BigDecimal jqDeptPremiumsLevel5 = insFeeOrderNew.getJqDeptPremiumsLevel5();
jqDeptPremiumsLevel5.add(totalDept);
insFeeOrderNewService.updateById(insFeeOrderNew);
}
} else {
// 一级分销
if (StringUtils.isNotEmpty(insFeeOrderNew.getFirstLevelUserId())) {
String firstLevelUserId = insFeeOrderNew.getFirstLevelUserId();
BigDecimal firstDetailPremiums = insFeeOrderNew.getFirstDetailPremiums();
this.saveUpdateAccount(firstLevelUserId, firstDetailPremiums, orderNo);
} else {
if (insFeeOrderNew.getFirstDetailPremiums().compareTo(BigDecimal.ZERO) == 0) {
BigDecimal jqDeptPremiumsLevel5 = insFeeOrderNew.getJqDeptPremiumsLevel5();
jqDeptPremiumsLevel5.add(insFeeOrderNew.getFirstDetailPremiums());
insFeeOrderNewService.updateById(insFeeOrderNew);
}
}
}
}
}
private void saveUpdateAccount(String userId, BigDecimal amount, String orderNo) {
SysUserAccount sysUserOldAccount = new SysUserAccount();
sysUserOldAccount.setUserId(userId);
sysUserOldAccount.setPromotion(amount);
sysUserOldAccount.setDocumentaryStatus("2"); // 收入
sysUserOldAccount.setSuborderId(orderNo);
sysUserAccountService.addOrUpdate(sysUserOldAccount);
}
private BigDecimal zeroBigdecimal(BigDecimal amount) {
if (amount == null) {
return amount = BigDecimal.ZERO;
} else {
return amount;
}
}
/**
* 生成保司费用(应收费用)
*
* @param order
* @param insFeeOrder
* @throws Exception
*/
private void gene_orderIncome(InsOrders order, InsFeeOrderNew 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());
if (!ObjectUtils.isEmpty(insFeeOrder)) {
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));
if (!ObjectUtils.isEmpty(insFeeOrder)) {
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, InsFeeOrderNew insFeeOrder, InsAreaCompany plyDto) {
InsDeptFee deptFee = new InsDeptFee();
deptFee.setOrderno(order.getOrderno());
if (!ObjectUtils.isEmpty(insFeeOrder)) {
deptFee.setQuoteno(insFeeOrder.getInsOrderNo());
}
deptFee.setAgreeid(String.valueOf(plyDto.getAgreementId()));
deptFee.setAuditstatus("1");
deptFee.setSettlestatus("0");
if (plyDto.getInsidePayTime() != null) {
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());
geneJqInsDeptFee(order, insFeeOrder, deptFee);
}
if (StringUtils.isNotEmpty(plyDto.getSypolicyno())) {
deptFee.setPolicyno(plyDto.getSypolicyno());
deptFee.setRiskcode("商业");
deptFee.setLicenseno(order.getLicenseno());
geneSyInsDeptFee(order, insFeeOrder, deptFee);
}
}
private void geneJqInsDeptFee(InsOrders order, InsFeeOrderNew insFeeOrder, InsDeptFee deptFee) {
if (!ObjectUtils.isEmpty(insFeeOrder)) {
if (insFeeOrder.getJqDeptPremiumsLevel1().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01
deptFee.setComlevel("一级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getJqDeptPremiumsLevel2().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 4)); //99140302M01D01
deptFee.setComlevel("二级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getJqDeptPremiumsLevel3().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 6)); //99140302M01D01
deptFee.setComlevel("三级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getJqDeptPremiumsLevel4().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 8)); //99140302M01D01
deptFee.setComlevel("四级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getJqDeptPremiumsLevel5().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 11)); //99140302M01D01
deptFee.setComlevel("五级");
insDeptFeeService.insert(deptFee);
}
}
}
private void geneSyInsDeptFee(InsOrders order, InsFeeOrderNew insFeeOrder, InsDeptFee deptFee) {
if (!ObjectUtils.isEmpty(insFeeOrder)) {
if (insFeeOrder.getSyDeptPremiumsLevel1().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01
deptFee.setComlevel("一级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getSyDeptPremiumsLevel2().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 4)); //99140302M01D01
deptFee.setComlevel("二级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getSyDeptPremiumsLevel3().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 6)); //99140302M01D01
deptFee.setComlevel("三级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getSyDeptPremiumsLevel4().doubleValue() > 0) {
deptFee.setComcode(order.getDeptid().substring(0, 8)); //99140302M01D01
deptFee.setComlevel("四级");
insDeptFeeService.insert(deptFee);
}
if (insFeeOrder.getSyDeptPremiumsLevel5().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));
if (plyDto.getInsidePayTime() != null) {
insCompanyFee.setSignDate(DateUtil.formatFullTime(plyDto.getInsidePayTime(), DateUtil.FULL_TIME_SPLIT_PATTERN));
}
if (ObjectUtils.isNotEmpty(insFeeOrder)) {
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);
}
}
}
/**
* 保存保险费用审核信息及审核历史。
*
* @param orderNo 订单号
* @param insOrderNo 保险订单号
* @param isAutoAudit 是否自动审核,true表示自动审核,false表示人工审核
* @param auditstatus 审核状态码
*/
@Override
@Transactional
public InsFeeAudit saveInsFeeAuditAndHistory(String orderNo, String insOrderNo, boolean isAutoAudit, String auditstatus) {
//查询费用审核表
InsFeeAudit insFeeAudit = getOne(new LambdaQueryWrapper().eq(InsFeeAudit::getInsOrderNo, insOrderNo));
if(insFeeAudit != null && insFeeAudit.getAuditstatus().equals("1")){
throw new SystemException("该订单费用已审核,请刷新页面");
}
String userId;
// 填充审核人
if (isAutoAudit) {
userId = "自动审核";
} else {
userId = StpUtil.getLoginId().toString();
}
//添加审核轨迹表
InsFeeAuditHistory insFeeAuditHistory = new InsFeeAuditHistory();
if (insFeeAudit == null) {
insFeeAudit = new InsFeeAudit();
// 设置订单号和保险订单号
insFeeAudit.setAudituser(userId);
insFeeAudit.setOrderno(orderNo);
insFeeAudit.setInsOrderNo(insOrderNo);
insFeeAudit.setAudittime(LocalDateTime.now());
insFeeAudit.setAuditstatus(auditstatus);
this.save(insFeeAudit);
} else {
//状态码为已审核且数据不为空,则更新审核状态
insFeeAudit.setAuditstatus(auditstatus);
insFeeAudit.setAudittime(LocalDateTime.now());
insFeeAudit.setAudituser(userId);
this.update(insFeeAudit, new LambdaUpdateWrapper().eq(InsFeeAudit::getOrderno, orderNo));
}
//复制审核对象的属性
BeanUtils.copyProperties(insFeeAudit, insFeeAuditHistory);
InsAreaCompany insAreaCompany = insAreaCompanyMapper.selectById(insFeeAudit.getInsOrderNo());
// 设置操作时间和操作人及保险公司名称
insFeeAuditHistory.setInsCompany(insAreaCompany.getInscompany());
insFeeAuditHistory.setOperatorTime(LocalDateTime.now());
insFeeAuditHistory.setOperator(BaseController.getUser().getName());
// 保存审核轨迹
insFeeAuditHistoryService.save(insFeeAuditHistory);
return insFeeAudit;
}
@Override
public InsFeeAudit saveDefaultInsFeeAuditAndHistory(String orderNo, String insOrderNo, String auditstatus, String rejectInfo) {
//查询费用审核表
InsFeeAudit insFeeAudit = getOne(new LambdaQueryWrapper()
.eq(InsFeeAudit::getOrderno, orderNo)
.eq(InsFeeAudit::getInsOrderNo, insOrderNo));
//添加审核轨迹表
InsFeeAuditHistory insFeeAuditHistory = new InsFeeAuditHistory();
if (insFeeAudit == null) {
insFeeAudit = new InsFeeAudit();
// 设置订单号和保险订单号
insFeeAudit.setOrderno(orderNo);
insFeeAudit.setInsOrderNo(insOrderNo);
insFeeAudit.setAuditstatus(auditstatus);
this.save(insFeeAudit);
} else {
//状态码为已审核且数据不为空,则更新审核状态
//如果审核状态为已审核则一直都是已审核
if(insFeeAudit.getAuditstatus().equals("1")) {
insFeeAudit.setAuditstatus(insFeeAudit.getAuditstatus());
}else{
insFeeAudit.setAuditstatus(auditstatus);
}
insFeeAudit.setAudituser(BaseController.getUser().getName());
insFeeAudit.setAudittime(LocalDateTime.now());
insFeeAudit.setRejectinfo(rejectInfo);
this.update(insFeeAudit, new LambdaUpdateWrapper()
.eq(InsFeeAudit::getOrderno, orderNo)
.eq(InsFeeAudit::getInsOrderNo, insOrderNo));
}
//复制审核对象的属性
BeanUtils.copyProperties(insFeeAudit, insFeeAuditHistory);
InsAreaCompany insAreaCompany = insAreaCompanyMapper.selectById(insFeeAudit.getInsOrderNo());
// 设置操作时间和操作人及保险公司名称
insFeeAuditHistory.setInsCompany(insAreaCompany.getInscompany());
insFeeAuditHistory.setOperatorTime(LocalDateTime.now());
insFeeAuditHistory.setOperator(BaseController.getUser().getName());
// 保存审核轨迹
insFeeAuditHistoryService.save(insFeeAuditHistory);
return insFeeAudit;
}
/**
* 获取费用审核 根据子订单id
* @return
*/
@Override
public InsFeeAudit getFeeAuditByInsOrderNo(String insOrderNo) {
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(InsFeeAudit::getInsOrderNo,insOrderNo);
return this.getOne(queryWrapper);
}
}