Pārlūkot izejas kodu

Merge branch 'master' into wrq_dev

wangrq 2 mēneši atpakaļ
vecāks
revīzija
4857f8d36d
35 mainītis faili ar 1439 papildinājumiem un 56 dzēšanām
  1. 4 0
      commons/src/main/java/com/jzg/commons/entity/dto/GenerateQrcodeParam.java
  2. 5 0
      commons/src/main/java/com/jzg/commons/entity/quote/vo/AccidentalDrivingVo.java
  3. 4 6
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeSaveVo.java
  4. 11 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/SchemeResultVo.java
  5. 19 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  6. 38 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java
  7. 4 3
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/constant/enums/RequestUrl.java
  8. 9 4
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenBcDTO.java
  9. 12 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenPrpTmainDTO.java
  10. 2 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerCalculationPremiumRequest.java
  11. 684 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerCreateOrderRequest.java
  12. 16 4
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerProposalNoSaveRequest.java
  13. 139 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerQueryQuotationRequest.java
  14. 6 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerBaseResponse.java
  15. 20 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerCreateOrderCheckData.java
  16. 20 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerCreateOrderDataData.java
  17. 91 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerQueryQuotationData.java
  18. 2 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/GuoRenCrawlerOrderService.java
  19. 2 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerOrderServiceImpl.java
  20. 1 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  21. 61 6
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java
  22. 20 15
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java
  23. 27 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/AuditVerificationAspect.java
  24. 22 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  25. 32 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/client/LocalLivingClient.java
  26. 48 6
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/RightsGrantController.java
  27. 3 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/UnifyOrderManager.java
  28. 17 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelProductInfoQueryDTO.java
  29. 29 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsCategoryDto.java
  30. 17 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelCategoryVo.java
  31. 41 0
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelProductInfoVo.java
  32. 4 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/interceptor/LiveServiceTokenInterceptor.java
  33. 5 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  34. 9 1
      tenant/organization/src/main/resources/mapper/PtlSchemeMapper.xml
  35. 15 0
      tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/dto/GenerateQrcodeParam.java

@@ -16,5 +16,9 @@ public class GenerateQrcodeParam {
      */
     private String query;
 
+    private String phone;
+
+    private String number;
+
 
 }

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

