Pārlūkot izejas kodu

中煤爬虫报价相关

shenweidong 1 gadu atpakaļ
vecāks
revīzija
728d504ee8
11 mainītis faili ar 1187 papildinājumiem un 13 dzēšanām
  1. 4 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/api/constant/TransCode.java
  2. 57 5
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/component/ZmCrawlerRequestComponent.java
  3. 10 2
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/constant/enums/RequestUrl.java
  4. 98 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerModelQueryRequest.java
  5. 47 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerNetpointQueryRequest.java
  6. 63 4
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerAuthenticateResponse.java
  7. 268 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerModelQueryResponse.java
  8. 216 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerNetpointQueryResponse.java
  9. 72 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/ZmCrawlerConfigureParameters.java
  10. 330 0
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/dto/SaleInfoDTO.java
  11. 22 2
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/service/Impl/ZhongMeiCrawlerRequestImpl.java

+ 4 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/api/constant/TransCode.java

@@ -45,4 +45,8 @@ public class TransCode {
 
     // 核保撤回
     public static final String UNDERWRITING_CANCLE = "UnderwritingCancle";
+    /**
+     * 网点查询
+     */
+    public static final String NETPOINT_QUERY = "NetpointQuery";
 }

+ 57 - 5
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/component/ZmCrawlerRequestComponent.java

@@ -1,16 +1,27 @@
 package com.jzg.quote.zhongmei.crawler.component;
 
+import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.component.RequestComponent;
 import com.jzg.quotation.commons.constant.CacheConstant;
 import com.jzg.quotation.commons.entity.vo.base.LoginBase;
 import com.jzg.quotation.commons.entity.vo.base.R;
 import com.jzg.quotation.commons.service.ExteriorUtilsRequest;
+import com.jzg.quotation.commons.standard.CrawlerRequestUrlStandard;
+import com.jzg.quote.zhongmei.api.entity.BaseRequestHead;
+import com.jzg.quote.zhongmei.api.entity.request.BaseRequest;
 import com.jzg.quote.zhongmei.crawler.constant.enums.RequestUrl;
 import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerAuthenticateRequest;
+import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerModelQueryRequest;
+import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerNetpointQueryRequest;
 import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerAuthenticateResponse;
 import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerCaptchaResponse;
+import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerModelQueryResponse;
+import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerNetpointQueryResponse;
+import com.jzg.quote.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
+import com.jzg.quote.zhongmei.crawler.entity.dto.SaleInfoDTO;
 import com.jzg.quote.zhongmei.crawler.properties.ZmCrawlerProperties;
+import com.jzg.quote.zhongmei.crawler.util.Base64Tool;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.redisson.api.RMap;
@@ -22,10 +33,7 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.reactive.function.client.WebClient;
 
 import java.time.Duration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
+import java.util.*;
 
 /**
  * @description:
@@ -98,7 +106,7 @@ public class ZmCrawlerRequestComponent {
         ZmCrawlerCaptchaResponse captchaResponse = captcha(REQUEST_NUMBER);
         // 登录存入缓存当中
         ZmCrawlerAuthenticateRequest authenticateRequest = new ZmCrawlerAuthenticateRequest(captchaResponse, username, password);
-        ResponseEntity<ZmCrawlerAuthenticateResponse> responseEntity = requestComponent.objectPost(RequestUrl.AUTHENTICATE.getRequestUrl(zmCrawlerProperties.getBaseUrl()), authenticateRequest, ZmCrawlerAuthenticateResponse.class);
+        ResponseEntity<ZmCrawlerAuthenticateResponse> responseEntity = requestComponent.objectPost(RequestUrl.AUTHENTICATE.getRequestUrl(zmCrawlerProperties.getBaseUrl()), Base64Tool.encode(JSONObject.toJSONString(authenticateRequest)), ZmCrawlerAuthenticateResponse.class);
         ZmCrawlerAuthenticateResponse authenticateResponse = Optional.of(responseEntity).map(ResponseEntity::getBody).orElseThrow();
 
         if ("0".equals(authenticateResponse.getHead().getReturnCode())) {
@@ -146,5 +154,49 @@ public class ZmCrawlerRequestComponent {
         throw new SystemException("");
     }
 
+    /**
+     * 请求
+     * @param standard 访问的url
+     * @param request
+     * @param responseClass
+     * @return
+     * @param <Response>
+     */
+    public <Response> Response request(CrawlerRequestUrlStandard standard, BaseRequest request, Class<Response> responseClass) {
+        String requestStr = Base64Tool.encode(JSONObject.toJSONString(request));
+        ResponseEntity<Response> responseResponseEntity = requestComponent.objectPost(standard.getRequestUrl(zmCrawlerProperties.getBaseUrl()), requestStr, responseClass);
+        return responseResponseEntity.getBody();
+    }
+
+    /**
+     * 车型查询
+     * @param modelQueryRequest
+     * @return
+     */
+    public List<ZmCrawlerModelQueryResponse.FullCarDataDTO> modelQuery(ZmCrawlerModelQueryRequest modelQueryRequest) {
+        ZmCrawlerModelQueryResponse zmCrawlerModelQueryResponseResponse = request(RequestUrl.MODELS_QUERY, modelQueryRequest, ZmCrawlerModelQueryResponse.class);
+        return zmCrawlerModelQueryResponseResponse.getCarModel();
+    }
 
