Parcourir la source

Merge remote-tracking branch 'origin/dev_jzg_lipf_v20260622' into dev_jzg_lipf_v20260622

jiakai il y a 3 mois
Parent
commit
e2b2f66a5d
36 fichiers modifiés avec 506 ajouts et 193 suppressions
  1. 4 0
      commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlAgreementInsCompanyVo.java
  2. 10 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/component/RequestComponent.java
  3. 10 0
      tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java
  4. 43 48
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DaJiaCrawlerQuoteResultsVoBuild.java
  5. 4 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerProposalNoSaveRequest.java
  6. 6 6
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  7. 2 2
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java
  8. 78 46
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java
  9. 1 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java
  10. 0 0
      tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java
  11. 26 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/build/HuaNongCrawlerQuoteResultsVoBuild.java
  12. 4 0
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/build/HuaTaiCrawlerQuoteResultsVoBuild.java
  13. 1 1
      tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/entity/po/HtCrawlerOrder.java
  14. 11 3
      tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java
  15. 2 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  16. 2 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java
  17. 29 18
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java
  18. 18 3
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java
  19. 0 1
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKHttpAPIService.java
  20. 3 2
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/service/TKSimpleService.java
  21. 32 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java
  22. 51 1
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java
  23. 2 2
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  24. 1 1
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/build/ZmCrawlerQuoteResultVoBuild.java
  25. 48 18
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java
  26. 11 5
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerSaveQuoteInfoRequestBuild.java
  27. 18 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerSaveQuoteInfoRequest.java
  28. 1 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/enums/ResponseCode.java
  29. 10 5
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerOrderServiceImpl.java
  30. 14 16
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java
  31. 12 0
      tenant/organization/src/main/java/com/jzg/organization/client/PlatformClient.java
  32. 2 2
      tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java
  33. 1 1
      tenant/organization/src/main/java/com/jzg/organization/service/PtlSchemeService.java
  34. 39 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java
  35. 2 0
      tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml
  36. 8 7
      tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

+ 4 - 0
commons/src/main/java/com/jzg/commons/entity/scheme/vo/PtlAgreementInsCompanyVo.java

@@ -4,6 +4,7 @@ import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.PtlAgreement;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteEchoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.entity.vo.InsCompanyClauseVo;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
@@ -47,4 +48,7 @@ public class PtlAgreementInsCompanyVo extends EsmInsCompany implements Serializa
     @Schema(description = "费用")
     private QuoteEchoVo.OrdersCostsVo costs;
 
+    @Schema(description = "国任特约选中列表(车主与投保人不一致时返回车主约定T0028)")
+    private List<InsCompanyClauseVo> specialSelectedList;
+
 }

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

@@ -291,6 +291,16 @@ public class RequestComponent {
                 .headers(setHeaders(headers))
                 .retrieve()
                 .toEntity(responseClass)
+                .timeout(Duration.ofSeconds(60))
+                .onErrorMap(ReadTimeoutException.class, ex ->
+                        new WebClientResponseException(
+                                504,
+                                "第三方接口读取超时:" + url,
+                                HttpHeaders.EMPTY,
+                                null,
+                                null
+                        )
+                )
                 .block();
     }
 

+ 10 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateUtil.java

@@ -419,6 +419,16 @@ public class DateUtil {
     private static final DateTimeFormatter INPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
     private static final DateTimeFormatter OUTPUT_FORMAT = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
 
+    /**
+     * 获取投保日期的下一天0点(北京时间)并转为UTC ISO8601格式
+     * 驾意险起保日期默认为投保日期的下一天的0点
+     */
+    public static String getNextDayMidnightUtc() {
+        LocalDate tomorrow = LocalDate.now().plusDays(1);
+        String beijingTime = tomorrow.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + " 00:00:00";
+        return toUtcDateTime(beijingTime);
+    }
+
     /**
      * 将北京时间(yyyy-MM-dd HH:mm:ss)转换为UTC时间(ISO8601格式)
      */

+ 43 - 48
tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DaJiaCrawlerQuoteResultsVoBuild.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.dajia.crawler.build;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
@@ -16,8 +17,11 @@ import com.jzg.quotation.dajia.crawler.entity.request.quote.BusinessInsuranceDTO
 import com.jzg.quotation.dajia.crawler.entity.request.quote.CompulsoryInsuranceDTO;
 import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerOrderListRevisedResponse;
 import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerSaveResponse;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
 import org.springframework.util.ObjectUtils;
 
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -29,6 +33,8 @@ import java.util.stream.Collectors;
  **/
 public final class DaJiaCrawlerQuoteResultsVoBuild {
 
+    private static final Logger log = LogManager.getLogger(DaJiaCrawlerQuoteResultsVoBuild.class);
+
     private DaJiaCrawlerQuoteResultsVoBuild() {
         throw new IllegalStateException("Utility class");
     }
@@ -71,6 +77,7 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         quoteResultsVo.setCiEndDate(compulsoryInsuranceProductInfo.getEndDate());
         quoteResultsVo.setBiStartDate(productInfo.getStartDate());
         quoteResultsVo.setBiEndDate(productInfo.getEndDate());
+        log.info("构建返回信息:{}",JSONObject.toJSONString(quoteResultsVo));
         return quoteResultsVo;
     }
 
@@ -156,9 +163,14 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         BusinessInsuranceDTO businessInsurance = daJiaCrawlerSaveResponse.getBusinessInsurance(); // 商业险
         if (!ObjectUtils.isEmpty(compulsoryInsurance)) {
             scoreVo.setJqLossRation(StringUtils.isNotEmpty(compulsoryInsurance.getCoefficientInfo().getLossRatioCi()) ? compulsoryInsurance.getCoefficientInfo().getLossRatioCi() : null);
+            scoreVo.setCiClaims(String.valueOf(new BigDecimal(compulsoryInsurance.getCoefficientInfo().getLastPolicyNum()).intValue()));
+            scoreVo.setJqRenewal(compulsoryInsurance.getCoefficientInfo().getRenewalFrequency());
         }
-        if (!ObjectUtils.isEmpty(businessInsurance)) {
+        boolean sy = CollectionUtil.isNotEmpty(businessInsurance.getItemKinds());
+        if (sy) {
             scoreVo.setSyLossRation(StringUtils.isNotEmpty(businessInsurance.getCoefficientInfo().getLossRatioBi()) ? businessInsurance.getCoefficientInfo().getLossRatioBi() : null);
+            scoreVo.setBiClaims(String.valueOf(new BigDecimal(businessInsurance.getCoefficientInfo().getLastPolicyNum()).intValue()));
+            scoreVo.setSyRenewal(businessInsurance.getCoefficientInfo().getRenewalFrequency());
         }
         // 总赔付率 违章评分 高速风险分
         String carIllegalScore;
@@ -175,13 +187,9 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         CompulsoryInsuranceDTO.CoefficientInfoDTO coefficientInfo = daJiaCrawlerSaveResponse.getCompulsoryInsurance().getCoefficientInfo();
         JSONArray scoreArray = new JSONArray();
         scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","交强定价评分")
-                .fluentPut("scoreKey","jqPubScores")
-                .fluentPut("score",compulsoryInsurance.getCoefficientInfo().getLossRatioCi()));
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业定价评分")
-                .fluentPut("scoreKey","syPubScores")
-                .fluentPut("score",businessInsurance.getCoefficientInfo().getLossRatioBi()));
+                .fluentPut("scoreName","交强类型评分")
+                .fluentPut("scoreKey","pubScores")
+                .fluentPut("score",compulsoryInsurance.getCoefficientInfo().getPubScores()));
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","违章评分")
                 .fluentPut("scoreKey","carIllegalScore")
@@ -191,54 +199,41 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
                 .fluentPut("scoreKey","highwayScore")
                 .fluentPut("score",highwayScore));
         scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","醉酒驾驶行为违法次数")
-                .fluentPut("scoreKey","drunkTotalCoef")
-                .fluentPut("score",coefficientInfo.getDrunkTotalCoef()));
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","理赔调整系数")
-                .fluentPut("scoreKey","claimAdjustValue")
-                .fluentPut("score",coefficientInfo.getClaimAdjustValue()));
-        scoreVo.setScoreJson(scoreArray);
+                .fluentPut("scoreName","上年保单出险次数")
+                .fluentPut("scoreKey","lastPolicyNum")
+                .fluentPut("score",coefficientInfo.getLastPolicyNum()));
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","交强险手续费")
                 .fluentPut("scoreKey","handFeeCi")
                 .fluentPut("score",coefficientInfo.getHandFeeCi()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业险手续费")
-                .fluentPut("scoreKey","handFeeBi")
-                .fluentPut("score",coefficientInfo.getHandFeeBi()));
-        scoreVo.setScoreJson(scoreArray);
         scoreArray.add(new JSONObject()
                 .fluentPut("scoreName","续保次数")
                 .fluentPut("scoreKey","renewalFrequency")
                 .fluentPut("score",coefficientInfo.getRenewalFrequency()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","违法调整系数")
-                .fluentPut("scoreKey","carIllegalScore")
-                .fluentPut("score",coefficientInfo.getCarIllegalScore()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业险连续承保年数")
-                .fluentPut("scoreKey","insureYears")
-                .fluentPut("score",coefficientInfo.getInsureYears()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","商业险建议折扣")
-                .fluentPut("scoreKey","suggestedDiscount")
-                .fluentPut("score",coefficientInfo.getSuggestedDiscount()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","无赔款优待系数")
-                .fluentPut("scoreKey","totalCoefNum")
-                .fluentPut("score",coefficientInfo.getTotalCoefNum()));
-        scoreVo.setScoreJson(scoreArray);
-        scoreArray.add(new JSONObject()
-                .fluentPut("scoreName","无赔优系数级别")
-                .fluentPut("scoreKey","claimAdjustLvl")
-                .fluentPut("score",coefficientInfo.getClaimAdjustLvl()));
-        scoreVo.setScoreJson(scoreArray);
+        if (sy){
+            BusinessInsuranceDTO.CoefficientInfoDTO coefficientInfo1 = businessInsurance.getCoefficientInfo();
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","商业险建议折扣")
+                    .fluentPut("scoreKey","entireDiscount")
+                    .fluentPut("score",coefficientInfo1.getEntireDiscount()));
+            scoreVo.setScoreJson(scoreArray);
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","商业险手续费")
+                    .fluentPut("scoreKey","handFeeBi")
+                    .fluentPut("score",coefficientInfo1.getHandFeeBi()));
+            scoreVo.setScoreJson(scoreArray);
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","无赔款优待系数")
+                    .fluentPut("scoreKey","totalCoefNum")
+                    .fluentPut("score",coefficientInfo1.getTotalCoefNum()));
+            scoreVo.setScoreJson(scoreArray);
+            scoreArray.add(new JSONObject()
+                    .fluentPut("scoreName","商业类型评分")
+                    .fluentPut("scoreKey","pubScores")
+                    .fluentPut("score",coefficientInfo1.getPubScores()));
+            scoreVo.setScoreJson(scoreArray);
+         }
         return scoreVo;
     }
