package com.ydtech.components; import com.ydtech.constants.enums.dict.insurance.VehicleType; import com.ydtech.exception.SystemException; import com.ydtech.modules.admin.service.SysDeptService; import com.ydtech.modules.admin.service.SysUserService; import com.ydtech.modules.esm.service.EsmAgreementProdService; import com.ydtech.modules.esm.service.EsmAgreementProdfeeService; import com.ydtech.modules.esm.service.EsmAgreementService; import com.ydtech.modules.esm.service.EsmRetailService; import com.ydtech.modules.ins.model.InsOrder; import com.ydtech.modules.ins.model.vo.CarInfoVo; import com.ydtech.modules.ins.model.vo.RiskInfoVo; 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.protocol.utils.AssertionUtils; import org.springframework.stereotype.Component; import org.springframework.util.ObjectUtils; import org.springframework.util.StringUtils; import javax.annotation.Resource; @Component public class OrderComponents { @Resource private EsmAgreementService esmAgreementService; @Resource private EsmAgreementProdfeeService esmAgreementProdfeeService; @Resource private InsFeeDetailService insFeeDetailService; @Resource private InsDeptFeeService insDeptFeeService; @Resource private InsCommissionService insCommissionService; @Resource private EsmRetailService esmRetailService; @Resource private SysUserService sysUserService; @Resource private InsOrderService insOrderService; @Resource private SysDeptService sysDeptService; @Resource private EsmAgreementProdService esmAgreementProdService; // @Resource // 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.isEmpty() && !users.isEmpty() && !"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("车辆信息 不能为空!"); } if (yaQuoteInfoVo.getPolicyHolderInfo() == null || yaQuoteInfoVo.getInsuredPersonInfo() == null) { throw new SystemException("被保人信息 / 被保人信息 不能为空!"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getOwnerInfo().getIdentifyType())) { yaQuoteInfoVo.getOwnerInfo().setIdentifyType("1"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getInsuredPersonInfo().getIdentifyType())) { yaQuoteInfoVo.getInsuredPersonInfo().setIdentifyType("1"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getPolicyHolderInfo().getIdentifyType())) { yaQuoteInfoVo.getPolicyHolderInfo().setIdentifyType("1"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getOwnerInfo().getProperty())) { yaQuoteInfoVo.getOwnerInfo().setProperty("1"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getInsuredPersonInfo().getProperty())) { yaQuoteInfoVo.getInsuredPersonInfo().setProperty("1"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getPolicyHolderInfo().getProperty())) { yaQuoteInfoVo.getPolicyHolderInfo().setProperty("1"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getCarInfo().getFrameNo())) { throw new SystemException("车架号不能为空"); } if (yaQuoteInfoVo.getRiskList() == null || yaQuoteInfoVo.getRiskList().isEmpty()) { throw new SystemException("投保信息 不能为空!"); } CarInfoVo carInfo = yaQuoteInfoVo.getCarInfo(); if (VehicleType.VT_A1.getCode().equals(carInfo.getCimodelclass())) { String limitLoad = carInfo.getLimitLoad(); AssertionUtils.isFail(StringUtils.isEmpty(limitLoad), "车辆种类为货车时,核定载质量必传"); } for (RiskInfoVo riskInfoVo : yaQuoteInfoVo.getRiskList()) { if (riskInfoVo.getStartDate() == null || riskInfoVo.getEndDate() == null) { throw new SystemException("投保信息 起保日期 或 终保日期 不能为空!"); } } } public void checkEmptyApp(YaQuoteInfoVo yaQuoteInfoVo) { if (yaQuoteInfoVo.getCarInfo() == null) { throw new SystemException("车辆信息 不能为空!"); } if (yaQuoteInfoVo.getPolicyHolderInfo() == null || yaQuoteInfoVo.getInsuredPersonInfo() == null) { throw new SystemException("被保人信息 / 被保人信息 不能为空!"); } if (StringUtils.isEmpty(yaQuoteInfoVo.getCarInfo().getFrameNo())) { throw new SystemException("车架号不能为空"); } if (yaQuoteInfoVo.getRiskList() == null || yaQuoteInfoVo.getRiskList().isEmpty()) { throw new SystemException("投保信息 不能为空!"); } CarInfoVo carInfo = yaQuoteInfoVo.getCarInfo(); if (VehicleType.VT_A1.getCode().equals(carInfo.getCimodelclass())) { String limitLoad = carInfo.getLimitLoad(); AssertionUtils.isFail(StringUtils.isEmpty(limitLoad), "车辆种类为货车时,核定载质量必传"); } } // /** // * 生成订单信息 // * // * @param record // * @param insCompany // * @return InsOrder // */ // public InsOrder geneOrder(YaQuoteInfoVo record, String insCompany, String authComCode) { // checkEmpty(record); // // SysUser user = sysUserService.getById(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; } }