+    /**
+     * 网点查询 获取归属信息
+     * @param modelQueryRequest
+     * @return
+     */
+    public ZmCrawlerNetpointQueryResponse netpointQuery(ZmCrawlerNetpointQueryRequest modelQueryRequest) {
+        return request(RequestUrl.NETPOINT_QUERY, modelQueryRequest, ZmCrawlerNetpointQueryResponse.class);
+    }
+
+    /**
+     * 处理网点查询返回数据
+     * @param parameters
+     * @param baseRequestHead
+     * @return
+     */
+    public SaleInfoDTO getSaleInfoDTO(ZmCrawlerConfigureParameters parameters, BaseRequestHead baseRequestHead) {
+        ZmCrawlerNetpointQueryRequest netpointQueryRequest = new ZmCrawlerNetpointQueryRequest();
+        netpointQueryRequest.setHead(baseRequestHead);
+        ZmCrawlerNetpointQueryResponse netpointQueryResponse = netpointQuery(netpointQueryRequest);
+        return new SaleInfoDTO(netpointQueryResponse, parameters);
+    }
 }

+ 10 - 2
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/constant/enums/RequestUrl.java

@@ -13,8 +13,16 @@ import lombok.Getter;
 @Getter
 public enum RequestUrl implements CrawlerRequestUrlStandard {
     // 登录
-    CAPTCHA("VerifyCode.do", "验证码"),
-    AUTHENTICATE("Login.do", "登录");
+    CAPTCHA("/common/VerifyCode.do", "验证码"),
+    AUTHENTICATE("/common/Login.do", "登录"),
+
+    NETPOINT_QUERY("/common/NetpointQuery.do", "网点查询"),
+    MODELS_QUERY("/prpall/ModelsQuery.do", "车型查询"),
+    ACTUAL_VALUE("/common/ActualValue.do", "实际价值查询"),
+    QUOTED_PRICE("/prpall/QuotedPrice.do", "报价")
+    ;
+
+
 
     private final String url;
     private final String description;

+ 98 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerModelQueryRequest.java

@@ -0,0 +1,98 @@
+package com.jzg.quote.zhongmei.crawler.entity.Request;
+
+import com.jzg.quote.zhongmei.api.constant.TransCode;
+import com.jzg.quote.zhongmei.api.entity.BaseRequestHead;
+import com.jzg.quote.zhongmei.api.entity.request.BaseRequest;
+import com.jzg.quote.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.util.List;
+
+/**
+ * @description: 中煤财险 车型查询
+ * @author: shenwd
+ * @date: 2025/3/21 10:22
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ZmCrawlerModelQueryRequest extends BaseRequest {
+
+    @Serial
+    private static final long serialVersionUID = 2429660436836068936L;
+
+    /**
+     * 登录机构编码
+     */
+    private String loginCom;
+
+    /**
+     * 车型名称
+     */
+    private String modelName;
+
+    private String brand;
+
+    private String carYear;
+
+    private String carType;
+
+    private String deptcode;
+
+    private String displacement;
+
+    private String factory;
+
+    private String purchasepricenottaxMin;
+
+    private String purchasepricenottaxMax;
+
+    /**
+     * 车辆大类
+     */
+    private String motorMainType;
+
+    private String modelCode;
+
+    private String vin;
+
+    /**
+     * 报价产品类型编码
+     */
+    private String planCode;
+
+    private String platModelCode;
+
+    @Override
+    public void setHead(BaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(TransCode.MODELS_QUERY);
+    }
+
+    /**数据示例
+     * {
+     *   "head": {
+     *     "token": "sinnK2bzos20250321084215617oftC3Dj2",
+     *     "transType": "Req",
+     *     "transCode": "ModelsQuery",
+     *     "source": "2"
+     *   },
+     *   "loginCom": "14083100",
+     *   "modelName": "长安SC7145KDB6轿车",
+     *   "brand": "",
+     *   "carYear": "",
+     *   "carType": "",
+     *   "deptcode": "",
+     *   "displacement": "",
+     *   "factory": "",
+     *   "purchasepricenottaxMin": "",
+     *   "purchasepricenottaxMax": "",
+     *   "motorMainType": "100",
+     *   "modelCode": "",
+     *   "planCode": "1379",
+     *   "vin": "LS5A2DKR8NA051603",
+     *   "platModelCode": ""
+     * }
+     */
+}

+ 47 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Request/ZmCrawlerNetpointQueryRequest.java

@@ -0,0 +1,47 @@
+package com.jzg.quote.zhongmei.crawler.entity.Request;
+
+import com.jzg.quote.zhongmei.api.constant.TransCode;
+import com.jzg.quote.zhongmei.api.entity.BaseRequestHead;
+import com.jzg.quote.zhongmei.api.entity.request.BaseRequest;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * @description: 中煤财险 爬虫 网点查询 入参
+ * @author: shenwd
+ * @date: 2025/3/21 16:43
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ZmCrawlerNetpointQueryRequest extends BaseRequest {
+    @Serial
+    private static final long serialVersionUID = 5618969657191008784L;
+
+    private String comCode;
+
+    private String netpointcode;
+
+    private String isSalesman;
+
+    @Override
+    public void setHead(BaseRequestHead head) {
+        super.setHead(head);
+        super.getHead().setTransCode(TransCode.NETPOINT_QUERY);
+    }
+
+    /**
+     * {
+     *   "head": {
+     *     "transCode": "NetpointQuery",
+     *     "transType": "Req",
+     *     "token": "sinnK2bzos20250321084215617oftC3Dj2",
+     *     "source": "2"
+     *   },
+     *   "comcode": "14083400",
+     *   "netpointcode": "1408N170019",
+     *   "isSalesman": "0"
+     * }
+     */
+}