+
 }

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

@@ -31,7 +31,10 @@ public class GuoRenCrawlerProposalNoSaveRequest implements Serializable {
     private GuoRenCrawlerCalculationPremiumData.CiDTO ci;
 
     public GuoRenCrawlerProposalNoSaveRequest(QuoteVo quoteVo, GuoRenCrawlerCalculationPremiumData guoRenCrawlerCalculationPremiumData, GuoRenCrawlerCalculationPremiumRequest calculationPremiumRequest) {
+        GuoRenCrawlerCalculationPremiumData.CiDTO ciDto = guoRenCrawlerCalculationPremiumData.getCi();
+        ciDto.setPrptengageList(calculationPremiumRequest.getCi().getPrptengageList());
         GuoRenCrawlerCalculationPremiumData.BiDTO biDto = guoRenCrawlerCalculationPremiumData.getBi();
+        biDto.setPrptengageList(calculationPremiumRequest.getBi().getPrptengageList());
         this.bc = calculationPremiumRequest.getBc();
         this.bc.getPrpTmain().setCaptcha("");
         this.bc.getPrpTmain().setEProposalFlag("1");
@@ -42,8 +45,8 @@ public class GuoRenCrawlerProposalNoSaveRequest implements Serializable {
             guoRenCrawlerCalculationPremiumData.getBi().getCiInsureDemand().setTonCount(quoteVo.getCarInfoVo().getTonCount());
             guoRenCrawlerCalculationPremiumData.getBi().getCiInsureDemand().setSeatCount(quoteVo.getCarInfoVo().getSeatCount());
         }
+        this.ci = ciDto;
         this.bi = biDto;
-        this.ci = guoRenCrawlerCalculationPremiumData.getCi();
         // 将试算响应中的报价ID回填到bc中
         fillProposalNoFromResponse(guoRenCrawlerCalculationPremiumData);
     }

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

@@ -214,23 +214,23 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
         crawlerCalculationPremiumRequest.getCi().getPrpTmain().setProposalNo(
                 calculationPremium.getCi().getPrpTmain().getProposalNo());
         crawlerCalculationPremiumRequest.getCi().setCiInsureDemand(calculationPremium.getCi().getCiInsureDemand());
-        crawlerCalculationPremiumRequest.getCi().setPrptengageList(calculationPremium.getCi().getPrptengageList());
+        crawlerCalculationPremiumRequest.getCi().getPrptengageList().addAll(calculationPremium.getCi().getPrptengageList());
         // BC也需要回填proposalNo/demandNo/certiNo/carsonlyid
         if (calculationPremium.getBc() != null && calculationPremium.getBc().getPrpTmain() != null) {
-            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getProposalNo())) {
+            if (StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getProposalNo())) {
                 crawlerCalculationPremiumRequest.getBc().getPrpTmain().setProposalNo(
                         calculationPremium.getBc().getPrpTmain().getProposalNo());
             }
-            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getDemandNo())) {
+            if (StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getDemandNo())) {
                 crawlerCalculationPremiumRequest.getBc().getPrpTmain().setDemandNo(
                         calculationPremium.getBc().getPrpTmain().getDemandNo());
             }
-            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getCertiNo())) {
+            if (StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getCertiNo())) {
                 String certiNo = calculationPremium.getBc().getPrpTmain().getCertiNo();
                 crawlerCalculationPremiumRequest.getBc().getPrpTmain().setCertiNo(certiNo);
                 crawlerCalculationPremiumRequest.getBc().getPrpTmain().setCertino1(certiNo);
             }
-            if (org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getCarsonlyid())) {
+            if (StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getCarsonlyid())) {
                 crawlerCalculationPremiumRequest.getBc().getPrpTmain().setCarsonlyid(
                         calculationPremium.getBc().getPrpTmain().getCarsonlyid());
             }
@@ -242,7 +242,7 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
             crawlerCalculationPremiumRequest.getBi().getPrpTmain().setProposalNo(
                     calculationPremium.getBi().getPrpTmain().getProposalNo());
             crawlerCalculationPremiumRequest.getBi().setCiInsureDemand(calculationPremium.getBi().getCiInsureDemand());
-            crawlerCalculationPremiumRequest.getBi().setPrptengageList(calculationPremium.getBi().getPrptengageList());
+            crawlerCalculationPremiumRequest.getBi().getPrptengageList().addAll(calculationPremium.getCi().getPrptengageList());
         }
         return guoRenCrawlerRequestComponent.calculationPremium(crawlerCalculationPremiumRequest, headers).getData();
     }

+ 2 - 2
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/component/HengBangCrawlerRequestComponent.java

