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

Merge remote-tracking branch 'origin/dev_jzg_lipf_v20260518' into dev_jzg_lipf_v20260518

jiakai 3 месяцев назад
Родитель
Сommit
1a6ff44d98
32 измененных файлов с 371 добавлено и 325 удалено
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/SysRelationPerson.java
  2. 1 1
      commons/src/main/java/com/jzg/commons/entity/quote/vo/KindInfoVo.java
  3. 0 4
      commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRights.java
  4. 0 3
      commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRightsPackage.java
  5. 2 2
      commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsPackageVo.java
  6. 2 2
      commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsVo.java
  7. 2 2
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/component/HtCrawlerRequestComponent.java
  8. 63 89
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/service/Impl/HuaTaiCrawlerRequestImpl.java
  9. 4 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  10. 14 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java
  11. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrderRightsPackageServiceImpl.java
  12. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrderRightsServiceImpl.java
  13. 2 2
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrderRightsMapper.xml
  14. 2 2
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrderRightsPackageMapper.xml
  15. 3 0
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml
  16. 1 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java
  17. 1 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/PreciseInitResult.java
  18. 4 4
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCiKindsVo.java
  19. 2 2
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCommonPlanInfo.java
  20. 4 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKFlag.java
  21. 2 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKOther.java
  22. 2 3
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java
  23. 131 133
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java
  24. 71 30
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java
  25. 6 3
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerSaveQuoteInfoRequestBuild.java
  26. 2 1
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerRequestComponent.java
  27. 1 1
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/ZiJinCrawlerConfigureParameters.java
  28. 9 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerSaveQuoteInfoRequest.java
  29. 3 1
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/ZiJinCrawlerOrderService.java
  30. 4 5
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerOrderServiceImpl.java
  31. 26 28
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java
  32. 2 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgAppServiceImpl.java

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/po/SysRelationPerson.java

@@ -39,4 +39,7 @@ public class SysRelationPerson extends BaseModel {
     @Schema(description = "推荐类型(0:合伙人  1:机构负责人 )")
     private Integer type;
 
+    @Schema(description = "租户代码")
+    private String systemCode;
+
 }

+ 1 - 1
commons/src/main/java/com/jzg/commons/entity/quote/vo/KindInfoVo.java

