Selaa lähdekoodia

泰康财险保司业务流程对接代码调整

wangrq 3 kuukautta sitten
vanhempi
commit
f41ac61294
27 muutettua tiedostoa jossa 489 lisäystä ja 186 poistoa
  1. 5 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java
  2. 31 0
      commons/src/main/java/com/jzg/commons/util/DateTimeUtils.java
  3. 83 0
      commons/src/main/java/com/jzg/commons/util/ImageUtil.java
  4. 1 0
      gateway/src/main/java/com/jzg/config/CorsConfig.java
  5. 6 6
      tenant/insurance/quotation-summary/pom.xml
  6. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java
  7. 1 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  8. 6 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/converter/QuoteInfoConverter.java
  9. 16 4
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  10. 1 1
      tenant/insurance/quotation-taikang/pom.xml
  11. 1 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/client/HttpURL.java
  12. 10 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/CarModelinfoQueryResult.java
  13. 10 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/CarTypeResult.java
  14. 5 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/LoginResult.java
  15. 2 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/TKEntranceFor000021Result.java
  16. 1 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/TKEntranceFor000086Param.java
  17. 2 2
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/TKEntranceFor000086Result.java
  18. 13 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKAgent.java
  19. 5 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCar.java
  20. 9 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCarModel.java
  21. 8 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKCarOwnerVo.java
  22. 15 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKInsurerInfoVo.java
  23. 5 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/entity/TKOther.java
  24. 49 24
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java
  25. 9 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java
  26. 57 40
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/impl/TKQuotationBaseServiceImpl.java
  27. 137 104
      tenant/insurance/quotation-taikang/src/test/java/com/jzg/quotation/taikang/crawler/TKHttpAPIServiceTest1.java

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/quote/vo/CarInfoVo.java

@@ -270,6 +270,11 @@ public class CarInfoVo implements Serializable {
      */
     private String chgOwnerFlag;
 
+    /**
+     * 车身颜色 010-黑色
+     */
+    private String colorCode;
+
     /**
      * 获取 吨位数/核定载质量
      *

+ 31 - 0
commons/src/main/java/com/jzg/commons/util/DateTimeUtils.java

@@ -53,4 +53,35 @@ public class DateTimeUtils {
         return LocalDate.now().minusDays(1).format(DATE_FORMATTER);
     }
 
+    /**
+     * 根据  年月日 小时 分钟 获取完整日期
+     * @param dateStr yyyy-MM-dd
+     * @param hourStr HH
+     * @param minuteStr mm
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    public static String convertToDateTime(String dateStr, String hourStr, String minuteStr) {
+        // 日期非空判断
+        if (dateStr == null || dateStr.trim().isEmpty()) {
+            return null;
+        }
+
+        // 小时和分钟默认为00
+        String hour = (hourStr == null || hourStr.trim().isEmpty()) ? "00" : hourStr.trim();
+        String minute = (minuteStr == null || minuteStr.trim().isEmpty()) ? "00" : minuteStr.trim();
+
+        LocalDate date = LocalDate.parse(dateStr);
+        int h = Integer.parseInt(hour);
+        int m = Integer.parseInt(minute);
+
+        LocalDateTime dateTime;
+        if (h == 24 && m == 0) {
+            // 24:00 转换为当天 23:59:59
+            dateTime = date.atTime(23, 59, 59);
+        } else {
+            dateTime = date.atTime(h, m, 0);
+        }
+        return dateTime.format(DateTimeFormatter.ofPattern(pattern));
+    }
+
 }

+ 83 - 0
commons/src/main/java/com/jzg/commons/util/ImageUtil.java

@@ -3,6 +3,8 @@ package com.jzg.commons.util;
 import javax.imageio.ImageIO;
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Base64;
 
@@ -33,4 +35,85 @@ public class ImageUtil {
         }
     }
 
+
+    /**
+     * 将 Base64 编码的图片字符串转换为 File 对象
+     *
+     * @param base64String Base64 编码的图片字符串
+     * @param fileName 文件名(不含扩展名)
+     * @return 转换后的 File 对象
+     * @throws Exception 转换失败时抛出异常
+     */
+    public static File convertBase64ToFile(String base64String, String fileName) throws Exception {
+        if (base64String == null || base64String.isEmpty()) {
+            throw new IllegalArgumentException("Base64 字符串不能为空");
+        }
+
+        // 如果 Base64 字符串包含 data URI 前缀(如 "data:image/png;base64,"),则移除它
+        if (base64String.contains(",")) {
+            base64String = base64String.split(",")[1];
+        }
+
+        // 解码 Base64 字符串为字节数组
+        byte[] imageBytes = Base64.getDecoder().decode(base64String.trim());
+
+        // 检测图片格式(根据魔数判断)
+        String extension = detectImageFormat(imageBytes);
+
+        // 创建临时文件
+        File tempFile = File.createTempFile("base64_" + fileName + "_", extension);
+        tempFile.deleteOnExit();
+
+        // 将字节数组写入临时文件
+        try (FileOutputStream fos = new FileOutputStream(tempFile)) {
+            fos.write(imageBytes);
+            fos.flush();
+        }
+
+        // log.info("Base64 转 File 成功: {}, 大小: {} bytes, 格式: {}", fileName, imageBytes.length, extension);
+        return tempFile;
+    }
+
+    /**
+     * 根据图片字节数组检测图片格式
+     *
+     * @param imageBytes 图片字节数组
+     * @return 图片扩展名(如 .jpg, .png, .gif 等)
+     */
+    public static String detectImageFormat(byte[] imageBytes) {
+        if (imageBytes == null || imageBytes.length < 4) {
+            return ".jpg"; // 默认返回 jpg
+        }
+
+        // JPEG: FF D8 FF
+        if (imageBytes[0] == (byte) 0xFF && imageBytes[1] == (byte) 0xD8 && imageBytes[2] == (byte) 0xFF) {
+            return ".jpg";
+        }
+
+        // PNG: 89 50 4E 47
+        if (imageBytes[0] == (byte) 0x89 && imageBytes[1] == (byte) 0x50 &&
+                imageBytes[2] == (byte) 0x4E && imageBytes[3] == (byte) 0x47) {
+            return ".png";
+        }
+
+        // GIF: 47 49 46 38
+        if (imageBytes[0] == 'G' && imageBytes[1] == 'I' &&
+                imageBytes[2] == 'F' && imageBytes[3] == '8') {
+            return ".gif";
+        }
+
+        // BMP: 42 4D
+        if (imageBytes[0] == (byte) 0x42 && imageBytes[1] == (byte) 0x4D) {
+            return ".bmp";
+        }
+
+        // WEBP: RIFF....WEBP
+        if (imageBytes[0] == 'R' && imageBytes[1] == 'I' &&
+                imageBytes[2] == 'F' && imageBytes[3] == 'F') {
+            return ".webp";
+        }
+
+        return ".jpg"; // 默认返回 jpg
+    }
+
 }

+ 1 - 0
gateway/src/main/java/com/jzg/config/CorsConfig.java

@@ -41,6 +41,7 @@ public class CorsConfig {
         corsConfiguration.addAllowedOrigin("http://192.168.0.20:9002");
         corsConfiguration.addAllowedOrigin("http://192.168.0.20:81");
         corsConfiguration.addAllowedOrigin("http://192.168.0.59:9000");
+        corsConfiguration.addAllowedOrigin("http://192.168.1.61:9000");
         // 允许的方法
         corsConfiguration.addAllowedMethod("*");
         // 允许的头信息

+ 6 - 6
tenant/insurance/quotation-summary/pom.xml

@@ -64,18 +64,18 @@
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
+        <dependency>
+            <groupId>com.jzg</groupId>
+            <artifactId>quotation-taikang</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <scope>compile</scope>
+        </dependency>
         <dependency>
             <groupId>com.jzg</groupId>
             <artifactId>quotation-yangguang</artifactId>
             <version>1.0-SNAPSHOT</version>
             <scope>compile</scope>
         </dependency>
-<!--        <dependency>-->
-<!--            <groupId>com.jzg</groupId>-->
-<!--            <artifactId>quotation-taikang</artifactId>-->
-<!--            <version>1.0-SNAPSHOT</version>-->
-<!--            <scope>compile</scope>-->
-<!--        </dependency>-->
         <dependency>
             <groupId>com.jzg</groupId>
             <artifactId>quotation-guoren</artifactId>

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java

@@ -32,7 +32,7 @@ public class AsyncGetPayLink {
     @Async("asyncTaskExecutor")
     public void paymentLink(QuotationBaseService quoteService,OrderBase order, String companyCode ){
         try {
-            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode)){
+            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)){
                 PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
                 paymentLinkVo.setOrder(order);
                 CompletableFuture<PaymentLinkResultsVo> future = CompletableFuture.completedFuture(doUpdatePaymentLink(paymentLinkVo, quoteService));

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

@@ -519,6 +519,7 @@ public class UnifyOrderManager {
 
         UnderwritingResultsVo underwritingResultsVo = quoteService.underwriting(underwritingVo);
         underwritingResultsVo.setOrdersNo(insOrders.getId());
+        underwritingVo.getOrder().setCompanyOrderNo(underwritingResultsVo.getCompanyOrderNo());
         // 保存核保结果
         insOrdersService.orderAfterUpdateUnderwriting(underwritingResultsVo);
 

+ 6 - 4
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/converter/QuoteInfoConverter.java

@@ -97,10 +97,12 @@ public class QuoteInfoConverter {
                 .collect(Collectors.toMap(QuoteRuleMapping::getPlatformCode, x -> x));
         kindInfoVo.forEach(kind -> {
             QuoteRuleMapping quoteRuleMapping = ruleMappingMap.get(kind.getKindCode());
-            kind.setKindCode(quoteRuleMapping.getRuleCode());
-            kind.setKindName(quoteRuleMapping.getRuleName());
-            kind.setPlatformKindCode(quoteRuleMapping.getPlatformCode());
-            kind.setPlatformKindName(quoteRuleMapping.getRuleName());
+            if (quoteRuleMapping != null) {
+                kind.setKindCode(quoteRuleMapping.getRuleCode());
+                kind.setKindName(quoteRuleMapping.getRuleName());
+                kind.setPlatformKindCode(quoteRuleMapping.getPlatformCode());
+                kind.setPlatformKindName(quoteRuleMapping.getRuleName());
+            }
         });
     }
 

+ 16 - 4
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -746,12 +746,24 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             if (Objects.nonNull(insOrdersRiskList) && !insOrdersRiskList.isEmpty()) {
                 for (InsOrdersRisk insOrdersRisk : insOrdersRiskList) {
                     if (insOrdersRisk.getRiskCode().equals(InsuranceRisk.TRAFFIC.getCode())) {
-                        insOrdersRisk.setStartDate(LocalDateTime.parse(quoteResponse.getCiRiskInfoVo().getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-                        insOrdersRisk.setEndDate(LocalDateTime.parse(quoteResponse.getCiRiskInfoVo().getEndDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        String ciStartDate = quoteResponse.getCiRiskInfoVo() != null ? quoteResponse.getCiRiskInfoVo().getStartDate() : null;
+                        String ciEndDate = quoteResponse.getCiRiskInfoVo() != null ? quoteResponse.getCiRiskInfoVo().getEndDate() : null;
+                        if (ciStartDate != null && !ciStartDate.isEmpty()) {
+                            insOrdersRisk.setStartDate(LocalDateTime.parse(ciStartDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        }
+                        if (ciEndDate != null && !ciEndDate.isEmpty()) {
+                            insOrdersRisk.setEndDate(LocalDateTime.parse(ciEndDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        }
                     }
                     if (insOrdersRisk.getRiskCode().equals(InsuranceRisk.BUSINESS.getCode())) {
-                        insOrdersRisk.setStartDate(LocalDateTime.parse(quoteResponse.getBiRiskInfoVo().getStartDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
-                        insOrdersRisk.setEndDate(LocalDateTime.parse(quoteResponse.getBiRiskInfoVo().getEndDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        String biStartDate = quoteResponse.getBiRiskInfoVo() != null ? quoteResponse.getBiRiskInfoVo().getStartDate() : null;
+                        String biEndDate = quoteResponse.getBiRiskInfoVo() != null ? quoteResponse.getBiRiskInfoVo().getEndDate() : null;
+                        if (biStartDate != null && !biStartDate.isEmpty()) {
+                            insOrdersRisk.setStartDate(LocalDateTime.parse(biStartDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        }
+                        if (biEndDate != null && !biEndDate.isEmpty()) {
+                            insOrdersRisk.setEndDate(LocalDateTime.parse(biEndDate, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+                        }
                     }
                 }
             }

+ 1 - 1
tenant/insurance/quotation-taikang/pom.xml

@@ -5,7 +5,7 @@
         <groupId>com.jzg</groupId>
         <artifactId>insurance</artifactId>
         <version>1.0-SNAPSHOT</version>
-        <relativePath>../../pom.xml</relativePath>
+<!--        <relativePath>../../pom.xml</relativePath>-->
     </parent>
     <artifactId>quotation-taikang</artifactId>
 

+ 1 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/client/HttpURL.java

@@ -95,6 +95,7 @@ public interface HttpURL {
      * 000133:获取验车码
      * 000021:好像是查询团车详情
      * 000038:下单。大概是保险单下单的意思。
+     * 000052: 提交核保信息
      */
     String entrance = host + "/carSelfService/rest/controller/entrance";
 

+ 10 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/CarModelinfoQueryResult.java

@@ -48,6 +48,11 @@ public class CarModelinfoQueryResult extends UnknownFieldEntity {
 
     private String orderID;
 
+    /**
+     * 颜色代码
+     */
+    private String colorCode;
+
     @Override
     protected void addChildUnknownFields() {
         addChildUnknownField("carInfoDto", carInfoDto);
@@ -139,6 +144,11 @@ public class CarModelinfoQueryResult extends UnknownFieldEntity {
         private String transferDate;
 
         private String engineModel;
+
+        /**
+         * 车身颜色编码
+         */
+        private String bodyColor;
     }
 
     @Setter

+ 10 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/CarTypeResult.java

@@ -24,6 +24,16 @@ public class CarTypeResult extends UnknownFieldEntity {
          * 当接口返回类型为 CarTypeResult 时,这个字段的数据会不能获取到。
          */
         private String passengerSeat;
+
+        /**
+         * 颜色代码显示标志
+         */
+        private String colorCodeDisplayFlag;
+
+        /**
+         * 确认车辆信息时,是否需要填写车辆识别码
+         */
+        private String frameNoConfirmModelAreaFlag;
     }
 
     /**

+ 5 - 0
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/model/api/LoginResult.java

@@ -52,6 +52,11 @@ public class LoginResult extends UnknownFieldEntity {
      */
     private String token;
 
+    /**
+     * carssToken
+     */
+    private String carssToken;
+
     @Getter
     @Setter
     public static class WebsysUserVo extends UnknownFieldEntity {

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

@@ -179,6 +179,8 @@ public class TKEntranceFor000021Result extends UnknownFieldEntity {
             private String name;
             @JsonProperty("identifyType")
             private String identifyType;
+            @JsonProperty("authResult")
+            private String authResult;
         }
 
         @NoArgsConstructor

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

@@ -14,4 +14,5 @@ public class TKEntranceFor000086Param extends OrderRequest {
     private String isAgentFlag;
     private String proposalNo;
     private String userType;
+    private String userId;
 }

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

@@ -188,7 +188,7 @@ public class TKEntranceFor000086Result extends UnknownFieldEntity {
     /**
      * 车税信息
      */
-    //private TKCarTax carTax;
+    private TKCarTax carTax;
 
     /**
      * 需求编号
@@ -220,7 +220,7 @@ public class TKEntranceFor000086Result extends UnknownFieldEntity {
         addChildUnknownField("insurerInfoVo", insurerInfoVo);
         addChildUnknownField("invoiceInfo", invoiceInfo);
         addChildUnknownField("carOwnerVo", carOwnerVo);
-        //addChildUnknownField("carTax", carTax);
+        addChildUnknownField("carTax", carTax);
         addChildUnknownField("orderInfoVoBZ", orderInfoVoBZ);
     }
 }

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

@@ -79,4 +79,17 @@ public class TKAgent extends UnknownFieldEntity {
      * “车型查询接口”的参数有此值,来自 AgentFuzzyResult 的 intermediaryName。
      */
     private String intermediaryName;
+
+    /**
+     * 可能用于标识某种业务分类或渠道类型
+     */
+    private String hwpType;
+
+    /**
+     * 姓名,可能是代理人的真实姓名或其他相关人员的姓名
+     */
+    private String name;
+    private String aracde;
+    private String aracdename;
+
 }

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

@@ -433,6 +433,11 @@ public class TKCar extends UnknownFieldEntity {
      */
     private String isRenovate;
 
+    /**
+     * 车辆颜色代码
+     */
+    private String colorCode;
+
     @Override
     protected void addChildUnknownFields() {
         addChildUnknownField("carModel", carModel);

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

@@ -111,6 +111,15 @@ public class TKCarModel extends UnknownFieldEntity implements CarModelsFilter {
     private String industryModelCode;
 
     private String vehicleStyleUniqueId;
+    /**
+     * 车辆类型
+     */
+    private String vehicleType;
+
+    /**
+     * 车辆类型名称
+     */
+    private String vehicleTypeCname;
 
     @Override
     protected void addChildUnknownFields() {

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

@@ -110,4 +110,12 @@ public class TKCarOwnerVo extends UnknownFieldEntity {
      * 抓包查到保存时没有此字段
      */
     private String carOwnerName;
+
+    /**
+     * 是否可查看手机号
+     *
+     * 1:可查看
+     * 0:不可查看
+     */
+    private String canViewPhoneNo;
 }

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

@@ -98,6 +98,11 @@ public class TKInsurerInfoVo extends UnknownFieldEntity {
          * 证件类型代码
          */
         private String identifyType;
+
+        /**
+         * 是否可查看手机号
+         */
+        private  String canViewPhoneNo;
     }
 
     @Setter
@@ -143,6 +148,11 @@ public class TKInsurerInfoVo extends UnknownFieldEntity {
          * 证件类型
          */
         private String certificateType;
+
+        /**
+         * 是否可查看手机号
+         */
+        private String canViewPhoneNo;
     }
 
     @Setter
@@ -203,5 +213,10 @@ public class TKInsurerInfoVo extends UnknownFieldEntity {
          * 被保险人姓名
          */
         private String insuredName;
+
+        /**
+         * 是否可查看手机号
+         */
+        private String canViewPhoneNo;
     }
 }

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

@@ -87,4 +87,9 @@ public class TKOther extends UnknownFieldEntity {
      */
     private String fromID;
 
+    /**
+     * 车主变更信息
+     */
+    private String vehicleOwnerMessage;
+
 }

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

@@ -96,7 +96,7 @@ public class TKHttpAPIService {
      * 2.1 好像可以不用通过登录,写死此值,绕过登录接口。
      * 2.2 没有登录,也没有临时 token 的情况下,仅使用此参数可以获取正式 token。
      *
-     * @param token 初次时为 null
+     * @param token       初次时为 null
      * @param tplatformId 初次时为 null
      * @return
      */
@@ -322,15 +322,17 @@ public class TKHttpAPIService {
         param.setAgentCode(agentCode);
 
         HttpHeaders httpHeaders = new HttpHeaders();
-        httpHeaders.add("tkCarRequestToken", token);
+        httpHeaders.add("tkcarrequesttoken", token);
+        httpHeaders.add("carInsurFlowId", "carInsur1778568776607661015");
+        httpHeaders.add("carInsurOrderId", orderId);
 
-        TKAgentQueryResult.Response response = client.request(HttpURL.agentQuery, param, httpHeaders, TKAgentQueryResult.Response.class);
+        StringResponse response = client.request(HttpURL.agentQuery, param, httpHeaders, StringResponse.class);
 
-        checkResponseUnknownField(response);
+        TKAgentQueryResult decrypt = decrypt(response, TKAgentQueryResult.class);
 
-        TKAgentQueryResult data = response.getData();
+        checkResponseUnknownField(decrypt);
 
-        return data;
+        return decrypt;
     }
 
     /**
@@ -410,7 +412,7 @@ public class TKHttpAPIService {
      *
      * @return
      */
-    public CarModelinfoQueryResult carModelinfoQuery(TKLoginSession session,String mainOrderId, CarModelinfoQueryParam param) {
+    public CarModelinfoQueryResult carModelinfoQuery(TKLoginSession session, String mainOrderId, CarModelinfoQueryParam param) {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkcarrequesttoken", session.getToken());
 
@@ -455,7 +457,6 @@ public class TKHttpAPIService {
         }
 
 
-
         // 投保人信息
         SaveBasicInfoParam.InsureInfo insureInfo = new SaveBasicInfoParam.InsureInfo();
         insureInfo.setAppliInfo(new SaveBasicInfoParam.AppliInfo());
@@ -495,8 +496,8 @@ public class TKHttpAPIService {
             CodeUtil.autoSetter(car::setBrandName, commonCarInfoVo::getBrandName, tkCarModel::getModelName); // todo 与 tkCarModel.getModelName() 重复
 
             car.setSeatFlag("1"); // todo
-            car.setExhaustScale(tkCarModel.getDisplacement().substring(0,tkCarModel.getDisplacement().indexOf(".")));
-            car.setPurchasePrice(tkCarModel.getPurchasePrice().substring(0,tkCarModel.getPurchasePrice().indexOf(".")));
+            car.setExhaustScale(tkCarModel.getDisplacement().substring(0, tkCarModel.getDisplacement().indexOf(".")));
+            car.setPurchasePrice(tkCarModel.getPurchasePrice().substring(0, tkCarModel.getPurchasePrice().indexOf(".")));
 //            car.setVinNo(commonCarInfoVo.getVinNo());
 //            car.setEngineNo(commonCarInfoVo.getEngineNo());
 //            car.setEnrollDate(commonCarInfoVo.getRegisterDate());
@@ -531,13 +532,13 @@ public class TKHttpAPIService {
             } else if (vehicleUseCode.equals(VehicleUseCode.VEHICLE_USE_CODE_01.getCode())) {
                 // 01 营业出租租赁 = 9 营业
                 car.setUseNatureCodeCode("9");
-            }  else if (vehicleUseCode.equals(VehicleUseCode.VEHICLE_USE_CODE_02.getCode())) {
+            } else if (vehicleUseCode.equals(VehicleUseCode.VEHICLE_USE_CODE_02.getCode())) {
                 // 02 营业城市公交 = 9 营业
                 car.setUseNatureCodeCode("9");
-            }  else if (vehicleUseCode.equals(VehicleUseCode.VEHICLE_USE_CODE_03.getCode())) {
+            } else if (vehicleUseCode.equals(VehicleUseCode.VEHICLE_USE_CODE_03.getCode())) {
                 // 03 营业公路客运 = 9 营业
                 car.setUseNatureCodeCode("9");
-            }  else if (vehicleUseCode.equals(VehicleUseCode.VEHICLE_USE_CODE_04.getCode())) {
+            } else if (vehicleUseCode.equals(VehicleUseCode.VEHICLE_USE_CODE_04.getCode())) {
                 // 04 营业货运 = 9 营业
                 car.setUseNatureCodeCode("9");
             } else {
@@ -561,7 +562,6 @@ public class TKHttpAPIService {
         carModelinfoCheckVehicleTypeParam.setCarInfoVo(carInfoVo);
 
 
-
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", session.getToken());
 
@@ -927,6 +927,25 @@ public class TKHttpAPIService {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("Actiontype", actionType);
+        httpHeaders.add("carssToken", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXFNYXAiOiJ7XCJmcm9tXCI6XCJ0cGxhdFwiLFwidXNlck5hbWVcIjpcImYyMThlOThlYzBiMmI5Y2IwNTdiNTc1YWNmNzY5YzYyMVwifSIsImlzcyI6InRrLmNuIiwiZXhwIjoxNzc5MTUwNzU4fQ.VOyNqFK-cQ79QsJA4iF1xnjMqYZRYH5IfhqrfIWg6OA");
+
+        StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
+
+        B response1 = decrypt(response, responseType);
+
+        return response1;
+    }
+
+    /**
+     * entrance 返回的数据是加密数据的情况
+     *
+     * @return
+     */
+    private <B> B entranceForDecrypt(String token, String carssToken, Object param, String actionType, Class<B> responseType) {
+        HttpHeaders httpHeaders = new HttpHeaders();
+        httpHeaders.add("tkCarRequestToken", token);
+        httpHeaders.add("Actiontype", actionType);
+        httpHeaders.add("carssToken", carssToken);
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
 
@@ -1037,7 +1056,7 @@ public class TKHttpAPIService {
     }
 
 
-    public TKEntranceFor000086Result entranceFor000086(String token, String tplatformId, String fromId, String orderId, String proposalNo, String fullProposalNo) {
+    public TKEntranceFor000086Result entranceFor000086(String token, String carssToken, String tplatformId, String fromId, String orderId, String proposalNo, String fullProposalNo, String userId) {
         TKEntranceFor000086Param param = new TKEntranceFor000086Param();
         param.setChannelCode("OffWeb");
         param.setTplatformId(tplatformId);
@@ -1048,8 +1067,9 @@ public class TKHttpAPIService {
         param.setInitFlag("3");
         param.setIsAgentFlag("1");
         param.setUserType("渠道");
+        param.setUserId(userId);
 
-        TKEntranceFor000086Result.Response response = entranceForDecrypt(token, param, "000086", TKEntranceFor000086Result.Response.class);
+        TKEntranceFor000086Result.Response response = entranceForDecrypt(token, carssToken, param, "000086", TKEntranceFor000086Result.Response.class);
 
         checkResponseUnknownField(response);
 
@@ -1108,11 +1128,16 @@ public class TKHttpAPIService {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", token);
 
-        TKPayForwardResult.Response response = client.request(HttpURL.payForward, param, httpHeaders, TKPayForwardResult.Response.class);
+        // 先以 StringResponse 接收加密的响应
+        StringResponse response = client.request(HttpURL.payForward, param, httpHeaders, StringResponse.class);
 
-        TKPayForwardResult result = response.getData();
+        // 解密并反序列化为 TKPayForwardResult.Response
+        TKPayForwardResult decrypt = decrypt(response, TKPayForwardResult.class);
 
-        return result.getPayForwardUrl();
+        if (decrypt == null) {
+            return null;
+        }
+        return decrypt.getPayForwardUrl();
     }
 
     /**
@@ -1135,10 +1160,10 @@ public class TKHttpAPIService {
 
     /**
      * 交强险保单pdf文件下载,商业险保单pdf文件下载
-     *
+     * <p>
      * subPolicyNo 的样子类似于 DilL5LttJwkObORFk0tQ8z6mrcm8c1X3PKtxC4D79II%3D 这种
      *
-     * @param subPolicyNo  交强险保单号,商业险保单号
+     * @param subPolicyNo 交强险保单号,商业险保单号
      * @return base64格式
      */
     public String imageDownloadPolicy(String subPolicyNo) {
@@ -1181,9 +1206,9 @@ public class TKHttpAPIService {
 
     /**
      * 获取发票下载地址
-     *
+     * <p>
      * 接口速度大体稳定在 1秒2,可以考虑将结果缓存。再加上反序列化的时间到1秒3了。
-     *
+     * <p>
      * 不需要 token 也能查询
      *
      * @param tplatformId
@@ -1306,7 +1331,7 @@ public class TKHttpAPIService {
     public TKReceiveResult receiveInfo(String token, String mainOrderId, String fromId, TKEntranceFor000038Result tkEntranceFor000038Result) {
         TKReceiveParam tkReceiveParam = new TKReceiveParam();
         tkReceiveParam.setBusinessId(UUID.randomUUID().toString());
-        tkReceiveParam.setOrderNo("TK000013_"+ mainOrderId);
+        tkReceiveParam.setOrderNo("TK000013_" + mainOrderId);
         tkReceiveParam.setPolicyNo(tkEntranceFor000038Result.getData().getProposalNo());
         tkReceiveParam.setTradeNo("");
         tkReceiveParam.setProductCode("");

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

@@ -962,6 +962,12 @@ public class TKSimpleService {
         if (messageBZ != null) {
             throw new SystemException(messageBZ.get(0)+"\n"+ messageBZ.get(1));
         }
+        if (other.getVehicleOwnerMessage() != null) {
+            throw new SystemException(other.getVehicleOwnerMessage());
+        }
+//        if (preciseInitResult.getPremium() == null) {
+//            throw new SystemException(other.getNotice());
+//        }
 
         return preciseInitResult;
     }
@@ -1079,6 +1085,9 @@ public class TKSimpleService {
             List<KindInfoVo> commonBiKindInfoVos = commonQuoteVo.getKindInfoVo();
             if (commonBiKindInfoVos != null && commonBiKindInfoVos.size() > 0) {
                 for (KindInfoVo commonBiKindInfoVo : commonBiKindInfoVos) {
+                    if (tkCiKindsVoMap.isEmpty() || tkCiKindsVoMap.get(commonBiKindInfoVo.getKindCode()) == null) {
+                        continue;
+                    }
                     TKCiKindsVo tkCiKindVo = tkCiKindsVoMap.get(commonBiKindInfoVo.getKindCode());
 
                     tkCiKindVo.setIsSelect("1");

+ 57 - 40
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/impl/TKQuotationBaseServiceImpl.java

@@ -1,23 +1,21 @@
 package com.jzg.quotation.taikang.crawler.service.impl;
 
-import com.alibaba.fastjson2.JSON;
-import com.alibaba.fastjson2.JSONObject;
 import com.google.gson.Gson;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
-import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.orders.po.InsOrdersCarUserInfo;
-import com.jzg.commons.entity.po.SysUploadFiles;
-import com.jzg.commons.entity.quote.vo.*;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.KindInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
-import com.jzg.commons.entity.vo.InsTaskImagesVo;
-import com.jzg.commons.util.MinioUtils;
+import com.jzg.commons.util.DateTimeUtils;
+import com.jzg.commons.util.ImageUtil;
 import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.client.PlatformClient;
 import com.jzg.quotation.commons.constant.InsuranceCode;
-import com.jzg.quotation.taikang.crawler.JsonUtil;
 import com.jzg.quotation.taikang.crawler.cache.RedisCacheUtil;
 import com.jzg.quotation.taikang.crawler.client.AESDecryptor;
 import com.jzg.quotation.taikang.crawler.model.TKLoginSession;
@@ -31,20 +29,18 @@ import com.jzg.quotation.taikang.crawler.service.TKSimpleService;
 import io.micrometer.core.instrument.simple.SimpleConfig;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
-import org.redisson.api.RBucket;
-import org.redisson.api.RedissonClient;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.io.File;
-import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
-import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
 @QuoteCrawlerService(value = InsuranceCode.INSURANCE_TKIC)
 @RequiredArgsConstructor
+@Slf4j
 public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
 
     @Autowired
@@ -118,7 +114,7 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
     @Override
     public QuoteResultsVo quote(QuoteVo commonQuoteVo) {
         CarInfoVo commonCarInfoVo = commonQuoteVo.getCarInfoVo();
-
+        commonCarInfoVo.setColorCode("010"); // 默认设置为黑色
         String username = "Tgengchenjie";
         String password = "Gcj123456#";
 
@@ -164,7 +160,9 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
         // # 初始化车险投保单
         PreciseInitResult preciseInitResult = tkSimpleService.orderInit(session, mainOrderId);
         TKDriverAccidentVo driverAccidentVo = preciseInitResult.getDriverAccidentVo();
-        driverAccidentVo.setIsSelect("0");
+        if (driverAccidentVo != null) {
+            driverAccidentVo.setIsSelect("0");
+        }
 
         // # 车险投保单报价
 
@@ -183,8 +181,8 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
         // 交强险
         TKBzKindVo bzKindVo = preciseInitResult.getBzKindVo();
         RiskInfoVo riskInfoVo1 = new RiskInfoVo();
-        riskInfoVo1.setStartDate(date.getStartDateBZ());
-        riskInfoVo1.setEndDate(date.getEndDateBZ());
+        riskInfoVo1.setStartDate(date.getStartDateBZ() == null ? DateTimeUtils.convertToDateTime(date.getJqStartDate(), date.getJqStartHour(), date.getJqStartMinute()) : date.getStartDateBZ());
+        riskInfoVo1.setEndDate(date.getEndDateBZ() == null ? DateTimeUtils.convertToDateTime(date.getJqEndDate(), date.getJqEndHour(), date.getJqEndMinute()) : date.getEndDateBZ());
         quoteResultsVo.setCiRiskInfoVo(riskInfoVo1);
 
         // 商业险
@@ -361,7 +359,8 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
         param.setChannelCode("OffWeb");
         param.setTplatformId(session.getTplatformId());
         param.setOnlyId(orderID);
-        param.setFullProposalNo(proposalNo);
+        param.setOrderID(orderID);
+        param.setFullProposalNo(insuranceUploadImageVo.getOrder().getQuoteNo());
         param.setLastFullProposalNo("");
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         Date date = new Date();
@@ -377,32 +376,50 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
                 List<InsuranceImageVo.ImageDTO> imageBase64List = s.getImageBase64List();
                 imageBase64List.forEach(c -> {
                     String imageId = c.getImageId();
-                    SysUploadFiles sysUploadFiles = platformClient.getUploadFile(imageId);
-                    String url = MinioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName());
-                    File file = new File(url);
-                    param.setTypePath("01-15-01");
-                    String info = "1fileOrgName" + param.getTypePath() + date.getTime() + "0";
-                    param.setFileOrgName(info);
-                    param.setTypeName("投保业务-车辆证件-行驶证");
-                    param.setOnlyId("投保业务-车辆证件-行驶证-0");
-                    param.setFileType(info);
-                    httpService.carCheckUploadFile(file, param);
+                    String imageBase64Str = c.getImageBase64Str();
+                    File file = null;
+                    try {
+                        // 将 Base64 字符串转换为 File 对象
+                        file = ImageUtil.convertBase64ToFile(imageBase64Str, imageId);
+                        param.setTypePath("01-15-01");
+                        String info = "1fileOrgName" + param.getTypePath() + date.getTime() + "0";
+                        param.setFileOrgName(info);
+                        param.setTypeName("投保业务-车辆证件-行驶证");
+                        param.setOnlyId("投保业务-车辆证件-行驶证-0");
+                        param.setFileType(info);
+                        httpService.carCheckUploadFile(file, param);
+                    } catch (Exception e) {
+                        log.error("处理行驶证图片失败: imageId={}, orderID={}", imageId, orderID, e);
+                    } finally {
+                        if (file != null) {
+                            file.delete();
+                        }
+                    }
                 });
 
             } else if ("C02".equals(imageCode)) {
                 List<InsuranceImageVo.ImageDTO> imageBase64List = s.getImageBase64List();
                 imageBase64List.forEach(c -> {
                     String imageId = c.getImageId();
-                    SysUploadFiles sysUploadFiles = platformClient.getUploadFile(imageId);
-                    String jzgTouXiang = MinioUtils.getPresignedObjectUrl("jzg", sysUploadFiles.getFileName());
-                    File file = new File(jzgTouXiang);
-                    param.setTypePath("01-14-01");
-                    String info = "1fileOrgName" + param.getTypePath() + date.getTime() + "0";
-                    param.setFileOrgName(info);
-                    param.setTypeName("投保业务-证件照-证件照");
-                    param.setOnlyId("投保业务-证件照-证件照-0");
-                    param.setFileType(info);
-                    httpService.carCheckUploadFile(file, param);
+                    String imageBase64Str = c.getImageBase64Str();
+                    File file = null;
+                    try {
+                        // 将 Base64 字符串转换为 File 对象
+                        file = ImageUtil.convertBase64ToFile(imageBase64Str, imageId);
+                        param.setTypePath("01-14-01");
+                        String info = "1fileOrgName" + param.getTypePath() + date.getTime() + "0";
+                        param.setFileOrgName(info);
+                        param.setTypeName("投保业务-证件照-证件照");
+                        param.setOnlyId("投保业务-证件照-证件照-0");
+                        param.setFileType(info);
+                        httpService.carCheckUploadFile(file, param);
+                    } catch (Exception e) {
+                        log.error("处理身份证图片失败: imageId={}, orderID={}", imageId, orderID, e);
+                    } finally {
+                        if (file != null) {
+                            file.delete();
+                        }
+                    }
                 });
             }
 
@@ -581,10 +598,10 @@ public class TKQuotationBaseServiceImpl implements TKQuotationBaseService {
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
         TKLoginSession session = login("Tgengchenjie", "Gcj123456#");
         String orderId = redisCacheUtil.getCache(orderStatusVo.getOrder().getOrdersNo(), "DD");
-        String proposalNo = "";
-        String fullProposalNo = "";
+        String proposalNo = orderStatusVo.getOrder().getCompanyOrderNo();
+        String fullProposalNo = orderStatusVo.getOrder().getCompanyOrderNo();
 
-        TKEntranceFor000086Result tkEntranceFor000086Result = httpService.entranceFor000086(session.getToken(), session.getTplatformId(), session.getFromid(), orderId, proposalNo, fullProposalNo);
+        TKEntranceFor000086Result tkEntranceFor000086Result = httpService.entranceFor000086(session.getToken(), session.getLoginInfo().getCarssToken(),session.getTplatformId(), session.getFromid(), orderId, proposalNo, fullProposalNo, session.getLoginInfo().getTplatLoginKey());
         /**
          * 订单状态
          * 大概如下:

+ 137 - 104
tenant/insurance/quotation-taikang/src/test/java/com/jzg/quotation/taikang/crawler/TKHttpAPIServiceTest1.java

@@ -49,116 +49,147 @@ public class TKHttpAPIServiceTest1 {
 
     @BeforeAll
     public static void before() {
-//        // 配置HTTP连接池
-//        ConnectionProvider connectionProvider = ConnectionProvider
-//                .builder("http")
-//                .maxConnections(500)
-//                .maxIdleTime(Duration.ofSeconds(30))
-//                .build();
-//
-//        // 配置HTTP客户端
-//        reactor.netty.http.client.HttpClient httpClient = reactor.netty.http.client.HttpClient
-//                .create(connectionProvider)
-//                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
-//                .responseTimeout(Duration.ofSeconds(50))
-//                .doOnConnected(conn ->
-//                        conn
-//                                .addHandlerLast(new ReadTimeoutHandler(50))
-//                                .addHandlerLast(new WriteTimeoutHandler(50)));
-//        // 构建WebClient实例
-//        WebClient webClient = WebClient
-//                .builder()
-//                .clientConnector(new ReactorClientHttpConnector(httpClient))
-//                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
-//                .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
-//                .filter(ExchangeFilterFunction.ofRequestProcessor(
-//                        clientRequest -> {
-//                            // 打印请求头信息
-//                            clientRequest
-//                                    .headers()
-//                                    .forEach((key, values) -> {
-//                                        logger.info("请求头: {}: {}", key, values);
-//                                    });
-//                            return Mono.just(clientRequest);
-//                        }
-//                ))
-//                .codecs(item->item.defaultCodecs().maxInMemorySize(10 * 1024 * 1024))
-//                .build();
-//
-//
-//        RequestComponent requestComponent = new RequestComponent(webClient);
-//
-//        TKHttpClient client = new TKHttpClient();
-//
-//        client.setRequestComponent(requestComponent);
-//
-//        httpService = new TKHttpAPIService();
-//        httpService.setClient(client);
+        // 配置HTTP连接池
+        ConnectionProvider connectionProvider = ConnectionProvider
+                .builder("http")
+                .maxConnections(500)
+                .maxIdleTime(Duration.ofSeconds(30))
+                .build();
+
+        // 配置HTTP客户端
+        reactor.netty.http.client.HttpClient httpClient = reactor.netty.http.client.HttpClient
+                .create(connectionProvider)
+                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
+                .responseTimeout(Duration.ofSeconds(50))
+                .doOnConnected(conn ->
+                        conn
+                                .addHandlerLast(new ReadTimeoutHandler(50))
+                                .addHandlerLast(new WriteTimeoutHandler(50)));
+        // 构建WebClient实例
+        WebClient webClient = WebClient
+                .builder()
+                .clientConnector(new ReactorClientHttpConnector(httpClient))
+                .defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
+                .defaultHeader(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE)
+                .filter(ExchangeFilterFunction.ofRequestProcessor(
+                        clientRequest -> {
+                            // 打印请求头信息
+                            clientRequest
+                                    .headers()
+                                    .forEach((key, values) -> {
+                                        logger.info("请求头: {}: {}", key, values);
+                                    });
+                            return Mono.just(clientRequest);
+                        }
+                ))
+                .codecs(item->item.defaultCodecs().maxInMemorySize(10 * 1024 * 1024))
+                .build();
+
+
+        RequestComponent requestComponent = new RequestComponent(webClient, null);
+
+        TKHttpClient client = new TKHttpClient();
+
+        client.setRequestComponent(requestComponent);
+
+        httpService = new TKHttpAPIService();
+        httpService.setClient(client);
+
+        // 自动执行登录流程,初始化测试数据
+        try {
+            performLogin();
+        } catch (Exception e) {
+            logger.error("测试前登录初始化失败", e);
+        }
     }
+    private static void performLogin() {
+        // 获取临时token
+        IdentityTokenResult tempTokenResult = httpService.identityToken();
+        if (tempTokenResult == null || tempTokenResult.getTkCarRequestToken() == null) {
+            logger.error("获取临时token失败");
+            return;
+        }
 
-
-    @Test
-    @Order(0)
-    public void login() {
-        IdentityTokenResult result1 = httpService.identityToken();
-
-        assertNotNull(result1);
-
-        // 先获取到一个匿名登录的 `临时token`
-        String firstToken = result1.getTkCarRequestToken();
-
-        assertNotNull(firstToken);
-
-        System.out.println("临时 token" + firstToken);
-
-        LoginResult result = httpService.login(firstToken, "Tgengchenjie", "Gcj123456#");
-
-        assertNotNull(result);
-        assertNotNull(result.getToken());
-        assertNotNull(result.getTplatLoginKey());
-        assertNotNull(result.getTplatformId());
-        assertNotNull(result.getUserId());
-        assertNotNull(result.getWebsysUserVo());
-        assertNotNull(result.getWebsysUserVo().getWebsysUserAreaVos());
-        assertNotNull(result.getWebsysUserVo().getFromid());
-        assertEquals(1, result.getWebsysUserVo().getWebsysUserAreaVos().size()); // todo 其它接口所需要  comCode 字段来自此处,需要检查超过 1 个时如何使用。
-        assertEquals("0", result.getLoginStatus());
-        assertEquals("feda77e829d4dedbbd8b4e236bacfac5", result.getTplatformId()); // tplatformId 好像不会变化,每次都一样
-        assertEquals("7cdb1f7e7d276af4f4fc03df508083eb1", result.getTplatLoginKey()); // tplatLoginKey 可能会变化
-        assertEquals("67107", result.getWebsysUserVo().getFromid()); // todo 注意 fromId 在其它字段上也存在,可能需要多次甄别不同字段的区别
-
-        Map<String, Object> unknownFields = result.getUnknownFields();
-
-        System.out.println("unknownFields:  " + JSON.toJSONString(unknownFields));
-
-        assertNull(unknownFields);
+        // 执行登录
+        LoginResult result = httpService.login(tempTokenResult.getTkCarRequestToken(), "Tgengchenjie", "Gcj123456#");
+        if (result == null) {
+            logger.error("登录失败,返回结果为null");
+            return;
+        }
 
         TKHttpAPIServiceTest1.loginResult = result;
-    }
+        logger.info("登录成功,tpplatformId: {}", result.getTplatformId());
 
-    @Test
-    @Order(1)
-    public void identityToken() {
-        // feda77e829d4dedbbd8b4e236bacfac5
-        String tplatformId = TKHttpAPIServiceTest1.loginResult.getTplatformId();
-
-        // 通过临时 token 获取正式 token
-        IdentityTokenResult result = httpService.identityToken(null, tplatformId);
-
-        assertNotNull(result);
-        assertNotNull(result.getTkCarRequestToken());
-
-        System.out.println("token: " + result.getTkCarRequestToken());
-
-        Map<String, Object> unknownFields = result.getUnknownFields();
-
-        System.out.println("unknownFields:  " + JSON.toJSONString(unknownFields));
-
-        assertNull(unknownFields);
-
-        tokenResult = result;
+        // 获取正式token
+        IdentityTokenResult tokenResult = httpService.identityToken(null, result.getTplatformId());
+        if (tokenResult != null && tokenResult.getTkCarRequestToken() != null) {
+            TKHttpAPIServiceTest1.tokenResult = tokenResult;
+            logger.info("获取正式token成功");
+        }
     }
 
+//    @Test
+//    @Order(0)
+//    public void login() {
+//        IdentityTokenResult result1 = httpService.identityToken();
+//
+//        assertNotNull(result1);
+//
+//        // 先获取到一个匿名登录的 `临时token`
+//        String firstToken = result1.getTkCarRequestToken();
+//
+//        assertNotNull(firstToken);
+//
+//        System.out.println("临时 token" + firstToken);
+//
+//        LoginResult result = httpService.login(firstToken, "Tgengchenjie", "Gcj123456#");
+//
+//        assertNotNull(result);
+//        assertNotNull(result.getToken());
+//        assertNotNull(result.getTplatLoginKey());
+//        assertNotNull(result.getTplatformId());
+//        assertNotNull(result.getUserId());
+//        assertNotNull(result.getWebsysUserVo());
+//        assertNotNull(result.getWebsysUserVo().getWebsysUserAreaVos());
+//        assertNotNull(result.getWebsysUserVo().getFromid());
+//        assertEquals(1, result.getWebsysUserVo().getWebsysUserAreaVos().size()); // todo 其它接口所需要  comCode 字段来自此处,需要检查超过 1 个时如何使用。
+//        assertEquals("0", result.getLoginStatus());
+//        assertEquals("feda77e829d4dedbbd8b4e236bacfac5", result.getTplatformId()); // tplatformId 好像不会变化,每次都一样
+//        assertEquals("7cdb1f7e7d276af4f4fc03df508083eb1", result.getTplatLoginKey()); // tplatLoginKey 可能会变化
+//        assertEquals("67107", result.getWebsysUserVo().getFromid()); // todo 注意 fromId 在其它字段上也存在,可能需要多次甄别不同字段的区别
+//
+//        Map<String, Object> unknownFields = result.getUnknownFields();
+//
+//        System.out.println("unknownFields:  " + JSON.toJSONString(unknownFields));
+//
+//        assertNull(unknownFields);
+//
+//        TKHttpAPIServiceTest1.loginResult = result;
+//    }
+//
+//    @Test
+//    @Order(1)
+//    public void identityToken() {
+//        // feda77e829d4dedbbd8b4e236bacfac5
+//        String tplatformId = TKHttpAPIServiceTest1.loginResult.getTplatformId();
+//
+//        // 通过临时 token 获取正式 token
+//        IdentityTokenResult result = httpService.identityToken(null, tplatformId);
+//
+//        assertNotNull(result);
+//        assertNotNull(result.getTkCarRequestToken());
+//
+//        System.out.println("token: " + result.getTkCarRequestToken());
+//
+//        Map<String, Object> unknownFields = result.getUnknownFields();
+//
+//        System.out.println("unknownFields:  " + JSON.toJSONString(unknownFields));
+//
+//        assertNull(unknownFields);
+//
+//        tokenResult = result;
+//    }
+
     @Test
     @Order(2)
     public void initBasicData() {
@@ -1243,7 +1274,9 @@ public class TKHttpAPIServiceTest1 {
         String orderId = "WBPC202503261450434440000";
         String fullProposalNo = "";
         String proposalNo = "";
-        TKEntranceFor000086Result tkEntranceFor000086Result = httpService.entranceFor000086(token, tplatformId, fromId, orderId, proposalNo, fullProposalNo);
+        String carssToken = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXFNYXAiOiJ7XCJmcm9tXCI6XCJ0cGxhdFwiLFwidXNlck5hbWVcIjpcImYyMThlOThlYzBiMmI5Y2IwNTdiNTc1YWNmNzY5YzYyMVwifSIsImlzcyI6InRrLmNuIiwiZXhwIjoxNzc5MTUzMTY5fQ.zNvt6Cee9okWqx6nsLg5YQGPogSUnpPRrGXh8gXLi6Q";
+        String userId = "f218e98ec0b2b9cb057b575acf769c621";
+        TKEntranceFor000086Result tkEntranceFor000086Result = httpService.entranceFor000086(token, carssToken,tplatformId, fromId, orderId, proposalNo, fullProposalNo, userId);
 
         assertNotNull(tkEntranceFor000086Result);