Просмотр исходного кода

中煤添加出险次数 不浮动原因 交强商业折扣

Qchen 3 месяцев назад
Родитель
Сommit
8de3526a62

+ 96 - 2
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/build/ZmCrawlerQuoteResultVoBuild.java

@@ -8,6 +8,7 @@ import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.zhongmei.crawler.constant.enums.ZmCrawlerFloatFlag;
 import com.jzg.quotation.zhongmei.crawler.entity.Response.ZmCrawlerQuotedPriceResponse;
 
 import java.math.BigDecimal;
@@ -142,14 +143,107 @@ public final class ZmCrawlerQuoteResultVoBuild {
                         .filter(Objects::nonNull)
                         .findFirst()
                         .orElse(null);
+        ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO.ContractMainDTO contractMainJq =
+                Optional.ofNullable(quotedPriceResponse)
+                        .map(ZmCrawlerQuotedPriceResponse::getBussinessMain)
+                        .map(ZmCrawlerQuotedPriceResponse.BussinessMainDTO::getContract)
+                        .orElse(Collections.emptyList())
+                        .stream()
+                        .filter(Objects::nonNull)
+                        .map(ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO::getContractMain)
+                        .filter(Objects::nonNull)
+                        .filter(contractMain -> contractMain.getRiskCode().equals("0330"))
+                        .findFirst()
+                        .orElse(null);
+
+        ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO.ContractMainDTO contractMainSy =
+                Optional.ofNullable(quotedPriceResponse)
+                        .map(ZmCrawlerQuotedPriceResponse::getBussinessMain)
+                        .map(ZmCrawlerQuotedPriceResponse.BussinessMainDTO::getContract)
+                        .orElse(Collections.emptyList())
+                        .stream()
+                        .filter(Objects::nonNull)
+                        .map(ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO::getContractMain)
+                        .filter(Objects::nonNull)
+                        .filter(contractMain -> contractMain.getRiskCode().equals("0361"))
+                        .findFirst()
+                        .orElse(null);
+        ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO contractDTO =
+                Optional.ofNullable(quotedPriceResponse)
+                        .map(ZmCrawlerQuotedPriceResponse::getBussinessMain)
+                        .map(ZmCrawlerQuotedPriceResponse.BussinessMainDTO::getContract)
+                        .orElse(List.of())
+                        .stream()
+                        .filter(c -> c != null && c.getContractMain() != null
+                                && "0365".equals(c.getContractMain().getRiskCode()))
+                        .findFirst()
+                        .orElse(null);
+        JSONArray scoreJson = new JSONArray();
+        if (contractDTO != null) {
+            String noAjustReasonCode = null;
+            List<ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO.AdjustDTO> adjustList = contractDTO.getAdjust();
+            if (adjustList != null && !adjustList.isEmpty()) {
+                // 遍历所有adjust,找到存在 noAjustReasonCode 的值
+                noAjustReasonCode = adjustList.stream()
+                        .filter(Objects::nonNull)
+                        .map(ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO.AdjustDTO::getNoAjustReasonCode)
+                        .filter(Objects::nonNull)
+                        .findFirst()
+                        .orElse("");
+                scoreJson.add(new JSONObject()
+                        .fluentPut("scoreName", "商业不浮动原因")
+                        .fluentPut("scoreKey","SyRateFloatFlag")
+                        .fluentPut("score", ZmCrawlerFloatFlag.getNoAdjustReasonDesc(noAjustReasonCode)));
+            }
+        }
+
         if (apQtnResultXom.getGusunlightresultmainDto() != null) {
-            JSONArray scoreJson = new JSONArray();
             scoreJson.add(new JSONObject()
                     .fluentPut("scoreName", "中煤分")
                     .fluentPut("scoreKey","zmScore")
                     .fluentPut("score", apQtnResultXom.getGusunlightresultmainDto().getZmScore()));
         }
+        if (quotedPriceResponse != null) {
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "交强出险次数")
+                    .fluentPut("scoreKey","bzDemandPayCount")
+                    .fluentPut("score", quotedPriceResponse.getBussinessMain().getBzDemandPayCount()));
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "商业出险次数")
+                    .fluentPut("scoreKey","busDemandPayCount")
+                    .fluentPut("score", quotedPriceResponse.getBussinessMain().getBusDemandPayCount()));
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "合并出险次数")
+                    .fluentPut("scoreKey","sumDemandPayCount")
+                    .fluentPut("score", quotedPriceResponse.getBussinessMain().getSumDemandPayCount()));
+        }
+
+        if (contractMainJq != null) {
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "交强整单折扣")
+                    .fluentPut("scoreKey","totalAdjustRateJq")
+                    .fluentPut("score", contractMainJq.getTotalAdjustRate()));
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "交强不浮动原因")
+                    .fluentPut("scoreKey","JqRateFloatFlag")
+                    .fluentPut("score", ZmCrawlerFloatFlag.getJqRateFloatDesc(contractMainJq.getRateFloatFlag())));
+
+        }
+        if (contractMainSy != null) {
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "商业整单折扣")
+                    .fluentPut("scoreKey","totalAdjustRateSy")
+                    .fluentPut("score", contractMainSy.getTotalAdjustRate()));
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "上年承保公司")
+                    .fluentPut("scoreKey","attribute2")
+                    .fluentPut("score", contractMainSy.getAttribute2()));
+            scoreJson.add(new JSONObject()
+                    .fluentPut("scoreName", "上年承保险别")
+                    .fluentPut("scoreKey","repeatInfo")
+                    .fluentPut("score", contractMainSy.getRepeatInfo()));
+        }
+        scoreVo.setScoreJson(scoreJson);
         return scoreVo;
     }