@@ -150,7 +150,7 @@ public class HengBangCrawlerRequestComponent {
         headers.set(HttpHeaders.ACCEPT, "*/*");
         headers.set(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencode;charset=utf-8");
         headers.set(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/135.0.0.0 Safari/537.36");
-        headers.set(HttpHeaders.AUTHORIZATION, getAuthorization(username));
+        headers.set(HttpHeaders.AUTHORIZATION, RequestConstant.BEARER + getAuthorization(username));
         HbCrawlerQueryUserInfoResponse response = requestComponent.get(RequestUrl.QUERY_USER_INFO.getRequestUrl(hbCrawlerProperties.getBaseUrl()) + "/" + username, param, RequestUrl.QUERY_USER_INFO.getRequestDescription(), HbCrawlerQueryUserInfoResponse.class, headers);
         return response;
     }
@@ -298,7 +298,7 @@ public class HengBangCrawlerRequestComponent {
         req.setHbEncV("1");
         try {
             ObjectMapper mapper = new ObjectMapper();
-            mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
+            mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
             String json = mapper.writeValueAsString(calculationRequest);
             log.info("提交报价数据请求参数: {}", json);
             req.setHbEncD(HengBangAESUtil.encryptStr(json));

+ 78 - 46
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/entity/request/HbCrawlerCalculationRequest.java

@@ -13,6 +13,7 @@ import lombok.Data;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
 
@@ -81,20 +82,21 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         this.clauseType = "2";
         List<KindInfoVo> kindInfoVoList = quoteVo.getKindInfoVo();
         this.risktype = "0";
-        this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
         if (Objects.nonNull(quoteVo.getCiRiskInfoVo())) {
             this.begintimeCi = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
-            this.begintimeAccident = DateUtil.toUtcDateTime(quoteVo.getCiRiskInfoVo().getStartDate());
+            this.begintimeAccident = DateUtil.getNextDayMidnightUtc();
             this.risktype = "1";
         }
         if (CollUtil.isNotEmpty(kindInfoVoList)) {
             this.epersonliabilityList = getEpersonliabilityList(kindInfoVoList, depreciationPrice);
             this.begintimeBi = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
-            this.begintimeAccident = DateUtil.toUtcDateTime(quoteVo.getBiRiskInfoVo().getStartDate());
+            this.begintimeAccident = DateUtil.getNextDayMidnightUtc();
             this.risktype = "2";
         } else {
             this.epersonliabilityList = new ArrayList<>();
         }
+        // 驾意险列表需在 accidentEpolicyFlag 之前赋值
+        this.accidentInsuranceList = getAccidentInsuranceList(quoteVo.getBiRiskInfoVo(), quoteVo.getAccidentalDrivings());
         this.plyappno = plyappno;
         this.ecarshiptaxPart = "投保人";
         this.taxonomyCode = "02";
@@ -102,14 +104,14 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         this.endtimeBi = "";
         this.endtimeCi = "";
         this.expdisc = "";
-        this.accidentEpolicyFlag = "Y";
+        // 有驾意险时传"Y",无驾意险时传""(与javadoc示例对齐)
+        this.accidentEpolicyFlag = this.accidentInsuranceList.isEmpty() ? "" : "Y";
         this.effectfLag = null;
         this.ecarChargingPosts = new ArrayList<>();
         this.carInsureDevices = new ArrayList<>();
         this.outofwarrantytype = "N";
         this.drivingtype = "";
-        this.endtimeAccident = "";
-        this.accidentInsuranceList = getAccidentInsuranceList(quoteVo.getBiRiskInfoVo(), quoteVo.getAccidentalDrivings());
+        this.endtimeAccident = null;
     }
 
     public List<EpersonliabilityDTO> getEpersonliabilityList(List<KindInfoVo> kindInfoVoList, String depreciationPrice) {
@@ -120,25 +122,58 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
             epersonliabilityDTO.setLiabname(kindInfoVo.getKindName());
             // kindcode "101"(机动车损失保险)的保额必须使用车辆折旧价(实际价值),
             // 否则保司会校验"协商价格范围建议在实际价值上下30%浮动"并拒绝
+            // 注意:正确请求中kindcode "101"/"102"/"115"不包含unitAmount/quantity字段
             if ("101".equals(kindInfoVo.getKindCode()) && depreciationPrice != null) {
-                epersonliabilityDTO.setLiabamt(depreciationPrice);
-                epersonliabilityDTO.setUnitAmount(depreciationPrice);
+                epersonliabilityDTO.setLiabamt(parseNumeric(depreciationPrice));
+            } else if (Arrays.asList("102", "115").contains(kindInfoVo.getKindCode())) {
+                epersonliabilityDTO.setLiabamt(parseNumeric(kindInfoVo.getAmount()));
             } else if (!"116".equals(kindInfoVo.getKindCode())) {
                 // kindcode "116"不需要liabamt和unitAmount
-                epersonliabilityDTO.setLiabamt(kindInfoVo.getAmount());
-                epersonliabilityDTO.setUnitAmount(kindInfoVo.getUnitAmount());
+                Object liabamt = parseNumeric(kindInfoVo.getAmount());
+                epersonliabilityDTO.setLiabamt(liabamt);
+                Object unitAmount = parseNumeric(kindInfoVo.getUnitAmount());
+                // "103"(司机)/"104"(乘客)在正确请求中必须有unitAmount,数据缺失时兜底为liabamt
+                if (unitAmount == null && Arrays.asList("103", "104").contains(kindInfoVo.getKindCode())) {
+                    unitAmount = liabamt;
+                }
+                epersonliabilityDTO.setUnitAmount(unitAmount);
             }
             if ("116".equals(kindInfoVo.getKindCode())) {
                 // 道路救援服务特约条款:只需要serviceTimes字段
                 epersonliabilityDTO.setServiceTimes(kindInfoVo.getServiceTimes() != null ? kindInfoVo.getServiceTimes() : "2");
             } else {
-                epersonliabilityDTO.setQuantity(kindInfoVo.getQuantity() != null ? kindInfoVo.getQuantity() : "4");
+                // kindInfoVo有quantity才设置,否则不传(避免默认值"4"篡改司机险等正确值)
+                // "103"(司机)正确请求中quantity=1,数据缺失时兜底
+                String qty = kindInfoVo.getQuantity();
+                if (qty != null) {
+                    epersonliabilityDTO.setQuantity(parseNumeric(qty));
+                } else if ("103".equals(kindInfoVo.getKindCode())) {
+                    epersonliabilityDTO.setQuantity(1);
+                }
             }
             epersonliabilityDTOList.add(epersonliabilityDTO);
         }
         return epersonliabilityDTOList;
     }
 
+    /**
+     * 将字符串解析为数值类型,确保Jackson序列化为数字而非字符串
+     */
+    private static Object parseNumeric(String value) {
+        if (value == null) {
+            return null;
+        }
+        try {
+            if (value.contains(".")) {
+                return new java.math.BigDecimal(value);
+            } else {
+                return Long.valueOf(value);
+            }
+        } catch (NumberFormatException e) {
+            return value;
+        }
+    }
+
     public List<AccidentInsuranceDTO> getAccidentInsuranceList(RiskInfoVo biRiskInfoVo, List<AccidentalDrivingVo> accidentalDrivings) {
         if (accidentalDrivings == null || accidentalDrivings.isEmpty()) {
             return new ArrayList<>();
@@ -154,15 +189,9 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         AccidentInsuranceDTO dto = new AccidentInsuranceDTO();
         dto.setNonriskcode(vo.getProductCode().split("_")[1]);
         dto.setProgramcode(vo.getProductCode());
-        dto.setProgramname(vo.getProductName());
-        if (biRiskInfoVo != null && StringUtils.isNotBlank(biRiskInfoVo.getStartDate()) && StringUtils.isNotBlank(biRiskInfoVo.getEndDate())) {
-            dto.setBegintime(DateUtil.toUtcDateTime(DateUtil.getCurrentDate(1) + " 00:00:00"));
-            dto.setEndtime(DateUtil.toUtcDateTime(DateUtil.getNextYearDateStrTranfer(DateUtil.getCurrentDate(1) + " 00:00:00")));
-        }
-        dto.setCompanycode("0107");
-        dto.setRelationcarowner("a");
-        dto.setSuminsured("525000");
-        dto.setSumgrosspremium(vo.getPremium());
+        // programname/companycode/begintime/endtime/relationcarowner 正确请求中均不包含,移除以避免保司API 500
+        dto.setSuminsured(parseNumeric("525000"));
+        dto.setSumgrosspremium(parseNumeric(vo.getPremium()));
         dto.setIfdefault(true);
         dto.setBuynum(vo.getQuantity());
         dto.setGgriskprogramclauselist(getGgriskprogramclauseList(vo.getProductCode().split("_")[1], vo.getProductCode()));
@@ -243,11 +272,11 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         detail1.setSerialno(1);
         detail1.setKindcode("1119066");
         detail1.setKindname("机动车辆驾乘意外伤害保险意外身故保险责任(2024款)");
-        detail1.setKindrate("0.098");
-        detail1.setKindunitinsured("50000");
-        detail1.setKindsuminsured("250000");
-        detail1.setKindunitpremium("4.9");
-        detail1.setKindgrosspremium("54");
+        detail1.setKindrate(parseNumeric("0.098"));
+        detail1.setKindunitinsured(parseNumeric("50000"));
+        detail1.setKindsuminsured(parseNumeric("250000"));
+        detail1.setKindunitpremium(parseNumeric("4.9"));
+        detail1.setKindgrosspremium(parseNumeric("54"));
         list.add(detail1);
 
         // 机动车辆驾乘意外伤害保险意外残疾保险责任(2024款)
@@ -257,11 +286,11 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         detail2.setSerialno(2);
         detail2.setKindcode("1119067");
         detail2.setKindname("机动车辆驾乘意外伤害保险意外残疾保险责任(2024款)");
-        detail2.setKindrate("0.09166");
-        detail2.setKindunitinsured("30000");
-        detail2.setKindsuminsured("240000");
-        detail2.setKindunitpremium("2.75");
-        detail2.setKindgrosspremium("22");
+        detail2.setKindrate(parseNumeric("0.09166"));
+        detail2.setKindunitinsured(parseNumeric("30000"));
+        detail2.setKindsuminsured(parseNumeric("240000"));
+        detail2.setKindunitpremium(parseNumeric("2.75"));
+        detail2.setKindgrosspremium(parseNumeric("22"));
         list.add(detail2);
 
         // 附加机动车辆驾乘意外伤害医疗保险(2024款)
@@ -271,11 +300,11 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         detail3.setSerialno(3);
         detail3.setKindcode("1119065");
         detail3.setKindname("附加机动车辆驾乘意外伤害医疗保险(2024款)");
-        detail3.setKindrate("1.0001");
-        detail3.setKindunitinsured("3000");
-        detail3.setKindsuminsured("24000");
-        detail3.setKindunitpremium("3");
-        detail3.setKindgrosspremium("24");
+        detail3.setKindrate(parseNumeric("1.0001"));
+        detail3.setKindunitinsured(parseNumeric("3000"));
+        detail3.setKindsuminsured(parseNumeric("24000"));
+        detail3.setKindunitpremium(parseNumeric("3"));
+        detail3.setKindgrosspremium(parseNumeric("24"));
         list.add(detail3);
 
         return list;
@@ -311,12 +340,13 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private static final long serialVersionUID = 4972640996367640469L;
 
         private String kindcode;
-        private String liabamt;
+        // 使用Object类型确保liabamt序列化为数字而非字符串,匹配保司API期望的数字类型
+        private Object liabamt;
         private String liabname;
         private String model = "0";
-        private String quantity;
+        private Object quantity;
         private String serviceTimes;
-        private String unitAmount;
+        private Object unitAmount;
     }
 
     @Data
@@ -333,8 +363,9 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private String programname;
         private String companycode;
         private String resourcetype;
-        private String suminsured;
-        private String sumgrosspremium;
+        // 使用Object类型确保序列化为数字而非字符串,匹配保司API期望的数字类型
+        private Object suminsured;
+        private Object sumgrosspremium;
         private String sumuwpricetaxtotal;
         private Boolean ifdefault;
         private String seatcount;
@@ -353,7 +384,7 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private String risk1205field;
         private String risk1283items;
         private String drivingtype;
-        private String relationcarowner = "a";
+        private String relationcarowner;
     }
 
     @Data
@@ -407,11 +438,12 @@ public class HbCrawlerCalculationRequest extends HbBaseRequest {
         private Integer serialno;
         private String kindcode;
         private String kindname;
-        private String kindrate;
-        private String kindunitinsured;
-        private String kindsuminsured;
-        private String kindunitpremium;
-        private String kindgrosspremium;
+        // 使用Object类型确保序列化为数字,匹配保司API期望的数字类型
+        private Object kindrate;
+        private Object kindunitinsured;
+        private Object kindsuminsured;
+        private Object kindunitpremium;
+        private Object kindgrosspremium;
         private String itemDetailCode;
         private String itemDetailName;
         private String kindInd;

+ 1 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/service/Impl/HengBangCrawlerRequestImpl.java

@@ -240,6 +240,7 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
                 .filter(e -> StrUtil.isNotEmpty(e.getProductCode()))
                 .forEach(e -> accidentList.add(HbCrawlerCalculationRequest.convertToAccidentInsuranceDTO(quoteVo.getBiRiskInfoVo(), e)));
         calculationRequest.setAccidentInsuranceList(accidentList);
+        calculationRequest.setAccidentEpolicyFlag(accidentList.isEmpty() ? "" : "Y");
     }
 
     // 重复投保提取时间

Fichier diff supprimé car celui-ci est trop grand
+ 0 - 0
tenant/insurance/quotation-hengbang/src/main/java/com/jzg/quotation/hengbang/crawler/utils/HengBangAESUtil.java


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

@@ -10,6 +10,7 @@ import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.commons.component.ConversionOfQuoteInformation;
 import com.jzg.quotation.huanong.crawler.entity.response.HuaNongCrawlerQuotedPriceResponse;
 import com.jzg.quotation.huanong.crawler.entity.response.HuaNongCrawlerSaveResponse;
+import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.huanong.enums.dictionary.Risk;
 import org.springframework.util.ObjectUtils;
 
@@ -60,12 +61,16 @@ public final class HuaNongCrawlerQuoteResultsVoBuild {
                 quoteResultsVo.getCosts().setCiPremium(String.valueOf(contractDTO.getContractMain().getTotalPremium()));
                 quoteResultsVo.getCosts().setVvTax(String.valueOf(contractDTO.getTax().getSumTax()));
                 quoteResultsVo.setCiPolicyNumber(contractDTO1.getContractMain().getContractNo());
+                // 交强转续保标识(按RenewalEnum映射)
+                quoteResultsVo.getScoreVo().setJqRenewal(convertRenewalFlag(contractDTO.getContractMain().getRenewalFlag()));
             } else {
                 // 商业险
                 buildKindInfo(quoteVo.getKindInfoVo(), contractDTO.getCoverage());
                 buildRiskInfoVo(quoteVo.getBiRiskInfoVo(), contractDTO.getContractMain(), contractDTO.getPlatFormMessage(), false);
                 quoteResultsVo.getCosts().setBiPremium(String.valueOf(contractDTO.getContractMain().getTotalPremium()));
                 quoteResultsVo.setBiPolicyNumber(contractDTO1.getContractMain().getContractNo());
+                // 商业转续保标识(按RenewalEnum映射)
+                quoteResultsVo.getScoreVo().setSyRenewal(convertRenewalFlag(contractDTO.getContractMain().getRenewalFlag()));
             }
         });
         //设置评分
@@ -144,4 +149,25 @@ public final class HuaNongCrawlerQuoteResultsVoBuild {
         );
     }
 