+ 63 - 4
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerAuthenticateResponse.java

@@ -1,10 +1,16 @@
 package com.jzg.quote.zhongmei.crawler.entity.Response;
 
 import com.alibaba.fastjson.JSONArray;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.filter.CarModelsFilter;
 import com.jzg.quote.zhongmei.api.entity.response.BaseResponse;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
 
 /**
  * @description: 中煤财险 登录返参
@@ -12,23 +18,76 @@ import java.io.Serial;
  * @date: 2025/3/20 17:02
  **/
 @Data
+@NoArgsConstructor
+@EqualsAndHashCode(callSuper = true)
 public class ZmCrawlerAuthenticateResponse extends BaseResponse {
 
     @Serial
     private static final long serialVersionUID = 7801281039478093622L;
 
-    /**
-     * 暂时先不管
-     */
-    private JSONArray loginCom;
+    @JsonProperty(value = "loginCom")
+    private List<LoginComDTO> loginCom;
 
+    @JsonProperty(value = "pwdExpireFlag")
     private String pwdExpireFlag;
 
+    @JsonProperty(value = "reCode")
     private String reCode;
 
+    @JsonProperty(value = "time")
     private String time;
 
+    @JsonProperty(value = "userCode")
     private String userCode;
 
+    @JsonProperty(value = "userName")
     private String userName;
+
+    @Data
+    @NoArgsConstructor
+    public static class LoginComDTO implements Serializable{
+
+        @Serial
+        private static final long serialVersionUID = -3936971224028802908L;
+
+        @Data
+        @NoArgsConstructor
+        public static class AuthorsDTO implements Serializable{
+
+            @Serial
+            private static final long serialVersionUID = -7684144109911338902L;
+
+            @JsonProperty(value = "authorMain")
+            private String authorMain;
+
+            @JsonProperty(value = "author")
+            private List<String> author;
+        }
+
+        @Data
+        @NoArgsConstructor
+        public static class IndivduationDTO implements Serializable{
+
+            @Serial
+            private static final long serialVersionUID = -1956625245618181037L;
+
+            @JsonProperty(value = "indivCode")
+            private String indivCode;
+
+            @JsonProperty(value = "indivValue")
+            private String indivValue;
+        }
+
+        @JsonProperty(value = "authors")
+        private List<AuthorsDTO> authors;
+
+        @JsonProperty(value = "comCode")
+        private String comCode;
+
+        @JsonProperty(value = "comName")
+        private String comName;
+
+        @JsonProperty(value = "indivduation")
+        private List<IndivduationDTO> indivduation;
+    }
 }

+ 268 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerModelQueryResponse.java