-
 }

+ 66 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/constant/enums/ZmCrawlerFloatFlag.java

@@ -0,0 +1,66 @@
+package com.jzg.quotation.zhongmei.crawler.constant.enums;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author quchen
+ * @date 2026/6/17 17:16
+ */
+
+public class ZmCrawlerFloatFlag {
+    // 交强险rateFloatFlag 不浮动原因编码映射
+    private static final Map<String, String> JQ_RATE_FLOAT_FLAG_MAP = new HashMap<>();
+    // noAjustReasonCode 不浮动原因编码映射
+    private static final Map<String, String> NO_ADJUST_REASON_CODE_MAP = new HashMap<>();
+
+    static {
+        // 初始化 jqrateFloatFlagList
+        JQ_RATE_FLOAT_FLAG_MAP.put("0", "费率浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("01", "新车,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("02", "首次投保,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("03", "车辆所有权转移,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("04", "临时上道或临时入境,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("05", "为摩托车、拖拉机、变拖类、低速载货汽车、三轮汽车,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("06", "未如实告知平台车辆信息,无法确定浮动比率,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("07", "非重复投保退保的保单续保,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("08", "短期保单续保不下浮");
+        JQ_RATE_FLOAT_FLAG_MAP.put("09", "短期单投保不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("10", "脱保,不下浮");
+        JQ_RATE_FLOAT_FLAG_MAP.put("99", "不在浮动时间范围内,不浮动");
+
+        // 初始化 synoAjustReasonCodeList
+        NO_ADJUST_REASON_CODE_MAP.put("01", "过户车,不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("02", "脱保6个月以上,不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("03", "本次投保为短期单,不下浮");
+        NO_ADJUST_REASON_CODE_MAP.put("04", "没有上年度保单,不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("05", "上张保单为短期单,不下浮");
+        NO_ADJUST_REASON_CODE_MAP.put("06", "上张保单做过批改过户,不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("07", "上年和本年不在同一公司投保,不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("08", "脱保3个月至6个月(含),不下浮");
+        NO_ADJUST_REASON_CODE_MAP.put("09", "车贷投保多年,不下浮");
+        NO_ADJUST_REASON_CODE_MAP.put("10", "对历史保单(上平台前的保单)的批改,不重新计算系数风险");
+        NO_ADJUST_REASON_CODE_MAP.put("11", "新车,不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("12", "上年没有出险,赔款金额系数不浮动");
+    }
+
+    /**
+     * 根据rateFloatFlag获取中文描述
+     */
+    public static String getJqRateFloatDesc(String code) {
+        if (code == null || code.isBlank()) {
+            return "";
+        }
+        return JQ_RATE_FLOAT_FLAG_MAP.getOrDefault(code, "未知编码:" + code);
+    }
+
+    /**
+     * 根据noAjustReasonCode获取中文描述
+     */
+    public static String getNoAdjustReasonDesc(String code) {
+        if (code == null || code.isBlank()) {
+            return "";
+        }
+        return NO_ADJUST_REASON_CODE_MAP.getOrDefault(code, "未知编码:" + code);
+    }
+}

+ 3 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Request/ZmCrawlerQuotedPriceRequest.java

@@ -179,7 +179,9 @@ public class ZmCrawlerQuotedPriceRequest extends BaseRequest {
                 coverageDTO.setNotDeductibleFlag(true);
                 coverageDTO.setProjectCode("0");
                 coverageDTO.setAmount(kindInfoVo.getAmount());
-                coverageDTO.setUnitAmount(Integer.parseInt(kindInfoVo.getUnitAmount()));
+                Optional.ofNullable(kindInfoVo.getUnitAmount())
+                        .map(Integer::parseInt)
+                        .ifPresentOrElse(coverageDTO::setUnitAmount, () -> coverageDTO.setUnitAmount(0));
                 coverageDTO.setQuantity(Objects.isNull(kindInfoVo.getQuantity()) ? 0 : Integer.parseInt(kindInfoVo.getQuantity()));
                 Integer seatCount = Integer.parseInt(quoteVo.getCarInfoVo().getSeatCount());
                 if (kindInfoVo.getKindCode().equals("01")) {

+ 8 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/entity/Response/ZmCrawlerQuotedPriceResponse.java

@@ -768,6 +768,9 @@ public class ZmCrawlerQuotedPriceResponse extends BaseResponse {
                 @JsonProperty("minRate")
                 private Integer minRate;
 
+                @JsonProperty("noAjustReasonCode")
+                private String noAjustReasonCode;
+
                 @JsonProperty("oriRate")
                 private Integer oriRate;
 
@@ -852,6 +855,9 @@ public class ZmCrawlerQuotedPriceResponse extends BaseResponse {
                 @JsonProperty("amount")
                 private Integer amount;
 
+                @JsonProperty("attribute2")
+                private String attribute2;
+
                 @JsonProperty("argueSolution")
                 private String argueSolution;
 
@@ -912,6 +918,8 @@ public class ZmCrawlerQuotedPriceResponse extends BaseResponse {
                 @JsonProperty("productionDate")
                 private String productionDate;
 
+                @JsonProperty("rateFloatFlag")
+                private String rateFloatFlag;
                 /**
                  * 即时起保
                  * 1-是,0-否

+ 1 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

@@ -207,7 +207,7 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
                             .orElse(null);
             if (contract != null) {
                 ZmCrawlerQuotedPriceResponse.BussinessMainDTO.ContractDTO.PlantFormMessageBeanDTO messageBeanDTO = contract.getPlantFormMessageBean();
-                if (messageBeanDTO.getAnswer().contains("可能存在重复投保")) {
+                if (messageBeanDTO.getAnswer() != null && messageBeanDTO.getAnswer().contains("可能存在重复投保")) {
                     String answer = messageBeanDTO.getAnswer();
                     String startTime = extractDuplicateStartTime(answer);
                     String endTime = calculateEndTime(startTime);