@@ -46,6 +46,11 @@ public class AccidentalDrivingVo implements Serializable {
      */
     @Schema(description = "父产品编码")
     private String parentProductCode;
+    /**
+     * 父产品编码
+     */
+    @Schema(description = "父产品名称")
+    private String parentProductName;
     /**
      * 产品名称
      */

+ 4 - 6
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlSchemeSaveVo.java

@@ -5,20 +5,15 @@ import com.jzg.commons.constants.ProductsType;
 import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttr;
 import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesDictLabal;
 import com.jzg.commons.entity.scheme.po.*;
-import com.jzg.commons.entity.vo.AgreementRulesVo;
 import com.jzg.commons.exception.ValidateException;
 import com.jzg.commons.util.idgen.IdGenerate;
 import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.Valid;
-import jakarta.validation.constraints.Max;
 import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
 import lombok.AllArgsConstructor;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.hibernate.validator.constraints.Length;
-import org.springframework.beans.BeanUtils;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -77,6 +72,9 @@ public class PtlSchemeSaveVo {
         @Schema(description = "驾意险列表")
         private List<PtlSchemeInsuranceDrivingIntention> drivingIntentionList  = new ArrayList<>();
 
+        @Schema(description = "驾意险列表")
+        private List<PtlSchemeInsuranceDrivingIntention> drivingList  = new ArrayList<>();
+
     }
 
     public PtlSchemeSaveVo(PtlScheme ptlScheme,PtlSchemeInfo ptlSchemeInfo,
@@ -278,7 +276,7 @@ public class PtlSchemeSaveVo {
     public List<PtlSchemeInsuranceDrivingIntention> getPtlSchemeInsuranceDrivingIntentionList(){
         List<PtlSchemeInsuranceDrivingIntention> ptlSchemeInsuranceDrivingIntentionList = new ArrayList<>();
         for (Scheme scheme : schemeList) {
-            scheme.drivingIntentionList.forEach(drivingIntention -> {
+            scheme.getDrivingList().forEach(drivingIntention -> {
                 PtlSchemeInsuranceDrivingIntention ptlSchemeInsuranceDrivingIntention = new PtlSchemeInsuranceDrivingIntention();
                 ptlSchemeInsuranceDrivingIntention.setId(IdGenerate.nextId());
                 ptlSchemeInsuranceDrivingIntention.setSchemeInfoId(scheme.getId());

+ 11 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/SchemeResultVo.java

@@ -97,8 +97,19 @@ public class SchemeResultVo {
         private String productCode;
         private String riskCode;
         private String parentProductCode;
+        private String parentProductName;
+
+        /**
+         * 产品分类编码
+         */
+        private String productCategoryCode;
+        /**
+         * 产品分类编码
+         */
+        private String productCategoryName;
         private String alias;
         private String coverage;
+        private String sumAmount;
         private String premium;
         private String quantity;
         private String selectedStatus;

+ 19 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java

@@ -22,6 +22,7 @@ import org.springframework.stereotype.Component;
 import org.springframework.util.MultiValueMap;
 import org.springframework.web.reactive.function.BodyInserters;
 import org.springframework.web.reactive.function.client.WebClient;
+import org.springframework.web.reactive.function.client.WebClientRequestException;
 import org.springframework.web.reactive.function.client.WebClientResponseException;
 import reactor.core.publisher.Flux;
 import reactor.core.publisher.Mono;
@@ -299,6 +300,15 @@ public class RequestComponent {
                                 null
                         )
                 )
+                .onErrorMap(WebClientRequestException.class, ex ->
+                        new WebClientResponseException(
+                                502,
+                                "第三方接口请求失败(DNS解析失败或连接异常):" + url + ",原因:" + ex.getMessage(),
+                                HttpHeaders.EMPTY,
+                                null,
+                                null
+                        )
+                )
                 .block();
     }
 
@@ -418,6 +428,15 @@ public class RequestComponent {
                                     null
                             )
                     )
+                    .onErrorMap(WebClientRequestException.class, ex ->
+                            new WebClientResponseException(
+                                    502,
+                                    "第三方接口请求失败(DNS解析失败或连接异常):" + url + ",原因:" + ex.getMessage(),
+                                    HttpHeaders.EMPTY,
+                                    null,
+                                    null
+                            )
+                    )
                     .block();
             if (rawResponse == null) {
                 throw new WebClientResponseException(

+ 38 - 2
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerRequestComponent.java

@@ -316,6 +316,42 @@ public class GuoRenCrawlerRequestComponent {
         return request;
     }
 
+    /**
+     * 驾意险查询
+     *
+     * @param queryQuotationRequest 驾意险查询请求
+     * @param httpHeaders           请求头
+     * @return 查询响应
+     */
+    public GuoRenCrawlerBaseResponse<GuoRenCrawlerQueryQuotationData> queryQuotation(GuoRenCrawlerQueryQuotationRequest queryQuotationRequest, HttpHeaders httpHeaders) {
+        return request(RequestUrl.QUERY_QUOTATION, queryQuotationRequest, new ParameterizedTypeReference<>() {
+        }, httpHeaders);
+    }
+
+    /**
+     * 驾意险校验
+     *
+     * @param createOrderRequest 驾意险校验请求
+     * @param httpHeaders        请求头
+     * @return 校验响应
+     */
+    public GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderCheckData> createOrderCheck(GuoRenCrawlerCreateOrderRequest createOrderRequest, HttpHeaders httpHeaders) {
+        return request(RequestUrl.CREATE_ORDER_CHECK, createOrderRequest, new ParameterizedTypeReference<>() {
+        }, httpHeaders);
+    }
+
+    /**
+     * 驾意险投保
+     *
+     * @param createOrderRequest 驾意险投保请求
+     * @param httpHeaders        请求头
+     * @return 投保响应
+     */
+    public GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderDataData> createOrderData(GuoRenCrawlerCreateOrderRequest createOrderRequest, HttpHeaders httpHeaders) {
+        return request(RequestUrl.CREATE_ORDER_DATA, createOrderRequest, new ParameterizedTypeReference<>() {
+        }, httpHeaders);
+    }
+
     /**
      *
      * 保存投保单
@@ -325,8 +361,8 @@ public class GuoRenCrawlerRequestComponent {
      * @param httpHeaders               请求头
      * @return 投保单号
      */
-    public GuoRenCrawlerProposalNoSaveData proposalNoSave(QuoteVo quoteVo, GuoRenCrawlerCalculationPremiumRequest calculationPremiumRequest, GuoRenCrawlerCalculationPremiumData calculationPremium, HttpHeaders httpHeaders) {
-        GuoRenCrawlerProposalNoSaveRequest guoRenCrawlerProposalNoSaveRequest = new GuoRenCrawlerProposalNoSaveRequest(quoteVo, calculationPremium, calculationPremiumRequest);
+    public GuoRenCrawlerProposalNoSaveData proposalNoSave(QuoteVo quoteVo, GuoRenCrawlerCalculationPremiumRequest calculationPremiumRequest, GuoRenCrawlerCalculationPremiumData calculationPremium,  GuoRenCrawlerCreateOrderRequest createOrderRequest,HttpHeaders httpHeaders) {
+        GuoRenCrawlerProposalNoSaveRequest guoRenCrawlerProposalNoSaveRequest = new GuoRenCrawlerProposalNoSaveRequest(quoteVo, calculationPremium, calculationPremiumRequest, createOrderRequest);
         GuoRenCrawlerBaseResponse<GuoRenCrawlerProposalNoSaveData> request = request(RequestUrl.PROPOSAL_NO_SAVE, guoRenCrawlerProposalNoSaveRequest, new ParameterizedTypeReference<>() {
         }, httpHeaders);
         if (request.getResultCode() != 0) {

+ 4 - 3
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/constant/enums/RequestUrl.java

@@ -27,6 +27,9 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
 
     CALCULATION_PREMIUM("/api/grecar/ecar/calculationPremium", "保费计算"),
     WRITE_BACK_ADDRESS("/api/grecar/areas/writeBackAddress", "回写地址"),
+    QUERY_QUOTATION("/ecar/newSystem/adaptQuery/queryQuotation", "驾意险查询"),
+    CREATE_ORDER_CHECK("/ecar/newSystem/adaptInsure/createOrderCheck", "驾意险校验"),
+    CREATE_ORDER_DATA("/ecar/newSystem/adaptInsure/createOrderData", "驾意险投保"),
     PROPOSAL_NO_SAVE("/api/grecar/ecar/proposalNoSave", "保存投保单号"),
     UPLOAD("/api/grecar/photo/upload", "上传影像"),
     SUBMIT_UNDERWRITE("/api/grecar/ecar/submitUnderwrite", "提交核保"),
@@ -38,9 +41,7 @@ public enum RequestUrl implements CrawlerRequestUrlStandard {
 
     TRANS_CODE_ELE_POLICY_NO("/api/grecar/print/transCodeElePolicyNo", "查询下载电子保单的编码"),
     GET_ELE_POLICY_FOR_GRECAR("/api/grsavecarcore/savecarcore/getElePolicyForGrecar?certiNo=%s&activityplan=jsb&operatorCode=%s&comCode=%s&token=%s", "下载保单"),
-    GET_ELE_POLICY_FLAG_FOR_GRECAR("/api/grsavecarcore/savecarcore/getElePolicyFlagForGrecar?certiNo=%s&activityplan=jsb&operatorCode=%s&comCode=%s&token=%s", "下载电子标志"),
-
-    ;
+    GET_ELE_POLICY_FLAG_FOR_GRECAR("/api/grsavecarcore/savecarcore/getElePolicyFlagForGrecar?certiNo=%s&activityplan=jsb&operatorCode=%s&comCode=%s&token=%s", "下载电子标志");
 
 
     private final String uri;

+ 9 - 4
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenBcDTO.java

@@ -1,9 +1,10 @@
 package com.jzg.quotation.guoren.crawler.entity.dto;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
-import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerCalculationPremiumRequest;
+import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerCreateOrderRequest;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerWriteBackAddressData;
 import lombok.Data;
 import lombok.NoArgsConstructor;
@@ -35,6 +36,9 @@ public class GuoRenBcDTO {
     @JsonProperty("prpTengiNeerList")
     private List<GuoRenBcDTO.PrpTengiNeerListDTO> prpTengiNeerList;
 
+    @JsonProperty("orderMainList")
+    private List<GuoRenCrawlerCreateOrderRequest.OrderMainDTO> orderMainList;
+
     @JsonProperty("ocrOrder")
     private GuoRenOcrOrderDTO ocrOrder;
 
@@ -73,19 +77,20 @@ public class GuoRenBcDTO {
         this.riskCode = "0500";
         // 添加非车险信息
         if (quoteVo.getAccidentalDrivings().size() > 0) {
-            String noCarCodes = quoteVo.getAccidentalDrivings().get(0).getProductCode();
+            AccidentalDrivingVo accidentalDriving = quoteVo.getAccidentalDrivings().get(0);
+            String noCarCodes =accidentalDriving.getProductCode();
             Integer noCarFlag = 1;
-            String premiumStr = quoteVo.getAccidentalDrivings().get(0).getPremium();
+            String premiumStr = accidentalDriving.getPremium();
             Integer noCarPremium = premiumStr != null ? (int) Double.parseDouble(premiumStr) : 0;
             prpTmainDTO.setNoCarCodes(noCarCodes);
             prpTmainDTO.setNoCarFlag(noCarFlag);
             prpTmainDTO.setNoCarPremium(noCarPremium);
         }
+        this.prpTengiNeerList = List.of(new PrpTengiNeerListDTO());
         this.prpTmain = prpTmainDTO;
         this.prpTitemCar = prpTitemCar;
         this.prpTinsured = new GuoRenPrpTinsuredDTO(policyHolderInfo, insuredPersonInfo, policyHolderAddr, insuredPersonAddr, quoteVo.getOwnersInfo().getBirthday(), prpTitemCar);
         this.prpDcarModel = new PrpDcarModelDTO();
-        this.prpTengiNeerList = List.of(new PrpTengiNeerListDTO());
         this.ocrOrder = new GuoRenOcrOrderDTO(policyHolderInfo, insuredPersonInfo, prpTitemCar);
         this.agriFlagBC = "0";
         this.insuredTypeTmp = insuredTypeTmp;

+ 12 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenPrpTmainDTO.java

@@ -181,6 +181,18 @@ public class GuoRenPrpTmainDTO  {
     @JsonProperty("startDateFlag0530")
     private Integer startDateFlag0530;
 
+    @JsonProperty("noCarFlag")
+    private Integer noCarFlag;
+
+    @JsonProperty("noCarCodes")
+    private String noCarCodes;
+
+    @JsonProperty("noCarPremium")
+    private Integer noCarPremium;
+
+    @JsonProperty("orderFlag")
+    private String orderFlag;
+
     @JsonProperty("answer")
     private String answer;
 

+ 2 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerCalculationPremiumRequest.java

@@ -363,5 +363,7 @@ public class GuoRenCrawlerCalculationPremiumRequest {
             return kindInfoVo.stream().map(x -> new PrptitemkindListDTO(x, prpTmain)).toList();
         }
 
+
+
     }
 }

+ 684 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerCreateOrderRequest.java

@@ -0,0 +1,684 @@
+package com.jzg.quotation.guoren.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
+import com.jzg.commons.entity.quote.vo.CarInfoVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTinsuredDTO;
+import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
+import com.jzg.quotation.guoren.crawler.entity.dto.PrpTMainDTO;
+import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerQueryQuotationData;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @description: 【国任财险】 驾意险校验&投保 请求
+ * @date 2026/07/08
+ */
+@Data
+@NoArgsConstructor
+public class GuoRenCrawlerCreateOrderRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2875693012345678901L;
+
+    @JsonProperty("channelCode")
+    private String channelCode;
+
+    @JsonProperty("data")
+    private DataDTO data;
+
+    @JsonProperty("othBusinessNo")
+    private String othBusinessNo;
+
+    @JsonProperty("requestTime")
+    private String requestTime;
+
+    @JsonProperty("orderCode")
+    private String orderCode;
+
+    public GuoRenCrawlerCreateOrderRequest(QuoteVo quoteVo,
+                                           GuoRenCrawlerCalculationPremiumRequest calculationPremiumRequest,
+                                           List<GuoRenCrawlerQueryQuotationData.LiabDTO> queryLiabList) {
+        String ordersNo = quoteVo.getOrder().getOrdersNo();
+        AccidentalDrivingVo accidentalDriving = quoteVo.getAccidentalDrivings().get(0);
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
+        CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();
+        CarInfoVo carInfoVo = quoteVo.getCarInfoVo();
+
+        PrpTMainDTO prpTMain = calculationPremiumRequest.getBc().getPrpTmain();
+        GuoRenPrpTitemCarDTO prpTitemCar = calculationPremiumRequest.getBc().getPrpTitemCar();
+        GuoRenPrpTinsuredDTO prpTinsured = calculationPremiumRequest.getBc().getPrpTinsured();
+
+        this.channelCode = "RBT";
+        this.othBusinessNo = ordersNo;
+        this.requestTime = TimeProcessing.nowDate();
+
+        // 构建 Data
+        DataDTO dataDTO = new DataDTO();
+
+        // 构建 OrderList
+        OrderListDTO orderListDTO = new OrderListDTO();
+
+        // ----- orderMain -----
+        OrderMainDTO orderMain = new OrderMainDTO();
+        orderMain.setOthOrderNo(ordersNo);
+        // 根据查询结果计算保额和保费(liabAmount/renewalInd相加)
+        orderMain.setAmount(calculateAmountFromLiabList(queryLiabList));
+        orderMain.setPremium(calculatePremiumFromLiabList(queryLiabList));
+        orderMain.setProdCode(accidentalDriving.getProductCode());
+        orderMain.setProdName(accidentalDriving.getProductName());
+        // goodsCode 根据产品编码推导:将 productCode 后3位替换为45001001格式
+        orderMain.setGoodsCode(accidentalDriving.getParentProductCode());
+        orderMain.setGoodsName(accidentalDriving.getParentProductName());
+        orderMain.setRiskCode(Collections.singletonList(accidentalDriving.getRiskCode()));
+        // 使用交强险起止日期
+        orderMain.setStartDate(quoteVo.getCiRiskInfoVo() != null
+                ? TimeProcessing.dateTimeToDate(quoteVo.getCiRiskInfoVo().getStartDate()) + " 00:00:00"
+                : TimeProcessing.nowDate() + " 00:00:00");
+        orderMain.setEndDate(quoteVo.getCiRiskInfoVo() != null
+                ? TimeProcessing.dateTimeToDate(quoteVo.getCiRiskInfoVo().getEndDate()) + " 23:59:59"
+                : TimeProcessing.plusDays(TimeProcessing.nowDate(), 365) + " 23:59:59");
+        orderMain.setAgentCode(prpTMain.getAgentCode());
+        orderMain.setOperatorCode(prpTMain.getOperatorCode());
+        orderMain.setCompanyCode(prpTMain.getComCode());
+        orderMain.setIssueCompany(prpTMain.getComCode());
+        orderMain.setClassifyCode("A");
+        orderMain.setBusinessMode("6");
+        orderMain.setBusinessSource("2");
+        orderMain.setUwCount(1);
+        orderMain.setRenewalInd(0);
+        orderMain.setChannelTip(" ");
+        orderMain.setRenewalPolicyNo("");
+        orderMain.setTestFlag("");
+        orderMain.setObjAddressListFlag(Collections.emptyMap());
+        orderMain.setOtherFields(Collections.emptyMap());
+        // ----- liabList(从驾意险查询结果构建) -----
+        List<OrderMainDTO.LiabListDTO> liabList = buildLiabList(queryLiabList);
+        orderMain.setLiabList(liabList);
+
+        // ----- insuredList -----
+        InsuredListDTO insuredListDTO = new InsuredListDTO();
+        insuredListDTO.setInsuredName(insuredPersonInfo.getName());
+        insuredListDTO.setCertfType(insuredPersonInfo.getDocumentsTypeCode() != null
+                ? insuredPersonInfo.getDocumentsTypeCode() : "01");
+        insuredListDTO.setCertfNo(insuredPersonInfo.getIdentifyNumber());
+        insuredListDTO.setBirthDate(insuredPersonInfo.getBirthday());
+        insuredListDTO.setAge(insuredPersonInfo.getAge() != null
+                ? String.valueOf(insuredPersonInfo.getAge()) : "");
+        insuredListDTO.setSex(insuredPersonInfo.getGender());
+        insuredListDTO.setPhoneNo(insuredPersonInfo.getMobile());
+        insuredListDTO.setContactName(insuredPersonInfo.getName());
+        insuredListDTO.setContactMobile(null);
+        insuredListDTO.setInsuredType("1");
+        insuredListDTO.setCertiStartDate(insuredPersonInfo.getIdentifyValidDate());
+        insuredListDTO.setCertiEndDate("");
+        insuredListDTO.setCertiValidity("4");
+        insuredListDTO.setCountryCode("156");
+        insuredListDTO.setCountryName("中国");
+        insuredListDTO.setCustomerRelations("01");
+        insuredListDTO.setAddrProvince(insuredPersonInfo.getProvince());
+        insuredListDTO.setAddrCity(insuredPersonInfo.getCity());
+        insuredListDTO.setAddrCounty(insuredPersonInfo.getCounty() != null
+                ? insuredPersonInfo.getCounty() : "");
+        insuredListDTO.setAddrStreet("");
+        insuredListDTO.setFullAddr(insuredPersonInfo.getAddr());
+        insuredListDTO.setPostCode(insuredPersonInfo.getPostCode() != null
+                ? insuredPersonInfo.getPostCode() : "");
+        insuredListDTO.setPlanNo("1");
+        insuredListDTO.setOccupationGrade("");
+        insuredListDTO.setEducation("");
+        insuredListDTO.setCompanyNature("");
+        insuredListDTO.setShareholdingRatio("");
+        insuredListDTO.setSocialSecInd("");
+        insuredListDTO.setSocialSecNo("");
+
+        // ----- objCarList -----
+        ObjCarListDTO objCarListDTO = new ObjCarListDTO();
+        objCarListDTO.setLicenseNo(prpTitemCar.getLicenseNo());
+        objCarListDTO.setCarCode(prpTitemCar.getLicenseNo());
+        objCarListDTO.setFrameNo(prpTitemCar.getFrameNo());
+        objCarListDTO.setEngineNo(prpTitemCar.getEngineNo());
+        objCarListDTO.setCarModels(prpTitemCar.getModelName());
+        objCarListDTO.setSeatNum(prpTitemCar.getSeatCount());
+        objCarListDTO.setPurchasePrice(prpTitemCar.getPurchasePrice() != null
+                ? prpTitemCar.getPurchasePrice() : "0");
+        objCarListDTO.setCarType(carInfoVo.getCarTypeCode());
+        objCarListDTO.setCarTypeCode("8A");
+        objCarListDTO.setCarTypeName("家庭自用");
+        objCarListDTO.setCarColor(prpTitemCar.getColorCode() != null
+                ? prpTitemCar.getColorCode() : "");
+        objCarListDTO.setDriverName(quoteVo.getPolicyHolderInfo().getName());
+        objCarListDTO.setPlanNo("1");
+        objCarListDTO.setToncount("0.0");
+        objCarListDTO.setCarCategory("A");
+        objCarListDTO.setCompanyName("");
+        objCarListDTO.setCurPassNo("");
+        objCarListDTO.setDeductionVoucherNo("");
+        objCarListDTO.setDeviceNo("");
+        objCarListDTO.setEndLine("");
+        objCarListDTO.setEntryDate("");
+        objCarListDTO.setEntryStationName("");
+        objCarListDTO.setEtcNo("");
+        objCarListDTO.setExitDate("");
+        objCarListDTO.setExitStationName("");
+        objCarListDTO.setLeftImgUrl("");
+        objCarListDTO.setPaymentWaitingPeriod("");
+        objCarListDTO.setPlateNumberUrl("");
+        objCarListDTO.setPossessNature("");
+        objCarListDTO.setProAgreementDate("");
+        objCarListDTO.setProInsureNo("");
+        objCarListDTO.setRightImgUrl("");
+        objCarListDTO.setStartingLine("");
+
+        // ----- orderAppl -----
+        OrderApplDTO orderAppl = new OrderApplDTO();
+        orderAppl.setApplName(policyHolderInfo.getName());
+        orderAppl.setApplType("1");
+        orderAppl.setCertfType(policyHolderInfo.getDocumentsTypeCode() != null
+                ? policyHolderInfo.getDocumentsTypeCode() : "01");
+        orderAppl.setCertfNo(policyHolderInfo.getIdentifyNumber());
+        orderAppl.setBirthDate(policyHolderInfo.getBirthday());
+        orderAppl.setAge(policyHolderInfo.getAge() != null
+                ? String.valueOf(policyHolderInfo.getAge()) : "");
+        orderAppl.setSex(policyHolderInfo.getGender());
+        orderAppl.setPhoneNo(policyHolderInfo.getMobile());
+        orderAppl.setContactName(policyHolderInfo.getName());
+        orderAppl.setContactMobile(null);
+        orderAppl.setCertiStartDate(policyHolderInfo.getIdentifyValidDate());
+        orderAppl.setCertiEndDate("");
+        orderAppl.setCertiValidity("4");
+        orderAppl.setCountryCode("156");
+        orderAppl.setCountryName("中国");
+        orderAppl.setAddrProvince(policyHolderInfo.getProvince());
+        orderAppl.setAddrCity(policyHolderInfo.getCity());
+        orderAppl.setAddrCounty(policyHolderInfo.getCounty() != null
+                ? policyHolderInfo.getCounty() : "");
+        orderAppl.setAddrStreet("");
+        orderAppl.setFullAddr(policyHolderInfo.getAddr());
+        orderAppl.setPostCode(policyHolderInfo.getPostCode() != null
+                ? policyHolderInfo.getPostCode() : "");
+        orderAppl.setCompanyNature("");
+
+        // ----- planList -----
+        PlanListDTO planListDTO = new PlanListDTO();
+        planListDTO.setPlanNo("1");
+        planListDTO.setQuantity(String.valueOf(accidentalDriving.getQuantity()));
+        planListDTO.setOccupationCode("0500020");
+        planListDTO.setOccupationName("其他");
+        planListDTO.setOccupationCategory("05");
+        planListDTO.setOccupationGrade("1");
+        planListDTO.setOccupationType("0500");
+        planListDTO.setSocialSecInd("01");
+        planListDTO.setAcrGrading("LuminalA");
+        planListDTO.setHealthManagement("02");
+        planListDTO.setMedicalIdeaSer("01");
+
+        // ----- salesmanList -----
+        SalesmanListDTO salesmanListDTO = new SalesmanListDTO();
+        salesmanListDTO.setSerialNo(1);
+        salesmanListDTO.setAgentCode(prpTMain.getAgentCode());
+        salesmanListDTO.setAgentCnrtNo(prpTMain.getAgreementNo() != null
+                ? prpTMain.getAgreementNo() : "");
+        salesmanListDTO.setCompanyCode(prpTMain.getComCode());
+        salesmanListDTO.setSalesmanCode(prpTMain.getHandler1Code() != null
+                ? prpTMain.getHandler1Code() : "");
+        salesmanListDTO.setSalesmanName(prpTMain.getHandler1Name() != null
+                ? prpTMain.getHandler1Name() : "");
+        salesmanListDTO.setSalesmanFlag(1);
+        salesmanListDTO.setAgentCertfNo("");
+        salesmanListDTO.setAgentEmpNo("");
+        salesmanListDTO.setAgentMode("");
+        salesmanListDTO.setAgentName("");
+        salesmanListDTO.setAgentPracticeNo("");
+        salesmanListDTO.setAgentSalesmanName("");
+        salesmanListDTO.setCooperative("");
+        salesmanListDTO.setProjectCode("");
+        salesmanListDTO.setProjectFlag("0");
+        salesmanListDTO.setProjectName("");
+        salesmanListDTO.setReferenceCode("");
+        salesmanListDTO.setReferenceName("");
+        salesmanListDTO.setReferencePhone("");
+
+        // 组装
+        orderListDTO.setInsuredList(Collections.singletonList(insuredListDTO));
+        orderListDTO.setObjCarList(Collections.singletonList(objCarListDTO));
+        orderListDTO.setOrderAppl(orderAppl);
+        orderListDTO.setOrderMain(orderMain);
+        orderListDTO.setPlanList(Collections.singletonList(planListDTO));
+        orderListDTO.setSalesmanList(Collections.singletonList(salesmanListDTO));
+
+        dataDTO.setOrderList(Collections.singletonList(orderListDTO));
+        this.data = dataDTO;
+    }
+
+    /**
+     * 根据产品编码推导商品编码
+     * 例如: 02746069001 → 02746045001001
+     */
+    private String deriveGoodsCode(String productCode) {
+        if (productCode == null || productCode.length() < 11) {
+            return productCode;
+        }
+        // 取前6位 + "45001" + 原后3位
+        return productCode.substring(0, 6) + "45001" + productCode.substring(8);
+    }
+
+    private int parseIntSafely(String value) {
+        if (value == null || value.isEmpty()) {
+            return 0;
+        }
+        try {
+            return (int) Double.parseDouble(value);
+        } catch (NumberFormatException e) {
+            return 0;
+        }
+    }
+
+    /**
+     * 从查询结果liabList计算保额(所有liabAmount相加)
+     */
+    private int calculateAmountFromLiabList(List<GuoRenCrawlerQueryQuotationData.LiabDTO> queryLiabList) {
+        if (queryLiabList == null || queryLiabList.isEmpty()) {
+            return 0;
+        }
+        BigDecimal total = BigDecimal.ZERO;
+        for (GuoRenCrawlerQueryQuotationData.LiabDTO liab : queryLiabList) {
+            if (liab.getLiabAmount() != null) {
+                total = total.add(liab.getLiabAmount());
+            }
+        }
+        return total.intValue();
+    }
+
+    /**
+     * 从查询结果liabList计算总保费(所有liabPremium相加)
+     */
+    private int calculatePremiumFromLiabList(List<GuoRenCrawlerQueryQuotationData.LiabDTO> queryLiabList) {
+        if (queryLiabList == null || queryLiabList.isEmpty()) {
+            return 0;
+        }
+        BigDecimal total = BigDecimal.ZERO;
+        for (GuoRenCrawlerQueryQuotationData.LiabDTO liab : queryLiabList) {
+            if (liab.getLiabPremium() != null) {
+                total = total.add(liab.getLiabPremium());
+            }
+        }
+        return total.intValue();
+    }
+
+    /**
+     * 从查询结果liabList构建请求用的LiabListDTO
+     */
+    private List<OrderMainDTO.LiabListDTO> buildLiabList(List<GuoRenCrawlerQueryQuotationData.LiabDTO> queryLiabList) {
+        List<OrderMainDTO.LiabListDTO> liabList = new ArrayList<>();
+        if (queryLiabList == null || queryLiabList.isEmpty()) {
+            return liabList;
+        }
+        for (GuoRenCrawlerQueryQuotationData.LiabDTO liab : queryLiabList) {
+            liabList.add(new OrderMainDTO.LiabListDTO(liab.getLiabName(), "Y"));
+        }
+        return liabList;
+    }
+
+    // ==================== 内部 DTO ====================
+
+    @Data
+    @NoArgsConstructor
+    public static class DataDTO {
+        @JsonProperty("orderList")
+        private List<OrderListDTO> orderList;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class OrderListDTO {
+        @JsonProperty("insuredList")
+        private List<InsuredListDTO> insuredList;
+
+        @JsonProperty("objCarList")
+        private List<ObjCarListDTO> objCarList;
+
+        @JsonProperty("orderAppl")
+        private OrderApplDTO orderAppl;
+
+        @JsonProperty("orderMain")
+        private OrderMainDTO orderMain;
+
+        @JsonProperty("planList")
+        private List<PlanListDTO> planList;
+
+        @JsonProperty("salesmanList")
+        private List<SalesmanListDTO> salesmanList;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class OrderMainDTO {
+        @JsonProperty("othOrderNo")
+        private String othOrderNo;
+        @JsonProperty("amount")
+        private Integer amount;
+        @JsonProperty("premium")
+        private Integer premium;
+        @JsonProperty("prodCode")
+        private String prodCode;
+        @JsonProperty("prodName")
+        private String prodName;
+        @JsonProperty("goodsCode")
+        private String goodsCode;
+        @JsonProperty("goodsName")
+        private String goodsName;
+        @JsonProperty("riskCode")
+        private List<String> riskCode;
+        @JsonProperty("startDate")
+        private String startDate;
+        @JsonProperty("endDate")
+        private String endDate;
+        @JsonProperty("agentCode")
+        private String agentCode;
+        @JsonProperty("operatorCode")
+        private String operatorCode;
+        @JsonProperty("companyCode")
+        private String companyCode;
+        @JsonProperty("issueCompany")
+        private String issueCompany;
+        @JsonProperty("classifyCode")
+        private String classifyCode;
+        @JsonProperty("businessMode")
+        private String businessMode;
+        @JsonProperty("businessSource")
+        private String businessSource;
+        @JsonProperty("uwCount")
+        private Integer uwCount;
+        @JsonProperty("renewalInd")
+        private Integer renewalInd;
+        @JsonProperty("channelTip")
+        private String channelTip;
+        @JsonProperty("renewalPolicyNo")
+        private String renewalPolicyNo;
+        @JsonProperty("testFlag")
+        private String testFlag;
+        @JsonProperty("objAddressListFlag")
+        private Object objAddressListFlag;
+        @JsonProperty("otherFields")
+        private Object otherFields;
+        @JsonProperty("liabList")
+        private List<LiabListDTO> liabList;
+
+        @Data
+        @NoArgsConstructor
+        @AllArgsConstructor
+        public static class LiabListDTO{
+            @JsonProperty("liabName")
+            private String liabName;
+            @JsonProperty("requiredLiab")
+            private String requiredLiab;
+        }
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class InsuredListDTO {
+        @JsonProperty("insuredName")
+        private String insuredName;
+        @JsonProperty("certfType")
+        private String certfType;
+        @JsonProperty("certfNo")
+        private String certfNo;
+        @JsonProperty("birthDate")
+        private String birthDate;
+        @JsonProperty("age")
+        private String age;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("phoneNo")
+        private String phoneNo;
+        @JsonProperty("contactName")
+        private String contactName;
+        @JsonProperty("contactMobile")
+        private String contactMobile;
+        @JsonProperty("insuredType")
+        private String insuredType;
+        @JsonProperty("certiStartDate")
+        private String certiStartDate;
+        @JsonProperty("certiEndDate")
+        private String certiEndDate;
+        @JsonProperty("certiValidity")
+        private String certiValidity;
+        @JsonProperty("countryCode")
+        private String countryCode;
+        @JsonProperty("countryName")
+        private String countryName;
+        @JsonProperty("customerRelations")
+        private String customerRelations;
+        @JsonProperty("addrProvince")
+        private String addrProvince;
+        @JsonProperty("addrCity")
+        private String addrCity;
+        @JsonProperty("addrCounty")
+        private String addrCounty;
+        @JsonProperty("addrStreet")
+        private String addrStreet;
+        @JsonProperty("fullAddr")
+        private String fullAddr;
+        @JsonProperty("postCode")
+        private String postCode;
+        @JsonProperty("planNo")
+        private String planNo;
+        @JsonProperty("occupationGrade")
+        private String occupationGrade;
+        @JsonProperty("education")
+        private String education;
+        @JsonProperty("companyNature")
+        private String companyNature;
+        @JsonProperty("shareholdingRatio")
+        private String shareholdingRatio;
+        @JsonProperty("socialSecInd")
+        private String socialSecInd;
+        @JsonProperty("socialSecNo")
+        private String socialSecNo;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class ObjCarListDTO {
+        @JsonProperty("licenseNo")
+        private String licenseNo;
+        @JsonProperty("carCode")
+        private String carCode;
+        @JsonProperty("frameNo")
+        private String frameNo;
+        @JsonProperty("engineNo")
+        private String engineNo;
+        @JsonProperty("carModels")
+        private String carModels;
+        @JsonProperty("seatNum")
+        private String seatNum;
+        @JsonProperty("purchasePrice")
+        private String purchasePrice;
+        @JsonProperty("carType")
+        private String carType;
+        @JsonProperty("carTypeCode")
+        private String carTypeCode;
+        @JsonProperty("carTypeName")
+        private String carTypeName;
+        @JsonProperty("carColor")
+        private String carColor;
+        @JsonProperty("driverName")
+        private String driverName;
+        @JsonProperty("planNo")
+        private String planNo;
+        @JsonProperty("toncount")
+        private String toncount;
+        @JsonProperty("carCategory")
+        private String carCategory;
+        @JsonProperty("companyName")
+        private String companyName;
+        @JsonProperty("curPassNo")
+        private String curPassNo;
+        @JsonProperty("deductionVoucherNo")
+        private String deductionVoucherNo;
+        @JsonProperty("deviceNo")
+        private String deviceNo;
+        @JsonProperty("endLine")
+        private String endLine;
+        @JsonProperty("entryDate")
+        private String entryDate;
+        @JsonProperty("entryStationName")
+        private String entryStationName;
+        @JsonProperty("etcNo")
+        private String etcNo;
+        @JsonProperty("exitDate")
+        private String exitDate;
+        @JsonProperty("exitStationName")
+        private String exitStationName;
+        @JsonProperty("leftImgUrl")
+        private String leftImgUrl;
+        @JsonProperty("paymentWaitingPeriod")
+        private String paymentWaitingPeriod;
+        @JsonProperty("plateNumberUrl")
+        private String plateNumberUrl;
+        @JsonProperty("possessNature")
+        private String possessNature;
+        @JsonProperty("proAgreementDate")
+        private String proAgreementDate;
+        @JsonProperty("proInsureNo")
+        private String proInsureNo;
+        @JsonProperty("rightImgUrl")
+        private String rightImgUrl;
+        @JsonProperty("startingLine")
+        private String startingLine;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class OrderApplDTO {
+        @JsonProperty("applName")
+        private String applName;
+        @JsonProperty("applType")
+        private String applType;
+        @JsonProperty("certfType")
+        private String certfType;
+        @JsonProperty("certfNo")
+        private String certfNo;
+        @JsonProperty("birthDate")
+        private String birthDate;
+        @JsonProperty("age")
+        private String age;
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("phoneNo")
+        private String phoneNo;
+        @JsonProperty("contactName")
+        private String contactName;
+        @JsonProperty("contactMobile")
+        private String contactMobile;
+        @JsonProperty("certiStartDate")
+        private String certiStartDate;
+        @JsonProperty("certiEndDate")
+        private String certiEndDate;
+        @JsonProperty("certiValidity")
+        private String certiValidity;
+        @JsonProperty("countryCode")
+        private String countryCode;
+        @JsonProperty("countryName")
+        private String countryName;
+        @JsonProperty("addrProvince")
+        private String addrProvince;
+        @JsonProperty("addrCity")
+        private String addrCity;
+        @JsonProperty("addrCounty")
+        private String addrCounty;
+        @JsonProperty("addrStreet")
+        private String addrStreet;
+        @JsonProperty("fullAddr")
+        private String fullAddr;
+        @JsonProperty("postCode")
+        private String postCode;
+        @JsonProperty("companyNature")
+        private String companyNature;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class PlanListDTO {
+        @JsonProperty("planNo")
+        private String planNo;
+        @JsonProperty("quantity")
+        private String quantity;
+        @JsonProperty("occupationCode")
+        private String occupationCode;
+        @JsonProperty("occupationName")
+        private String occupationName;
+        @JsonProperty("occupationCategory")
+        private String occupationCategory;
+        @JsonProperty("occupationGrade")
+        private String occupationGrade;
+        @JsonProperty("occupationType")
+        private String occupationType;
+        @JsonProperty("socialSecInd")
+        private String socialSecInd;
+        @JsonProperty("acrGrading")
+        private String acrGrading;
+        @JsonProperty("healthManagement")
+        private String healthManagement;
+        @JsonProperty("medicalIdeaSer")
+        private String medicalIdeaSer;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class SalesmanListDTO {
+        @JsonProperty("serialNo")
+        private Integer serialNo;
+        @JsonProperty("agentCode")
+        private String agentCode;
+        @JsonProperty("agentCnrtNo")
+        private String agentCnrtNo;
+        @JsonProperty("companyCode")
+        private String companyCode;
+        @JsonProperty("salesmanCode")
+        private String salesmanCode;
+        @JsonProperty("salesmanName")
+        private String salesmanName;
+        @JsonProperty("salesmanFlag")
+        private Integer salesmanFlag;
+        @JsonProperty("agentCertfNo")
+        private String agentCertfNo;
+        @JsonProperty("agentEmpNo")
+        private String agentEmpNo;
+        @JsonProperty("agentMode")
+        private String agentMode;
+        @JsonProperty("agentName")
+        private String agentName;
+        @JsonProperty("agentPracticeNo")
+        private String agentPracticeNo;
+        @JsonProperty("agentSalesmanName")
+        private String agentSalesmanName;
+        @JsonProperty("cooperative")
+        private String cooperative;
+        @JsonProperty("projectCode")
+        private String projectCode;
+        @JsonProperty("projectFlag")
+        private String projectFlag;
+        @JsonProperty("projectName")
+        private String projectName;
+        @JsonProperty("referenceCode")
+        private String referenceCode;
+        @JsonProperty("referenceName")
+        private String referenceName;
+        @JsonProperty("referencePhone")
+        private String referencePhone;
+    }
+}

+ 16 - 4
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerProposalNoSaveRequest.java

@@ -4,12 +4,14 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenBcDTO;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerCalculationPremiumData;
-import org.springframework.util.StringUtils;
 import lombok.Data;
 import lombok.NoArgsConstructor;
+import org.springframework.util.StringUtils;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
 
 @Data
 @NoArgsConstructor
@@ -30,7 +32,11 @@ public class GuoRenCrawlerProposalNoSaveRequest implements Serializable {
     @JsonProperty("ci")
     private GuoRenCrawlerCalculationPremiumData.CiDTO ci;
 
-    public GuoRenCrawlerProposalNoSaveRequest(QuoteVo quoteVo, GuoRenCrawlerCalculationPremiumData guoRenCrawlerCalculationPremiumData, GuoRenCrawlerCalculationPremiumRequest calculationPremiumRequest) {
+    @JsonProperty("order")
+    private String order;
+
+
+    public GuoRenCrawlerProposalNoSaveRequest(QuoteVo quoteVo, GuoRenCrawlerCalculationPremiumData guoRenCrawlerCalculationPremiumData, GuoRenCrawlerCalculationPremiumRequest calculationPremiumRequest, GuoRenCrawlerCreateOrderRequest createOrderRequest) {
         GuoRenCrawlerCalculationPremiumData.CiDTO ciDto = guoRenCrawlerCalculationPremiumData.getCi();
         ciDto.setPrptengageList(calculationPremiumRequest.getCi().getPrptengageList());
         GuoRenCrawlerCalculationPremiumData.BiDTO biDto = guoRenCrawlerCalculationPremiumData.getBi();
@@ -38,6 +44,13 @@ public class GuoRenCrawlerProposalNoSaveRequest implements Serializable {
         this.bc = calculationPremiumRequest.getBc();
         this.bc.getPrpTmain().setCaptcha("");
         this.bc.getPrpTmain().setEProposalFlag("1");
+        if (createOrderRequest != null) {
+            List<GuoRenCrawlerCreateOrderRequest.OrderMainDTO> orderMainList = new ArrayList<>();
+            orderMainList.add(createOrderRequest.getData().getOrderList().get(0).getOrderMain());
+            calculationPremiumRequest.getBc().setOrderMainList(orderMainList);
+            this.order = createOrderRequest.getOrderCode();
+            this.bc.getPrpTmain().setOrderNo(createOrderRequest.getOrderCode());
+        }
         this.basePartVo = calculationPremiumRequest.getBasePartVo();
         guoRenCrawlerCalculationPremiumData.getCi().getCiInsureDemand().setTonCount(quoteVo.getCarInfoVo().getTonCount());
         guoRenCrawlerCalculationPremiumData.getCi().getCiInsureDemand().setSeatCount(quoteVo.getCarInfoVo().getSeatCount());
@@ -99,8 +112,7 @@ public class GuoRenCrawlerProposalNoSaveRequest implements Serializable {
             }
             // 传播demandNo到ciCarShipTaxQGDemandSchema
             if (this.ci != null && this.ci.getCiCarShipTaxQGDemandSchema() != null) {
-                String effectiveDemandNo = StringUtils.hasText(ciDemandNo) ? ciDemandNo
-                        : (this.ci.getCiInsureDemand() != null ? this.ci.getCiInsureDemand().getDemandNo() : null);
+                String effectiveDemandNo = StringUtils.hasText(ciDemandNo) ? ciDemandNo : (this.ci.getCiInsureDemand() != null ? this.ci.getCiInsureDemand().getDemandNo() : null);
                 if (StringUtils.hasText(effectiveDemandNo)) {
                     this.ci.getCiCarShipTaxQGDemandSchema().setDemandNo(effectiveDemandNo);
                 }

+ 139 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerQueryQuotationRequest.java

@@ -0,0 +1,139 @@
+package com.jzg.quotation.guoren.crawler.entity.request;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
+import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.quotation.commons.utils.TimeProcessing;
+import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenPrpTitemCarDTO;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @description: 【国任财险】驾意险查询 请求
+ * @date 2026/07/09
+ */
+@Data
+@NoArgsConstructor
+public class GuoRenCrawlerQueryQuotationRequest implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 3987654321098765432L;
+
+    @JsonProperty("channelCode")
+    private String channelCode;
+
+    @JsonProperty("othBusinessNo")
+    private String othBusinessNo;
+
+    @JsonProperty("requestTime")
+    private String requestTime;
+
+    @JsonProperty("data")
+    private DataDTO data;
+
+    public GuoRenCrawlerQueryQuotationRequest(QuoteVo quoteVo,
+                                              GuoRenPrpTitemCarDTO prpTitemCar) {
+        String ordersNo = quoteVo.getOrder().getOrdersNo();
+        AccidentalDrivingVo accidentalDriving = quoteVo.getAccidentalDrivings().get(0);
+        CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();
+
+        this.channelCode = "RBT";
+        this.othBusinessNo = ordersNo;
+        this.requestTime = TimeProcessing.nowDate();
+
+        DataDTO dataDTO = new DataDTO();
+        GoodsListDTO goodsListDTO = new GoodsListDTO();
+        goodsListDTO.setClassifyCode("A");
+        goodsListDTO.setGoodsCode(accidentalDriving.getParentProductCode());
+        goodsListDTO.setProdCode(accidentalDriving.getProductCode());
+        goodsListDTO.setStartDate(quoteVo.getCiRiskInfoVo() != null
+                ? TimeProcessing.dateTimeToDate(quoteVo.getCiRiskInfoVo().getStartDate()) + " 00:00:00"
+                : TimeProcessing.nowDate() + " 00:00:00");
+        goodsListDTO.setEndDate(quoteVo.getCiRiskInfoVo() != null
+                ? TimeProcessing.dateTimeToDate(quoteVo.getCiRiskInfoVo().getEndDate()) + " 23:59:59"
+                : TimeProcessing.plusDays(TimeProcessing.nowDate(), 365) + " 23:59:59");
+        goodsListDTO.setQuantity(1);
+        goodsListDTO.setUwCount(1);
+        goodsListDTO.setRenewalInd("0");
+
+        // orderObj
+        OrderObjDTO orderObj = new OrderObjDTO();
+        orderObj.setSeatNum(prpTitemCar.getSeatCount());
+        goodsListDTO.setOrderObj(orderObj);
+
+        // insuredList
+        InsuredListDTO insuredListDTO = new InsuredListDTO();
+        insuredListDTO.setSex(insuredPersonInfo.getGender());
+        insuredListDTO.setBirthDate(insuredPersonInfo.getBirthday());
+        insuredListDTO.setOccupationGrade("1");
+        insuredListDTO.setOccupationCode("0500020");
+        insuredListDTO.setOccupationName("其他");
+        insuredListDTO.setSocialSecInd("");
+        goodsListDTO.setInsuredList(Collections.singletonList(insuredListDTO));
+
+        dataDTO.setGoodsList(Collections.singletonList(goodsListDTO));
+        this.data = dataDTO;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class DataDTO {
+        @JsonProperty("goodsList")
+        private List<GoodsListDTO> goodsList;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class GoodsListDTO {
+        @JsonProperty("classifyCode")
+        private String classifyCode;
+        @JsonProperty("goodsCode")
+        private String goodsCode;
+        @JsonProperty("prodCode")
+        private String prodCode;
+        @JsonProperty("startDate")
+        private String startDate;
+        @JsonProperty("endDate")
+        private String endDate;
+        @JsonProperty("quantity")
+        private Integer quantity;
+        @JsonProperty("uwCount")
+        private Integer uwCount;
+        @JsonProperty("renewalInd")
+        private String renewalInd;
+        @JsonProperty("orderObj")
+        private OrderObjDTO orderObj;
+        @JsonProperty("insuredList")
+        private List<InsuredListDTO> insuredList;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class OrderObjDTO {
+        @JsonProperty("seatNum")
+        private String seatNum;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class InsuredListDTO {
+        @JsonProperty("sex")
+        private String sex;
+        @JsonProperty("birthDate")
+        private String birthDate;
+        @JsonProperty("occupationGrade")
+        private String occupationGrade;
+        @JsonProperty("occupationCode")
+        private String occupationCode;
+        @JsonProperty("occupationName")
+        private String occupationName;
+        @JsonProperty("socialSecInd")
+        private String socialSecInd;
+    }
+}

+ 6 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerBaseResponse.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.guoren.crawler.entity.response;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
+import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -38,4 +39,9 @@ public class GuoRenCrawlerBaseResponse<T> implements Serializable {
     @JsonProperty("data")
     private T data;
 
+    @SerializedName("code")
+    private String code;
+
+    @SerializedName("message")
+    private String message;
 }

+ 20 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerCreateOrderCheckData.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.guoren.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: 【国任财险】 驾意险校验 响应数据
+ * @date 2026/07/08
+ */
+@Data
+@NoArgsConstructor
+public class GuoRenCrawlerCreateOrderCheckData {
+
+    @JsonProperty("orderCode")
+    private String orderCode;
+
+    @JsonProperty("noCarPremium")
+    private String noCarPremium;
+}

+ 20 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerCreateOrderDataData.java

@@ -0,0 +1,20 @@
+package com.jzg.quotation.guoren.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @description: 【国任财险】 驾意险投保 响应数据
+ * @date 2026/07/08
+ */
+@Data
+@NoArgsConstructor
+public class GuoRenCrawlerCreateOrderDataData {
+
+    @JsonProperty("orderCode")
+    private String orderCode;
+
+    @JsonProperty("noCarPremium")
+    private String noCarPremium;
+}

+ 91 - 0
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/response/GuoRenCrawlerQueryQuotationData.java

@@ -0,0 +1,91 @@
+package com.jzg.quotation.guoren.crawler.entity.response;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * @description: 【国任财险】驾意险查询 响应数据
+ * @date 2026/07/09
+ */
+@Data
+@NoArgsConstructor
+public class GuoRenCrawlerQueryQuotationData implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 8765432109876543210L;
+
+    @JsonProperty("orderPremium")
+    private BigDecimal orderPremium;
+
+    @JsonProperty("orderAmount")
+    private BigDecimal orderAmount;
+
+    @JsonProperty("goodsExpenseList")
+    private List<GoodsExpenseDTO> goodsExpenseList;
+
+    /**
+     * 获取liabList(从第一个goods的orderSub中提取)
+     */
+    public List<LiabDTO> getLiabList() {
+        if (goodsExpenseList != null && !goodsExpenseList.isEmpty()) {
+            GoodsExpenseDTO goodsExpense = goodsExpenseList.get(0);
+            if (goodsExpense.getOrderSubList() != null && !goodsExpense.getOrderSubList().isEmpty()) {
+                return goodsExpense.getOrderSubList().get(0).getLiabList();
+            }
+        }
+        return null;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class GoodsExpenseDTO {
+        @JsonProperty("goodsCode")
+        private String goodsCode;
+        @JsonProperty("prodCode")
+        private String prodCode;
+        @JsonProperty("goodsPremium")
+        private BigDecimal goodsPremium;
+        @JsonProperty("goodsAmount")
+        private BigDecimal goodsAmount;
+        @JsonProperty("orderSubList")
+        private List<OrderSubDTO> orderSubList;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class OrderSubDTO {
+        @JsonProperty("premium")
+        private BigDecimal premium;
+        @JsonProperty("amount")
+        private BigDecimal amount;
+        @JsonProperty("riskCode")
+        private String riskCode;
+        @JsonProperty("liabList")
+        private List<LiabDTO> liabList;
+    }
+
+    @Data
+    @NoArgsConstructor
+    public static class LiabDTO {
+        @JsonProperty("serialNo")
+        private Integer serialNo;
+        @JsonProperty("liabName")
+        private String liabName;
+        @JsonProperty("liabAmount")
+        private BigDecimal liabAmount;
+        @JsonProperty("liabPremium")
+        private BigDecimal liabPremium;
+        @JsonProperty("unitAmount")
+        private BigDecimal unitAmount;
+        @JsonProperty("unitPremium")
+        private BigDecimal unitPremium;
+        @JsonProperty("quantity")
+        private Integer quantity;
+    }
+}

+ 2 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/GuoRenCrawlerOrderService.java

@@ -13,8 +13,9 @@ public interface GuoRenCrawlerOrderService {
      *
      * @param quoteVo                         报价信息
      * @param guoRenCrawlerProposalNoSaveData 国任财险保存投保单响应
+     * @param niPolicyNumber                  非车险投保单号(驾意险)
      */
-    void saveOrderInfo(QuoteVo quoteVo, GuoRenCrawlerProposalNoSaveData guoRenCrawlerProposalNoSaveData);
+    void saveOrderInfo(QuoteVo quoteVo, GuoRenCrawlerProposalNoSaveData guoRenCrawlerProposalNoSaveData, String niPolicyNumber);
 
     /**
      * 通过id查询mongodb中的唯一订单号

+ 2 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerOrderServiceImpl.java

@@ -19,13 +19,14 @@ public class GuoRenCrawlerOrderServiceImpl implements GuoRenCrawlerOrderService
     private final GuoRenCrawlerQuoteProcessService guoRenCrawlerQuoteProcessService;
 
     @Override
-    public void saveOrderInfo(QuoteVo quoteVo, GuoRenCrawlerProposalNoSaveData guoRenCrawlerProposalNoSaveData) {
+    public void saveOrderInfo(QuoteVo quoteVo, GuoRenCrawlerProposalNoSaveData guoRenCrawlerProposalNoSaveData, String niPolicyNumber) {
         GuoRenCrawlerOrder guoRenCrawlerOrder = new GuoRenCrawlerOrder();
         guoRenCrawlerOrder.setId(quoteVo.getOrder().getOrdersNo());
         guoRenCrawlerOrder.setCiPolicyNumber(guoRenCrawlerProposalNoSaveData.getBusinessNoCI());
         guoRenCrawlerOrder.setBiPolicyNumber(guoRenCrawlerProposalNoSaveData.getBusinessNoBI());
         guoRenCrawlerOrder.setCiPolicyNo(guoRenCrawlerProposalNoSaveData.getBusinessNoCI());
         guoRenCrawlerOrder.setBiPolicyNo(guoRenCrawlerProposalNoSaveData.getBusinessNoBI());
+        guoRenCrawlerOrder.setNiPolicyNumber(niPolicyNumber);
         guoRenCrawlerOrderRepository.save(guoRenCrawlerOrder);
     }
 

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

@@ -111,7 +111,7 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
     public HttpHeaders getHeaders(String username) {
         HttpHeaders headers = new HttpHeaders();
         String token = guoRenCrawlerCacheComponent.getToken(username);
-//        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3ODEyNDU1NDJ9.YsfJuQ58NaPa-7aUrYjh0SdvRkxhsiejP648H39j6h1PztC0b5Rdb8GOi5oGkVew_CI-T5j0VeaYfSFF-DrqrT_LReqtbl-iM0_OeN8acFLNcXbhfv80mRz1HqPZrUXrwngS-8Q6eF42gOJVxAX_nSFNdJpX5977A3_KJdmVbxs";
+//        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3ODM2NzExMTZ9.M9ATzYxnqCtuqRmrChaHOoM0u67ULQK253xZFdZlPZIYqvloAEcU-FFXf0znSxoMD1xOqIbMgAvNlsHdNV33AQFndbvuA3A9t8wz5ys0ny-JZ7ik_mMW75RfkwwhB1pBWCGi4WcsVUqwXdGu_8if_Q-6X4aDq-kC2R1DK57FLd4";
         if (!StringUtils.hasText(token)) {
             throw new TokenExpireException("500", "国任财险账号登录过期,请重新登录");
         }

+ 61 - 6
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java

@@ -5,11 +5,13 @@ import com.jzg.commons.constants.InsuranceRisk;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.orders.po.InsOrders;
 import com.jzg.commons.entity.po.InsCompanyClause;
+import com.jzg.commons.entity.quote.vo.AccidentalDrivingVo;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
 import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
+import com.jzg.commons.exception.SystemException;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
@@ -28,6 +30,8 @@ import com.jzg.quotation.guoren.crawler.entity.dto.PrptengageListDTO;
 import com.jzg.quotation.guoren.crawler.entity.po.GuoRenCrawlerOrder;
 import com.jzg.quotation.guoren.crawler.entity.po.OrderCommon;
 import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerCalculationPremiumRequest;
+import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerCreateOrderRequest;
+import com.jzg.quotation.guoren.crawler.entity.request.GuoRenCrawlerQueryQuotationRequest;
 import com.jzg.quotation.guoren.crawler.entity.response.*;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerOrderService;
 import com.jzg.quotation.guoren.crawler.service.GuoRenCrawlerQuoteProcessService;
@@ -116,6 +120,26 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
                     .collect(Collectors.toList());
             crawlerCalculationPremiumRequest.getBi().setPrptengageList(PrptengageListDTO.fromSpecialAgreementVo(businessSpecialAgreements));
         }
+        // 设置非车险信息到CI/BI的prpTmain(对齐API中PremiumRequest的逻辑)
+        if (CollUtil.isNotEmpty(quoteVo.getAccidentalDrivings())) {
+            AccidentalDrivingVo accidentalDriving = quoteVo.getAccidentalDrivings().get(0);
+            String noCarCodes = accidentalDriving.getProductCode();
+            String premiumStr = accidentalDriving.getPremium();
+            Integer noCarPremium = premiumStr != null ? (int) Double.parseDouble(premiumStr) : 0;
+            if (crawlerCalculationPremiumRequest.getCi() != null) {
+                crawlerCalculationPremiumRequest.getCi().getPrpTmain().setNoCarFlag(1);
+                crawlerCalculationPremiumRequest.getCi().getPrpTmain().setNoCarCodes(noCarCodes);
+                crawlerCalculationPremiumRequest.getCi().getPrpTmain().setNoCarPremium(noCarPremium);
+                crawlerCalculationPremiumRequest.getCi().getPrpTmain().setOrderFlag("N");
+            }
+            if (crawlerCalculationPremiumRequest.getBi().getPrpTmain() != null) {
+                crawlerCalculationPremiumRequest.getBi().getPrpTmain().setNoCarFlag(1);
+                crawlerCalculationPremiumRequest.getBi().getPrpTmain().setNoCarCodes(noCarCodes);
+                crawlerCalculationPremiumRequest.getBi().getPrpTmain().setNoCarPremium(noCarPremium);
+                crawlerCalculationPremiumRequest.getBi().getPrpTmain().setOrderFlag("N");
+            }
+        }
+
         GuoRenCrawlerBaseResponse<GuoRenCrawlerCalculationPremiumData> calculationPremium = guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers);
         // 处理重复投保
         String message = calculationPremium.getResultMsg();
@@ -146,12 +170,13 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
                     item.setStartDate(startDate);
                     item.setEndDate(endDate);
                 });
+
                 if (crawlerCalculationPremiumRequest.getBi().getPrpTmain() != null) {
                     // 商业
-                    String biStartDate = TimeProcessing.plusDays(startDate, 1);
-                    String biEndDate = TimeProcessing.plusDays(endDate, 1);
-                    quoteVo.getBiRiskInfoVo().setStartDate(biStartDate + " 00:00:00");
-                    quoteVo.getBiRiskInfoVo().setEndDate(biEndDate + " 00:00:00");
+                    String biStartDate = (startTime != null && startTime.endsWith("00:00:00")) ? startTime :TimeProcessing.plusDays(startDate, 1) + " 00:00:00";
+                    String biEndDate = TimeProcessing.minusOneSecondAfterYear(biStartDate);
+                    quoteVo.getBiRiskInfoVo().setStartDate(biStartDate);
+                    quoteVo.getBiRiskInfoVo().setEndDate(biEndDate);
                     crawlerCalculationPremiumRequest.getBi().getPrpTmain().setStartDate(biStartDate);
                     crawlerCalculationPremiumRequest.getBi().getPrpTmain().setStartHour(0);
                     crawlerCalculationPremiumRequest.getBi().getPrpTmain().setStartMinute(0);
@@ -168,12 +193,42 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
         } else if (calculationPremium.getResultCode() == 1) {
             return GuoRenCrawlerQuoteResultsVoBuild.buildFailQuoteResultsVo(quoteVo, calculationPremium);
         }
+        // 驾意险(非车险)处理:查询 → 校验 → 投保
+        String niPolicyNumber = null;
+        GuoRenCrawlerCreateOrderRequest createOrderRequest = null;
+        if (CollUtil.isNotEmpty(quoteVo.getAccidentalDrivings())) {
+            // 驾意险查询:获取liabList用于订单创建
+            GuoRenCrawlerQueryQuotationRequest queryQuotationRequest = new GuoRenCrawlerQueryQuotationRequest(quoteVo,  crawlerCalculationPremiumRequest.getBc().getPrpTitemCar());
+            GuoRenCrawlerBaseResponse<GuoRenCrawlerQueryQuotationData> queryResponse = guoRenCrawlerRequestComponent.queryQuotation(queryQuotationRequest, headers);
+            List<GuoRenCrawlerQueryQuotationData.LiabDTO> queryLiabList = null;
+            if ("0000".equals(queryResponse.getCode()) && queryResponse.getData() != null) {
+                queryLiabList = queryResponse.getData().getLiabList();
+            }
+            createOrderRequest = new GuoRenCrawlerCreateOrderRequest(quoteVo, crawlerCalculationPremiumRequest, queryLiabList);
+            // 第一步:驾意险校验
+            GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderCheckData> checkResponse = guoRenCrawlerRequestComponent.createOrderCheck(createOrderRequest, headers);
+            if (!checkResponse.getCode().equals("0000")) {
+                throw new SystemException("驾意险订单校验失败:" + checkResponse.getMessage());
+            }
+            // 第二步:驾意险投保
+            GuoRenCrawlerBaseResponse<GuoRenCrawlerCreateOrderDataData> dataResponse = guoRenCrawlerRequestComponent.createOrderData(createOrderRequest, headers);
+            if (!dataResponse.getCode().equals("0000")) {
+                throw new SystemException("驾意险投保失败:" + dataResponse.getMessage());
+            }
+            if (dataResponse.getData() != null) {
+                niPolicyNumber = dataResponse.getData().getOrderCode();
+                createOrderRequest.setOrderCode(niPolicyNumber);
+            }
+        }
+
+
         // 投保验证码处理
         GuoRenCrawlerCalculationPremiumData calculationPremiumData = guoRenCrawlerQuoteProcessService.insuranceVerificationCodeProcessing(crawlerCalculationPremiumRequest, calculationPremium.getData(), headers);
         // 保存投保单号
-        GuoRenCrawlerProposalNoSaveData proposalNoSave = guoRenCrawlerRequestComponent.proposalNoSave(quoteVo, crawlerCalculationPremiumRequest, calculationPremiumData, headers);
+        GuoRenCrawlerProposalNoSaveData proposalNoSave = guoRenCrawlerRequestComponent.proposalNoSave(quoteVo, crawlerCalculationPremiumRequest, calculationPremiumData, createOrderRequest, headers);
+
         // 保存数据
-        guoRenCrawlerOrderService.saveOrderInfo(quoteVo, proposalNoSave);
+        guoRenCrawlerOrderService.saveOrderInfo(quoteVo, proposalNoSave, niPolicyNumber);
         return GuoRenCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, calculationPremiumData, proposalNoSave);
     }
 

+ 20 - 15
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerQuoteimmediatelyRequest.java

@@ -30,8 +30,7 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
     @Serial
     private static final long serialVersionUID = -4097447719083993314L;
 
-    public HbCrawlerQuoteimmediatelyRequest(QuoteVo quoteVo, HbEncDTO saleInfo, String depreciationPrice,
-                                            HengBangCrawlerConfigureParameters parameters, HbCrawlerQueryCarResponse.ContentDTO contentDTO) {
+    public HbCrawlerQuoteimmediatelyRequest(QuoteVo quoteVo, HbEncDTO saleInfo, String depreciationPrice, HengBangCrawlerConfigureParameters parameters, HbCrawlerQueryCarResponse.ContentDTO contentDTO) {
         CustomerInfoVo ownersInfo = quoteVo.getOwnersInfo();//车主
         CustomerInfoVo policyHolderInfo = quoteVo.getPolicyHolderInfo();//投保人
         CustomerInfoVo insuredPersonInfo = quoteVo.getInsuredPersonInfo();//被保人
@@ -69,14 +68,16 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureItemDTO.setModelCode(contentDTO.getModelCode());
         carInsureItemDTO.setFamilyName(contentDTO.getFamilyName());
         carInsureItemDTO.setAttachNature(carInfoVo.getPropertyCode());
-        carInsureItemDTO.setCiModelCode(StringUtils.isNotBlank(contentDTO.getCimodelCode())? contentDTO.getCimodelCode() : contentDTO.getCimodelCodeC());
+        carInsureItemDTO.setCiModelCode(StringUtils.isNotBlank(contentDTO.getCimodelCode()) ? contentDTO.getCimodelCode() : contentDTO.getCimodelCodeC());
         carInsureItemDTO.setPurchasePriceNotTax(Double.parseDouble(contentDTO.getPurchasePriceNotTax()));
         carInsureItemDTO.setStyleUniqueId(contentDTO.getVehicleStyleUniqueId());
         carInsureItemDTO.setCountyCode(ownersInfo.getCountyCode());
-        carInsureItemDTO.setCountyNameArray(new StringBuilder(ownersInfo.getProvince()).append(",").append(ownersInfo.getCity()).append(",").append(ownersInfo.getCounty()).toString());
-        carInsureItemDTO.setCountyCodeArray(new StringBuilder(ownersInfo.getProvinceCode()).append(",").append(ownersInfo.getCityCode()).append(",").append(ownersInfo.getCountyCode()).toString());
+        if (StringUtils.isNotEmpty(policyHolderInfo.getProvince())) {
+            carInsureItemDTO.setCountyNameArray(new StringBuilder(ownersInfo.getProvince()).append(",").append(ownersInfo.getCity()).append(",").append(ownersInfo.getCounty()).toString());
+            carInsureItemDTO.setCountyCodeArray(new StringBuilder(ownersInfo.getProvinceCode()).append(",").append(ownersInfo.getCityCode()).append(",").append(ownersInfo.getCountyCode()).toString());
+        }
         carInsureItemDTO.setPostCode(ownersInfo.getCountyCode());
-        carInsureItemDTO.setChgownerFlag(carInfoVo.isTransfer()? "1" : "0");
+        carInsureItemDTO.setChgownerFlag(carInfoVo.isTransfer() ? "1" : "0");
         carInsureItemDTO.setSpecialCarFlag("1");
         carInsureItemDTO.setTotalTonCount("0.00");
         carInsureItemDTO.setNoticeType(contentDTO.getNoticeType());
@@ -94,8 +95,10 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         riskRelatedPartyDTO.setEmail(insuredPersonInfo.getEmail());
         riskRelatedPartyDTO.setCountyCode(insuredPersonInfo.getCountyCode());
         riskRelatedPartyDTO.setPostCode(insuredPersonInfo.getCountyCode());
-        riskRelatedPartyDTO.setCountyNameArray(new StringBuilder(insuredPersonInfo.getProvince()).append(",").append(insuredPersonInfo.getCity()).append(",").append(insuredPersonInfo.getCounty()).toString());
-        riskRelatedPartyDTO.setCountyCodeArray(new StringBuilder(insuredPersonInfo.getProvinceCode()).append(",").append(insuredPersonInfo.getCityCode()).append(",").append(insuredPersonInfo.getCountyCode()).toString());
+        if (StringUtils.isNotEmpty(policyHolderInfo.getProvince())) {
+            riskRelatedPartyDTO.setCountyNameArray(new StringBuilder(insuredPersonInfo.getProvince()).append(",").append(insuredPersonInfo.getCity()).append(",").append(insuredPersonInfo.getCounty()).toString());
+            riskRelatedPartyDTO.setCountyCodeArray(new StringBuilder(insuredPersonInfo.getProvinceCode()).append(",").append(insuredPersonInfo.getCityCode()).append(",").append(insuredPersonInfo.getCountyCode()).toString());
+        }
         riskRelatedPartyDTO.setSex(insuredPersonInfo.getGender());
         riskRelatedPartyDTO.setAddress(insuredPersonInfo.getAddr());
         riskRelatedPartyDTO.setValidityBegintime(dateFormat(insuredPersonInfo.getIdentifyValidDate()));
@@ -105,7 +108,7 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         riskRelatedPartyDTO.setPosition("60");
         riskRelatedPartyDTO.setCustomerType("00");
         riskRelatedPartyDTO.setVipInd("0");
-        riskRelatedPartyDTO.setRelationshipToInsrnt(policyHolderInfo.getName().equals(insuredPersonInfo.getName())? "6" : "0");
+        riskRelatedPartyDTO.setRelationshipToInsrnt(policyHolderInfo.getName().equals(insuredPersonInfo.getName()) ? "6" : "0");
         this.carInsureRiskRelatedParty = riskRelatedPartyDTO;
         //设置投保人数据
         CarInsureRelatedPartyDTO carInsureRelatedPartyDTO = new CarInsureRelatedPartyDTO();
@@ -117,8 +120,10 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         carInsureRelatedPartyDTO.setEmail(policyHolderInfo.getEmail());
         carInsureRelatedPartyDTO.setCountyCode(policyHolderInfo.getCountyCode());
         carInsureRelatedPartyDTO.setPostCode(policyHolderInfo.getCountyCode());
-        carInsureRelatedPartyDTO.setCountyNameArray(new StringBuilder(policyHolderInfo.getProvince()).append(",").append(policyHolderInfo.getCity()).append(",").append(policyHolderInfo.getCounty()).toString());
-        carInsureRelatedPartyDTO.setCountyCodeArray(new StringBuilder(policyHolderInfo.getProvinceCode()).append(",").append(policyHolderInfo.getCityCode()).append(",").append(policyHolderInfo.getCountyCode()).toString());
+        if (StringUtils.isNotEmpty(policyHolderInfo.getProvince())) {
+            carInsureRelatedPartyDTO.setCountyNameArray(new StringBuilder(policyHolderInfo.getProvince()).append(",").append(policyHolderInfo.getCity()).append(",").append(policyHolderInfo.getCounty()).toString());
+            carInsureRelatedPartyDTO.setCountyCodeArray(new StringBuilder(policyHolderInfo.getProvinceCode()).append(",").append(policyHolderInfo.getCityCode()).append(",").append(policyHolderInfo.getCountyCode()).toString());
+        }
         carInsureRelatedPartyDTO.setSex(policyHolderInfo.getGender());
         carInsureRelatedPartyDTO.setAddress(policyHolderInfo.getAddr());
         carInsureRelatedPartyDTO.setValidityBegintime(dateFormat(policyHolderInfo.getIdentifyValidDate()));
@@ -160,14 +165,14 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
         this.carInsureMain = carInsureMainDTO;
     }
 
-    private String dateFormat(String date){
+    private String dateFormat(String date) {
         // 空字符串直接返回
-        if (date == null || date.trim().isEmpty()){
+        if (date == null || date.trim().isEmpty()) {
             return date;
         }
         // 1. 解析为 LocalDateTime
         ZonedDateTime zdt = null;
-        if (date.length() == 10){
+        if (date.length() == 10) {
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
             LocalDate ld = LocalDate.parse(date, formatter);
             // 2. 补上 00:00:00,变成 LocalDateTime
@@ -176,7 +181,7 @@ public class HbCrawlerQuoteimmediatelyRequest extends HbBaseRequest {
             // 3. 设置时区为 +08:00(北京/上海)
             ZoneId zone = ZoneId.of("Asia/Shanghai");
             zdt = ldt.atZone(zone);
-        }else{
+        } else {
             DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
             LocalDateTime ldt = LocalDateTime.parse(date, formatter);
             // 2. 指定时区(这里用 +08:00)

+ 27 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/AuditVerificationAspect.java

@@ -9,6 +9,8 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.quote.vo.aggregated.UnderwritingVo;
+import com.jzg.commons.entity.vo.AgreementInfoVo;
+import com.jzg.commons.entity.vo.AgreementVo;
 import com.jzg.commons.entity.vo.RuleAttrMappingVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
@@ -79,7 +81,6 @@ public class AuditVerificationAspect {
                 InsFeeOrders insFeeOrders = insFeeOrdersService.getById(orderNo);
                 AssertionUtils.isFail(Objects.isNull(insFeeOrders),"费用信息不匹配");
 
-
                 // 获取订单车辆信息
                 InsOrdersCarInfo insOrdersCarInfo = insOrdersCarInfoService.getById(insOrders.getId());
                 // 获取订单险种信息
@@ -101,6 +102,31 @@ public class AuditVerificationAspect {
                 AssertionUtils.isFail(httpResult.getCode() == 500,"费用查找失败");
                 PtlAgreementCost ptlAgreementCost = JSONObject.parseObject(JSONObject.toJSONString(httpResult.getData()),PtlAgreementCost.class);
                 AssertionUtils.isFail(Objects.isNull(ptlAgreementCost),"费用查找失败");
+
+                // 校验费用是否在有效期内
+                if (ptlAgreementCost.getEffectiveTime() != null && ptlAgreementCost.getFailureTime() != null) {
+                    java.util.Date now = new java.util.Date();
+                    AssertionUtils.isFail(
+                        now.before(ptlAgreementCost.getEffectiveTime()) || now.after(ptlAgreementCost.getFailureTime()),
+                        "费用已失效,请重新报价"
+                    );
+                }
+                // 校验费用是否被禁用
+                AssertionUtils.isFail(ptlAgreementCost.getIsEnabled() != 0, "费用已禁用,请重新报价");
+
+                // 校验协议是否有效
+                HttpResult<AgreementInfoVo> ptlAgreement = orgClient.queryAgreementById(insOrders.getAgreementId());
+                AssertionUtils.isFail(ptlAgreement == null || ptlAgreement.getData() == null, "协议查找失败");
+                AgreementVo agreementVo = ptlAgreement.getData().getAgreement();
+                AssertionUtils.isFail(
+                    "1".equals(agreementVo.getValidStatus()),
+                    "协议已失效,请重新报价"
+                );
+                AssertionUtils.isFail(
+                    agreementVo.getIsEnable() != null && "1".equals(agreementVo.getIsEnable().toString()),
+                    "协议已停用,请重新报价"
+                );
+
                 String coverRuleId = ptlAgreementCost.getCoverRuleId();
 
                 // 查询承保规则实体,判断是否有parentId

+ 22 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java

@@ -94,6 +94,28 @@ public class QuoteVerificationAspect {
             // 获取协议信息
             HttpResult<AgreementInfoVo> ptlAgreement = orgClient.queryAgreementById(insOrders.getAgreementId());
             AgreementInfoVo agreementInfoVo = ptlAgreement.getData();
+            // 校验协议有效性
+            if (agreementInfoVo != null && agreementInfoVo.getAgreement() != null) {
+                AgreementVo agreementVo = agreementInfoVo.getAgreement();
+                if ("1".equals(agreementVo.getValidStatus())) {
+                    result.setCode(500);
+                    result.setMsg("协议已失效,请重新配置协议后再次报价");
+                    return;
+                }
+                if ("1".equals(String.valueOf(agreementVo.getIsEnable()))) {
+                    result.setCode(500);
+                    result.setMsg("协议已停用,请重新配置协议后再次报价");
+                    return;
+                }
+                if (agreementVo.getStartDate() != null && agreementVo.getEndDate() != null) {
+                    java.time.LocalDateTime now = java.time.LocalDateTime.now();
+                    if (now.isBefore(agreementVo.getStartDate()) || now.isAfter(agreementVo.getEndDate())) {
+                        result.setCode(500);
+                        result.setMsg("协议已超出有效期,请重新配置协议后再次报价");
+                        return;
+                    }
+                }
+            }
             // 通过协议id和产品id查询费用列表
             CostAgreementParam costAgreementParam = new CostAgreementParam();
             costAgreementParam.setPtlAgreementId(insOrders.getAgreementId());

+ 32 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/client/LocalLivingClient.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.summary.client;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.dto.GenerateQrcodeParam;
@@ -10,6 +11,8 @@ import com.jzg.commons.entity.vo.LotteryCountVO;
 import com.jzg.commons.entity.vo.UnifiedUserClientVO;
 import com.jzg.quotation.summary.entity.Result;
 import com.jzg.quotation.summary.entity.dto.*;
+import com.jzg.quotation.summary.entity.vo.ChannelCategoryVo;
+import com.jzg.quotation.summary.entity.vo.ChannelProductInfoVo;
 import com.jzg.quotation.summary.entity.vo.ChannelRightsPackageVO;
 import com.jzg.quotation.summary.entity.vo.ChannelRightsVO;
 import com.jzg.quotation.summary.utils.FeignConfig;
@@ -52,7 +55,7 @@ public interface LocalLivingClient {
      * @return 分页结果
      */
     @PostMapping(value = "/channel/api/rightsGrant/package/list")
-    Result<IPage<ChannelRightsPackageVO>> queryRightsPackagePage(@RequestBody ChannelRightsPackageQueryDTO queryDTO);
+    Result<Page<ChannelRightsPackageVO>> queryRightsPackagePage(@RequestBody ChannelRightsPackageQueryDTO queryDTO);
 
     /**
      * 查询权益套餐明细
@@ -68,7 +71,34 @@ public interface LocalLivingClient {
      * @return 分页结果
      */
     @PostMapping(value = "/channel/api/rightsGrant/rights/list")
-    Result<IPage<ChannelRightsVO>> queryRightsPage(@RequestBody ChannelRightsQueryDTO queryDTO);
+    Result<Page<ChannelRightsVO>> queryRightsPage(@RequestBody ChannelRightsQueryDTO queryDTO);
+
+    /**
+     * 查询权益分类
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/channel/api/rightsGrant/get/category/list")
+    Result<List<ChannelRightsCategoryDto>> queryCategoryList();
+
+    /**
+     * 查询权益分类-二级页面
+     *
+     * @param
+     * @return
+     */
+    @PostMapping("/channel/api/rightsGrant/get/category")
+    Result<List<ChannelCategoryVo>> queryCategory();
+
+    /**
+     * 优惠券商品详情
+     *
+     * @param channelProductInfoQueryDTO
+     * @return
+     */
+    @PostMapping("/channel/api/rightsGrant/get/product")
+    Result<List<ChannelProductInfoVo>> getProduct(@RequestBody ChannelProductInfoQueryDTO channelProductInfoQueryDTO);
 
     /**
      * 查询抽奖活动规则

+ 48 - 6
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/RightsGrantController.java

@@ -1,10 +1,13 @@
 package com.jzg.quotation.summary.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.quotation.summary.client.LocalLivingClient;
 import com.jzg.quotation.summary.entity.Result;
 import com.jzg.quotation.summary.entity.dto.*;
+import com.jzg.quotation.summary.entity.vo.ChannelCategoryVo;
+import com.jzg.quotation.summary.entity.vo.ChannelProductInfoVo;
 import com.jzg.quotation.summary.entity.vo.ChannelRightsPackageVO;
 import com.jzg.quotation.summary.entity.vo.ChannelRightsVO;
 import io.swagger.v3.oas.annotations.Operation;
@@ -74,11 +77,11 @@ public class RightsGrantController {
 
     @Operation(summary = "权益套餐-分页查询")
     @PostMapping(value = "package/list")
-    public HttpResult<IPage<ChannelRightsPackageVO>> queryRightsPackagePage(@RequestBody ChannelRightsPackageQueryDTO queryDTO) {
+    public HttpResult<Page<ChannelRightsPackageVO>> queryRightsPackagePage(@RequestBody ChannelRightsPackageQueryDTO queryDTO) {
         //调生活服务平台
-        Result<IPage<ChannelRightsPackageVO>> result = localLivingClient.queryRightsPackagePage(queryDTO);
+        Result<Page<ChannelRightsPackageVO>> result = localLivingClient.queryRightsPackagePage(queryDTO);
         //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
-        HttpResult<IPage<ChannelRightsPackageVO>> rightsPackageResult = new HttpResult<>();
+        HttpResult<Page<ChannelRightsPackageVO>> rightsPackageResult = new HttpResult<>();
 
         rightsPackageResult.setData(result.getResult());
         rightsPackageResult.setCode(result.getCode());
@@ -107,14 +110,53 @@ public class RightsGrantController {
      */
     @Operation(summary = "权益券-分页查询")
     @PostMapping(value = "/rights/list")
-    public HttpResult<IPage<ChannelRightsVO>> queryRightsPage(@RequestBody ChannelRightsQueryDTO queryDTO) {
+    public HttpResult<Page<ChannelRightsVO>> queryRightsPage(@RequestBody ChannelRightsQueryDTO queryDTO) {
         //调生活服务平台
-        Result<IPage<ChannelRightsVO>> result = localLivingClient.queryRightsPage(queryDTO);
+        Result<Page<ChannelRightsVO>> result = localLivingClient.queryRightsPage(queryDTO);
         //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
-        HttpResult<IPage<ChannelRightsVO>> rightsResult = new HttpResult<>();
+        HttpResult<Page<ChannelRightsVO>> rightsResult = new HttpResult<>();
         rightsResult.setData(result.getResult());
         rightsResult.setCode(result.getCode());
         rightsResult.setMsg(result.getMessage());
         return rightsResult;
     }
+
+    @Operation(summary = "权益券-分类查询")
+    @PostMapping(value = "/get/category/list")
+    public HttpResult<List<ChannelRightsCategoryDto>> getCategoryList() {
+        //调生活服务平台
+        Result<List<ChannelRightsCategoryDto>> result = localLivingClient.queryCategoryList();
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<List<ChannelRightsCategoryDto>> categoryResult = new HttpResult<>();
+        categoryResult.setData(result.getResult());
+        categoryResult.setCode(result.getCode());
+        categoryResult.setMsg(result.getMessage());
+        return categoryResult;
+    }
+
+    @Operation(summary = "权益券-二级分类查询")
+    @PostMapping(value = "/get/category")
+    public HttpResult<List<ChannelCategoryVo>> getCategory() {
+        //调生活服务平台
+        Result<List<ChannelCategoryVo>> result = localLivingClient.queryCategory();
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<List<ChannelCategoryVo>> categoryResult = new HttpResult<>();
+        categoryResult.setData(result.getResult());
+        categoryResult.setCode(result.getCode());
+        categoryResult.setMsg(result.getMessage());
+        return categoryResult;
+    }
+
+    @Operation(summary = "权益券商品详情")
+    @PostMapping(value = "/get/product")
+    public HttpResult<List<ChannelProductInfoVo>> getProduct(@RequestBody ChannelProductInfoQueryDTO channelProductInfoQueryDTO) {
+        //调生活服务平台
+        Result<List<ChannelProductInfoVo>> channelApplicableStoresVo = localLivingClient.getProduct(channelProductInfoQueryDTO);
+        //把生活服务平台查询到的数据封装成返回jzg前端HttpResult对象
+        HttpResult<List<ChannelProductInfoVo>> productResult = new HttpResult<>();
+        productResult.setData(channelApplicableStoresVo.getResult());
+        productResult.setCode(channelApplicableStoresVo.getCode());
+        productResult.setMsg(channelApplicableStoresVo.getMessage());
+        return productResult;
+    }
 }

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

@@ -947,6 +947,7 @@ public class UnifyOrderManager {
         if (orderStatusResultVo.getOrderStatus() == InsOrderStatusEnum.UNDERWRITED) {
             doSomethingAfterUnderwited(insOrders);
         }
+
         return HttpResult.ok("状态刷新成功");
     }
 
@@ -1086,6 +1087,8 @@ public class UnifyOrderManager {
                         insOrders.getRealQuoteUserId(), CLIENT_ID, baseController.getUserSystemCode());
                 GenerateQrcodeParam qparam = new GenerateQrcodeParam();
                 qparam.setActivityId(activity.getId());
+                qparam.setPhone(quoteUserId);
+                qparam.setNumber(rule.getUwLotteryNum());
                 qparam.setQuery("i="+activity.getId()+"&t=1&n="+rule.getUwLotteryNum());
                 Result<String> stringResult = localLivingClient.generateQrcode(qparam);
                 if(stringResult.isSuccess() && !stringResult.getResult().isEmpty()){

+ 17 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelProductInfoQueryDTO.java

@@ -0,0 +1,17 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author quchen
+ * @date 2026/7/7 8:51
+ */
+
+@Data
+public class ChannelProductInfoQueryDTO implements Serializable {
+    @Schema(description = "权益卷id")
+    private String rightsId;
+}

+ 29 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/dto/ChannelRightsCategoryDto.java

@@ -0,0 +1,29 @@
+package com.jzg.quotation.summary.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * @author quchen
+ * @date 2026/7/6 18:33
+ */
+
+@Data
+public class ChannelRightsCategoryDto {
+    private static final long serialVersionUID = 4916889390133265848L;
+
+    @Schema(description = "ID")
+    private String id;
+
+    @Schema(description = "父级ID")
+    private String pid;
+
+    @Schema(description = "分类名称")
+    private String name;
+
+    @Schema(description = "分类编码")
+    private String code;
+
+    @Schema(description = "分类")
+    private String serveSum;
+}

+ 17 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelCategoryVo.java

@@ -0,0 +1,17 @@
+package com.jzg.quotation.summary.entity.vo;
+
+import com.jzg.quotation.summary.entity.dto.ChannelRightsCategoryDto;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+/**
+ * @author quchen
+ * @date 2026/7/7 10:46
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ChannelCategoryVo extends ChannelRightsCategoryDto {
+    private List<ChannelCategoryVo> children;
+}

+ 41 - 0
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/entity/vo/ChannelProductInfoVo.java

@@ -0,0 +1,41 @@
+package com.jzg.quotation.summary.entity.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author quchen
+ * @date 2026/7/7 8:52
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class ChannelProductInfoVo {
+    @Schema(description = "商品ID")
+    private String productId;
+
+    @Schema(description = "商品名称")
+    private String productName;
+
+    @Schema(description = "商品图片")
+    private String productImage;
+
+    @Schema(description = "价格")
+    private String price;
+
+    @Schema(description = "售价")
+    private String soldPrice;
+
+    @Schema(description = "购买数量")
+    private String buyersNumber;
+
+    @Schema(description = "是否是权益商品")
+    private String isRights;
+
+    @Schema(description = "分类id")
+    private String categoryId;
+}

+ 4 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/interceptor/LiveServiceTokenInterceptor.java

@@ -29,7 +29,10 @@ public class LiveServiceTokenInterceptor implements RequestInterceptor {
             "/rightsGrant/package/detail",
             "/rightsGrant/rights/list",
             "/rightsGrant/apiGrant",
-            "/rightsGrant/native/distribution"
+            "/rightsGrant/native/distribution",
+            "/rightsGrant/get/category/list",
+            "/rightsGrant/get/category",
+            "/rightsGrant/get/product"
     );
     @Override
     public void apply(RequestTemplate requestTemplate) {

+ 5 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

@@ -515,8 +515,11 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
             if ("XDCX".equals(company.getCode())) {
                 CustomerInfoVo ownerInfo = schemeRuleFilterVo.getOwnerInfo();
                 CustomerInfoVo applyInfo = schemeRuleFilterVo.getApplyInfo();
-                if (ObjectUtil.isNotNull(ownerInfo) && ObjectUtil.isNotNull(applyInfo)
-                        && !StrUtil.equals(ownerInfo.getIdentifyNumber(), applyInfo.getIdentifyNumber())) {
+                String ownerIdentifyNumber = ObjectUtil.isNotNull(ownerInfo) ? StrUtil.trim(ownerInfo.getIdentifyNumber()) : null;
+                String applyIdentifyNumber = ObjectUtil.isNotNull(applyInfo) ? StrUtil.trim(applyInfo.getIdentifyNumber()) : null;
+                log.info("国任车主约定判断 - 车主身份证号:[{}], 投保人身份证号:[{}]", ownerIdentifyNumber, applyIdentifyNumber);
+                if (StrUtil.isNotBlank(ownerIdentifyNumber) && StrUtil.isNotBlank(applyIdentifyNumber)
+                        && !StrUtil.equals(ownerIdentifyNumber, applyIdentifyNumber)) {
                     CompanyClauseVo clauseVo = new CompanyClauseVo();
                     clauseVo.setCompanyId(company.getId());
                     clauseVo.setClauseCode("T0028");

+ 9 - 1
tenant/organization/src/main/resources/mapper/PtlSchemeMapper.xml

@@ -43,9 +43,13 @@
                 <result column="product_name" property="productName"/>
                 <result column="product_code" property="productCode"/>
                 <result column="risk_code" property="riskCode"/>
+                <result column="coverage" property="coverage"/>
+                <result column="sum_amount" property="sumAmount"/>
                 <result column="parent_product_code" property="parentProductCode"/>
+                <result column="parent_product_name" property="parentProductName"/>
+                <result column="product_category_code" property="productCategoryCode"/>
+                <result column="product_category_name" property="productCategoryName"/>
                 <result column="alias" property="alias"/>
-                <result column="grouping" property="grouping"/>
                 <result column="premium" property="premium"/>
                 <result column="quantity" property="quantity"/>
                 <result column="selected_status" property="selectedStatus"/>
@@ -163,10 +167,14 @@
             jc.alias,
             jc.product_code,
             jc.coverage,
+            jc.coverage as sum_amount,
             jc.premium,
             jc.risk_code,
             jc.parent_id,
             jc1.product_code as parent_product_code,
+            jc1.product_name as parent_product_name,
+            jc1.product_code as product_category_code,
+            jc1.product_name as product_category_name,
             psidi.quantity,
             psidi.selected_status,
             psidi.min_seat_count,

+ 15 - 0
tenant/organization/src/main/resources/mapper/SysUserJzgInfoMapper.xml

@@ -190,6 +190,13 @@
                 or  suji.work_number = #{sysUserInfoListVo.salesman}
                 or  su.id = #{sysUserInfoListVo.salesman})
             </if>
+            <if test="sysUserInfoListVo.name != null and sysUserInfoListVo.name != ''">
+                AND (
+                suji.name LIKE CONCAT('%',#{sysUserInfoListVo.name},'%')
+                OR su.username LIKE CONCAT('%',#{sysUserInfoListVo.name},'%')
+                OR su.mobile LIKE CONCAT('%',#{sysUserInfoListVo.name},'%')
+                )
+            </if>
         </where>
         order by suji.create_time desc
     </select>
@@ -273,6 +280,14 @@
                     and sujis.type_attr != 2 AND sujis.type_attr != 3
                 </if>
             </if>
+
+            <if test="sysUserInfoListVo.name != null and sysUserInfoListVo.name != ''">
+                AND (
+                suji.name LIKE CONCAT('%',#{sysUserInfoListVo.name},'%')
+                OR su.username LIKE CONCAT('%',#{sysUserInfoListVo.name},'%')
+                OR su.mobile LIKE CONCAT('%',#{sysUserInfoListVo.name},'%')
+                )
+            </if>
         </where>
         group by suji.id, soul.organization_id, so.name
         order by suji.create_time desc