@@ -95,7 +95,7 @@ public class KindInfoVo implements Serializable {
 
     private List<OptionsDTO> options;
 
-    public KindInfoVo(String number, String number1, String number2, String number3, String number4, String number5, String number6, String number7, String number8, String number9,String number10) {
+    public KindInfoVo(String number, String number1, String number2, String number3, String number4, String number5, String number6, Integer number7, String number8, String number9,String number10) {
     }
 
     public KindInfoVo(String number, String number1, String number2, String number3, String number4, String number5, String number6, String number7, String number8, String number9) {

+ 0 - 4
commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRights.java

@@ -78,10 +78,6 @@ public class InsOrderRights {
     /**服务说明*/
     @Schema(description = "服务说明")
     private String description;
-
-    /**是否删除(0,:否 1:是)*/
-    @Schema(description = "是否删除(0,:否 1:是)")
-    private Integer delFlag;
     /**创建者*/
     @Schema(description = "创建者")
     private String createBy;

+ 0 - 3
commons/src/main/java/com/jzg/commons/entity/rights/po/InsOrderRightsPackage.java

@@ -60,9 +60,6 @@ public class InsOrderRightsPackage {
     /**行业id*/
     @Schema(description = "行业id")
     private String industryId;
-    /**是否删除(0,:否 1:是)*/
-    @Schema(description = "是否删除(0,:否 1:是)")
-    private Integer delFlag;
     /**创建者*/
     @Schema(description = "创建者")
     private String createBy;

+ 2 - 2
commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsPackageVo.java

@@ -61,7 +61,7 @@ public class InsOrderRightsPackageVo {
     private String industryId;
     /**是否删除(0,:否 1:是)*/
     @Schema(description = "是否删除(0,:否 1:是)")
-    private Integer delFlag;
+    private Integer isDelete;
     /**创建者*/
     @Schema(description = "创建者")
     private String createBy;
@@ -144,7 +144,7 @@ public class InsOrderRightsPackageVo {
 
             this.packagePrice = rightsPackage.getPackagePrice();
             this.industryId = rightsPackage.getIndustryId();
-            this.delFlag = rightsPackage.getDelFlag();
+            this.isDelete = rightsPackage.getIsDelete();
             this.createBy = rightsPackage.getCreateBy();
             this.createTime = rightsPackage.getCreateTime();
             this.updateBy = rightsPackage.getUpdateBy();

+ 2 - 2
commons/src/main/java/com/jzg/commons/entity/rights/vo/InsOrderRightsVo.java

@@ -78,7 +78,7 @@ public class InsOrderRightsVo {
 
     /**是否删除(0,:否 1:是)*/
     @Schema(description = "是否删除(0,:否 1:是)")
-    private Integer delFlag;
+    private Integer isDelete;
     /**创建者*/
     @Schema(description = "创建者")
     private String createBy;
@@ -139,7 +139,6 @@ public class InsOrderRightsVo {
         this.contractRate = rights.getContractRate();
         this.settlePrice = rights.getSettlePrice();
         this.description = rights.getDescription();
-        this.delFlag = rights.getDelFlag();
         this.createBy = rights.getCreateBy();
         this.createTime = rights.getCreateTime();
         this.updateBy = rights.getUpdateBy();
@@ -150,6 +149,7 @@ public class InsOrderRightsVo {
         this.receiverType = rights.getReceiverType();
         this.receiverName = rights.getReceiverName();
         this.receiverMobile = rights.getReceiverMobile();
+        this.isDelete = rights.getIsDelete();
         //该订单下该权益券总价
         BigDecimal price = rights.getAmount();
         Integer count = rights.getRightsCount();

+ 2 - 2
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/component/HtCrawlerRequestComponent.java

@@ -152,7 +152,7 @@ public class HtCrawlerRequestComponent {
      * @param headers
      * @return
      */
-    public HtCrawlerCarQueryResponse.DataDTO carQuery(HtCrawlerCarQueryRequest htCrawlerCarQueryRequest, HttpHeaders headers, CarInfoVo carInfoVo) throws Exception {
+    public HtCrawlerCarQueryResponse.DataDTO carQuery(HtCrawlerCarQueryRequest htCrawlerCarQueryRequest, HttpHeaders headers, CarInfoVo carInfoVo) {
         List<String> cookie = headers.get("Cookie");
         log.info("huatai_cookie:{}", cookie);
         ResponseEntity<HtCrawlerCarQueryResponse> carQueryResponseEntity = requestComponent.objectPostWithProxy(RequestUrl.CAR_QUERY.getRequestUrl(huaTaiCrawlerProperties.getBaseUrl()), htCrawlerCarQueryRequest, HtCrawlerCarQueryResponse.class, headers, proxyHostName, proxyPort);
@@ -182,7 +182,7 @@ public class HtCrawlerRequestComponent {
      * @return
      * @throws Exception
      */
-    public String quote(HtCrawlerQuoteRequest htCrawlerQuoteRequest, HttpHeaders headers) throws Exception {
+    public String quote(HtCrawlerQuoteRequest htCrawlerQuoteRequest, HttpHeaders headers) {
         headers.remove("Referer");
         headers.add("Referer", "https://cspxp.pc.ehuatai.com/htcsp/VehicleInfoEntryAction.do?cmd=saveOneStept");
         ResponseEntity<HtCrawlerQuoteResponse> responseEntity = requestComponent.objectPostWithProxy(RequestUrl.QUOTE_PRICE.getRequestUrl(huaTaiCrawlerProperties.getBaseUrl()), htCrawlerQuoteRequest, HtCrawlerQuoteResponse.class, headers, proxyHostName, proxyPort);

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

@@ -107,6 +107,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     private static final Pattern PAT_MEAL_ID = Pattern.compile("\"mealid\":\"(.*?)\"");
     private static final Pattern LIMIT_AMOUNT = Pattern.compile("value=\"(.*?)\" id=\"js_actualvalue\"");
     private static final Pattern PAT_END_DATE = 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(
             "EA27000180", "EA27000401", "EA27000098", "EA27000076",
@@ -167,22 +168,6 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         return req.authenticate(dto, HtRequestConstant.REQUEST_NUMBER);
     }
 
-    // ====================== 重试工具 ======================
-    @FunctionalInterface
-    public interface RetryableTask<T> { T execute() throws Exception; }
-
-    private <T> T retry(RetryableTask<T> task, int max, long delay, String name) {
-        for (int i = 0; i < max; i++) {
-            try { return task.execute(); }
-            catch (Exception e) {
-                log.warn("{} 失败,第 {} 次重试", name, i + 1);
-                if (i + 1 >= max) throw new SystemException(name + " 失败,已重试 " + max + " 次", e.getMessage());
-                sleep(delay);
-            }
-        }
-        throw new SystemException(name + " 失败,已达到最大重试次数");
-    }
-
     private void sleep(long ms) {
         try { Thread.sleep(ms); }
         catch (InterruptedException ie) { Thread.currentThread().interrupt(); throw new RuntimeException("重试被中断", ie); }
@@ -215,7 +200,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
 
         Map<String, Object> res = decrypt(MAPPER.readValue(
                 post(props.getBaseUrl() + "/htcsp/VehicleInfoEntryAction.do?cmd=xbquery", buildJsonHeaders(cookie), postData),
-                HashMap.class));
+                Map.class));
         log.info("xbQuery result: {}", JSONObject.toJSONString(res));
 
         Map<String, Object> carmodel = (Map<String, Object>) res.get("carmodeldtojson");
@@ -262,17 +247,16 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         //带重试的获取报价编号、车型型号
         Map<String, Object> xbResult = retry(() -> {
             try { return xbQuery(dto.getUsername(), cookie, car); }
-            catch (Exception e) { refreshLogin(dto); throw e; }
+            catch (Exception e) { refreshLogin(dto); throw new SystemException(e.getMessage()); }
         }, MAX_RETRIES, RETRY_DELAY_MS, "预报价获取登录信息");
 
         String quotationNo = str(xbResult, "quotationNo");
         String modelcodexh = str(xbResult, "modelcodexh");
         //报价前预处理-保存车辆信息、过滤车型等处理
         PreResult pre = prepareQuote(attr, mmap, car, modelcodexh, cookie, quotationNo);
-        //带重试的报价
-        CoreResult core = executeQuoteWithRetry(quoteVo, quotationNo, dto, cookie, pre, gsInfo, attr);
-
-        if (!core.success()) throw new RuntimeException("报价失败,已达到最大重试次数");
+        //报价
+        CoreResult core = executeQuote(quoteVo, quotationNo, dto, cookie, pre, gsInfo, attr);
+        if (!core.success()) throw new SystemException("报价失败");
         //保存订单到MongoDB
         saveOrder(quoteVo, core);
         //组装费用
@@ -400,41 +384,23 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     }
 
     // ====================== 报价核心 ======================
-    private CoreResult executeQuoteWithRetry(QuoteVo quoteVo, String quotationNo, LoginDTO dto,
+    private CoreResult executeQuote(QuoteVo quoteVo, String quotationNo, LoginDTO dto,
                                              String cookie, PreResult pre,
                                              Map<String, Object> gsInfo, AttributionInformationVo attr) {
-        int retry = 0;
         String fcPrice = "";
         HtCrawlerQuoteResponse.DataDTO data = null;
 
-        while (retry < MAX_RETRIES) {
-            try {
-                if (retry > 0) { log.info("第 {} 次重试,重新开始报价流程...", retry + 1); sleep(SHORT_DELAY_MS); }
-
-                StepResult step = executeQuoteSteps(quoteVo, quotationNo, dto, cookie, pre, gsInfo);
-                data = step.data();
-
-                if (data.getApplicationdto() != null) {
-                    if (StringUtils.isNotBlank(step.personalInsuredJSON())) {
-                        fcPrice = fetchNoCarPremium(cookie, quotationNo, attr, step.personalInsuredJSON());
-                    }
-                    return new CoreResult(fcPrice, data, true);
-                }
-                log.warn("applicationdto 为 null,第 {} 次重试...", ++retry);
-            } catch (Exception e) {
-                if (e.getMessage() != null && e.getMessage().contains("重试次数已达上限")) throw wrap(e);
-                log.warn("报价异常,第 {} 次重试... 异常: {}", ++retry, e.getMessage());
-                if (retry >= MAX_RETRIES) throw new RuntimeException("报价重试次数已达上限: " + e.getMessage());
-                sleep(RETRY_DELAY_MS);
+        StepResult step = executeQuoteSteps(quoteVo, quotationNo, dto, cookie, pre, gsInfo);
+        data = step.data();
+        if (data.getApplicationdto() != null) {
+            if (StringUtils.isNotBlank(step.personalInsuredJSON())) {
+                fcPrice = fetchNoCarPremium(cookie, quotationNo, attr, step.personalInsuredJSON());
             }
+            return new CoreResult(fcPrice, data, true);
         }
         return new CoreResult(fcPrice, data, false);
     }
 
-    private RuntimeException wrap(Exception e) {
-        return e instanceof RuntimeException ? (RuntimeException) e : new RuntimeException(e);
-    }
-
     private String fetchNoCarPremium(String cookie, String quotationNo,
                                      AttributionInformationVo attr, String personalInsuredJSON) {
         try {
@@ -456,7 +422,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     }
 
     private StepResult executeQuoteSteps(QuoteVo q, String quotationNo, LoginDTO dto,
-                                         String cookie, PreResult pre, Map<String, Object> gsInfo) throws Exception {
+                                         String cookie, PreResult pre, Map<String, Object> gsInfo) {
         HttpHeaders h = buildQuoteStep1Headers(cookie);
         HtCrawlerSaveOneStepRequest r = new HtCrawlerSaveOneStepRequest(q, pre.carDTO(), pre.params(), quotationNo, pre.dataDTO(), dto, gsInfo);
         String body = req.saveOneStept(r, h).getBody().toString();
@@ -555,25 +521,8 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     private QuoteVo handleQuoteErrors(String decryptData, QuoteVo q) {
         boolean hasError = decryptData.contains("erroeInfo") || decryptData.contains("errrorFlag");
         if (!hasError) return q;
-        if (decryptData.contains("本机构并未配置此险种") || decryptData.contains("重复投保的其它公司") ||
-                (decryptData.contains("发生重复投保") && !decryptData.contains("终保日期"))) {
-            try {
-                throw new SystemException(MAPPER.readValue(decryptData, Map.class).get("erroeInfo").toString());
-            } catch (JsonProcessingException e) {
-                throw new RuntimeException(e);
-            }
-        }
-
-        if (decryptData.contains("发生重复投保") && decryptData.contains("终保日期")) {
-            q = handleDuplicateInsurance(decryptData, q);
-            return q;
-        }
-        if (decryptData.contains("erroeInfo") || decryptData.contains("errrorFlag")) {
-            try {
-                throw new SystemException(MAPPER.readValue(decryptData, Map.class).get("erroeInfo").toString());
-            } catch (JsonProcessingException e) {
-                throw new RuntimeException(e);
-            }
+        if (decryptData.contains("发生重复投保") && decryptData.contains("终保日期") && !decryptData.contains("重复投保的其它公司")) {
+            return handleDuplicateInsurance(decryptData, q);
         }
         return q;
     }
@@ -598,15 +547,17 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
     }
 
     private HtCrawlerQuoteResponse.DataDTO resolveQuoteResponse(QuoteVo q, String decryptData, String mealid, String limitAmount,
-                                                              HttpHeaders h, String personalInsuredJSON) throws Exception {
-        //单交不能重复投
-        if (decryptData.contains("存在有效交强险保单") || decryptData.contains("重复投保的其它公司")) throw new Exception(decryptData);
+                                                                HttpHeaders h, String personalInsuredJSON) {
+        if (!decryptData.contains("录入的校验码有误") && decryptData.contains("erroeInfo")) {
+            log.error("报价失败: {}", decryptData);
+            throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData));
+        }
         HtCrawlerQuoteResponse.DataDTO data = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
         if (data.getApplicationdto() != null) return data;
 
         List<HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO> list =
                 data.getBasepartdtolist() != null ? data.getBasepartdtolist().getBasepartdto() : null;
-        if (list == null || list.isEmpty() || list.size() > 3) return data;
+        if (list == null || list.isEmpty()) return data;
 
         for (int i = 0; i < MAX_RETRIES; i++) {
             String basePartJSON = buildBasePartJSON(list);
@@ -630,15 +581,11 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
                 // 用新的 basePart 列表更新 list,下一轮循环会自动重新 buildBasePartJSON
                 list = result != null && result.getBasepartdtolist() != null
                         ? result.getBasepartdtolist().getBasepartdto() : null;
-                if (list == null || list.isEmpty() || list.size() > 3) {
+                if (list == null || list.isEmpty()) {
                     return result != null ? result : data;
                 }
                 continue;
             }
-
-            if (response.contains("erroeInfo")) {
-                throw new Exception(ERR_PREFIX + JSONObject.parseObject(response, HtCrawlerQuoteResponse.DataErrDTO.class).getErroeInfo());
-            }
             return result != null ? result : data;
         }
         return data;
@@ -649,7 +596,6 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         String basePartJSON = "";
         if (size == 1) {
             HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO basePartDTO = list.get(0);
-            log.info("buildBasePartJSON0: {}, {}", size, JSONObject.toJSONString(basePartDTO));
             String querrysequenceno = basePartDTO.getQuerrysequenceno();
             String autocheckcode = basePartDTO.getAutocheckcode();
             String riskfalg = "0".equals(querrysequenceno.substring(0, 1)) ? "0" : "1";
@@ -657,11 +603,9 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         }
         if (size == 2) {
             HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO basePartDTO = list.get(0);
-            log.info("buildBasePartJSON0: {}, {}", size, JSONObject.toJSONString(basePartDTO));
             String querrysequenceno = basePartDTO.getQuerrysequenceno();
             String autocheckcode = basePartDTO.getAutocheckcode();
             HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO basePartDTO1 = list.get(1);
-            log.info("buildBasePartJSON1: {}, {}", size, JSONObject.toJSONString(basePartDTO1));
             String querrysequenceno1 = basePartDTO1.getQuerrysequenceno();
             String autocheckcode1 = basePartDTO1.getAutocheckcode();
             basePartJSON = "[{'riskfalg':'0','checktype':2,'querysequenceno':'"+querrysequenceno1+"','checkcode':'"+autocheckcode1+"','answer':''}," +
@@ -669,15 +613,12 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         }
         if (size == 3) {
             HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO basePartDTO = list.get(0);
-            log.info("buildBasePartJSON0: {}, {}", size, JSONObject.toJSONString(basePartDTO));
             String querrysequenceno = basePartDTO.getQuerrysequenceno();
             String autocheckcode = basePartDTO.getAutocheckcode();
             HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO basePartDTO1 = list.get(1);
-            log.info("buildBasePartJSON1: {}, {}", size, JSONObject.toJSONString(basePartDTO1));
             String querrysequenceno1 = basePartDTO1.getQuerrysequenceno();
             String autocheckcode1 = basePartDTO1.getAutocheckcode();
             HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO basePartDTO2 = list.get(2);
-            log.info("buildBasePartJSON2: {}, {}", size, JSONObject.toJSONString(basePartDTO2));
             String querrysequenceno2 = basePartDTO2.getQuerrysequenceno();
             String autocheckcode2 = basePartDTO2.getAutocheckcode();
             basePartJSON = "[{'riskfalg':'0','checktype':2,'querysequenceno':'"+querrysequenceno1+"','checkcode':'"+autocheckcode1+"','answer':''}," +
@@ -704,7 +645,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         Map<String, Object> map = MAPPER.readValue(res, Map.class);
 
         if (isUnderwritingFailed(order.getCiCategory(), map, res)) {
-            throw new SystemException("核保失败-------" + map.get("MSG"));
+            throw new SystemException("核保失败-------" + convertResponseMsg(map.get("MSG").toString()));
         }
         if (res.contains("起保时间不正确")) {
             throw new SystemException("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
@@ -755,10 +696,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
             }
             int s = html.indexOf("原因"), e = html.lastIndexOf("。");
             throw new SystemException("审核未通过:" + (s >= 0 && e > s ? html.substring(s, e) : "审核未通过"));
-        } catch (SystemException se) { throw se; }
-        catch (Exception e) {
-            throw new SystemException(e.getMessage());
-        }
+        } catch (Exception e) { throw new SystemException(e.getMessage()); }
     }
 
     private UnderwritingResultsVo handlePassedUnderwriting(HtCrawlerOrder order, HtCrawlerConfigureParameters params, UnderwritingVo vo) {
@@ -846,7 +784,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         } catch (Exception e) { throw new RuntimeException(e); }
     }
 
-    private Map fetchUploadInitParam(String token) {
+    private Map<String, Object> fetchUploadInitParam(String token) {
         HttpHeaders h = new HttpHeaders();
         h.set(HtRequestConstant.COOKIE, req.getCookie());
         h.set("Accept", "application/json, text/plain, */*");
@@ -1074,6 +1012,22 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         });
     }
 
+    // ====================== 重试工具 ======================
+    @FunctionalInterface
+    public interface RetryableTask<T> { T execute() throws Exception; }
+
+    private <T> T retry(RetryableTask<T> task, int max, long delay, String name) {
+        for (int i = 0; i < max; i++) {
+            try { return task.execute(); }
+            catch (Exception e) {
+                log.warn("{} 失败,第 {} 次重试", name, i + 1);
+                if (i + 1 >= max) throw new SystemException(name + " 失败,已重试 " + max + " 次", e.getMessage());
+                sleep(delay);
+            }
+        }
+        throw new SystemException(name + " 失败,已达到最大重试次数");
+    }
+
     // ====================== HTTP 通用工具 ======================
     private String get(String url, HttpHeaders headers, MultiValueMap<String, String> params) {
         UriComponentsBuilder b = UriComponentsBuilder.fromHttpUrl(url);
@@ -1087,7 +1041,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
 
     @SuppressWarnings("unchecked")
     private Map<String, Object> exchangeForm(String url, Map<String, String> queryParams,
-                                               MultiValueMap<String, String> data, HttpHeaders headers) throws JsonProcessingException {
+                                             MultiValueMap<String, String> data, HttpHeaders headers) throws JsonProcessingException {
         UriComponentsBuilder b = UriComponentsBuilder.fromHttpUrl(url);
         if (queryParams != null) queryParams.forEach(b::queryParam);
         String body = RT.exchange(b.toUriString(), HttpMethod.POST, new HttpEntity<>(data, headers), String.class).getBody();
@@ -1153,4 +1107,24 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
         }
         return m;
     }
+    /**
+     * 提取 (infoName + infomsg) 或者 erroeInfo 拼接字符串
+     */
+    public static String convertResponseMsg(String responseStr) {
+        Matcher matcher = RESPONSE_ERR.matcher(responseStr);
+        StringBuilder sb = new StringBuilder();
+        while (matcher.find()) {
+            if (matcher.group(2) != null && matcher.group(3) != null) {
+                // 场景1:infoName + infomsg
+                String infoName = matcher.group(2).trim();
+                String infomsg = matcher.group(3).trim();
+                sb.append(infoName).append(":").append(infomsg).append("\n");
+            } else if (matcher.group(4) != null) {
+                // 场景2:erroeInfo 单独错误
+                sb.append(matcher.group(4).trim()).append("\n");
+            }
+        }
+        if (StringUtils.isBlank(sb)) sb.append(responseStr);
+        return sb.toString().trim();
+    }
 }

+ 4 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -391,6 +391,10 @@ public class UnifyOrderManager {
             log.error("车险报价异常", e);
             Throwable root = e.getCause() != null ? e.getCause() : e;
             String errMsg = root.getMessage() != null ? root.getMessage() : "系统异常,报价失败";
+            // 去除异常类名前缀
+            if (errMsg.matches("^[a-zA-Z0-9.]+Exception:.*")) {
+                errMsg = errMsg.substring(errMsg.indexOf(":") + 1).trim();
+            }
             try {
                 insOrdersService.orderAfterUpdateFailedQuote(ordersNo, errMsg);
             } catch (Exception ex) {

+ 14 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java

@@ -14,6 +14,7 @@ import com.jzg.commons.entity.orders.po.InsOrdersCosts;
 import com.jzg.commons.entity.po.InsFeeOrders;
 import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.entity.vo.PtlAgreementCostRatioVo;
+import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.client.OrgClient;
@@ -380,9 +381,20 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         // 2. 查询订单
         InsFeeOrders insFeeOrders = getFeeOrderByOrderNo(orderNo);
         AssertionUtils.isFail(insFeeOrders == null, "根据订单号查询订单费用表查无数据,订单号:" + orderNo);
-
-        // 3. 更新
+        BigDecimal jqExportKeepPointRatio = insFeeOrders.getJqExportKeepPointRatio(); // 交强险出口留点比例
+        BigDecimal syExportKeepPointRatio = insFeeOrders.getSyExportKeepPointRatio(); // 商业险出口留点比例
+        BigDecimal jyExportKeepPointRatio = insFeeOrders.getJyExportKeepPointRatio(); // 驾意险出口留点比例
+        if (jqExportKeepPointRatio.compareTo(BigDecimal.ZERO) != 0 || syExportKeepPointRatio.compareTo(BigDecimal.ZERO) != 0 || jyExportKeepPointRatio.compareTo(BigDecimal.ZERO) != 0) {
+            throw new SystemException("该订单留点比例不为0,无法修改可用金额");
+        }
+        // 校验修改金额 不能比现在的金额大
+        AssertionUtils.isFail(availableAmount.compareTo(insFeeOrders.getAvailableAmount()) > 0, "可用金额不能大于当前金额");
+        // 3. 更新 可用金额
+        BigDecimal availableAmountBefore = insFeeOrders.getAvailableAmount();
+        BigDecimal availableAmountAfter = availableAmountBefore.subtract(availableAmount);
         insFeeOrders.setAvailableAmount(availableAmount);
+        // 修改后 将相差的金额 加到剩余金额中
+        insFeeOrders.setRemainingAmount(insFeeOrders.getRemainingAmount().add(availableAmountAfter));
         int updateCount = insFeeOrdersMapper.updateById(insFeeOrders);
         AssertionUtils.isFail(updateCount <= 0, "更新失败,订单号:" + orderNo);
 

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrderRightsPackageServiceImpl.java

@@ -45,7 +45,7 @@ public class InsOrderRightsPackageServiceImpl extends ServiceImpl<InsOrderRights
         // 定义查询条件
         LambdaQueryWrapper<InsOrderRightsPackage> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(InsOrderRightsPackage::getOrderId, orderNo)
-                .eq(InsOrderRightsPackage::getDelFlag, 0);
+                .eq(InsOrderRightsPackage::getIsDelete, 0);
 
         // 执行删除操作,返回受影响的行数
         return insOrderRightsPackageMapper.delete(lambdaQueryWrapper);

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrderRightsServiceImpl.java

@@ -43,7 +43,7 @@ public class InsOrderRightsServiceImpl extends ServiceImpl<InsOrderRightsMapper,
         // 定义查询条件
         LambdaQueryWrapper<InsOrderRights> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(InsOrderRights::getOrderId, orderNo)
-                .eq(InsOrderRights::getDelFlag, 0);
+                .eq(InsOrderRights::getIsDelete, 0);
         // 执行删除操作,返回受影响的行数
         return insOrderRightsMapper.delete(lambdaQueryWrapper);
     }

+ 2 - 2
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrderRightsMapper.xml

@@ -38,14 +38,14 @@
     <sql id="Base_Column_List">
             id,order_id,rights_id,
             rights_name,classify,rebate,amount,rights_picture,use_condition,day_num,start_time,end_time,
-               market_price,contract_rate,settle_price,description,del_flag,create_by,
+               market_price,contract_rate,settle_price,description,is_delete,create_by,
                 create_time,update_by,update_time,rights_status,rights_count,rights_type,receiver_type,receiver_name,receiver_mobile
     </sql>
     <select id="queryByOrderNo" resultType="com.jzg.commons.entity.rights.po.InsOrderRights">
         SELECT <include refid="Base_Column_List"/>
         FROM ins_order_rights
         <where>
-            and del_flag = 0
+            and is_delete = 0
             <if test="orderNo != null and orderNo != ''">
                 and order_id = #{orderNo}
             </if>

+ 2 - 2
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrderRightsPackageMapper.xml

@@ -31,14 +31,14 @@
     <sql id="Base_Column_List">
             id,order_id,rights_id,equity_package_name,cost_price_max,cost_price_min,
             market_price,agreement_price,three_settlement_price,
-                package_price,industry_id,del_flag,create_by,create_time,update_by,
+                package_price,industry_id,is_delete,create_by,create_time,update_by,
                 update_time,status,rights_type,rights_count,receiver_type,receiver_name,receiver_mobile
     </sql>
     <select id="queryByOrderNo" resultType="com.jzg.commons.entity.rights.po.InsOrderRightsPackage">
         SELECT <include refid="Base_Column_List"/>
         FROM ins_order_rights_package
         <where>
-            and del_flag = 0
+            and is_delete = 0
             <if test="orderNo != null and orderNo != ''">
                 and order_id = #{orderNo}
             </if>

+ 3 - 0
tenant/insurance/quotation-summary/src/main/resources/mapper/InsOrdersMapper.xml

@@ -578,6 +578,9 @@
         ) ioa1 ON o.id = ioa1.order_no
         <where>
             and o.is_delete = 0 and o.parent_id != 0
+            <if test="insOrdersParam.systemCode != null and insOrdersParam.systemCode != ''">
+                AND o.system_code = #{insOrdersParam.systemCode}
+            </if>
             <if test="insOrdersParam.orderNo != null and insOrdersParam.orderNo != ''">
                 AND o.quote_no = #{insOrdersParam.orderNo}
             </if>

+ 1 - 1
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java

@@ -109,7 +109,7 @@ public class TkCrawlerQuoteResultsBuild {
                 String platformKindName = tKCiKindsVo.getKindCName(); // 平台险种名称
                 String amount = tKCiKindsVo.getQuoteAmount().toString(); // 保额
                 String unitAmount = tKCiKindsVo.getUnitAmount().toString(); // 每座保额
-                String quantity = tKCiKindsVo.getQuantity(); // 座位数
+                Integer quantity = tKCiKindsVo.getQuantity(); // 座位数
                 String premium = tKCiKindsVo.getPremium().toString(); // 保费
                 String deductibleRate = null; // 附加绝对免赔率
                 String serviceTimes = null; // 服务次数

+ 1 - 1
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/PreciseInitResult.java

@@ -66,7 +66,7 @@ public class PreciseInitResult extends UnknownFieldEntity {
     /**
      * 佣金率
      */
-    private Integer commissionRateBI;
+    private BigDecimal commissionRateBI;
 
     /**
      * 佣金金额(以货币单位表示,例如元)

+ 4 - 4
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCiKindsVo.java

@@ -63,7 +63,7 @@ public class TKCiKindsVo extends UnknownFieldEntity {
     /**
      * 免赔额列表
      */
-    private List<TKAmount> deductibleTKAmounts;
+    private List<TKAmount> deductibleAmounts;
 
     /**
      * 是否不计免赔标志
@@ -94,7 +94,7 @@ public class TKCiKindsVo extends UnknownFieldEntity {
      *
      * 否则为 “0”
      */
-    private String quantity;
+    private Integer quantity;
 
     /**
      * 报价金额
@@ -106,7 +106,7 @@ public class TKCiKindsVo extends UnknownFieldEntity {
      *
      * 当不投保时,这个字段的值好像是无意义的,有些传的是10000、有的传0、有的传2。
      */
-    private BigDecimal quoteAmount;
+    private String quoteAmount;
 
     /**
      * 报价金额中文
@@ -163,6 +163,6 @@ public class TKCiKindsVo extends UnknownFieldEntity {
     @Override
     protected void addChildUnknownFields() {
         addChildUnknownField("amounts", amounts);
-        addChildUnknownField("deductibleAmounts", deductibleTKAmounts);
+        addChildUnknownField("deductibleAmounts", deductibleAmounts);
     }
 }

+ 2 - 2
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCommonPlanInfo.java

@@ -59,7 +59,7 @@ public class TKCommonPlanInfo extends UnknownFieldEntity {
         /**
          * 单位类型
          */
-        private Integer unitType;
+        private String unitType;
 
         /**
          * 标准保费
@@ -173,6 +173,6 @@ public class TKCommonPlanInfo extends UnknownFieldEntity {
         /**
          * 种类指示
          */
-        private Integer kindInd;
+        private String kindInd;
     }
 }

+ 4 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKFlag.java

@@ -133,4 +133,8 @@ public class TKFlag extends UnknownFieldEntity {
      * 是否员工内部车
      */
     private String isStaffCar;
+    /**
+     *
+     */
+    private String priceDifferFlag;
 }

+ 2 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKOther.java

@@ -92,4 +92,6 @@ public class TKOther extends UnknownFieldEntity {
      */
     private String vehicleOwnerMessage;
 
+    private String priceDifferFlag;
+
 }

+ 2 - 3
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java

@@ -607,8 +607,8 @@ public class TKHttpAPIService {
     public SaveBasicInfoResult saveBasicInfo(String token, SaveBasicInfoParam param) {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", token);
-        // httpHeaders.add("carinsurflowid", "carInsur1780310645869550725");
-        // httpHeaders.add("carinsurorderid", param.getOrderID());
+        httpHeaders.add("carinsurflowid", "carInsur1780310645869550725");
+        httpHeaders.add("carinsurorderid", param.getOrderID());
 
         SaveBasicInfoResult.Response response = client.request(HttpURL.saveBasicInfo, param, httpHeaders, SaveBasicInfoResult.Response.class);
 
@@ -651,7 +651,6 @@ public class TKHttpAPIService {
         param.setTplatformId(tplatformId);
         param.setInitFlag("init");
         param.setTplatLoginKey(tplatLoginKey);
-        param.setOrderVersion("1");
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("carinsurflowid", "carInsur1780302178294459227");

+ 131 - 133
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java

@@ -953,8 +953,7 @@ public class TKSimpleService {
      * @param session
      * @param mainOrderId
      */
-    public PreciseInitResult orderInit(TKLoginSession session,
-                                       String mainOrderId) {
+    public PreciseInitResult orderInit(TKLoginSession session, String mainOrderId) {
         PreciseInitResult preciseInitResult = httpService.preciseInitToInit(session.getToken(), session.getTplatformId(), session.getTplatLoginKey(), mainOrderId);
         if (preciseInitResult == null) {
             throw new RuntimeException("HttpService#preciseInitToInit 失败!");
@@ -982,160 +981,161 @@ public class TKSimpleService {
         String fromId = session.getFromid();
 
         // 险种选中标志
-        {
-            TKFlag flag = preciseInitParam.getFlag();
-            if (flag == null) {
-                flag = new TKFlag();
-                preciseInitParam.setFlag(flag);
-            }
-            flag.setVipWeekFlag("0");
-            flag.setQuoteLinkageFlag("0");
 
-            // 无商业险
-            if (CollectionUtils.isEmpty(commonQuoteVo.getKindInfoVo())) {
-                flag.setCiFlag("0");
-            }
-            // 无驾意险,经测试这个值无驾意险的时候请求还是传1,不用改变
-            if (CollectionUtils.isEmpty(commonQuoteVo.getAccidentalDrivings())) {
-                flag.setIsAccidentInsureFlag("0");
-            }
+        TKFlag flag = preciseInitParam.getFlag();
+        if (flag == null) {
+            flag = new TKFlag();
+            preciseInitParam.setFlag(flag);
+        }
+        flag.setVipWeekFlag("0");
+        flag.setQuoteLinkageFlag("0");
+        flag.setInstantInsureBZAllowed("0");
+        flag.setPriceDifferFlag("0");
+
+        // 无商业险
+        if (CollectionUtils.isEmpty(commonQuoteVo.getKindInfoVo())) {
+            flag.setCiFlag("0");
         }
+        // 无驾意险,经测试这个值无驾意险的时候请求还是传1,不用改变
+        // if (CollectionUtils.isEmpty(commonQuoteVo.getAccidentalDrivings())) {
+        //     flag.setIsAccidentInsureFlag("0");
+        // }
+
 
         // 其他参数
-        {
-            TKOther other = preciseInitParam.getOther();
-            if (other == null) {
-                other = new TKOther();
-                preciseInitParam.setOther(other);
-            }
-            other.setFromID(fromId);
-            other.setChannelCode("OffWeb");
+
+        TKOther other = preciseInitParam.getOther();
+        if (other == null) {
+            other = new TKOther();
+            preciseInitParam.setOther(other);
         }
+        other.setFromID(fromId);
+        other.setChannelCode("OffWeb");
 
         // 时间参数
         TKDateInfo date = preciseInitParam.getDate();
-        {
-            // 同步交强险
-            TKBzKindVo bzKindVo = preciseInitParam.getBzKindVo();
-            if (bzKindVo == null) {
-                bzKindVo = new TKBzKindVo();
-                preciseInitParam.setBzKindVo(bzKindVo);
-            }
-            bzKindVo.setIsSelect("1"); // 选择交纳交强险
-
-            // 同步交强险时间信息,从前端参数获取
-            RiskInfoVo commonCiRiskInfoVo = commonQuoteVo.getCiRiskInfoVo();
-            if (commonCiRiskInfoVo != null) {
-                // 交强险的时间
-                date.setStartDateBZ(commonCiRiskInfoVo.getStartDate());
-                date.setEndDateBZ(commonCiRiskInfoVo.getEndDate());
-            }
 
-            // 同步车船税
-            TKCarTaxInfo carTaxInfo = preciseInitParam.getCarTaxInfo();
-            if (carTaxInfo == null) {
-                carTaxInfo = new TKCarTaxInfo();
-                preciseInitParam.setCarTaxInfo(carTaxInfo);
-            }
+        // 同步交强险
+        TKBzKindVo bzKindVo = preciseInitParam.getBzKindVo();
+        if (bzKindVo == null) {
+            bzKindVo = new TKBzKindVo();
+            preciseInitParam.setBzKindVo(bzKindVo);
+        }
+        bzKindVo.setIsSelect("1"); // 选择交纳交强险
+
+        // 同步交强险时间信息,从前端参数获取
+        RiskInfoVo commonCiRiskInfoVo = commonQuoteVo.getCiRiskInfoVo();
+        if (commonCiRiskInfoVo != null) {
+            // 交强险的时间
+            date.setStartDateBZ(commonCiRiskInfoVo.getStartDate());
+            date.setEndDateBZ(commonCiRiskInfoVo.getEndDate());
+        }
 
-            // 同步车船税信息,从前端参数获取
-            VehicleAndVesselTaxVo vehicleAndVesselTax = commonQuoteVo.getVehicleAndVesselTaxVo();
-            if (vehicleAndVesselTax != null) {
-                // 车船税标志
-                String taxRelifFlag = vehicleAndVesselTax.getTaxRelifFlag();
-                // 转换为保司的参数
-                if (taxRelifFlag.equals("1")) {
-                    carTaxInfo.setTaxFlag("T");
-                } else if (taxRelifFlag.equals("2")) {
-                    carTaxInfo.setTaxFlag("E");
-                } else if (taxRelifFlag.equals("3")) {
-                    carTaxInfo.setTaxFlag("C");
-                } else if (taxRelifFlag.equals("4")) {
-                    carTaxInfo.setTaxFlag("P");
-                }
+        // 同步车船税
+        TKCarTaxInfo carTaxInfo = preciseInitParam.getCarTaxInfo();
+        if (carTaxInfo == null) {
+            carTaxInfo = new TKCarTaxInfo();
+            preciseInitParam.setCarTaxInfo(carTaxInfo);
+        }
+        // 同步车船税信息,从前端参数获取
+        VehicleAndVesselTaxVo vehicleAndVesselTax = commonQuoteVo.getVehicleAndVesselTaxVo();
+        if (vehicleAndVesselTax != null) {
+            // 车船税标志
+            String taxRelifFlag = vehicleAndVesselTax.getTaxRelifFlag();
+            // 转换为保司的参数
+            if (taxRelifFlag.equals("1")) {
+                carTaxInfo.setTaxFlag("T");
+            } else if (taxRelifFlag.equals("2")) {
+                carTaxInfo.setTaxFlag("E");
+            } else if (taxRelifFlag.equals("3")) {
+                carTaxInfo.setTaxFlag("C");
+            } else if (taxRelifFlag.equals("4")) {
+                carTaxInfo.setTaxFlag("P");
             }
         }
 
 
-        {
-            // 同步商业险时间信息,从前端参数获取
-            RiskInfoVo commonBiRiskInfoVo = commonQuoteVo.getBiRiskInfoVo();
-            if (commonBiRiskInfoVo != null) {
-                date.setStartDateCI(commonBiRiskInfoVo.getStartDate());
-                date.setEndDateCI(commonBiRiskInfoVo.getEndDate());
-            } else {
-                date.setStartDateCI(date.getStartDateCI());
-                date.setEndDateCI(date.getEndDateCI());
-            }
-
-            // 获取保司默认选中的商险信息
-            Map<String, TKCiKindsVo> tkCiKindsVoMap = new HashMap<>();
-            for (TKCiKindsVo tkCiKindVo : preciseInitParam.getCiKindsVo()) {
-                String isSelect = tkCiKindVo.getIsSelect();
-                BigDecimal premium = tkCiKindVo.getPremium();
+        // 同步商业险时间信息,从前端参数获取
+        RiskInfoVo commonBiRiskInfoVo = commonQuoteVo.getBiRiskInfoVo();
+        if (commonBiRiskInfoVo != null) {
+            date.setStartDateCI(commonBiRiskInfoVo.getStartDate());
+            date.setEndDateCI(commonBiRiskInfoVo.getEndDate());
+        } else {
+            date.setStartDateCI(date.getStartDateCI());
+            date.setEndDateCI(date.getEndDateCI());
+        }
 
-                if (isSelect != null && isSelect.equals("1") && premium != null && premium.compareTo(BigDecimal.ZERO) == 0) {
-                    continue;
-                }
+        // 获取保司默认选中的商险信息
+        Map<String, TKCiKindsVo> tkCiKindsVoMap = new HashMap<>();
+        for (TKCiKindsVo tkCiKindVo : preciseInitParam.getCiKindsVo()) {
+            String isSelect = tkCiKindVo.getIsSelect();
+            BigDecimal premium = tkCiKindVo.getPremium();
 
-                tkCiKindVo.setIsSelect("0");
-                tkCiKindVo.setQuoteAmount(BigDecimal.ZERO);
-                tkCiKindVo.setQuoteAmountCN("不投保");
-                tkCiKindVo.setPremium(BigDecimal.ZERO);
-                tkCiKindVo.setTotalPremium(BigDecimal.ZERO);
-                tkCiKindsVoMap.put(tkCiKindVo.getKindCode(), tkCiKindVo);
+            if (isSelect != null && isSelect.equals("1") && premium != null && premium.compareTo(BigDecimal.ZERO) == 0) {
+                continue;
             }
 
-            // 根据公司系统选择的险种进行覆盖
-            List<KindInfoVo> commonBiKindInfoVos = commonQuoteVo.getKindInfoVo();
-            if (CollectionUtils.isNotEmpty(commonBiKindInfoVos)) {
-                for (KindInfoVo commonBiKindInfoVo : commonBiKindInfoVos) {
-                    if (tkCiKindsVoMap.isEmpty() || tkCiKindsVoMap.get(commonBiKindInfoVo.getKindCode()) == null) {
-                        continue;
-                    }
-                    TKCiKindsVo tkCiKindVo = tkCiKindsVoMap.get(commonBiKindInfoVo.getKindCode());
-                    tkCiKindVo.setIsSelect("1");
-                    tkCiKindVo.setQuoteAmount(new BigDecimal(commonBiKindInfoVo.getAmount()));
-                    tkCiKindVo.setQuoteAmountCN(commonBiKindInfoVo.getAmount());
-                    tkCiKindVo.setUnitAmount(new BigDecimal(commonBiKindInfoVo.getUnitAmount()));
-                    tkCiKindVo.setUnitAmountCN(commonBiKindInfoVo.getUnitAmount());
-                    String quantity = commonBiKindInfoVo.getQuantity();
-                    String serviceTimes = commonBiKindInfoVo.getServiceTimes();
-                    if (StringUtils.isNotBlank(quantity)) {
-                        tkCiKindVo.setQuantity(quantity);
-                    } else if (StringUtils.isNotBlank(serviceTimes)) {
-                        tkCiKindVo.setQuantity(serviceTimes);
-                    }
+            tkCiKindVo.setBjSelect("0");
+            tkCiKindVo.setDeductibleAmount(BigDecimal.ZERO);
+            tkCiKindVo.setIsSelect("0");
+            tkCiKindVo.setQuantity(0);
+            tkCiKindVo.setQuoteAmountCN("不投保");
+            // tkCiKindVo.setQuoteAmount(BigDecimal.ZERO); // 不用管
+            // tkCiKindVo.setPremium(BigDecimal.ZERO); // 不用管
+            // tkCiKindVo.setTotalPremium(BigDecimal.ZERO);// 不用管
+            tkCiKindsVoMap.put(tkCiKindVo.getKindCode(), tkCiKindVo);
+        }
 
-                    String deductibleRate = commonBiKindInfoVo.getDeductibleRate();
-                    tkCiKindVo.setDeductibleAmount(null); // todo
+        // 根据公司系统选择的险种进行覆盖
+        List<KindInfoVo> commonBiKindInfoVos = commonQuoteVo.getKindInfoVo();
+        if (CollectionUtils.isNotEmpty(commonBiKindInfoVos)) {
+            for (KindInfoVo commonBiKindInfoVo : commonBiKindInfoVos) {
+                if (tkCiKindsVoMap.isEmpty() || tkCiKindsVoMap.get(commonBiKindInfoVo.getKindCode()) == null) {
+                    continue;
+                }
+                TKCiKindsVo tkCiKindVo = tkCiKindsVoMap.get(commonBiKindInfoVo.getKindCode());
+                tkCiKindVo.setIsSelect("1");
+                tkCiKindVo.setQuoteAmount(commonBiKindInfoVo.getAmount());
+                tkCiKindVo.setQuoteAmountCN(commonBiKindInfoVo.getAmount());
+                // tkCiKindVo.setUnitAmount(new BigDecimal(commonBiKindInfoVo.getUnitAmount()));
+                // tkCiKindVo.setUnitAmountCN(commonBiKindInfoVo.getUnitAmount());
+
+
+                String quantity = commonBiKindInfoVo.getQuantity();
+                String serviceTimes = commonBiKindInfoVo.getServiceTimes();
+                if (StringUtils.isNotBlank(quantity)) {
+                    tkCiKindVo.setQuantity(Integer.parseInt(quantity));
+                } else if (StringUtils.isNotBlank(serviceTimes)) {
+                    tkCiKindVo.setQuantity(Integer.parseInt(serviceTimes));
                 }
+
             }
         }
 
-        {
-            // 同步驾意险, 系统有选择驾意险进行匹配覆盖(泰康要求必须有驾意险)
-            Map<String, TKCarPlanInfo> carPlanInfoMap = Optional.ofNullable(preciseInitParam.getDriverAccidentVo().getCarPlanInfoList()).orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(TKCarPlanInfo::getPlanCode, Function.identity()));
-            TKDriverAccidentVo driverAccidentVo = preciseInitParam.getDriverAccidentVo();// 泰康系统默认的驾意险信息
-            List<AccidentalDrivingVo> accidentalDrivings = commonQuoteVo.getAccidentalDrivings(); // 公司系统的驾意险参数
-            // 公司系统的驾意险参数为空证明没有选择驾意险
-            if (CollectionUtils.isNotEmpty(accidentalDrivings)) {
-                for (AccidentalDrivingVo accidentalDriving : accidentalDrivings) {
-                    if (carPlanInfoMap.isEmpty() || accidentalDriving.getRiskCode() == null) {
-                        continue;
-                    }
-                    TKCarPlanInfo tkCarPlanInfo = carPlanInfoMap.get(accidentalDriving.getProductCode());
-                    driverAccidentVo.setIsSelect("1");
-                    driverAccidentVo.setSelectPlanCode(tkCarPlanInfo.getPlanCode());
-                    driverAccidentVo.setQuoteAmountCN(tkCarPlanInfo.getPlanName());
-                    driverAccidentVo.setPremium(new BigDecimal(tkCarPlanInfo.getSumPremium()));
+
+        // 同步驾意险, 系统有选择驾意险进行匹配覆盖(泰康要求必须有驾意险)
+        Map<String, TKCarPlanInfo> carPlanInfoMap = Optional.ofNullable(preciseInitParam.getDriverAccidentVo().getCarPlanInfoList()).orElseGet(Collections::emptyList).stream().collect(Collectors.toMap(TKCarPlanInfo::getPlanCode, Function.identity()));
+        TKDriverAccidentVo driverAccidentVo = preciseInitParam.getDriverAccidentVo();// 泰康系统默认的驾意险信息
+        List<AccidentalDrivingVo> accidentalDrivings = commonQuoteVo.getAccidentalDrivings(); // 公司系统的驾意险参数
+        // 公司系统的驾意险参数为空证明没有选择驾意险
+        if (CollectionUtils.isNotEmpty(accidentalDrivings)) {
+            for (AccidentalDrivingVo accidentalDriving : accidentalDrivings) {
+                if (carPlanInfoMap.isEmpty() || accidentalDriving.getRiskCode() == null) {
+                    continue;
                 }
-            } else {
-                driverAccidentVo.setIsSelect("0");
-                driverAccidentVo.setQuantity(0);
-                driverAccidentVo.setQuantityCname("不投保");
-                driverAccidentVo.setPremium(BigDecimal.ZERO);
+                TKCarPlanInfo tkCarPlanInfo = carPlanInfoMap.get(accidentalDriving.getProductCode());
+                driverAccidentVo.setIsSelect("1");
+                driverAccidentVo.setSelectPlanCode(tkCarPlanInfo.getPlanCode());
+                driverAccidentVo.setQuoteAmountCN(tkCarPlanInfo.getPlanName());
+                driverAccidentVo.setPremium(new BigDecimal(tkCarPlanInfo.getSumPremium()));
             }
+        } else {
+            driverAccidentVo.setIsSelect("0");
+            driverAccidentVo.setQuantity(0);
+            driverAccidentVo.setQuantityCname("不投保");
+            driverAccidentVo.setPremium(BigDecimal.ZERO);
+            driverAccidentVo.setNonCarStartDate(null);
+            driverAccidentVo.setNonCarEndDate(null);
         }
 
         // 泰乐途, 默认不投保
@@ -1156,8 +1156,6 @@ public class TKSimpleService {
         preciseInitParam.setTplatLoginKey(tplatLoginKey);
         preciseInitParam.setOrderID(mainOrderId);
         preciseInitParam.setRiskType("0808");
-        // orderVersion = 1
-        preciseInitParam.setOrderVersion("1");
         PreciseInitResult preciseQuoteResult = httpService.preciseInitToQuote(session.getToken(), preciseInitParam);
 
         if (preciseQuoteResult == null) {

+ 71 - 30
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java

@@ -5,6 +5,8 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
+import com.jzg.commons.entity.po.InsFeeOrders;
+import com.jzg.commons.entity.quote.vo.ExpenseFactor;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
@@ -13,9 +15,11 @@ import com.jzg.commons.util.DateTimeUtils;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerQuotationResponse;
+import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerSaveProposalResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.util.ObjectUtils;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -49,20 +53,20 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
      * 处理报价结果
      *
      * @param ordersNo
-     * @param quoteVo
      * @param ziJinCrawlerQuotationResponse
+     * @param ziJinCrawlerSaveProposalResponse
      * @return QuoteResultsVo
      */
-    public static QuoteResultsVo buildQuoteResultsVo(String ordersNo, QuoteVo quoteVo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse) {
+    public static QuoteResultsVo buildQuoteResultsVo(String ordersNo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         quoteResultsVo.setOrdersNo(ordersNo);
 
         if (ziJinCrawlerQuotationResponse.getItemKindList() != null) {
-            // 设置交强险信息
+            // 设置交强险投保时间信息
             quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(ziJinCrawlerQuotationResponse));
-            // 设置商业险信息
+            // 设置商业险投保时间信息
             quoteResultsVo.setBiRiskInfoVo(buildBiRiskInfoVo(ziJinCrawlerQuotationResponse));
-            // 设置驾意险信息
+            // 设置驾意险投保时间信息
             // quoteResultsVo.setJyRiskInfoVo(buildJyRiskInfoVo(ziJinCrawlerQuotationResponse));
             // 设置险种明细列表
             quoteResultsVo.setKindInfoVo(buildKindInfoVoList(ziJinCrawlerQuotationResponse));
@@ -72,10 +76,19 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         buildPremium(quoteResultsVo, ziJinCrawlerQuotationResponse);
 
         // 设置投保单号
-        // if (ziJinCrawlerQuotationResponse.getBasePart() != null) {
-        //     quoteResultsVo.setCiPolicyNumber(ziJinCrawlerQuotationResponse.getBasePart().getProposalCheckNo());
-        //     quoteResultsVo.setBiPolicyNumber(ziJinCrawlerQuotationResponse.getBasePart().getProposalCheckNo());
-        // }
+        if (ziJinCrawlerSaveProposalResponse != null && ziJinCrawlerSaveProposalResponse.getData() != null) {
+            ZiJinCrawlerSaveProposalResponse.Data data = ziJinCrawlerSaveProposalResponse.getData();
+            quoteResultsVo.setCiPolicyNumber(data.getProposalNoCI());
+            quoteResultsVo.setBiPolicyNumber(data.getProposalNo());
+
+            // 费用信息
+            if (data.getFeeImformationDto() != null) {
+                InsFeeOrders insFeeOrders = new InsFeeOrders();
+                insFeeOrders.setJqCommissionPremium(new BigDecimal(data.getFeeImformationDto().getJqFeeRatio()));
+                insFeeOrders.setSyCommissionPremium(new BigDecimal(data.getFeeImformationDto().getSyFeeRatio()));
+                quoteResultsVo.setFeeOrders(insFeeOrders);
+            }
+        }
 
         // 设置警告消息(预核保消息)
         if (ziJinCrawlerQuotationResponse.getBasePart() != null) {
@@ -87,6 +100,16 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         // 设置评分
         quoteResultsVo.setScoreVo(ZiJinCrawlerQuoteResultsVoBuild.buildScoreVo(ziJinCrawlerQuotationResponse));
 
+        // 构建因子
+        // ZiJinCrawlerQuotationResponse.PriceInfoList priceInfo = ziJinCrawlerQuotationResponse.getPriceInfoList().get(0);
+        // ExpenseFactor expenseFactor = new ExpenseFactor(null, priceInfo.getEffectNameUPOne(), priceInfo.getEffectValueUPOne());
+        // ExpenseFactor expenseFactor2 = new ExpenseFactor(null, priceInfo.getEffectNameUPTwo(), priceInfo.getEffectValueUPTwo());
+        // ExpenseFactor expenseFactor3 = new ExpenseFactor(null, priceInfo.getEffectNameUPThree(), priceInfo.getEffectValueUPThree());
+        // ExpenseFactor expenseFactor4 = new ExpenseFactor(null, priceInfo.getEffectNameDownFour(), priceInfo.getEffectValueDownFour());
+        // ExpenseFactor expenseFactor5 = new ExpenseFactor(null, priceInfo.getEffectNameDownFive(), priceInfo.getEffectValueDownFive());
+        // ExpenseFactor expenseFactor6 = new ExpenseFactor(null, priceInfo.getEffectNameDownSix(), priceInfo.getEffectValueDownSix());
+        // quoteResultsVo.setExpenseFactors();
+
         // 设置报价状态:待核保
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
 
@@ -289,7 +312,7 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName", "连续承保期间出险次数")
                 .fluentPut("scoreKey", "claimTimes")
-                .fluentPut("score", ciProfitDetailData  != null ? ciProfitDetailData.getClaimTimes() : null));
+                .fluentPut("score", ciProfitDetailData != null ? ciProfitDetailData.getClaimTimes() : null));
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName", "总折扣")
                 .fluentPut("scoreKey", "initialELR")
@@ -359,26 +382,44 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         scoreVo.setScoreJson(scoreArray);
 
         // 影响因子
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName", "NCD")// 升费因子名称
-                .fluentPut("scoreKey", "effectValueUPOne")
-                .fluentPut("score", priceInfo.getEffectValueUPOne()));// 因子比例
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName", "性别年龄")
-                .fluentPut("scoreKey", "effectValueUPTwo")
-                .fluentPut("score", priceInfo.getEffectValueUPTwo()));
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName", "车牌")
-                .fluentPut("scoreKey", "effectValueUPThree")
-                .fluentPut("score", priceInfo.getEffectValueUPThree()));
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName", "是否投保医保外用药")
-                .fluentPut("scoreKey", "effectValueDownFour")
-                .fluentPut("score", priceInfo.getEffectValueDownFour()));
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName", "平台分")
-                .fluentPut("scoreKey", "effectValueDownFive")
-                .fluentPut("score", priceInfo.getEffectValueDownFive()));
+        // 升费因子名称       // 因子比例
+        if (StringUtils.isNotEmpty(priceInfo.getEffectNameUPOne())) {
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName", priceInfo.getEffectNameUPOne())
+                    .fluentPut("scoreKey", "effectValueUPOne")
+                    .fluentPut("score", priceInfo.getEffectValueUPOne()));
+        }
+        if (StringUtils.isNotEmpty(priceInfo.getEffectNameUPTwo())) {
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName", priceInfo.getEffectNameUPTwo())
+                    .fluentPut("scoreKey", "effectValueUPTwo")
+                    .fluentPut("score", priceInfo.getEffectValueUPTwo()));
+        }
+        if (StringUtils.isNotEmpty(priceInfo.getEffectNameUPThree())) {
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName", priceInfo.getEffectNameUPThree())
+                    .fluentPut("scoreKey", "effectValueUPThree")
+                    .fluentPut("score", priceInfo.getEffectValueUPThree()));
+        }
+        // 降费因子名称       // 因子比例
+        if (StringUtils.isNotEmpty(priceInfo.getEffectNameDownFour())) {
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName", priceInfo.getEffectNameDownFour())
+                    .fluentPut("scoreKey", "effectValueDownFour")
+                    .fluentPut("score", priceInfo.getEffectValueDownFour()));
+        }
+        if (StringUtils.isNotEmpty(priceInfo.getEffectNameDownFive())) {
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName", priceInfo.getEffectNameDownFive())
+                    .fluentPut("scoreKey", "effectValueDownFive")
+                    .fluentPut("score", priceInfo.getEffectValueDownFive()));
+        }
+        if (StringUtils.isNotEmpty(priceInfo.getEffectNameDownSix())) {
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName", priceInfo.getEffectNameDownSix())
+                    .fluentPut("scoreKey", "effectValueDownSix")
+                    .fluentPut("score", priceInfo.getEffectValueDownSix()));
+        }
         scoreVo.setScoreJson(scoreArray);
         return scoreVo;
     }

+ 6 - 3
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerSaveQuoteInfoRequestBuild.java

@@ -32,17 +32,17 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
      *
      * @return 构建完成的保存报价信息请求对象
      */
-    public ZiJinCrawlerSaveQuoteInfoRequest buildSaveQuoteInfoRequest(QuoteVo quoteVo, ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse) {
+    public ZiJinCrawlerSaveQuoteInfoRequest buildSaveQuoteInfoRequest(QuoteVo quoteVo, String orderNo, ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse) {
         ZiJinCrawlerSaveQuoteInfoRequest ziJinCrawlerSaveQuoteInfoRequest = new ZiJinCrawlerSaveQuoteInfoRequest();
 
         // 设置代理人代码
         ziJinCrawlerSaveQuoteInfoRequest.setAgentCode(ziJinCrawlerQuotationRequest.getBaseInfo().getAgentCode());
 
         // 设置订单ID
-        ziJinCrawlerSaveQuoteInfoRequest.setOrderId(ziJinCrawlerQuotationResponse.getOrderId());
+        ziJinCrawlerSaveQuoteInfoRequest.setOrderId(ziJinCrawlerQuotationRequest.getOrderId());
 
         // 设置订单号
-        ziJinCrawlerSaveQuoteInfoRequest.setOrderNo(ziJinCrawlerQuotationResponse.getOrderNo());
+        ziJinCrawlerSaveQuoteInfoRequest.setOrderNo(orderNo);
 
         // 设置基础信息
         ziJinCrawlerSaveQuoteInfoRequest.setBaseInfo(buildSaveBaseInfo(quoteVo, ziJinCrawlerQuotationRequest, ziJinCrawlerQuotationResponse));
@@ -184,6 +184,7 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
                 .carLoanFlag(carInfo.getCarLoanFlag())
                 .certificateDate(carInfo.getCertificateDate() != null ? carInfo.getCertificateDate() : "")
                 .chgOwnerFlag(carInfo.getChgOwnerFlag())
+                .colorCode(carInfo.getColorCode())
                 // .completekerbmass(carInfo.getCompletekerbmass() != null ? Integer.parseInt(carInfo.getCompletekerbmass()) : 0)
                 .completekerbmass(carInfo.getCompletekerbmass())
                 .ecdemicVehicleFlag(carInfo.getEcdemicVehicleFlag() != null ? carInfo.getEcdemicVehicleFlag() : "0")
@@ -474,6 +475,8 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
                 .handerCode(ziJinCrawlerQuotationRequest.getBaseInfo().getHanderCode())
                 .handerName(ziJinCrawlerQuotationRequest.getBaseInfo().getHanderName())
                 .calculateFlag(ziJinCrawlerQuotationRequest.getBaseInfo().getCalculateFlag())
+                // .proposalNo("1050AA140105260004G3")
+                // .proposalNoCI("10590A14010526000HG8") // todo: 需要找到这2个单号哪来的?没有回导致保存保单接口失败
                 .isCI(quoteVo.getCiRiskInfoVo() != null)
                 .isBI(quoteVo.getBiRiskInfoVo() != null)
                 .riskCodeEnum(ZiJinCrawlerSaveQuoteInfoRequest.BaseInfo.RiskCodeEnum.builder()

+ 2 - 1
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerRequestComponent.java

@@ -314,7 +314,8 @@ public class ZiJinCrawlerRequestComponent {
     public ZiJinCrawlerSaveProposalResponse saveProposal(ZiJinCrawlerSaveProposalRequest ziJinCrawlerSaveProposalRequest, HttpHeaders headers) throws IOException {
         String token = headers.getFirst("Authorization");
         HttpHeaders httpHeaders = setHttpHeaders(token);
-
+        httpHeaders.remove("Cache-Control");
+        log.info("请求header信息:{}", httpHeaders);
         String jsonString = JSON.toJSONString(ziJinCrawlerSaveProposalRequest);
         log.info("ziJinCrawlerSaveProposalRequest请求参数的值:{}", jsonString);
         ResponseEntity<ZiJinCrawlerSaveProposalResponse> responseEntity = requestComponent.post(RequestUrl.SAVE_PROPOSAL_ORDER.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerSaveProposalResponse.class, httpHeaders);

+ 1 - 1
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/ZiJinCrawlerConfigureParameters.java

@@ -39,7 +39,7 @@ public class ZiJinCrawlerConfigureParameters implements ConfigureParameters {
     /**
      * 代理code
      */
-    private String 代理code;
+    private String agentCode;
 
     /**
      * 渠道: 比如 个人代理

+ 9 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerSaveQuoteInfoRequest.java

@@ -271,6 +271,12 @@ public class ZiJinCrawlerSaveQuoteInfoRequest implements Serializable {
         @JsonProperty("proposalCheckNo")
         private String proposalCheckNo;
 
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+
+        @JsonProperty("proposalNoCI")
+        private String proposalNoCI;
+
         @JsonProperty("xbFlag")
         private String xbFlag;
 
@@ -936,6 +942,9 @@ public class ZiJinCrawlerSaveQuoteInfoRequest implements Serializable {
 
         @JsonProperty("modelEnergyType")
         private String modelEnergyType;
+
+        @JsonProperty("colorCode")
+        private String colorCode;
     }
 
     /**

+ 3 - 1
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/ZiJinCrawlerOrderService.java

@@ -14,14 +14,16 @@ public interface ZiJinCrawlerOrderService {
 
     /**
      * 保存紫金财险爬虫订单
+     *
      * @param quoteVo
      * @param ziJinCrawlerQuotationResponse
      * @param success
      */
-    void save(QuoteVo quoteVo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse, String orderId, boolean success);
+    void save(QuoteVo quoteVo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse, String orderNo, String orderId, boolean success);
 
     /**
      * 根据系统内部订单号查询紫金财险爬虫订单
+     *
      * @param ordersNo
      * @return ZiJinCrawlerOrder
      */

+ 4 - 5
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerOrderServiceImpl.java

@@ -34,19 +34,18 @@ public class ZiJinCrawlerOrderServiceImpl implements ZiJinCrawlerOrderService {
      * @param success
      */
     @Override
-    public void save(QuoteVo quoteVo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse, String orderId, boolean success) {
+    public void save(QuoteVo quoteVo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse, String orderNo, String orderId, boolean success) {
         ZiJinCrawlerOrder order = new ZiJinCrawlerOrder();
         order.setOrdersNo(quoteVo.getOrder().getOrdersNo());
-        order.setOrderNo(ObjectUtils.isEmpty(ziJinCrawlerQuotationResponse.getOrderNo()) ? ziJinCrawlerSaveProposalResponse.getData().getOrderNo() : ziJinCrawlerQuotationResponse.getOrderNo());
+        // 报价接口没有返回订单号, 报价保存方法save方法成功后返回订单号
+        order.setOrderNo(orderNo);
         order.setBusUniqueId(orderId);
         order.setQuoteSuccess(success);
-        if (success && ziJinCrawlerSaveProposalResponse != null) {
+        if (success) {
             order.setCiApplyNo(ziJinCrawlerSaveProposalResponse.getData().getProposalNoCI());
             order.setCiPolicyNo(ziJinCrawlerSaveProposalResponse.getData().getPolicyNoCI());
-            // order.setCiPremium(ziJinCrawlerQuotationResponse.getData().getTrafficPolicy().getPremium());
             order.setSyApplyNo(ziJinCrawlerSaveProposalResponse.getData().getProposalNo());
             order.setBiPolicyNo(ziJinCrawlerSaveProposalResponse.getData().getPolicyNo());
-            // order.setBiPremium(ziJinCrawlerQuotationResponse.getData().getBusinessPolicy().getPremium());
         }
 
         order.setCreateTime(LocalDateTime.now());

+ 26 - 28
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java

@@ -22,7 +22,6 @@ import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.zijin.api.constant.enums.MotorVehicleInsuranceEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
-import com.jzg.quotation.zijin.api.entity.request.UploadImageInfoListRequest;
 import com.jzg.quotation.zijin.crawler.build.ZiJinCrawlerQuoteRequestBuild;
 import com.jzg.quotation.zijin.crawler.build.ZiJinCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.zijin.crawler.build.ZiJinCrawlerSaveQuoteInfoRequestBuild;
@@ -181,7 +180,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             }
             ziJinCrawlerQuotationRequest.setItemKindList(buildItemKindList(quoteVo, actualValue));
 
-            // 设置附加保单信息列表
+            // 设置附加保单信息列表(推荐产品、驾意险、健康险、责任险、家财险、企业财产险)
             ziJinCrawlerQuotationRequest.setCarPolicySubInfoList(buildCarPolicySubInfoList(quoteVo));
 
             // 设置车辆信息
@@ -201,8 +200,6 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             log.info("ziJinCrawlerQuotationRequest参数:{}", JSON.toJSONString(ziJinCrawlerQuotationRequest));
             ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
             log.info("ziJinCrawlerQuotationResponse响应:{}", JSON.toJSONString(ziJinCrawlerQuotationResponse));
-            // 设置紫金财险爬虫订单号,后面保存到数据库中
-            ziJinCrawlerQuotationResponse.setOrderNo(ziJinCrawlerGetOrderNoResponse.getOrderNo());
 
             // 重复投保,延保
             if (ResponseCode.R_0002.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode()) && ziJinCrawlerQuotationResponse.getRtnMsg() != null && ziJinCrawlerQuotationResponse.getRtnMsg().contains("重复投保")) {
@@ -238,12 +235,12 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
 
             // 4.0 处理报价失败
             if (!ResponseCode.R_0000.getCode().equals(ziJinCrawlerQuotationResponse.getRtnCode())) {
-                ziJinCrawlerOrderService.save(quoteVo, ziJinCrawlerQuotationResponse, null, ziJinCrawlerQuotationRequest.getOrderId(), false);
+                ziJinCrawlerOrderService.save(quoteVo, ziJinCrawlerQuotationResponse, null, null, ziJinCrawlerQuotationRequest.getOrderId(), false);
                 return ZiJinCrawlerQuoteResultsVoBuild.buildQuoteFailResultsVo(ziJinCrawlerQuotationResponse);
             } else {
                 // 报价成功
                 // 保存报价信息
-                ZiJinCrawlerSaveQuoteInfoRequest ziJinCrawlerSaveQuoteInfoRequest = ziJinCrawlerSaveQuoteInfoRequestBuild.buildSaveQuoteInfoRequest(quoteVo, ziJinCrawlerQuotationRequest, ziJinCrawlerQuotationResponse);
+                ZiJinCrawlerSaveQuoteInfoRequest ziJinCrawlerSaveQuoteInfoRequest = ziJinCrawlerSaveQuoteInfoRequestBuild.buildSaveQuoteInfoRequest(quoteVo, ziJinCrawlerGetOrderNoResponse.getOrderNo(), ziJinCrawlerQuotationRequest, ziJinCrawlerQuotationResponse);
                 log.info("ziJinCrawlerSaveQuoteInfoRequest参数:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoRequest));
                 ZiJinCrawlerSaveQuoteInfoResponse ziJinCrawlerSaveQuoteInfoResponse = ziJinCrawlerRequestComponent.saveQuoteInformation(ziJinCrawlerSaveQuoteInfoRequest, headers);
                 log.info("ziJinCrawlerSaveQuoteInfoResponse响应:{}", JSON.toJSONString(ziJinCrawlerSaveQuoteInfoResponse));
@@ -256,8 +253,8 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse = ziJinCrawlerRequestComponent.saveProposal(ziJinCrawlerSaveProposalRequest, headers);
                 log.info("ziJinCrawlerSaveProposalResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerSaveProposalResponse));
 
-                ziJinCrawlerOrderService.save(quoteVo, ziJinCrawlerQuotationResponse, ziJinCrawlerSaveProposalResponse, ziJinCrawlerQuotationRequest.getOrderId(), true);
-                return ZiJinCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), quoteVo, ziJinCrawlerQuotationResponse);
+                ziJinCrawlerOrderService.save(quoteVo, ziJinCrawlerQuotationResponse, ziJinCrawlerSaveProposalResponse, ziJinCrawlerSaveQuoteInfoResponse.getOrderNo(), ziJinCrawlerQuotationRequest.getOrderId(), true);
+                return ZiJinCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), ziJinCrawlerQuotationResponse, ziJinCrawlerSaveProposalResponse);
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -292,7 +289,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         // 核保成功
-        if ("0000".equals(ziJinCrawlerUnderwritingResponse.getRtnCode())) {
+        if ("0000" .equals(ziJinCrawlerUnderwritingResponse.getRtnCode())) {
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
             underwritingResultsVo.setJqApplyNo(ziJinCrawlerUnderwritingResponse.getData().getResultObj().getProposalNoCI());
             underwritingResultsVo.setSyApplyNo(ziJinCrawlerUnderwritingResponse.getData().getResultObj().getProposalNo());
@@ -342,7 +339,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             log.info("ziJinCrawlerPaymentLinkResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerPaymentLinkResponse));
             PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
             // 支付链接获取成功
-            if ("0000".equals(ziJinCrawlerPaymentLinkResponse.getRtnCode())) {
+            if ("0000" .equals(ziJinCrawlerPaymentLinkResponse.getRtnCode())) {
                 paymentLinkResultsVo.setPayLinkStatus(true);
                 paymentLinkResultsVo.setPaymentLink(ziJinCrawlerPaymentLinkResponse.getWechatUrl());
             } else {
@@ -435,7 +432,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 ZiJinCrawlerImageUploadResponse ziJinCrawlerImageUploadResponse = ziJinCrawlerRequestComponent.uploadImage(ziJinCrawlerImageUploadRequest, headers);
                 log.info("影像上传响应,订单号:{},响应:{}", ziJinCrawlerOrder.getOrderNo(), JSON.toJSONString(ziJinCrawlerImageUploadResponse));
 
-                if ("0000".equals(ziJinCrawlerImageUploadResponse.getRtnCode())) {
+                if ("0000" .equals(ziJinCrawlerImageUploadResponse.getRtnCode())) {
 
                     ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO fileInfo = ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO.builder()
                             .fileId(ziJinCrawlerImageUploadResponse.getFileId())
@@ -530,11 +527,11 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             log.info("订单状态:{},中文含义:{}", orderStatus, ziJinCrawlerQueryOrderStatusResponse.getData().getContent().get(0).getOrderStatusCN());
             // 将保司返回的订单状态转换为系统定义的订单状态枚举类型
             InsOrderStatusEnum orderStatusEnum = null;
-            if ("5".equals(orderStatus)) {
+            if ("5" .equals(orderStatus)) {
                 orderStatusEnum = InsOrderStatusEnum.valueOf("ORDER_CLOSE");
                 orderStatus = orderStatusEnum.getCode();
             }
-            if ("9".equals(orderStatus)) {
+            if ("9" .equals(orderStatus)) {
                 orderStatusEnum = InsOrderStatusEnum.valueOf("AUDIT_FAIL");
                 orderStatus = orderStatusEnum.getCode();
             }
@@ -781,7 +778,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         ziJinCrawlerGetCarActualValueRequest.setUpdateEnrollDate(quoteVo.getCarInfoVo().getRegisterDate());
         ziJinCrawlerGetCarActualValueRequest.setPurchasePrice(quoteVo.getCarInfoVo().getPurchasePrice());
         ziJinCrawlerGetCarActualValueRequest.setSeatCount(Integer.valueOf(quoteVo.getCarInfoVo().getSeatCount()));
-        ziJinCrawlerGetCarActualValueRequest.setUseNatureCode("02".equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
+        ziJinCrawlerGetCarActualValueRequest.setUseNatureCode("02" .equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
         ziJinCrawlerGetCarActualValueRequest.setStartDate(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
         ziJinCrawlerGetCarActualValueRequest.setNewEnergyFlag(quoteVo.getCarInfoVo().getEnergyTypeCode());
         ziJinCrawlerGetCarActualValueRequest.setModelEnergyType(ObjectUtils.isEmpty(quoteVo.getCarInfoVo().getModelEnergyType()) ? "D1" : quoteVo.getCarInfoVo().getModelEnergyType());
@@ -795,8 +792,8 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      */
     private ZiJinCrawlerQuotationRequest.BaseInfo buildBaseInfo(QuoteVo quoteVo, ZiJinCrawlerConfigureParameters parameters, String operatorCode) {
         ZiJinCrawlerQuotationRequest.BaseInfo baseInfo = new ZiJinCrawlerQuotationRequest.BaseInfo();
-        baseInfo.setAgentCode(parameters.get代理code());
-        baseInfo.setAgreementNo(parameters.get代理code()+"-01");
+        baseInfo.setAgentCode(parameters.getAgentCode());
+        baseInfo.setAgreementNo(parameters.getAgentCode() + "-01");
         baseInfo.setBusinessNature("1");
         baseInfo.setComCode(parameters.getComCode());
         baseInfo.setComName(parameters.getComName());
@@ -881,7 +878,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             // 证件类型映射,参考Python get_owner_i方法
             // 个人类型(1) -> vehicleOwnerNature="1"
             // 企业类型(2) -> vehicleOwnerNature="5"
-            if ("2".equals(personType)) {
+            if ("2" .equals(personType)) {
                 // 企业
                 carOwnerInfo.setVehicleOwnerNature("5");
                 // 企业证件类型映射
@@ -1019,7 +1016,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         // 证件类型映射
         String identifyType = customerInfo.getIdentifyType();
         String personType = customerInfo.getPersonType();
-        if ("2".equals(personType)) {
+        if ("2" .equals(personType)) {
             // 企业
             insuredItem.setIdentifyType(mapEnterpriseIdentifyType(identifyType));
         } else {
@@ -1029,12 +1026,12 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
 
         // 性别映射
         String gender = customerInfo.getGender();
-        insuredItem.setSex("男".equals(gender) ? "1" : "2");
+        insuredItem.setSex("男" .equals(gender) ? "1" : "2");
 
         // 根据车主性质设置投保人/被保人类型
         // 个人车主("1"): 投保人/被保人都是自然人
         // 企业车主("5"): 投保人是法人,被保人是自然人
-        if ("5".equals(vehicleOwnerNature) && insuredFlag == 2) {
+        if ("5" .equals(vehicleOwnerNature) && insuredFlag == 2) {
             // 企业车主的投保人
             insuredItem.setInsuredNature("4");// 4-法人或其他组织
             insuredItem.setInsuredType("2");
@@ -1406,14 +1403,15 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         for (AccidentalDrivingVo accidentalDriving : quoteVo.getAccidentalDrivings()) {
             ZiJinCrawlerQuotationRequest.CarPolicySubInfoList carPolicySubInfo = new ZiJinCrawlerQuotationRequest.CarPolicySubInfoList();
             carPolicySubInfo.setPlanName(accidentalDriving.getProductName());
-            carPolicySubInfo.setInsureGradeNo("");
-            carPolicySubInfo.setProductCode(accidentalDriving.getProductCode());
+            carPolicySubInfo.setInsureGradeNo("200000736004"); // 前端没传
+            carPolicySubInfo.setProductCode("0736");// 这个值前端传过来的是乱码200000736004%%0736%%%0
+            carPolicySubInfo.setPlanName(accidentalDriving.getProductName());
             carPolicySubInfo.setRiskCode("0736"); // 完了要调整编码,是否要转换
-            carPolicySubInfo.setRiskName("全家安行保"); // 完了要调整成accidentalDriving.getRiskName(),看名称是否传了
-            carPolicySubInfo.setSumAmount(ObjectUtils.isEmpty(accidentalDriving.getSumAmount()) ? null : (int) Double.parseDouble(accidentalDriving.getSumAmount()));
+            carPolicySubInfo.setRiskName("全家安行保"); // 前端没传
+            carPolicySubInfo.setSumAmount(ObjectUtils.isEmpty(accidentalDriving.getSumAmount()) ? 2350000 : (int) Double.parseDouble(accidentalDriving.getSumAmount()));
             carPolicySubInfo.setQuantity(accidentalDriving.getQuantity() == 0 ? "0" : String.valueOf(accidentalDriving.getQuantity()));
             carPolicySubInfo.setIsUseInsured("1");
-            carPolicySubInfo.setSumPremium(ObjectUtils.isEmpty(accidentalDriving.getPremium()) ? null : (int) Double.parseDouble(accidentalDriving.getPremium()));
+            carPolicySubInfo.setSumPremium(ObjectUtils.isEmpty(accidentalDriving.getPremium()) ? 0 : (int) Double.parseDouble(accidentalDriving.getPremium()));
             carPolicySubInfoList.add(carPolicySubInfo);
         }
         return carPolicySubInfoList;
@@ -1630,7 +1628,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
 
         // 新能源标志, 0-燃油,1-新能源
         // carInfoVo.isNewEnergyMark() 这个字段前端没传无法判断
-        vehicleInfo.setNewEnergyFlag(EnergyTypeCode.ENERGY_TYPE_CODE_0.getCode().equals(carInfoVo.getEnergyTypeCode())? "0" : "1");
+        vehicleInfo.setNewEnergyFlag(EnergyTypeCode.ENERGY_TYPE_CODE_0.getCode().equals(carInfoVo.getEnergyTypeCode()) ? "0" : "1");
 
         vehicleInfo.setPower(carInfoVo.getPowerScale());
         vehicleInfo.setModelEnergyType(ObjectUtils.isEmpty(carInfoVo.getModelEnergyType()) ? ziJinCrawlerCarResponse.getVehicleModelInfoList().get(0).getPowerTypeCode() : carInfoVo.getModelEnergyType());
@@ -1652,7 +1650,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         vehicleInfo.setModelCode(modelCode);
 
         // 是否新车未上牌
-        vehicleInfo.setNoLicenseFlag("0".equals(carInfoVo.getIsRegistered()) ? "0" : "1");
+        vehicleInfo.setNoLicenseFlag("0" .equals(carInfoVo.getIsRegistered()) ? "0" : "1");
 
         vehicleInfo.setVehicleId("1");
         vehicleInfo.setVinNo(carInfoVo.getVinNo());
@@ -1661,7 +1659,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         vehicleInfo.setSeatCount(ObjectUtils.isEmpty(carInfoVo.getSeatCount()) ? 0 : Integer.parseInt(carInfoVo.getSeatCount()));
 
         // 使用性质代码
-        vehicleInfo.setUseNatureCode("02".equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
+        vehicleInfo.setUseNatureCode("02" .equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
         vehicleInfo.setOriCarKindName(carInfoVo.getCarTypeCode());
 
         // 平台车辆代码

+ 2 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/SysUserJzgAppServiceImpl.java

@@ -301,7 +301,6 @@ public class SysUserJzgAppServiceImpl extends ServiceImpl<SysUserJzgAppMapper, S
                 }
                 sysUserId = user.getId();
             }
-            // add by lipf 2026年6月9日15:16:39 向 sys_user_jzg_info_salesman 表中插入一条记录 
             // add by lipf 2026年6月9日15:16:39 向 sys_user_jzg_info_salesman 表中插入一条记录
             Map<String, String> stringStringMap = sysUserJzgInfoSalesmanService.queryAllTypeAttrMap();
             String typeAttrs = stringStringMap.getOrDefault(yqrInfo.getId(), "");
@@ -598,6 +597,7 @@ public class SysUserJzgAppServiceImpl extends ServiceImpl<SysUserJzgAppMapper, S
      * @param appUser
      */
     private void addRelationPerson(SysUserJzgApp sourceAppUser, SysUserJzgApp appUser) {
+        log.info("添加推荐人关系:sourceAppUser=[{}], appUser=[{}]", JSONUtil.toJsonStr(sourceAppUser), JSONUtil.toJsonStr(appUser));
         // 查询推荐人关系
         LambdaQueryWrapper<SysRelationPerson> wrapper = new LambdaQueryWrapper<>();
         wrapper.eq(SysRelationPerson::getSuggestId, sourceAppUser.getId())
@@ -608,6 +608,7 @@ public class SysUserJzgAppServiceImpl extends ServiceImpl<SysUserJzgAppMapper, S
         relationPerson.setSuggestId(appUser.getId());
         relationPerson.setSource(0);
         relationPerson.setType(0);
+        relationPerson.setSystemCode(sourceAppUser.getSystemCode());
         if (Objects.isNull(person)) {
             relationPerson.setSuggestLevel(1);
         } else {