@@ -0,0 +1,268 @@
+package com.jzg.quote.zhongmei.crawler.entity.Response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quotation.commons.filter.CarModelsFilter;
+import com.jzg.quote.zhongmei.api.entity.response.BaseResponse;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 中煤财险 车型查询返参
+ * @author: shenwd
+ * @date: 2025/3/21 10:56
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+public class ZmCrawlerModelQueryResponse extends BaseResponse {
+    @Serial
+    private static final long serialVersionUID = -7322598187776091942L;
+
+    @JsonProperty("pageNo")
+    private Integer pageNo;
+
+    @JsonProperty("totalRow")
+    private Integer totalRow;
+
+    @JsonProperty("carModel")
+    private List<FullCarDataDTO> carModel;
+
+    @NoArgsConstructor
+    @Data
+    public static class FullCarDataDTO implements Serializable, CarModelsFilter {
+
+        @Serial
+        private static final long serialVersionUID = 1411204417588818761L;
+
+        private FullCarData fullCarData;
+
+        private String motorSubType;
+
+        private PlatFormCar platFormCar;
+
+        private VehicleRisk vehicleRisk;
+
+        /**
+         * 获取车辆年款
+         * @return 年款
+         */
+        @Override
+        public String getCarYear() {
+            return fullCarData.getCarYear();
+        }
+
+        /**
+         * 获取新车购置价
+         * @return 新车购置价
+         */
+        @Override
+        public String getPurchasePrice() {
+            return fullCarData.getPurchasePrice();
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class FullCarData implements Serializable{
+
+            @Serial
+            private static final long serialVersionUID = 8852491471550869713L;
+
+            private String analogyPrice;
+            private String analogyPriceTax;
+            private String approvedLoad;
+            private String approvedPassengersCapacity;
+            private String brand;
+            private String brandCode;
+            private String carAlias;
+            private String carKind;
+            private String carType;
+            private String carYear;
+            private String createDate;
+            private String displacement;
+            private String energyTypes;
+            private String factory;
+            private String fuelType;
+            private String fuelTypeCode;
+            private String grossMass;
+            private String isrelief;
+            private String jqxClassId;
+            private String localModelCode;
+            private String modelName;
+            private String motorType;
+            private String newVehicleClass;
+            private String newVehicleClassCode;
+            private String originalPurchasePrice;
+            private String power;
+            private String purchasePrice;
+            private String purchasePriceTax;
+            private String qualityMax;
+            private String qualityMin;
+            private String remark;
+            private String searchCodeAlias;
+            private String series;
+            private String seriesCode;
+            private String shortHandCode;
+            private String status;
+            private String syxClassName;
+            private String syxClassid;
+            private String taxReliefFlag;
+            private String tractionMass;
+            private String transmissionType;
+            private String unladenMass;
+            private String updateDate;
+            private String vehicleSeatMax;
+            private String vehicleSeatMin;
+
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class PlatFormCar implements Serializable{
+
+            @Serial
+            private static final long serialVersionUID = -2465636686038222634L;
+
+            private String deptCode;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class VehicleRisk implements Serializable{
+
+            @Serial
+            private static final long serialVersionUID = -3680176209512914701L;
+        }
+    }
+    /**数据示例
+     * {
+     *   "carModel": [
+     *     {
+     *       "fullCarData": {
+     *         "analogyPrice": 0,
+     *         "analogyPriceTax": 0,
+     *         "approvedLoad": 0,
+     *         "approvedPassengersCapacity": 5,
+     *         "brand": "长安",
+     *         "brandCode": "CAA0",
+     *         "carAlias": "长安逸动PLUS 1.4T GDI DCT尊贵型",
+     *         "carKind": "IC01",
+     *         "carType": "轿车类",
+     *         "carYear": "202205",
+     *         "createDate": "2022-05-25 09:21:58",
+     *         "displacement": 1392,
+     *         "energyTypes": "0",
+     *         "factory": "重庆长安汽车股份有限公司",
+     *         "fuelType": "汽油",
+     *         "fuelTypeCode": "D1",
+     *         "grossMass": 0,
+     *         "isrelief": "0",
+     *         "jqxClassId": "KA",
+     *         "jqxClassName": "六座以下客车",
+     *         "localModelCode": "CAAFFD0021",
+     *         "modelName": "长安SC7145KDB6轿车",
+     *         "motorType": 0,
+     *         "newVehicleClass": "紧凑型轿车(A)",
+     *         "newVehicleClassCode": "JC03",
+     *         "originalPurchasePrice": 78900,
+     *         "power": 118,
+     *         "purchasePrice": 78900,
+     *         "purchasePriceTax": 85644,
+     *         "qualityMax": 0,
+     *         "qualityMin": 0,
+     *         "remark": "双离合 蓝鲸NE 尊贵型 国Ⅵ",
+     *         "searchCodeAlias": "CAYDPLUS-1.4TGDIDCT",
+     *         "series": "逸动PLUS",
+     *         "seriesCode": "CAA0HO",
+     *         "shortHandCode": "CA-SC7145KDB6",
+     *         "status": "1",
+     *         "syxClassName": "六座以下客车",
+     *         "syxClassid": "KA",
+     *         "taxReliefFlag": "正常",
+     *         "tractionMass": 0,
+     *         "transmissionType": "双离合变速器",
+     *         "unladenMass": 1.34,
+     *         "updateDate": "2023-04-27 18:16:51",
+     *         "vehicleSeatMax": 0,
+     *         "vehicleSeatMin": 0
+     *       },
+     *       "motorSubType": "208",
+     *       "platFormCar": {
+     *         "deptCode": "1"
+     *       },
+     *       "vehicleRisk": {}
+     *     },
+     *     {
+     *       "fullCarData": {
+     *         "analogyPrice": 0,
+     *         "analogyPriceTax": 0,
+     *         "approvedLoad": 0,
+     *         "approvedPassengersCapacity": 5,
+     *         "brand": "长安",
+     *         "brandCode": "CAA0",
+     *         "carAlias": "长安逸动PLUS 1.4T GDI DCT旗舰型",
+     *         "carKind": "IC01",
+     *         "carType": "轿车类",
+     *         "carYear": "202205",
+     *         "createDate": "2022-05-25 09:22:55",
+     *         "displacement": 1392,
+     *         "energyTypes": "0",
+     *         "factory": "重庆长安汽车股份有限公司",
+     *         "fuelType": "汽油",
+     *         "fuelTypeCode": "D1",
+     *         "grossMass": 0,
+     *         "isrelief": "0",
+     *         "jqxClassId": "KA",
+     *         "jqxClassName": "六座以下客车",
+     *         "localModelCode": "CAAFFD0022",
+     *         "modelName": "长安SC7145KDB6轿车",
+     *         "motorType": 0,
+     *         "newVehicleClass": "紧凑型轿车(A)",
+     *         "newVehicleClassCode": "JC03",
+     *         "originalPurchasePrice": 88900,
+     *         "power": 118,
+     *         "purchasePrice": 88900,
+     *         "purchasePriceTax": 96498,
+     *         "qualityMax": 0,
+     *         "qualityMin": 0,
+     *         "remark": "双离合 蓝鲸NE 旗舰型 国Ⅵ",
+     *         "searchCodeAlias": "CAYDPLUS-1.4TGDIDCT",
+     *         "series": "逸动PLUS",
+     *         "seriesCode": "CAA0HO",
+     *         "shortHandCode": "CA-SC7145KDB6",
+     *         "status": "1",
+     *         "syxClassName": "六座以下客车",
+     *         "syxClassid": "KA",
+     *         "taxReliefFlag": "正常",
+     *         "tractionMass": 0,
+     *         "transmissionType": "双离合变速器",
+     *         "unladenMass": 1.34,
+     *         "updateDate": "2023-04-27 18:16:33",
+     *         "vehicleSeatMax": 0,
+     *         "vehicleSeatMin": 0
+     *       },
+     *       "motorSubType": "208",
+     *       "platFormCar": {
+     *         "deptCode": "1"
+     *       },
+     *       "vehicleRisk": {}
+     *     }
+     *   ],
+     *   "head": {
+     *     "errorCode": "",
+     *     "logId": "8012025032109545962508",
+     *     "returnCode": "0",
+     *     "returnMessage": "成功",
+     *     "token": "sinnK2bzos20250321084215617oftC3Dj2",
+     *     "transCode": "MODELSQUERY",
+     *     "transType": "RES"
+     *   },
+     *   "pageNo": 1,
+     *   "totalRow": 2
+     * }
+     */
+}

+ 216 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/Response/ZmCrawlerNetpointQueryResponse.java

@@ -0,0 +1,216 @@
+package com.jzg.quote.zhongmei.crawler.entity.Response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.zhongmei.api.entity.response.BaseResponse;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @description: 中煤财险 爬虫 网点查询 返参
+ * @author: shenwd
+ * @date: 2025/3/21 16:54
+ **/
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ZmCrawlerNetpointQueryResponse extends BaseResponse {
+    @Serial
+    private static final long serialVersionUID = 7217987254170468955L;
+
+    @JsonProperty("baseInformationBean")
+    List<BaseInformationBeanDTO> baseInformationBean;
+
+    @Data
+    public static class BaseInformationBeanDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = 4640384436509540069L;
+
+        /**
+         * 中介人信息
+         */
+        @JsonProperty("agentBean")
+        private List<AgentBeanDTO> agentBean;
+
+        /**
+         * 经办人信息
+         */
+        @JsonProperty("handlerBean")
+        private List<HandlerBeanDTO> handlerBean;
+
+        /**
+         * 网点信息
+         */
+        @JsonProperty("netPointBean")
+        private List<NetPointBeanDTO> netPointBean;
+
+        @JsonProperty("channelCode")
+        private String channelCode;
+
+        @JsonProperty("channelName")
+        private String channelName;
+
+        @JsonProperty("channelSubCode")
+        private String channelSubCode;
+
+        @JsonProperty("channelSubName")
+        private String channelSubName;
+
+        @JsonProperty("producerCode")
+        private String producerCode;
+
+        @JsonProperty("producerName")
+        private String producerName;
+
+        @JsonProperty("producerSubCode")
+        private String producerSubCode;
+
+        @JsonProperty("producerSubName")
+        private String producerSubName;
+
+        @JsonProperty("producerDetailCode")
+        private String producerDetailCode;
+
+        @JsonProperty("producerDetailName")
+        private String producerDetailName;
+
+        @JsonProperty("producerDetailThreeCode")
+        private String producerDetailThreeCode;
+
+        @JsonProperty("producerDetailThreeName")
+        private String producerDetailThreeName;
+
+        @Data
+        public static class AgentBeanDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -1111395323631042743L;
+
+            @JsonProperty("address")
+            private String address;
+
+            @JsonProperty("agentCode")
+            private String agentCode;
+
+            @JsonProperty("agentName")
+            private String agentName;
+
+            @JsonProperty("agentType")
+            private String agentType;
+
+            @JsonProperty("agreementNo")
+            private String agreementNo;
+
+            @JsonProperty("phone")
+            private String phone;
+        }
+
+        @Data
+        public static class HandlerBeanDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = -3954615476854822252L;
+
+            @JsonProperty("handlerCode")
+            private String handlerCode;
+
+            @JsonProperty("handlerName")
+            private String handlerName;
+
+            @JsonProperty("saleTeam")
+            private String saleTeam;
+
+            @JsonProperty("teamCode")
+            private String teamCode;
+        }
+
+        @Data
+        public static class NetPointBeanDTO implements Serializable {
+
+            @Serial
+            private static final long serialVersionUID = 8041082476522580413L;
+
+            @JsonProperty("learnAdvance")
+            private String learnAdvance;
+
+            @JsonProperty("netPointCode")
+            private String netPointCode;
+
+            @JsonProperty("netPointName")
+            private String netPointName;
+
+            @JsonProperty("netPointPropertyCode")
+            private String netPointPropertyCode;
+
+            @JsonProperty("netPointPropertyCode_New")
+            private String netPointPropertyCode_New;
+
+            @JsonProperty("netPointPropertyName")
+            private String netPointPropertyName;
+
+            @JsonProperty("netPointPropertyName_New")
+            private String netPointPropertyName_New;
+        }
+    }
+    /**数据示例
+     * {
+     *   "baseInformationBean": [
+     *     {
+     *       "agentBean": [
+     *         {
+     *           "address": "山西省新绛县泽掌镇泽掌",
+     *           "agentCode": "1408A181093",
+     *           "agentName": "吕瑞",
+     *           "agentType": "1",
+     *           "agreementNo": "1408A181093001aa",
+     *           "phone": "13610635053"
+     *         }
+     *       ],
+     *       "channelCode": "02",
+     *       "channelName": "车商渠道",
+     *       "channelSubCode": "0202",
+     *       "channelSubName": "二网渠道",
+     *       "handlerBean": [
+     *         {
+     *           "handlerCode": "14A01225",
+     *           "handlerName": "杨利",
+     *           "saleTeam": "直销渠道拓展业务一团队",
+     *           "teamCode": "14083400T01"
+     *         }
+     *       ],
+     *       "netPointBean": [
+     *         {
+     *           "learnAdvance": "0",
+     *           "netPointCode": "1408N170019",
+     *           "netPointName": "新绛县三泉镇白村周冲汽车美容店",
+     *           "netPointPropertyCode": "W02",
+     *           "netPointPropertyCode_New": "Y16",
+     *           "netPointPropertyName": "汽车二级经销商",
+     *           "netPointPropertyName_New": "汽车二级经销商"
+     *         }
+     *       ],
+     *       "producerCode": "0010",
+     *       "producerDetailCode": "2003",
+     *       "producerDetailName": "个人代理",
+     *       "producerDetailThreeCode": "S03",
+     *       "producerDetailThreeName": "个人代理销售",
+     *       "producerName": "代理业务",
+     *       "producerSubCode": "001000",
+     *       "producerSubName": "个人代理"
+     *     }
+     *   ],
+     *   "head": {
+     *     "errorCode": "",
+     *     "logId": "8192025032111375651752",
+     *     "returnCode": "0",
+     *     "returnMessage": "成功",
+     *     "token": "sinnK2bzos20250321084215617oftC3Dj2",
+     *     "transCode": "NETPOINTQUERY",
+     *     "transType": "RES"
+     *   }
+     * }
+     */
+}