+    /**
+     * 将华农接口返回的renewalFlag值按RenewalEnum枚举映射为code字符串
+     * @param renewalFlag 接口原始值
+     * @return RenewalEnum对应的code字符串,匹配失败返回null
+     */
+    private static String convertRenewalFlag(String renewalFlag) {
+        if (!org.springframework.util.StringUtils.hasText(renewalFlag)) {
+            return null;
+        }
+        //    New(1,"新保"),
+        //    Renewal(2,"续保"),
+        //    Transfer(3,"转保");
+        if(renewalFlag.equals("0")){
+            // 0 为转保
+            return "3";
+        }else{
+            return "2";
+        }
+
+    }
+
 }

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

@@ -51,6 +51,10 @@ public class HuaTaiCrawlerQuoteResultsVoBuild {
                 .fluentPut("score",quoteResponseData.getApplicationdto().getBicategory()));
         quoteResultsVo.getScoreVo().setScoreJson(scoreJson);
 
+        //续保标志0否1是 (跟python 一致)
+        quoteResultsVo.getScoreVo().setJqRenewal("转入".equals(quoteResponseData.getApplicationdto().getCustombusinesstype_ci()) ? "0" : "1");
+        quoteResultsVo.getScoreVo().setSyRenewal("转入".equals(quoteResponseData.getApplicationdto().getCustombusinesstype_bi()) ? "0" : "1");
+
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         return quoteResultsVo;
     }

+ 1 - 1
tenant/insurance/quotation-huatai/src/main/java/com/jzg/quotation/huatai/crawler/entity/po/HtCrawlerOrder.java

@@ -30,7 +30,7 @@ public class HtCrawlerOrder {
     private String ciCategory;
 
     /**
-     * 核保额外需要的参数  交强评分
+     * 核保额外需要的参数  商业评分
      */
     private String biCategory;
 }

+ 11 - 3
tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java

@@ -1,6 +1,8 @@
 package com.jzg.quotation.renbaonew.crawler.service.impl;
 
 import cn.hutool.json.JSONUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
@@ -839,6 +841,8 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
                     Map<String, Object> data = (Map<String, Object>) proposalInfo.get("data");
                     if (data != null) {
                         QuoteResultsVo.ScoreVo scoreVo = resultsVo.getScoreVo();
+                        JSONArray scoreJson = new JSONArray();
+
                         if (scoreVo == null) {
                             scoreVo = new QuoteResultsVo.ScoreVo();
                             resultsVo.setScoreVo(scoreVo);
@@ -846,12 +850,16 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
                         // 获取商业险评分
                         Map<String, Object> prpCmain = (Map<String, Object>) data.get("PrpCmain");
                         if (prpCmain != null && prpCmain.get("piccscore") != null) {
-                            scoreVo.setSyLossRation(prpCmain.get("piccscore").toString());
+                            scoreJson.add(new JSONObject()
+                                    .fluentPut("scoreName", "商业险评分")
+                                    .fluentPut("score", prpCmain.get("piccscore").toString()));
                         }
                         // 获取交强险评分
                         Map<String, Object> prpCmainCI = (Map<String, Object>) data.get("prpCmainCI");
                         if (prpCmainCI != null && prpCmainCI.get("piccscore") != null) {
-                            scoreVo.setJqLossRation(prpCmainCI.get("piccscore").toString());
+                            scoreJson.add(new JSONObject()
+                                    .fluentPut("scoreName", "交强险评分")
+                                    .fluentPut("score", prpCmainCI.get("piccscore").toString()));
                         }
                     }
                 }
@@ -909,7 +917,7 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
             throw new SystemException("查询订单异常");
         }
 
-        // ③ 提取交强/商业单号,以及驾意险信息 —  
+        // ③ 提取交强/商业单号,以及驾意险信息 —
         String syProposalNo = "";
         String jqProposalNo = "";
         List<Map<String, String>> unitNoCarDataList = new ArrayList<>();

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

@@ -358,7 +358,7 @@ public class QuoteVerificationAspect {
         BigDecimal exportPercent = convertPercent(costType.getExport());
 
         // 计算应收金额
-        BigDecimal taxablePremium = premium.multiply(taxFactor);
+        BigDecimal taxablePremium = premium.divide(taxFactor,5,RoundingMode.HALF_EVEN);
 
         // 计算应付金额(保费 * 出口比例,保留2位小数)
         BigDecimal payable = premium.multiply(exportPercent.setScale(5, RoundingMode.DOWN));
@@ -368,7 +368,7 @@ public class QuoteVerificationAspect {
         BigDecimal commission = taxablePremium.multiply(commissionRatio).setScale(5, RoundingMode.HALF_EVEN);
         BigDecimal follow = taxablePremium.multiply(followRatio).setScale(5, RoundingMode.HALF_EVEN);
         setCommission.accept(insFeeOrders, commission);
-        setFollow.accept(insFeeOrders, commission);
+        setFollow.accept(insFeeOrders, follow);
         // modify by lipf, 2026年6月16日15:35:09  加投比例,不需要根据平台/私有进行1.06的计算
 
         BigDecimal addAmount = premium.multiply(addThrowPercent).setScale(5, RoundingMode.HALF_EVEN);

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

@@ -837,7 +837,8 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }
         // 保存比例调整记录
         InsFeeOrderRecord record = new InsFeeOrderRecord(param);
-        recordService.updateById(record);
+        // modify by lipf 2026年6月23日11:08:26 解决原先没有插入数据的问题,并且调整了表结构(主键由order_no调整为id),来保证多次调整不会报错
+        recordService.save(record);
         return HttpResult.ok();
     }
 

+ 29 - 18
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeOrdersServiceImpl.java

@@ -24,16 +24,14 @@ import com.jzg.quotation.summary.service.InsFeeOrdersService;
 import com.jzg.quotation.summary.service.InsOrdersCostsService;
 import com.jzg.quotation.summary.service.InsOrdersService;
 import jakarta.annotation.Resource;
-import jakarta.servlet.http.HttpServletRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
-import org.springframework.web.context.request.RequestContextHolder;
-import org.springframework.web.context.request.ServletRequestAttributes;
 
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -61,15 +59,6 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
     private InsFeeOrdersMapper insFeeOrdersMapper;
 
 
