Browse Source

Merge branch 'master' into wrq_dev

wangrq 3 months ago
parent
commit
d40c5cfa75

+ 2 - 2
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/component/DaJiaCrawlerRequestComponent.java

@@ -411,8 +411,8 @@ public class DaJiaCrawlerRequestComponent {
         }
         MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
         map.add("operatorCode",userCode);
-        String body = requestComponent.get(RequestUrl.POLICY_QUERY.getRequestUrl(daJiaCrawlerProperties.getBaseUrl()) + lastPolicyNo, map, "", String.class, headers);
-        String string1 = DESEncryption.decryptStrToObject(body, String.class);
+        DaJiaCrawlerBaseResponse response = requestComponent.get(RequestUrl.POLICY_QUERY.getRequestUrl(daJiaCrawlerProperties.getBaseUrl()) + lastPolicyNo, map, "", DaJiaCrawlerBaseResponse.class, headers);
+        String string1 = DESEncryption.decryptStrToObject(response.getResult(), String.class);
         log.info("返回数据:{}",string1);
     }
 }

+ 1 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/entity/request/DaJiaCrawlerCarRequest.java

@@ -70,7 +70,7 @@ public class DaJiaCrawlerCarRequest implements Serializable {
         this.engineNo = carInfoVo.getEngineNo();
         this.vin = carInfoVo.getVinNo();
         this.licensePlateNo = carInfoVo.getLicenseNo();
-        this.queryMod = carInfoVo.getLicenseKindCode();
+        this.queryMod = "1";
         this.operatorCode = operatorCode;
     }
 

+ 6 - 1
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.dajia.crawler.service.impl;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.po.SysUploadFiles;
@@ -151,8 +152,12 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         ProposalInfoDTO proposalInfoDTO = buildingAttributionInformation.build(parameters, userCode, headers);
         // 2.0 车型查询
         DaJiaCrawlerCarRequest daJiaCrawlerCarRequest = new DaJiaCrawlerCarRequest(quoteVo.getCarInfoVo(), parameters.getLoginCompany(), parameters.getCDptCde(), userCode);
+        log.info("车型查询参数:{}",JSONObject.toJSONString(daJiaCrawlerCarRequest));
         DaJiaCrawlerCarResponse daJiaCrawlerCarResponse = daJiaCrawlerRequestComponent.car(daJiaCrawlerCarRequest, headers);
-
+        if (CollectionUtil.isEmpty(daJiaCrawlerCarResponse.getList())){
+            daJiaCrawlerCarRequest.setQueryMod("2");
+            daJiaCrawlerCarResponse = daJiaCrawlerRequestComponent.car(daJiaCrawlerCarRequest, headers);
+        }
         // 2.1 匹配最符合的车型
         DaJiaCrawlerCarResponse.ListDTO listDTO = CarModelsFilterUtils.to(daJiaCrawlerCarResponse.getList(), quoteVo.getCarInfoVo());
         // 2.2 计算车辆折旧价格

+ 7 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/build/GuoRenCrawlerQuoteResultsVoBuild.java

