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

Merge remote-tracking branch 'origin/master'

liub 1 месяц назад
Родитель
Сommit
634a5c1229
32 измененных файлов с 1191 добавлено и 283 удалено
  1. 36 0
      commons/src/main/java/com/jzg/commons/entity/dto/FeeAuditParam.java
  2. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java
  3. 3 0
      commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementQueryVo.java
  4. 28 0
      commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java
  5. 74 22
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/CarModelQueryRequest.java
  6. 3 3
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PremiumCalculationRequest.java
  7. 3 3
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/SubmitRequest.java
  8. 165 144
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/CarModelQueryResponse.java
  9. 6 6
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  10. 6 1
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  11. 28 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerRequestComponent.java
  12. 1 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/RequestUrl.java
  13. 11 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerFindBusinessesRequestRequest.java
  14. 73 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerQueryReviveOpinionRequest.java
  15. 99 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/response/HuaNongCrawlerQueryReviveOpinionResponse.java
  16. 306 15
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java
  17. 5 1
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/build/HuaTaiCrawlerQuoteResultsVoBuild.java
  18. 43 17
      tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestBuilder.java
  19. 2 8
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  20. 2 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  21. 47 2
      tenant/insurance/quotation-summary/src/main/resources/mapper/InsFeeAuditMapper.xml
  22. 4 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java
  23. 2 7
      tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/build/YangGuangApiQuoteResultsVoBuild.java
  24. 4 4
      tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java
  25. 7 13
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerCacheComponent.java
  26. 6 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerRequestComponent.java
  27. 1 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/constant/enums/RequestUrl.java
  28. 50 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerAccommodationUploadRequest.java
  29. 52 0
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerAccommodationUploadResponse.java
  30. 47 24
      tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java
  31. 11 0
      tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java
  32. 63 12
      tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

+ 36 - 0
commons/src/main/java/com/jzg/commons/entity/dto/FeeAuditParam.java

