package com.ydtech.components; import com.alibaba.fastjson.JSONObject; import com.ydtech.exception.SystemException; 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.model.EsmAgreement; import com.ydtech.modules.esm.model.EsmAgreementProd; import com.ydtech.modules.esm.model.EsmAgreementProdfee; import com.ydtech.modules.esm.model.EsmRetail; import com.ydtech.modules.esm.service.*; import com.ydtech.modules.ins.model.InsCommission; import com.ydtech.modules.ins.model.InsDeptFee; import com.ydtech.modules.ins.model.InsFeeDetail; import com.ydtech.modules.ins.model.InsOrder; import com.ydtech.modules.ins.model.ya.YaQuoteInfoVo; import com.ydtech.modules.ins.service.InsCommissionService; import com.ydtech.modules.ins.service.InsDeptFeeService; import com.ydtech.modules.ins.service.InsFeeDetailService; import com.ydtech.modules.ins.service.InsOrderService; import com.ydtech.modules.ins.vo.KindInfoVo; import com.ydtech.modules.ins.vo.RiskInfoVo; import com.ydtech.utils.idgen.IdGenerate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.math.RoundingMode; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @Component public class OrderComponents { @Autowired private EsmAgreementService esmAgreementService; @Autowired private EsmAgreementProdfeeService esmAgreementProdfeeService; @Autowired private InsFeeDetailService insFeeDetailService; @Autowired private InsDeptFeeService insDeptFeeService; @Autowired private InsCommissionService insCommissionService; @Autowired private EsmRetailService esmRetailService; @Autowired private EsmUserInternalService esmUserInternalService; @Autowired private SysUserService sysUserService; @Autowired private InsOrderService insOrderService; @Autowired private SysDeptService sysDeptService; @Autowired private EsmAgreementProdService esmAgreementProdService; @Autowired private StringRedisTemplate redisTemplate; /** * 保存费用明细 * * @param order */ public void saveFeeDetail(InsOrder order) { InsFeeDetail feeDetail = new InsFeeDetail(); feeDetail.setOrderno(order.getOrderno()); feeDetail.setQuoteno(order.getQuoteno()); feeDetail.setFeerate(order.getFeerate()); //交强手续费比例 feeDetail.setDisrate(order.getDisrate()); //商业手续费比例 BigDecimal jqfee = new BigDecimal(order.getJqpremium() * order.getFeerate() * 0.01); jqfee = jqfee.setScale(2, BigDecimal.ROUND_HALF_UP); feeDetail.setFeeamount(jqfee.doubleValue()); //交强手续费 BigDecimal syfee = new BigDecimal(order.getSypremium() * order.getDisrate() * 0.01); syfee = syfee.setScale(2, BigDecimal.ROUND_HALF_UP); feeDetail.setDisamount(syfee.doubleValue()); //商业手续费 feeDetail.setJqdiscountrate(order.getJqdiscountrate()); feeDetail.setSydiscountrate(order.getSydiscountrate()); BigDecimal jqDiscount = new BigDecimal(order.getJqpremium() * order.getJqdiscountrate() * 0.01); jqDiscount = jqDiscount.setScale(2, RoundingMode.HALF_UP); feeDetail.setJqdiscount(jqDiscount.doubleValue()); //交强优惠金额 BigDecimal syDiscount = new BigDecimal(order.getSypremium() * order.getSydiscountrate() * 0.01); syDiscount = syDiscount.setScale(2, RoundingMode.HALF_UP); feeDetail.setSydiscount(syDiscount.doubleValue()); //商业优惠金额 feeDetail.setJqpremium(order.getJqpremium()); feeDetail.setSypremium(order.getSypremium()); feeDetail.setTaxamount(order.getTaxamount()); feeDetail.setSumpremium(order.getSumpremium()); feeDetail.setInscompany(order.getInscompany()); feeDetail.setAgreeid(order.getAgreeid()); feeDetail.setAgreeprodid(order.getProductid()); EsmAgreement esmAgreement = esmAgreementService.selectByPk(order.getAgreeid()); if (esmAgreement != null) { feeDetail.setAgreementcode(esmAgreement.getAgreementcode()); feeDetail.setAgreetype(esmAgreement.getAgreementtype()); feeDetail.setChannel(esmAgreement.getChannel()); } feeDetail.setProducname(order.getProduct()); feeDetail.setAuditstatus("0"); //0未审核 1已审核 insFeeDetailService.insert(feeDetail); //机构费用 InsDeptFee deptFee = new InsDeptFee(); deptFee.setOrderno(order.getOrderno()); deptFee.setQuoteno(order.getQuoteno()); deptFee.setAgreeid(order.getAgreeid()); deptFee.setAgreeprodid(order.getProductid()); deptFee.setAuditstatus("0"); deptFee.setSettlestatus("0"); List prodfees = esmAgreementProdfeeService.selectList(" where agreeprodid=?", new Object[]{order.getProductid()}); for (EsmAgreementProdfee prodfee : prodfees) { deptFee.setKeeprate(prodfee.getKeeprate() * 0.01); BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * prodfee.getKeeprate() * 0.01); amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP); deptFee.setKeepamount(amount.doubleValue()); deptFee.setAddrate(prodfee.getAddrate() * 0.01); amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * prodfee.getAddrate() * 0.01); amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP); deptFee.setAddamount(amount.doubleValue()); deptFee.setComlevel(prodfee.getComlevel()); if ("一级".equals(prodfee.getComlevel())) { deptFee.setComcode(order.getDeptid().substring(0, 2)); //99140302M01D01 } else if ("二级".equals(prodfee.getComlevel())) { deptFee.setComcode(order.getDeptid().substring(0, 4)); } else if ("三级".equals(prodfee.getComlevel())) { deptFee.setComcode(order.getDeptid().substring(0, 6)); } else if ("四级".equals(prodfee.getComlevel())) { deptFee.setComcode(order.getDeptid().substring(0, 8)); } else { deptFee.setComcode(order.getDeptid().substring(0, 11)); } insDeptFeeService.insert(deptFee); } saveRetail(order); //分销所占比例 } /** * 三级分销费用保存 * * @param order * @return */ public double saveRetail(InsOrder order) { double retailRate = 0; //1、根据机构匹配分销规则,获取分销比例 List list = esmRetailService.selectList(" where deptid = ? and status=?", new Object[]{order.getDeptid(), "1"}); //2、根据userid查询三级推荐人 List users = esmUserInternalService.getSuperior(order.getUserid()); if (list != null && list.size() > 0 && users.size() > 0 && !"0".equals(list.get(0).getRetailtype())) { EsmRetail retail = list.get(0); List rateList = new ArrayList(); rateList.add(retail.getDisrate1()); rateList.add(retail.getDisrate2()); rateList.add(retail.getDisrate3()); if ("1".equals(retail.getRetailtype())) {//一级分销 InsCommission commission = new InsCommission(); commission.setOrderno(order.getOrderno()); commission.setQuoteno(order.getQuoteno()); commission.setRefereescode(users.get(0).getId()); commission.setRefereesname(users.get(0).getName()); double rate = rateList.get(0) * 0.01; commission.setCommissionrate(rate); BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * rate); amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP); commission.setCommissionamount(amount.doubleValue()); commission.setLevel("1"); commission.setAuditstatus("0"); //0未审核 1已审核 commission.setSettlestatus("0"); //0未结算 1已结算 commission.setInsuredtime(order.getAudittime()); //承保确认时间 insCommissionService.insert(commission); retailRate += rateList.get(0); } else if ("2".equals(retail.getRetailtype())) {//二级分销 int num = users.size() > 2 ? 2 : users.size(); for (int i = 0; i < num; i++) { InsCommission commission = new InsCommission(); commission.setOrderno(order.getOrderno()); commission.setQuoteno(order.getQuoteno()); commission.setRefereescode(users.get(i).getId()); commission.setRefereesname(users.get(i).getName()); double rate = rateList.get(i) * 0.01; commission.setCommissionrate(rate); BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * rate); amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP); commission.setCommissionamount(amount.doubleValue()); commission.setLevel(String.valueOf(i + 1)); commission.setAuditstatus("0"); //0未审核 1已审核 commission.setSettlestatus("0"); //0未结算 1已结算 commission.setInsuredtime(order.getAudittime()); //承保确认时间 insCommissionService.insert(commission); retailRate += rateList.get(i); } } else {//三级分销 int num = users.size() > 2 ? 3 : users.size(); for (int i = 0; i < num; i++) { InsCommission commission = new InsCommission(); commission.setOrderno(order.getOrderno()); commission.setQuoteno(order.getQuoteno()); commission.setRefereescode(users.get(i).getId()); commission.setRefereesname(users.get(i).getName()); double rate = rateList.get(i) * 0.01; commission.setCommissionrate(rate); BigDecimal amount = new BigDecimal((order.getJqpremium() + order.getSypremium()) * rate); amount = amount.setScale(2, RoundingMode.HALF_UP); commission.setCommissionamount(amount.doubleValue()); commission.setLevel(String.valueOf(i + 1)); commission.setAuditstatus("0"); //0未审核 1已审核 commission.setSettlestatus("0"); //0未结算 1已结算 commission.setInsuredtime(order.getAudittime()); //承保确认时间 insCommissionService.insert(commission); retailRate += rateList.get(i); } } } return retailRate; } /** * 分销费用统计 * * @param deptid * @param userid * @return */ public double countRetail(String deptid, String userid) { double retailRate = 0; //1、根据机构匹配分销规则,获取分销比例 List list = esmRetailService.selectList(" where deptid = ? and status=?", new Object[]{deptid, "1"}); //2、根据userid查询三级推荐人 List users = esmUserInternalService.getSuperior(userid); if (list != null && list.size() > 0 && users.size() > 0 && !"0".equals(list.get(0).getRetailtype())) { EsmRetail retail = list.get(0); List rateList = new ArrayList<>(); rateList.add(retail.getDisrate1()); rateList.add(retail.getDisrate2()); rateList.add(retail.getDisrate3()); if ("1".equals(retail.getRetailtype())) {//一级分销 retailRate += rateList.get(0); } else if ("2".equals(retail.getRetailtype())) {//二级分销 int num = Math.min(users.size(), 2); for (int i = 0; i < num; i++) { retailRate += rateList.get(i); } } else {//三级分销 int num = users.size() > 2 ? 3 : users.size(); for (int i = 0; i < num; i++) { retailRate += rateList.get(i); } } } return retailRate; } /** * 校验参数 * * @param yaQuoteInfoVo * @throws Exception */ public void checkEmpty(YaQuoteInfoVo yaQuoteInfoVo) { if (yaQuoteInfoVo.getCarInfo() == null) { throw new SystemException("carInfo不能为空!"); } if (yaQuoteInfoVo.getPolicyHolderInfo() == null || yaQuoteInfoVo.getInsuredPersonInfo() == null) { throw new SystemException("policyHolderInfo/insuredPersonInfo 不能为空!"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getCarInfo().getFrameNo())) { throw new SystemException("车架号不能为空"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getQuoteno())) { throw new SystemException("报价号不能为空"); } if (yaQuoteInfoVo.getRiskList() == null || yaQuoteInfoVo.getRiskList().size() == 0) { throw new SystemException("riskList 不能为空!"); } else { for (RiskInfoVo riskInfoVo : yaQuoteInfoVo.getRiskList()) { if (riskInfoVo.getStartDate() == null || riskInfoVo.getEndDate() == null) { throw new SystemException("riskList.startDate / riskList.endDate不能为空!"); } } } } /** * 生成订单信息 * * @param record * @param insCompany * @return InsOrder */ public InsOrder geneOrder(YaQuoteInfoVo record, String insCompany, String authComCode) { checkEmpty(record); SysUser user = sysUserService.selectByPk(record.getUserId()); if (user == null) { throw new SystemException("userId不存在"); } InsOrder insOrder = new InsOrder(); String orderno = IdGenerate.nextId(); insOrder.setOrderno(orderno); insOrder.setQuoteno(String.valueOf(record.getQuoteno())); insOrder.setOrderstatus("0"); // 0 报价 1 待核保 2 已核保待缴费 3 核保退回 4 核保不通过 insOrder.setFrameNo(record.getCarInfo().getFrameNo()); insOrder.setLicenseNo(record.getCarInfo().getLicenseNo()); insOrder.setCarinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getCarInfo()))); // 关闭订单 不含当前报价号 InsOrder orderObj = insOrderService.queryQuoteno(new Object[]{record.getUserId(), record.getCarInfo().getFrameNo(), record.getQuoteno()}); if (orderObj != null) { List listo = insOrderService.selectList(" where quoteno=?", new Object[]{orderObj.getQuoteno()}); String status = "0"; for (InsOrder order : listo) { if (!"0".equals(order.getOrderstatus())) { status = order.getOrderstatus(); } } //0报价中 1待核保 2已核保 3核保退回 4核保不通过 5已核保待缴费 6已缴费 7已承保 99已关闭 if ("0".equals(status)) {//关闭订单 insOrderService.closeOrder(orderObj.getOrderno(), "99"); } else if (!"99".equals(status)) { throw new SystemException("此车辆已提交核保,重新报价请先关闭订单,任务号:" + orderObj.getQuoteno()); } } insOrder.setUserid(user.getId()); insOrder.setUsername(user.getName()); insOrder.setDeptid(user.getDeptId()); SysDept dept = sysDeptService.getById(user.getDeptId()); // SysDept dept = sysDeptService.selectByPk(user.getDeptId()); insOrder.setDeptname(dept == null ? "" : dept.getName()); double retailRate = countRetail(user.getDeptId(), user.getId()); insOrder.setOwnerinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getOwnerInfo()))); insOrder.setApplyinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getPolicyHolderInfo()))); insOrder.setInsureinfo(JSONObject.parseObject(JSONObject.toJSONString(record.getInsuredPersonInfo()))); insOrder.setInsuredname(record.getPolicyHolderInfo().getName()); List risks = record.getRiskList(); for (RiskInfoVo risk : risks) { if ("0507".equals(risk.getRiskCode())) {//交强 insOrder.setJqstartdate(risk.getStartDate()); insOrder.setJqenddate(risk.getEndDate()); } if ("0510".equals(risk.getRiskCode())) {//商业 insOrder.setSystartdate(risk.getStartDate()); insOrder.setSyenddate(risk.getEndDate()); } } List kinds = record.getKindList(); String productId = ""; String productname = ""; List agreements = esmAgreementService.selectList(" where t.agreestatus='1' and t.insure1 like ? " + "and exists (select 1 from esm_agreement_prod t2 where t.id=t2.agreeid and t2.authcomcode like ?)", new Object[]{authComCode + "%", "%" + user.getDeptId() + "%"}); if (agreements.size() == 0) { throw new SystemException("不存在有效协议或机构" + user.getDeptId() + "未授权"); } String agreeid = agreements.get(0).getId(); insOrder.setAgreeid(agreeid); //匹配协议,获取费用 StringBuffer whereStr = new StringBuffer(); List params = new ArrayList();// where t.agreeid=? and t.productid in () whereStr.append("where t.agreeid=? "); params.add(agreeid); if (risks.size() == 1 && "0507".equals(risks.get(0).getRiskCode())) { productId = "ZG01001"; productname = "单交强"; whereStr.append(" and t.productid=?"); params.add(productId); } else if (risks.size() == 1 && kinds.size() == 1 && "B".equals(kinds.get(0).getKindCode())) { productId = "ZG01002"; productname = "单三者"; whereStr.append(" and t.productid=?"); params.add(productId); } else if (risks.size() == 1) { productId = "ZG01003"; productname = "单商业"; whereStr.append(" and t.productid=?"); params.add(productId); } else if (risks.size() == 2 && kinds.size() == 1 && "B".equals(kinds.get(0).getKindCode())) { productId = "ZG01004"; productname = "交强+三者"; whereStr.append(" and t.productid in (?,?)"); params.add("ZG01004"); params.add("ZG01005"); } else { productId = "ZG01006"; productname = "交强+商业"; whereStr.append(" and t.productid in (?,?)"); params.add("ZG01006"); params.add("ZG01007"); } insOrder.setProductid(productId); insOrder.setProduct(productname); List agreementProds = esmAgreementProdService.selectList(whereStr.toString(), params.toArray()); for (EsmAgreementProd prod : agreementProds) { if ("ZG01001".equals(prod.getProductid()) || "ZG01004".equals(prod.getProductid()) || "ZG01006".equals(prod.getProductid())) { insOrder.setFeerate(prod.getProductrate());//交强手续费比例 insOrder.setJqdiscountrate(prod.getFeerate() - retailRate); //交强优惠比例=业务员绩效-分销费用 } else { insOrder.setDisrate(prod.getProductrate()); //商业手续费比例 insOrder.setSydiscountrate(prod.getFeerate() - retailRate); //商业优惠比例=业务员绩效-分销费用 } insOrder.setProductid(prod.getId()); } insOrder.setRiskinfo(JSONObject.parseArray(JSONObject.toJSONString(record.getRiskList()))); insOrder.setKindinfo(JSONObject.parseArray(JSONObject.toJSONString(record.getKindList()))); SimpleDateFormat sdfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); insOrder.setInscompany(insCompany); insOrder.setCreatetime(sdfm.format(new Date())); return insOrder; } public InsOrder orderExists(String orderNo) { InsOrder insOrder = insOrderService.selectByPk(orderNo); if (ObjectUtils.isEmpty(insOrder)) { throw new SystemException("订单不存在"); } return insOrder; } }