package com.ydtech.modules.ins.controller; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ydtech.core.page.HttpResult; 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.EsmRetail; import com.ydtech.modules.esm.service.EsmAgreementProdService; import com.ydtech.modules.esm.service.EsmAgreementService; import com.ydtech.modules.esm.service.EsmRetailService; import com.ydtech.modules.ins.model.*; import com.ydtech.modules.ins.model.vo.*; import com.ydtech.modules.ins.service.InsOrderService; import com.ydtech.modules.ins.service.RenbaoService; import com.ydtech.utils.idgen.IdGenerate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author qinfenglong * @version 1.0.0 * @description InsRenbaoController * @since 2021/3/4 16:43 */ @RestController @RequestMapping("/api/renbao") public class InsRenbaoController { @Autowired RenbaoService renbaoService; @Autowired InsOrderService insOrderService; @Autowired SysUserService sysUserService; @Autowired SysDeptService sysDeptService; @Autowired EsmAgreementService esmAgreementService; @Autowired EsmAgreementProdService esmAgreementProdService; @Autowired EsmRetailService esmRetailService; // @GetMapping("/login") public void login() { renbaoService.login(); // renbaoService.calActualVal(); // renbaoService.quote(); } @PostMapping("/actualValue") public HttpResult actualValue(@RequestBody RbValueVo rbValueVo) { HttpResult httpResult = new HttpResult(); renbaoService.login(); // 先登录 //实际价值 String result = renbaoService.calActualVal(rbValueVo); httpResult.setData(result); return httpResult; } @PostMapping("/quote") public HttpResult quote(@RequestBody QuoteInfoVo quoteInfo) { HttpResult httpResult = new HttpResult(); RbQuoteInfo rbQuoteInfo = parseOjb(quoteInfo); //保存订单信息 InsOrder insOrder = new InsOrder(); String orderno = IdGenerate.nextId(); // String quoteno = String.valueOf(new Date().getTime()); insOrder.setOrderno(orderno); insOrder.setQuoteno(quoteInfo.getQuoteno()); insOrder.setOrderstatus("0"); //0报价 1待核保 2已核保待缴费 3核保退回 4核保不通过 insOrder.setFrameNo(quoteInfo.getCarInfo().getFrameNo()); insOrder.setLicenseNo(quoteInfo.getCarInfo().getLicenseNo()); insOrder.setCarinfo(JSONObject.parseObject(JSONObject.toJSONString(quoteInfo.getCarInfo()))); SysUser user = sysUserService.getById(quoteInfo.getUserId()); if (user == null) { httpResult.setMsg("userId不存在"); return httpResult; } // if (org.springframework.util.StringUtils.isEmpty(quoteInfo.getCarInfo().getFrameNo())) { httpResult.setMsg("车架号不能为空"); return httpResult; } // 关闭订单 不含当前报价号 InsOrder orderObj = insOrderService.queryQuoteno(new Object[]{quoteInfo.getUserId(), quoteInfo.getCarInfo().getFrameNo(), quoteInfo.getQuoteno()}); if (orderObj != null) { List list = insOrderService.selectList(" where quoteno=?", new Object[]{orderObj.getQuoteno()}); String status = "0"; for (InsOrder order : list) { if (!"0".equals(order.getOrderstatus())) { status = order.getOrderstatus(); } } //0报价中 1待核保 2已核保 3核保退回 4核保不通过 5已核保待缴费 6已缴费 7已承保 99已关闭 if ("0".equals(status)) {//关闭订单 insOrderService.closeOrder(orderObj.getQuoteno(), "99"); } else if (!"99".equals(status)) { httpResult.setMsg("此车辆已提交核保,重新报价请先关闭订单,任务号:" + orderObj.getQuoteno()); return httpResult; } } insOrder.setUserid(quoteInfo.getUserId()); insOrder.setUsername(user.getName()); insOrder.setDeptid(user.getDeptId()); SysDept dept = sysDeptService.getById(user.getDeptId()); insOrder.setDeptname(dept == null ? "" : dept.getName()); double retailRate = countRetail(user.getDeptId(), user.getId()); // insOrder.setFeerate(0); // insOrder.setDisrate(0); insOrder.setOwnerinfo(JSONObject.parseObject(JSONObject.toJSONString(quoteInfo.getOwnerInfo()))); insOrder.setApplyinfo(JSONObject.parseObject(JSONObject.toJSONString(quoteInfo.getPolicyHolderInfo()))); insOrder.setInsureinfo(JSONObject.parseObject(JSONObject.toJSONString(quoteInfo.getInsuredPersonInfo()))); insOrder.setInsuredname(quoteInfo.getPolicyHolderInfo().getName()); List risks = quoteInfo.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()); } } // insOrder.setJqstartdate(""); // insOrder.setJqenddate(""); // insOrder.setSystartdate(""); // insOrder.setSyenddate(""); // ZG01001 单交强 // ZG01002 单三者 // ZG01003 单商业 // ZG01004 交强+三者 交强+三者 (交强的费用) // ZG01005 交强+三者 交强+三者(三者的费用) // ZG01006 交强+商业 交强+商业(交强的费用) // ZG01007 交强+商业 交强+商业(商业的费用) List kinds = quoteInfo.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[]{"000001%", "%" + user.getDeptId() + "%"}); if (agreements.size() == 0) { httpResult.setMsg("不存在有效协议或机构" + user.getDeptId() + "未授权"); return httpResult; } 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(quoteInfo.getRiskList()))); insOrder.setKindinfo(JSONObject.parseArray(JSONObject.toJSONString(quoteInfo.getKindList()))); // insOrder.setJqpremium(0); // insOrder.setSypremium(0); // insOrder.setTaxamount(0); // insOrder.setSumpremium(0); insOrder.setInscompany("人保财险"); // insOrder.setQuotestatus("0"); //报价状态 0失败 1成功 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); insOrder.setCreatetime(sdf.format(new Date())); insOrder.setReqtxt(JSONObject.parseObject(JSONObject.toJSONString(quoteInfo))); // insOrder.setReptxt(""); //报价 JSONObject result = renbaoService.quote(rbQuoteInfo); if (result == null) { login(); // 先登录 result = renbaoService.quote(rbQuoteInfo); } if (result == null) { httpResult.setMsg("报价异常"); insOrder.setQuotestatus("0"); //报价状态 0失败 1成功 insOrder.setReptxt(JSONObject.parseObject(JSONObject.toJSONString(httpResult))); insOrderService.insert(insOrder); return httpResult; } JSONArray riskArray = result.getJSONArray("itemKindTempList"); if (riskArray != null && riskArray.size() > 0) { QuoteRespVo quoteRespVo = new QuoteRespVo(); double tax = result.getDouble("thisPayTax"); double ciPremium = result.getDouble("ciPremium"); double sumPremium = result.getDouble("sumPremium"); BigDecimal sumPremium2 = new BigDecimal(sumPremium); sumPremium2 = sumPremium2.setScale(2, BigDecimal.ROUND_HALF_UP); quoteRespVo.setCiSumPermium(ciPremium + tax); //交强险和车船税合计 quoteRespVo.setSumPermium(sumPremium2.doubleValue() + tax); quoteRespVo.setTotalAdjustRate(1); quoteRespVo.setTaxAmount(tax); quoteRespVo.setILogPreUdwMess(result.getString("piccScore")); List riskList = new ArrayList<>(); String startDate = ""; String startDateCI = ""; String endDate = ""; String endDateCI = ""; for (RiskInfoVo riskInfoVo : quoteInfo.getRiskList()) { if ("0507".equals(riskInfoVo.getRiskCode())) { startDateCI = riskInfoVo.getStartDate().substring(0, 10); endDateCI = riskInfoVo.getEndDate().substring(0, 10); } else { startDate = riskInfoVo.getStartDate().substring(0, 10); endDate = riskInfoVo.getEndDate().substring(0, 10); } } List kindList = new ArrayList<>(); for (int i = 0; i < riskArray.size(); i++) { JSONObject data = riskArray.getJSONObject(i); if ("051074".equals(data.getString("kindCode"))) { //交强 QuoteRiskRespVo risk = new QuoteRiskRespVo(); risk.setRiskCode("0507"); risk.setRiskName("机动车交通事故责任强制保险"); risk.setPremium(data.getDouble("premium")); risk.setStartDate(startDateCI + " 00:00"); risk.setEndDate(endDateCI + " 24:00"); riskList.add(risk); } QuoteKindRespVo kind = null; if ("051050".equals(data.getString("kindCode"))) { kind = new QuoteKindRespVo(); kind.setKindCode("A"); kind.setKindName("车辆损失保险"); kind.setAmount(data.getDouble("amount")); kind.setCoveragePremium(data.getDouble("premium")); kindList.add(kind); } if ("051051".equals(data.getString("kindCode"))) { kind = new QuoteKindRespVo(); kind.setKindCode("B"); kind.setKindName("第三者责任险"); kind.setAmount(data.getDouble("amount")); kind.setCoveragePremium(data.getDouble("premium")); kindList.add(kind); } if ("051052".equals(data.getString("kindCode"))) { kind = new QuoteKindRespVo(); kind.setKindCode("D3"); kind.setKindName("司机责任险"); kind.setAmount(data.getDouble("amount")); kind.setCoveragePremium(data.getDouble("premium")); kind.setUnitAmount(data.getDouble("amount")); kindList.add(kind); } if ("051053".equals(data.getString("kindCode"))) { kind = new QuoteKindRespVo(); kind.setKindCode("D4"); kind.setKindName("乘客责任险"); kind.setAmount(data.getDouble("amount")); kind.setCoveragePremium(data.getDouble("premium")); kind.setUnitAmount(data.getDouble("unitAmount")); kindList.add(kind); } } if (kindList.size() > 0) { QuoteRiskRespVo risk = new QuoteRiskRespVo(); risk.setRiskCode("0510"); risk.setRiskName("机动车商业保险"); BigDecimal syPremium = new BigDecimal(sumPremium - ciPremium); syPremium = syPremium.setScale(2, BigDecimal.ROUND_HALF_UP); risk.setPremium(syPremium.doubleValue()); risk.setStartDate(startDate + " 00:00"); risk.setEndDate(endDate + " 24:00"); riskList.add(risk); } quoteRespVo.setOrderno(orderno); //订单号 quoteRespVo.setRiskList(riskList); quoteRespVo.setKindList(kindList); httpResult.setData(quoteRespVo); httpResult.setMsg("成功"); //报价成功更新险种信息 insOrder.setRiskinfo(JSONObject.parseArray(JSONObject.toJSONString(riskList))); insOrder.setKindinfo(JSONObject.parseArray(JSONObject.toJSONString(kindList))); BigDecimal jqPremium = new BigDecimal(result.getDouble("ciPremium")); jqPremium = jqPremium.setScale(2, BigDecimal.ROUND_HALF_UP); insOrder.setJqpremium(jqPremium.doubleValue()); double syPremium = result.getDouble("sumPremium") - result.getDouble("ciPremium"); BigDecimal bd = new BigDecimal(syPremium); bd = bd.setScale(2, BigDecimal.ROUND_HALF_UP); syPremium = bd.doubleValue(); insOrder.setSypremium(syPremium); insOrder.setTaxamount(result.getDouble("thisPayTax")); insOrder.setSumpremium(sumPremium2.doubleValue()); insOrder.setQuotestatus("1"); //报价状态 0失败 1成功 } else if (result.getString("errorTitle") != null) { httpResult.setCode(201); httpResult.setMsg(result.getString("errorTitle") + "&" + result.getString("errorMsg")); insOrder.setQuotestatus("0"); //报价状态 0失败 1成功 } else { httpResult.setCode(202); httpResult.setMsg("报价异常"); insOrder.setQuotestatus("0"); //报价状态 0失败 1成功 } insOrder.setReptxt(JSONObject.parseObject(JSONObject.toJSONString(httpResult))); insOrderService.insert(insOrder); return httpResult; } /** * 分销费用统计 * * @param deptid * @param userid * @return */ public double countRetail(String deptid, String userid) { double retailRate = 0; return retailRate; // //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 = users.size() > 2 ? 2 : users.size(); // 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; } //请求参数转换 public RbQuoteInfo parseOjb(QuoteInfoVo quoteInfo) { RbQuoteInfo rbQuoteInfo = new RbQuoteInfo(); rbQuoteInfo.setLicenseNo(quoteInfo.getCarInfo().getLicenseNo()); rbQuoteInfo.setEngineNo(quoteInfo.getCarInfo().getEngineNo()); rbQuoteInfo.setVinNo(quoteInfo.getCarInfo().getVinNo()); rbQuoteInfo.setCarOwner(quoteInfo.getOwnerInfo().getName()); String idno = quoteInfo.getOwnerInfo().getIdentifyNumber(); String birthdary = idno.substring(6, 14); String sex = idno.substring(16, 17); if ("02468".indexOf(sex) > -1) { sex = "2"; } else { sex = "1"; } rbQuoteInfo.setSex(sex); //1男 2女 男单女双 rbQuoteInfo.setBirthday(birthdary.substring(0, 4) + "-" + birthdary.substring(4, 6) + "-" + birthdary.substring(6, 8)); rbQuoteInfo.setEnrollDate(quoteInfo.getCarInfo().getRegisterDate()); rbQuoteInfo.setUseYears("1"); List kindList = new ArrayList<>(); for (RiskInfoVo riskInfoVo : quoteInfo.getRiskList()) { if ("0507".equals(riskInfoVo.getRiskCode())) { rbQuoteInfo.setStartDateCI(riskInfoVo.getStartDate().substring(0, 10)); RbKind kind = new RbKind(); kind.setKindCode("051074"); kind.setKindName("交强"); kind.setAmount(String.valueOf(riskInfoVo.getAmount())); kindList.add(kind); } else { rbQuoteInfo.setStartDate(riskInfoVo.getStartDate().substring(0, 10)); } } for (KindInfoVo kindInfoVo : quoteInfo.getKindList()) { RbKind rbKind = new RbKind(); String kindcode = kindInfoVo.getKindCode(); if ("A".equals(kindcode)) { rbKind.setKindCode("051050"); rbKind.setKindName("机动车损失保险"); rbKind.setAmount(String.valueOf(kindInfoVo.getAmount())); kindList.add(rbKind); } if ("B".equals(kindcode)) { rbKind.setKindCode("051051"); rbKind.setKindName("第三者责任险"); int num = (int) kindInfoVo.getAmount() / 10000; rbKind.setAmount(String.valueOf(num)); kindList.add(rbKind); } if ("D3".equals(kindcode)) { rbKind.setKindCode("051052"); rbKind.setKindName("车上人员责任险(司机)"); rbKind.setAmount(String.valueOf(kindInfoVo.getAmount())); kindList.add(rbKind); } if ("D4".equals(kindcode)) { rbKind.setKindCode("051053"); rbKind.setKindName("车上人员责任险(乘客)"); rbKind.setAmount(String.valueOf(kindInfoVo.getAmount())); kindList.add(rbKind); } } rbQuoteInfo.setKindList(kindList); rbQuoteInfo.setBrandName(quoteInfo.getCarInfo().getBrandName()); rbQuoteInfo.setVehicleMaker(quoteInfo.getCarInfo().getFactoryid()); rbQuoteInfo.setModelCode(quoteInfo.getCarInfo().getModelCode()); rbQuoteInfo.setSeatCount(quoteInfo.getCarInfo().getSeatCount()); RbValueVo rbValueVo = new RbValueVo(); rbValueVo.setApprovedPassengersCapacity(quoteInfo.getCarInfo().getSeatCount()); rbValueVo.setPurchasePrice(quoteInfo.getCarInfo().getPurchasePrice()); rbValueVo.setRegisterDate(quoteInfo.getCarInfo().getRegisterDate()); rbValueVo.setValidDate(rbQuoteInfo.getStartDate()); HttpResult result = actualValue(rbValueVo); rbQuoteInfo.setActualValue(String.valueOf(result.getData())); rbQuoteInfo.setPurchasePrice(quoteInfo.getCarInfo().getPurchasePrice()); String enginedesc = quoteInfo.getCarInfo().getEnginedesc().replace("T", ""); enginedesc = enginedesc.replace("L", ""); rbQuoteInfo.setExhaustScale(enginedesc); rbQuoteInfo.setCompleteKerbMass(quoteInfo.getCarInfo().getCompleteKerbMass()); return rbQuoteInfo; } }