| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467 |
- 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<EsmAgreementProdfee> 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<EsmRetail> list = esmRetailService.selectList(" where deptid = ? and status=?", new Object[]{order.getDeptid(), "1"});
- //2、根据userid查询三级推荐人
- List<SysUser> 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<Double> rateList = new ArrayList<Double>();
- 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<EsmRetail> list = esmRetailService.selectList(" where deptid = ? and status=?", new Object[]{deptid, "1"});
- //2、根据userid查询三级推荐人
- List<SysUser> 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<Double> 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<InsOrder> 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<RiskInfoVo> 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<KindInfoVo> kinds = record.getKindList();
- String productId = "";
- String productname = "";
- List<EsmAgreement> 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<EsmAgreementProd> 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;
- }
- }
|