+ 72 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/ZmCrawlerConfigureParameters.java

@@ -0,0 +1,72 @@
+package com.jzg.quote.zhongmei.crawler.entity;
+
+import com.jzg.quotation.commons.standard.ConfigureParameters;
+import lombok.Data;
+
+import java.io.Serial;
+
+/**
+ * @description: 中煤财险 爬虫配置信息
+ * @author: shenwd
+ * @date: 2025/3/21 09:44
+ **/
+@Data
+public class ZmCrawlerConfigureParameters implements ConfigureParameters {
+    @Serial
+    private static final long serialVersionUID = 3087193981775694459L;
+
+    /**
+     * 用户的唯一标识符
+     */
+    private String token;
+
+    /**
+     * 信息来源,用来指定该报文的来源
+     */
+    private String source;
+
+    /**
+     * 省
+     */
+    private String province;
+
+    /**
+     * 市
+     */
+    private String city;
+
+    /**
+     * 县
+     */
+    private String district;
+
+    /**
+     * 统计   2023-08-29 lig 添加
+     */
+    private String accountUser;
+
+    /**
+     * 业务归属机构编码
+     */
+    private String comCode;
+
+    /**
+     * 业务归属机构名称
+     */
+    private String comName;
+
+    /**
+     * 网点编码
+     */
+    private String netpointCode;
+
+    /**
+     * 经办人编码
+     */
+    private String handlerCode;
+
+    /**
+     * 经办人名称
+     */
+    private String handlerName;
+}