@@ -59,13 +59,19 @@ public final class GuoRenCrawlerQuoteResultsVoBuild {
         quoteResultsVo.getCosts().setVvTax(vvTax);
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
 
+
+        quoteVo.getBiRiskInfoVo().setStartDate(calculationPremium.getCi().getPrptitemkindList().get(0).getStartDate() + " 00:00:00");
+        quoteVo.getBiRiskInfoVo().setEndDate(calculationPremium.getCi().getPrptitemkindList().get(0).getEndDate() + " 00:00:00");
         quoteResultsVo.setCiRiskInfoVo(quoteVo.getCiRiskInfoVo());
-        quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
 
         if (calculationPremium.getBi().getPrptitemkindList() != null) {
             List<KindInfoVo> kindInfoVo = buildKindInfoVo(quoteVo.getKindInfoVo(), calculationPremium.getBi().getPrptitemkindList());
+            quoteVo.getBiRiskInfoVo().setStartDate(calculationPremium.getBi().getPrptitemkindList().get(0).getStartDate() + " 00:00:00");
+            quoteVo.getBiRiskInfoVo().setEndDate(calculationPremium.getBi().getPrptitemkindList().get(0).getEndDate() + " 00:00:00");
             quoteResultsVo.setKindInfoVo(kindInfoVo);
         }
+        quoteResultsVo.setBiRiskInfoVo(quoteVo.getBiRiskInfoVo());
+
 
         QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
         scoreVo.setLossRation(calculationPremium.getBc().getAutoPriceOutputXOMRespVo().getStrBillELR2());

+ 57 - 2
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/constant/InsuranceKindCodeMapping.java

@@ -153,8 +153,13 @@ public class InsuranceKindCodeMapping {
     private static final Map<String, String> KIND_NAME_MAP = new HashMap<>();
     private static final Map<String, String> KIND_ENERGY_NAME_MAP = new HashMap<>();
 
+    /** 反向映射:人保险种代码 → 掌柜鼎平台险种代码 */
+    private static final Map<String, String> REVERSE_KIND_CODE_MAP = new HashMap<>();
+    /** 人保险种代码 → 险种名称 */
+    private static final Map<String, String> RB_CODE_NAME_MAP = new HashMap<>();
+
     static {
-        // 初始化险种代码映射
+        // 初始化险种代码映射(平台 → 人保)
         KIND_CODE_MAP.put(KIND_A, CODE_A);
         KIND_CODE_MAP.put(KIND_B, CODE_B);
         KIND_CODE_MAP.put(KIND_D3, CODE_D3);
@@ -169,7 +174,22 @@ public class InsuranceKindCodeMapping {
         KIND_CODE_MAP.put(KIND_TY3, CODE_TY3);
         KIND_CODE_MAP.put(KIND_TY4, CODE_TY4);
 
-        // 初始化险种名称映射
+        // 初始化反向映射(人保 → 平台)
+        REVERSE_KIND_CODE_MAP.put(CODE_A, KIND_A);
+        REVERSE_KIND_CODE_MAP.put(CODE_B, KIND_B);
+        REVERSE_KIND_CODE_MAP.put(CODE_D3, KIND_D3);
+        REVERSE_KIND_CODE_MAP.put(CODE_D4, KIND_D4);
+        REVERSE_KIND_CODE_MAP.put(CODE_L, KIND_L);
+        REVERSE_KIND_CODE_MAP.put(CODE_BD, KIND_BD);
+        REVERSE_KIND_CODE_MAP.put(CODE_YBW1, KIND_YBW1);
+        REVERSE_KIND_CODE_MAP.put(CODE_YBW3, KIND_YBW3);
+        REVERSE_KIND_CODE_MAP.put(CODE_YBW2, KIND_YBW2);
+        REVERSE_KIND_CODE_MAP.put(CODE_TY1, KIND_TY1);
+        REVERSE_KIND_CODE_MAP.put(CODE_TY2, KIND_TY2);
+        REVERSE_KIND_CODE_MAP.put(CODE_TY3, KIND_TY3);
+        REVERSE_KIND_CODE_MAP.put(CODE_TY4, KIND_TY4);
+
+        // 初始化险种名称映射(平台 → 名称)
         KIND_NAME_MAP.put(KIND_A, NAME_A);
         KIND_NAME_MAP.put(KIND_B, NAME_B);
         KIND_NAME_MAP.put(KIND_D3, NAME_D3);
@@ -184,6 +204,21 @@ public class InsuranceKindCodeMapping {
         KIND_NAME_MAP.put(KIND_TY3, NAME_TY3);
         KIND_NAME_MAP.put(KIND_TY4, NAME_TY4);
 
+        // 初始化人保编码 → 名称映射
+        RB_CODE_NAME_MAP.put(CODE_A, NAME_A);
+        RB_CODE_NAME_MAP.put(CODE_B, NAME_B);
+        RB_CODE_NAME_MAP.put(CODE_D3, NAME_D3);
+        RB_CODE_NAME_MAP.put(CODE_D4, NAME_D4);
+        RB_CODE_NAME_MAP.put(CODE_L, NAME_L);
+        RB_CODE_NAME_MAP.put(CODE_BD, NAME_BD);
+        RB_CODE_NAME_MAP.put(CODE_YBW1, NAME_YBW1);
+        RB_CODE_NAME_MAP.put(CODE_YBW3, NAME_YBW3);
+        RB_CODE_NAME_MAP.put(CODE_YBW2, NAME_YBW2);
+        RB_CODE_NAME_MAP.put(CODE_TY1, NAME_TY1);
+        RB_CODE_NAME_MAP.put(CODE_TY2, NAME_TY2);
+        RB_CODE_NAME_MAP.put(CODE_TY3, NAME_TY3);
+        RB_CODE_NAME_MAP.put(CODE_TY4, NAME_TY4);
+
         // 初始化新能源险种名称映射
         KIND_ENERGY_NAME_MAP.put(KIND_A, ENERGY_NAME_A);
         KIND_ENERGY_NAME_MAP.put(KIND_B, ENERGY_NAME_B);
@@ -202,6 +237,26 @@ public class InsuranceKindCodeMapping {
         return KIND_CODE_MAP.getOrDefault(kindCode, kindCode);
     }
 
+    /**
+     * 根据人保险种代码获取掌柜鼎平台险种代码(反向映射)
+     *
+     * @param rbKindCode 人保险种代码(如"051050")
+     * @return 平台险种代码(如"A"),未匹配则返回原值
+     */
+    public static String getPlatformKindCode(String rbKindCode) {
+        return REVERSE_KIND_CODE_MAP.getOrDefault(rbKindCode, rbKindCode);
+    }
+
+    /**
+     * 根据人保险种代码获取险种名称
+     *
+     * @param rbKindCode 人保险种代码(如"051050")
+     * @return 险种名称(如"车损险"),未匹配则返回原值
+     */
+    public static String getKindNameByRbCode(String rbKindCode) {
+        return RB_CODE_NAME_MAP.getOrDefault(rbKindCode, rbKindCode);
+    }
+
     /**
      * 根据掌柜险种代码获取险种名称
      */

+ 23 - 1
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java

@@ -18,6 +18,7 @@ import com.jzg.quotation.commons.entity.GetCaptchaResponse;
 import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
 import com.jzg.quotation.renbaonew.crawler.component.RenBaoNewCrawlerCacheComponent;
 import com.jzg.quotation.renbaonew.crawler.component.RenBaoNewCrawlerRequestComponent;
+import com.jzg.quotation.renbaonew.crawler.constant.InsuranceKindCodeMapping;
 import com.jzg.quotation.renbaonew.crawler.entity.RenBaoNewCrawlerConfigureParameters;
 import com.jzg.quotation.renbaonew.crawler.entity.bo.LoginInfoBO;
 import com.jzg.quotation.renbaonew.crawler.entity.response.*;
@@ -113,7 +114,7 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
         RenBaoNewCrawlerSaveResponse saveResponse = requestComponent.saveAsProposal(saveRequest, headers);
 
         // 4. 构建结果
-        QuoteResultsVo resultsVo = buildQuoteResultsVo(quoteVo, quoteRequest, saveResponse, headers, username);
+        QuoteResultsVo resultsVo = buildQuoteResultsVo(quoteVo, quoteRequest, quoteResponse, saveResponse, headers, username);
 
         // 5. 保存订单信息
         orderService.saveOrder(
@@ -726,6 +727,7 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
      * @return 报价结果VO
      */
     private QuoteResultsVo buildQuoteResultsVo(QuoteVo quoteVo, RenBaoNewCrawlerQuoteRequest quoteRequest,
+                                               RenBaoNewCrawlerQuoteResponse quoteResponse,
                                                RenBaoNewCrawlerSaveResponse saveResponse,
                                                HttpHeaders headers, String username) {
         QuoteResultsVo resultsVo = new QuoteResultsVo();
@@ -832,6 +834,26 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
             resultsVo.setCosts(costs);
         }
 
+        // 商业险种信息赋值:从报价响应的prpQitemKindVos中提取,人保kindCode转为平台编码
+        if (quoteResponse != null && quoteResponse.getData() != null
+                && quoteResponse.getData().getPrpQmain() != null
+                && quoteResponse.getData().getPrpQmain().getPrpQitemKindVos() != null) {
+            List<KindInfoVo> kindInfoVoList = new ArrayList<>();
+            for (RenBaoNewCrawlerQuoteResponse.PrpQitemKindVo item :
+                    quoteResponse.getData().getPrpQmain().getPrpQitemKindVos()) {
+                // 人保kindCode → 平台编码(如 051050 → A)
+                String platformKindCode = InsuranceKindCodeMapping.getPlatformKindCode(item.getKindCode());
+                for(KindInfoVo kindInfo :quoteVo.getKindInfoVo()){
+                    if(kindInfo.getKindCode().equals(platformKindCode)){
+                        kindInfo.setPremium(item.getPremium() != null ? String.valueOf(item.getPremium()) : null);
+                        kindInfo.setAmount(item.getAmount() != null ? String.valueOf(item.getAmount()) : null);
+                    }
+                }
+
+            }
+            resultsVo.setKindInfoVo(quoteVo.getKindInfoVo());
+        }
+
         // 获取评分
         if (!proposalNoDAA.isEmpty() || !proposalNoDZA.isEmpty()) {
             try {

+ 4 - 0
tenant/insurance/quotation-summary/src/main/resources/logback-spring.xml

@@ -6,6 +6,10 @@
         </encoder>
     </appender>
 
+    <!-- 屏蔽 MongoDB 驱动的 "Prematurely reached end of stream" 等连接池回收噪音日志 -->
+    <logger name="org.mongodb.driver" level="WARN"/>
+    <logger name="com.mongodb" level="WARN"/>
+
     <appender name="GRAYLOG" class="de.siegmar.logbackgelf.GelfTcpAppender">
         <graylogHost>192.168.5.250</graylogHost>
 <!--        <graylogHost>172.24.144.227</graylogHost>-->

+ 13 - 5
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java

@@ -14,6 +14,7 @@ import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerQuotation
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerRiskManagementResponse;
 import lombok.extern.slf4j.Slf4j;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -200,11 +201,18 @@ public class TaiShanCrawlerQuoteResultsVoBuild {
             // 设置车船税
             quoteResultsVo.getCosts().setVvTax(String.valueOf(saveResponse.getResult().getCompulsoryInsurance().getCarShipTax().getSumTax()));
         }
-        // 设置非车险(驾意险)保费
-//        QuotationResponse.DataDTO.UnAutoPremiumDTO unAutoPremium = quotationResponse.getData().getUnAutoPremium();
-//        if (saveResponse.getResult(). != null) {
-//            quoteResultsVo.getCosts().setNiPremium(unAutoPremium.getPremium());
-//        }
+        //设置非车险(驾意险)保费
+        if (Objects.nonNull(saveResponse.getResult().getDiInsurance())) {
+            quoteResultsVo.getCosts().setNiPremium(saveResponse.getResult().getDiInsurance().getPremium());
+        }
+        // 设置总费用
+        BigDecimal bi = quoteResultsVo.getCosts().getBiPremium() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getBiPremium());
+        BigDecimal ci = quoteResultsVo.getCosts().getCiPremium() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getCiPremium());
+        BigDecimal vv = quoteResultsVo.getCosts().getVvTax() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getVvTax());
+        BigDecimal ni = quoteResultsVo.getCosts().getNiPremium() == null ? BigDecimal.ZERO : new BigDecimal(quoteResultsVo.getCosts().getNiPremium());
+
+        BigDecimal total = bi.add(ci).add(vv).add(ni);
+        quoteResultsVo.getCosts().setSumPremium(total.toPlainString());
     }
 
     private static String convertRenewalFlag(String renewalFlag) {

+ 104 - 87
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerCacheComponent.java

@@ -2,13 +2,17 @@ package com.jzg.quotation.zhongan.crawler.component;
 
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.zhongan.crawler.client.LoginResult;
 import com.jzg.quotation.zhongan.crawler.entity.request.ZhongAnCrawlerQueryInitInfoRequest;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerPaymentResponse;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerUploadInitDateResponse;
+import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
 import org.apache.hc.core5.net.URIBuilder;
 import org.apache.http.Header;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -26,6 +30,7 @@ import org.springframework.stereotype.Component;
 import java.net.URI;
 import java.time.Duration;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -111,107 +116,119 @@ public class ZhongAnCrawlerCacheComponent {
         return JSON.parseObject(bucket1.get(), ZhongAnCrawlerPaymentResponse.ValueDTO.DatasDTO.InitInfoDTO.class);
     }
 
-    //登录
-    private static final CloseableHttpClient HTTP_CLIENT =HttpClients.custom().disableRedirectHandling().build(); // 关闭自动重定向
+    private static final OkHttpClient session = new OkHttpClient.Builder()
+            .followRedirects(false)
+            .build();
 
-    // 正则表达式 获取cookie、flowId
-    private static final Pattern ZA_COOKIE_PATTERN = Pattern.compile("zaLoginCookieKey=(.*?);");
-    private static final Pattern FLOW_ID_PATTERN = Pattern.compile("flowId=(.*?)&");
-
-    // 构造 GET 请求
-    private HttpGet buildGet(URI uri) {
-        HttpGet get = new HttpGet(uri);
-        get.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36");
-        get.setHeader("Accept", "application/json, text/plain, */*");
-        return get;
-    }
-
-    // 获取重定向 Location
-    private String getLocationHeader(CloseableHttpResponse response) {
-        Header header = response.getLastHeader("Location");
-        return header != null ? header.getValue() : "";
-    }
+    private static final ObjectMapper objectMapper = new ObjectMapper();
     public LoginResult loginCookieCache(String zhongAnId,String productId) {
-        HttpClientContext context = HttpClientContext.create();
         try {
-            String firstUrl = "http://zhongan.bjhfbx.cn/subao-proxy-customer/api/redirectToCoopUserProductExclusivePage";
-            URI uri1 = new URIBuilder(firstUrl)
-                    .addParameter("coopUserId", zhongAnId)
-                    .addParameter("productId", productId)
-                    .addParameter("isOpenByPC", "N")
-                    .addParameter("promotionScene", "16")
-                    .addParameter("bizContent", "")
-                    .addParameter("insurePlaceCode", "140100")
+            // ========== 第一步 POST 请求 ==========
+            Headers.Builder postHeaderBuilder = new Headers.Builder();
+            postHeaderBuilder.add("Accept-Language", "zh-CN,zh;q=0.9");
+            postHeaderBuilder.add("Connection", "keep-alive");
+            postHeaderBuilder.add("Content-Type", "application/json");
+            postHeaderBuilder.add("Host", "www.yuanqingtech.com");
+            postHeaderBuilder.add("Referer", "https://servicewechat.com/wx46d2e1aaa28335ea/47/page-frame.html");
+            postHeaderBuilder.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf2541a1f) XWEB/19921");
+            postHeaderBuilder.add("accessKey", "");
+            postHeaderBuilder.add("appCode", "");
+            postHeaderBuilder.add("channel", "");
+            postHeaderBuilder.add("openIdToken", "");
+            postHeaderBuilder.add("platform", "MINI_WECHAT");
+            postHeaderBuilder.add("t", "ios");
+            postHeaderBuilder.add("unionId", "");
+            postHeaderBuilder.add("wxSDKVersion", "3.16.1");
+            postHeaderBuilder.add("wxVersion", "4.1.10.31");
+            postHeaderBuilder.add("xweb_xhr", "1");
+            postHeaderBuilder.add("zaLoginCookieKey", "");
+
+            Headers postHeaders = postHeaderBuilder.build();
+
+            String urlPost = "https://www.yuanqingtech.com/dmapi/dm-innovation-front/api/config-info/findIssuingLink";
+
+            FirstReqData reqData = new FirstReqData();
+            reqData.setInviterAccountId(zhongAnId);
+            reqData.setActivityCode(productId);
+
+            String jsonBody = objectMapper.writeValueAsString(reqData);
+            RequestBody body = RequestBody.create(jsonBody, MediaType.get("application/json; charset=utf-8"));
+            Request postReq = new Request.Builder()
+                    .url(urlPost)
+                    .headers(postHeaders)
+                    .post(body)
                     .build();
-            // 发送第一个请求,不跟随重定向
-            HttpGet get1 = buildGet(uri1);
-            CloseableHttpResponse resp1 = HTTP_CLIENT.execute(get1, context);
-            AssertionUtils.isEmpty(resp1, "第一次请求失败,请联系管理员");
-            String location1 = resp1.getFirstHeader("Location").getValue();
-            resp1.close();
-            // 发送第二个请求
-            HttpGet get2 = buildGet(new URI(location1));
-            CloseableHttpResponse resp2 = HTTP_CLIENT.execute(get2, context);
-            AssertionUtils.isEmpty(resp2, "第二次请求失败,请联系管理员");
-            String location2 = getLocationHeader(resp2);
-            resp2.close();
-            // 发送第三个请求
-            HttpGet get3 = buildGet(new URI(location2));
-            CloseableHttpResponse resp3 = HTTP_CLIENT.execute(get3, context);
-            AssertionUtils.isEmpty(resp3, "第三次请求失败,请联系管理员");
-            String location3 = resp3.getFirstHeader("Location").getValue();
-            resp3.close();
-            // 发送第四个请求
-            HttpGet get4 = buildGet(new URI(location3));
-            CloseableHttpResponse resp4 = HTTP_CLIENT.execute(get4, context);
-            AssertionUtils.isEmpty(resp4, "第四次请求失败,请联系管理员");
-            String location4 = resp4.getFirstHeader("Location").getValue();
-            resp4.close();
-            // 第五次请求,拿cookie
-            HttpGet get5 = buildGet(new URI(location4));
-            CloseableHttpResponse resp5 = HTTP_CLIENT.execute(get5, context);
-            AssertionUtils.isEmpty(resp5, "第五次请求失败,请联系管理员");
-            String location5 = resp5.getFirstHeader("Location").getValue();
-            // 提取 zaLoginCookieKey
-            String cookieKey = null;
-            if (resp5.getHeaders("Set-Cookie") != null) {
-                for (org.apache.http.Header h : resp5.getHeaders("Set-Cookie")) {
-                    Matcher m = ZA_COOKIE_PATTERN.matcher(h.getValue());
-                    if (m.find()) {
-                        cookieKey = m.group(1).trim();
-                        break;
-                    }
-                }
-            }
-            resp5.close();
 
-            if (cookieKey == null || cookieKey.isEmpty()) {
+            Response postResp = session.newCall(postReq).execute();
+            String respBody = postResp.body().string();
+            postResp.close();
+
+            JsonNode root = objectMapper.readTree(respBody);
+            JsonNode valueNode = root.path("value");
+            if (!valueNode.isArray() || valueNode.size() == 0) {
                 return new LoginResult(400, "账号错误", null, null);
             }
 
-            // 提取 flowId
-            Matcher flowMatcher = FLOW_ID_PATTERN.matcher(location5);
-            String flowId = flowMatcher.find() ? flowMatcher.group(1).trim() : "";
-
-            String finalUrl = "https://c.zhongan.com/insure/index.html";
-            URI finalUri = new URIBuilder(finalUrl)
-                    .addParameter("flowId", flowId)
-                    .addParameter("i", "e")
-                    .addParameter("insurePlaceCode", "140100")
-                    .addParameter("newPage", "1")
+            String linkUrl = valueNode.get(0).path("link").asText("");
+            Headers.Builder getHeaderBuilder = new Headers.Builder();
+            getHeaderBuilder.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7");
+            getHeaderBuilder.add("Accept-Encoding", "gzip, deflate, br");
+            getHeaderBuilder.add("Accept-Language", "zh-CN,zh;q=0.9");
+            getHeaderBuilder.add("Connection", "keep-alive");
+            getHeaderBuilder.add("Host", "c.zhongan.com");
+            getHeaderBuilder.add("Sec-Fetch-Dest", "document");
+            getHeaderBuilder.add("Sec-Fetch-Mode", "navigate");
+            getHeaderBuilder.add("Sec-Fetch-Site", "none");
+            getHeaderBuilder.add("Sec-Fetch-User", "?1");
+            getHeaderBuilder.add("Upgrade-Insecure-Requests", "1");
+            getHeaderBuilder.add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090a13) UnifiedPCWindowsWechat(0xf2541a1f) XWEB/19921 miniProgram/wx46d2e1aaa28335ea");
+
+            Headers getHeaders = getHeaderBuilder.build();
+            Request getReq = new Request.Builder()
+                    .url(linkUrl)
+                    .headers(getHeaders)
+                    .get()
                     .build();
 
-            HttpGet finalGet = buildGet(finalUri);
-            finalGet.setHeader("Cookie", "zaLoginCookieKey=" + cookieKey);
-            CloseableHttpResponse finalResp = HTTP_CLIENT.execute(finalGet, context);
-            finalResp.close();
-            cacheCookie(cookieKey, flowId, zhongAnId);
-            return new LoginResult(200, "登录成功", cookieKey, flowId);
+            Response getResp = session.newCall(getReq).execute();
+            String flowIdUrl = getResp.header("Location", "");
+            getResp.close();
+
+            Pattern flowPattern = Pattern.compile("flowId=(.*?)&");
+            Matcher flowMatcher = null;
+            if (flowIdUrl != null) {
+                flowMatcher = flowPattern.matcher(flowIdUrl);
+            }
+            String flowId = "";
+            if (flowMatcher.find()) {
+                flowId = flowMatcher.group(1);
+            }
+            String zaLoginCookieKey = "";
+            List<String> setCookieList = getResp.headers("Set-Cookie");
+            for (String cookie : setCookieList) {
+                Pattern cookiePattern = Pattern.compile("zaLoginCookieKey=(.*?);", Pattern.DOTALL);
+                Matcher cookieMatcher = cookiePattern.matcher(cookie);
+                if (cookieMatcher.find()) {
+                    zaLoginCookieKey = cookieMatcher.group(1);
+                }
+            }
+            cacheCookie(zaLoginCookieKey, flowId, zhongAnId);
+            return new LoginResult(200, "登录成功", zaLoginCookieKey, flowId);
         } catch (Exception e) {
             e.printStackTrace();
             return new LoginResult(400, "登录异常:" + e.getMessage(), null, null);
         }
     }
 
-
+    @Data
+    public static class FirstReqData {
+        private String bizOrigin = "CAR_ZYHS_XXSYTG";
+        private String inviterAccountId;
+        private String activityCode;
+        private BizParams bizParams = new BizParams();
+    }
+    @Data
+    public static class BizParams {
+        private final String insurePlaceCode = "140100";
+    }
 }