فهرست منبع

华农保险对接提交

wanghao 5 ماه پیش
والد
کامیت
4d80a854d3
19فایلهای تغییر یافته به همراه1193 افزوده شده و 64 حذف شده
  1. 17 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/build/HuaNongCrawlerQuoteResultsVoBuild.java
  2. 47 6
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerRequestComponent.java
  3. 119 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/JiaYiXianProduct.java
  4. 2 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/RequestUrl.java
  5. 1 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/HuaNongCrawlerConfigureParameters.java
  6. 56 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerCopyImageCheckRequest.java
  7. 317 10
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerQuotedPriceRequestRequest.java
  8. 8 3
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerSaveRequestRequest.java
  9. 11 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerSubmitRequestRequest.java
  10. 2 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest.java
  11. 9 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/response/HuaNongCrawlerCatalogQueryResponse.java
  12. 61 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/response/HuaNongCrawlerCopyImageCheckResponse.java
  13. 1 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/HuaNongCrawlerOrderService.java
  14. 5 4
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/HuaNongCrawlerQuoteProcessService.java
  15. 1 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerGetTokenImpl.java
  16. 10 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerOrderServiceImpl.java
  17. 187 8
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java
  18. 337 24
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java
  19. 2 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/utils/RequestEncryptor.java

+ 17 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/build/HuaNongCrawlerQuoteResultsVoBuild.java

@@ -27,6 +27,23 @@ public final class HuaNongCrawlerQuoteResultsVoBuild {
 
         List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO> contract = huaNongCrawlerQuotedPriceResponse.getBusinessData()
                 .getContract();
+        // 驾意险信息
+        List<HuaNongCrawlerSaveResponse.BusinessDataDTO.ContractDTO> jyContract = saveResponse.getBusinessData()
+                .getContract().stream().filter(x->x.getContractMain().getRiskCode().equals("2781")).collect(Collectors.toList());
+        List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractAccidentDTO> contractAccidentList = huaNongCrawlerQuotedPriceResponse.getBusinessData()
+                .getContractAccident();
+        if(!contractAccidentList.isEmpty()){
+            RiskInfoVo jyRiskInfoVo = new RiskInfoVo();
+            HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractAccidentDTO.ContractMainDTO contractAccident  =contractAccidentList.get(0).getContractMain();
+            jyRiskInfoVo.setRiskCode(contractAccident.getRiskCode());
+            quoteResultsVo.setJyRiskInfoVo(jyRiskInfoVo);
+            quoteResultsVo.getCosts().setNiPremium(String.valueOf(contractAccident.getTotalStandardPremium()));
+            if(!jyContract.isEmpty()){
+                quoteResultsVo.setJyPolicyNumber(jyContract.get(0).getContractMain().getContractNo());
+            }
+        }
+
+
 
         Map<String, HuaNongCrawlerSaveResponse.BusinessDataDTO.ContractDTO> collect = saveResponse.getBusinessData()
                 .getContract()

+ 47 - 6
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerRequestComponent.java

@@ -27,10 +27,7 @@ import java.io.IOException;
 import java.net.URI;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 import static com.jzg.quotation.huanong.crawler.constant.enums.RequestUrl.*;
 
@@ -288,6 +285,18 @@ public class HuaNongCrawlerRequestComponent {
             throw new SystemException("文件读取异常");
         }
     }