+ 330 - 0
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quote/zhongmei/crawler/entity/dto/SaleInfoDTO.java

@@ -0,0 +1,330 @@
+package com.jzg.quote.zhongmei.crawler.entity.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerNetpointQueryResponse;
+import com.jzg.quote.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @description: 归属信息
+ * @author: shenwd
+ * @date: 2025/3/21 15:57
+ **/
+@NoArgsConstructor
+@Data
+public class SaleInfoDTO implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 5687501849574942870L;
+
+    /**
+     * 中介人编码
+     */
+    @JsonProperty("agentCode")
+    private String agentCode;
+
+    /**
+     * 协议号
+     */
+    @JsonProperty("agreementNo")
+    private String agreementNo;
+
+    /**
+     * 归属机构编码
+     */
+    @JsonProperty("comCode")
+    private String comCode;
+
+    /**
+     * 归属机构名称
+     */
+    @JsonProperty("comName")
+    private String comName;
+
+    /**
+     * 归属机构渠道编码
+     */
+    @JsonProperty("channelCode")
+    private String channelCode;
+
+    /**
+     * 归属机构渠道来源名称
+     */
+    @JsonProperty("channelName")
+    private String channelName;
+
+    /**
+     * 归属机构渠道来源细分编码
+     */
+    @JsonProperty("channelSubCode")
+    private String channelSubCode;
+
+    /**
+     * 归属机构渠道来源细分名称
+     */
+    @JsonProperty("channelSubName")
+    private String channelSubName;
+
+    /**
+     * 归属机构一级业务来源父级编码
+     */
+    @JsonProperty("producerCode")
+    private String producerCode;
+
+    /**
+     * 归属机构一级业务来源编码
+     */
+    @JsonProperty("producerSubCode")
+    private String producerSubCode;
+
+    /**
+     * 归属机构一级业务来源名称
+     */
+    @JsonProperty("producerSubName")
+    private String producerSubName;
+
+    /**
+     * 归属机构二级业务来源编码
+     */
+    @JsonProperty("producerDetailCode")
+    private String producerDetailCode;
+
+    /**
+     * 归属机构二级业务来源名称
+     */
+    @JsonProperty("producerDetailName")
+    private String producerDetailName;
+
+    /**
+     * 归属机构三级业务来源编码
+     */
+    @JsonProperty("producerDetailThreeCode")
+    private String producerDetailThreeCode;
+
+    /**
+     * 归属机构三级业务来源名称
+     */
+    @JsonProperty("producerDetailThreeName")
+    private String producerDetailThreeName;
+
+    /**
+     *
+     */
+    @JsonProperty("handlerPersonCode")
+    private String handlerPersonCode;
+
+    /**
+     * 网点属性编码
+     */
+    @JsonProperty("netPointPropertyCode")
+    private String netPointPropertyCode;
+
+    /**
+     * 网点属性名称
+     */
+    @JsonProperty("netPointPropertyName")
+    private String netPointPropertyName;
+
+    /**
+     * 新网点属性编码
+     */
+    @JsonProperty("netPointPropertyCode_New")
+    private String netPointPropertyCode_New;
+
+    /**
+     * 新网点属性名称
+     */
+    @JsonProperty("netPointPropertyName_New")
+    private String netPointPropertyName_New;
+
+    /**
+     *
+     */
+    @JsonProperty("saleSys")
+    private String saleSys;
+
+    /**
+     *
+     */
+    @JsonProperty("saleUserCode")
+    private String saleUserCode;
+
+    /**
+     *
+     */
+    @JsonProperty("saleUserName")
+    private String saleUserName;
+
+    /**
+     * 销售团队编码
+     */
+    @JsonProperty("teamCode")
+    private String teamCode;
+
+    /**
+     * 销售团队名称
+     */
+    @JsonProperty("teamName")
+    private String teamName;
+
+    /**
+     * 销售团队
+     */
+    @JsonProperty("teamManager")
+    private String teamManager;
+
+    /**
+     * 省
+     */
+    @JsonProperty("province")
+    private String province;
+
+    /**
+     * 市
+     */
+    @JsonProperty("city")
+    private String city;
+
+    /**
+     * 区(县)
+     */
+    @JsonProperty("district")
+    private String district;
+
+    /**
+     * 统计编码
+     */
+    @JsonProperty("accountUser")
+    private String accountUser;
+
+    /**
+     * 统计名称
+     */
+    @JsonProperty("accountUserName")
+    private String accountUserName;
+
+    /**
+     * 是否学先进
+     */
+    @JsonProperty("learnAdvance")
+    private String learnAdvance;
+
+    /**
+     * 是否学先进 PB分
+     */
+    @JsonProperty("learnScore")
+    private String learnScore;
+
+     /**
+     * 是否学先进 PA分
+     */
+    @JsonProperty("learnScorePA")
+    private String learnScorePA;
+
+    /**
+     * 网点编码
+     */
+    @JsonProperty("netPointCode")
+    private String netPointCode;
+
+    /**
+     *
+     */
+    @JsonProperty("learnShowFlag")
+    private String learnShowFlag;
+
+    /**
+     * 经办人信息
+     */
+    @JsonProperty("salesman")
+    private List<SalesmanDTO> salesman;
+
+    @Data
+    @NoArgsConstructor
+    public static class SalesmanDTO implements Serializable {
+
+        @Serial
+        private static final long serialVersionUID = -8812284914957719880L;
+
+        /**
+         *
+         */
+        @JsonProperty("handleRate")
+        private String handleRate;
+
+        /**
+         *
+         */
+        @JsonProperty("handlerCode")
+        private String handlerCode;
+
+        /**
+         *
+         */
+        @JsonProperty("handlerName")
+        private String handlerName;
+
+        /**
+         *
+         */
+        @JsonProperty("comCode")
+        private String comCode;
+    }
+
+    public SaleInfoDTO(ZmCrawlerNetpointQueryResponse response, ZmCrawlerConfigureParameters parameters) {
+        ZmCrawlerNetpointQueryResponse.BaseInformationBeanDTO baseInformationBeanDTO = response.getBaseInformationBean().get(0);
+        ZmCrawlerNetpointQueryResponse.BaseInformationBeanDTO.AgentBeanDTO agentBeanDTO = baseInformationBeanDTO.getAgentBean().get(0);
+        ZmCrawlerNetpointQueryResponse.BaseInformationBeanDTO.HandlerBeanDTO handlerBeanDTO = baseInformationBeanDTO.getHandlerBean().get(0);
+        ZmCrawlerNetpointQueryResponse.BaseInformationBeanDTO.NetPointBeanDTO netPointBeanDTO = baseInformationBeanDTO.getNetPointBean().get(0);
+
+        this.agentCode = agentBeanDTO.getAgentCode();
+        this.agreementNo = agentBeanDTO.getAgreementNo();
+        this.comCode = parameters.getComCode();
+        this.comName = parameters.getComName();
+        this.channelCode = baseInformationBeanDTO.getChannelCode();
+        this.channelName = baseInformationBeanDTO.getChannelName();
+        this.channelSubCode = baseInformationBeanDTO.getChannelSubCode();
+        this.channelSubName = baseInformationBeanDTO.getChannelSubName();
+        this.producerCode = baseInformationBeanDTO.getProducerCode();
+        this.producerSubCode = baseInformationBeanDTO.getProducerSubCode();
+        this.producerSubName = baseInformationBeanDTO.getProducerSubName();
+        this.producerDetailCode = baseInformationBeanDTO.getProducerDetailCode();
+        this.producerDetailName = baseInformationBeanDTO.getProducerDetailName();
+        this.producerDetailThreeCode = baseInformationBeanDTO.getProducerDetailThreeCode();
+        this.producerDetailThreeName = baseInformationBeanDTO.getProducerDetailThreeName();
+        this.handlerPersonCode = "";
+        this.netPointPropertyCode = netPointBeanDTO.getNetPointPropertyCode();
+        this.netPointPropertyName = netPointBeanDTO.getNetPointPropertyName();
+        this.netPointPropertyCode_New = netPointBeanDTO.getNetPointPropertyCode_New();
+        this.netPointPropertyName_New = netPointBeanDTO.getNetPointPropertyName_New();
+        this.saleSys = "";
+        this.saleUserCode = "";
+        this.saleUserName = "";
+        this.teamCode = handlerBeanDTO.getTeamCode();
+        this.teamName = handlerBeanDTO.getSaleTeam();
+        this.teamManager = "";
+        this.province = parameters.getProvince();
+        this.city = parameters.getCity();
+        this.district = parameters.getDistrict();
+        this.accountUser = parameters.getAccountUser();
+        this.accountUserName = "";
+        this.learnAdvance = netPointBeanDTO.getLearnAdvance();
+        this.learnScore = "";
+        this.learnScorePA = "";
+        this.netPointCode = netPointBeanDTO.getNetPointCode();
+        this.learnShowFlag = "";
+        this.salesman = new ArrayList<>();
+        SalesmanDTO salesmanDTO = new SalesmanDTO();
+        salesmanDTO.setComCode("");
+        salesmanDTO.setHandleRate("");
+        salesmanDTO.setHandlerCode(handlerBeanDTO.getHandlerCode());
+        salesmanDTO.setHandlerName(handlerBeanDTO.getHandlerName());
+        this.salesman.add(salesmanDTO);
+    }
+}

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

