package com.ydtech.modules.ins.service.impl; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import com.ydtech.components.OrderComponents; import com.ydtech.constants.enums.InsOrderStatus; import com.ydtech.core.page.HttpResult; 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.EsmRetail; import com.ydtech.modules.esm.model.InsTaskImage; import com.ydtech.modules.esm.service.*; import com.ydtech.modules.ins.model.InsOrder; import com.ydtech.modules.ins.model.InsTaskHistory; import com.ydtech.modules.ins.model.vo.*; import com.ydtech.modules.ins.model.ya.*; import com.ydtech.modules.ins.service.*; import com.ydtech.modules.order.entity.InsAreaCompany; import com.ydtech.modules.order.service.InsAreaCompanyService; import com.ydtech.modules.order.service.InsOrdersService; import com.ydtech.utils.HMAC256Uitil; import com.ydtech.utils.HttpXmlUtil; import com.ydtech.utils.idgen.IdGenerate; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestBody; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author gws * @description:TODO * @date 2022-07-13 16:56 */ @Service @Slf4j public class YongAnServiceImpl implements YongAnService { @Value("${ya.url}") String url = ""; @Value("${ya.url.sign}") String url_sign = ""; @Value("${ya.consumerID}") String consumerID = ""; @Value("${ya.consumerAccessKey}") String consumerAccessKey_init = ""; @Value("${ya.matchCode}") String matchCode = ""; @Value("${ya.userCode}") String userCode = ""; @Value("${ya.comCode}") String comCode = ""; @Autowired InsOrderService insOrderService; @Autowired private InsTaskImageService insTaskImageService; @Autowired SysUserService sysUserService; @Autowired SysDeptService sysDeptService; @Autowired EsmAgreementService esmAgreementService; @Autowired EsmAgreementProdService esmAgreementProdService; @Autowired EsmRetailService esmRetailService; @Autowired EsmUserInternalService esmUserInternalService; @Autowired InsOrderTaskService insOrderTaskService; @Autowired InsTaskHistoryService insTaskHistoryService; @Autowired private InsFileLogService insFileLogService; @Autowired InsFeeDetailService insFeeDetailService; @Autowired EsmAgreementProdfeeService esmAgreementProdfeeService; @Autowired InsDeptFeeService insDeptFeeService; @Autowired InsCommissionService insCommissionService; @Autowired OrderComponents orderComponents; /** * 1 车型查询接口 */ @Override public HttpResult modelsQuery(CarModel_Req carModelReq) { // if (StringUtils.isEmpty(carModelReq.getFrameNo()) || StringUtils.isEmpty(carModelReq.getEnrollDate()) || StringUtils.isEmpty(carModelReq.getModelName())) { // return HttpResult.error("frameNo, enrollDate, modelName 这些参数不能为空!"); // } ResponseDataC1 responseDataC1 = new ResponseDataC1(); try { responseDataC1 = getResponseDataC1(carModelReq); if (!responseDataC1.getResponseHead().getStatus().equals("0")) { throw new SystemException("查询车型出错:" + responseDataC1.getResponseHead().getAppMessage()); } } catch (SystemException e) { return HttpResult.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); return HttpResult.error("系统错误,请联系管理员"); } return HttpResult.ok(responseDataC1.getResponseBody().getCarModel()); } /** * 2 报价 */ @Override public HttpResult quote(YaQuoteInfoVo yaQuoteInfoVo) { HttpResult httpResult = new HttpResult(); RequestData requestData = new RequestData(); RequestHead requestHead = getRequestHead("C2"); RequestBodyC2 requestBodyC2 = new RequestBodyC2(); ResponseDataC2 responseDataC2 = new ResponseDataC2(); ObjectMapper mapper = new XmlMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); try { //1.1必填校验 checkEmpty(yaQuoteInfoVo); //1.2 组装订单信息 InsOrder insOrder = gene_order(yaQuoteInfoVo); // PrivyDTO[] privys =new PrivyDTO[2]; List privys = new ArrayList<>(); //2.1投保人信息 CustomerInfoVo policyHolderInfo = yaQuoteInfoVo.getPolicyHolderInfo(); PrivyDTO privyDTO_tbr = new PrivyDTO("1", policyHolderInfo.getName(), policyHolderInfo.getIdentifyNumber()); privyDTO_tbr.setPhoneNo(policyHolderInfo.getMobile()); privyDTO_tbr.setCresidaddr(policyHolderInfo.getAddr()); //2.2车主 CustomerInfoVo ownerInfo = yaQuoteInfoVo.getOwnerInfo(); PrivyDTO privyDTO_bbr = new PrivyDTO("2", ownerInfo.getName(), ownerInfo.getIdentifyNumber()); privyDTO_bbr.setPhoneNo(ownerInfo.getMobile()); privyDTO_bbr.setCresidaddr(ownerInfo.getAddr()); privys.add(privyDTO_tbr); privys.add(privyDTO_bbr); requestBodyC2.setPrivy(privys); //3 车辆信息 CarInfoVo carInfo = yaQuoteInfoVo.getCarInfo(); CarModel_Req carModelReq = new CarModel_Req(carInfo.getFrameNo(), carInfo.getRegisterDate(), carInfo.getBrandName(), carInfo.getCiModelCode()); carModelReq.setEngineNo(carInfo.getEngineNo()); ResponseDataC1 responseDataC1 = getResponseDataC1(carModelReq); if (!responseDataC1.getResponseHead().getStatus().equals("0")) { throw new SystemException("查询车型出错:" + responseDataC1.getResponseHead().getAppMessage()); } ResponseBodyC1 responseBody = responseDataC1.getResponseBody(); List carModel = responseBody.getCarModel(); if (carModel == null || carModel.size() == 0) { throw new SystemException("未查询到匹配车型!"); } // 通过车型校准永安车型 CarModelDTO carModelDTO = null; List collect = carModel.stream().filter(a -> Objects.equals(a.getModelName(), carInfo.getBrandName())).collect(Collectors.toList()); for (CarModelDTO carModelDTO1 : collect) { if (carInfo.getCaryear() == null) { if (carInfo.getPurchasePrice().equals(carModelDTO1.getReplacementValue())) { carModelDTO = carModelDTO1; break; } } else { if (carInfo.getCaryear().equals(carModelDTO1.getMarketYear()) && carInfo.getPurchasePrice().equals(carModelDTO1.getReplacementValue())) { carModelDTO = carModelDTO1; break; } } } if (carModelDTO == null) { carModelDTO = carModel.get(0); } CarDTO carDTO = new CarDTO(); carDTO.setQueryModelNo(responseBody.getQueryModelNo()); carDTO.setLicenseNo(carInfo.getLicenseNo()); carDTO.setFrameNo(carInfo.getFrameNo()); carDTO.setEngineNo(carInfo.getEngineNo()); carDTO.setEnrollDate(carInfo.getRegisterDate()); carDTO.setModelCode(carModelDTO.getModelCode()); carDTO.setModelName(carModelDTO.getModelName()); carDTO.setSeatCount(Integer.parseInt(carModelDTO.getRatedPassengerCapacity())); carDTO.setPurchasePrice(Double.parseDouble(carModelDTO.getReplacementValue())); // if (!StringUtils.isEmpty(carInfo.getTransferDate()) && carInfo.isTransferFlag()) { // carDTO.setTransferDate(carInfo.getTransferDate()); // } if (carInfo.isTransferFlag()) { carDTO.setTransferDate(carInfo.getIssueDate()); } requestBodyC2.setCars(carDTO); //4 交强商业险加工 List riskList = yaQuoteInfoVo.getRiskList(); KindDTO[] kinds; boolean jq_falg = false; for (int i = 0; i < riskList.size(); i++) { //商业险 if (riskList.get(i).getRiskCode().equals("0510")) { if (carDTO.getLicenseNo().length() == 8) {//新能源车 requestBodyC2.setSyRiskCode("039011"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat df_req = new SimpleDateFormat("yyyy-MM-dd HH:mm"); df.format(df_req.parse(riskList.get(i).getEndDate())); requestBodyC2.setSyStartDate(df.format(df_req.parse(riskList.get(i).getStartDate()))); // 交强险即时起保终保日期时分秒与起保日期一致,商业险即时起保终保日期时分秒必须是23:59:59 // 要是不知道怎么传终保日期,可以不传,系统会自动默认,保期一年 // requestBodyC2.setSyEndDate(df.format(df_req.parse(riskList.get(i).getEndDate()))); } else { requestBodyC2.setSyRiskCode("039002"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat df_req = new SimpleDateFormat("yyyy-MM-dd HH:mm"); df.format(df_req.parse(riskList.get(i).getEndDate())); requestBodyC2.setSyStartDate(df.format(df_req.parse(riskList.get(i).getStartDate()))); // 交强险即时起保终保日期时分秒与起保日期一致,商业险即时起保终保日期时分秒必须是23:59:59 // 要是不知道怎么传终保日期,可以不传,系统会自动默认,保期一年 // requestBodyC2.setSyEndDate(df.format(df_req.parse(riskList.get(i).getEndDate()))); } } //交强险 if (riskList.get(i).getRiskCode().equals("0507")) { requestBodyC2.setJqRiskCode("039001"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat df_req = new SimpleDateFormat("yyyy-MM-dd HH:mm"); requestBodyC2.setJqStartDate(df.format(df_req.parse(riskList.get(i).getStartDate()))); // requestBodyC2.setJqEndDate(df.format(df_req.parse(riskList.get(i).getEndDate()))); jq_falg = true; } } //4 险别加工 kinds = geneKindInfo(yaQuoteInfoVo, carDTO, jq_falg); requestBodyC2.setKinds(kinds); //5 其他加工 RebateRateInfoList[] jqRebateRateInfo = new RebateRateInfoList[0]; RebateRateInfoList[] syRebateRateInfo = new RebateRateInfoList[0]; requestBodyC2.setJqRebateRateInfo(jqRebateRateInfo); requestBodyC2.setSyRebateRateInfo(syRebateRateInfo); DeviceItem[] devices = new DeviceItem[0]; ChargingPileDTO[] chargingPiles = new ChargingPileDTO[0]; ExtendInfoDto[] extendInfo = new ExtendInfoDto[1]; extendInfo[0] = new ExtendInfoDto("matchCode", matchCode); requestBodyC2.setDevices(devices); requestBodyC2.setChargingPiles(chargingPiles); requestBodyC2.setExtendInfo(extendInfo); //6 接口请求 log.info("===永安--报价接口开始请求==="); requestData.setRequestHead(requestHead); requestData.setRequestBody(requestBodyC2); String responseString = httpPost(mapper, requestData); responseDataC2 = mapper.readValue(responseString, ResponseDataC2.class); System.out.println(responseDataC2); // 6.1 替换成正确的车型重新 if (responseDataC2.getResponseHead().getAppMessage().contains("录入车型和平台返回车型")) { // 录入车型和平台返回车型(JLAAQD0032) String appMessage = responseDataC2.getResponseHead().getAppMessage(); int i = appMessage.indexOf("("); int i1 = appMessage.indexOf(")"); String substring = appMessage.substring(i + 1, i1); carModelReq.setModelCode(substring); responseDataC1 = getResponseDataC1(carModelReq); responseBody = responseDataC1.getResponseBody(); carModel = responseBody.getCarModel(); CarModelDTO carModelDTO1 = carModel.get(0); carDTO.setModelCode(carModelDTO1.getModelCode()); carDTO.setModelName(carModelDTO1.getModelName()); carDTO.setSeatCount(Integer.parseInt(carModelDTO1.getRatedPassengerCapacity())); carDTO.setPurchasePrice(Double.parseDouble(carModelDTO1.getReplacementValue())); requestBodyC2.setCars(carDTO); log.info(carModel.toString()); responseString = httpPost(mapper, requestData); responseDataC2 = mapper.readValue(responseString, ResponseDataC2.class); } if (!responseDataC2.getResponseHead().getStatus().equals("0")) { return HttpResult.error("永安--报价失败:" + responseDataC2.getResponseHead().getAppMessage()); } //7 生成返回 ResponseBodyC2 responseBodyC2 = responseDataC2.getResponseBody(); if (responseBodyC2.getReinsureFlag().equals("1")) { if (insOrder.getJqstartdate() != null && insOrder.getSystartdate() != null) { if (responseBodyC2.getSyStartDate() != null && responseBodyC2.getJqStartDate() == null) { throw new SystemException("交强重复投保,商业险起始时间" + responseBodyC2.getSyStartDate() + "---" + responseBodyC2.getSyEndDate()); } else if (responseBodyC2.getJqStartDate() != null && responseBodyC2.getSyStartDate() == null) { throw new SystemException("商业重复投保, 交强险起始时间" + responseBodyC2.getJqStartDate() + "---" + responseBodyC2.getJqEndDate()); } } httpResult.setCode(501); httpResult.setData(responseBodyC2); httpResult.setMsg("重复投保"); return httpResult; } QuoteRespVo quoteRespVo = getQuoteRespVo(insOrder, carDTO, responseBodyC2); httpResult.setData(quoteRespVo); httpResult.setMsg("成功"); //8 生成订单 response_order(insOrder, quoteRespVo, requestData, responseDataC2, jq_falg); } catch (SystemException e) { return HttpResult.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); return HttpResult.error("系统错误,请联系管理员"); } return httpResult; } /** * 3 核保 */ @Override public HttpResult audit(String orderno) { RequestData requestData = new RequestData(); RequestHead requestHead = getRequestHead("C3"); RequestBodyC3 requestBodyC3 = new RequestBodyC3(); ResponseDataC3 responseDataC3 = new ResponseDataC3(); ObjectMapper mapper = new XmlMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); try { InsOrder order = insOrderService.selectByPk(orderno); if (order == null) { return HttpResult.error("订单不存在"); } //1.组装RequestBody ResponseDataC2 responseDataC2 = JSONObject.parseObject(order.getReptxt().toJSONString(), ResponseDataC2.class); CustomerInfoVo insureinfo = JSONObject.parseObject(order.getInsureinfo().toJSONString(), CustomerInfoVo.class); requestBodyC3.setQuotationNoCI(responseDataC2.getResponseBody().getQuotationNoCI()); requestBodyC3.setQuotationNoBI(responseDataC2.getResponseBody().getQuotationNoBI()); DispatchDTO dispatchDTO = new DispatchDTO(); dispatchDTO.setShippingMethod("3"); requestBodyC3.setDispatch(dispatchDTO); DeviceItem[] devices = new DeviceItem[0];//新增设备信息 PaymentDTO payment = new PaymentDTO();//缴费信息 List privy = new ArrayList<>();//关系人信息 /*100001000010车主*/ PrivyDTO privyDTO = new PrivyDTO("0100", insureinfo.getName(), insureinfo.getIdentifyNumber()); privyDTO.setPhoneNo(insureinfo.getMobile()); privyDTO.setCresidaddr(insureinfo.getAddr()); privy.add(privyDTO); ExtendInfoDto[] extendInfo = new ExtendInfoDto[1];//扩展信息 ExtendInfoDto extendInfoDto1 = new ExtendInfoDto("imageNumber", "yx" + order.getOrderno());//影像单号传yx+orderno extendInfo[0] = extendInfoDto1; requestBodyC3.setDevices(devices); requestBodyC3.setPayment(payment); requestBodyC3.setPrivy(privy); requestBodyC3.setExtendInfo(extendInfo); //2 接口请求 log.info("===永安--核保接口开始请求==="); requestData.setRequestHead(requestHead); requestData.getRequestHead().setSeqNo(order.getOrderno());//支付后保单同步接口根据此号进行同步 requestData.setRequestBody(requestBodyC3); String responseString = httpPost(mapper, requestData); responseDataC3 = mapper.readValue(responseString, ResponseDataC3.class); System.out.println(responseDataC3); if (!responseDataC3.getResponseHead().getStatus().equals("0")) { return HttpResult.error("永安--提交核保失败:" + responseDataC3.getResponseHead().getAppMessage()); } else { ResponseBodyC3 responseBody = responseDataC3.getResponseBody(); String jqApplyno = responseBody.getProposalBZNo(); String syApplyno = responseBody.getProposalNo(); ExtendInfoDto[] extendInfo_res = responseBody.getExtendInfo(); String payUrl = ""; for (ExtendInfoDto extendInfoDto : extendInfo_res) { if (extendInfoDto.getKey().equals("payUrlApp")) { payUrl = extendInfoDto.getValue(); } } UnderwriteDTO[] underwriteInfo = responseBody.getUnderwriteInfo(); String jqunderwriteStatus = "3"; String syunderwriteStatus = "3"; String orderstatus = "4"; if (underwriteInfo != null && underwriteInfo.length > 0) { for (UnderwriteDTO underwriteDTO : underwriteInfo) { if ("CI".equals(underwriteDTO.getResultType())) { //1:下发修改,2:转人工,3:自核通过 jqunderwriteStatus = underwriteDTO.getUnderwriteStatus(); } else if ("BI".equals(underwriteDTO.getResultType())) { syunderwriteStatus = underwriteDTO.getUnderwriteStatus(); } } if (jqunderwriteStatus.equals("3") && syunderwriteStatus.equals("3")) { orderstatus = "5"; } } else { orderstatus = "5"; } order.setAuditid(order.getUserid()); order.setPaymenttype(payUrl); order.setOrderstatus(orderstatus); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); order.setSubmittime(sdf.format(new Date())); order.setJqapplyno(jqApplyno == null ? "" : jqApplyno); order.setSyapplyno(syApplyno == null ? "" : syApplyno); order.setJqappoint(""); //交强特别约定 order.setSyappoint(""); //商业特别约定 insOrderService.update(order); insTaskHistoryService.insertByOrderStatus(order); //插入轨迹表 if (orderstatus.equals("5")) { InsTaskHistory history = new InsTaskHistory(); history.setId(String.valueOf(new Date().getTime())); history.setCompany(order.getInscompany()); history.setTaskid(order.getOrderno()); history.setOperatorid(order.getUserid()); history.setOperator(order.getUsername()); history.setCreatetime(sdf.format(new Date())); history.setStatus("2"); history.setRemark("已核保"); insTaskHistoryService.insert(history); history.setId(String.valueOf(new Date().getTime() + 1000)); history.setCompany(order.getInscompany()); history.setTaskid(order.getOrderno()); history.setOperatorid(order.getUserid()); history.setOperator(order.getUsername()); history.setCreatetime(sdf.format(new Date())); history.setStatus(order.getOrderstatus()); history.setRemark("已核保待缴费"); insTaskHistoryService.insert(history); } else { InsTaskHistory history = new InsTaskHistory(); history.setId(String.valueOf(new Date().getTime())); history.setCompany(order.getInscompany()); history.setTaskid(order.getOrderno()); history.setOperatorid(order.getUserid()); history.setOperator(order.getUsername()); history.setCreatetime(sdf.format(new Date())); history.setStatus("4"); history.setRemark("核保不通过"); insTaskHistoryService.insert(history); } } log.info("===永安--核保成功==="); log.info("===永安--影像上传成功成功==="); } catch (SystemException e) { return HttpResult.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); log.error("===永安--核保报错:" + e.getMessage()); return HttpResult.error("系统错误,请联系管理员"); } return HttpResult.ok("提交成功"); } /** * 影像上传 * * @param record * @return */ public HttpResult UploadImage(@RequestBody InsTaskImage record) { try { if (record.getTaskid() == null || record.getTaskid().equalsIgnoreCase("")) { return HttpResult.error("任务号taskid不能为空"); } if (record.getImgtype() == null || record.getImgtype().equalsIgnoreCase("")) { return HttpResult.error("图片类型imgtype不能为空"); } if (record.getImgList() == null || record.getImgList().size() == 0) { return HttpResult.error("图片列表imgList不能为空"); } insTaskImageService.delete(record.getTaskid(), record.getImgtype()); RequestData requestData = new RequestData(); RequestHead requestHead = getRequestHead("B25"); RequestBodyB25 requestBodyB25 = new RequestBodyB25(); ResponseDataB25 responseDataB25 = new ResponseDataB25(); ObjectMapper mapper = new XmlMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); for (int i = 1; i <= record.getImgList().size(); i++) { String image = record.getImgList().get(i - 1); record.setId(IdGenerate.nextId()); record.setCreator(getUserName()); record.setCreatetime(new Date()); record.setImage(image); insTaskImageService.insert(record); //------------------永安影像上传---------------------- //1.组装RequestBody requestBodyB25.setBussNo("yx" + record.getTaskid()); requestBodyB25.setUserCode(userCode); requestBodyB25.setComCode(comCode); image = image.replace("data:image/jpeg;base64,", ""); requestBodyB25.setFile(image); String fileName = ""; //C01车辆影像,C02车主身份证,C03投保人身份证,C04被保人身份证,C05验车照 if (record.getImgtype() != null && record.getImgtype().equals("C01")) { fileName = "车辆影像" + i + ".jpg"; } else if (record.getImgtype() != null && record.getImgtype().equals("C02")) { fileName = "车主身份证" + i + ".jpg"; } else if (record.getImgtype() != null && record.getImgtype().equals("C03")) { fileName = "投保人身份证" + i + ".jpg"; } else if (record.getImgtype() != null && record.getImgtype().equals("C04")) { fileName = "被保人身份证" + i + ".jpg"; } else if (record.getImgtype() != null && record.getImgtype().equals("C05")) { fileName = "验车照" + i + ".jpg"; } requestBodyB25.setFileName(fileName); //2 接口请求 log.info("===永安--上传影像开始请求==="); requestData.setRequestHead(requestHead); requestData.setRequestBody(requestBodyB25); String responseString = httpPost(mapper, requestData); responseDataB25 = mapper.readValue(responseString, ResponseDataB25.class); if (!responseDataB25.getResponseHead().getStatus().equals("0")) { return HttpResult.error("永安--上传影像失败:" + responseDataB25.getResponseHead().getAppMessage()); } } } catch (Exception e) { e.printStackTrace(); log.error("===永安--上传影像报错:" + e.getMessage()); return HttpResult.error("系统错误,请联系管理员"); } return HttpResult.ok(); } /*public static void main(String[] args) { String base64str="/9j/4QCCRXhpZgAATU0AKgAAAAgABAEAAAMAAAABAyoAAAEBAAMAAAABBDgAAIdpAAQAAAABAAAAPgESAAMAAAABAAAAAAAAAAAAAZIIAAMAAAABAAAAAAAAAAAAAwEAAAMAAAABAyoAAAEBAAMAAAABBDgAAAESAAMAAAABAAAAAAAAAAD/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAIQAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAUDc8RjwyUEZBRlpVUF94yIJ4bm549a+5kcj////////////////////////////////////////////////////bAEMBVVpaeGl464KC6//////////////////////////////////////////////////////////////////////////AABEIBDgDKgMBIgACEQEDEQH/xAAYAAEBAQEBAAAAAAAAAAAAAAAAAQIDBP/EACwQAQEAAgIC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"; String savepath="D:\\new.jpg"; GenerateImage(base64str,savepath); } public static boolean GenerateImage(String base64str,String savepath) { //对字节数组字符串进行Base64解码并生成图片 if (base64str == null) //图像数据为空 return false; // System.out.println("开始解码"); BASE64Decoder decoder = new BASE64Decoder(); try { //Base64解码 byte[] b = decoder.decodeBuffer(base64str); System.out.println("解码完成"); for(int i=0;i extendInfoList = responseDataC2.getResponseBody().getExtendInfo(); Map maps = extendInfoList.stream().collect(LinkedHashMap::new, (m, v) -> m.put(v.getKey(), v.getValue()), LinkedHashMap::putAll); // Map maps = extendInfoList.stream().collect(Collectors.toMap(ExtendInfoDto::getKey, ExtendInfoDto::getValue, (key1, key2) -> key2)); requestBodyB7.setBzQueryNo(maps.get("querySequenceBZNo"));//交强 requestBodyB7.setQueryNo(maps.get("querySequenceNo")); DispatchDTO dispatchDTO = new DispatchDTO(); dispatchDTO.setShippingMethod("3"); requestBodyB7.setCityCode("140400"); List privy = new ArrayList<>();//关系人信息 CustomerInfoVo policyHolderInfo = JSONObject.parseObject(order.getApplyinfo().toJSONString(), CustomerInfoVo.class); PrivyDTO privyDTO = new PrivyDTO("1000", policyHolderInfo.getName(), policyHolderInfo.getIdentifyNumber()); privyDTO.setPhoneNo(policyHolderInfo.getMobile()); CustomerInfoVo insuredPersonInfo = JSONObject.parseObject(order.getInsureinfo().toJSONString(), CustomerInfoVo.class); PrivyDTO privyDTO2 = new PrivyDTO("0100", insuredPersonInfo.getName(), insuredPersonInfo.getIdentifyNumber()); privyDTO2.setPhoneNo(insuredPersonInfo.getMobile()); privy.add(privyDTO); privy.add(privyDTO2); ExtendInfoDto[] extendInfo = new ExtendInfoDto[1]; extendInfo[0] = new ExtendInfoDto("matchCode", matchCode); requestBodyB7.setExtendInfo(extendInfo); requestBodyB7.setPrivy(privy); //2 接口请求 log.info("===永安--获取短信验证码接口开始请求==="); requestData.setRequestHead(requestHead); requestData.setRequestBody(requestBodyB7); String responseString = httpPost(mapper, requestData); responseDataB7 = mapper.readValue(responseString, ResponseDataB7.class); System.out.println(responseDataB7); if (!responseDataB7.getResponseHead().getStatus().equals("0")) { return HttpResult.error("永安--获取短信验证码接口失败:" + responseDataB7.getResponseHead().getAppMessage()); } else { log.info("短信发送成功!"); httpResult.setMsg("短信发送成功!"); } } catch (SystemException e) { return HttpResult.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); return HttpResult.error("系统错误,请联系管理员"); } return httpResult; } /** * 5 获取支付url(提交短信验证码) */ @Override public HttpResult getPayUrl(String orderno, String verificationCode) { HttpResult httpResult = new HttpResult(); try { InsOrder order = insOrderService.selectByPk(orderno); if (order == null) { return HttpResult.error("订单不存在"); } RequestData requestData = new RequestData(); RequestHead requestHead = getRequestHead("B13"); RequestBodyB13 requestBodyB13 = new RequestBodyB13(); ResponseDataB13 responseDataB13 = new ResponseDataB13(); ObjectMapper mapper = new XmlMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //1.组装RequestBody requestBodyB13.setProposalNoCI(order.getJqapplyno()); requestBodyB13.setProposalNoBI(order.getSyapplyno()); requestBodyB13.setVerificationCode(verificationCode); //2 接口请求 log.info("===永安--提交短信验证码接口开始请求==="); requestData.setRequestHead(requestHead); requestData.setRequestBody(requestBodyB13); String responseString = httpPost(mapper, requestData); responseDataB13 = mapper.readValue(responseString, ResponseDataB13.class); log.info(responseDataB13.toString()); if (!responseDataB13.getResponseHead().getStatus().equals("0")) { return HttpResult.error("永安--提交短信验证码接口失败:" + responseDataB13.getResponseHead().getAppMessage()); } else { log.info("短信提交成功!"); } httpResult.setMsg(order.getPaymenttype()); } catch (SystemException e) { return HttpResult.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); return HttpResult.error("系统错误,请联系管理员"); } return httpResult; } @Autowired private InsAreaCompanyService insAreaCompanyService; @Autowired private InsOrdersService insOrdersService; /** * 5 保单信息同步 */ @Override public String updatePolicy(Map paramMap) { String orderNo = paramMap.get("orderNo"); String payAppNo = paramMap.get("payAppNo"); String payTime = paramMap.get("payTime"); String crstTxt = paramMap.get("crstTxt"); String crstMsg = paramMap.get("crstMsg"); String cplyNoBI = paramMap.get("cplyNoBI"); String cplyNoCI = paramMap.get("cplyNoCI"); if (StringUtils.isEmpty(orderNo) || StringUtils.isEmpty(cplyNoCI)) { log.error("orderNo/crstTxt 不能为空"); } if (crstTxt.equals("0")) {//0:生成保单成功; 1:生成保单失败 InsAreaCompany insAreaCompany = insAreaCompanyService.getById(orderNo); // InsOrder order = insOrderService.selectByPk(orderNo); if (insAreaCompany == null) { log.error("订单不存在,orderNo:" + orderNo); } if (StringUtils.isEmpty(cplyNoBI) && StringUtils.isEmpty(cplyNoCI)) { log.error("cplyNoBI/cplyNoCI 交强商业保单号同时为空"); } insAreaCompany.setJqpolicyno(StringUtils.isEmpty(cplyNoCI) ? "" : cplyNoCI); insAreaCompany.setSypolicyno(StringUtils.isEmpty(cplyNoBI) ? "" : cplyNoBI); insAreaCompany.setOrderstatus(InsOrderStatus.S_3.getCode());//已承保 // order.setPaytype(payAppNo); // order.setPaytime(payTime); // insOrderService.update(order); insAreaCompanyService.updateById(insAreaCompany); insOrdersService.updateByOrderStatus(insAreaCompany.getOrderno(), insAreaCompany.getOrderstatus()); } else { log.error("生成保单失败:crstTxt--" + crstTxt + "||crstMsg--" + crstMsg); } return "0"; } @Override public HttpResult getPolicyPrint(String orderno, String policytype, String flag) { HttpResult httpResult = new HttpResult(); try { InsOrder order = insOrderService.selectByPk(orderno); if (order == null) { return HttpResult.error("订单不存在"); } RequestData requestData = new RequestData(); RequestHead requestHead = getRequestHead("B21"); RequestBodyB21 requestBodyB21 = new RequestBodyB21(); ResponseDataB21 responseDataB21 = new ResponseDataB21(); ObjectMapper mapper = new XmlMapper(); mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); //1.组装RequestBody requestBodyB21.setDocumentType(flag); if ("jq".equals(policytype)) { requestBodyB21.setBusinessNo(order.getJqpolicyno()); } else if ("sy".equals(policytype)) { requestBodyB21.setBusinessNo(order.getSypolicyno()); } else { return HttpResult.error("policytype不能为空"); } //2 接口请求 log.info("===永安--获取电子保单接口开始请求==="); requestData.setRequestHead(requestHead); requestData.setRequestBody(requestBodyB21); String responseString = httpPost(mapper, requestData); responseDataB21 = mapper.readValue(responseString, ResponseDataB21.class); System.out.println(responseDataB21); ResponseBodyB21 responseBody21 = responseDataB21.getResponseBody(); if (!responseDataB21.getResponseHead().getStatus().equals("0")) { return HttpResult.error("永安--获取电子保单接口失败:" + responseDataB21.getResponseHead().getAppMessage()); } else { if (!responseBody21.getResultCode().equals("0")) { return HttpResult.error("永安--获取电子保单接口失败:" + responseBody21.getErrorMessage()); } } httpResult.setData(responseBody21.getInsurancePolicy()); } catch (SystemException e) { return HttpResult.error(e.getMessage()); } catch (Exception e) { e.printStackTrace(); return HttpResult.error("系统错误,请联系管理员"); } return httpResult; } private QuoteRespVo getQuoteRespVo(InsOrder insOrder, CarDTO carDTO, ResponseBodyC2 responseBodyC2) { double jqPremium = responseBodyC2.getCiPremium(); double syPremium = responseBodyC2.getBiPremium(); QuoteRespVo quoteRespVo = new QuoteRespVo(); List riskList1 = new ArrayList<>(); List kindList1 = new ArrayList<>(); if (jqPremium != 0) { QuoteRiskRespVo risk = new QuoteRiskRespVo(); risk.setRiskCode("0507"); risk.setRiskName("机动车交通事故责任强制保险"); risk.setPremium(jqPremium); risk.setStartDate(responseBodyC2.getJqStartDate()); risk.setEndDate(responseBodyC2.getJqEndDate()); riskList1.add(risk); } if (syPremium != 0) { QuoteRiskRespVo risk = new QuoteRiskRespVo(); risk = new QuoteRiskRespVo(); risk.setRiskCode("0510"); risk.setRiskName("机动车商业保险"); risk.setPremium(syPremium); risk.setStartDate(responseBodyC2.getSyStartDate()); risk.setEndDate(responseBodyC2.getSyEndDate()); riskList1.add(risk); } List kinds_res = responseBodyC2.getKinds(); for (int i = 0; i < kinds_res.size(); i++) { KindDTO kindDTO = kinds_res.get(i); String kindcode = kindDTO.getKindCode(); double premium = kindDTO.getPremium(); double amount = kindDTO.getAmount(); QuoteKindRespVo kind = null; if ("030006".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("A"); kind.setKindName("车辆损失保险"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } if ("030018".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("B"); kind.setKindName("第三者责任险"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } if ("030001".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("D3"); kind.setKindName("司机责任险"); kind.setAmount(amount); kind.setCoveragePremium(premium); kind.setUnitAmount(amount); kindList1.add(kind); } if ("030009".equals(kindcode)) { int seat = carDTO.getSeatCount() - 1; kind = new QuoteKindRespVo(); kind.setKindCode("D4"); kind.setKindName("乘客责任险"); kind.setUnitAmount(amount / seat); kind.setAmount(amount); kind.setCoveragePremium(premium); kind.setQuantity(String.valueOf(seat)); // kind.setUnitAmount(obj.getDouble("unitAmount")); kindList1.add(kind); } if ("033601".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("MJ1"); kind.setKindName("绝对免赔率特约险(车损)"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } if ("033602".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("MJ2"); kind.setKindName("绝对免赔率特约险(三者)"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } if ("033603".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("MJ3"); kind.setKindName("绝对免赔率特约险(司机)"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } if ("033604".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("MJ4"); kind.setKindName("绝对免赔率特约险(乘客)"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } if ("032601".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("L"); kind.setKindName("车身划痕损失险"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } if ("030078".equals(kindcode)) { kind = new QuoteKindRespVo(); kind.setKindCode("BD"); kind.setKindName("法定节假日限额翻倍险"); kind.setAmount(amount); kind.setCoveragePremium(premium); kindList1.add(kind); } } quoteRespVo.setRiskList(riskList1); quoteRespVo.setKindList(kindList1); quoteRespVo.setCiSumPermium(jqPremium + responseBodyC2.getSumTax());//交强险和车船税合计 quoteRespVo.setSumPermium(add(responseBodyC2.getSumPremium(), responseBodyC2.getSumTax()));//保费合计 quoteRespVo.setTaxAmount(responseBodyC2.getSumTax());//车船税 quoteRespVo.setTotalAdjustRate(1); quoteRespVo.setILogPreUdwMess("0");//评分 quoteRespVo.setOrderno(insOrder.getOrderno()); //订单号 List extendInfo = responseBodyC2.getExtendInfo(); // Map maps = extendInfo.stream().collect(Collectors.toMap(ExtendInfoDto::getKey,ExtendInfoDto::getValue , (key1, key2) -> key2)); Map maps = extendInfo.stream().collect(LinkedHashMap::new, (m, v) -> m.put(v.getKey(), v.getValue()), LinkedHashMap::putAll); String relationType = maps.get("relationType"); quoteRespVo.setIszdj("0"); if ("7".equals(relationType)) { quoteRespVo.setIszdj("1"); } return quoteRespVo; } protected InsOrder gene_order(YaQuoteInfoVo record) throws Exception { 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()))); SysUser user = sysUserService.getById(record.getUserId()); if (user == null) { throw new SystemException("userId不存在"); } if (StringUtils.isEmpty(record.getCarInfo().getFrameNo())) { throw new SystemException("车架号不能为空"); } // 关闭订单 不含当前报价号 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()); 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[]{"000006140400%", "%" + 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("永安财险"); insOrder.setCreatetime(sdfm.format(new Date())); return insOrder; } private HttpResult response_order(InsOrder insOrder, QuoteRespVo quoteRespVo, RequestData requestData, ResponseDataC2 responseDataC2, boolean jq_falg) { //保存订单信息 if (responseDataC2.getResponseHead().getStatus() != null && responseDataC2.getResponseHead().getStatus().equals("0")) { //报价成功更新险种信息 ResponseBodyC2 responseBody = responseDataC2.getResponseBody(); System.out.println("JSONObject.toJSONString(responseBody) ---" + JSONObject.toJSONString(responseBody)); System.out.println("JSONObject.toJSONString(responseBody.getKinds()) ---" + JSONObject.toJSONString(responseBody.getKinds())); insOrder.setKindinfo(JSONObject.parseArray(JSONObject.toJSONString(quoteRespVo.getKindList()))); insOrder.setRiskinfo(JSONObject.parseArray(JSONObject.toJSONString(quoteRespVo.getRiskList()))); insOrder.setJqpremium(jq_falg ? responseBody.getCiPremium() : 0); insOrder.setSypremium(responseBody.getBiPremium()); insOrder.setTaxamount(jq_falg ? responseBody.getCarTax().getSumPayment() : 0); // insOrder.setSumpremium(responseBody.getSumPremium()+insOrder.getTaxamount()); insOrder.setSumpremium(add(responseBody.getSumPremium(), insOrder.getTaxamount())); insOrder.setQuotestatus("1"); insOrder.setReqtxt(JSONObject.parseObject(JSONObject.toJSONString(requestData))); insOrder.setReptxt(JSONObject.parseObject(JSONObject.toJSONString(responseDataC2))); insOrder.setPolicytype(quoteRespVo.getIszdj()); insOrderService.insert(insOrder); //插入轨迹表 InsTaskHistory history = new InsTaskHistory(); history.setId(String.valueOf(new Date().getTime())); history.setCompany(insOrder.getInscompany()); history.setTaskid(insOrder.getOrderno()); history.setOperatorid(insOrder.getUserid()); history.setOperator(insOrder.getUsername()); SimpleDateFormat sdfm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); history.setCreatetime(sdfm.format(new Date())); history.setOperator(insOrder.getUsername()); history.setStatus("0"); history.setRemark("报价中"); insTaskHistoryService.insert(history); } else { return HttpResult.error(responseDataC2.getResponseHead().getAppMessage()); } return HttpResult.ok(); } /** * 分销费用统计 * * @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; } @Override public ResponseDataC1 getResponseDataC1(CarModel_Req carModelReq) throws Exception { ResponseDataC1 responseDataC1; ObjectMapper mapper = new XmlMapper(); RequestData requestData = new RequestData(); RequestHead requestHead = getRequestHead("C1"); RequestBodyC1 requestBody = new RequestBodyC1(); requestBody.setCityCode("140400"); requestBody.setCityName("长治市"); requestBody.setFrameNo(carModelReq.getFrameNo()); requestBody.setEnrollDate(carModelReq.getEnrollDate()); requestBody.setModelName(carModelReq.getModelName()); requestBody.setEngineNo(carModelReq.getEngineNo()); requestBody.setLicenseNo(carModelReq.getLicenseNo()); requestBody.setModelCode(carModelReq.getModelCode()); ExtendInfoDto[] extendInfo = new ExtendInfoDto[1]; extendInfo[0] = new ExtendInfoDto("matchCode", matchCode); requestBody.setExtendInfo(extendInfo); requestData.setRequestHead(requestHead); requestData.setRequestBody(requestBody); log.info("===永安--车型查询接口开始请求==="); String responseString = httpPost(mapper, requestData); responseDataC1 = mapper.readValue(responseString, ResponseDataC1.class); return responseDataC1; } private String httpPost(ObjectMapper mapper, RequestData requestData) throws Exception { //加签 String xmlString_sign = mapper.writeValueAsString(requestData); String consumerAccessKey = getConsumerAccessKey(xmlString_sign); //替换签名,请求接口 requestData.getRequestHead().setConsumerAccessKey(consumerAccessKey); String xmlString = mapper.writeValueAsString(requestData); return HttpXmlUtil.sendPost(url, xmlString); } private RequestHead getRequestHead(String type) { RequestHead requestHead = new RequestHead(); requestHead.setSeqNo(geneReqNo()); requestHead.setConsumerID(consumerID); requestHead.setConsumerAccessKey(consumerAccessKey_init); requestHead.setTransCode(type); requestHead.setRegionCode("D"); SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); requestHead.setTransTime(df.format(new Date())); return requestHead; } private void checkEmpty(YaQuoteInfoVo yaQuoteInfoVo) throws Exception { if (yaQuoteInfoVo.getCarInfo() == null) { throw new SystemException("carInfo不能为空!"); } if (yaQuoteInfoVo.getPolicyHolderInfo() == null || yaQuoteInfoVo.getInsuredPersonInfo() == null) { throw new SystemException("policyHolderInfo/insuredPersonInfo 不能为空!"); } 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不能为空!"); } } } } private KindDTO[] geneKindInfo(YaQuoteInfoVo yaQuoteInfoVo, CarDTO carDTO, boolean jq_falg) { List kindList = yaQuoteInfoVo.getKindList(); KindDTO[] kindList_n; if (jq_falg) { kindList_n = new KindDTO[kindList.size() + 1]; } else { kindList_n = new KindDTO[kindList.size()]; } //商业险险别 for (int j = 0; j < kindList.size(); j++) { KindInfoVo kindInfoVo = kindList.get(j); String deductibleRate = kindInfoVo.getDeductibleRate(); //第三者责任险 if (kindList.get(j).getKindCode().equals("B")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("030018"); kindInfo.setKindname("机动车第三者责任保险"); kindInfo.setAmount(kindList.get(j).getAmount()); kindList_n[j] = kindInfo; } //乘客责任险 if (kindList.get(j).getKindCode().equals("D4")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("030009"); kindInfo.setKindname("机动车车上人员责任保险(乘客)"); kindInfo.setQuantity(carDTO.getSeatCount() - 1); kindInfo.setAmount(kindList.get(j).getUnitAmount() * (carDTO.getSeatCount() - 1)); kindInfo.setUnitAmount(kindList.get(j).getUnitAmount()); kindList_n[j] = kindInfo; } //机动车损失险 if (kindList.get(j).getKindCode().equals("A")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("030006"); kindInfo.setKindname("机动车损失保险"); // kindInfo.setAmount(kindList.get(j).getAmount()); kindList_n[j] = kindInfo; } //司机责任险 if (kindList.get(j).getKindCode().equals("D3")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("030001"); kindInfo.setKindname("机动车车上人员责任保险(司机)"); kindInfo.setAmount(kindList.get(j).getAmount()); kindList_n[j] = kindInfo; } //附加绝对免赔率特约条款(车损) if (kindList.get(j).getKindCode().equals("MJ1")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("033601"); kindInfo.setKindname("附加绝对免赔率特约条款(机动车损失保险)"); kindInfo.setAmount(kindList.get(j).getAmount()); kindInfo.setDeductibleRatio(deductibleRate); kindList_n[j] = kindInfo; } //绝对免赔率特约险(三者) if (kindList.get(j).getKindCode().equals("MJ2")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("033602"); kindInfo.setKindname("附加绝对免赔率特约条款(机动车第三者责任保险)"); kindInfo.setAmount(kindList.get(j).getAmount()); kindInfo.setDeductibleRatio(deductibleRate); kindList_n[j] = kindInfo; } //绝对免赔率特约险(司机) if (kindList.get(j).getKindCode().equals("MJ3")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("033603"); kindInfo.setKindname("附加绝对免赔率特约条款(机动车车上人员责任保险(司机))"); kindInfo.setAmount(kindList.get(j).getAmount()); kindInfo.setDeductibleRatio(deductibleRate); kindList_n[j] = kindInfo; } //绝对免赔率特约险(乘客) if (kindList.get(j).getKindCode().equals("MJ4")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("033604"); kindInfo.setKindname("附加绝对免赔率特约条款(机动车车上人员责任保险(乘客))"); kindInfo.setAmount(kindList.get(j).getAmount()); kindInfo.setDeductibleRatio(deductibleRate); kindList_n[j] = kindInfo; } //车身划痕险 if (kindList.get(j).getKindCode().equals("L")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("032601"); kindInfo.setKindname("附加车身划痕损失险"); kindInfo.setAmount(kindList.get(j).getAmount()); kindList_n[j] = kindInfo; } //法定节假日限额翻倍险 if (kindList.get(j).getKindCode().equals("BD")) { KindDTO kindInfo = new KindDTO(); kindInfo.setKindCode("030078"); kindInfo.setKindname("附加法定节假日限额翻倍险"); kindInfo.setAmount(kindList.get(j).getAmount()); kindList_n[j] = kindInfo; } } //交强险险别 if (jq_falg) { KindDTO kindInfo_jq = new KindDTO(); kindInfo_jq.setKindCode("030000"); kindInfo_jq.setKindname("机动车交通事故责任强制保险"); kindList_n[kindList.size()] = kindInfo_jq; } return kindList_n; } public String getConsumerAccessKey(String xmlString) throws Exception { String consumerAccessKey = ""; xmlString = xmlString.substring(xmlString.lastIndexOf("") + 13, xmlString.lastIndexOf("")); consumerAccessKey = HMAC256Uitil.hmac256(xmlString, consumerAccessKey_init); return consumerAccessKey; } public String getConsumerAccessKey_url(String xmlString) { String responseString = HttpXmlUtil.sendPost(url_sign, xmlString); String consumerAccessKey = responseString.substring(responseString.lastIndexOf("") + 19, responseString.lastIndexOf("")); System.out.println("返回参数 consumerAccessKey====" + consumerAccessKey); return consumerAccessKey; } public String HMACSHA256(String data, String key) throws Exception { Mac sha256_HMAC = Mac.getInstance("HmacSHA256"); SecretKeySpec secret_key = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); sha256_HMAC.init(secret_key); byte[] array = sha256_HMAC.doFinal(data.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte item : array) { sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); } return sb.toString().toUpperCase(); } private String geneReqNo() { //中介机构id+UUID,每次请求需生成一个不重复的流水号,响应时原样返回 return UUID.randomUUID().toString().substring(0, 25); } public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2).doubleValue(); } public static String getUserName() { return ""; // String userName = null; // Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); // // if (principal instanceof UserDetails) { // userName = ((UserDetails) principal).getUsername(); // } else { // userName = principal.toString(); // } // return userName; } }