-    private String getSystemCode() {
-        //如果是APP登录的话 则传递SystemCode的头部字段
-        if (baseController.getUserSystemCode().equals("APP")) {
-            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
-            return request.getHeader("system_code");
-        }
-        return baseController.getUserSystemCode();
-    }
-
     /**
      * 订单审核时调整费用
      *
@@ -162,7 +151,7 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
             Integer withTax, BigDecimal taxRate, int scale) {
 
         // 计算基数
-        BigDecimal base = BigDecimal.ZERO;
+        BigDecimal base;
         if (withTax == 0) {
             // 不含税:保费 / 1.06
             base = premium.divide(taxRate, scale, RoundingMode.HALF_EVEN);
@@ -172,8 +161,8 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         }
 
         // ===================== 按比例计算各项费用 =====================
-        BigDecimal commission = base.multiply(commissionRatio).setScale(scale, RoundingMode.HALF_EVEN);
         BigDecimal inlet = base.multiply(inletRatio).setScale(scale, RoundingMode.HALF_EVEN);
+        BigDecimal commission = base.multiply(commissionRatio).setScale(scale, RoundingMode.HALF_EVEN);
         BigDecimal follow = base.multiply(followRatio).setScale(scale, RoundingMode.HALF_EVEN);
 
         // 加投直接乘
@@ -183,7 +172,8 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
         BigDecimal exportKeepPoint = premium.multiply(exportKeepPointRatio).setScale(scale, RoundingMode.HALF_EVEN);
         // 留点比例直接乘, modify by lipf ,留点比例在infFeeOrder中计算得到。这里直接使用 2026年6月16日17:32:09, 为了保持金额一致,留点比例不适用百分比乘积,而是使用金额相减
         // BigDecimal keepPoint = premium.multiply(keepPointRatio).setScale(scale, RoundingMode.HALF_EVEN);
-        BigDecimal keepPoint = BigDecimalUtil.subtract(BigDecimalUtil.add(commission,addThrow),export);
+        BigDecimal keepPoint = BigDecimalUtil.subtract(BigDecimalUtil.add(inlet,addThrow),export);
+        log.info("计算留点:inlet=[{}],addThrow=[{}].export=[{}]", inlet, addThrow, export);
 
         // 赋值到实体(自动匹配 jq / sy / jy)
         if ("jq".equals(type)) {
@@ -194,7 +184,14 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
             insFeeOrders.setJqKeepPointPremium(keepPoint);
             insFeeOrders.setJqExportPremium(export);
             insFeeOrders.setJqExportKeepPointPremium(exportKeepPoint);
-            insFeeOrders.setJqPayablePremium(commission);
+            insFeeOrders.setJqPayablePremium(export);
+
+            // add by lipf, 2026年6月23日10:42:36  更新具体某个险种的出口费用的时候,同步更新总的出口费用
+            List<BigDecimal> exportAmount = new ArrayList<>();
+            exportAmount.add(insFeeOrders.getJqExportPremium());
+            exportAmount.add(insFeeOrders.getSyExportPremium());
+            exportAmount.add(insFeeOrders.getJyExportPremium());
+            insFeeOrders.setTotalPayablePremium(BigDecimalUtil.add(exportAmount));
         } else if ("sy".equals(type)) {
             insFeeOrders.setSyCommissionPremium(commission);
             insFeeOrders.setSyReceivablePremium(inlet);
@@ -203,7 +200,14 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
             insFeeOrders.setSyKeepPointPremium(keepPoint);
             insFeeOrders.setSyExportPremium(export);
             insFeeOrders.setSyExportKeepPointPremium(exportKeepPoint);
-            insFeeOrders.setSyPayablePremium(commission);
+            insFeeOrders.setSyPayablePremium(export);
+
+            // add by lipf, 2026年6月23日10:42:36  更新具体某个险种的出口费用的时候,同步更新总的出口费用
+            List<BigDecimal> exportAmount = new ArrayList<>();
+            exportAmount.add(insFeeOrders.getJqExportPremium());
+            exportAmount.add(insFeeOrders.getSyExportPremium());
+            exportAmount.add(insFeeOrders.getJyExportPremium());
+            insFeeOrders.setTotalPayablePremium(BigDecimalUtil.add(exportAmount));
         } else if ("jy".equals(type)) {
             insFeeOrders.setJyCommissionPremium(commission);
             insFeeOrders.setJyReceivablePremium(inlet);
@@ -212,7 +216,14 @@ public class InsFeeOrdersServiceImpl extends ServiceImpl<InsFeeOrdersMapper, Ins
             insFeeOrders.setJyKeepPointPremium(keepPoint);
             insFeeOrders.setJyExportPremium(export);
             insFeeOrders.setJyExportKeepPointPremium(exportKeepPoint);
-            insFeeOrders.setJyPayablePremium(commission);
+            insFeeOrders.setJyPayablePremium(export);
+
+            // add by lipf, 2026年6月23日10:42:36  更新具体某个险种的出口费用的时候,同步更新总的出口费用
+            List<BigDecimal> exportAmount = new ArrayList<>();
+            exportAmount.add(insFeeOrders.getJqExportPremium());
+            exportAmount.add(insFeeOrders.getSyExportPremium());
+            exportAmount.add(insFeeOrders.getJyExportPremium());
+            insFeeOrders.setTotalPayablePremium(BigDecimalUtil.add(exportAmount));
         }
     }
 

+ 18 - 3
tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java

@@ -9,8 +9,9 @@ import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.TaxInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.util.DateTimeUtils;
-import com.jzg.commons.util.ObjectUtil;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.commons.util.idgen.IdGenerate;
+import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.taikang.crawler.ConvertUtil;
 import com.jzg.quotation.taikang.crawler.cache.RedisCacheUtil;
@@ -20,7 +21,6 @@ import com.jzg.quotation.taikang.crawler.model.entity.TKDateInfo;
 import com.jzg.quotation.taikang.crawler.model.entity.TKOther;
 import com.jzg.quotation.taikang.crawler.model.entity.TKPremium;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.ObjectUtils;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
@@ -137,12 +137,17 @@ public class TkCrawlerQuoteResultsBuild {
         // 设置总费用
         BigDecimal ci = premium.getJqPremium() == null ? BigDecimal.ZERO : premium.getJqPremium();
         BigDecimal bi = premium.getSyPremium() == null ? BigDecimal.ZERO : premium.getSyPremium();
+        BigDecimal jyx = premium.getJyxPremium() == null ? BigDecimal.ZERO : premium.getJyxPremium();
         BigDecimal vv = preciseInitResult.getCarTax().getSumPayment() == null ? BigDecimal.ZERO : preciseInitResult.getCarTax().getSumPayment();
-        BigDecimal total = ci.add(bi).add(vv);
+        BigDecimal total = ci.add(bi).add(jyx).add(vv);
         quoteResultsVo.getCosts().setSumPremium(total.toPlainString());
         // 折扣
         quoteResultsVo.getScoreVo().setJqAdjustRate(preciseInitResult.getCiDisCount() != null ? preciseInitResult.getCiDisCount().toString() : null);
         quoteResultsVo.getScoreVo().setSyAdjustRate(preciseInitResult.getBzDisCount() != null ? preciseInitResult.getBzDisCount().toString() : null);
+        // 交强续保
+        quoteResultsVo.getScoreVo().setJqRenewal(convertRenewalFlag(preciseInitResult.getFlag().getRenewalBZFlag()));
+        // 商业续保
+        quoteResultsVo.getScoreVo().setSyRenewal(convertRenewalFlag(preciseInitResult.getFlag().getRenewalCIFlag()));
         // 设置订单状态
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         // 缓存报价书据数据
@@ -171,4 +176,14 @@ public class TkCrawlerQuoteResultsBuild {
         return quoteResultsVo;
     }
 
+    private static String convertRenewalFlag(String renewalFlag) {
+        if (!StringUtils.hasText(renewalFlag)) {
+            return null;
+        }
+        if (renewalFlag.equals("0")) {
+            return String.valueOf(RenewalEnum.Renewal.getCode());
+        } else {
+            return String.valueOf(RenewalEnum.Transfer.getCode());
+        }
+    }
 }

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

@@ -928,7 +928,6 @@ public class TKHttpAPIService {
         HttpHeaders httpHeaders = new HttpHeaders();
         httpHeaders.add("tkCarRequestToken", token);
         httpHeaders.add("Actiontype", actionType);
-        httpHeaders.add("carssToken", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZXFNYXAiOiJ7XCJmcm9tXCI6XCJ0cGxhdFwiLFwidXNlck5hbWVcIjpcImYyMThlOThlYzBiMmI5Y2IwNTdiNTc1YWNmNzY5YzYyMVwifSIsImlzcyI6InRrLmNuIiwiZXhwIjoxNzc5MTUwNzU4fQ.VOyNqFK-cQ79QsJA4iF1xnjMqYZRYH5IfhqrfIWg6OA");
 
         StringResponse response = client.request(HttpURL.entrance, param, httpHeaders, StringResponse.class);
 

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

@@ -507,7 +507,7 @@ public class TKSimpleService {
         TKAgent agent = new TKAgent();
         agent.setStatus("1");
         agent.setAgentCode(agentCode);
-        agent.setAgentName(agentQueryResult.getAgentName());
+        agent.setAgentName(agentQueryResult.getName());
         agent.setAgentPhone(agentQueryResult.getAgentPhone());
         agent.setAgencyCode(agentQueryResult.getComCode());
         agent.setAgencyName(agentQueryResult.getAgencyName());
@@ -1107,11 +1107,12 @@ public class TKSimpleService {
         // 公司系统的驾意险参数为空证明没有选择驾意险
         if (CollectionUtils.isNotEmpty(accidentalDrivings)) {
             for (AccidentalDrivingVo accidentalDriving : accidentalDrivings) {
-                if (carPlanInfoMap.isEmpty() || accidentalDriving.getRiskCode() == null) {
+                if (carPlanInfoMap.isEmpty() || accidentalDriving.getProductCode() == null) {
                     continue;
                 }
                 TKCarPlanInfo tkCarPlanInfo = carPlanInfoMap.get(accidentalDriving.getProductCode());
                 driverAccidentVo.setIsSelect("1");
+                driverAccidentVo.setQuantity(accidentalDriving.getQuantity());
                 driverAccidentVo.setSelectPlanCode(tkCarPlanInfo.getPlanCode());
                 driverAccidentVo.setQuoteAmountCN(tkCarPlanInfo.getPlanName());
                 driverAccidentVo.setPremium(new BigDecimal(tkCarPlanInfo.getSumPremium()));

+ 32 - 0
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteResultsVoBuild.java

@@ -8,6 +8,8 @@ import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
+import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerQuotationSaveResponse;
 import com.jzg.quotation.taishan.crawler.entity.response.TaiShanCrawlerRiskManagementResponse;
 import lombok.extern.slf4j.Slf4j;
@@ -68,6 +70,24 @@ public class TaiShanCrawlerQuoteResultsVoBuild {
         }
 
         if(riskResponse != null && riskResponse.getResult() != null){
+            // 续保标识逻辑:renewalClass不为空时jq_renewalflag=1,否则=0;sy_renewalflag始终为空
+            String renewalClass = riskResponse.getResult().getRenewalClass();
+            String jqRenewalflag = (renewalClass != null && !renewalClass.isEmpty()) ? "1" : "0";
+            String syRenewalflag = "";
+//            scoreJson.add(new JSONObject()
+//                    .fluentPut("scoreName","交强续保标识")
+//                    .fluentPut("scoreKey","jq_renewalflag")
+//                    .fluentPut("jq_renewalflag", jqRenewalflag));
+//            scoreJson.add(new JSONObject()
+//                    .fluentPut("scoreName","商业续保标识")
+//                    .fluentPut("scoreKey","sy_renewalflag")
+//                    .fluentPut("sy_renewalflag", syRenewalflag));
+
+            // 交强续保
+            quoteResultsVo.getScoreVo().setJqRenewal(convertRenewalFlag(jqRenewalflag));
+            // 商业续保
+            quoteResultsVo.getScoreVo().setSyRenewal(convertRenewalFlag(syRenewalflag));
+
             scoreJson.add(new JSONObject()
                     .fluentPut("scoreName","泰山分")
                     .fluentPut("scoreKey","ctsScore")
@@ -186,4 +206,16 @@ public class TaiShanCrawlerQuoteResultsVoBuild {
 //            quoteResultsVo.getCosts().setNiPremium(unAutoPremium.getPremium());
 //        }
     }
+
+    private static String convertRenewalFlag(String renewalFlag) {
+        if (!StringUtils.hasText(renewalFlag)) {
+            return null;
+        }
+        // RenewalEnum 枚举值
+        if (renewalFlag.equals("0")) {
+            return String.valueOf(RenewalEnum.Renewal.getCode());
+        } else {
+            return String.valueOf(RenewalEnum.Transfer.getCode());
+        }
+    }
 }

+ 51 - 1
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/component/TaiShanCrawlerRequestComponent.java

@@ -11,12 +11,13 @@ import com.jzg.quotation.taishan.crawler.properties.TaiShanCrawlerProperties;
 import com.jzg.quotation.commons.component.RequestComponent;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Component;
 import org.springframework.util.LinkedMultiValueMap;
 import org.springframework.util.MultiValueMap;
-import org.springframework.util.ObjectUtils;
+import org.springframework.web.reactive.function.client.WebClientResponseException;
 
 import java.util.Map;
 import java.util.Objects;
@@ -173,6 +174,55 @@ public class TaiShanCrawlerRequestComponent {
         return response;
     }
 
+    /**
+     * 车型查询(带登录状态检查)
+     *
+     * @param request
+     * @param headers
+     * @return TaiShanCrawlerCarResponse
+     */
+    public TaiShanCrawlerCarResponse queryCarModelsWithCheck(TaiShanCrawlerCarRequest request, HttpHeaders headers) {
+        // 1. 请求体 JSON
+        String jsonString = com.alibaba.fastjson.JSON.toJSONString(request);
+        log.info("车型搜索参数:{}", jsonString);
+        // 2. 执行 POST
+        ResponseEntity<String> responseEntity;
+        try {
+            responseEntity = requestComponent.post(
+                    RequestUrl.CAR.getRequestUrl(taiShanCrawlerProperties.getBaseUrl()),
+                    jsonString,
+                    String.class,
+                    headers);
+        } catch (WebClientResponseException e) {
+            // 检查是否是 500 错误且响应体为空(账号掉线)
+            if (e.getStatusCode().value() == 500 &&
+                    (e.getResponseBodyAsString() == null || e.getResponseBodyAsString().isEmpty())) {
+                log.error("账号掉线,请重新登录后重新报价");
+                throw new SystemException("账号掉线,请重新登录后重新报价");
+            }
+            throw e;
+        }
+        // 3. 获取响应
+        String responseBody = responseEntity.getBody();
+
+        // 3.1 检查500错误且响应体为空(账号掉线)
+        if (responseEntity.getStatusCode().value() == 500 &&
+                (responseBody == null || responseBody.isEmpty())) {
+            log.error("账号掉线,请重新登录后重新报价");
+            throw new SystemException("账号掉线,请重新登录后重新报价");
+        }
+
+        log.info("响应内容 {}", responseBody);
+        // 4. 反序列化
+        TaiShanCrawlerCarResponse response = com.alibaba.fastjson.JSON.parseObject(responseBody, TaiShanCrawlerCarResponse.class);
+
+        // 5. 判断返回码
+        if ("200".equals(response.getCode())) {
+            return response;
+        }
+        throw new SystemException(response.getMessage());
+    }
+
     /**
      * 获取车辆实际价值
      *

+ 2 - 2
tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java

@@ -99,8 +99,8 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
         HttpHeaders headers = taiShanCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), parameters.getComCode());
         // 2.0 车型查询
         TaiShanCrawlerCarRequest taiShanCrawlerCarRequest = new TaiShanCrawlerCarRequest(quoteVo,parameters.getComCode());
-        //车型查询
-        TaiShanCrawlerCarResponse taiShanCrawlerCarResponse = taiShanCrawlerRequestComponent.queryCarModels(taiShanCrawlerCarRequest, headers);
+        //车型查询(带登录状态检查)
+        TaiShanCrawlerCarResponse taiShanCrawlerCarResponse = taiShanCrawlerRequestComponent.queryCarModelsWithCheck(taiShanCrawlerCarRequest, headers);
         // 2.1 获取相同的车型
         List<TaiShanCrawlerCarResponse.CarModelInfo> models = taiShanCrawlerCarResponse.getResult();
         TaiShanCrawlerCarResponse.CarModelInfo modelsDTO = CarModelsFilterUtils.to(models, quoteVo.getCarInfoVo());

+ 1 - 1
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/build/ZmCrawlerQuoteResultVoBuild.java

@@ -201,7 +201,7 @@ public final class ZmCrawlerQuoteResultVoBuild {
             scoreJson.add(new JSONObject()
                     .fluentPut("scoreName", "中煤分")
                     .fluentPut("scoreKey","zmScore")
-                    .fluentPut("score", apQtnResultXom.getGusunlightresultmainDto().getZmScore()));
+                    .fluentPut("score", apQtnResultXom.getGusunlightresultmainDto().getZmScoreTranche()));
         }
         if (quotedPriceResponse != null) {
             scoreJson.add(new JSONObject()

+ 48 - 18
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java

@@ -6,24 +6,20 @@ import com.alibaba.fastjson.JSONObject;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.po.InsFeeOrders;
-import com.jzg.commons.entity.quote.vo.ExpenseFactor;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
-import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.util.DateTimeUtils;
 import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerQuotationResponse;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerSaveProposalResponse;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.util.ObjectUtils;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.stream.Collectors;
 
 /**
  * @description: 紫金财险爬虫报价结果构建器
@@ -61,6 +57,12 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         quoteResultsVo.setOrdersNo(ordersNo);
 
+
+        // if (ResponseCode.R_0003.getCode().equals(ziJinCrawlerSaveProposalResponse.getRtnCode())) {
+        //     handleQuoteFailure(quoteResultsVo, ziJinCrawlerSaveProposalResponse.getRtnMsg(), "保存投保单失败");
+        //     return quoteResultsVo;
+        // }
+
         if (ziJinCrawlerQuotationResponse.getItemKindList() != null) {
             // 设置交强险投保时间信息
             quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(ziJinCrawlerQuotationResponse));
@@ -72,11 +74,8 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
             quoteResultsVo.setKindInfoVo(buildKindInfoVoList(ziJinCrawlerQuotationResponse));
         }
 
-        // 交强保费 车船税 商业保费
-        buildPremium(quoteResultsVo, ziJinCrawlerQuotationResponse);
-
         // 设置投保单号
-        if (ziJinCrawlerSaveProposalResponse != null && ziJinCrawlerSaveProposalResponse.getData() != null) {
+        if (ziJinCrawlerSaveProposalResponse.getData() != null) {
             ZiJinCrawlerSaveProposalResponse.Data data = ziJinCrawlerSaveProposalResponse.getData();
             quoteResultsVo.setCiPolicyNumber(data.getProposalNoCI());
             quoteResultsVo.setBiPolicyNumber(data.getProposalNo());
@@ -84,20 +83,19 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
             // 费用信息
             if (data.getFeeImformationDto() != null) {
                 InsFeeOrders insFeeOrders = new InsFeeOrders();
-                insFeeOrders.setJqCommissionPremium(new BigDecimal(data.getFeeImformationDto().getJqFeeRatio()));
-                insFeeOrders.setSyCommissionPremium(new BigDecimal(data.getFeeImformationDto().getSyFeeRatio()));
+                insFeeOrders.setJqCommissionPremium(data.getFeeImformationDto().getJqFeeRatio() == null ? BigDecimal.ZERO : new BigDecimal(data.getFeeImformationDto().getJqFeeRatio()));
+                insFeeOrders.setSyCommissionPremium(data.getFeeImformationDto().getSyFeeRatio() == null ? BigDecimal.ZERO : new BigDecimal(data.getFeeImformationDto().getSyFeeRatio()));
                 quoteResultsVo.setFeeOrders(insFeeOrders);
             }
         }
 
+        // 交强保费 车船税 商业保费
+        buildPremium(quoteResultsVo, ziJinCrawlerQuotationResponse);
+
         // 设置警告消息(预核保消息)
-        if (ziJinCrawlerQuotationResponse.getBasePart() != null) {
-            List<String> warnMessages = new java.util.ArrayList<>();
-            warnMessages.add(ziJinCrawlerQuotationResponse.getBasePart().getPreUnderwriteMessage());
-            quoteResultsVo.setWarnMessageList(warnMessages);
-        }
+        warnMessageList(ziJinCrawlerQuotationResponse, quoteResultsVo);
 
-        // 设置评分
+        // 设置评分、折扣、影响因子、转保标识
         quoteResultsVo.setScoreVo(ZiJinCrawlerQuoteResultsVoBuild.buildScoreVo(ziJinCrawlerQuotationResponse));
 
         // 构建因子
@@ -117,6 +115,19 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         return quoteResultsVo;
     }
 
+    private static void warnMessageList(ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, QuoteResultsVo quoteResultsVo) {
+        ZiJinCrawlerQuotationResponse.BasePart basePart = ziJinCrawlerQuotationResponse.getBasePart();
+        List<String> warnMessages = new ArrayList<>();
+        if (StringUtils.isNotEmpty(basePart.getReinsureMessage())) {
+            warnMessages.add(basePart.getReinsureMessage());
+        }
+        if (StringUtils.isNotEmpty(basePart.getPreUnderwriteMessage())) {
+            warnMessages.add(basePart.getPreUnderwriteMessage());
+        }
+        // quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.QUOTE_FAIL);
+        quoteResultsVo.setWarnMessageList(warnMessages);
+    }
+
     /**
      * 处理交强险数据
      *
@@ -277,6 +288,13 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
     // 构建评分
     private static QuoteResultsVo.ScoreVo buildScoreVo(ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse) {
         QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
+
+        ZiJinCrawlerQuotationResponse.BasePart basePart = ziJinCrawlerQuotationResponse.getBasePart();
+        // 交强续保
+        scoreVo.setJqRenewal(convertRenewalFlag(basePart.getXbFlagCI()));
+        // 商业续保
+        scoreVo.setSyRenewal(convertRenewalFlag(basePart.getXbFlag()));
+
         List<ZiJinCrawlerQuotationResponse.PriceInfoList> priceInfoList = ziJinCrawlerQuotationResponse.getPriceInfoList();// 定价信息列表
         if (CollectionUtils.isEmpty(priceInfoList)) {
             return scoreVo;
@@ -286,6 +304,7 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
 
         scoreVo.setJqLossRation(priceInfo.getLrRecomAdjust());
         scoreVo.setSyLossRation(priceInfo.getLrRecom());
+        scoreVo.setTotalAdjustRate(priceInfo.getInitialELR());
 
         JSONArray scoreArray = new JSONArray();
         // 商业险定价信息
@@ -423,4 +442,15 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         scoreVo.setScoreJson(scoreArray);
         return scoreVo;
     }
+
+    private static String convertRenewalFlag(String renewalFlag) {
+        if (!StringUtils.hasText(renewalFlag)) {
+            return null;
+        }
+        if (renewalFlag.equals("0")) {
+            return String.valueOf(RenewalEnum.Renewal.getCode());
+        } else {
+            return String.valueOf(RenewalEnum.Transfer.getCode());
+        }
+    }
 }

+ 11 - 5
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerSaveQuoteInfoRequestBuild.java

@@ -244,6 +244,12 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
                 .sumPayTax(carShipTax.getSumPayTax() == null ? "0.0" : String.valueOf(carShipTax.getSumPayTax()))
                 .taxpayerName(carShipTax.getTaxpayerName())
                 .taxpayerIdentifier(carShipTax.getTaxpayerIdentifier())
+                .taxDue(carShipTax.getTaxDue())
+                .taxComName(carShipTax.getTaxComName())
+                .extendChar2(carShipTax.getExtendChar2())
+                .relifReason(carShipTax.getRelifReason())
+                .freeRateText(carShipTax.getFreeRateText())
+                .taxRelief(carShipTax.getTaxRelief())
                 .identifyNumber(carShipTax.getIdentifyNumber())
                 .payLastYear(carShipTax.getPayLastYear())
                 .lastCIPaymentTime(carShipTax.getLastCIPaymentTime())
@@ -301,16 +307,16 @@ public class ZiJinCrawlerSaveQuoteInfoRequestBuild {
         List<ZiJinCrawlerSaveQuoteInfoRequest.ItemKindInfo> itemKindList = new ArrayList<>();
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(ziJinCrawlerQuotationResponse.getItemKindList())) {
             for (ZiJinCrawlerQuotationResponse.ItemKindList kind : ziJinCrawlerQuotationResponse.getItemKindList()) {
-                String amount = kind.getAmount() != null ? kind.getAmount().toString() : "0.0";
-                String premium = kind.getBenchMarkPremium() != null ? kind.getBenchMarkPremium() : "0.0000";
+                String amount = kind.getAmount() != null ? kind.getAmount() : "0.0";
+                String benchMarkPremium = kind.getBenchMarkPremium() != null ? kind.getBenchMarkPremium() : "0.0000";
                 ZiJinCrawlerSaveQuoteInfoRequest.ItemKindInfo itemKind = ZiJinCrawlerSaveQuoteInfoRequest.ItemKindInfo.builder()
                         .amount(amount)
                         .kindCode(kind.getKindCode())
                         .kindName(kind.getKindName())
                         .riskCode(kind.getRiskCode())
-                        .premium(premium)
-                        .benchMarkPremium(premium)
-                        .basePremium(kind.getBasePremium() != null ? kind.getBasePremium() : premium)
+                        .premium(kind.getPremium() != null ? kind.getPremium() : benchMarkPremium)
+                        .benchMarkPremium(benchMarkPremium)
+                        .basePremium(kind.getBasePremium() != null ? kind.getBasePremium() : benchMarkPremium)
                         .serviceTimes(kind.getServiceTimes())
                         .build();
                 itemKindList.add(itemKind);

+ 18 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/request/ZiJinCrawlerSaveQuoteInfoRequest.java

@@ -694,6 +694,24 @@ public class ZiJinCrawlerSaveQuoteInfoRequest implements Serializable {
         @JsonProperty("identifyNumber")
         private String identifyNumber;
 
+        @JsonProperty("taxComName")
+        private String taxComName;
+
+        @JsonProperty("taxDue")
+        private Double taxDue;
+
+        @JsonProperty("extendChar2")
+        private String extendChar2;
+
+        @JsonProperty("relifReason")
+        private String relifReason;
+
+        @JsonProperty("freeRateText")
+        private String freeRateText;
+
+        @JsonProperty("taxRelief")
+        private Double taxRelief;
+
         @JsonProperty("payLastYear")
         private String payLastYear;
 

+ 1 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/enums/ResponseCode.java

@@ -15,6 +15,7 @@ public enum ResponseCode {
     R_0000("0000", "成功"),
     R_0001("9980", "转保标志!"),
     R_0002("4001", "重复投保"),
+    R_0003("9999", "系统异常,请联系系统管理员!"),
     R_Z00002("Z00002", "再次调用此接口确认");
 
     private final String code;

+ 10 - 5
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerOrderServiceImpl.java

@@ -6,6 +6,7 @@ import com.jzg.quotation.zijin.crawler.component.ZiJinCrawlerCacheComponent;
 import com.jzg.quotation.zijin.crawler.entity.po.ZiJinCrawlerOrder;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerQuotationResponse;
 import com.jzg.quotation.zijin.crawler.entity.response.ZiJinCrawlerSaveProposalResponse;
+import com.jzg.quotation.zijin.crawler.enums.ResponseCode;
 import com.jzg.quotation.zijin.crawler.repository.ZiJinCrawlerOrderRepository;
 import com.jzg.quotation.zijin.crawler.service.ZiJinCrawlerOrderService;
 import lombok.RequiredArgsConstructor;
@@ -36,16 +37,20 @@ public class ZiJinCrawlerOrderServiceImpl implements ZiJinCrawlerOrderService {
     @Override
     public void save(QuoteVo quoteVo, ZiJinCrawlerQuotationResponse ziJinCrawlerQuotationResponse, ZiJinCrawlerSaveProposalResponse ziJinCrawlerSaveProposalResponse, String orderNo, String orderId, boolean success) {
         ZiJinCrawlerOrder order = new ZiJinCrawlerOrder();
+
         order.setOrdersNo(quoteVo.getOrder().getOrdersNo());
         // 报价接口没有返回订单号, 报价保存方法save方法成功后返回订单号
         order.setOrderNo(orderNo);
         order.setBusUniqueId(orderId);
         order.setQuoteSuccess(success);
-        if (success) {
-            order.setCiApplyNo(ziJinCrawlerSaveProposalResponse.getData().getProposalNoCI());
-            order.setCiPolicyNo(ziJinCrawlerSaveProposalResponse.getData().getPolicyNoCI());
-            order.setSyApplyNo(ziJinCrawlerSaveProposalResponse.getData().getProposalNo());
-            order.setBiPolicyNo(ziJinCrawlerSaveProposalResponse.getData().getPolicyNo());
+
+        // 投保单号信息
+        if (success && ziJinCrawlerSaveProposalResponse.getData() != null) {
+            ZiJinCrawlerSaveProposalResponse.Data data = ziJinCrawlerSaveProposalResponse.getData();
+            order.setCiApplyNo(data.getProposalNoCI());
+            order.setCiPolicyNo(data.getPolicyNoCI());
+            order.setSyApplyNo(data.getProposalNo());
+            order.setBiPolicyNo(data.getPolicyNo());
         }
 
         order.setCreateTime(LocalDateTime.now());

+ 14 - 16
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java

@@ -145,7 +145,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             ZiJinCrawlerGetCarActualValueResponse ziJinCrawlerGetCarActualValueResponse = ziJinCrawlerRequestComponent.getCarActualValue(ziJinCrawlerGetCarActualValueRequest, headers);
             log.info("ziJinCrawlerGetCarActualValueResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerGetCarActualValueResponse));
 
-            //  报价接口
+            // 报价接口
             ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest = new ZiJinCrawlerQuotationRequest();
             // 设置基础信息
             ziJinCrawlerQuotationRequest.setBaseInfo(buildBaseInfo(quoteVo, parameters, attributionInformationVo.getUsername()));
@@ -289,7 +289,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
 
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         // 核保成功
-        if ("0000" .equals(ziJinCrawlerUnderwritingResponse.getRtnCode())) {
+        if ("0000".equals(ziJinCrawlerUnderwritingResponse.getRtnCode())) {
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
             underwritingResultsVo.setJqApplyNo(ziJinCrawlerUnderwritingResponse.getData().getResultObj().getProposalNoCI());
             underwritingResultsVo.setSyApplyNo(ziJinCrawlerUnderwritingResponse.getData().getResultObj().getProposalNo());
@@ -339,7 +339,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             log.info("ziJinCrawlerPaymentLinkResponse参数的值:{}", JSON.toJSONString(ziJinCrawlerPaymentLinkResponse));
             PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
             // 支付链接获取成功
-            if ("0000" .equals(ziJinCrawlerPaymentLinkResponse.getRtnCode())) {
+            if ("0000".equals(ziJinCrawlerPaymentLinkResponse.getRtnCode())) {
                 paymentLinkResultsVo.setPayLinkStatus(true);
                 paymentLinkResultsVo.setPaymentLink(ziJinCrawlerPaymentLinkResponse.getWechatUrl());
             } else {
@@ -432,7 +432,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                 ZiJinCrawlerImageUploadResponse ziJinCrawlerImageUploadResponse = ziJinCrawlerRequestComponent.uploadImage(ziJinCrawlerImageUploadRequest, headers);
                 log.info("影像上传响应,订单号:{},响应:{}", ziJinCrawlerOrder.getOrderNo(), JSON.toJSONString(ziJinCrawlerImageUploadResponse));
 
-                if ("0000" .equals(ziJinCrawlerImageUploadResponse.getRtnCode())) {
+                if ("0000".equals(ziJinCrawlerImageUploadResponse.getRtnCode())) {
 
                     ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO fileInfo = ZiJinCrawlerUploadImageInfoListRequest.ItemFileDataListDTO.builder()
                             .fileId(ziJinCrawlerImageUploadResponse.getFileId())
@@ -527,11 +527,11 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             log.info("订单状态:{},中文含义:{}", orderStatus, ziJinCrawlerQueryOrderStatusResponse.getData().getContent().get(0).getOrderStatusCN());
             // 将保司返回的订单状态转换为系统定义的订单状态枚举类型
             InsOrderStatusEnum orderStatusEnum = null;
-            if ("5" .equals(orderStatus)) {
+            if ("5".equals(orderStatus)) {
                 orderStatusEnum = InsOrderStatusEnum.valueOf("ORDER_CLOSE");
                 orderStatus = orderStatusEnum.getCode();
             }
-            if ("9" .equals(orderStatus)) {
+            if ("9".equals(orderStatus)) {
                 orderStatusEnum = InsOrderStatusEnum.valueOf("AUDIT_FAIL");
                 orderStatus = orderStatusEnum.getCode();
             }
@@ -778,7 +778,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         ziJinCrawlerGetCarActualValueRequest.setUpdateEnrollDate(quoteVo.getCarInfoVo().getRegisterDate());
         ziJinCrawlerGetCarActualValueRequest.setPurchasePrice(quoteVo.getCarInfoVo().getPurchasePrice());
         ziJinCrawlerGetCarActualValueRequest.setSeatCount(Integer.valueOf(quoteVo.getCarInfoVo().getSeatCount()));
-        ziJinCrawlerGetCarActualValueRequest.setUseNatureCode("02" .equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
+        ziJinCrawlerGetCarActualValueRequest.setUseNatureCode("02".equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
         ziJinCrawlerGetCarActualValueRequest.setStartDate(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
         ziJinCrawlerGetCarActualValueRequest.setNewEnergyFlag(quoteVo.getCarInfoVo().getEnergyTypeCode());
         ziJinCrawlerGetCarActualValueRequest.setModelEnergyType(ObjectUtils.isEmpty(quoteVo.getCarInfoVo().getModelEnergyType()) ? "D1" : quoteVo.getCarInfoVo().getModelEnergyType());
@@ -878,7 +878,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             // 证件类型映射,参考Python get_owner_i方法
             // 个人类型(1) -> vehicleOwnerNature="1"
             // 企业类型(2) -> vehicleOwnerNature="5"
-            if ("2" .equals(personType)) {
+            if ("2".equals(personType)) {
                 // 企业
                 carOwnerInfo.setVehicleOwnerNature("5");
                 // 企业证件类型映射
@@ -1016,7 +1016,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         // 证件类型映射
         String identifyType = customerInfo.getIdentifyType();
         String personType = customerInfo.getPersonType();
-        if ("2" .equals(personType)) {
+        if ("2".equals(personType)) {
             // 企业
             insuredItem.setIdentifyType(mapEnterpriseIdentifyType(identifyType));
         } else {
@@ -1026,12 +1026,12 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
 
         // 性别映射
         String gender = customerInfo.getGender();
-        insuredItem.setSex("男" .equals(gender) ? "1" : "2");
+        insuredItem.setSex("男".equals(gender) ? "1" : "2");
 
         // 根据车主性质设置投保人/被保人类型
         // 个人车主("1"): 投保人/被保人都是自然人
         // 企业车主("5"): 投保人是法人,被保人是自然人
-        if ("5" .equals(vehicleOwnerNature) && insuredFlag == 2) {
+        if ("5".equals(vehicleOwnerNature) && insuredFlag == 2) {
             // 企业车主的投保人
             insuredItem.setInsuredNature("4");// 4-法人或其他组织
             insuredItem.setInsuredType("2");
@@ -1608,10 +1608,8 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         vehicleInfo.setIssueDate(carInfoVo.getIssueDate());
 
         // 过户日期处理
-        if (carInfoVo.isTransferBi()) {
-            vehicleInfo.setMakeDate(carInfoVo.getTransferDate());
-        }
         if (carInfoVo.isTransfer()) {
+            vehicleInfo.setMakeDate(carInfoVo.getTransferDate());
             vehicleInfo.setMakeDateJQ(carInfoVo.getTransferDate());
         }
 
@@ -1650,7 +1648,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         vehicleInfo.setModelCode(modelCode);
 
         // 是否新车未上牌
-        vehicleInfo.setNoLicenseFlag("0" .equals(carInfoVo.getIsRegistered()) ? "0" : "1");
+        vehicleInfo.setNoLicenseFlag("0".equals(carInfoVo.getIsRegistered()) ? "0" : "1");
 
         vehicleInfo.setVehicleId("1");
         vehicleInfo.setVinNo(carInfoVo.getVinNo());
@@ -1659,7 +1657,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         vehicleInfo.setSeatCount(ObjectUtils.isEmpty(carInfoVo.getSeatCount()) ? 0 : Integer.parseInt(carInfoVo.getSeatCount()));
 
         // 使用性质代码
-        vehicleInfo.setUseNatureCode("02" .equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
+        vehicleInfo.setUseNatureCode("02".equals(quoteVo.getCarInfoVo().getCarNatureCode()) ? "85" : quoteVo.getCarInfoVo().getCarNatureCode());
         vehicleInfo.setOriCarKindName(carInfoVo.getCarTypeCode());
 
         // 平台车辆代码

+ 12 - 0
tenant/organization/src/main/java/com/jzg/organization/client/PlatformClient.java

@@ -3,11 +3,16 @@ package com.jzg.organization.client;
 
 import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.agreement.po.PtlAgreementAttribution;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
+import com.jzg.commons.entity.vo.InsCompanyClauseVo;
 import io.swagger.v3.oas.annotations.Operation;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 
 @FeignClient(name = "jzg-platform")
 public interface PlatformClient {
@@ -22,4 +27,11 @@ public interface PlatformClient {
     @PostMapping(value = "/manager/attribution/getAgreementAttribution2")
     public HttpResult<PtlAgreementAttribution> getAgreementAttribution2(@RequestParam(value = "id") String id);
 
+    /**
+     * 特别约定列表查询
+     */
+    @Operation(summary = "特别约定列表查询")
+    @PostMapping("/manager/clause/getClauseList")
+    HttpResult<List<InsCompanyClauseVo>> queryClauseData(@RequestBody CompanyClauseVo companyClauseVo);
+
 }

