Explorar el Código

Merge remote-tracking branch 'origin/master'

wanghao hace 2 meses
padre
commit
a17a574fc2

+ 11 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/build/HuaTaiCrawlerQuoteResultsVoBuild.java

@@ -30,6 +30,8 @@ public class HuaTaiCrawlerQuoteResultsVoBuild {
         quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(quoteResponseData, quoteVo));
         // 商业险
         quoteResultsVo.setBiRiskInfoVo(buildBiRiskInfoVo(quoteResponseData, quoteVo));
+        // 商业险种的详细保费
+        quoteResultsVo.setKindInfoVo(quoteVo.getKindInfoVo());
         // 商业险险种信息
         if(quoteResponseData.getCoveragedtolist() !=  null) {
             List<HtCrawlerQuoteResponse.DataDTO.CoverageDTOList.CoverageDTO> coverageDTOList = quoteResponseData.getCoveragedtolist().getCoveragedto();
@@ -37,7 +39,7 @@ public class HuaTaiCrawlerQuoteResultsVoBuild {
             quoteResultsVo.setKindInfoVo(kindInfoVo);
         }
 
-        // 交强保费 车船税 商业保费
+        // 交强保费 车船税 商业保费  非车险费niPremium
         buildPremium(quoteResultsVo, quoteResponseData, niPremium);
         // 评分
         JSONArray scoreJson = new JSONArray();
@@ -130,6 +132,14 @@ public class HuaTaiCrawlerQuoteResultsVoBuild {
         quoteResultsVo.getCosts().setBiPremium(StringUtils.isBlank(getBiPremium(quoteResponseData)) ? "" : getBiPremium(quoteResponseData));
         // 设置非车险(驾意险)保费,报价返回数据中不存在
         quoteResultsVo.getCosts().setNiPremium(StringUtils.isBlank(niPremium) ? "" : niPremium);
+        // 计算总保费 = 交强险 + 商业险 + 驾意险 + 车船税
+        QuoteResultsVo.CostsVo costs = quoteResultsVo.getCosts();
+        double sumPremium = 0.0;
+        if (StringUtils.isNotBlank(costs.getCiPremium())) sumPremium += Double.parseDouble(costs.getCiPremium());
+        if (StringUtils.isNotBlank(costs.getBiPremium())) sumPremium += Double.parseDouble(costs.getBiPremium());
+        if (StringUtils.isNotBlank(costs.getNiPremium())) sumPremium += Double.parseDouble(costs.getNiPremium());
+        if (StringUtils.isNotBlank(costs.getVvTax())) sumPremium += Double.parseDouble(costs.getVvTax());
+        costs.setSumPremium(String.valueOf(sumPremium));
     }
 
     /**

+ 38 - 24
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java

@@ -110,6 +110,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     private static final Pattern LIMIT_AMOUNT = Pattern.compile("value=\"(.*?)\" id=\"js_actualvalue\"");
     private static final Pattern TRANSFER_FLAG = Pattern.compile("\"erroeType\":\"(.*?)\"");
     private static final Pattern PAT_END_DATE = Pattern.compile("终保日期\\s*([^;]+)");
+    private static final Pattern PAT_END_DATE2 = Pattern.compile("终保日期:\\s*([^;]+)");
     private static final Pattern RESPONSE_ERR = Pattern.compile("(\"infoName\"\\s*:\\s*\"([^\"]*)\",\\s*\"infomsg\"\\s*:\\s*\"([^\"]*)\"|\"erroeInfo\"\\s*:\\s*\"([^\"]*)\")",Pattern.DOTALL);
 
     private static final Set<String> SPECIAL_USERS = Set.of(
@@ -250,7 +251,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         //带重试的获取报价编号、车型型号
         Map<String, Object> xbResult = retry(() -> {
             try { return xbQuery(dto.getUsername(), cookie, car); }
-            catch (Exception e) { refreshLogin(dto); throw new SystemException(e.getMessage()); }
+            catch (Exception e) { refreshLogin(dto); throw new Exception(e); }
         }, MAX_RETRIES, RETRY_DELAY_MS, "预报价获取登录信息");
 
         String quotationNo = str(xbResult, "quotationNo");
@@ -631,14 +632,14 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
 
     private HtCrawlerQuoteResponse.DataDTO resolveQuoteResponse(DuplQuoteResult duplQuoteResult, String decryptData, String mealid, String limitAmount,
                                                                 HttpHeaders h, String personalInsuredJSON) {
+        log.info("报价结果: {}", decryptData);
         log.info("报价结果: {}", convertResponseMsg(decryptData));
         if (decryptData.contains("未传送车辆过户标志")) {
             log.error("报价失败: {}", convertResponseMsg(decryptData));
             throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData)+(decryptData.contains("1251BI") ? ",请勾选'商业险是否过户'选项" : ""));
         }
-        if (!decryptData.contains("录入的校验码有误") && decryptData.contains("erroeInfo") && !duplQuoteResult.dupl()) {
-            log.error("报价失败: {}", convertResponseMsg(decryptData));
-            throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData));
+        if (decryptData.contains("errrorFlag") && decryptData.contains("carChange")) {
+            throw new SystemException(decryptData);
         }
         //车损险保额过高  limitAmount
         if (decryptData.contains("车损险保额不能高于")) {
@@ -648,20 +649,13 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
             decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount, "", personalInsuredJSON), h);
             return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
         }
-        if (decryptData.contains("传送了车辆过户标志,请确认")) {
-            Pattern pattern = Pattern.compile(TRANSFER_FLAG.pattern());
-            Matcher matcher = pattern.matcher(decryptData);
-            String transferFlag =  "";
-            if (matcher.find()) transferFlag = matcher.group(1);
-            decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount+","+transferFlag, "", personalInsuredJSON), h);
-            return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
-        }
         if (decryptData.contains("TRANS_MESSAGE") && decryptData.contains("终保日期")) {
             Map<String, String> map = JSONObject.parseObject(decryptData, Map.class);
             if (map.containsKey("TRANS_MESSAGE") && map.get("TRANS_MESSAGE").contains("交强")) {
-                Matcher m = PAT_END_DATE.matcher(decryptData);
-                if (!m.find()) {
+                Matcher m = PAT_END_DATE2.matcher(decryptData);
+                if (m.find()) {
                     String jiaoqiang_startDate = m.group(1);
+                    log.info("报价响应结果CI,终保日期{}", jiaoqiang_startDate);
                     duplQuoteResult.q().getCiRiskInfoVo().setStartDate(jiaoqiang_startDate + ":00");
                     LocalDateTime dt = LocalDateTime.parse(jiaoqiang_startDate.replace(" ", "T"), DateTimeFormatter.ofPattern(DATE_FMT_T));
                     String newEnd = dt.plusYears(1).format(DateTimeFormatter.ofPattern(DATE_FMT));
@@ -671,20 +665,36 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
                 }
             }
             if (map.containsKey("TRANS_MESSAGE") && map.get("TRANS_MESSAGE").contains("商业")) {
-                Matcher m = PAT_END_DATE.matcher(decryptData);
-                if (!m.find()) {
+                Matcher m = PAT_END_DATE2.matcher(decryptData);
+                if (m.find()) {
                     String chesun_startDate = m.group(1);
+                    log.info("报价响应结果BI,终保日期{}", chesun_startDate);
                     duplQuoteResult.q().getBiRiskInfoVo().setStartDate(chesun_startDate);
+                    duplQuoteResult.q().getCiRiskInfoVo().setStartDate(chesun_startDate);
                     LocalDateTime dt = LocalDateTime.parse(chesun_startDate.replace(" ", "T"), DateTimeFormatter.ofPattern(DATE_FMT_T));
                     String newEnd = dt.plusYears(1).format(DateTimeFormatter.ofPattern(DATE_FMT));
                     duplQuoteResult.q().getBiRiskInfoVo().setEndDate(newEnd);
+                    duplQuoteResult.q().getCiRiskInfoVo().setEndDate(newEnd);
                     decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount, "", personalInsuredJSON), h);
                     return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
                 }
             }
         }
-        if (decryptData.contains("errrorFlag") && decryptData.contains("carChange")) {
-            throw new SystemException(decryptData);
+        if (decryptData.contains("传送了车辆过户标志,请确认")) {
+            //HtCrawlerQuoteResponse.DataDTO dataDTO = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
+            //List<HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO> basePartDTO =
+            //        dataDTO.getBasepartdtolist() != null ? dataDTO.getBasepartdtolist().getBasepartdto() : null;
+            //String basePartJSON = buildBasePartJSON(basePartDTO==null?new ArrayList<>():basePartDTO);
+            Pattern pattern = Pattern.compile(TRANSFER_FLAG.pattern());
+            Matcher matcher = pattern.matcher(decryptData);
+            String transferFlag =  "";
+            if (matcher.find()) transferFlag = matcher.group(1);
+            decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount+","+transferFlag, "", personalInsuredJSON), h);
+            return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
+        }
+        if (!decryptData.contains("录入的校验码有误") && decryptData.contains("erroeInfo") && !duplQuoteResult.dupl()) {
+            log.error("报价失败: {}", convertResponseMsg(decryptData));
+            throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData));
         }
         HtCrawlerQuoteResponse.DataDTO data = null;
         data = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
@@ -782,23 +792,27 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         vo.getOrder().setQuoteNo(order.getQuotationRelaNo());
 
         HtCrawlerSubmitRequest submit = new HtCrawlerSubmitRequest(vo, params, order.getCiCategory(), order.getBiCategory());
+        log.info("提交核保参数: {}", JSONObject.toJSONString(submit));
         String res = req.submit2(submit, req.getHeaders());
         log.info("提交核保结果: {}", res);
 
+        if(res.contains("<html>")) throw new SystemException("核保失败, 服务器繁忙, 请稍后重试");
+
+        if (res.contains("起保时间不正确")) {
+            throw new SystemException("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
+        }
+
         Map<String, Object> map = new HashMap<>();
         try {
             map = MAPPER.readValue(res, Map.class);
         } catch (JsonProcessingException e) {
-            throw new SystemException("核保失败,未知异常, {}", convertResponseMsg(res));
+            throw new SystemException("核保失败, {}", convertResponseMsg(res));
         }
 
-        if (!"1,2,3,4".contains(order.getCiCategory()) || "Y".equals(str(map, "isOver"))
-                || "重新计算保费".equals(str(map, "MSG")) || res.contains("下发修改意见") || res.contains("转人工意见")) {
+        if (!"1,2,3,4".contains(order.getCiCategory()) || "Y".equals(str(map, "isOver")) || "Y".equals(str(map, "isOver1"))
+                || "重新计算保费".equals(str(map, "MSG")) || (res.contains("下发修改意见") && !res.contains("isPassHB")) || res.contains("转人工意见")) {
             throw new SystemException("核保失败-------" + convertResponseMsg(res));
         }
-        if (res.contains("起保时间不正确")) {
-            throw new SystemException("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
-        }
         if (res.contains("转人工")) return handleManualUnderwriting(order, params);
         if (res.contains("已通过核保未实收") || "Y".equals(str(map, "isPassHB"))) return handlePassedUnderwriting(order, params, vo);