@@ -27,6 +27,9 @@ public class FeeAuditParam extends PageRequest {
     @Schema(description = "业务员")
     private String salesman;
 
+    @Schema(description = "业务员手机号")
+    private String phone;
+
     @Schema(description = "订单状态  1 车险录入 2 待客录单 3 外部订单")
     private String orderStatus;
 
@@ -39,6 +42,9 @@ public class FeeAuditParam extends PageRequest {
     @Schema(description = "保险公司id列表")
     private List<String> companyIdList;
 
+    @Schema(description = "保险机构ID")
+    private String partnerCompanyId;
+
     @Schema(description = "出单机构id")
     private String deptId;
 
@@ -78,6 +84,9 @@ public class FeeAuditParam extends PageRequest {
     @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDateTime payTimeEnd;
 
+    private String payingTimeBegin;
+    private String payingTimeEnd;
+
     @Schema(description = "交强保单号")
     private String ciPolicyNumber;
 
@@ -131,4 +140,31 @@ public class FeeAuditParam extends PageRequest {
     @Schema(description = "订单来源 0 pc  1 app")
     private String orderSource;
 
+    @Schema(description = "支付时间")
+    private String[] payingTime;
+
+    @Schema(description = "对接人姓名")
+    private String contact;
+
+    @Schema(description = "交强保单号")
+    private String jqPolicyNo;
+    @Schema(description = "非车保单号")
+    private String jyPolicyNo;
+    @Schema(description = "商业保单号")
+    private String syPolicyNo;
+
+    @Schema(description = "交强起保时间-起")
+    private String jqRiskStartDateBegin;
+    @Schema(description = "商业起保时间-起")
+    private String syRiskStartDateBegin;
+    @Schema(description = "非车起保时间-起")
+    private String jyRiskStartDateBegin;
+
+    @Schema(description = "交强起保时间-止")
+    private String jqRiskStartDateEnd;
+    @Schema(description = "商业起保时间-止")
+    private String syRiskStartDateEnd;
+    @Schema(description = "非车起保时间-止")
+    private String jyRiskStartDateEnd;
+
 }

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/ReceivableQueryVo.java

@@ -53,6 +53,9 @@ public class ReceivableQueryVo extends PageRequest {
     @Schema(description = "签单时间结束时间")
     private String signingTimeEnd;
 
+    @Schema(description = "签单时间")
+    private String[] signingTime;
+
     @Schema(description = "订单号")
     private String orderNo;
 

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementQueryVo.java

@@ -68,6 +68,9 @@ public class SettlementQueryVo extends PageRequest {
     @Schema(description = "结算时间结束")
     private String settlementTimeEnd;
 
+    @Schema(description = "结算时间")
+    private String[] settlementTime;
+
     @Schema(description = "结算记录编号集合")
     private List<String> settlementIds;
 

+ 28 - 0
commons/src/main/java/com/jzg/commons/entity/orders/vo/FeeAuditVo.java

@@ -423,4 +423,32 @@ public class FeeAuditVo extends BaseModel {
     @ExcelProperty("三级分销比例")
     @TableField(exist = false)
     private BigDecimal thirdDistributionRatio;
+
+    private String payingTime;
+
+    private String partnerCompanyId;
+
+    @Schema(description = "保险机构名称")
+    private String partnerCompanyName;
+    @Schema(description = "保险机构名称")
+    private String partnerCompanySimplyName;
+
+    @Schema(description = "对接人姓名")
+    private String contact;
+
+    @Schema(description = "交强保单号")
+    private String jqPolicyNo;
+    @Schema(description = "非车保单号")
+    private String jyPolicyNo;
+    @Schema(description = "商业保单号")
+    private String syPolicyNo;
+
+    @Schema(description = "起保时间")
+    private String jqRiskStartDate;
+    private String jqRiskEndDate;
+    private String syRiskStartDate;
+    private String syRiskEndDate;
+    private String jyRiskStartDate;
+    private String jyRiskEndDate;
+
 }

+ 74 - 22
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/CarModelQueryRequest.java

@@ -2,6 +2,8 @@ package com.jzg.quotation.chengtai.api.entity.request;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.quotation.chengtai.api.entity.ChengTaiApiParameters;
+import com.jzg.quotation.commons.utils.SnowFlakeUtil;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -14,33 +16,83 @@ import lombok.NoArgsConstructor;
 @Data
 public class CarModelQueryRequest {
     /**
-     * 品牌型号
+     * 报文头信息(Head)
      */
-    @JsonProperty("brandName")
-    private String brandName;
+    @JsonProperty("head")
+    private head head;
 
     /**
-     * 当前页
+     * 基础信息(BasePart)
      */
-    @JsonProperty("nowPage")
-    private String nowPage;
+    @JsonProperty("body")
+    private body body;
+    @NoArgsConstructor
+    @Data
+    public static class head {
 
-    /**
-     * 每页条数
-     */
-    @JsonProperty("pageSize")
-    private String pageSize;
+        /**
+         * 用户名
+         */
+        @JsonProperty("userName")
+        private String userName;
 
-    /**
-     * 是否需要编码 前台页面直接请求,该字段不填;通过后台代码请求接口时该字段填:‘00000’
-     */
-    @JsonProperty("encode")
-    private String encode;
-
-    public CarModelQueryRequest(String brandName) {
-        this.brandName = brandName;
-        this.nowPage = "1";
-        this.pageSize = "20";
-        this.encode = "00000";
+        /**
+         * 密码
+         */
+        @JsonProperty("passWord")
+        private String passWord;
+
+        /**
+         * 外网提供的唯一标志
+         */
+        @JsonProperty("queryId")
+        private String queryId;
+
+        /**
+         * 合作伙伴代码
+         */
+        @JsonProperty("partnerCode")
+        private String partnerCode;
+
+        public head(ChengTaiApiParameters parameters) {
+            this.userName = parameters.getUserName();
+            this.passWord = parameters.getPassWord();
+            this.queryId = String.valueOf(new SnowFlakeUtil().nextId());
+            this.partnerCode = parameters.getPartnerCode();
+        }
+
+
+    }
+    @NoArgsConstructor
+    @Data
+    public static class body {
+        /**
+         * 品牌型号
+         */
+        @JsonProperty("brandName")
+        private String brandName;
+
+        /**
+         * 当前页
+         */
+        @JsonProperty("nowPage")
+        private String nowPage;
+
+        /**
+         * 每页条数
+         */
+        @JsonProperty("pageSize")
+        private String pageSize;
+        public body(String brandName) {
+            this.brandName = brandName;
+            this.nowPage = "1";
+            this.pageSize = "20";
+        }
+    }
+
+
+    public CarModelQueryRequest(ChengTaiApiParameters parameters,String brandName) {
+        this.head = new head(parameters);
+        this.body = new body(brandName);
     }
 }

+ 3 - 3
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PremiumCalculationRequest.java

@@ -91,7 +91,7 @@ public class PremiumCalculationRequest {
     private riskRelatedParty RiskRelatedParty;
 
     public PremiumCalculationRequest(QuoteVo quoteVo, BigDecimal actualValue,
-                                     ChengTaiApiParameters parameters, CarModelQueryResponse.vehicle vehicle, String orderNumber) {
+                                     ChengTaiApiParameters parameters, CarModelQueryResponse.Body.vehicle vehicle, String orderNumber) {
         this.Head = new head(parameters);
         this.BasePart = new basePart(quoteVo,orderNumber);
         this.ItemMotor = new itemMotor(quoteVo.getOwnersInfo(),quoteVo.getCarInfoVo(),vehicle,actualValue);
@@ -565,7 +565,7 @@ public class PremiumCalculationRequest {
         @JacksonXmlProperty(localName = "runMiles")
         private Integer runMiles;
 
-        public itemMotor(CustomerInfoVo customerInfoVo, CarInfoVo carInfoVo, CarModelQueryResponse.vehicle vehicle, BigDecimal actualValue) {
+        public itemMotor(CustomerInfoVo customerInfoVo, CarInfoVo carInfoVo, CarModelQueryResponse.Body.vehicle vehicle, BigDecimal actualValue) {
             this.carOwner = customerInfoVo.getName();
             this.licenseNo = carInfoVo.getLicenseNo();
             this.engineNo = carInfoVo.getEngineNo();
@@ -771,7 +771,7 @@ public class PremiumCalculationRequest {
         @JacksonXmlProperty(localName = "clxFee")
         private BigDecimal clxFee;
 
-        public static List<Kind> buildKindList(List<KindInfoVo> kindInfoVoList,RiskInfoVo ciRiskInfoVo,CarModelQueryResponse.vehicle vehicle,BigDecimal actualValue){
+        public static List<Kind> buildKindList(List<KindInfoVo> kindInfoVoList,RiskInfoVo ciRiskInfoVo,CarModelQueryResponse.Body.vehicle vehicle,BigDecimal actualValue){
             List<Kind> kindList = new ArrayList<>();
             // 是否投保交强险
             if (ciRiskInfoVo != null) {

+ 3 - 3
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/SubmitRequest.java

@@ -95,7 +95,7 @@ public class SubmitRequest {
 //    @JacksonXmlProperty(localName = "RiskSpecialClausesList")
 //    private List<RiskSpecialClauses> RiskSpecialClausesList;
 
-    public SubmitRequest(UnderwritingVo underwritingVo, CarModelQueryResponse.vehicle vehicle,
+    public SubmitRequest(UnderwritingVo underwritingVo, CarModelQueryResponse.Body.vehicle vehicle,
                          ChengTaiApiParameters parameters) {
         InsOrdersCarUserInfo policyHolder = underwritingVo.getInsOrdersCarUserInfoList()
                 .stream().filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(2))
@@ -495,7 +495,7 @@ public class SubmitRequest {
         @JacksonXmlProperty(localName = "runMiles")
         private Integer runMiles;
 
-        public itemMotor(UnderwritingVo underwritingVo, CarModelQueryResponse.vehicle vehicle) {
+        public itemMotor(UnderwritingVo underwritingVo, CarModelQueryResponse.Body.vehicle vehicle) {
             InsOrdersCarInfo insOrdersCarInfo = underwritingVo.getInsOrdersCarInfo();
             InsOrdersCarUserInfo owner = underwritingVo.getInsOrdersCarUserInfoList()
                     .stream().filter(insOrdersCarUserInfo -> insOrdersCarUserInfo.getPolicyPersonType().equals(1))
@@ -1133,7 +1133,7 @@ public class SubmitRequest {
         private BigDecimal grossPremium;
 
 
-        public static List<Kind> buildKindList(UnderwritingVo underwritingVo,CarModelQueryResponse.vehicle vehicle){
+        public static List<Kind> buildKindList(UnderwritingVo underwritingVo,CarModelQueryResponse.Body.vehicle vehicle){
             List<InsOrdersRisk> riskInfoVoList = underwritingVo.getInsOrdersRiskList();
             List<InsOrdersKind> insOrdersKindList = underwritingVo.getInsOrdersKindList();
             InsOrdersCosts insOrdersCosts = underwritingVo.getInsOrdersCosts();

+ 165 - 144
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/response/CarModelQueryResponse.java

@@ -16,159 +16,180 @@ import java.util.List;
 @NoArgsConstructor
 @Data
 public class CarModelQueryResponse {
-    /**
-     * 总数
-     */
-    @JsonProperty("maxPageNum")
-    private String maxPageNum;
-
-    /**
-     * 当前页
-     */
-    @JsonProperty("nowPage")
-    private String nowPage;
-
-    /**
-     * 每页条数
-     */
-    @JsonProperty("pageSize")
-    private String pageSize;
-
-    /**
-     * 车型信息
-     */
-    @JsonProperty("vehicleList")
-    private List<vehicle> vehicleList;
 
-    @NoArgsConstructor
-    @Data
-    public static class vehicle implements CarModelsFilter {
-        /**
-         * 精有车型编码
-         */
-        @JsonProperty("modelCode")
-        private String modelCode;
-
-        /**
-         * 品牌
-         */
-        @JsonProperty("vehicleBrand")
-        private String vehicleBrand;
-
-        /**
-         * 车系
-         */
-        @JsonProperty("vehicleSeries")
-        private String vehicleSeries;
-
-        /**
-         * 排量 单位:ml
-         */
-        @JsonProperty("vehicleDisplacement")
-        private String vehicleDisplacement;
-
-        /**
-         * 手/自动档
-         */
-        @JsonProperty("transmissionType")
-        private String transmissionType;
-
-        /**
-         * 配置型号
-         */
-        @JsonProperty("configModel")
-        private String configModel;
-
-        /**
-         * 参考价
-         */
-        @JsonProperty("vehiclePrice")
-        private String vehiclePrice;
+    private Head head;
 
-        /**
-         * 含税价
-         */
-        @JsonProperty("taxVehiclePrice")
-        private String taxVehiclePrice;
-
-        /**
-         * 整备质量 单位:千克
-         */
-        @JsonProperty("tonnage")
-        private String tonnage;
-
-        /**
-         * 座位数
-         */
-        @JsonProperty("seat")
-        private String seat;
-
-        /**
-         * 车辆种类
-         */
-        @JsonProperty("className")
-        private String className;
-
-        /**
-         * 是否减免税车型 0-非减免税车型、04-减免税车型、05-减税(注:05-减税,也是减免税车型,保费计算接口中车船税节点信息”taxRelifFlag” 计税分类字段须传 04,代表的是减免税车型。)
-         */
-        @JsonProperty("taxCutFlag")
-        private String taxCutFlag;
-
-        /**
-         *  减免税比例 减免比例返回的是百分比,如返回50,代表的是 百分之50,没减免比例则返回空
-         */
-        @JsonProperty("taxCutProp")
-        private String taxCutProp;
-
-        /**
-         * 是否新能源车辆 1:是 0:否
-         */
-        @JsonProperty("energyFlag")
-        private String energyFlag;
-
-        /**
-         * 精有车型名称
-         */
-        @JsonProperty("modelName")
-        private String modelName;
+    private Body body;
 
+    @Data
+    @NoArgsConstructor
+    public static class Head {
         /**
-         * 备注
+         * 响应信息
          */
-        @JsonProperty("remark")
-        private String remark;
+        private String resMsg;
 
         /**
-         * 能源类型
+         * 响应代码
          */
-        @JsonProperty("energyType")
-        private String energyType;
-        public CoreModelsVo toCoreModelsVo() {
-            CoreModelsVo coreModelsVo = new CoreModelsVo();
-            coreModelsVo.setModelCode(this.modelCode);
-            coreModelsVo.setModelName(this.modelName);
-            coreModelsVo.setCarYear(null);
-            coreModelsVo.setPower(null);
-            coreModelsVo.setEnginedesc(this.vehicleDisplacement);
-            coreModelsVo.setPurchasePrice(this.vehiclePrice);
-            coreModelsVo.setSeatCount(this.seat);
-            return coreModelsVo;
-        }
-
-        @Override
-        public String getCarYear() {
-            return null;
-        }
-
-        @Override
-        public String getPurchasePrice() {
-            return this.vehiclePrice;
-        }
+        private String resCode;
+    }
 
-        @Override
-        public String getSeatCount() {
-            return this.seat;
+    @Data
+    @NoArgsConstructor
+    public static class Body {
+        /**
+         * 总数
+         */
+        @JsonProperty("maxPageNum")
+        private String maxPageNum;
+
+        /**
+         * 当前页
+         */
+        @JsonProperty("nowPage")
+        private String nowPage;
+
+        /**
+         * 每页条数
+         */
+        @JsonProperty("pageSize")
+        private String pageSize;
+        /**
+         * 车型信息
+         */
+        @JsonProperty("vehicleList")
+        private List<vehicle> vehicleList;
+        @NoArgsConstructor
+        @Data
+        public static class vehicle implements CarModelsFilter {
+            /**
+             * 精有车型编码
+             */
+            @JsonProperty("modelCode")
+            private String modelCode;
+
+            /**
+             * 品牌
+             */
+            @JsonProperty("vehicleBrand")
+            private String vehicleBrand;
+
+            /**
+             * 车系
+             */
+            @JsonProperty("vehicleSeries")
+            private String vehicleSeries;
+
+            /**
+             * 排量 单位:ml
+             */
+            @JsonProperty("vehicleDisplacement")
+            private String vehicleDisplacement;
+
+            /**
+             * 手/自动档
+             */
+            @JsonProperty("transmissionType")
+            private String transmissionType;
+
+            /**
+             * 配置型号
+             */
+            @JsonProperty("configModel")
+            private String configModel;
+
+            /**
+             * 参考价
+             */
+            @JsonProperty("vehiclePrice")
+            private String vehiclePrice;
+
+            /**
+             * 含税价
+             */
+            @JsonProperty("taxVehiclePrice")
+            private String taxVehiclePrice;
+
+            /**
+             * 整备质量 单位:千克
+             */
+            @JsonProperty("tonnage")
+            private String tonnage;
+
+            /**
+             * 座位数
+             */
+            @JsonProperty("seat")
+            private String seat;
+
+            /**
+             * 车辆种类
+             */
+            @JsonProperty("className")
+            private String className;
+
+            /**
+             * 是否减免税车型 0-非减免税车型、04-减免税车型、05-减税(注:05-减税,也是减免税车型,保费计算接口中车船税节点信息”taxRelifFlag” 计税分类字段须传 04,代表的是减免税车型。)
+             */
+            @JsonProperty("taxCutFlag")
+            private String taxCutFlag;
+
+            /**
+             *  减免税比例 减免比例返回的是百分比,如返回50,代表的是 百分之50,没减免比例则返回空
+             */
+            @JsonProperty("taxCutProp")
+            private String taxCutProp;
+
+            /**
+             * 是否新能源车辆 1:是 0:否
+             */
+            @JsonProperty("energyFlag")
+            private String energyFlag;
+
+            /**
+             * 精有车型名称
+             */
+            @JsonProperty("modelName")
+            private String modelName;
+
+            /**
+             * 备注
+             */
+            @JsonProperty("remark")
+            private String remark;
+
+            /**
+             * 能源类型
+             */
+            @JsonProperty("energyType")
+            private String energyType;
+            public CoreModelsVo toCoreModelsVo() {
+                CoreModelsVo coreModelsVo = new CoreModelsVo();
+                coreModelsVo.setModelCode(this.modelCode);
+                coreModelsVo.setModelName(this.modelName);
+                coreModelsVo.setCarYear(null);
+                coreModelsVo.setPower(null);
+                coreModelsVo.setEnginedesc(this.vehicleDisplacement);
+                coreModelsVo.setPurchasePrice(this.vehiclePrice);
+                coreModelsVo.setSeatCount(this.seat);
+                return coreModelsVo;
+            }
+
+            @Override
+            public String getCarYear() {
+                return null;
+            }
+
+            @Override
+            public String getPurchasePrice() {
+                return this.vehiclePrice;
+            }
+
+            @Override
+            public String getSeatCount() {
+                return this.seat;
+            }
         }
     }
 }

+ 6 - 6
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java

@@ -75,10 +75,10 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
                 attributionInformationVo.getConfigInfo());
         // 车型查询
         CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
-        CarModelQueryRequest carInfoRequest = new CarModelQueryRequest(carInfoVo.getBrandName());
+        CarModelQueryRequest carInfoRequest = new CarModelQueryRequest(parameters,carInfoVo.getBrandName());
         CarModelQueryResponse carModelQueryResponse = chengTaiRequestApiComponent.carModelQuery(carInfoRequest,apiUrl);
         // 过滤车型
-        CarModelQueryResponse.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getVehicleList(), carInfoVo);
+        CarModelQueryResponse.Body.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getBody().getVehicleList(), carInfoVo);
         // 计算车辆价格
         BigDecimal carActualValue = calculateCarActualValue(vehicle,quoteVo.getCarInfoVo());
         // 报价
@@ -91,7 +91,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
     /**
      * 计算车辆实际价值
      */
-    private BigDecimal calculateCarActualValue(CarModelQueryResponse.vehicle vehicle,CarInfoVo carInfoVo) {
+    private BigDecimal calculateCarActualValue(CarModelQueryResponse.Body.vehicle vehicle,CarInfoVo carInfoVo) {
         BigDecimal carActualValue;
         // 获取车辆折旧月数
         DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -151,7 +151,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
      * @return
      */
     private PremiumCalculationResponse getResponse(PremiumCalculationRequest premiumCalculationRequest, QuoteVo quoteVo,BigDecimal carActualValue,
-                    ChengTaiApiParameters parameters, CarModelQueryResponse.vehicle vehicle, String apiUrl) throws Exception {
+                    ChengTaiApiParameters parameters, CarModelQueryResponse.Body.vehicle vehicle, String apiUrl) throws Exception {
         int index = 0;
         PremiumCalculationResponse premiumCalculationResponse = new PremiumCalculationResponse();
         String ciQuestion = null,biQuestion = null;
@@ -373,10 +373,10 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
                 .getConfigInfo());
         // 车型
         CarInfoVo carInfoVo = new CarInfoVo(underwritingVo.getInsOrdersCarInfo());
-        CarModelQueryRequest carInfoRequest = new CarModelQueryRequest(underwritingVo.getInsOrdersCarInfo().getBrandName());
+        CarModelQueryRequest carInfoRequest = new CarModelQueryRequest(parameters,underwritingVo.getInsOrdersCarInfo().getBrandName());
         CarModelQueryResponse carModelQueryResponse = chengTaiRequestApiComponent.carModelQuery(carInfoRequest,apiUrl);
         // 过滤车型
-        CarModelQueryResponse.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getVehicleList(), carInfoVo);
+        CarModelQueryResponse.Body.vehicle vehicle = CarModelsFilterUtils.to(carModelQueryResponse.getBody().getVehicleList(), carInfoVo);
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         underwritingResultsVo.setCompanyOrderNo(underwritingVo.getInsOrders().getCompanyOrderNo());

+ 6 - 1
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java

@@ -18,7 +18,7 @@ import java.util.Locale;
  *
  * @author MrBird
  */
-public class DateUtil {
+public class DateUtil extends cn.hutool.core.date.DateUtil {
 
     /**
      * log日志
@@ -33,6 +33,7 @@ public class DateUtil {
 
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
 
+
     /**
      * 格式化时间,格式为 yyyyMMddHHmmss
      *
@@ -43,6 +44,10 @@ public class DateUtil {
         return formatFullTime(localDateTime, FULL_TIME_PATTERN);
     }
 
+    public static String fmtStd(LocalDateTime localDateTime) {
+        return formatFullTime(localDateTime, FULL_TIME_SPLIT_PATTERN);
+    }
+
     /**
      * 根据传入的格式,格式化时间
      *

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

@@ -449,6 +449,34 @@ public class HuaNongCrawlerRequestComponent {
         return post(FIND_BUSINESSES, request, HuaNongCrawlerFindBusinessesResponse.class, headers);
     }
 
+    /**
+     * 查询核保意见
+     *
+     * @param request 核保意见查询请求
+     * @param headers 请求头
+     * @return 核保意见
+     */
+    public HuaNongCrawlerQueryReviveOpinionResponse queryReviveOpinion(
+            HuaNongCrawlerQueryReviveOpinionRequest request, HttpHeaders headers) {
+        HuaNongCrawlerRequestBaseHead head = request.getHead();
+        head.setTransCode(QUERY_REVIVE_OPINION.getUri());
+        JSONObject json = JSONObject.from(request);
+        RequestEncryptor.processRequest(json);
+        String url = properties.getUrl() + "?" + QUERY_REVIVE_OPINION.getRequestSuffix();
+        ResponseEntity<String> responseEntity = requestComponent.stringPost(url, json, String.class, headers);
+        String responseBody = responseEntity.getBody();
+        HuaNongCrawlerQueryReviveOpinionResponse response = JSON.parseObject(
+                responseBody, HuaNongCrawlerQueryReviveOpinionResponse.class);
+        HuaNongCrawlerBaseResponseHead responseHead = Optional.ofNullable(response)
+                .map(HuaNongHeadResponse::getHead)
+                .orElseThrow(() -> new SystemException(QUERY_REVIVE_OPINION.getRequestDescription() + "异常"));
+        if (!"0".equals(responseHead.getReturnCode())) {
+            throw new SystemException(responseHead.getReturnMessage());
+        }
+        response.setRawResponseBody(responseBody);
+        return response;
+    }
+
     /**
      * 获取支付链接
      *

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

@@ -44,6 +44,7 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     SUBMIT("Submit", "提交核保", "Submit"),
     // 状态查询
     FIND_BUSINESSES("FindBusinesses", "订单状态查询", "FindBusinesses"),
+    QUERY_REVIVE_OPINION("QUERYREVIVEOPINION", "查询核保意见", "QUERYREVIVEOPINION"),
     // 保单下载
     FTP_DOWNLOAD("FTPDOWLOAD", "保单下载", "ftpDowload.do"),
     DOCUMENTS_PRINT("DocumentsPrint", "非车险保单下载", "DocumentsPrint.do"),

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

@@ -126,6 +126,17 @@ public class HuaNongCrawlerFindBusinessesRequestRequest implements HuaNongHeadRe
     @JsonProperty("expireDateEnd")
     private String expireDateEnd;
 
+    public static HuaNongCrawlerFindBusinessesRequestRequest forProposalStatus(
+            String token, String loginCom, String comCode, String proposalNo, String recordingTime) {
+        HuaNongCrawlerFindBusinessesRequestRequest request =
+                new HuaNongCrawlerFindBusinessesRequestRequest(token, loginCom, proposalNo, recordingTime);
+        request.setBusinessType("2");
+        request.setQueryStatus(List.of("0"));
+        request.setComCode(comCode);
+        request.setProposalNo(proposalNo);
+        return request;
+    }
+
     public HuaNongCrawlerFindBusinessesRequestRequest(String token, String loginCom, String policyNo, String recordingTime) {
         this.head = new HuaNongCrawlerRequestBaseHead(token);
         this.loginCom = loginCom;

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

@@ -0,0 +1,73 @@
+package com.jzg.quotation.huanong.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * 华农财险核保意见查询请求
+ */
+@NoArgsConstructor
+@Data
+public class HuaNongCrawlerQueryReviveOpinionRequest implements HuaNongHeadRequest {
+
+    @Serial
+    private static final long serialVersionUID = 8309830212240733031L;
+
+    @JsonProperty("head")
+    private HuaNongCrawlerRequestBaseHead head;
+
+    @JsonProperty("operateType")
+    private String operateType;
+
+    @JsonProperty("contractMain")
+    private List<ContractMainDTO> contractMain;
+
+    @JsonProperty("loginCom")
+    private String loginCom;
+
+    public HuaNongCrawlerQueryReviveOpinionRequest(String token, String loginCom,
+                                                    String ciPolicyNumber, String biPolicyNumber) {
+        this.head = new HuaNongCrawlerRequestBaseHead(token);
+        this.operateType = "-2";
+        this.loginCom = loginCom;
+        this.contractMain = new ArrayList<>();
+
+        Set<String> contractNumbers = new LinkedHashSet<>();
+        addContractNumber(contractNumbers, ciPolicyNumber);
+        addContractNumber(contractNumbers, biPolicyNumber);
+        contractNumbers.forEach(contractNo -> this.contractMain.add(new ContractMainDTO(contractNo)));
+    }
+
+    private static void addContractNumber(Set<String> contractNumbers, String contractNo) {
+        if (contractNo != null && !contractNo.trim().isEmpty()) {
+            contractNumbers.add(contractNo.trim());
+        }
+    }
+
+    @NoArgsConstructor
+    @Data
+    public static class ContractMainDTO {
+
+        @JsonProperty("businessType")
+        private String businessType;
+
+        @JsonProperty("contractNo")
+        private String contractNo;
+
+        @JsonProperty("remark")
+        private String remark;
+
+        public ContractMainDTO(String contractNo) {
+            this.businessType = "2";
+            this.contractNo = contractNo;
+            this.remark = "";
+        }
+    }
+}

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

@@ -0,0 +1,99 @@
+package com.jzg.quotation.huanong.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 华农财险核保意见查询响应
+ */
+@NoArgsConstructor
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class HuaNongCrawlerQueryReviveOpinionResponse implements HuaNongHeadResponse {
+
+    @Serial
+    private static final long serialVersionUID = 2210550128695116894L;
+
+    @JsonProperty("head")
+    private HuaNongCrawlerBaseResponseHead head;
+
+    @JsonProperty("appliResult")
+    private List<AppliResultDTO> appliResult;
+
+    @JsonIgnore
+    private String rawResponseBody;
+
+    public List<OpinionDTO> getOpinions() {
+        List<OpinionDTO> opinions = new ArrayList<>();
+        if (appliResult == null) {
+            return opinions;
+        }
+        for (AppliResultDTO result : appliResult) {
+            if (result == null || result.getUwtionInfo() == null
+                    || result.getUwtionInfo().getData() == null
+                    || result.getUwtionInfo().getData().getData() == null) {
+                continue;
+            }
+            opinions.addAll(result.getUwtionInfo().getData().getData());
+        }
+        return opinions;
+    }
+
+    @NoArgsConstructor
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class AppliResultDTO {
+
+        @JsonProperty("uwtionInfo")
+        private UwtionInfoDTO uwtionInfo;
+    }
+
+    @NoArgsConstructor
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class UwtionInfoDTO {
+
+        @JsonProperty("data")
+        private OpinionDataDTO data;
+    }
+
+    @NoArgsConstructor
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class OpinionDataDTO {
+
+        @JsonProperty("data")
+        private List<OpinionDTO> data;
+    }
+
+    @NoArgsConstructor
+    @Data
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class OpinionDTO {
+
+        @JsonProperty("flag")
+        private String flag;
+
+        @JsonProperty("sHTime")
+        private String sHTime;
+
+        @JsonProperty("notionCode")
+        private String notionCode;
+
+        @JsonProperty("currentGradeName")
+        private String currentGradeName;
+
+        @JsonProperty("operateUserName")
+        private String operateUserName;
+
+        @JsonProperty("handleText")
+        private String handleText;
+    }
+}

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

@@ -687,11 +687,11 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
             String ciPolicyNumber = huaNongCrawlerOrder.getCiPolicyNumber();
             String biPolicyNumber = huaNongCrawlerOrder.getBiPolicyNumber();
 
-            // 获取支付链接
+           /* // 获取支付链接
             String payUrl = huaNongCrawlerRequestComponent.getPayUrl(ciPolicyNumber, biPolicyNumber, username);
-            log.info("支付链接获取完成: {}", payUrl);
+            log.info("支付链接获取完成: {}", payUrl);*/
             // 返回转人工结果
-            return convertToUnderwritingResultsVo(manualSubmit, payUrl);
+            return convertToUnderwritingResultsVo(submit, "");
         }
 
         // 正常核保:获取支付链接
@@ -782,7 +782,9 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
                     underwritingResultsVo.setSyApplyNo(contractNo);
                 }
                 // 状态转换:以第一个为准
-                if (underwritingResultsVo.getUnderwritingStatus() == null) {
+                if ("9".equals(status)) {
+                    underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+                }else if("8".equals(status)){
                     underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
                 }
                 // 拼接核保意见
@@ -966,20 +968,309 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         return downloadPolicyResultVo;
     }
 
+    /**
+     * 查询华农订单状态。
+     *
+     * <p>先通过 FindBusinesses 定位当前投保单;待缴费状态直接生成支付链接,
+     * 其他状态继续查询核保意见,并转换为系统统一订单状态。</p>
+     *
+     * @param orderStatusVo 订单状态查询参数
+     * @return 系统统一订单状态、投保单号、保单号及审核信息
+     */
     @Override
     public OrderStatusResultVo queryOrderState(OrderStatusVo orderStatusVo) {
-        LoginInfoBO loginInfoDto = getLoginInfoDto(orderStatusVo.getOrder().getAttributionInformationVo());
-        HttpHeaders httpHeaders = new HttpHeaders();
+        // 查询依赖订单号和归属账号,缺少任一关键参数都无法调用华农接口
+        if (orderStatusVo == null || orderStatusVo.getOrder() == null
+                || orderStatusVo.getOrder().getAttributionInformationVo() == null
+                || !StringUtils.hasText(orderStatusVo.getOrder().getOrdersNo())) {
+            throw new SystemException("华农订单状态查询参数不完整");
+        }
+
+        // 获取华农登录信息和本地持久化的投保单、保单数据
+        AttributionInformationVo attributionInformationVo = orderStatusVo.getOrder().getAttributionInformationVo();
+        LoginInfoBO loginInfoDto = getLoginInfoDto(attributionInformationVo);
         HuaNongCrawlerOrder order = huaNongCrawlerOrderService.getById(orderStatusVo.getOrder().getOrdersNo());
-        String policyNo = StringUtils.hasText(order.getBiPolicyNumber()) ? order.getBiPolicyNumber() : order.getCiPolicyNumber();
-        HuaNongCrawlerFindBusinessesRequestRequest huaNongCrawlerFindBusinessesRequest
-                = new HuaNongCrawlerFindBusinessesRequestRequest(loginInfoDto.getToken(), loginInfoDto.getLoginComCode(), policyNo, order.getRecordingTime());
-        HuaNongCrawlerFindBusinessesResponse businesses = huaNongCrawlerRequestComponent.findBusinesses(huaNongCrawlerFindBusinessesRequest, httpHeaders);
-        OrderStatusResultVo vo = new OrderStatusResultVo();
-        vo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
-        vo.setJqPolicyno(order.getCiPolicyNumber());
-        vo.setJyPolicyno(order.getNiInfos().get(0).getNiPolicyNumber());
-        return vo;
+        if (order == null) {
+            throw new SystemException("未找到华农本地订单信息");
+        }
+
+        // 先按字段真实语义回填三类投保单号和已存在的保单号
+        OrderStatusResultVo result = buildOrderStatusResult(order);
+
+        // FindBusinesses 每次按一个投保单号查询,优先商业险,其次交强险和非车险
+        String niPolicyNumber = getFirstNiNumber(order.getNiInfos(), false);
+        String proposalNo = firstNonBlank(order.getBiPolicyNumber(), order.getCiPolicyNumber(), niPolicyNumber);
+        if (!StringUtils.hasText(proposalNo)) {
+            setOrderStatus(result, InsOrderStatusEnum.AUDIT_ING);
+            result.setErrorMsg("华农订单状态查询失败:本地未保存投保单号");
+            return result;
+        }
+
+        // comCode 使用归属机构编码;未配置时回退到登录机构编码
+        String comCode = loginInfoDto.getParameters() != null
+                ? loginInfoDto.getParameters().getComCode() : null;
+        if (!StringUtils.hasText(comCode)) {
+            comCode = loginInfoDto.getLoginComCode();
+        }
+        // 按 Python 逻辑使用投保单模式查询未完成业务:businessType=2、queryStatus=0
+        HuaNongCrawlerFindBusinessesRequestRequest findRequest =
+                HuaNongCrawlerFindBusinessesRequestRequest.forProposalStatus(
+                        loginInfoDto.getToken(), loginInfoDto.getLoginComCode(), comCode,
+                        proposalNo, order.getRecordingTime());
+        HuaNongCrawlerFindBusinessesResponse businesses =
+                huaNongCrawlerRequestComponent.findBusinesses(findRequest, new HttpHeaders());
+
+        // 响应可能包含多条业务,必须用本地交强、商业、非车投保单号精确匹配当前订单
+        Set<String> proposalNumbers = collectProposalNumbers(order);
+        HuaNongCrawlerFindBusinessesResponse.BusinessDTO matchedBusiness =
+                findMatchedBusiness(businesses, proposalNumbers);
+        if (matchedBusiness == null) {
+            setOrderStatus(result, InsOrderStatusEnum.AUDIT_ING);
+            result.setErrorMsg(businesses == null || businesses.getBusiness() == null
+                    || businesses.getBusiness().isEmpty()
+                    ? "华农订单状态查询失败:未返回业务记录"
+                    : "华农订单状态查询失败:返回记录未匹配本地投保单号");
+            return result;
+        }
+
+        // 华农业务状态8表示核保已通过、可以缴费,不代表已经生成正式保单
+        if ("8".equals(matchedBusiness.getStatus())) {
+            setOrderStatus(result, InsOrderStatusEnum.PAY_PENDING);
+            result.setPaymentLink(buildPayUrl(order, attributionInformationVo.getUsername()));
+            return result;
+        }
+
+        // 非待缴费状态继续查询核保意见;与 Python 一致,仅提交交强和商业投保单号
+        HuaNongCrawlerQueryReviveOpinionRequest opinionRequest =
+                new HuaNongCrawlerQueryReviveOpinionRequest(
+                        loginInfoDto.getToken(), loginInfoDto.getLoginComCode(),
+                        order.getCiPolicyNumber(), order.getBiPolicyNumber());
+        if (opinionRequest.getContractMain().isEmpty()) {
+            setOrderStatus(result, InsOrderStatusEnum.STAFF_PROCESS);
+            result.setErrorMsg("审核中:缺少可用于核保意见查询的车险投保单号");
+            return result;
+        }
+
+        HuaNongCrawlerQueryReviveOpinionResponse opinionResponse =
+                huaNongCrawlerRequestComponent.queryReviveOpinion(opinionRequest, new HttpHeaders());
+
+        // flag=1 表示核保退回或失败,优先级高于其他审核结果
+        Optional<HuaNongCrawlerQueryReviveOpinionResponse.OpinionDTO> rejectedOpinion =
+                findOpinion(opinionResponse, "1");
+        if (rejectedOpinion.isPresent()) {
+            setOrderStatus(result, InsOrderStatusEnum.AUDIT_FAIL);
+            result.setErrorMsg(formatOpinion(rejectedOpinion.get(), true));
+            return result;
+        }
+
+        // flag=0 表示需要人工处理,保留审核人员返回的详细信息
+        Optional<HuaNongCrawlerQueryReviveOpinionResponse.OpinionDTO> manualOpinion =
+                findOpinion(opinionResponse, "0");
+        if (manualOpinion.isPresent()) {
+            setOrderStatus(result, InsOrderStatusEnum.STAFF_PROCESS);
+            result.setErrorMsg(formatOpinion(manualOpinion.get(), false));
+            return result;
+        }
+
+        // 未返回 flag 时,按 Python 规则同时检查 nodeStatus=0 和“同意承保”
+        if (isUnderwritingApproved(opinionResponse)) {
+            setOrderStatus(result, InsOrderStatusEnum.UNDERWRITED);
+            result.setPaymentLink(buildPayUrl(order, attributionInformationVo.getUsername()));
+            return result;
+        }
+
+        // 没有明确失败、人工或通过标记时,订单仍处于核保处理中
+        setOrderStatus(result, InsOrderStatusEnum.AUDIT_ING);
+        result.setErrorMsg("审核中");
+        return result;
+    }
+
+    /**
+     * 使用本地订单初始化状态查询结果,严格区分投保单号和正式保单号。
+     */
+    private OrderStatusResultVo buildOrderStatusResult(HuaNongCrawlerOrder order) {
+        OrderStatusResultVo result = new OrderStatusResultVo();
+        setOrderStatus(result, InsOrderStatusEnum.AUDIT_ING);
+        result.setJqApplyNo(normalize(order.getCiPolicyNumber()));
+        result.setSyApplyNo(normalize(order.getBiPolicyNumber()));
+        result.setJyApplyNo(getFirstNiNumber(order.getNiInfos(), false));
+        result.setJqPolicyno(normalize(order.getCiPolicyNo()));
+        result.setSyPolicyno(normalize(order.getBiPolicyNo()));
+        result.setJyPolicyno(getFirstNiNumber(order.getNiInfos(), true));
+        return result;
+    }
+
+    /**
+     * 获取第一条有效的非车险号码。
+     *
+     * @param niInfos 非车险信息列表
+     * @param policyNo true 获取正式保单号,false 获取投保单号
+     */
+    private String getFirstNiNumber(List<HuaNongCrawlerOrder.NiInfo> niInfos, boolean policyNo) {
+        if (niInfos == null) {
+            return null;
+        }
+        return niInfos.stream()
+                .filter(Objects::nonNull)
+                .map(niInfo -> policyNo ? niInfo.getNiPolicyNo() : niInfo.getNiPolicyNumber())
+                .map(this::normalize)
+                .filter(StringUtils::hasText)
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * 收集当前订单的全部投保单号,用于从华农业务列表中精确定位订单。
+     */
+    private Set<String> collectProposalNumbers(HuaNongCrawlerOrder order) {
+        Set<String> proposalNumbers = new LinkedHashSet<>();
+        addIfHasText(proposalNumbers, order.getCiPolicyNumber());
+        addIfHasText(proposalNumbers, order.getBiPolicyNumber());
+        if (order.getNiInfos() != null) {
+            order.getNiInfos().stream()
+                    .filter(Objects::nonNull)
+                    .map(HuaNongCrawlerOrder.NiInfo::getNiPolicyNumber)
+                    .forEach(number -> addIfHasText(proposalNumbers, number));
+        }
+        return proposalNumbers;
+    }
+
+    /**
+     * 标准化号码并加入集合,统一过滤 null、空串和重复号码。
+     */
+    private void addIfHasText(Set<String> numbers, String number) {
+        String normalized = normalize(number);
+        if (StringUtils.hasText(normalized)) {
+            numbers.add(normalized);
+        }
+    }
+
+    /**
+     * 按华农响应顺序查找第一条与本地投保单号匹配的业务记录。
+     */
+    private HuaNongCrawlerFindBusinessesResponse.BusinessDTO findMatchedBusiness(
+            HuaNongCrawlerFindBusinessesResponse response, Set<String> proposalNumbers) {
+        if (response == null || response.getBusiness() == null || proposalNumbers.isEmpty()) {
+            return null;
+        }
+        for (HuaNongCrawlerFindBusinessesResponse.BusinessDTO business : response.getBusiness()) {
+            if (business != null && isBusinessMatched(business, proposalNumbers)) {
+                return business;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 检查华农业务记录的 contractNo1 至 contractNo6 是否命中本地投保单号。
+     */
+    private boolean isBusinessMatched(HuaNongCrawlerFindBusinessesResponse.BusinessDTO business,
+                                      Set<String> proposalNumbers) {
+        return Arrays.asList(
+                        business.getContractNo1(), business.getContractNo2(), business.getContractNo3(),
+                        business.getContractNo4(), business.getContractNo5(), business.getContractNo6())
+                .stream()
+                .map(this::normalize)
+                .filter(StringUtils::hasText)
+                .anyMatch(proposalNumbers::contains);
+    }
+
+    /**
+     * 根据华农审核标志查找第一条意见:1 为失败,0 为人工处理。
+     */
+    private Optional<HuaNongCrawlerQueryReviveOpinionResponse.OpinionDTO> findOpinion(
+            HuaNongCrawlerQueryReviveOpinionResponse response, String flag) {
+        if (response == null) {
+            return Optional.empty();
+        }
+        return response.getOpinions().stream()
+                .filter(Objects::nonNull)
+                .filter(opinion -> flag.equals(opinion.getFlag()))
+                .findFirst();
+    }
+
+    /**
+     * 将核保意见转换为前端可直接展示的多行中文信息。
+     */
+    private String formatOpinion(HuaNongCrawlerQueryReviveOpinionResponse.OpinionDTO opinion,
+                                 boolean includeGrade) {
+        StringBuilder message = new StringBuilder();
+        appendOpinionLine(message, "审核时间", opinion.getSHTime());
+        appendOpinionLine(message, "审核信息", opinion.getNotionCode());
+        if (includeGrade) {
+            appendOpinionLine(message, "审核级别名称", opinion.getCurrentGradeName());
+        }
+        appendOpinionLine(message, "操作员名称", opinion.getOperateUserName());
+        appendOpinionLine(message, "详细审核信息", opinion.getHandleText());
+        return message.length() > 0 ? message.toString() : "审核状态已更新";
+    }
+
+    /**
+     * 仅追加有值的审核字段,避免结果中出现空行或 null 文本。
+     */
+    private void appendOpinionLine(StringBuilder message, String label, String value) {
+        if (!StringUtils.hasText(value)) {
+            return;
+        }
+        if (message.length() > 0) {
+            message.append('\n');
+        }
+        message.append(label).append(':').append(value);
+    }
+
+    /**
+     * 按 Python 判断规则确认核保通过:响应必须同时包含 nodeStatus=0 和“同意承保”。
+     */
+    private boolean isUnderwritingApproved(HuaNongCrawlerQueryReviveOpinionResponse response) {
+        if (response == null || !StringUtils.hasText(response.getRawResponseBody())) {
+            return false;
+        }
+        String responseBody = response.getRawResponseBody();
+        boolean approvedNode = Pattern.compile("\\\"nodeStatus\\\"\\s*:\\s*\\\"?0\\\"?")
+                .matcher(responseBody)
+                .find();
+        return approvedNode && responseBody.contains("同意承保");
+    }
+
+    /**
+     * 校验支付链接必要参数后,复用组件生成与 Python 一致的 Base64 支付地址。
+     */
+    private String buildPayUrl(HuaNongCrawlerOrder order, String username) {
+        if (!StringUtils.hasText(username)) {
+            throw new SystemException("华农支付链接生成失败:操作员账号为空");
+        }
+        if (!StringUtils.hasText(order.getCiPolicyNumber())
+                && !StringUtils.hasText(order.getBiPolicyNumber())) {
+            throw new SystemException("华农支付链接生成失败:交强险和商业险投保单号均为空");
+        }
+        return huaNongCrawlerRequestComponent.getPayUrl(
+                order.getCiPolicyNumber(), order.getBiPolicyNumber(), username);
+    }
+
+    /**
+     * 同步设置枚举状态及其字符串编码,避免两个返回字段不一致。
+     */
+    private void setOrderStatus(OrderStatusResultVo result, InsOrderStatusEnum status) {
+        result.setOrderStatus(status);
+        result.setOrderStatusStr(status.getCode());
+    }
+
+    /**
+     * 按业务优先级返回第一个非空号码。
+     */
+    private String firstNonBlank(String... values) {
+        return Arrays.stream(values)
+                .map(this::normalize)
+                .filter(StringUtils::hasText)
+                .findFirst()
+                .orElse(null);
+    }
+
+    /**
+     * 去除号码首尾空白,保留 null 语义供上层统一判空。
+     */
+    private String normalize(String value) {
+        return value == null ? null : value.trim();
     }
 
     /**

+ 5 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/build/HuaTaiCrawlerQuoteResultsVoBuild.java

@@ -146,7 +146,11 @@ public class HuaTaiCrawlerQuoteResultsVoBuild {
         kindInfoVo.forEach(kind -> {
             HtCrawlerQuoteResponse.DataDTO.CoverageDTOList.CoverageDTO coverageDTO = collect.get(kind.getKindCode());
             if (coverageDTO.getComcoveragecode().equals(kind.getKindCode())) {
-                kind.setAmount(String.valueOf(coverageDTO.getLimitamount()));//设置保额
+                kind.setAmount(StringUtils.isBlank(String.valueOf(coverageDTO.getLimitamount())) ? "0" : String.valueOf(coverageDTO.getLimitamount()));//设置保额 空字符串处理
+                // 如果是道路救援险种,保额为0
+                if (ContractEnum.H_SR.getKindCode().equals(kind.getKindCode())) {
+                    kind.setAmount("0");
+                }
                 kind.setPremium(String.valueOf(coverageDTO.getStandardpremium()));//设置保费
 //                kind.setUnitAmount(String.valueOf(coverageDTO.getUnitAmount()));//设置每座保额
                 kind.setQuantity(String.valueOf(coverageDTO.getQuantity()));//设置份数

+ 43 - 17
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestBuilder.java

@@ -261,13 +261,16 @@ public class RenBaoNewCrawlerRequestBuilder {
         );
 
         // 从车型查询结果中提取关键字段
-        String vehicleClassPicc = extractVehicleInfo(vehicleResult, "vehicleClassPicc");  // 车种代码(如A01-轿车)
-        String vehicleTonnage = extractVehicleInfo(vehicleResult, "vehicleTonnage");    // 核定载质量(货车用)
-        String purchasePriceT = extractVehicleInfo(vehicleResult, "priceT");            // 新车购置价(车型库标准价)
-        String fuelType = extractVehicleInfo(vehicleResult, "fuelType");                // 燃料类型(A-汽油,B-柴油等)
-        String vehicleModelCode = extractVehicleInfo(vehicleResult, "vehicleModelCode"); // 车型代码
-        String vehicleId = extractVehicleInfo(vehicleResult, "vehicleId");              // 车辆ID(人保内部编码)
-        String vehicleFgwCode = extractVehicleInfo(vehicleResult, "vehicleFgwCode");    // 工信部公告型号
+
+        String carPrice = quoteVo.getCarInfoVo().getPurchasePrice();
+
+        String vehicleClassPicc = extractVehicleInfo(vehicleResult, "vehicleClassPicc",carPrice);  // 车种代码(如A01-轿车)
+        String vehicleTonnage = extractVehicleInfo(vehicleResult, "vehicleTonnage",carPrice);    // 核定载质量(货车用)
+        String purchasePriceT = extractVehicleInfo(vehicleResult, "priceT",carPrice);            // 新车购置价(车型库标准价)
+        String fuelType = extractVehicleInfo(vehicleResult, "fuelType",carPrice);                // 燃料类型(A-汽油,B-柴油等)
+        String vehicleModelCode = extractVehicleInfo(vehicleResult, "vehicleModelCode",carPrice); // 车型代码
+        String vehicleId = extractVehicleInfo(vehicleResult, "vehicleId",carPrice);              // 车辆ID(人保内部编码)
+        String vehicleFgwCode = extractVehicleInfo(vehicleResult, "vehicleFgwCode",carPrice);    // 工信部公告型号
 
         // =====================================================================
         // 步骤3.1:计算使用性质和条款类型
@@ -2082,6 +2085,11 @@ public class RenBaoNewCrawlerRequestBuilder {
             String matchedVehicleMakerId = getStringValue(matchedVehicle, "vehicleMakerId");
             String matchedGroupName = getStringValue(matchedVehicle, "groupName");
             String matchedHighestHour = getStringValue(matchedVehicle, "highestHour");
+            String presaleCarFlag = getStringValue(matchedVehicle, "presaleCarFlag");
+
+            if(matchedVehicleId != null && !presaleCarFlag.isEmpty()){
+                prpCitemCar.put("presaleCarFlag", presaleCarFlag);
+            }
 
             if (matchedVehicleId != null && !matchedVehicleId.isEmpty()) {
                 prpCitemCar.put("vehicleId", matchedVehicleId);
@@ -3414,17 +3422,19 @@ public class RenBaoNewCrawlerRequestBuilder {
         return prpCmainChannel;
     }
 
+
     /**
      * 从车型查询结果中提取字段
      *
-     * <p>从vehicleQuery返回的Map中提取指定字段值,路径:data.carInfos.result[0].fieldName</p>
+     * <p>从vehicleQuery返回的Map中提取指定字段值,遍历result列表根据purchasePrice匹配车型,未命中取第一条</p>
      *
      * @param vehicleResult 车型查询结果
-     * @param fieldName 字段名
+     * @param fieldName     字段名
+     * @param purchasePrice 车型价格,用来匹配priceT/priceP
      * @return 字段值,如果不存在返回null
      */
     @SuppressWarnings("unchecked")
-    private String extractVehicleInfo(Map<String, Object> vehicleResult, String fieldName) {
+    private String extractVehicleInfo(Map<String, Object> vehicleResult, String fieldName, String purchasePrice) {
         if (vehicleResult == null) {
             return null;
         }
@@ -3443,16 +3453,32 @@ public class RenBaoNewCrawlerRequestBuilder {
         Map<String, Object> carInfosMap = (Map<String, Object>) carInfos;
 
         // 第三层:result(列表)
-        Object result = carInfosMap.get("result");
-        if (!(result instanceof List) || ((List<?>) result).isEmpty()) {
+        Object resultObj = carInfosMap.get("result");
+        if (!(resultObj instanceof List) || ((List<?>) resultObj).isEmpty()) {
             return null;
         }
-        Object firstItem = ((List<?>) result).get(0);
-        if (!(firstItem instanceof Map)) {
-            return null;
+        List<Map<String, Object>> resultList = (List<Map<String, Object>>) resultObj;
+
+        Map<String, Object> matchItem = null;
+        // 遍历按价格匹配 priceT
+        for (Map<String, Object> item : resultList) {
+            if (item == null) {
+                continue;
+            }
+            String priceT = item.get("priceT") != null ? item.get("priceT").toString() : null;
+
+            if (priceT != null && new BigDecimal(purchasePrice).compareTo(new BigDecimal(priceT))==0  ) {
+                matchItem = item;
+                break;
+            }
         }
-        Map<String, Object> itemMap = (Map<String, Object>) firstItem;
-        Object value = itemMap.get(fieldName);
+
+        //没有命中价格,降级取第一条
+        if (matchItem == null) {
+            matchItem = resultList.get(0);
+        }
+
+        Object value = matchItem.get(fieldName);
         return value != null ? value.toString() : null;
     }
 

+ 2 - 8
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java

@@ -891,18 +891,12 @@ public class UnifyOrderManager {
         HttpResult<EsmInsCompany> esmInsCompanyHttpResult = platformClient.findById(insOrders.getCompanyId());
         String systemCode = getSystemCode();
 
-        //先默认第一个协议
-        List<PtlAgreement> byCompanyId = agreementCacheService.getByCompanyId(insOrders.getCompanyId(), systemCode);
-        if (CollUtil.isEmpty(byCompanyId)) {
-            AssertionUtils.isFail(true, "保司未配置协议");
-        }
-
         // 获取特约列表
         CompanyClauseVo companyClauseVo = new CompanyClauseVo();
         companyClauseVo.setCompanyId(insOrders.getCompanyId());
         HttpResult<List<InsCompanyClauseVo>> clauseDataResult = platformClient.queryClauseData(companyClauseVo);
         if (clauseDataResult.getData().isEmpty()) {
-            AssertionUtils.isFail(true, "保司未配置特约");
+            return HttpResult.ok("保司未配置协议");
         }
         clauseDataVo.setJqPremium(costs.getJqPremium());
         clauseDataVo.setSyPremium(costs.getSyPremium());
@@ -920,7 +914,7 @@ public class UnifyOrderManager {
         clauseDataVo.getOrder().setInsuranceCompanyId(esmInsCompanyHttpResult.getData().getId());
         clauseDataVo.getOrder().setInsuranceCompanyCode(esmInsCompanyHttpResult.getData().getCompanyCode());
         clauseDataVo.getOrder().setApiType(Integer.parseInt(insOrders.getApiType()));
-        clauseDataVo.getOrder().setAgreementId(byCompanyId.get(0).getId());
+        clauseDataVo.getOrder().setAgreementId(insOrders.getAgreementId());
         QuotationBaseService quoteService = companyFactory.getClauseDataService(clauseDataVo);
         quoteService.queryClauseData(clauseDataVo);
 

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

@@ -172,6 +172,8 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         for (FeeAuditVo feeAuditVo : page.getRecords()) {
             String allCompany =  allCompanyHierarchyPaths.get(Objects.toString(feeAuditVo.getCompanyId(),""));
             feeAuditVo.setCompanyALlName(allCompany);
+            feeAuditVo.setPartnerCompanyName(allCompanyHierarchyPaths.get(Objects.toString(feeAuditVo.getPartnerCompanyId(),"")));
+            feeAuditVo.setPartnerCompanySimplyName(allCompanyHierarchyPaths.get(Objects.toString(feeAuditVo.getPartnerCompanyId(),"")));
             // 循环每条数据,查询 ins_fee_orders 并计算权益金额
             // 查询订单的 ins_fee_orders 数据
             InsFeeOrders insFeeOrders = feeOrdersService.getById(feeAuditVo.getOrderNo());

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

@@ -32,6 +32,7 @@
     </select>
 
     <select id="queryPage" resultType="com.jzg.commons.entity.orders.vo.FeeAuditVo">
+        select a.* from (
         SELECT
         qsu.username ,    -- 业务员登录账号
         ifa.order_no as orderNo,
@@ -74,7 +75,14 @@
         END AS isProblem,
         io.order_source,
         ioci.vin_no,
-        ifo.*
+        ifo.*,
+        pa.partner_company_id,iop.jq_policy_no , iop.sy_policy_no , iop.jy_policy_no,
+        (select ior.start_date  from ins_orders_risk ior where ior.order_no = io.id and ior.risk_name = '交强险' )  as jq_risk_start_date,
+        (select ior.end_date from ins_orders_risk ior where ior.order_no = io.id and ior.risk_name = '交强险' )  as jq_risk_end_date,
+        (select ior.start_date  from ins_orders_risk ior where ior.order_no = io.id and ior.risk_name = '商业险' )  as sy_risk_start_date,
+        (select ior.end_date from ins_orders_risk ior where ior.order_no = io.id and ior.risk_name = '商业险' )  as sy_risk_end_date,
+        (select ior.start_date  from ins_orders_risk ior where ior.order_no = io.id and ior.risk_name = '驾意险' )  as jy_risk_start_date,
+        (select ior.end_date from ins_orders_risk ior where ior.order_no = io.id and ior.risk_name = '驾意险' )  as jy_risk_end_date
         FROM ins_fee_audit ifa
         LEFT JOIN ins_orders io on ifa.order_no = io.id AND io.is_delete=0
         LEFT JOIN ins_orders_car_info ioci on io.id = ioci.order_no AND ioci.is_delete=0
@@ -87,6 +95,7 @@
         LEFT JOIN ins_orders_costs ioc on ioc.order_no = io.id AND ioc.is_delete=0
         LEFT JOIN ins_orders_external_policy ioep on ioep.order_no = io.id AND ioep.is_delete=0
         LEFT JOIN ins_fee_orders ifo on ifo.order_no  = ifa.order_no  and ifo.is_delete = 0
+        LEFT JOIN ins_orders_policy iop on iop.order_no = io.id and iop.is_delete = 0
         <where>
             and ifa.is_delete=0 and ifa.system_code = #{param.systemCode}
             <if test="param.vinNo != null and param.vinNo !=''">
@@ -122,6 +131,30 @@
             <if test="param.salesman != null and param.salesman != ''">
                 and (qsu.username = #{param.salesman} or qsu.mobile = #{param.salesman})
             </if>
+            <if test="param.phone != null and param.phone != ''">
+                and (qsu.username = #{param.phone} or qsu.mobile = #{param.phone})
+            </if>
+            <if test="param.contact != null and param.contact != ''">
+                and (io.docking_person  like #{param.contact} or io.docking_person_phone  like #{param.contact} )
+            </if>
+            <if test="param.partnerCompanyId != null">
+                and pa.partner_company_id = #{param.partnerCompanyId}
+            </if>
+            <if test="param.payingTimeBegin != null and param.payingTimeEnd != null">
+                and DATE_FORMAT(io.pay_time, '%Y-%m-%d') between #{param.payingTimeBegin} AND #{param.payingTimeEnd}
+            </if>
+            <if test="param.quotationTimeStart != null and param.quotationTimeEnd != null">
+                and DATE_FORMAT(io.create_time, '%Y-%m-%d') between #{param.quotationTimeStart} AND #{param.quotationTimeEnd}
+            </if>
+            <if test="param.jqPolicyNo != null and param.jqPolicyNo != ''">
+                and iop.jq_policy_no = #{param.jqPolicyNo}
+            </if>
+            <if test="param.syPolicyNo != null and param.syPolicyNo != ''">
+                and iop.sy_policy_no = #{param.syPolicyNo}
+            </if>
+            <if test="param.jyPolicyNo != null and param.jyPolicyNo != ''">
+                and iop.jy_policy_no = #{param.jyPolicyNo}
+            </if>
             <if test="param.orderStatus != null ">
                 and io.order_status = #{param.orderStatus}
             </if>
@@ -177,7 +210,19 @@
                 and ifa.audit_status = #{param.auditStatus}
             </if>
         </where>
-        ORDER BY io.create_time desc
+        ) a
+        <where>
+            <if test="param.jqRiskStartDateBegin != null and param.jqRiskStartDateEnd != null">
+                and a.jq_risk_start_date &gt;= #{param.jqRiskStartDateBegin} and a.jq_risk_start_date &lt; #{param.jqRiskStartDateEnd}
+            </if>
+            <if test="param.syRiskStartDateBegin != null and param.syRiskStartDateEnd != null">
+                and a.sy_risk_start_date &gt;= #{param.syRiskStartDateBegin} and a.sy_risk_start_date &lt; #{param.syRiskStartDateEnd}
+            </if>
+            <if test="param.jyRiskStartDateBegin != null and param.jyRiskStartDateEnd != null">
+                and a.jy_risk_start_date &gt;= #{param.jyRiskStartDateBegin} and a.jy_risk_start_date &lt; #{param.jyRiskStartDateEnd}
+            </if>
+        </where>
+        ORDER BY a.createTime desc
     </select>
     <select id="queryList" resultType="com.jzg.commons.entity.orders.vo.FeeAuditVo">
         SELECT

+ 4 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java

@@ -155,7 +155,10 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
             }
             priceUncarDaData.put("diInsurance", diInsurance);
             Map<String, Object> priceUncarDaRes = priceUncarDa(priceUncarDaData, headers, taiShanCrawlerRequestComponent);
-            log.info("diInsurance_非车保费计算结果:{}", JSONObject.toJSONString(priceUncarDaRes));
+            log.info("diInsurance_非车保费计算结果:{}", JSONObject.toJSONString(priceUncarDaRes));//{"result":"","code":"400","message":"驾意险仅限家庭自用汽车,非营业企业客车和非营业机关客车9座以下投保"}
+            if (!"200".equals(String.valueOf(priceUncarDaRes.get("code")))) {
+                throw new SystemException("diInsurance_非车保费计算异常,错误信息:" + priceUncarDaRes.get("message"));
+            }
 
             Map<String, Object> resRoot = (Map<String, Object>) priceUncarDaRes.get("result");
             Map<String, Object> diInsurancePrice = (Map<String, Object>) resRoot.get("diInsurance");

+ 2 - 7
tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/build/YangGuangApiQuoteResultsVoBuild.java

@@ -151,12 +151,7 @@ public final class YangGuangApiQuoteResultsVoBuild {
     }
     private static QuoteResultsVo.ScoreVo buildScoreVo(YangGuangAccuracyCalculateResponse.discount discount,YangGuangAccuracyCalculateResponse yangGuangAccuracyCalculateResponse) {
         QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
-//        scoreVo.setJqScore(discount.getMarkingnobcCI());
-//        scoreVo.setSyScore(discount.getMarkingnobcBI());
-//        scoreVo.setMergeCostRate(yangGuangAccuracyCalculateResponse.getVascostmarginbc());
-//        scoreVo.setXyhGrade(yangGuangAccuracyCalculateResponse.getXYHGrade() != null ? "1" : "0");
-//        scoreVo.setSeriesTypeActualName(yangGuangAccuracyCalculateResponse.getSeriesTypeActualName() != null ? yangGuangAccuracyCalculateResponse.getSeriesTypeActualName() : "");
-//
+
         scoreVo.setLossRation(discount.getFinalmarkingnobc());
         scoreVo.setJqLossRation(discount.getFinalmarkingnoCi());
         scoreVo.setSyLossRation(discount.getFinalmarkingnoBi());
@@ -175,7 +170,7 @@ public final class YangGuangApiQuoteResultsVoBuild {
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","向阳花标识")
                 .fluentPut("scoreKey","XyhGrade")
-                .fluentPut("score",yangGuangAccuracyCalculateResponse.getXYHGrade() != null ? "1" : "0"));
+                .fluentPut("score",yangGuangAccuracyCalculateResponse.getXYHGrade() != null ? "是" : "否"));
 
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","红黄蓝车系")

+ 4 - 4
tenant/insurance/quotation-yongcheng/src/main/java/com/jzg/quotation/yongcheng/api/service/impl/YongChengApiRequestImpl.java

@@ -420,13 +420,13 @@ public class YongChengApiRequestImpl implements YongChengApiRequest {
             if (response.getResult().equals("0")) {
                 //判断人工处理和核保退回
                 if(orderStatusVo.getInsOrders().getOrderStatus().equals(InsOrderStatusEnum.STAFF_PROCESS.getCode().toString())){
-                    if(response.getJqstatus().equals("9") || response.getSystatus().equals("9")){
-                        orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
-                    }else if(response.getJqstatus().equals("0") || response.getSystatus().equals("0")){
+                    if(response.getJqstatus().equals("0") || response.getSystatus().equals("0")) {
                         orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.STAFF_PROCESS);
-                    }else if(response.getJqstatus().equals(3)){
+                    }else if(response.getJqstatus().equals("3") || response.getSystatus().equals("3")){
                         orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.AUDIT_FAIL);
                         orderStatusResultVo.setErrorMsg(response.getJqmessage());
+                    }else if(response.getJqstatus().equals("9") || response.getSystatus().equals("9")){
+                        orderStatusResultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
                     }
                 }
                 if(orderStatusVo.getInsOrders().getOrderStatus().equals(InsOrderStatusEnum.PAY_PENDING.getCode().toString())){

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

@@ -4,30 +4,24 @@ import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import com.jzg.commons.util.AssertionUtils;
 import com.jzg.quotation.zhongan.crawler.client.LoginResult;
-import com.jzg.quotation.zhongan.crawler.entity.request.ZhongAnCrawlerQueryInitInfoRequest;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerPaymentResponse;
 import com.jzg.quotation.zhongan.crawler.entity.response.ZhongAnCrawlerUploadInitDateResponse;
 import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.*;
-import org.apache.hc.core5.net.URIBuilder;
-import org.apache.http.Header;
-import org.apache.http.client.methods.CloseableHttpResponse;
-import org.apache.http.client.methods.HttpGet;
-import org.apache.http.client.protocol.HttpClientContext;
-import org.apache.http.impl.client.CloseableHttpClient;
-import org.apache.http.impl.client.HttpClients;
-import org.apache.poi.ss.formula.functions.T;
+import okhttp3.Headers;
+import okhttp3.MediaType;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.RequestBody;
+import okhttp3.Response;
 import org.redisson.api.RBucket;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
-import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Component;
 
-import java.net.URI;
+
 import java.time.Duration;
 import java.util.HashMap;
 import java.util.List;

+ 6 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/component/ZhongAnCrawlerRequestComponent.java

@@ -180,6 +180,12 @@ public class ZhongAnCrawlerRequestComponent {
         return requestComponent.formDataZhongAn(RequestUrl.UPLOAD_IMAGE.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), imageRequest, ZhongAnCrawlerUploadImageResponse.class, headers,"上传影像").getBody();
     }
 
+    public ZhongAnCrawlerAccommodationUploadResponse accommodationUpload(ZhongAnCrawlerAccommodationUploadRequest accommodationUploadRequest, HttpHeaders headers) {
+        InsuranceLog.infoLog(InsuranceEnum.ZAPA.getPinyin(), "\n\t---------> {} \n\t---------> URl: {} \n\t---------> 请求参数:{}",
+                "众安爬虫上传通融影像接口",RequestUrl.ACCOMMODATION_UPLOAD.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), JSON.toJSONString(accommodationUploadRequest));
+        return requestComponent.formDataZhongAn(RequestUrl.ACCOMMODATION_UPLOAD.getRequestUrl(zhongAnCrawlerProperties.getBaseUrl()), accommodationUploadRequest, ZhongAnCrawlerAccommodationUploadResponse.class, headers,"上传通融影像").getBody();
+    }
+
     /**
      * 获取支付链接
      *

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

@@ -41,6 +41,7 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
     UPLOAD_INIT_DATA("/open/distribution/distribute_controller/get_upload_init_data.json", "上传初始化数据"),
 
     UPLOAD_IMAGE("/open/distribution/distribute_controller/upload_user_confirm_data.json", "正常流程上传影像"),
+    ACCOMMODATION_UPLOAD("/open/bmw/n/accommodation_controller/accommodation_upload_file.json", "通融申请上传影像"),
 
     MARK_COMPLETED("/open/distribution/distribute_controller/mark_upload_completed.json", "核保"),
     /**

+ 50 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/request/ZhongAnCrawlerAccommodationUploadRequest.java

@@ -0,0 +1,50 @@
+package com.jzg.quotation.zhongan.crawler.entity.request;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
+import com.jzg.quotation.zhongan.crawler.constant.ZhongAnRequestConstant;
+import com.jzg.quotation.zhongan.crawler.entity.ZhongAnCrawlerConfigureParameters;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.core.io.ByteArrayResource;
+
+/**
+ * @author quchen
+ * @date 2026/8/7 9:07
+ */
+@Data
+@NoArgsConstructor
+public class ZhongAnCrawlerAccommodationUploadRequest {
+    public ZhongAnCrawlerAccommodationUploadRequest(String imageType, InsuranceImageVo.ImageDTO imageDTO, String orderNo, ZhongAnCrawlerConfigureParameters parameters) {
+        this.imageType = imageType;
+        this.fileItem = new ByteArrayResource(imageDTO.getImageByte()) {
+            @Override
+            public String getFilename() {
+                return imageDTO.getImageName(); // 必须重写此方法
+            }
+        };;
+        this.orderNo = orderNo;
+        this.page = ZhongAnRequestConstant.TONG_RONG_QUERY_PAGE;
+        this.flag = parameters.getFlag();
+        this.i = ZhongAnRequestConstant.I_PARAM;
+        this.flowId = parameters.getFlowId();
+    }
+    @JsonProperty("imageType")
+    private String imageType;
+
+    @JsonProperty("fileItem")
+    @JSONField(serialize = false)
+    private ByteArrayResource fileItem;
+    @JsonProperty("orderNo")
+    private String orderNo;
+    @JsonProperty("page")
+    private String page;
+    @JsonProperty("flag")
+    private String flag;
+    @JsonProperty("flowId")
+    private String flowId;
+
+    @JsonProperty("i")
+    private String i;
+}

+ 52 - 0
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/entity/response/ZhongAnCrawlerAccommodationUploadResponse.java

@@ -0,0 +1,52 @@
+package com.jzg.quotation.zhongan.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author quchen
+ * @date 2026/8/7 10:35
+ */
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ZhongAnCrawlerAccommodationUploadResponse extends ZhongAnCrawlerBaseResponse {
+    @JsonProperty("value")
+    private ValueDTO value;
+    @JsonProperty("additionalInfo")
+    private AdditionalInfoDTO additionalInfo;
+
+    @Data
+    public static class ValueDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = 8428987717523097930L;
+        @JsonProperty("datas")
+        private DataDTO datas;
+
+        @Data
+        public static class DataDTO implements Serializable {
+            @Serial
+            private static final long serialVersionUID = -6591203866369844410L;
+            @JsonProperty("attachment")
+            private String attachment;
+            @JsonProperty("encFileImageName")
+            private String encFileImageName;
+            @JsonProperty("fileName")
+            private String fileName;
+            @JsonProperty("verifyBodySuccess")
+            private Boolean verifyBodySuccess;
+            @JsonProperty("verifyTrueSuccess")
+            private Boolean verifyTrueSuccess;
+        }
+    }
+
+    @Data
+    public static class AdditionalInfoDTO implements Serializable {
+        @Serial
+        private static final long serialVersionUID = -8951754307417647863L;
+    }
+}

+ 47 - 24
tenant/insurance/quotation-zhongan/src/main/java/com/jzg/quotation/zhongan/crawler/service/Impl/ZhongAnCrawlerRequestImpl.java

@@ -421,33 +421,48 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
             parameters.setFlowId(zhongAnCrawlerCacheComponent.getFlowId(parameters.getUsername()));
         }
         ZhongAnCrawlerOrder zhongAnCrawlerOrder = zhongAnCrawlerOrderService.findByOrdersNo(orderBase.getOrdersNo());
+        ZhongAnCrawlerQueryAccommodationRequest queryAccommodationRequest = new ZhongAnCrawlerQueryAccommodationRequest(zhongAnCrawlerOrder.getQuoteId(), parameters);
+        ZhongAnCrawlerQueryAccommodationResponse queryAccommodationResponse = zhongAnCrawlerRequestComponent.queryAccommodation(queryAccommodationRequest, headers);
+        boolean queryAccommodation = queryAccommodationResponse.getSuccess();
         for (InsuranceImageVo insuranceImageVo : insuranceUploadImageVo.getImageVoList()) {
-            //C01行驶证正面,C02车主身份证正面,D01行驶证反面
-            if (insuranceImageVo.getImageCode().equals("C01")) {
-                String imageType = "6";
-                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
-                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
-
-            } else if (insuranceImageVo.getImageCode().equals("C02")) {
-                String imageType = "4";
-                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
-                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
-
-            } else if (insuranceImageVo.getImageCode().equals("D01")) {
-                String imageType = "7";
-                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
-                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
-
-            } else if (insuranceImageVo.getImageCode().equals("D02")) {
-                String imageType = "5";
-                InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
-                extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
-            } else {
-                String imageType = "99";
-                List<InsuranceImageVo.ImageDTO> imageBase64List = insuranceImageVo.getImageBase64List();
-                for (InsuranceImageVo.ImageDTO imageDTO : imageBase64List) {
+            //C01行驶证正面,C02车主身份证正面,D01行驶证反面 D02 车主身份证反面
+            switch (insuranceImageVo.getImageCode()) {
+                case "C01" -> {
+                    String imageType = "6";
+                    InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
+                    extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+                }
+                case "C02" -> {
+                    String imageType = "4";
+                    InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
                     extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
                 }
+                case "D01" -> {
+                    String imageType = "7";
+                    InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
+                    if (!queryAccommodation) {
+                        extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+                    } else {
+                        accommodationUpload(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+                    }
+                }
+                case "D02" -> {
+                    String imageType = "5";
+                    InsuranceImageVo.ImageDTO imageDTO = insuranceImageVo.getImageBase64List().get(0);
+                    if (!queryAccommodation) {
+                        extracted(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+                    } else {
+                        accommodationUpload(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+                    }
+
+                }
+                default -> {
+                    String imageType = "99";
+                    List<InsuranceImageVo.ImageDTO> imageBase64List = insuranceImageVo.getImageBase64List();
+                    for (InsuranceImageVo.ImageDTO imageDTO : imageBase64List) {
+                        accommodationUpload(parameters, headers, zhongAnCrawlerOrder, imageType, imageDTO);
+                    }
+                }
             }
 
         }
@@ -479,6 +494,14 @@ public class ZhongAnCrawlerRequestImpl implements ZhongAnCrawlerRequest {
         }
     }
 
+    private void accommodationUpload (ZhongAnCrawlerConfigureParameters parameters, HttpHeaders headers, ZhongAnCrawlerOrder zhongAnCrawlerOrder, String imageType, InsuranceImageVo.ImageDTO imageDTO) {
+        ZhongAnCrawlerAccommodationUploadRequest accommodationUploadRequest = new ZhongAnCrawlerAccommodationUploadRequest(imageType, imageDTO, zhongAnCrawlerOrder.getOrderNo(), parameters);
+        ZhongAnCrawlerAccommodationUploadResponse accommodationUploadResponse = zhongAnCrawlerRequestComponent.accommodationUpload(accommodationUploadRequest, headers);
+        if (accommodationUploadResponse.getSuccess()) {
+            log.info("影像" + imageType + ":上传成功");
+        }
+    }
+
     public byte[] convert(String filePath) throws IOException {
         File file = new File(filePath);
         byte[] binaryData = new byte[(int) file.length()];

+ 11 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -1,6 +1,7 @@
 package com.jzg.organization.controller;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.tree.Tree;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONUtil;
@@ -29,6 +30,8 @@ import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -474,6 +477,14 @@ public class ReceivableController {
         if (StrUtil.isBlank(receivableQueryVo.getAgreementType())){
             receivableQueryVo.setAgreementType("1");
         }
+        if(StrUtil.isEmpty(receivableQueryVo.getSigningTimeStart()) &&
+                StrUtil.isEmpty(receivableQueryVo.getSigningTimeEnd()) &&
+                receivableQueryVo.getSigningTime() != null &&
+                receivableQueryVo.getSigningTime().length == 2){
+            receivableQueryVo.setSigningTimeStart(DateUtil.format(LocalDate.parse(receivableQueryVo.getSigningTime()[0], DateTimeFormatter.ISO_DATE).atStartOfDay(), "yyyy-MM-dd HH:mm:ss"));
+            receivableQueryVo.setSigningTimeEnd(DateUtil.format(LocalDate.parse(receivableQueryVo.getSigningTime()[1], DateTimeFormatter.ISO_DATE).plusDays(1).atStartOfDay(), "yyyy-MM-dd HH:mm:ss"));
+        }
+
         receivableQueryVo.setSystemCode(baseController.getSystemCode());
         Page<InsPlyIncome> data = receivableService.getPlatFormReceivableList(receivableQueryVo);
         InsPlyIncomeVO vo = receivableService.getReceivablePageIds(receivableQueryVo);

+ 63 - 12
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -917,8 +917,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
         // 批量查询跟单订单
         Map<String, InsFeeFollowOrder> followOrderMap = batchQueryFollowOrder(allFollowIds);
-        // 批量查询未结算的开票信息
-        Map<String, InsPlyIncomeInvoice> invoiceMap = batchQueryInvoice(allInvoiceIds);
+        // 批量查询未结算的结算信息
+        Map<String, BigDecimal> invoiceNoSettlementDecimalMap = batchQueryInvoice(allInvoiceIds);
         // 批量查询结算单
         Map<String, InsPlyIncomeInvoiceSettlement> settlementMap = batchQuerySettlement(allSettlementIds);
 
@@ -989,12 +989,11 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 vo.setTotalUnSettlementAmount(BigDecimal.ZERO);
             }else{
                 // 和wwq讨论过了,这个就是统计已开票未结算的数据
-                BigDecimal invoiceNoSettlement = invoiceIds.stream()
-                        .map(invoiceMap::get)
+                BigDecimal reduce = invoiceIds.stream()
+                        .map(invoiceNoSettlementDecimalMap::get)
                         .filter(Objects::nonNull)
-                        .map(InsPlyIncomeInvoice::getReceivableSupervisePremium)
                         .reduce(BigDecimal.ZERO, BigDecimal::add);
-                vo.setTotalUnSettlementAmount(invoiceNoSettlement);
+                vo.setTotalUnSettlementAmount(reduce);
             }
 
             aggResult.add(vo);
@@ -1017,18 +1016,56 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     }
 
     /**
-     * 批量查询未结算的开票信息
+     * 批量查询未结算的结算信息
      */
-    private Map<String, InsPlyIncomeInvoice> batchQueryInvoice(Set<String> invoiceIdSet) {
+    private Map<String, BigDecimal> batchQueryInvoice(Set<String> invoiceIdSet) {
+        Map<String, BigDecimal> resultMap = new HashMap<>(0);
         if (CollUtil.isEmpty(invoiceIdSet)) {
-            return new HashMap<>(0);
+            return resultMap;
         }
+
+        // 1、查询有效发票主记录 status = "0"
         LambdaQueryWrapper<InsPlyIncomeInvoice> wrapper = new LambdaQueryWrapper<>();
         wrapper.in(InsPlyIncomeInvoice::getId, invoiceIdSet);
         wrapper.eq(InsPlyIncomeInvoice::getStatus, "0");
-        List<InsPlyIncomeInvoice> insPlyIncomeInvoices = insPlyIncomeInvoiceMapper.selectList(wrapper);
-        return insPlyIncomeInvoices.stream()
-                .collect(Collectors.toMap(InsPlyIncomeInvoice::getId, Function.identity(), (k1, k2) -> k1));
+        List<InsPlyIncomeInvoice> invoiceList = insPlyIncomeInvoiceMapper.selectList(wrapper);
+        if (CollUtil.isEmpty(invoiceList)) {
+            return resultMap;
+        }
+
+        // 取出有效发票id集合
+        Set<String> validInvoiceIds = invoiceList.stream()
+                .map(InsPlyIncomeInvoice::getId)
+                .collect(Collectors.toSet());
+
+        // 2、批量查询所有对应的结算明细
+        LambdaQueryWrapper<InsPlyIncomeInvoiceSettlement> settleWrapper = new LambdaQueryWrapper<>();
+        settleWrapper.in(InsPlyIncomeInvoiceSettlement::getInvoiceId, validInvoiceIds);
+        List<InsPlyIncomeInvoiceSettlement> settlementList = insPlyIncomeInvoiceSettlementMapper.selectList(settleWrapper);
+
+        // 3、按invoiceId分组,累加 actualReceivedAmount
+        Map<String, BigDecimal> sumSettleMap = settlementList.stream()
+                .collect(Collectors.groupingBy(
+                        InsPlyIncomeInvoiceSettlement::getInvoiceId,
+                        Collectors.reducing(
+                                BigDecimal.ZERO,
+                                InsPlyIncomeInvoiceSettlement::getActualReceivedAmount,
+                                BigDecimal::add
+                        )
+                ));
+
+        // 4、应收监管保费 - 已实收总额
+        for (InsPlyIncomeInvoice invoice : invoiceList) {
+            String invoiceId = invoice.getId();
+            BigDecimal receivablePremium = invoice.getReceivableSupervisePremium() == null
+                    ? BigDecimal.ZERO
+                    : invoice.getReceivableSupervisePremium();
+            BigDecimal sumActual = sumSettleMap.getOrDefault(invoiceId, BigDecimal.ZERO);
+            BigDecimal surplus = receivablePremium.subtract(sumActual);
+            resultMap.put(invoiceId, surplus);
+        }
+
+        return resultMap;
     }
 
     /**
@@ -1806,6 +1843,10 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Transactional
     public InvoiceingResult addInvoicing(InsPlyIncomeInvoiceVO invoicingVo) {
         log.info("开票:invoicingVo=[{}]", JSONUtil.toJsonStr(invoicingVo));
+        // add by lipf, 如果是保司开票, 设置发票号为空
+        if("2".equals(invoicingVo.getInvoiceType())){
+            invoicingVo.setInvoiceNo(null);
+        }
         try {
             this.valide4Invoicing(invoicingVo);
             InvoiceingResult result = new InvoiceingResult();
@@ -5115,6 +5156,16 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public Page<ExportSuperviseSettlementExcelDto> platformSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) {
         log.info("查询平台结算记录:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
+
+        if(StrUtil.isEmpty(settlementQueryVo.getSettlementDateStart())
+            && StrUtil.isEmpty(settlementQueryVo.getSettlementDateEnd())
+            && settlementQueryVo.getSettlementTime() != null &&
+                settlementQueryVo.getSettlementTime().length ==2){
+            DateUtil.parse(settlementQueryVo.getSettlementDateStart());
+            settlementQueryVo.setSettlementDateStart(DateUtil.format(LocalDate.parse(settlementQueryVo.getSettlementTime()[0], DateTimeFormatter.ISO_DATE).atStartOfDay(), "yyyy-MM-dd HH:mm:ss"));
+            settlementQueryVo.setSettlementDateEnd(DateUtil.format(LocalDate.parse(settlementQueryVo.getSettlementTime()[1], DateTimeFormatter.ISO_DATE).plusDays(1).atStartOfDay(), "yyyy-MM-dd HH:mm:ss"));
+        }
+
         // 设置空条件
         setNoneCondition(settlementQueryVo);
         settlementQueryVo.setSystemCode(baseController.getSystemCode());