@@ -1,6 +1,7 @@
 package com.jzg.quote.zhongmei.crawler.service.Impl;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
+import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.vo.aggregated.InsuranceUploadImageVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.QuoteResultsVo;
@@ -8,12 +9,20 @@ import com.jzg.quotation.commons.entity.vo.aggregated.QuoteVo;
 import com.jzg.quotation.commons.entity.vo.aggregated.UnderwritingVo;
 import com.jzg.quotation.commons.entity.vo.base.LoginBase;
 import com.jzg.quotation.commons.entity.vo.base.OrderBase;
-import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
+import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
+import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
+import com.jzg.quote.zhongmei.api.entity.BaseRequestHead;
 import com.jzg.quote.zhongmei.crawler.component.ZmCrawlerRequestComponent;
+import com.jzg.quote.zhongmei.crawler.entity.Request.ZmCrawlerModelQueryRequest;
+import com.jzg.quote.zhongmei.crawler.entity.Response.ZmCrawlerModelQueryResponse;
+import com.jzg.quote.zhongmei.crawler.entity.ZmCrawlerConfigureParameters;
+import com.jzg.quote.zhongmei.crawler.entity.dto.SaleInfoDTO;
 import com.jzg.quote.zhongmei.crawler.service.ZhongMeiCrawlerRequest;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @description: 中煤财险 爬虫报价
  * @author: shenwd