+ 2 - 2
tenant/organization/src/main/java/com/jzg/organization/controller/SchemeController.java

@@ -107,8 +107,8 @@ public class SchemeController {
 
     @Operation(summary = "获取方案结果")
     @GetMapping("/getSchemeResult")
-    public HttpResult getSchemeResult(String companyId,String productId,String seatCount){
-         SchemeResultVo schemeResultVo = ptlSchemeService.getSchemeResult(companyId,productId,seatCount);
+    public HttpResult getSchemeResult(String companyId,String productId,String seatCount,String energyType,String vehicleType,String carnature){
+         SchemeResultVo schemeResultVo = ptlSchemeService.getSchemeResult(companyId,productId,seatCount,energyType,vehicleType,carnature);
         return HttpResult.ok(schemeResultVo);
     }
 

+ 1 - 1
tenant/organization/src/main/java/com/jzg/organization/service/PtlSchemeService.java

@@ -80,7 +80,7 @@ public interface PtlSchemeService extends IService<PtlScheme> {
      * @param productId
      * @return
      */
-    public SchemeResultVo getSchemeResult(String companyId,String productId,String seatCount);
+    public SchemeResultVo getSchemeResult(String companyId,String productId,String seatCount,String energyType,String vehicleType,String carnature);
 
     List<InsBusinessInsuranceVo> getBusinessInsuranceListByKindType(String kindCode);
 

+ 39 - 1
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

@@ -21,10 +21,13 @@ import com.jzg.commons.entity.agreement.dispatch.vo.ValidateDispatchRuleVo;
 import com.jzg.commons.entity.costs.vo.ValidateSchemeRuleVo;
 import com.jzg.commons.entity.po.*;
 import com.jzg.commons.entity.po.jyxSetting;
+import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
 import com.jzg.commons.entity.quote.vo.SalespersonInfoVo;
 import com.jzg.commons.entity.scheme.po.*;
 import com.jzg.commons.entity.scheme.vo.*;
+import com.jzg.commons.entity.vo.CompanyClauseVo;
 import com.jzg.commons.entity.vo.EsmInsCompanyResVo;
+import com.jzg.commons.entity.vo.InsCompanyClauseVo;
 import com.jzg.commons.exception.NoneException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.MinioUtils;
@@ -32,6 +35,7 @@ import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.organization.client.CostsRuleClient;
 import com.jzg.organization.client.EsmInsCompanyClient;
 import com.jzg.organization.client.OrgClient;
+import com.jzg.organization.client.PlatformClient;
 import com.jzg.organization.mapper.*;
 import com.jzg.organization.service.*;
 import io.seata.spring.annotation.GlobalTransactional;
@@ -45,6 +49,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -88,6 +93,9 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
     @Autowired
     PtlAgreementDeptService ptlAgreementDeptService;
 
+    @Autowired
+    PlatformClient platformClient;
+
     @Autowired
     OrgClient orgClient;
 
@@ -460,11 +468,33 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
                 }
             });
         }