+
+    /**
+     * 影像检查
+     *
+     * @param request 影像检查请求
+     * @param headers 请求头
+     * @return 影像检查响应
+     */
+    public HuaNongCrawlerCopyImageCheckResponse copyImageCheck(HuaNongCrawlerCopyImageCheckRequest request, HttpHeaders headers) {
+        return post(COPY_IMAGE_CHECK, request, HuaNongCrawlerCopyImageCheckResponse.class, headers);
+    }
+
     public HuaNongCrawlerBizQueryResponse bizQuery(String accessToken, HttpHeaders headers) {
         String url = properties.getUploadUrl() + String.format(BIZ_QUERY.getUri(), accessToken);
         ResponseEntity<HuaNongCrawlerBizQueryResponse> responseEntity = requestComponent.baseGet(url, new LinkedMultiValueMap<>(), HuaNongCrawlerBizQueryResponse.class, headers);
@@ -308,10 +317,40 @@ public class HuaNongCrawlerRequestComponent {
      * @param accessToken accessToken
      * @param headers     请求头
      */
-    public void fileSubmit(HuaNongCrawlerFileSubmitRequest request, String accessToken, HttpHeaders headers) {
+    public boolean fileSubmit(HuaNongCrawlerFileSubmitRequest request, String accessToken, HttpHeaders headers) {
         String url = properties.getUploadUrl() + String.format(FILE_SUBMIT.getUri(), accessToken, System.currentTimeMillis());
+        log.info("印象上传:{}",JSON.toJSON(request));
         ResponseEntity<HuaNongCrawlerFileSubmitResponse> responseEntity = requestComponent.objectPost(url, request, HuaNongCrawlerFileSubmitResponse.class, headers);
-        System.out.println();
+
+        HuaNongCrawlerFileSubmitResponse response = responseEntity.getBody();
+        if (response == null) {
+            log.error("fileSubmit 响应为空!");
+            return false;
+        }
+
+        String message = response.getMessage();
+        List<String> data = response.getData();
+
+        log.info("fileSubmit 响应 - message: {}, data: {}", message, data);
+
+        // 检查 message 是否为 "OK"
+        if (!"OK".equals(message)) {
+            log.error("fileSubmit 失败: message={}", message);
+            return false;
+        }
+
+        // 检查 data 中是否包含"失败"
+        if (data != null) {
+            for (String item : data) {
+                if (item != null && item.contains("失败")) {
+                    log.error("fileSubmit 失败: data包含失败信息 - {}", item);
+                    return false;
+                }
+            }
+        }
+
+        log.info("fileSubmit 提交成功!");
+        return true;
     }
 
 
@@ -410,4 +449,6 @@ public class HuaNongCrawlerRequestComponent {
         return String.format("%s?proposalNo=%s&operatorCode=%s&poaType=&time={time}", payUrl, proposalNo, username);
     }
 
+
+
 }

+ 119 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/JiaYiXianProduct.java

@@ -0,0 +1,119 @@
+package com.jzg.quotation.huanong.crawler.constant.enums;
+
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 驾意险产品枚举
+ * @author wh
+ */
+@Getter
+public enum JiaYiXianProduct {
+
+    ANXIANG_100("112", "安享驾乘(100)", true, Arrays.asList(
+            new CoverageConfig("Z27096-1", "交通出行团体意外伤害保险C款条款", "0955", "必选责任:意外伤害身故保险责任", 0.051, "80000", "8.0万元/座", " ", false),
+            new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.034, "80000", "8.0万元/座", " ", false),
+            new CoverageConfig("F27002", "附加团体意外伤害医疗保险条款", "0008", "意外伤害医疗保险责任", 0.28, "5000", "0.5万元/座", "每次事故免赔300后80%比例赔付", false),
+            new CoverageConfig("F27001", "附加团体意外伤害住院津贴保险条款", "0032", "意外伤害住院津贴保险责任", 0.2, "30", "0.003万元/座", "30元/天/座", true),
+            new CoverageConfig("F27047-5", "附加辅助金保险条款", "0094", "家庭辅助金", 0.026, "20000", "2.0万元/座", " ", false),
+            new CoverageConfig("F27048-6", "附加救护车车费保险条款", "0095", "救护车费用", 0.2, "1000", "0.1万元/座", "每次事故最高赔付300元", false)
+    )),
+
+    ANXIANG_120("113", "安享驾乘(120)", false, Arrays.asList(
+            new CoverageConfig("Z27096-1", "交通出行团体意外伤害保险C款条款", "0955", "必选责任:意外伤害身故保险责任", 0.063, "120000", "12.0万元/座", " ", false),
+            new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.042, "120000", "12.0万元/座", " ", false),
+            new CoverageConfig("F27002", "附加团体意外伤害医疗保险条款", "0008", "意外伤害医疗保险责任", 0.26, "10000", "1.0万元/座", "每次事故免赔300后80%比例赔付", false),
+            new CoverageConfig("F27001", "附加团体意外伤害住院津贴保险条款", "0032", "意外伤害住院津贴保险责任", 0.2, "50", "0.005万元/座", "50元/天/座", true),
+            new CoverageConfig("F27047-5", "附加辅助金保险条款", "0094", "家庭辅助金", 0.02, "30000", "3.0万元/座", " ", false),
+            new CoverageConfig("F27048-6", "附加救护车车费保险条款", "0095", "救护车费用", 0.2, "2000", "0.2万元/座", "每次事故最高赔付300元", false)
+    )),
+
+    ANXIANG_36("111", "安享驾乘(36)", true, Arrays.asList(
+            new CoverageConfig("Z27096-1", "交通出行团体意外伤害保险C款条款", "0955", "必选责任:意外伤害身故保险责任", 0.06, "30000", "3.0万元/座", " ", false),
+            new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.04, "30000", "3.0万元/座", " ", false),
+            new CoverageConfig("F27002", "附加团体意外伤害医疗保险条款", "0008", "意外伤害医疗保险责任", 0.24, "1000", "0.1万元/座", "每次事故免赔300后80%比例赔付", false),
+            new CoverageConfig("F27001", "附加团体意外伤害住院津贴保险条款", "0032", "意外伤害住院津贴保险责任", 0.2, "10", "0.001万元/座", "10元/天/座", true)
+    ));
+
+    /**
+     * 产品代码
+     */
+    private final String productCode;
+
+    /**
+     * 产品名称
+     */
+    private final String productName;
+
+    /**
+     * 是否设置空的 engage 列表(112 设置空列表,113 设置 engage 内容)
+     */
+    private final boolean emptyEngage;
+
+    /**
+     * 险别配置列表
+     */
+    private final List<CoverageConfig> coverageConfigs;
+
+    JiaYiXianProduct(String productCode, String productName, boolean emptyEngage, List<CoverageConfig> coverageConfigs) {
+        this.productCode = productCode;
+        this.productName = productName;
+        this.emptyEngage = emptyEngage;
+        this.coverageConfigs = coverageConfigs;
+    }
+
+    /**
+     * 根据产品代码获取枚举
+     */
+    public static JiaYiXianProduct fromProductCode(String productCode) {
+        for (JiaYiXianProduct product : values()) {
+            if (product.productCode.equals(productCode)) {
+                return product;
+            }
+        }
+        throw new IllegalArgumentException("未知的驾意险产品代码: " + productCode);
+    }
+
+    /**
+     * 判断是否为已知的驾意险产品代码
+     */
+    public static boolean isValidProductCode(String productCode) {
+        for (JiaYiXianProduct product : values()) {
+            if (product.productCode.equals(productCode)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     * 险别配置内部类
+     */
+    @Getter
+    public static class CoverageConfig {
+        private final String kindCode;
+        private final String kindName;
+        private final String dutyCode;
+        private final String dutyName;
+        private final Double rate;
+        private final String unitAmount;
+        private final String unitAmountAdd;
+        private final String remark;
+        private final boolean isType2;
+
+        public CoverageConfig(String kindCode, String kindName, String dutyCode, String dutyName,
+                             Double rate, String unitAmount, String unitAmountAdd, String remark, boolean isType2) {
+            this.kindCode = kindCode;
+            this.kindName = kindName;
+            this.dutyCode = dutyCode;
+            this.dutyName = dutyName;
+            this.rate = rate;
+            this.unitAmount = unitAmount;
+            this.unitAmountAdd = unitAmountAdd;
+            this.remark = remark;
+            this.isType2 = isType2;
+        }
+    }
+}

+ 2 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/RequestUrl.java

@@ -38,6 +38,8 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     UNLOCK("/tianying/api/doc/unlock?accessToken=%s", "解锁", ""),
     FILE_SUBMIT("/tianying/api/doc/fileSubmit?accessToken=%s&time=%d", "提交影像", ""),
 
+    // 检查影像
+    COPY_IMAGE_CHECK("COPYIMAGECHECK", "影像检查", "COPYIMAGECHECK"),
     // 提交核保
     SUBMIT("Submit", "提交核保", "Submit"),
     // 状态查询

+ 1 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/HuaNongCrawlerConfigureParameters.java

@@ -30,6 +30,7 @@ public class HuaNongCrawlerConfigureParameters implements ConfigureParameters {
      * 渠道类型
      */
     private String producer;
+    private String producerCode;
     /**
      * 协议号
      */

+ 56 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerCopyImageCheckRequest.java

@@ -0,0 +1,56 @@
+package com.jzg.quotation.huanong.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.huanong.crawler.entity.po.HuaNongCrawlerOrder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+@NoArgsConstructor
+@Data
+public class HuaNongCrawlerCopyImageCheckRequest implements HuaNongHeadRequest {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty("head")
+    private HuaNongCrawlerRequestBaseHead head;
+
+    @JsonProperty("proposalInfos")
+    private List<ProposalInfoDTO> proposalInfos;
+
+    public HuaNongCrawlerCopyImageCheckRequest(String token, HuaNongCrawlerOrder huaNongCrawlerOrder) {
+        this.head = new HuaNongCrawlerRequestBaseHead(token);
+        this.head.setTransCode("COPYIMAGECHECK");
+        this.proposalInfos = new ArrayList<>();
+        Optional.ofNullable(huaNongCrawlerOrder.getCiPolicyNumber())
+                .map(x -> new ProposalInfoDTO(x))
+                .ifPresent(this.proposalInfos::add);
+        Optional.ofNullable(huaNongCrawlerOrder.getBiPolicyNumber())
+                .map(x -> new ProposalInfoDTO(x))
+                .ifPresent(this.proposalInfos::add);
+        Optional.ofNullable(huaNongCrawlerOrder.getNiInfos())
+                .ifPresent(niInfos -> niInfos.forEach(niInfo ->
+                        this.proposalInfos.add(new ProposalInfoDTO(niInfo.getNiPolicyNumber()))
+                ));
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ProposalInfoDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+
+        public ProposalInfoDTO(String proposalNo) {
+            this.proposalNo = proposalNo;
+        }
+    }
+}

تفاوت فایلی نمایش داده نمی شود زیرا این فایل بسیار بزرگ است
+ 317 - 10
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerQuotedPriceRequestRequest.java


+ 8 - 3
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerSaveRequestRequest.java

@@ -33,13 +33,17 @@ public class HuaNongCrawlerSaveRequestRequest implements HuaNongHeadRequest {
     @JSONField(name="loginCom")
     private String loginCom;
 
+    @JSONField(name="agentCode")
+    private String agentCode;
 
     public HuaNongCrawlerSaveRequestRequest(List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO> contract,
                                             List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractAccidentDTO> contractAccident,
-                                            String token, String loginCom) {
+                                            String token, String loginCom, String agentCode) {
         this.head = new HuaNongCrawlerRequestBaseHead(token);
+        this.head.setTransCode("Save");
         this.businessData = new BusinessDataDTO(contract, contractAccident);
         this.loginCom = loginCom;
+        this.agentCode = agentCode;
     }
 
 
@@ -68,10 +72,11 @@ public class HuaNongCrawlerSaveRequestRequest implements HuaNongHeadRequest {
             this.contract = new ArrayList<>();
             contract.forEach(item -> {
                 String riskCode = item.getContractMain().getRiskCode();
+                String querySequenceNo = item.getContractMain().getQuerySequenceNo();
                 if (Risk.RISK_0507.getRiskCode().equals(riskCode)) {
-                    this.ciDemandNo = item.getPlatFormMessage().getQuerySequenceNo();
+                    this.ciDemandNo = querySequenceNo;
                 } else {
-                    this.biDemandNo = item.getPlatFormMessage().getQuerySequenceNo();
+                    this.biDemandNo = querySequenceNo;
                 }
                 this.contract.add(new ContractDTO(riskCode, item.getContractMain()));
             });

+ 11 - 2
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerSubmitRequestRequest.java

@@ -50,16 +50,21 @@ public class HuaNongCrawlerSubmitRequestRequest implements HuaNongHeadRequest {
 
 
     public HuaNongCrawlerSubmitRequestRequest(HuaNongCrawlerOrder huaNongCrawlerOrder, String token, String loginCom) {
+        this(huaNongCrawlerOrder, token, loginCom, "0");
+    }
+
+    public HuaNongCrawlerSubmitRequestRequest(HuaNongCrawlerOrder huaNongCrawlerOrder, String token, String loginCom, String appliType) {
         this.head = new HuaNongCrawlerRequestBaseHead(token);
         this.operateType = "1";
         this.contractMain = ContractMainDTO.toContractMainDTO(huaNongCrawlerOrder);
-        this.appliType = "0";
+        this.appliType = appliType;
         this.underwritingMark = "";
         this.loginCom = loginCom;
         this.submitQuoteFlag = "";
-        this.htmlSource = "";
+        this.htmlSource = "56";
     }
 
+
     @NoArgsConstructor
     @Data
     @AllArgsConstructor
@@ -85,6 +90,10 @@ public class HuaNongCrawlerSubmitRequestRequest implements HuaNongHeadRequest {
             Optional.ofNullable(huaNongCrawlerOrder.getBiPolicyNumber())
                     .map(x -> new ContractMainDTO("2", x, "0", ""))
                     .ifPresent(contractMainDTOList::add);
+            Optional.ofNullable(huaNongCrawlerOrder.getNiInfos())
+                    .ifPresent(niInfos -> niInfos.forEach(niInfo ->
+                            contractMainDTOList.add(new ContractMainDTO("2", niInfo.getNiPolicyNumber(), "0", ""))
+                    ));
             return contractMainDTOList;
         }
 

+ 2 - 2
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest.java

@@ -35,11 +35,11 @@ public class HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest implements Hu
     private String userCode;
 
 
-    public HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest(String username, String token, String loginCom, String comCode) {
+    public HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest(String username, String token, String loginCom, String comCode,String producerCode) {
         this.head = new HuaNongCrawlerRequestBaseHead(token);
         this.loginCom = loginCom;
         this.comCode = comCode;
-        this.producerCode = "";
+        this.producerCode = producerCode;
         this.userCode = username;
     }
 

+ 9 - 2
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/response/HuaNongCrawlerCatalogQueryResponse.java

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.util.List;
+import java.util.Random;
 
 /**
  * @description: 大家财险 上传影像 目录查询
@@ -50,6 +51,8 @@ public class HuaNongCrawlerCatalogQueryResponse {
 
             @JsonProperty("docNum")
             private Integer docNum;
+            @JsonProperty("version")
+            private Integer version;
 
             @NoArgsConstructor
             @Data
@@ -122,14 +125,16 @@ public class HuaNongCrawlerCatalogQueryResponse {
                     this.thumbUrl = data.getThumbUrl();
                     this.imageUrl = data.getImageUrl();
                     this.progressStatl = 0;
-                    this.originalName = "";
+                    Random random = new Random();
+                    int randomNum = random.nextInt(900000) + 100000;
+                    this.originalName = randomNum + ".jpg";
                     this.pageFormat = "image/jpeg";
                     this.newFileFlag = 1;
                     this.noSubmitFileFlag = 0;
                     this.type = "image/jpeg";
                     this.createUserName = createUserName;
                     this.createUser = createUser;
-                    this.uploadOrg = uploadOrg;
+                    this.uploadOrg = "专经代业务一部";
                     this.createTime = TimeProcessing.nowDateTime();
                     this.pageName = data.getPageName();
                     this.tempId = data.getTempId();
@@ -202,4 +207,6 @@ public class HuaNongCrawlerCatalogQueryResponse {
             }
         }
     }
+
+
 }

+ 61 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/response/HuaNongCrawlerCopyImageCheckResponse.java

@@ -0,0 +1,61 @@
+package com.jzg.quotation.huanong.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+@NoArgsConstructor
+@Data
+public class HuaNongCrawlerCopyImageCheckResponse implements HuaNongHeadResponse {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty("head")
+    private HuaNongCrawlerBaseResponseHead head;
+
+    @JsonProperty("result")
+    private String result;
+
+    @JsonProperty("message")
+    private String message;
+
+    @JsonProperty("proposalResults")
+    private List<ProposalResultDTO> proposalResults;
+
+    public boolean isSuccess() {
+        if (head != null && "0".equals(head.getReturnCode())) {
+            if ("成功".equals(head.getReturnMessage()) || "OK".equals(message)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ProposalResultDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 1L;
+
+        @JsonProperty("proposalNo")
+        private String proposalNo;
+
+        @JsonProperty("result")
+        private String result;
+
+        @JsonProperty("message")
+        private String message;
+
+        @JsonProperty("imageStatus")
+        private String imageStatus;
+
+        public boolean isImageUploaded() {
+            return "已上传".equals(imageStatus) || "success".equals(result);
+        }
+    }
+}

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/HuaNongCrawlerOrderService.java

@@ -20,7 +20,7 @@ public interface HuaNongCrawlerOrderService {
      * @param ciPolicyNumber 交强投保单号
      * @param biPolicyNumber 商业投保单号
      */
-    void saveOrder(String orderNo, String ciPolicyNumber, String biPolicyNumber);
+    void saveOrder(String orderNo, String ciPolicyNumber, String biPolicyNumber,String jyPolicyNumber);
 
 
 }

+ 5 - 4
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/HuaNongCrawlerQuoteProcessService.java

@@ -34,11 +34,12 @@ public interface HuaNongCrawlerQuoteProcessService {
     /**
      * 上传影像
      *
-     * @param loginInfoBO 登录信息
-     * @param agreementId 协议号
-     * @param contractNo  华农订单号
-     * @param imageVoList 影像列表
+     * @param loginInfoBO      登录信息
+     * @param agreementId      协议号
+     * @param contractNo       组合后的投保单号(商业,交强)
+     * @param imageVoList      影像列表
      */
     void uploadImage(LoginInfoBO loginInfoBO, String agreementId, String contractNo, List<InsuranceImageVo> imageVoList);
+    void uploadImageToUnclassified(LoginInfoBO loginInfoBO, String agreementId, String contractNo, List<String> allPolicyNumbers,List<InsuranceImageVo> imageVoList);
 
 }

+ 1 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerGetTokenImpl.java

@@ -34,7 +34,7 @@ public class HuaNongCrawlerGetTokenImpl implements HuaNongCrawlerGetToken {
     public RMap<String, Object> getAuthorization(String username, String password) {
         return getAuthData(username, password,
                 () -> huaNongCrawlerCacheComponent.getAuthorization(username),
-                auth -> !ObjectUtils.isEmpty(auth));
+                auth -> auth != null && !auth.isEmpty());
     }
 
     private <T> T getAuthData(String username, String password,

+ 10 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerOrderServiceImpl.java

@@ -8,6 +8,8 @@ import lombok.RequiredArgsConstructor;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -25,7 +27,7 @@ public class HuaNongCrawlerOrderServiceImpl implements HuaNongCrawlerOrderServic
     }
 
     @Override
-    public void saveOrder(String orderNo, String ciPolicyNumber, String biPolicyNumber) {
+    public void saveOrder(String orderNo, String ciPolicyNumber, String biPolicyNumber,String niPolicyNumber) {
         HuaNongCrawlerOrder huaNongCrawlerOrder = new HuaNongCrawlerOrder();
         String policyNumber = Stream.of(ciPolicyNumber, biPolicyNumber)
                 .filter(StringUtils::isNotEmpty)
@@ -35,6 +37,13 @@ public class HuaNongCrawlerOrderServiceImpl implements HuaNongCrawlerOrderServic
         huaNongCrawlerOrder.setCiPolicyNumber(ciPolicyNumber);
         huaNongCrawlerOrder.setBiPolicyNumber(biPolicyNumber);
         huaNongCrawlerOrder.setRecordingTime(TimeProcessing.nowDateTime());
+        if(StringUtils.isNotEmpty(niPolicyNumber)){
+            List<HuaNongCrawlerOrder.NiInfo> niInfos = new ArrayList<>();
+            HuaNongCrawlerOrder.NiInfo  niInfo= new HuaNongCrawlerOrder.NiInfo();
+            niInfo.setNiPolicyNumber(niPolicyNumber);
+            niInfos.add(niInfo);
+            huaNongCrawlerOrder.setNiInfos(niInfos);
+        }
         huaNongCrawlerOrderRepository.save(huaNongCrawlerOrder);
     }
 

+ 187 - 8
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerQuoteProcessServiceImpl.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.huanong.crawler.service.impl;
 
+import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.component.DistributedLockComponent;
@@ -69,11 +70,11 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
             HuaNongCrawlerVerificationCodeRequestRequest huaNongCrawlerVerificationCodeRequest = new HuaNongCrawlerVerificationCodeRequestRequest();
             HuaNongCrawlerVerificationCodeResponse huaNongCrawlerVerificationCodeResponse = huaNongCrawlerRequestComponent.verificationCode(huaNongCrawlerVerificationCodeRequest, httpHeaders);
             // 识别验证码
-            String captcha = exteriorUtilsRequest.captchaIdentify(huaNongCrawlerVerificationCodeResponse.getImageStream());
+            String captcha = exteriorUtilsRequest.captchaCalculate(huaNongCrawlerVerificationCodeResponse.getImageStream());
             // 验证码结果
-            String captchaResult = parseCaptcha(captcha);
+            //String captchaResult = parseCaptcha(captcha);
             // 登录
-            HuaNongCrawlerLoginRequestRequest huaNongCrawlerLoginRequest = new HuaNongCrawlerLoginRequestRequest(username, password, huaNongCrawlerVerificationCodeResponse.getCaptchaKey(), captchaResult);
+            HuaNongCrawlerLoginRequestRequest huaNongCrawlerLoginRequest = new HuaNongCrawlerLoginRequestRequest(username, password, huaNongCrawlerVerificationCodeResponse.getCaptchaKey(), captcha);
             HuaNongCrawlerLoginResponse login = huaNongCrawlerRequestComponent.login(huaNongCrawlerLoginRequest, httpHeaders);
             if (isLoginSuccessful(login)) {
                 huaNongCrawlerCacheComponent.cacheLoginInfo(login, username);
@@ -142,7 +143,7 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
                     .collect(Collectors.toMap(HuaNongCrawlerComInfoQueryResponse.ComListDTO::getComCode, x -> x));
 
             // 代理人信息
-            HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest userTypeAndProxyInfoQueryRequest = new HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest(username, token, loginComCode, parameters.getComCode());
+            HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest userTypeAndProxyInfoQueryRequest = new HuaNongCrawlerUserTypeAndProxyInfoQueryRequestRequest(username, token, loginComCode, parameters.getComCode(),parameters.getProducerCode());
             HuaNongCrawlerUserTypeAndProxyInfoQueryResponse userTypeAndProxyInfoQueryResponse = huaNongCrawlerRequestComponent.userTypeAndProxyInfoQuery(userTypeAndProxyInfoQueryRequest, httpHeaders);
 
             //代理人
@@ -152,9 +153,18 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
 
             // 协议号
             List<HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.AgreementListDTO> agreementList = userTypeAndProxyInfoQueryResponse.getAgreementList();
-            Map<String, String> map = agreementList.stream()
+            /*Map<String, String> map = agreementList.stream()
                     .collect(Collectors.toMap(HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.AgreementListDTO::getAgreementNo, HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.AgreementListDTO::getAgentCode));
-
+*/
+            Map<String, String> map = Optional.ofNullable(agreementList)
+                    .orElseGet(Collections::emptyList)
+                    .stream()
+                    .filter(dto -> dto != null && dto.getAgreementNo() != null && dto.getAgentCode() != null)
+                    .collect(Collectors.toMap(
+                            HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.AgreementListDTO::getAgreementNo,
+                            HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.AgreementListDTO::getAgentCode,
+                            (existing, replacement) -> existing  // 重复键保留第一个
+                    ));
             // 业务员
             List<HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.HandlerListDTO> handlerList = userTypeAndProxyInfoQueryResponse.getHandlerList();
             Map<String, HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.HandlerListDTO> handler = handlerList.stream()
@@ -171,7 +181,7 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
             HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.ProducerListDTO producerListDTO = producerMap.get(parameters.getProducer());
 
             HuaNongCrawlerComInfoQueryResponse.ComListDTO comListDTO = com.get(parameters.getComCode());
-            HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.HandlerListDTO handlerListDTO = handler.get(parameters.getHandlerCode());
+            HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.HandlerListDTO handlerListDTO = Optional.ofNullable(handlerList).filter(CollectionUtils::isNotEmpty).map(list -> list.get(0)).orElse(null);
             HuaNongCrawlerUserTypeAndProxyInfoQueryResponse.AgentInfoListDTO agentInfoListDTO = agentInfoListDTOMap.get(map.get(parameters.getAgreementNo()));
             return new HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO(comListDTO, handlerListDTO, agentInfoListDTO, producerListDTO, baseInfoDTO, parameters.getCallerName());
         }, HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO.class, Duration.ofHours(HuaNongCrawlerCacheComponent.SALE_INFO_TIME));
@@ -249,7 +259,6 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
                 node.setPagesNew(null);
             }
 
-            // 设置属性
             node.setId(null);
             node.setAppCode(treeDataDTO.getAppCode());
             node.setAppName(treeDataDTO.getAppName());
@@ -281,6 +290,19 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
      */
     private static void setUpPagesDTO(HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO child, Map<String, List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO>> uploadDataMap) {
         List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO> pagesDTOS = uploadDataMap.get(child.getNodeCode());
+       /* String nodeCode = child.getNodeCode();
+        List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO> pagesDTOS;
+        if (nodeCode != null) {
+            // 找到 uploadDataMap 中 key 以 nodeCode 开头的项
+            pagesDTOS = uploadDataMap.entrySet().stream()
+                    .filter(entry -> entry.getKey().startsWith(nodeCode))
+                    .map(Map.Entry::getValue)
+                    .findFirst()
+                    .orElse(null);
+        } else {
+            pagesDTOS = null;
+        }*/
+
         Optional.ofNullable(pagesDTOS).ifPresent(pagesDTOS1 -> {
             String id = ImageIdGenerate.getId(18);
             pagesDTOS1.forEach(pagesDTO -> {
@@ -299,4 +321,161 @@ public class HuaNongCrawlerQuoteProcessServiceImpl implements HuaNongCrawlerQuot
 
     }
 
+
+
+    // 需要将图片上传到未分类节点,不然上传不上去!!!
+    public void uploadImageToUnclassified(LoginInfoBO loginInfoBO, String agreementId, String contractNo,
+                                          List<String> policyNumbers, List<InsuranceImageVo> imageVoList) {
+        HuaNongCrawlerQuotedPriceRequestRequest.BusinessDataDTO.SaleInfoDTO saleInfoDTO = huaNongCrawlerCacheComponent.getSaleInfoDTO(agreementId);
+
+        HuaNongCrawlerNewImageQueryRequestRequest huaNongCrawlerNewImageQueryRequest
+                = new HuaNongCrawlerNewImageQueryRequestRequest(loginInfoBO.getLoginCom(), loginInfoBO.getLoginComCode(), contractNo, loginInfoBO.getToken(), saleInfoDTO.getSalesman()
+                .get(0)
+                .getHandlerCode(), saleInfoDTO.getSalesman().get(0).getHandlerName());
+        String data = huaNongCrawlerRequestComponent.newImageQuery(huaNongCrawlerNewImageQueryRequest, new HttpHeaders());
+
+        HttpHeaders httpHeaders = new HttpHeaders();
+        String accessToken = huaNongCrawlerRequestComponent.bizUpload(data, httpHeaders);
+
+        if ("ERROR".equals(accessToken)) {
+            data = huaNongCrawlerRequestComponent.newImageQuery(huaNongCrawlerNewImageQueryRequest, new HttpHeaders());
+            accessToken = huaNongCrawlerRequestComponent.bizUpload(data, httpHeaders);
+        }
+
+        HuaNongCrawlerBizQueryResponse huaNongCrawlerBizQueryResponse = huaNongCrawlerRequestComponent.bizQuery(accessToken, httpHeaders);
+        Integer version = huaNongCrawlerBizQueryResponse.getData().getBaseData().getBizInfo().get(0).getVersion();
+
+        Map<String, List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO>> uploadDataMap = new HashMap<>();
+        String finalAccessToken = accessToken;
+        imageVoList.forEach(insuranceImageVo -> {
+            String imageCode = insuranceImageVo.getInsuranceImageCode();
+            if (!uploadDataMap.containsKey(imageCode)) {
+                uploadDataMap.put(imageCode, new ArrayList<>());
+            }
+            insuranceImageVo.getImageBase64List().forEach(imageDTO -> {
+                String uuidFileName = UUID.randomUUID().toString();
+                String[] split = imageDTO.getImageName().split("\\.");
+                HuaNongCrawlerFileUploadResponse fileUpload = huaNongCrawlerRequestComponent.fileUpload(finalAccessToken, uuidFileName, "." + split[1], imageDTO.getImageByte(), httpHeaders);
+                HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO pagesDTO = new HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO(fileUpload.getData(), loginInfoBO.getUserName(), loginInfoBO.getUserCode(), loginInfoBO.getLoginCom());
+                uploadDataMap.get(imageCode).add(pagesDTO);
+            });
+        });
+
+        List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO> allPages = collectAllPages(uploadDataMap);
+
+        List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO> vtreeList = new ArrayList<>();
+
+        for (String policyNo : policyNumbers) {
+            HuaNongCrawlerCatalogQueryResponse huaNongCrawlerCatalogQueryResponse = huaNongCrawlerRequestComponent.catalogQuery(accessToken, policyNo, httpHeaders);
+            List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO> treeData = huaNongCrawlerCatalogQueryResponse.getData().getTreeData();
+
+            for (HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO treeDataDTO : treeData) {
+                List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO> nodes = treeDataDTO.getNodes();
+                if (nodes == null) {
+                    continue;
+                }
+
+                Iterator<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO> iterator = nodes.iterator();
+                while (iterator.hasNext()) {
+                    HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO node = iterator.next();
+                    if ("已删除".equals(node.getNodeName()) || "未分类".equals(node.getNodeName())) {
+                        iterator.remove();
+                    }
+                }
+
+                processNodesWithoutUpload(nodes, treeDataDTO);
+
+                if (!allPages.isEmpty()) {
+                    HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO unclassifiedNode = createUnclassifiedNode(allPages, policyNo, treeDataDTO.getAppCode());
+                    nodes.add(unclassifiedNode);
+                }
+
+                HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO resultTreeData = new HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO();
+                resultTreeData.setAppCode(treeDataDTO.getAppCode());
+                resultTreeData.setAppName(treeDataDTO.getAppName());
+                resultTreeData.setBizNo(policyNo);
+                resultTreeData.setVersion(version);
+                resultTreeData.setNodes(nodes);
+                vtreeList.add(resultTreeData);
+            }
+        }
+
+        HuaNongCrawlerFileSubmitRequest huaNongCrawlerFileSubmitRequest = new HuaNongCrawlerFileSubmitRequest(vtreeList, version);
+        huaNongCrawlerRequestComponent.fileSubmit(huaNongCrawlerFileSubmitRequest, accessToken, httpHeaders);
+    }
+
+    private void processNodesWithoutUpload(List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO> nodes,
+                                           HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO treeDataDTO) {
+        for (HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO node : nodes) {
+            if ("DELETE".equals(node.getNodeCode())) {
+                node.setPages(null);
+                node.setPagesNew(null);
+            }
+
+            node.setId(null);
+            node.setAppCode(treeDataDTO.getAppCode());
+            node.setAppName(treeDataDTO.getAppName());
+            node.setIcon("iconwj-wj-2");
+            node.setBizNo(treeDataDTO.getBizNo());
+            node.setLabel(node.getNodeName() + "(0)");
+            node.setPages(null);
+            node.setPagesNew(null);
+
+            if (node.getChildren() != null && !node.getChildren().isEmpty()) {
+                for (HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO child : node.getChildren()) {
+                    child.setPages(null);
+                    child.setId(null);
+                    child.setBizNo(treeDataDTO.getBizNo());
+                    child.setAppCode(treeDataDTO.getAppCode());
+                    child.setAppName(treeDataDTO.getAppName());
+                    child.setIcon("iconwj-wj-2");
+                    child.setLabel(child.getNodeName() + "(0)");
+                    child.setPages(null);
+                    child.setPagesNew(null);
+                }
+            }
+        }
+    }
+
+    private List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO> collectAllPages(
+            Map<String, List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO>> uploadDataMap) {
+        List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO> allPages = new ArrayList<>();
+        for (Map.Entry<String, List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO>> entry : uploadDataMap.entrySet()) {
+            if (entry.getValue() != null && !entry.getValue().isEmpty()) {
+                allPages.addAll(entry.getValue());
+            }
+        }
+        return allPages;
+    }
+
+    private HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO createUnclassifiedNode(
+            List<HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO> pages, String bizNo, String appCode) {
+        HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO node = new HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.NodesDTO();
+        node.setNodeName("未分类");
+        node.setDocNum(pages.size());
+        node.setLabel("未分类(" + pages.size() + ")");
+        node.setNodeCode("UNTYPE");
+        node.setId(null);
+        node.setIcon("iconwj-wj-2");
+        node.setNewNodeFlag(1);
+        node.setAppCode(appCode);
+        node.setBizNo(bizNo);
+        node.setAppName("承保车险");
+        node.setPid("0");
+        node.setNodeLevel(0);
+
+        String nodeId = ImageIdGenerate.getId(18);
+        for (HuaNongCrawlerCatalogQueryResponse.DataDTO.TreeDataDTO.PagesDTO pagesDTO : pages) {
+            pagesDTO.setNodeId(nodeId);
+            pagesDTO.setAppCode(appCode);
+            pagesDTO.setBizNo(bizNo);
+            pagesDTO.setId(ImageIdGenerate.getId(18));
+            pagesDTO.setPageDesc("未分类");
+        }
+
+        node.setPages(pages);
+        node.setPagesNew(pages);
+        return node;
+    }
+
 }

+ 337 - 24
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.huanong.crawler.service.impl;
 
 import cn.hutool.json.JSONUtil;
+import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -29,13 +30,13 @@ import com.jzg.quotation.huanong.enums.dictionary.Risk;
 import lombok.RequiredArgsConstructor;
 import org.jetbrains.annotations.NotNull;
 import org.redisson.api.RMap;
+import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.http.HttpHeaders;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
+import java.time.Duration;
+import java.util.*;
 
 @QuoteCrawlerService(InsuranceCode.INSURANCE_HNIC)
 @RequiredArgsConstructor
@@ -43,6 +44,7 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
 
     private static final Logger log = LoggerFactory.getLogger(HuaNongCrawlerRequestImpl.class);
     private final HuaNongCrawlerRequestComponent huaNongCrawlerRequestComponent;
+    private final RedissonClient redissonClient;
 
     private final HuaNongCrawlerOrderService huaNongCrawlerOrderService;
 
@@ -85,30 +87,118 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         HuaNongCrawlerQuotedPriceRequestRequest huaNongCrawlerQuotedPriceRequest = new HuaNongCrawlerQuotedPriceRequestRequest(loginInfoDto.getToken(), attributionInformationVo.getUsername(), quoteVo, loginInfoDto.getLoginComCode(), actualValue, loginInfoDto.getParameters(), carModel, saleInfoDTO);
 
         HuaNongCrawlerQuotedPriceResponse huaNongCrawlerQuotedPriceResponse = huaNongCrawlerRequestComponent.quotedPrice(huaNongCrawlerQuotedPriceRequest, httpHeaders);
+
         // 处理重复投保
         if ("0".equals(huaNongCrawlerQuotedPriceResponse.getHead().getReturnCode())) {
-            List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO> contractList = huaNongCrawlerQuotedPriceResponse.getBusinessData().getContract();
-            for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : contractList) {
-                String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
-                String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
-                boolean isCiReInsure = ciReinsureMsg != null && ciReinsureMsg.contains("重复投保");
-                boolean isBiReInsure = biReinsureMsg != null && biReinsureMsg.contains("重复投保");
-                if (isCiReInsure || isBiReInsure) {
-                    huaNongCrawlerQuotedPriceResponse = repeatQuote(huaNongCrawlerQuotedPriceRequest,contract ,httpHeaders);
-                }
-            }
+            huaNongCrawlerQuotedPriceResponse = handleDuplicateInsurance(
+                    huaNongCrawlerQuotedPriceRequest,
+                    huaNongCrawlerQuotedPriceResponse,
+                    httpHeaders);
         }
+        // 检查报价异常
+        checkQuoteError(huaNongCrawlerQuotedPriceResponse);
+
         // 6 保存
-        HuaNongCrawlerSaveRequestRequest huaNongCrawlerSaveRequest = getHuaNongCrawlerSaveRequestRequest(huaNongCrawlerQuotedPriceResponse, loginInfoDto.getToken(), loginInfoDto.getLoginComCode());
+        String agentCode = huaNongCrawlerQuotedPriceRequest.getAgentCode();
+        HuaNongCrawlerSaveRequestRequest huaNongCrawlerSaveRequest = getHuaNongCrawlerSaveRequestRequest(huaNongCrawlerQuotedPriceResponse, loginInfoDto.getToken(), loginInfoDto.getLoginComCode(), agentCode);
         HuaNongCrawlerSaveResponse saveResponse = huaNongCrawlerRequestComponent.save(huaNongCrawlerSaveRequest, httpHeaders);
 
         QuoteResultsVo quoteResultsVo = HuaNongCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder()
                 .getOrdersNo(), quoteVo, huaNongCrawlerQuotedPriceResponse, saveResponse);
         // 7 将订单信息保存到mongodb(后续需要使用)
-        huaNongCrawlerOrderService.saveOrder(quoteResultsVo.getOrdersNo(), quoteResultsVo.getCiPolicyNumber(), quoteResultsVo.getBiPolicyNumber());
+        huaNongCrawlerOrderService.saveOrder(quoteResultsVo.getOrdersNo(), quoteResultsVo.getCiPolicyNumber(), quoteResultsVo.getBiPolicyNumber(),quoteResultsVo.getJyPolicyNumber());
         return quoteResultsVo;
     }
 
+    /**
+     * 处理重复投保逻辑
+     * 检测到重复投保时调整日期后重试,重试后仍重复投保则抛出异常
+     *
+     * @param request 报价请求
+     * @param response 报价响应
+     * @param httpHeaders 请求头
+     * @return 处理后的报价响应
+     */
+    private HuaNongCrawlerQuotedPriceResponse handleDuplicateInsurance(
+            HuaNongCrawlerQuotedPriceRequestRequest request,
+            HuaNongCrawlerQuotedPriceResponse response,
+            HttpHeaders httpHeaders) {
+        // 检查是否有重复投保
+        if (response == null || response.getBusinessData() == null) {
+            return response;
+        }
+
+        List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO> contractList = response.getBusinessData().getContract();
+        if (contractList == null) {
+            return response;
+        }
+
+        // 遍历检查并处理重复投保
+        for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : contractList) {
+            if (contract.getPlatFormMessage() == null) {
+                continue;
+            }
+            String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
+            String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
+            boolean isCiReInsure = StringUtils.hasText(ciReinsureMsg) && ciReinsureMsg.contains("重复投保");
+            boolean isBiReInsure = StringUtils.hasText(biReinsureMsg) && biReinsureMsg.contains("重复投保");
+
+            if (isCiReInsure || isBiReInsure) {
+                // 调整日期并重试
+                response = repeatQuote(request, contract, httpHeaders);
+            }
+        }
+
+        // 重试后再次检查,如果仍然重复投保则抛出异常
+        for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : response.getBusinessData().getContract()) {
+            if (contract.getPlatFormMessage() == null) {
+                continue;
+            }
+            String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
+            String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
+            if ((StringUtils.hasText(ciReinsureMsg) && ciReinsureMsg.contains("重复投保")) ||
+                    (StringUtils.hasText(biReinsureMsg) && biReinsureMsg.contains("重复投保"))) {
+                String errorMsg = (StringUtils.hasText(ciReinsureMsg) ? "交强险:" + ciReinsureMsg : "") +
+                        (StringUtils.hasText(biReinsureMsg) ? " 商业险:" + biReinsureMsg : "");
+                throw new SystemException("重复投保处理失败:" + errorMsg);
+            }
+        }
+
+        return response;
+    }
+
+    /**
+     * 检查报价异常
+     *
+     * @param response 报价响应
+     */
+    private void checkQuoteError(HuaNongCrawlerQuotedPriceResponse response) {
+        if (response == null) {
+            throw new SystemException("报价响应为空");
+        }
+        HuaNongCrawlerBaseResponseHead head = response.getHead();
+        if (head == null) {
+            throw new SystemException("报价响应头为空");
+        }
+        // 检查 returnMessage 是否为成功
+        String returnMessage = head.getReturnMessage();
+        if (returnMessage != null && !"成功".equals(returnMessage)) {
+            throw new SystemException(returnMessage);
+        }
+        // 检查下发修改
+        if (response.getBusinessData() != null && response.getBusinessData().getBusinessMain() != null) {
+            HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.BusinessMainDTO businessMain = response.getBusinessData().getBusinessMain();
+            String iLogPreUdwMess = businessMain.getILogPreUdwMess();
+            if (iLogPreUdwMess != null && !iLogPreUdwMess.isEmpty() && iLogPreUdwMess.contains("下发修改")) {
+                // 去除换行和空格
+                String errorMessage = iLogPreUdwMess.replace("\n", "").replace(" ", "");
+                throw new SystemException(errorMessage);
+            }
+        }
+    }
+
+
+
     // 处理重复投保
     private HuaNongCrawlerQuotedPriceResponse repeatQuote(HuaNongCrawlerQuotedPriceRequestRequest huaNongCrawlerQuotedPriceRequest,HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract,HttpHeaders httpHeaders) {
         String riskCode = contract.getContractMain().getRiskCode();
@@ -124,7 +214,7 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
                         });
             }
         } else if ("0507".equals(riskCode)) {
-            String lastExpireDate = contract.getPlatFormMessage().getCiReinsureEndDate();
+            String lastExpireDate = ensureDateTimeFormat(contract.getPlatFormMessage().getCiReinsureEndDate());;
             if (lastExpireDate != null && !lastExpireDate.trim().isEmpty()) {
                 huaNongCrawlerQuotedPriceRequest.getBusinessData().getContract().stream()
                         .filter(dto -> "0507".equals(dto.getContractMain().getRiskCode()))
@@ -138,14 +228,39 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         return huaNongCrawlerRequestComponent.quotedPrice(huaNongCrawlerQuotedPriceRequest, httpHeaders);
     }
 
+    public  String ensureDateTimeFormat(String dateStr) {
+        if (dateStr == null || dateStr.trim().isEmpty()) {
+            return "";
+        }
+        dateStr = dateStr.trim();
+
+        // 如果已经是完整格式 (19字符 yyyy-MM-dd HH:mm:ss),直接返回
+        if (dateStr.length() >= 19) {
+            return dateStr.substring(0, 19);
+        }
+
+        // 如果是 yyyy-MM-dd 格式 (10字符),补充时间部分
+        if (dateStr.length() == 10) {
+            return dateStr + " 00:00:00";
+        }
+
+        // 如果是 yyyy-MM-dd HH:mm 格式 (16字符),补充秒
+        if (dateStr.length() == 16) {
+            return dateStr + ":00";
+        }
+
+        // 其他情况原样返回
+        return dateStr;
+    }
+
     @NotNull
-    private static HuaNongCrawlerSaveRequestRequest getHuaNongCrawlerSaveRequestRequest(HuaNongCrawlerQuotedPriceResponse huaNongCrawlerQuotedPriceResponse, String token, String loginComCode) {
+    private static HuaNongCrawlerSaveRequestRequest getHuaNongCrawlerSaveRequestRequest(HuaNongCrawlerQuotedPriceResponse huaNongCrawlerQuotedPriceResponse, String token, String loginComCode, String agentCode) {
         List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO> contract = huaNongCrawlerQuotedPriceResponse.getBusinessData()
                 .getContract();
         List<HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractAccidentDTO> contractAccident = Optional.ofNullable(huaNongCrawlerQuotedPriceResponse.getBusinessData()
                 .getContractAccident()).orElse(new ArrayList<>());
 
-        return new HuaNongCrawlerSaveRequestRequest(contract, contractAccident, token, loginComCode);
+        return new HuaNongCrawlerSaveRequestRequest(contract, contractAccident, token, loginComCode, agentCode);
     }
 
     @Override
@@ -158,13 +273,156 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         // 获取订单
         HuaNongCrawlerOrder huaNongCrawlerOrder = huaNongCrawlerOrderService.getById(underwritingVo.getOrder()
                 .getOrdersNo());
-        // 提交核保
+
+        log.info("开始提交核保...");
         HuaNongCrawlerSubmitRequestRequest huaNongCrawlerSubmitRequest = new HuaNongCrawlerSubmitRequestRequest(huaNongCrawlerOrder, token, huaNongCrawlerConfigureParameters.getComCode());
         HuaNongCrawlerSubmitResponse submit = huaNongCrawlerRequestComponent.submit(huaNongCrawlerSubmitRequest, new HttpHeaders());
+
+
+        // 检查是否需要转人工
+        if (isManualSubmitRequired(submit)) {
+            log.info("核保返回状态9,需要转人工...");
+            // 提取核保失败原因
+            String manualMessage = extractManualMessage(submit);
+            log.info("转人工原因: {}", manualMessage);
+            // 调用转人工接口 (appliType = "1")
+            HuaNongCrawlerSubmitRequestRequest manualSubmitRequest = new HuaNongCrawlerSubmitRequestRequest(huaNongCrawlerOrder, token, huaNongCrawlerConfigureParameters.getComCode(), "1");
+            HuaNongCrawlerSubmitResponse manualSubmit = huaNongCrawlerRequestComponent.submit(manualSubmitRequest, new HttpHeaders());
+            log.info("转人工调用完成");
+            // 正常核保:获取支付链接
+            log.info("核保成功,开始获取支付链接...");
+            // 获取用户名(与Python一致,使用username作为operatorCode)
+            String username = attributionInformationVo.getUsername();
+            String ciPolicyNumber = huaNongCrawlerOrder.getCiPolicyNumber();
+            String biPolicyNumber = huaNongCrawlerOrder.getBiPolicyNumber();
+
+            // 获取支付链接
+            String payUrl = huaNongCrawlerRequestComponent.getPayUrl(ciPolicyNumber, biPolicyNumber, username);
+            log.info("支付链接获取完成: {}", payUrl);
+            // 返回转人工结果
+            return convertToUnderwritingResultsVo(manualSubmit,payUrl);
+        }
+
+        // 正常核保:获取支付链接
+        log.info("核保成功,开始获取支付链接...");
+        // 获取用户名(与Python一致,使用username作为operatorCode)
+        String username = attributionInformationVo.getUsername();
+        String ciPolicyNumber = huaNongCrawlerOrder.getCiPolicyNumber();
+        String biPolicyNumber = huaNongCrawlerOrder.getBiPolicyNumber();
+
+        // 获取支付链接
+        String payUrl = huaNongCrawlerRequestComponent.getPayUrl(ciPolicyNumber, biPolicyNumber, username);
+        log.info("支付链接获取完成: {}", payUrl);
+
+        // 正常核保结果
+        return convertToUnderwritingResultsVo(submit,payUrl);
+
+    }
+
+    /**
+     * 检查是否需要转人工
+     *
+     * @param submit 核保响应
+     * @return true-需要转人工,false-不需要
+     */
+    private boolean isManualSubmitRequired(HuaNongCrawlerSubmitResponse submit) {
+        if (submit == null || submit.getAppliResult() == null || submit.getAppliResult().isEmpty()) {
+            return false;
+        }
+
+        // 检查状态是否为9
+        String status = submit.getAppliResult().get(0).getStatus();
+        return "9".equals(status);
+    }
+
+    /**
+     * 提取转人工原因
+     *
+     * @param submit 核保响应
+     * @return 转人工原因
+     */
+    private String extractManualMessage(HuaNongCrawlerSubmitResponse submit) {
+        if (submit == null || submit.getAppliResult() == null || submit.getAppliResult().isEmpty()) {
+            return "";
+        }
+        StringBuilder message = new StringBuilder();
+        for (HuaNongCrawlerSubmitResponse.AppliResultDTO appliResult : submit.getAppliResult()) {
+            if (appliResult.getNotion() != null && !appliResult.getNotion().isEmpty()) {
+                for (HuaNongCrawlerSubmitResponse.AppliResultDTO.NotionDTO notion : appliResult.getNotion()) {
+                    if (notion.getUWNotion() != null && !notion.getUWNotion().isEmpty()) {
+                        if (!message.isEmpty()) {
+                            message.append("\n");
+                        }
+                        message.append(notion.getUWNotion());
+                    }
+                }
+            }
+        }
+        return message.toString();
+    }
+
+
+    /**
+     * 将华农核保响应转换为系统核保结果
+     *
+     * @param submit   华农核保响应
+     * @param payUrl 系统订单号
+     * @return 系统核保结果
+     */
+    private UnderwritingResultsVo convertToUnderwritingResultsVo(HuaNongCrawlerSubmitResponse submit,String payUrl) {
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
-        return underwritingResultsVo;
+
+        if (submit == null || submit.getAppliResult() == null || submit.getAppliResult().isEmpty()) {
+            return underwritingResultsVo;
+        }
+        String status = submit.getAppliResult().get(0).getStatus();
+        // 核保返回状态8 是 成功,9 是人工核保
+        if("8".equals(status) || "9".equals(status)){
+            // 遍历所有险种结果(交强、商业等)
+            StringBuilder underwritingResultBuilder = new StringBuilder();
+            for (HuaNongCrawlerSubmitResponse.AppliResultDTO appliResult : submit.getAppliResult()) {
+                String contractNo = appliResult.getContractNo();
+                String riskType = appliResult.getRiskType();
+
+                // 根据险种类型设置对应投保单号
+                if ("CI".equals(riskType)) {
+                    underwritingResultsVo.setJqApplyNo(contractNo);
+                } else if ("BI".equals(riskType)) {
+                    underwritingResultsVo.setSyApplyNo(contractNo);
+                }
+                // 状态转换:以第一个为准
+                if (underwritingResultsVo.getUnderwritingStatus() == null) {
+                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+                }
+                // 拼接核保意见
+                if (appliResult.getNotion() != null && !appliResult.getNotion().isEmpty()) {
+                    String notion = appliResult.getNotion().stream()
+                            .map(HuaNongCrawlerSubmitResponse.AppliResultDTO.NotionDTO::getUWNotion)
+                            .filter(java.util.Objects::nonNull)
+                            .collect(java.util.stream.Collectors.joining(";"));
+
+                    if (!underwritingResultBuilder.isEmpty()) {
+                        underwritingResultBuilder.append(" | ");
+                    }
+                    underwritingResultBuilder.append(riskType).append(":").append(notion);
+                }
+            }
+
+            // 设置保司订单号(取第一个)
+            underwritingResultsVo.setCompanyOrderNo(submit.getAppliResult().get(0).getContractNo());
+            underwritingResultsVo.setUnderwritingResult(underwritingResultBuilder.toString());
+            underwritingResultsVo.setPaymentLink(payUrl);
+
+            return underwritingResultsVo;
+        }else{
+            throw new SystemException(submit.getAppliResult().get(0).getNotion().get(0).getUWNotion());
+        }
+
+
     }
 
+
+
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) {
         HuaNongCrawlerOrder huaNongCrawlerOrder = huaNongCrawlerOrderService.getById(paymentLinkVo.getOrder()
@@ -186,13 +444,53 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
         HuaNongCrawlerOrder huaNongCrawlerOrder = huaNongCrawlerOrderService.getById(insuranceUploadImageVo.getOrder()
                 .getOrdersNo());
-        String contractNo = huaNongCrawlerOrder.getOrdersNo();
+
+        String biPolicyNumber = huaNongCrawlerOrder.getBiPolicyNumber();
+        String ciPolicyNumber = huaNongCrawlerOrder.getCiPolicyNumber();
+        List<HuaNongCrawlerOrder.NiInfo> niInfos = huaNongCrawlerOrder.getNiInfos();
+        String contractNo = buildContractNo(biPolicyNumber, ciPolicyNumber);
+
+        List<String> policyNumbers = buildPolicyNumbers(biPolicyNumber, ciPolicyNumber, niInfos);
+
         AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder()
                 .getAttributionInformationVo();
         LoginInfoBO loginInfoDto = getLoginInfoDto(attributionInformationVo);
-        // 上传影像 封装
-        huaNongCrawlerQuoteProcessService.uploadImage(loginInfoDto, insuranceUploadImageVo.getOrder()
-                .getAgreementId(), contractNo, insuranceUploadImageVo.getImageVoList());
+        huaNongCrawlerQuoteProcessService.uploadImageToUnclassified(loginInfoDto, insuranceUploadImageVo.getOrder()
+                .getAgreementId(), contractNo, policyNumbers,insuranceUploadImageVo.getImageVoList());
+    }
+    private String buildContractNo(String biPolicyNumber, String ciPolicyNumber) {
+        boolean hasBi = biPolicyNumber != null && !biPolicyNumber.isEmpty();
+        boolean hasCi = ciPolicyNumber != null && !ciPolicyNumber.isEmpty();
+
+        if (hasBi && hasCi) {
+            return biPolicyNumber + "," + ciPolicyNumber;
+        } else if (hasCi) {
+            return "," + ciPolicyNumber;
+        } else if (hasBi) {
+            return biPolicyNumber;
+        }
+        return "";
+    }
+
+    private List<String> buildPolicyNumbers(String biPolicyNumber, String ciPolicyNumber, List<HuaNongCrawlerOrder.NiInfo> niInfos) {
+        List<String> policyNumbers = new ArrayList<>();
+
+        if (biPolicyNumber != null && !biPolicyNumber.isEmpty()) {
+            policyNumbers.add(biPolicyNumber);
+        }
+        if (ciPolicyNumber != null && !ciPolicyNumber.isEmpty()) {
+            policyNumbers.add(ciPolicyNumber);
+        }
+        if (niInfos != null && !niInfos.isEmpty()) {
+            for (HuaNongCrawlerOrder.NiInfo niInfo : niInfos) {
+                String niPolicyNumber = niInfo.getNiPolicyNumber();
+                if (niPolicyNumber != null && !niPolicyNumber.isEmpty()) {
+                    policyNumbers.add(niPolicyNumber);
+                }
+            }
+        }
+
+        return policyNumbers;
     }
 
     @Override
@@ -270,6 +568,8 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
      */
     private LoginInfoBO getLoginInfoDto(AttributionInformationVo attributionInformationVo) {
         HuaNongCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(HuaNongCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        //todo  验证码问题,临时使用token
+        cacheLoginInfo(attributionInformationVo);
         RMap<String, Object> authorization = huaNongCrawlerGetToken.getAuthorization(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         String token = (String) authorization.get(HuaNongCrawlerCacheComponent.TOKEN);
         String userCode = (String) authorization.get(HuaNongCrawlerCacheComponent.USER_CODE);
@@ -279,5 +579,18 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         return new LoginInfoBO(token, loginCom, loginComCode, userCode, userName, parameters);
     }
 
+    public void cacheLoginInfo(AttributionInformationVo attributionInformationVo) {
+        Map<String, Object> collect = new HashMap<>();
+        String redisKey = "hunong:crawler:authorization:"+attributionInformationVo.getUsername();
+        RMap<String, Object> rMap = redissonClient.getMap(redisKey);
+        collect.put("TOKEN", attributionInformationVo.getConfigInfo().get("token"));
+        collect.put("USER_CODE", attributionInformationVo.getUsername());
+        collect.put(attributionInformationVo.getConfigInfo().get("loginCom"), attributionInformationVo.getConfigInfo().get("loginCom"));
+        collect.put("USER_NAME", "潘建红");
+        rMap.putAll(collect);
+        rMap.expire(Duration.ofHours(3L));
+    }
+
+
 
 }

+ 2 - 0
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/utils/RequestEncryptor.java

@@ -36,4 +36,6 @@ public class RequestEncryptor {
         request.put("head", headers);
     }
 
+
+
 }

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است