@@ -45,7 +54,18 @@ public class ZhongMeiCrawlerRequestImpl implements ZhongMeiCrawlerRequest {
         AttributionInformationVo attributionInformationVo = quoteVo
                 .getOrder()
                 .getAttributionInformationVo();
-
+        //获取配置信息
+        ZmCrawlerConfigureParameters zmCrawlerConfigureParameters = ConfigureParametersConversion.conversionEntity(ZmCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+        BaseRequestHead head = new BaseRequestHead(zmCrawlerConfigureParameters.getToken(), zmCrawlerConfigureParameters.getSource());
+        //获取归属信息
+        SaleInfoDTO saleInfoDTO = zmCrawlerRequestComponent.getSaleInfoDTO(zmCrawlerConfigureParameters, head);
+        //车型查询
+        ZmCrawlerModelQueryRequest modelQueryRequest = new ZmCrawlerModelQueryRequest();
+        modelQueryRequest.setHead(head);
+        List<ZmCrawlerModelQueryResponse.FullCarDataDTO> fullCarDataDTOS = zmCrawlerRequestComponent.modelQuery(modelQueryRequest);
+        //过滤车型
+        ZmCrawlerModelQueryResponse.FullCarDataDTO fullCarDataDTO = CarModelsFilterUtils.to(fullCarDataDTOS, quoteVo.getCarInfoVo());
+        //获取实际价值
 
         return null;
     }