+        // 国任车主与投保人不一致时,返回车主约定T0028特约
+        for (PtlAgreementInsCompanyVo company : resVo) {
+            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())) {
+                    CompanyClauseVo clauseVo = new CompanyClauseVo();
+                    clauseVo.setCompanyId(company.getId());
+                    clauseVo.setClauseCode("T0028");
+                    try {
+                        HttpResult<List<InsCompanyClauseVo>> clauseResult = platformClient.queryClauseData(clauseVo);
+                        if (clauseResult.getCode() == 200 && CollUtil.isNotEmpty(clauseResult.getData())) {
+                            company.setSpecialSelectedList(clauseResult.getData());
+                        }
+                    } catch (Exception e) {
+                        log.warn("查询国任特约T0028失败,companyId:{}", company.getId(), e);
+                    }
+                }
+                break;
+            }
+        }
         return resVo;
     }
 
     @Override
-    public SchemeResultVo getSchemeResult(String companyId, String productId, String seatCount) {
+    public SchemeResultVo getSchemeResult(String companyId, String productId, String seatCount,String energyType,String vehicleType,String carnature) {
         log.info("根据保司Id和产品id查询协议信息。 companyId=[{}],productId=[{}]", companyId, productId);
         List<SchemeResultVo.SchemeVo> schemeInsuranceInfo = ptlSchemeMapper.getSchemeInsuranceInfo(companyId, productId);
         List<SchemeResultVo.SchemeVo> schemeDrivingInfo = ptlSchemeMapper.getSchemeDrivingInfo(companyId, productId);
@@ -555,6 +585,14 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
             optionalScheme.getKinds().removeIf(kind -> "J1".equals(kind.getKindCode()));
         }
 
+        //过滤 能源类型 使用性质 车辆种类
+        List<PtlScheme> ptlSchemes = ptlSchemeMapper.selectList(new LambdaQueryWrapper<PtlScheme>().
+                eq(PtlScheme::getCompanyId, companyId).eq(PtlScheme::getEnergyType, energyType).
+                like(PtlScheme::getCarnature, carnature).like(PtlScheme::getVehicleType, vehicleType).
+                eq(PtlScheme::getProductId, productId).eq(PtlScheme::getIsDelete, 0));
+        Map<String, PtlScheme> collectPtlSchemes = ptlSchemes.stream().collect(Collectors.toMap(PtlScheme::getId, Function.identity()));
+        AssertionUtils.isFail(collectPtlSchemes.isEmpty(), "没有可报价的方案配置信息");
+        schemeResultVo.getSchemes().stream().filter(s -> !collectPtlSchemes.containsKey(s.getId()));
         return schemeResultVo;
     }
 

+ 2 - 0
tenant/organization/src/main/resources/mapper/PtlAgreementCostMapper.xml

@@ -177,6 +177,8 @@
             <if test="productId != null">
                 AND c.product_id = #{productId}
             </if>
+            AND
+            NOW() BETWEEN c.effective_time AND c.failure_time
         </where>
     </select>
 

+ 8 - 7
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -1637,7 +1637,14 @@
         FROM
         ins_ply_income ipi
         LEFT JOIN ins_ply_income_invoice_link ipil ON ipi.id = ipil.income_id AND ipil.is_delete = 0
-        LEFT JOIN ins_ply_income_invoice ipii ON ipil.invoice_id = ipii.id AND ipii.is_delete = 0
+        LEFT JOIN ins_ply_income_invoice ipii
+        ON ipil.invoice_id = ipii.id AND ipii.is_delete = 0
+        <if test="settlementReportQueryVo.invoiceTypes != null and settlementReportQueryVo.invoiceTypes.size() > 0" >
+            and ipii.invoice_type in
+            <foreach collection="settlementReportQueryVo.invoiceTypes" item="id" open="(" separator="," close=")">
+                #{id}
+            </foreach>
+        </if>
         <where>
             ipi.is_delete = 0
             AND ipi.agreement_type = '1'
@@ -1648,12 +1655,6 @@
             <if test="settlementReportQueryVo.receiver != null and settlementReportQueryVo.receiver != ''">
                 AND ipi.contact_person = #{settlementReportQueryVo.receiver}
             </if>
-            <if test="settlementReportQueryVo.invoiceTypes != null and settlementReportQueryVo.invoiceTypes.size() > 0" >
-                and ipii.invoice_type in
-                <foreach collection="settlementReportQueryVo.invoiceTypes" item="id" open="(" separator="," close=")">
-                    #{id}
-                </foreach>
-            </if>
             <if test="settlementReportQueryVo.startTime != null and settlementReportQueryVo.startTime != ''">
                 AND ipi.signing_time BETWEEN #{settlementReportQueryVo.startTime} AND #{settlementReportQueryVo.endTime}
                 AND (ipii.invoice_time BETWEEN #{settlementReportQueryVo.startTime} AND #{settlementReportQueryVo.endTime}

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff