Browse Source

Merge remote-tracking branch 'origin/master'

lixiaolong 3 months ago
parent
commit
ed65060da3
25 changed files with 555 additions and 186 deletions
  1. 2 1
      commons/src/main/java/com/jzg/commons/util/BuildDescUtils.java
  2. 45 2
      platform/src/main/java/com/jzg/controller/FileUploadController.java
  3. 67 41
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java
  4. 2 0
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/build/ChengTaiAPIQuoteResultsVoBuild.java
  5. 6 0
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DaJiaCrawlerQuoteResultsVoBuild.java
  6. 23 2
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/component/HuaNongCrawlerRequestComponent.java
  7. 7 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/constant/enums/JiaYiXianProduct.java
  8. 35 1
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerDocumentsPrintRequestRequest.java
  9. 4 3
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerFindBusinessesRequestRequest.java
  10. 1 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerFtpDownloadRequestRequest.java
  11. 4 0
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/response/HuaNongCrawlerFindBusinessesResponse.java
  12. 35 8
      tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/service/impl/HuaNongCrawlerRequestImpl.java
  13. 173 34
      tenant/insurance/quotation-renbaonew/src/main/java/com/jzg/quotation/renbaonew/crawler/service/impl/RenBaoNewCrawlerRequestImpl.java
  14. 50 13
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java
  15. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java
  16. 17 10
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/AuditVerificationAspect.java
  17. 3 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  18. 8 0
      tenant/insurance/quotation-taikang/src/main/java/com/jzg/quotation/taikang/crawler/build/TkCrawlerQuoteResultsBuild.java
  19. 32 27
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  20. 1 1
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteResultsVoBuild.java
  21. 1 1
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerRequestComponent.java
  22. 10 0
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/ZiJinCrawlerConfigureParameters.java
  23. 2 6
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerQuoteProcessServiceImpl.java
  24. 16 24
      tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java
  25. 10 8
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

+ 2 - 1
commons/src/main/java/com/jzg/commons/util/BuildDescUtils.java

@@ -13,9 +13,10 @@ import java.util.stream.Collectors;
 public class BuildDescUtils {
 public class BuildDescUtils {
 
 
 
 
-    public static String buildDesc(List<PtlAgreementUndwrtRulesAttr> linkList, List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList) {
+    public static String buildDesc(String companyId, List<PtlAgreementUndwrtRulesAttr> linkList, List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList) {
         StringBuilder desc = new StringBuilder();
         StringBuilder desc = new StringBuilder();
         Map<String, PtlAgreementUndwrtRulesAttr> attrMap = undwrtRulesAttrList.stream()
         Map<String, PtlAgreementUndwrtRulesAttr> attrMap = undwrtRulesAttrList.stream()
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(companyId))
                 .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, Function.identity()));
                 .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, Function.identity()));
 
 
         for (PtlAgreementUndwrtRulesAttr link : linkList) {
         for (PtlAgreementUndwrtRulesAttr link : linkList) {

+ 45 - 2
platform/src/main/java/com/jzg/controller/FileUploadController.java

@@ -20,9 +20,11 @@ import org.springframework.web.multipart.MultipartFile;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.MalformedURLException;
+import java.net.URI;
 import java.net.URL;
 import java.net.URL;
 import java.net.URLConnection;
 import java.net.URLConnection;
-import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 
 
 /**
 /**
@@ -75,7 +77,9 @@ public class FileUploadController extends BaseController {
     public HttpResult<SysUploadFiles> uploadUrlFile(String urlString, String fileName) {
     public HttpResult<SysUploadFiles> uploadUrlFile(String urlString, String fileName) {
         SysUploadFiles sysUploadFiles = new SysUploadFiles();
         SysUploadFiles sysUploadFiles = new SysUploadFiles();
         try {
         try {
-            URL url = new URL(URLDecoder.decode(urlString));
+            // Spring MVC 会自动 URL 解码,需重新编码含中文的 URL
+            String safeUrl = encodeUrlQuery(urlString);
+            URL url = new URL(safeUrl);
             URLConnection connection = url.openConnection();
             URLConnection connection = url.openConnection();
             // 获取文件大小
             // 获取文件大小
             long contentLength = connection.getContentLengthLong();
             long contentLength = connection.getContentLengthLong();
@@ -101,6 +105,45 @@ public class FileUploadController extends BaseController {
     }
     }
 
 
 
 
+    /**
+     * 对 URL 中的 query 参数进行编码(Spring @RequestParam 会自动解码,需在此重新编码中文等非ASCII字符)
+     */
+    private String encodeUrlQuery(String urlStr) {
+        try {
+            URL url = new URL(urlStr);
+            String query = url.getQuery();
+            if (query == null || query.isEmpty()) {
+                return urlStr;
+            }
+            // 逐个参数编码
+            StringBuilder encodedQuery = new StringBuilder();
+            String[] params = query.split("&");
+            for (int i = 0; i < params.length; i++) {
+                if (i > 0) {
+                    encodedQuery.append("&");
+                }
+                int eqIdx = params[i].indexOf('=');
+                if (eqIdx > 0) {
+                    String key = params[i].substring(0, eqIdx);
+                    String value = params[i].substring(eqIdx + 1);
+                    encodedQuery.append(URLEncoder.encode(key, StandardCharsets.UTF_8))
+                            .append("=")
+                            .append(URLEncoder.encode(value, StandardCharsets.UTF_8));
+                } else {
+                    encodedQuery.append(params[i]);
+                }
+            }
+            // 用 URI 重建 URL,确保路径和 query 都正确编码
+            int port = url.getPort();
+            String authority = port == -1 ? url.getHost() : url.getHost() + ":" + port;
+            URI uri = new URI(url.getProtocol(), authority, url.getPath(),
+                    encodedQuery.toString(), url.getRef());
+            return uri.toASCIIString();
+        } catch (Exception e) {
+            return urlStr; // 兜底返回原值
+        }
+    }
+
     private String getFileExtension(String fileName) {
     private String getFileExtension(String fileName) {
         return fileName.substring(fileName.lastIndexOf("."));
         return fileName.substring(fileName.lastIndexOf("."));
     }
     }

+ 67 - 41
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/build/AnShengCrawlerQuoteResultsVoBuild.java

@@ -2,7 +2,7 @@ package com.jzg.quotation.ansheng.crawler.build;
 
 
 
 
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson2.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.KindInfoVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -15,7 +15,11 @@ import com.jzg.quotation.commons.component.ConversionOfQuoteInformation;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 
 
 import java.math.BigDecimal;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
+import java.util.Optional;
+import java.util.function.Function;
 
 
 
 
 @Slf4j
 @Slf4j
@@ -52,7 +56,7 @@ public final class AnShengCrawlerQuoteResultsVoBuild {
                 quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(contract.getPolicyBase()));
                 quoteResultsVo.setCiRiskInfoVo(buildCiRiskInfoVo(contract.getPolicyBase()));
                 buildRiskInfoVo(quoteVo.getCiRiskInfoVo(), contract.getPolicyBase());
                 buildRiskInfoVo(quoteVo.getCiRiskInfoVo(), contract.getPolicyBase());
                 quoteResultsVo.getCosts().setCiPremium(String.valueOf(contract.getPolicyBase().getTotalActualPremium()));
                 quoteResultsVo.getCosts().setCiPremium(String.valueOf(contract.getPolicyBase().getTotalActualPremium()));
-                quoteResultsVo.getCosts().setVvTax(String.valueOf(contract.getTargets().get(0).getVehicleTax().getVehicleTaxAmount()));
+                quoteResultsVo.getCosts().setVvTax(getVvTax(contract));
             // 商业险
             // 商业险
             } else if (DepartmentPlanCode.PLAN_109.getCode()
             } else if (DepartmentPlanCode.PLAN_109.getCode()
                     .equals(contract.getPolicyBase().getPlanCode()) || DepartmentPlanCode.PLAN_113.getCode()
                     .equals(contract.getPolicyBase().getPlanCode()) || DepartmentPlanCode.PLAN_113.getCode()
@@ -76,55 +80,77 @@ public final class AnShengCrawlerQuoteResultsVoBuild {
         return quoteResultsVo;
         return quoteResultsVo;
     }
     }
 
 
+    public static String getVvTax(AnShengCrawlerCalculatePremiumApplyResponse.DataDTO.ContractsDTO contract) {
+        BigDecimal total = Optional.ofNullable(contract)
+                .map(c -> Optional.ofNullable(c.getTargets()).filter(list -> !list.isEmpty()).map(list -> list.get(0)))
+                .flatMap(targetOpt -> targetOpt)
+                .map(target -> Optional.ofNullable(target.getVehicleTax()))
+                .flatMap(taxOpt -> taxOpt)
+                .map(tax -> {
+                    BigDecimal taxAmt = tax.getVehicleTaxAmount() == null ? BigDecimal.ZERO : BigDecimal.valueOf(tax.getVehicleTaxAmount());
+                    BigDecimal lateAmt = tax.getLateFeeAmount() == null ? BigDecimal.ZERO : BigDecimal.valueOf(tax.getLateFeeAmount());
+                    return taxAmt.add(lateAmt);
+                })
+                .orElse(BigDecimal.ZERO)
+                .setScale(2, RoundingMode.HALF_UP);
+        return total.toPlainString();
+    }
+
 
 
-    private static QuoteResultsVo.ScoreVo buildScoreVo( AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply) {
+
+    /**
+     * 组装打分ScoreVo
+     */
+    private static QuoteResultsVo.ScoreVo buildScoreVo(AnShengCrawlerCalculatePremiumApplyResponse calculatePremiumApply) {
         QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
         QuoteResultsVo.ScoreVo scoreVo = new QuoteResultsVo.ScoreVo();
         JSONArray scoreArray = new JSONArray();
         JSONArray scoreArray = new JSONArray();
         AnShengCrawlerCalculatePremiumApplyResponse.DataDTO data = calculatePremiumApply.getData();
         AnShengCrawlerCalculatePremiumApplyResponse.DataDTO data = calculatePremiumApply.getData();
-        String basicstring = data.getBasicstring();
-        if (StringUtils.isNotEmpty(basicstring)){
-            String[] parts = basicstring.split(":");
-            scoreArray.add(new JSONObject()
-                    .fluentPut("scoreName",parts.length > 0 ? parts[0].trim() : "")
-                    .fluentPut("scoreKey","basicstring")
-                    .fluentPut("score",parts.length > 1 ? parts[1].trim() : ""));
-        }
-        String blackDivisor = data.getBlackDivisor();
-        if (StringUtils.isNotEmpty(blackDivisor)){
-            String[] black = blackDivisor.split(":");
-            scoreArray.add(new JSONObject()
-                    .fluentPut("scoreName",black.length > 0 ? black[0].trim() : "")
-                    .fluentPut("scoreKey","blackDivisor")
-                    .fluentPut("score",black.length > 0 ? black[1].trim() : ""));
-        }
-        String comprehensiveScoreStr = data.getComprehensiveScoreStr();
-        if (StringUtils.isNotEmpty(comprehensiveScoreStr)){
-            String[] comprehensiveScore = comprehensiveScoreStr.split(":");
-            scoreArray.add(new JSONObject()
-                    .fluentPut("scoreName",comprehensiveScore.length > 0 ? comprehensiveScore[0].trim() : "")
-                    .fluentPut("scoreKey","comprehensiveScoreStr")
-                    .fluentPut("score",comprehensiveScore.length > 0 ? comprehensiveScore[1].trim() : ""));
-        }
-        String riskScore = data.getRiskScore();
-        if (StringUtils.isNotEmpty(riskScore)){
-            String[] riskScoreStr = riskScore.split(":");
-            scoreArray.add(new JSONObject()
-                    .fluentPut("scoreName",riskScoreStr.length > 0 ? riskScoreStr[0].trim() : "")
-                    .fluentPut("scoreKey","riskScore")
-                    .fluentPut("score",riskScoreStr.length > 0 ? riskScoreStr[1].trim() : ""));
+        if (data == null) {
+            scoreVo.setScoreJson(scoreArray);
+            return scoreVo;
         }
         }
-        String unifiedScore = data.getUnifiedScore();
-        if (StringUtils.isNotEmpty(unifiedScore)){
-            String[] unifiedScoreStr = unifiedScore.split(":");
-            scoreArray.add(new JSONObject()
-                    .fluentPut("scoreName",unifiedScoreStr.length > 0 ? unifiedScoreStr[0].trim() : "")
-                    .fluentPut("scoreKey","unifiedScore")
-                    .fluentPut("score",unifiedScoreStr.length > 0 ? unifiedScoreStr[1].trim() : ""));
+        // 1. 统一配置:字段key + 取值函数
+        record ScoreItem(String scoreKey, Function<AnShengCrawlerCalculatePremiumApplyResponse.DataDTO, String> valueFunc) {}
+        List<ScoreItem> itemList = new ArrayList<>();
+        itemList.add(new ScoreItem("basicstring", AnShengCrawlerCalculatePremiumApplyResponse.DataDTO::getBasicstring));
+        itemList.add(new ScoreItem("blackDivisor", AnShengCrawlerCalculatePremiumApplyResponse.DataDTO::getBlackDivisor));
+        itemList.add(new ScoreItem("comprehensiveScoreStr", AnShengCrawlerCalculatePremiumApplyResponse.DataDTO::getComprehensiveScoreStr));
+        itemList.add(new ScoreItem("riskScore", AnShengCrawlerCalculatePremiumApplyResponse.DataDTO::getRiskScore));
+        itemList.add(new ScoreItem("unifiedScore", AnShengCrawlerCalculatePremiumApplyResponse.DataDTO::getUnifiedScore));
+
+        final String splitChar = ":";
+        for (ScoreItem item : itemList) {
+            String sourceStr = item.valueFunc().apply(data);
+            fillScoreItem(scoreArray, splitChar, item.scoreKey(), sourceStr);
         }
         }
+
         scoreVo.setScoreJson(scoreArray);
         scoreVo.setScoreJson(scoreArray);
         return scoreVo;
         return scoreVo;
     }
     }
 
 
+    /**
+     * 通用填充单个打分JSON对象,消除重复逻辑 + 规避下标越界
+     * @param scoreArray 外层JSON数组
+     * @param splitChar 分隔符
+     * @param scoreKey 唯一标识key
+     * @param sourceStr 原始待分割字符串
+     */
+    private static void fillScoreItem(JSONArray scoreArray, String splitChar, String scoreKey, String sourceStr) {
+        if (StringUtils.isEmpty(sourceStr)) {
+            return;
+        }
+        String[] parts = sourceStr.split(splitChar, 2);
+        String scoreName = parts.length >= 1 ? parts[0].trim() : "";
+        String scoreVal = parts.length >= 2 ? parts[1].trim() : "";
+
+        JSONObject jsonObj = JSONObject.of(
+                "scoreName", scoreName,
+                "scoreKey", scoreKey,
+                "score", scoreVal
+        );
+        scoreArray.add(jsonObj);
+    }
+
 
 
 
 
     /**
     /**

+ 2 - 0
tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/build/ChengTaiAPIQuoteResultsVoBuild.java

@@ -100,6 +100,7 @@ public final class ChengTaiAPIQuoteResultsVoBuild {
             scoreVo.setCiClaims(premiumCalculationResponse.getCompRisk().getBasePart().getClaimsNum());
             scoreVo.setCiClaims(premiumCalculationResponse.getCompRisk().getBasePart().getClaimsNum());
             if (null != premiumCalculationResponse.getCompRisk().getBasePart().getDiscount()) {
             if (null != premiumCalculationResponse.getCompRisk().getBasePart().getDiscount()) {
                 scoreVo.setJqAdjustRate(premiumCalculationResponse.getCompRisk().getBasePart().getDiscount().toString());
                 scoreVo.setJqAdjustRate(premiumCalculationResponse.getCompRisk().getBasePart().getDiscount().toString());
+                scoreVo.setCiClaims(premiumCalculationResponse.getCompRisk().getBasePart().getClaimsNum());
             }
             }
         }
         }
         if (null != premiumCalculationResponse.getCommRisk() && null != premiumCalculationResponse.getCommRisk().getBasePart()) {
         if (null != premiumCalculationResponse.getCommRisk() && null != premiumCalculationResponse.getCommRisk().getBasePart()) {
@@ -107,6 +108,7 @@ public final class ChengTaiAPIQuoteResultsVoBuild {
             scoreVo.setSyRenewal(premiumCalculationResponse.getCommRisk().getBasePart().getRenewalFlag());
             scoreVo.setSyRenewal(premiumCalculationResponse.getCommRisk().getBasePart().getRenewalFlag());
             if (null != premiumCalculationResponse.getCommRisk().getBasePart().getDiscount()){
             if (null != premiumCalculationResponse.getCommRisk().getBasePart().getDiscount()){
                 scoreVo.setSyAdjustRate(premiumCalculationResponse.getCommRisk().getBasePart().getDiscount().toString());
                 scoreVo.setSyAdjustRate(premiumCalculationResponse.getCommRisk().getBasePart().getDiscount().toString());
+                scoreVo.setBiClaims(premiumCalculationResponse.getCommRisk().getBasePart().getClaimsNum());
             }
             }
         }
         }
         scoreVo.setLossRation(premiumCalculationResponse.getYztScore().getCentile().toString());
         scoreVo.setLossRation(premiumCalculationResponse.getYztScore().getCentile().toString());

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

@@ -65,6 +65,12 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         quoteResultsVo.getCosts().setNiPremium(daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium().equals("") ? "0.00" : daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium());
         quoteResultsVo.getCosts().setNiPremium(daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium().equals("") ? "0.00" : daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium());
         // 交强保费 车船税 商业保费
         // 交强保费 车船税 商业保费
         buildOtherInfo(quoteResultsVo, daJiaCrawlerSaveResponse.getCompulsoryInsurance(), daJiaCrawlerSaveResponse.getBusinessInsurance());
         buildOtherInfo(quoteResultsVo, daJiaCrawlerSaveResponse.getCompulsoryInsurance(), daJiaCrawlerSaveResponse.getBusinessInsurance());
+        BusinessInsuranceDTO.ProductInfoDTO productInfo = daJiaCrawlerSaveResponse.getBusinessInsurance().getProductInfo();
+        CompulsoryInsuranceDTO.ProductInfoDTO compulsoryInsuranceProductInfo = daJiaCrawlerSaveResponse.getCompulsoryInsurance().getProductInfo();
+        quoteResultsVo.setCiStartDate(compulsoryInsuranceProductInfo.getStartDate());
+        quoteResultsVo.setCiEndDate(compulsoryInsuranceProductInfo.getEndDate());
+        quoteResultsVo.setBiStartDate(productInfo.getStartDate());
+        quoteResultsVo.setBiEndDate(productInfo.getEndDate());
         return quoteResultsVo;
         return quoteResultsVo;
     }
     }
 
 

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

@@ -25,9 +25,13 @@ import org.springframework.web.reactive.function.BodyInserters;
 
 
 import java.io.IOException;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URI;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Path;
 import java.util.*;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 
 import static com.jzg.quotation.huanong.crawler.constant.enums.RequestUrl.*;
 import static com.jzg.quotation.huanong.crawler.constant.enums.RequestUrl.*;
 
 
@@ -401,7 +405,14 @@ public class HuaNongCrawlerRequestComponent {
      */
      */
     public String ftpDownload(HuaNongCrawlerFtpDownloadRequestRequest request, HttpHeaders headers) {
     public String ftpDownload(HuaNongCrawlerFtpDownloadRequestRequest request, HttpHeaders headers) {
         HuaNongCrawlerFtpDownloadResponse response = post(FTP_DOWNLOAD, request, HuaNongCrawlerFtpDownloadResponse.class, headers);
         HuaNongCrawlerFtpDownloadResponse response = post(FTP_DOWNLOAD, request, HuaNongCrawlerFtpDownloadResponse.class, headers);
-        return response.getDowloadURL().get(0).getDowloadURL();
+        String fileUrl = response.getDowloadURL().get(0).getDowloadURL();
+        // URL编码 on= 参数值(中文文件名需编码,否则后续下载时报400)
+        Matcher matcher = Pattern.compile("on=(.*?)\\.pdf").matcher(fileUrl);
+        if (matcher.find()) {
+            String matched = matcher.group(1);
+            fileUrl = fileUrl.replace(matched, URLEncoder.encode(matched, StandardCharsets.UTF_8));
+        }
+        return fileUrl;
     }
     }
 
 
     /**
     /**
@@ -414,7 +425,17 @@ public class HuaNongCrawlerRequestComponent {
     public String documentsPrint(HuaNongCrawlerDocumentsPrintRequestRequest request, HttpHeaders headers) {
     public String documentsPrint(HuaNongCrawlerDocumentsPrintRequestRequest request, HttpHeaders headers) {
         HuaNongCrawlerDocumentsPrintResponse response = post(DOCUMENTS_PRINT, request, HuaNongCrawlerDocumentsPrintResponse.class, headers);
         HuaNongCrawlerDocumentsPrintResponse response = post(DOCUMENTS_PRINT, request, HuaNongCrawlerDocumentsPrintResponse.class, headers);
         String fileUrl = response.getFileUrl();
         String fileUrl = response.getFileUrl();
-        return fileUrl.replace(properties.getDocumentsPrintUrl(), properties.getFtpDownloadUrl());
+        return fileUrl;
+    }
+
+    /**
+     * CI交强险 DocumentsPrint 前置调用(与Python一致,下载交强保单前需先调用)
+     *
+     * @param request 交强险DocumentsPrint请求
+     * @param headers 请求头
+     */
+    public void documentsPrintForCi(HuaNongCrawlerDocumentsPrintRequestRequest request, HttpHeaders headers) {
+        post(DOCUMENTS_PRINT, request, HuaNongCrawlerDocumentsPrintResponse.class, headers);
     }
     }
 
 
     /**
     /**

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

@@ -44,6 +44,13 @@ public enum JiaYiXianProduct {
             new CoverageConfig("F27047-5", "附加辅助金保险条款", "0094", "家庭辅助金", 0.02, "10", "20000", "2.0万元/座", true),
             new CoverageConfig("F27047-5", "附加辅助金保险条款", "0094", "家庭辅助金", 0.02, "10", "20000", "2.0万元/座", true),
             new CoverageConfig("F27048-6", "附加救护车车费保险条款", "0095", "救护车费用", 0.1, "10", "2000", "0.2万元/座", true)
             new CoverageConfig("F27048-6", "附加救护车车费保险条款", "0095", "救护车费用", 0.1, "10", "2000", "0.2万元/座", true)
     )),
     )),
+    ANXIANG_50("091", "好运连连(50)", true, Arrays.asList(
+            new CoverageConfig("Z27096-1", "交通出行团体意外伤害保险C款条款", "0955", "必选责任:意外伤害身故保险责任", 0.06, "30000", "3.0万元/座", " ", false),
+            new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.04, "30000", "3.0万元/座", " ", false),
+            new CoverageConfig("F27002", "附加团体意外伤害医疗保险条款", "0008", "意外伤害医疗保险责任", 0.24, "1000", "0.1万元/座", "每次事故免赔300后80%比例赔付", false),
+            new CoverageConfig("F27001", "附加团体意外伤害住院津贴保险条款", "0032", "意外伤害住院津贴保险责任", 0.2, "10", "0.001万元/座", "10元/天/座", true)
+
+    )),
     ANXIANG_240("092", "好运连连(240)", true, Arrays.asList(
     ANXIANG_240("092", "好运连连(240)", true, Arrays.asList(
             new CoverageConfig("Z27096-1", "交通出行团体意外伤害保险C款条款", "0955", "必选责任:意外伤害身故保险责任", 0.06, "30000", "3.0万元/座", " ", false),
             new CoverageConfig("Z27096-1", "交通出行团体意外伤害保险C款条款", "0955", "必选责任:意外伤害身故保险责任", 0.06, "30000", "3.0万元/座", " ", false),
             new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.04, "30000", "3.0万元/座", " ", false),
             new CoverageConfig("Z27096-2", "交通出行团体意外伤害保险C款条款", "0956", "可选责任:意外伤害伤残保险责任", 0.04, "30000", "3.0万元/座", " ", false),

+ 35 - 1
tenant/insurance/quotation-huanong/src/main/java/com/jzg/quotation/huanong/crawler/entity/request/HuaNongCrawlerDocumentsPrintRequestRequest.java

@@ -79,7 +79,7 @@ public class HuaNongCrawlerDocumentsPrintRequestRequest implements HuaNongHeadRe
         this.printType = "";
         this.printType = "";
         this.returnFlag = "0";
         this.returnFlag = "0";
         this.startNo = "";
         this.startNo = "";
-        this.visaCode = "";
+        this.visaCode = "BB05550A2019E";
         this.endNo = "";
         this.endNo = "";
         this.accountInfo = "";
         this.accountInfo = "";
         this.currency = "RMB";
         this.currency = "RMB";
@@ -91,8 +91,42 @@ public class HuaNongCrawlerDocumentsPrintRequestRequest implements HuaNongHeadRe
         this.ip = "";
         this.ip = "";
         this.visaType = "";
         this.visaType = "";
         this.isPreview = "0";
         this.isPreview = "0";
+        this.useNature = "8A";
         this.isMotoDownload = "0";
         this.isMotoDownload = "0";
         this.isImg = 0;
         this.isImg = 0;
     }
     }
 
 
+    /**
+     * CI交强险 DocumentsPrint 前置调用构造(与Python hn_bddownload.py get_orderNo 一致)
+     *
+     * @param token         登录token
+     * @param contractNo    交强险保单号
+     * @param username      用户名
+     * @param loginComCode  登录机构代码
+     * @param businessType  业务类型(交强险传 "3")
+     * @param visaCode      签证代码(交强险传 "AB05016A32015A")
+     */
+    public HuaNongCrawlerDocumentsPrintRequestRequest(String token, String contractNo, String username, String loginComCode, String businessType, String visaCode) {
+        this.head = new HuaNongCrawlerRequestBaseHead(token);
+        this.policyType = "1";
+        this.printNoBegin = "";
+        this.printNoEnd = "";
+        this.businessType = businessType;
+        this.contractNo = List.of(contractNo);
+        this.printType = "";
+        this.returnFlag = "0";
+        this.startNo = "";
+        this.visaCode = visaCode;
+        this.endNo = "";
+        this.accountInfo = "";
+        this.currency = "RMB";
+        this.producerCode = "";
+        this.comCode = loginComCode;
+        this.userCode = username;
+        this.loginCom = loginComCode;
+        this.electronicPolicy = false;
+        this.ip = "";
+        this.isPreview = "0";
+    }
+
 }
 }

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

@@ -6,6 +6,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 import lombok.NoArgsConstructor;
 
 
 import java.io.Serial;
 import java.io.Serial;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -134,11 +135,11 @@ public class HuaNongCrawlerFindBusinessesRequestRequest implements HuaNongHeadRe
          * 投保单 2
          * 投保单 2
          * 保单 4
          * 保单 4
          */
          */
-        this.businessType = "2";
+        this.businessType = "4";
         this.policyNo = "";
         this.policyNo = "";
         this.endorseNo = "";
         this.endorseNo = "";
         this.insuredName = "";
         this.insuredName = "";
-        this.queryStatus = List.of("0");
+        this.queryStatus = new ArrayList<>();
         this.agreementNo = "";
         this.agreementNo = "";
         this.handlerCode = "";
         this.handlerCode = "";
         this.agentName = "";
         this.agentName = "";
@@ -161,7 +162,7 @@ public class HuaNongCrawlerFindBusinessesRequestRequest implements HuaNongHeadRe
                 "0515", "0507", "0520", "0521", "0522", "0523", "0509", "0506", "0510",
                 "0515", "0507", "0520", "0521", "0522", "0523", "0509", "0506", "0510",
                 "0511", "0512", "0513", "2801", "0311", "0301", "1727", "1703", "0109",
                 "0511", "0512", "0513", "2801", "0311", "0301", "1727", "1703", "0109",
                 "2742", "0306", "4001", "2780", "2781", "2784", "2782", "2783", "1980",
                 "2742", "0306", "4001", "2780", "2781", "2784", "2782", "2783", "1980",
-                "1981", "2609", "2785", "2680"
+                "1981", "2609", "2785", "2680","0911"
         );
         );
         this.hasSubFlag = true;
         this.hasSubFlag = true;
         this.endorType = "";
         this.endorType = "";

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

@@ -60,6 +60,7 @@ public class HuaNongCrawlerFtpDownloadRequestRequest implements HuaNongHeadReque
 
 
         public FtpDowloadListDTO() {
         public FtpDowloadListDTO() {
             this.isMotoDownload = "0";
             this.isMotoDownload = "0";
+            this.useNature = "8A";
             this.isVPN = "0";
             this.isVPN = "0";
             this.isBZDown = "0";
             this.isBZDown = "0";
             this.isRelate = "0";
             this.isRelate = "0";

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

@@ -53,8 +53,12 @@ public class HuaNongCrawlerFindBusinessesResponse implements HuaNongHeadResponse
         private String comCode;
         private String comCode;
         @JsonProperty("contractNo1")
         @JsonProperty("contractNo1")
         private String contractNo1;
         private String contractNo1;
+        @JsonProperty("contractNo2")
+        private String contractNo2;
         @JsonProperty("contractNo3")
         @JsonProperty("contractNo3")
         private String contractNo3;
         private String contractNo3;
+        @JsonProperty("contractNo4")
+        private String contractNo4;
         @JsonProperty("contractNo5")
         @JsonProperty("contractNo5")
         private String contractNo5;
         private String contractNo5;
         @JsonProperty("contractNo6")
         @JsonProperty("contractNo6")

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

@@ -880,37 +880,64 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
         HuaNongCrawlerFtpDownloadRequestRequest huaNongCrawlerFtpDownloadRequest = new HuaNongCrawlerFtpDownloadRequestRequest(loginInfoDto.getToken());
         HuaNongCrawlerFtpDownloadRequestRequest huaNongCrawlerFtpDownloadRequest = new HuaNongCrawlerFtpDownloadRequestRequest(loginInfoDto.getToken());
         HuaNongCrawlerFtpDownloadRequestRequest.FtpDowloadListDTO ftpDowloadListDTO = new HuaNongCrawlerFtpDownloadRequestRequest.FtpDowloadListDTO();
         HuaNongCrawlerFtpDownloadRequestRequest.FtpDowloadListDTO ftpDowloadListDTO = new HuaNongCrawlerFtpDownloadRequestRequest.FtpDowloadListDTO();
         huaNongCrawlerFtpDownloadRequest.setFtpDowloadList(List.of(ftpDowloadListDTO));
         huaNongCrawlerFtpDownloadRequest.setFtpDowloadList(List.of(ftpDowloadListDTO));
+
+        // 投保单号获取保单号
+        String policyNo = StringUtils.hasText(order.getBiPolicyNumber()) ? order.getBiPolicyNumber() : order.getCiPolicyNumber();
+        HuaNongCrawlerFindBusinessesRequestRequest huaNongCrawlerFindBusinessesRequest
+                = new HuaNongCrawlerFindBusinessesRequestRequest(loginInfoDto.getToken(), loginInfoDto.getLoginComCode(), policyNo, order.getRecordingTime());
+        HuaNongCrawlerFindBusinessesResponse businesses = huaNongCrawlerRequestComponent.findBusinesses(huaNongCrawlerFindBusinessesRequest, httpHeaders);
+        // 与Python hn_state.py一致:遍历business按riskCode匹配contractNo字段
+        String ciNo = businesses.getBusiness().get(0).getContractNo6();
+        String biNo = businesses.getBusiness().get(0).getContractNo1();
+
         // 交强保单 标志
         // 交强保单 标志
-        Optional.ofNullable(order.getCiPolicyNo())
+        Optional.ofNullable(order.getCiPolicyNumber())
                 .filter(s -> !s.isEmpty())
                 .filter(s -> !s.isEmpty())
                 .ifPresent(ciPolicyNo -> {
                 .ifPresent(ciPolicyNo -> {
+
+                    // DocumentsPrint 前置调用
+                    HuaNongCrawlerDocumentsPrintRequestRequest ciDocumentsPrintRequest =
+                            new HuaNongCrawlerDocumentsPrintRequestRequest(loginInfoDto.getToken(), ciNo, attributionInformationVo.getUsername(), loginInfoDto.getLoginComCode(), "3", "AB05016A32015A");
+                    huaNongCrawlerRequestComponent.documentsPrintForCi(ciDocumentsPrintRequest, httpHeaders);
+
                     // 交强保单
                     // 交强保单
-                    ftpDowloadListDTO.setBiztype("4");
-                    ftpDowloadListDTO.setBusinessNo(ciPolicyNo);
+                    ftpDowloadListDTO.setBiztype("3");
+                    ftpDowloadListDTO.setBusinessNo(ciNo);
                     ftpDowloadListDTO.setRiskCode(Risk.RISK_0507.getRiskCode());
                     ftpDowloadListDTO.setRiskCode(Risk.RISK_0507.getRiskCode());
                     String ciPolicyUrl = huaNongCrawlerRequestComponent.ftpDownload(huaNongCrawlerFtpDownloadRequest, httpHeaders);
                     String ciPolicyUrl = huaNongCrawlerRequestComponent.ftpDownload(huaNongCrawlerFtpDownloadRequest, httpHeaders);
                     downloadPolicyResultVo.setJqUrl(ciPolicyUrl);
                     downloadPolicyResultVo.setJqUrl(ciPolicyUrl);
+                    // 交强险标志
                     ftpDowloadListDTO.setIsBZDown("1");
                     ftpDowloadListDTO.setIsBZDown("1");
-                    // 商业标志
                     String ciSignUrl = huaNongCrawlerRequestComponent.ftpDownload(huaNongCrawlerFtpDownloadRequest, httpHeaders);
                     String ciSignUrl = huaNongCrawlerRequestComponent.ftpDownload(huaNongCrawlerFtpDownloadRequest, httpHeaders);
                     downloadPolicyResultVo.setJqFlagUrl(ciSignUrl);
                     downloadPolicyResultVo.setJqFlagUrl(ciSignUrl);
 
 
                 });
                 });
         // 商业保单
         // 商业保单
-        Optional.ofNullable(order.getBiPolicyNo())
+        Optional.ofNullable(order.getBiPolicyNumber())
                 .filter(s -> !s.isEmpty())
                 .filter(s -> !s.isEmpty())
                 .ifPresent(biPolicyNo -> {
                 .ifPresent(biPolicyNo -> {
                     // 商业保单
                     // 商业保单
                     ftpDowloadListDTO.setIsBZDown("0");
                     ftpDowloadListDTO.setIsBZDown("0");
-                    ftpDowloadListDTO.setBusinessNo(biPolicyNo);
+                    ftpDowloadListDTO.setBiztype("3");
+                    ftpDowloadListDTO.setBusinessNo(biNo);
+                    ftpDowloadListDTO.setRiskCode(Risk.RISK_0515.getRiskCode());
                     String biPolicyUrl = huaNongCrawlerRequestComponent.ftpDownload(huaNongCrawlerFtpDownloadRequest, httpHeaders);
                     String biPolicyUrl = huaNongCrawlerRequestComponent.ftpDownload(huaNongCrawlerFtpDownloadRequest, httpHeaders);
                     downloadPolicyResultVo.setSyUrl(biPolicyUrl);
                     downloadPolicyResultVo.setSyUrl(biPolicyUrl);
                 });
                 });
 
 
         // 非车险
         // 非车险
         order.getNiInfos().forEach(niInfo -> {
         order.getNiInfos().forEach(niInfo -> {
-            Optional.ofNullable(niInfo.getNiPolicyNo()).ifPresent(niPolicyNo -> {
-                HuaNongCrawlerDocumentsPrintRequestRequest huaNongCrawlerDocumentsPrintRequest = new HuaNongCrawlerDocumentsPrintRequestRequest(loginInfoDto.getToken(), niPolicyNo, attributionInformationVo.getUsername(), loginInfoDto.getLoginComCode());
+            Optional.ofNullable(niInfo.getNiPolicyNumber()).ifPresent(niPolicyNo -> {
+                HuaNongCrawlerFindBusinessesRequestRequest niFindBusinessesRequest
+                        = new HuaNongCrawlerFindBusinessesRequestRequest(loginInfoDto.getToken(), loginInfoDto.getLoginComCode(), niPolicyNo, order.getRecordingTime());
+                HuaNongCrawlerFindBusinessesResponse niBusinesses = huaNongCrawlerRequestComponent.findBusinesses(niFindBusinessesRequest, httpHeaders);
+                // 与Python hn_state.py一致:NI(非0507/0510/0515)使用contractNo4
+                String niContractNo = Optional.ofNullable(niBusinesses.getBusiness())
+                        .filter(list -> !list.isEmpty())
+                        .map(list -> list.get(0).getContractNo4())
+                        .orElse(niPolicyNo);
+
+                HuaNongCrawlerDocumentsPrintRequestRequest huaNongCrawlerDocumentsPrintRequest = new HuaNongCrawlerDocumentsPrintRequestRequest(loginInfoDto.getToken(), niContractNo, attributionInformationVo.getUsername(), loginInfoDto.getLoginComCode());
                 String niPolicyUrl = huaNongCrawlerRequestComponent.documentsPrint(huaNongCrawlerDocumentsPrintRequest, httpHeaders);
                 String niPolicyUrl = huaNongCrawlerRequestComponent.documentsPrint(huaNongCrawlerDocumentsPrintRequest, httpHeaders);
                 downloadPolicyResultVo.setJyUrl(niPolicyUrl);
                 downloadPolicyResultVo.setJyUrl(niPolicyUrl);
             });
             });

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

@@ -1518,50 +1518,189 @@ public class RenBaoNewCrawlerRequestImpl implements RenBaoNewCrawlerRequest {
                 headers
                 headers
         );
         );
 
 
-        OrderStatusResultVo resultVo = new OrderStatusResultVo();
-
-        // 解析订单状态
-        String status = parseOrderStatus(checkResult);
-        resultVo.setOrderStatusStr(status);
-
-        // 解析投保单号和保单号
-        parsePolicyNumbers(checkResult, resultVo);
-
-        return resultVo;
-    }
-
-    /**
-     * 解析订单状态
-     */
-    private String parseOrderStatus(Map<String, Object> checkResult) {
-        if (checkResult == null || !checkResult.containsKey("data")) {
-            return "UNKNOWN";
+        // 校验查询结果
+        if (checkResult == null || !"Success".equals(checkResult.get("message"))) {
+            String errorMsg = checkResult != null ? (String) checkResult.get("statusText") : "查询订单响应为空";
+            throw new SystemException("查询订单异常: " + errorMsg);
         }
         }
 
 
         Map<String, Object> data = (Map<String, Object>) checkResult.get("data");
         Map<String, Object> data = (Map<String, Object>) checkResult.get("data");
         if (data == null || !data.containsKey("result")) {
         if (data == null || !data.containsKey("result")) {
-            return "UNKNOWN";
+            throw new SystemException("查询订单异常: 未查询到订单");
         }
         }
 
 
         List<Map<String, Object>> itemList = (List<Map<String, Object>>) data.get("result");
         List<Map<String, Object>> itemList = (List<Map<String, Object>>) data.get("result");
         if (itemList == null || itemList.isEmpty()) {
         if (itemList == null || itemList.isEmpty()) {
-            return "NOT_FOUND";
+            throw new SystemException("未查询到订单");
+        }
+        if (itemList.size() > 2) {
+            throw new SystemException("查询订单异常");
         }
         }
 
 
-        // 获取第一个订单的状态
-        Map<String, Object> firstItem = itemList.get(0);
-        String underWriteFlag = (String) firstItem.get("underWriteFlag");
-
-        // 状态映射:0-初始值, 1-通过, 2-不通过, 3-自动核保通过, 4-见费出单待缴费, 5-见费出单待缴费,
-        // 6-待同步, 7-自动待同步, 9-待核保, A-送见费失败, B-送见费失败, C-待取消, D-自动核保待转保单,
-        // E-人工核保待转保单, F-预核保转人工
-        return switch (underWriteFlag) {
-            case "1", "3" -> "APPROVED";
-            case "2" -> "REJECTED";
-            case "4", "5" -> "PAYMENT_PENDING";
-            case "9" -> "UNDERWRITING";
-            default -> "PROCESSING";
-        };
+        // 2. 提取交强/商业单号及驾意险单号(对应Python逻辑)
+        Map<String, Object> orderInfo = itemList.get(0);
+        String jqApplication = "";
+        String syApplication = "";
+        List<String> documentnolist = new ArrayList<>();
+        List<String> jyxBusinessNoList = new ArrayList<>();
+
+        for (Map<String, Object> item : itemList) {
+            String bNo = (String) item.get("businessNo");
+            if (bNo != null) {
+                if (bNo.contains("DZA")) {
+                    jqApplication = bNo;
+                    documentnolist.add(bNo);
+                } else if (bNo.contains("DAA")) {
+                    syApplication = bNo;
+                    documentnolist.add(bNo);
+                }
+            }
+        }
+
+        // 提取驾意险关联单号
+        if (orderInfo.containsKey("relationUPolicyInfolist")) {
+            List<Map<String, Object>> relationList = (List<Map<String, Object>>) orderInfo.get("relationUPolicyInfolist");
+            if (relationList != null) {
+                for (Map<String, Object> relItem : relationList) {
+                    String connectProposalNo = (String) relItem.get("connectProposalNo");
+                    if (connectProposalNo != null && !connectProposalNo.isEmpty()) {
+                        documentnolist.add(connectProposalNo);
+                        jyxBusinessNoList.add(connectProposalNo);
+                    }
+                }
+            }
+        }
+
+        // 3. 获取核保状态
+        String underWriteFlag = (String) orderInfo.get("underWriteFlag");
+        log.info("订单状态 underWriteFlag={}, jq={}, sy={}, jyx={}", underWriteFlag, jqApplication, syApplication, jyxBusinessNoList);
+
+        // 4. 根据状态处理
+        OrderStatusResultVo resultVo = new OrderStatusResultVo();
+        resultVo.setJqApplyNo(jqApplication);
+        resultVo.setSyApplyNo(syApplication);
+        resultVo.setJyApplyNo(jyxBusinessNoList.isEmpty() ? "" : String.join(",", jyxBusinessNoList));
+
+        // 状态为4或5:核保通过待缴费 → 获取支付链接
+        if ("4".equals(underWriteFlag) || "5".equals(underWriteFlag)) {
+            log.info("订单核保通过,获取支付链接");
+            // 构建支付请求
+            RenBaoNewCrawlerPayRequest payRequest = new RenBaoNewCrawlerPayRequest();
+            payRequest.setDocumentnolist(documentnolist);
+            payRequest.setUserCode(loginInfo.getUserCode());
+            payRequest.setComCode(loginInfo.getComCode());
+            payRequest.setPayType("");
+            payRequest.setPayFee("");
+            payRequest.setCurrency("");
+            payRequest.setLinkurlflag("1");
+            payRequest.setBrowseWay("");
+
+            // 带重试获取支付链接(对应Python的while循环)
+            int retryCount = 0;
+            while (true) {
+                RenBaoNewCrawlerPayResponse payResponse = requestComponent.getPayUrl(payRequest, headers);
+                if (payResponse != null && "Success".equals(payResponse.getMessage())) {
+                    String qrcodeimg = payResponse.getData() != null ? payResponse.getData().getQrcodeimg() : null;
+                    if (qrcodeimg == null || qrcodeimg.isEmpty()) {
+                        retryCount++;
+                        if (retryCount > 3) {
+                            String errMsg = payResponse.getData() != null ? payResponse.getData().getErrorMessage() : "支付二维码为空";
+                            throw new SystemException("提取支付异常," + errMsg);
+                        }
+                        log.info("支付二维码为空,重试 {}/3", retryCount);
+                        try {
+                            Thread.sleep(1000);
+                        } catch (InterruptedException e) {
+                            Thread.currentThread().interrupt();
+                        }
+                        continue;
+                    }
+                    // 成功获取支付链接
+                    resultVo.setPaymentLink(qrcodeimg);
+                    resultVo.setOrderStatus(InsOrderStatusEnum.PAY_PENDING);
+                    resultVo.setOrderStatusStr("待支付");
+                    log.info("获取支付链接成功");
+                } else {
+                    String errorMsg = payResponse != null ? payResponse.getStatusText() : "支付响应为空";
+                    throw new SystemException("提取支付异常," + errorMsg);
+                }
+                break;
+            }
+        }
+        // 状态为9:待核保
+        else if ("9".equals(underWriteFlag)) {
+            Map<String, Object> processInfo = requestComponent.getUndwrtProcessInfo(businessNo, headers);
+            if (processInfo != null && processInfo.containsKey("data")) {
+                Map<String, Object> processData = (Map<String, Object>) processInfo.get("data");
+                if (processData != null && processData.containsKey("underwritingInfos")) {
+                    List<Map<String, Object>> infos = (List<Map<String, Object>>) processData.get("underwritingInfos");
+                    if (infos != null && !infos.isEmpty()) {
+                        String msg = (String) infos.get(0).get("msg");
+                        resultVo.setErrorMsg(msg);
+                    }
+                }
+            }
+            resultVo.setOrderStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            resultVo.setOrderStatusStr("待核保");
+        }
+        // 状态为2:不通过
+        else if ("2".equals(underWriteFlag)) {
+            StringBuilder errorMsg = new StringBuilder();
+            if (!jqApplication.isEmpty()) {
+                Map<String, Object> viewResult = requestComponent.viewUndwrt(jqApplication, loginInfo.getUserCode(), headers);
+                if (viewResult != null && viewResult.containsKey("data")) {
+                    List<Map<String, Object>> dataList = (List<Map<String, Object>>) viewResult.get("data");
+                    if (dataList != null && !dataList.isEmpty()) {
+                        String handleText = (String) dataList.get(0).get("handleText");
+                        errorMsg.append("交强返回:").append(handleText).append("; ");
+                    }
+                }
+            }
+            if (!syApplication.isEmpty()) {
+                Map<String, Object> viewResult = requestComponent.viewUndwrt(syApplication, loginInfo.getUserCode(), headers);
+                if (viewResult != null && viewResult.containsKey("data")) {
+                    List<Map<String, Object>> dataList = (List<Map<String, Object>>) viewResult.get("data");
+                    if (dataList != null && !dataList.isEmpty()) {
+                        String handleText = (String) dataList.get(0).get("handleText");
+                        errorMsg.append("商业返回:").append(handleText);
+                    }
+                }
+            }
+            resultVo.setErrorMsg(errorMsg.toString());
+            resultVo.setOrderStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            resultVo.setOrderStatusStr("核保不通过");
+        }
+        // 状态为1或3:已通过
+        else if ("1".equals(underWriteFlag) || "3".equals(underWriteFlag)) {
+            resultVo.setOrderStatus(InsOrderStatusEnum.UNDERWRITED);
+            resultVo.setOrderStatusStr("已支付");
+        }
+        // 其他状态
+        else {
+            // 解析状态文本
+            String[][] statusMap = {
+                    {"0", "初始值"}, {"1", "通过"}, {"2", "不通过"}, {"3", "自动核保通过"},
+                    {"4", "见费出单待缴费"}, {"5", "见费出单待缴费"}, {"6", "待同步"},
+                    {"7", "自动待同步"}, {"9", "待核保"}, {"A", "送见费失败"},
+                    {"B", "送见费失败"}, {"C", "待取消"}, {"D", "自动核保待转保单"},
+                    {"E", "人工核保待转保单"}, {"F", "预核保转人工"}
+            };
+            String statusTxt = underWriteFlag;
+            for (String[] entry : statusMap) {
+                if (entry[0].equals(underWriteFlag)) {
+                    statusTxt = entry[1];
+                    break;
+                }
+            }
+            log.info("订单状态: {}", statusTxt);
+            resultVo.setOrderStatus(InsOrderStatusEnum.AUDIT_ING);
+            resultVo.setOrderStatusStr(statusTxt);
+        }
+
+        // 解析保单号(如果已有)
+        parsePolicyNumbers(checkResult, resultVo);
+
+        return resultVo;
     }
     }
 
 
     /**
     /**

+ 50 - 13
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java

@@ -35,8 +35,38 @@ public class FactorMatch {
      */
      */
     public static boolean judgements(List<PtlAgreementCostRule> ptlAgreementCostRuleList, List<RuleAttrMappingVo> ruleAttrMappingVoList,
     public static boolean judgements(List<PtlAgreementCostRule> ptlAgreementCostRuleList, List<RuleAttrMappingVo> ruleAttrMappingVoList,
                                      List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList, StringBuilder logs,  List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList) {
                                      List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList, StringBuilder logs,  List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList) {
-        boolean useFlag = true;
-        for (PtlAgreementCostRule ptlAgreementProductCostsAttrLink : ptlAgreementCostRuleList) {
+        if (ptlAgreementCostRuleList == null || ptlAgreementCostRuleList.isEmpty()) {
+            return false;
+        }
+        // 按batch分组:不同batch之间为OR关系,同batch内为AND关系
+        Map<String, List<PtlAgreementCostRule>> batchMap = ptlAgreementCostRuleList.stream()
+                .collect(Collectors.groupingBy(rule -> rule.getBatch() != null ? rule.getBatch() : "default",
+                        LinkedHashMap::new, Collectors.toList()));
+
+        StringBuilder errorLogs = new StringBuilder();
+        for (Map.Entry<String, List<PtlAgreementCostRule>> entry : batchMap.entrySet()) {
+            List<PtlAgreementCostRule> batchRules = entry.getValue();
+            StringBuilder batchLogs = new StringBuilder();
+            boolean batchMatched = doJudgementsMatch(batchRules, ruleAttrMappingVoList, undwrtRulesAttrList,
+                    batchLogs, undwrtRulesDictList);
+            if (batchMatched) {
+                // OR关系:只要任一个batch匹配即通过
+                return true;
+            }
+            errorLogs.append(batchLogs);
+        }
+        // 所有batch都未匹配,输出错误日志
+        logs.append(errorLogs);
+        return false;
+    }
+
+    /**
+     * 判断一个batch内的规则是否全部匹配(AND关系)
+     */
+    private static boolean doJudgementsMatch(List<PtlAgreementCostRule> batchRules, List<RuleAttrMappingVo> ruleAttrMappingVoList,
+                                             List<PtlAgreementUndwrtRulesAttr> undwrtRulesAttrList, StringBuilder logs,
+                                             List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList) {
+        for (PtlAgreementCostRule ptlAgreementProductCostsAttrLink : batchRules) {
             //查找规则中的 传值属性
             //查找规则中的 传值属性
             RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream()
             RuleAttrMappingVo ruleAttrMappingVo = ruleAttrMappingVoList.stream()
                     .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
                     .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
@@ -59,8 +89,9 @@ public class FactorMatch {
                     .findFirst()
                     .findFirst()
                     .get();
                     .get();
 
 
+            boolean useFlag;
             if(!Objects.isNull(ruleAttrMappingVo.getValue())) {
             if(!Objects.isNull(ruleAttrMappingVo.getValue())) {
-                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(),false);
+                useFlag = attrEqual(ptlAgreementProductCostsAttrLink, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), false);
             }else{
             }else{
                 useFlag = false;
                 useFlag = false;
             }
             }
@@ -97,14 +128,13 @@ public class FactorMatch {
                 logs.append("传入的值:" + (StrUtil.isNotBlank(val) ? val : ruleAttrMappingVo.getValue()) + "\n");
                 logs.append("传入的值:" + (StrUtil.isNotBlank(val) ? val : ruleAttrMappingVo.getValue()) + "\n");
 
 
                 if (CollUtil.isNotEmpty(collect)) {
                 if (CollUtil.isNotEmpty(collect)) {
-//                    logs.append("<span style=\"color:red;\">规则匹配失败:" + collect.get(0).getAttrName() + "</span>\n");
                     logs.append("规则匹配失败:" + collect.get(0).getAttrName() + "\n");
                     logs.append("规则匹配失败:" + collect.get(0).getAttrName() + "\n");
                 }
                 }
 
 
                 return false;
                 return false;
             }
             }
         }
         }
-        return useFlag;
+        return true;
     }
     }
 
 
 
 
@@ -119,8 +149,8 @@ public class FactorMatch {
                     .orElse(null);
                     .orElse(null);
             //如果查找不到 传值属性 直接费用对比失败
             //如果查找不到 传值属性 直接费用对比失败
             if (ruleAttrMappingVo == null) {
             if (ruleAttrMappingVo == null) {
-                log.info("传入的值找不到该属性:" + ptlAgreementProductCostsAttrLink.getAttrCode());
-                log.info("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+                log.info("承保规则校验-属性未找到: attrCode={}", ptlAgreementProductCostsAttrLink.getAttrCode());
+                log.info("承保规则校验-规则匹配失败: attrCode={}", ptlAgreementProductCostsAttrLink.getAttrCode());
 
 
                 List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
                 List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
                         .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
                         .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
@@ -144,14 +174,20 @@ public class FactorMatch {
                 ptlAgreementCostRule.setOperator(ptlAgreementProductCostsAttrLink.getOperator());
                 ptlAgreementCostRule.setOperator(ptlAgreementProductCostsAttrLink.getOperator());
                 ptlAgreementCostRule.setAttrCode(ptlAgreementProductCostsAttrLink.getAttrCode());
                 ptlAgreementCostRule.setAttrCode(ptlAgreementProductCostsAttrLink.getAttrCode());
                 useFlag = attrEqual(ptlAgreementCostRule, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), true);
                 useFlag = attrEqual(ptlAgreementCostRule, ptlAgreementUndwrtRulesAttr, ruleAttrMappingVo.getValue(), true);
+                log.info("承保规则校验-单属性匹配: attrCode={}, attrType={}, 规则值(min={}, max={}, operator={}), 传入值={}, useFlag={}",
+                        ptlAgreementProductCostsAttrLink.getAttrCode(), ptlAgreementUndwrtRulesAttr.getAttrType(),
+                        ptlAgreementProductCostsAttrLink.getMin(), ptlAgreementProductCostsAttrLink.getMax(),
+                        ptlAgreementProductCostsAttrLink.getOperator(), ruleAttrMappingVo.getValue(), useFlag);
             }else{
             }else{
                 useFlag = false;
                 useFlag = false;
+                log.info("承保规则校验-传入值为null: attrCode={}, useFlag=false", ptlAgreementProductCostsAttrLink.getAttrCode());
             }
             }
 
 
-            if (!useFlag) {
-                log.info("检验的值:" + ptlAgreementProductCostsAttrLink.getMin());
-                log.info("传入的值:" + ruleAttrMappingVo.getValue());
-                log.info("规则匹配失败:" + ptlAgreementProductCostsAttrLink.getAttrCode());
+            if (useFlag) {
+                log.info("承保规则校验-条件命中! attrCode={}, 传入值={}, 规则min={}, max={}, operator={}",
+                        ptlAgreementProductCostsAttrLink.getAttrCode(), ruleAttrMappingVo.getValue(),
+                        ptlAgreementProductCostsAttrLink.getMin(), ptlAgreementProductCostsAttrLink.getMax(),
+                        ptlAgreementProductCostsAttrLink.getOperator());
 
 
                 List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
                 List<PtlAgreementUndwrtRulesAttr> collect = undwrtRulesAttrList.stream()
                         .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
                         .filter(x -> x.getAttrCode().equals(ptlAgreementProductCostsAttrLink.getAttrCode()))
@@ -173,10 +209,10 @@ public class FactorMatch {
                 }
                 }
                 if (ptlAgreementProductCostsAttrLink.getMin() != null) {
                 if (ptlAgreementProductCostsAttrLink.getMin() != null) {
                     String min = codeToNameMap.getOrDefault(ptlAgreementProductCostsAttrLink.getMin(), StrUtil.EMPTY);
                     String min = codeToNameMap.getOrDefault(ptlAgreementProductCostsAttrLink.getMin(), StrUtil.EMPTY);
-                    logs.append("检验的值4:" + (StrUtil.isNotBlank(min) ? min : ptlAgreementProductCostsAttrLink.getMin()) + "\n");
+                    logs.append("检验的值:" + (StrUtil.isNotBlank(min) ? min : ptlAgreementProductCostsAttrLink.getMin()) + "\n");
                 } else {
                 } else {
                     String max = codeToNameMap.getOrDefault(ptlAgreementProductCostsAttrLink.getMax(), StrUtil.EMPTY);
                     String max = codeToNameMap.getOrDefault(ptlAgreementProductCostsAttrLink.getMax(), StrUtil.EMPTY);
-                    logs.append("检验的值5:" + (StrUtil.isNotBlank(max) ? max : ptlAgreementProductCostsAttrLink.getMax()) + "\n");
+                    logs.append("检验的值:" + (StrUtil.isNotBlank(max) ? max : ptlAgreementProductCostsAttrLink.getMax()) + "\n");
                 }
                 }
 
 
                 String val = codeToNameMap.getOrDefault(ruleAttrMappingVo.getValue(), StrUtil.EMPTY);
                 String val = codeToNameMap.getOrDefault(ruleAttrMappingVo.getValue(), StrUtil.EMPTY);
@@ -189,6 +225,7 @@ public class FactorMatch {
                 return false;
                 return false;
             }
             }
         }
         }
+        log.info("承保规则校验-所有条件均未命中, 规则组通过, useFlag={}", useFlag);
         return useFlag;
         return useFlag;
     }
     }
 
 

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/OrderOperationLogAspect.java

@@ -109,7 +109,7 @@ public class OrderOperationLogAspect {
                 // 通过 SpEL 提取 入参
                 // 通过 SpEL 提取 入参
                 DownloadPolicyVo downloadPolicyVo = parser.parseExpression(log.orderSpEl()).getValue(context, DownloadPolicyVo.class);
                 DownloadPolicyVo downloadPolicyVo = parser.parseExpression(log.orderSpEl()).getValue(context, DownloadPolicyVo.class);
                 result = joinPoint.proceed();
                 result = joinPoint.proceed();
-                this.downloadLog("1988155511437271040",result,log);
+                this.downloadLog(downloadPolicyVo.getOrder().getOrdersNo(),result,log);
                 break;
                 break;
             // 同步订单
             // 同步订单
             case 9:
             case 9:

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

@@ -159,38 +159,45 @@ public class AuditVerificationAspect {
 
 
         List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList = ptlNewAgreementClient.getUndwrtRulesDictList();
         List<PtlAgreementUndwrtRulesDictLabal> undwrtRulesDictList = ptlNewAgreementClient.getUndwrtRulesDictList();
 
 
+        log.info("=== 承保规则校验开始, 规则组数={}, 传入属性数={} ===", ruleGroups == null ? 0 : ruleGroups.size(), ruleAttrMappingVoList.size());
+
         // 多条规则间为OR关系:只要任一条规则匹配即通过
         // 多条规则间为OR关系:只要任一条规则匹配即通过
         StringBuilder allErrorLogs = new StringBuilder();
         StringBuilder allErrorLogs = new StringBuilder();
         boolean anyRuleMatched = false;
         boolean anyRuleMatched = false;
 
 
+        int groupIndex = 0;
         for (List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementUndwrtRulesNews : ruleGroups) {
         for (List<PtlAgreementUndwrtRulesAttrLink> ptlAgreementUndwrtRulesNews : ruleGroups) {
+            groupIndex++;
             if (ptlAgreementUndwrtRulesNews == null || ptlAgreementUndwrtRulesNews.isEmpty()) {
             if (ptlAgreementUndwrtRulesNews == null || ptlAgreementUndwrtRulesNews.isEmpty()) {
+                log.info("规则组[{}]为空, 跳过", groupIndex);
                 continue;
                 continue;
             }
             }
-            boolean ruleMatched = true;
             StringBuilder ruleLogs = new StringBuilder();
             StringBuilder ruleLogs = new StringBuilder();
 
 
-            for (int i = 0; i < ruleAttrMappingVoList.size(); i++) {
-                //判断是否匹配
-                if (!FactorMatch.judgementsUnderwrite(ptlAgreementUndwrtRulesNews, ruleAttrMappingVoList, undwrtRulesAttrList, ruleLogs, undwrtRulesDictList)) {
-                    ruleMatched = false;
-                    break;
-                }else{
-                    //如果没有出现异常则清空匹配消息
-                    ruleLogs.delete(0,ruleLogs.length());
-                }
+            log.info("规则组[{}]开始匹配, 条件数={}", groupIndex, ptlAgreementUndwrtRulesNews.size());
+            // 打印规则组详情
+            for (PtlAgreementUndwrtRulesAttrLink link : ptlAgreementUndwrtRulesNews) {
+                log.info("  -> 条件: attrCode={}, min={}, max={}, operator={}", link.getAttrCode(), link.getMin(), link.getMax(), link.getOperator());
             }
             }
 
 
+            // 直接判断该规则组是否匹配,无需循环调用
+            boolean ruleMatched = FactorMatch.judgementsUnderwrite(ptlAgreementUndwrtRulesNews, ruleAttrMappingVoList, undwrtRulesAttrList, ruleLogs, undwrtRulesDictList);
+
+            log.info("规则组[{}]匹配结果: ruleMatched={}, 错误日志=[{}]", groupIndex, ruleMatched, ruleLogs.toString());
+
             if (ruleMatched) {
             if (ruleMatched) {
                 anyRuleMatched = true;
                 anyRuleMatched = true;
+                log.info("规则组[{}]匹配成功, 订单通过!", groupIndex);
                 break; // OR关系:任一条规则通过即可
                 break; // OR关系:任一条规则通过即可
             }
             }
             allErrorLogs.append(ruleLogs);
             allErrorLogs.append(ruleLogs);
         }
         }
 
 
         if (!anyRuleMatched) {
         if (!anyRuleMatched) {
+            log.info("=== 承保规则校验失败, 所有规则组均未通过, 抛出异常 ===");
             throw new SystemException(allErrorLogs.toString());
             throw new SystemException(allErrorLogs.toString());
         }
         }
+        log.info("=== 承保规则校验通过 ===");
     }
     }
 
 
 }
 }

+ 3 - 3
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java

@@ -802,9 +802,9 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
                 ordersOther = new InsOrdersOther();
                 ordersOther = new InsOrdersOther();
                 ordersOther.setOrderNo(ordersNo);
                 ordersOther.setOrderNo(ordersNo);
                 // 赔付率
                 // 赔付率
-                ordersOther.setLossRation(new BigDecimal(quoteResponse.getScoreVo().getLossRation() != null ? quoteResponse.getScoreVo().getLossRation() : "0"));
-                ordersOther.setJqLossRation(new BigDecimal(quoteResponse.getScoreVo().getJqLossRation() != null ? quoteResponse.getScoreVo().getJqLossRation() : "0"));
-                ordersOther.setSyLossRation(new BigDecimal(quoteResponse.getScoreVo().getSyLossRation() != null ? quoteResponse.getScoreVo().getSyLossRation() : "0"));
+                ordersOther.setLossRation(new BigDecimal(StringUtils.isNotEmpty(quoteResponse.getScoreVo().getLossRation())  ? quoteResponse.getScoreVo().getLossRation() : "0"));
+                ordersOther.setJqLossRation(new BigDecimal(StringUtils.isNotEmpty(quoteResponse.getScoreVo().getJqLossRation()) ? quoteResponse.getScoreVo().getJqLossRation() : "0"));
+                ordersOther.setSyLossRation(new BigDecimal(StringUtils.isNotEmpty(quoteResponse.getScoreVo().getSyLossRation()) ? quoteResponse.getScoreVo().getSyLossRation() : "0"));
                 // 续保
                 // 续保
                 ordersOther.setJqRenewal(quoteResponse.getScoreVo().getJqRenewal() != null ? Integer.parseInt(quoteResponse.getScoreVo().getJqRenewal()) : null);
                 ordersOther.setJqRenewal(quoteResponse.getScoreVo().getJqRenewal() != null ? Integer.parseInt(quoteResponse.getScoreVo().getJqRenewal()) : null);
                 ordersOther.setSyRenewal(quoteResponse.getScoreVo().getSyRenewal() != null ? Integer.parseInt(quoteResponse.getScoreVo().getSyRenewal()) : null);
                 ordersOther.setSyRenewal(quoteResponse.getScoreVo().getSyRenewal() != null ? Integer.parseInt(quoteResponse.getScoreVo().getSyRenewal()) : null);

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

@@ -21,6 +21,7 @@ import com.jzg.quotation.taikang.crawler.model.entity.TKPremium;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
@@ -128,6 +129,13 @@ public class TkCrawlerQuoteResultsBuild {
         quoteResultsVo.getCosts().setVvTax(preciseInitResult.getCarTax().getSumPayment().toString());
         quoteResultsVo.getCosts().setVvTax(preciseInitResult.getCarTax().getSumPayment().toString());
         // 设置非车险(驾意险)保费
         // 设置非车险(驾意险)保费
         quoteResultsVo.getCosts().setNiPremium(premium.getJyxPremium().toString());
         quoteResultsVo.getCosts().setNiPremium(premium.getJyxPremium().toString());
+        // 设置总费用
+        BigDecimal ci = premium.getJqPremium() == null ? BigDecimal.ZERO : premium.getJqPremium();
+        BigDecimal bi = premium.getSyPremium() == null ? BigDecimal.ZERO : premium.getSyPremium();
+        BigDecimal vv = preciseInitResult.getCarTax().getSumPayment() == null ? BigDecimal.ZERO : preciseInitResult.getCarTax().getSumPayment();
+        BigDecimal total = ci.add(bi).add(vv);
+        quoteResultsVo.getCosts().setSumPremium(total.toPlainString());
+        // 设置订单状态
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         // 缓存报价书据数据
         // 缓存报价书据数据
         redisCacheUtil.setPreciseInitResult(preciseInitResult, quoteResultsVo.getOrdersNo());
         redisCacheUtil.setPreciseInitResult(preciseInitResult, quoteResultsVo.getOrdersNo());

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

@@ -364,35 +364,40 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
      */
      */
     @Override
     @Override
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
     public void uploadImage(InsuranceUploadImageVo insuranceUploadImageVo) {
-        //获取归属信息
-        AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder().getAttributionInformationVo();
-        TaiShanCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaiShanCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
-        HttpHeaders headers = taiShanCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), parameters.getComCode());
-        TaiShanCrawlerOrder taiShanCrawlerOrder = taiShanCrawlerOrderService.getByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
-        // 上传影像文件请求参数
-        TaiShanCrawlerImageUploadRequest taiShanCrawlerImageUploadRequest = new TaiShanCrawlerImageUploadRequest();
-        taiShanCrawlerImageUploadRequest.setBiProposalNo(taiShanCrawlerOrder.getSyApplyNo());
-        taiShanCrawlerImageUploadRequest.setCiProposalNo(taiShanCrawlerOrder.getCiApplyNo());
-        taiShanCrawlerImageUploadRequest.setCompanyCode(parameters.getComCode());
-
-        List<TaiShanCrawlerImageUploadRequest.ImageNode> imageNodes = new LinkedList<>();
-        for (InsuranceImageVo imageVo : insuranceUploadImageVo.getImageVoList()) {
-            TaiShanCrawlerImageUploadRequest.ImageNode imageNode = new TaiShanCrawlerImageUploadRequest.ImageNode();
-            imageNode.setType(getImageType(imageVo.getImageCode()));
-            List<TaiShanCrawlerImageUploadRequest.ImageInfo> images = new ArrayList<>();
-            for (InsuranceImageVo.ImageDTO imageDTO : imageVo.getImageBase64List()) {
-                images.add(new TaiShanCrawlerImageUploadRequest.ImageInfo(imageDTO.getImageName(), imageDTO.getImageBase64Str()));
+        try {
+            //获取归属信息
+            AttributionInformationVo attributionInformationVo = insuranceUploadImageVo.getOrder().getAttributionInformationVo();
+            TaiShanCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaiShanCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
+            HttpHeaders headers = taiShanCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), parameters.getComCode());
+            TaiShanCrawlerOrder taiShanCrawlerOrder = taiShanCrawlerOrderService.getByOrdersNo(insuranceUploadImageVo.getOrder().getOrdersNo());
+            // 上传影像文件请求参数
+            TaiShanCrawlerImageUploadRequest taiShanCrawlerImageUploadRequest = new TaiShanCrawlerImageUploadRequest();
+            taiShanCrawlerImageUploadRequest.setBiProposalNo(taiShanCrawlerOrder.getSyApplyNo());
+            taiShanCrawlerImageUploadRequest.setCiProposalNo(taiShanCrawlerOrder.getCiApplyNo());
+            taiShanCrawlerImageUploadRequest.setCompanyCode(parameters.getComCode());
+
+            List<TaiShanCrawlerImageUploadRequest.ImageNode> imageNodes = new LinkedList<>();
+            for (InsuranceImageVo imageVo : insuranceUploadImageVo.getImageVoList()) {
+                TaiShanCrawlerImageUploadRequest.ImageNode imageNode = new TaiShanCrawlerImageUploadRequest.ImageNode();
+                imageNode.setType(getImageType(imageVo.getImageCode()));
+                List<TaiShanCrawlerImageUploadRequest.ImageInfo> images = new ArrayList<>();
+                for (InsuranceImageVo.ImageDTO imageDTO : imageVo.getImageBase64List()) {
+                    images.add(new TaiShanCrawlerImageUploadRequest.ImageInfo(imageDTO.getImageName(), imageDTO.getImageBase64Str()));
+                }
+                imageNode.setImages(images);
+                imageNodes.add(imageNode);
             }
             }
-            imageNode.setImages(images);
-            imageNodes.add(imageNode);
+            taiShanCrawlerImageUploadRequest.setImageNodes(imageNodes);
+            taiShanCrawlerImageUploadRequest.setOperatorCode(parameters.getSaleCode());
+            taiShanCrawlerImageUploadRequest.setOperatorName(parameters.getSaleName());
+            taiShanCrawlerImageUploadRequest.setOrderNo(taiShanCrawlerOrder.getOrderNo());
+            taiShanCrawlerImageUploadRequest.setUploadFlag("D");
+            TaiShanCrawlerImageUploadResponse taiShanCrawlerImageUploadResponse = taiShanCrawlerRequestComponent.uploadImage(taiShanCrawlerImageUploadRequest, headers);
+            log.info("taiShanCrawlerImageUploadResponse对象的值:{}", JSON.toJSONString(taiShanCrawlerImageUploadResponse));
+        } catch (Exception e) {
+            log.error("泰山影像上传失败", e);
+            throw new RuntimeException("泰山影像上传失败: " + e.getMessage(), e);
         }
         }
-        taiShanCrawlerImageUploadRequest.setImageNodes(imageNodes);
-        taiShanCrawlerImageUploadRequest.setOperatorCode(parameters.getSaleCode());
-        taiShanCrawlerImageUploadRequest.setOperatorName(parameters.getSaleName());
-        taiShanCrawlerImageUploadRequest.setOrderNo(taiShanCrawlerOrder.getOrderNo());
-        taiShanCrawlerImageUploadRequest.setUploadFlag("D");
-        TaiShanCrawlerImageUploadResponse taiShanCrawlerImageUploadResponse = taiShanCrawlerRequestComponent.uploadImage(taiShanCrawlerImageUploadRequest, headers);
-        log.info("taiShanCrawlerImageUploadResponse对象的值:{}", JSON.toJSONString(taiShanCrawlerImageUploadResponse));
     }
     }
 
 
 
 

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

@@ -205,7 +205,7 @@ public class ZiJinCrawlerQuoteResultsVoBuild {
         }
         }
 
 
         // 计算总保费
         // 计算总保费
-        // calculateSumPremium(quoteResultsVo);
+        calculateSumPremium(quoteResultsVo);
     }
     }
 
 
     /**
     /**

+ 1 - 1
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/component/ZiJinCrawlerRequestComponent.java

@@ -113,12 +113,12 @@ public class ZiJinCrawlerRequestComponent {
      */
      */
     public ZiJinCrawlerCheckCaptchaResponse checkCaptchaAndGetToken(ZiJinCrawlerCheckCaptchaRequest ziJinCrawlerCheckCaptchaRequest, String token) throws IOException {
     public ZiJinCrawlerCheckCaptchaResponse checkCaptchaAndGetToken(ZiJinCrawlerCheckCaptchaRequest ziJinCrawlerCheckCaptchaRequest, String token) throws IOException {
         log.info("ziJinCrawlerCheckCaptchaRequest请求参数的值:{}", JSON.toJSONString(ziJinCrawlerCheckCaptchaRequest));
         log.info("ziJinCrawlerCheckCaptchaRequest请求参数的值:{}", JSON.toJSONString(ziJinCrawlerCheckCaptchaRequest));
-
         HttpHeaders httpHeaders = setHttpHeaders();
         HttpHeaders httpHeaders = setHttpHeaders();
         httpHeaders.setContentLength(289);
         httpHeaders.setContentLength(289);
         // 需要单独设置这个
         // 需要单独设置这个
         httpHeaders.set("Authorization", token);
         httpHeaders.set("Authorization", token);
         httpHeaders.set("loginToken", token);
         httpHeaders.set("loginToken", token);
+
         String jsonString = JSON.toJSONString(ziJinCrawlerCheckCaptchaRequest);
         String jsonString = JSON.toJSONString(ziJinCrawlerCheckCaptchaRequest);
         ResponseEntity<ZiJinCrawlerCheckCaptchaResponse> responseEntity = requestComponent.post(RequestUrl.CHECKCAPTCHAANDGETTOKEN.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerCheckCaptchaResponse.class, httpHeaders);
         ResponseEntity<ZiJinCrawlerCheckCaptchaResponse> responseEntity = requestComponent.post(RequestUrl.CHECKCAPTCHAANDGETTOKEN.getRequestUrl(ziJinCrawlerProperties.getBaseUrl()), jsonString, ZiJinCrawlerCheckCaptchaResponse.class, httpHeaders);
         return responseEntity.getBody();
         return responseEntity.getBody();

+ 10 - 0
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/entity/ZiJinCrawlerConfigureParameters.java

@@ -36,4 +36,14 @@ public class ZiJinCrawlerConfigureParameters implements ConfigureParameters {
      */
      */
     private String comName;
     private String comName;
 
 
+    /**
+     * 代理code
+     */
+    private String 代理code;
+
+    /**
+     * 渠道: 比如 个人代理
+     */
+    private String businessNatureName;
+
 }
 }

+ 2 - 6
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerQuoteProcessServiceImpl.java

@@ -40,9 +40,6 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
     // 登陆次数
     // 登陆次数
     public static final int LOGINS_NUMBER = 3;
     public static final int LOGINS_NUMBER = 3;
 
 
-    private final String USER_NAME = "214003053";
-    private final String PASSWORD = "Jieke896.";
-
     /**
     /**
      * 登录
      * 登录
      *
      *
@@ -138,9 +135,8 @@ public class ZiJinCrawlerQuoteProcessServiceImpl implements ZiJinCrawlerQuotePro
         String authorization = ziJinCrawlerCacheComponent.getAuthorization(username);
         String authorization = ziJinCrawlerCacheComponent.getAuthorization(username);
         log.info("authorization:{}", authorization);
         log.info("authorization:{}", authorization);
         if (authorization == null) {
         if (authorization == null) {
-            // TODO: 暂时硬编码,后续调整
-            login(USER_NAME, PASSWORD);
-            authorization = ziJinCrawlerCacheComponent.getAuthorization(USER_NAME);
+            login(username, password);
+            authorization = ziJinCrawlerCacheComponent.getAuthorization(username);
         }
         }
 
 
         try {
         try {

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

@@ -118,22 +118,15 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         HttpHeaders headers = ziJinCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
         log.info("headers参数的值:{}", JSON.toJSONString(headers));
         log.info("headers参数的值:{}", JSON.toJSONString(headers));
 
 
-        String userCode = ziJinCrawlerCacheComponent.getUserCode(attributionInformationVo.getUsername());
-        log.info("userCode:{}", userCode);
-
         // 1.1 解析配置参数
         // 1.1 解析配置参数
         ZiJinCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
         ZiJinCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(ZiJinCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
         log.info("parameters参数的值:{}", JSON.toJSONString(parameters));
         log.info("parameters参数的值:{}", JSON.toJSONString(parameters));
 
 
-        // 1.2 构建归属信息(机构、套餐、渠道信息)
-        // ProposalInfoDTO proposalInfoDTO = boHaiBuildingAttributionInformation.build(parameters, userCode, headers);
         try {
         try {
-            String comCode = "2140000601";
-
             // 查询车辆信息
             // 查询车辆信息
             ZiJinCrawlerCarRequest ziJinCrawlerCarRequest = new ZiJinCrawlerCarRequest();
             ZiJinCrawlerCarRequest ziJinCrawlerCarRequest = new ZiJinCrawlerCarRequest();
             ziJinCrawlerCarRequest.setChannelCode("KSCD_PROD");
             ziJinCrawlerCarRequest.setChannelCode("KSCD_PROD");
-            ziJinCrawlerCarRequest.setComCode(comCode);
+            ziJinCrawlerCarRequest.setComCode(parameters.getComCode());
             ziJinCrawlerCarRequest.setLicenseNo(quoteVo.getCarInfoVo().getLicenseNo());
             ziJinCrawlerCarRequest.setLicenseNo(quoteVo.getCarInfoVo().getLicenseNo());
             ziJinCrawlerCarRequest.setVin(quoteVo.getCarInfoVo().getVinNo());
             ziJinCrawlerCarRequest.setVin(quoteVo.getCarInfoVo().getVinNo());
             ZiJinCrawlerCarResponse ziJinCrawlerCarResponse = ziJinCrawlerRequestComponent.car(ziJinCrawlerCarRequest, headers);
             ZiJinCrawlerCarResponse ziJinCrawlerCarResponse = ziJinCrawlerRequestComponent.car(ziJinCrawlerCarRequest, headers);
@@ -156,7 +149,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             //  报价接口
             //  报价接口
             ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest = new ZiJinCrawlerQuotationRequest();
             ZiJinCrawlerQuotationRequest ziJinCrawlerQuotationRequest = new ZiJinCrawlerQuotationRequest();
             // 设置基础信息
             // 设置基础信息
-            ziJinCrawlerQuotationRequest.setBaseInfo(buildBaseInfo(quoteVo));
+            ziJinCrawlerQuotationRequest.setBaseInfo(buildBaseInfo(quoteVo, parameters, attributionInformationVo.getUsername()));
 
 
             // 设置车主信息
             // 设置车主信息
             ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = buildCarOwnerInfo(quoteVo);
             ZiJinCrawlerQuotationRequest.CarOwnerInfo carOwnerInfo = buildCarOwnerInfo(quoteVo);
@@ -180,8 +173,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
             ziJinCrawlerQuotationRequest.setProductName("机动车保险");
             ziJinCrawlerQuotationRequest.setProductName("机动车保险");
 
 
             // 设置减税信息
             // 设置减税信息
-            ziJinCrawlerQuotationRequest.setTaxRelifInfo(buildTaxRelifInfo(quoteVo, carOwnerInfo, comCode, headers));
-
+            ziJinCrawlerQuotationRequest.setTaxRelifInfo(buildTaxRelifInfo(quoteVo, carOwnerInfo, parameters.getComCode(), headers));
             // 设置险种列表
             // 设置险种列表
             Double actualValue = null;
             Double actualValue = null;
             if (ziJinCrawlerGetCarActualValueResponse != null && StringUtils.hasLength(ziJinCrawlerGetCarActualValueResponse.getActualValue())) {
             if (ziJinCrawlerGetCarActualValueResponse != null && StringUtils.hasLength(ziJinCrawlerGetCarActualValueResponse.getActualValue())) {
@@ -801,16 +793,16 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
      *
      *
      * @return ZiJinCrawlerQuotationRequest.BaseInfo
      * @return ZiJinCrawlerQuotationRequest.BaseInfo
      */
      */
-    private ZiJinCrawlerQuotationRequest.BaseInfo buildBaseInfo(QuoteVo quoteVo) {
+    private ZiJinCrawlerQuotationRequest.BaseInfo buildBaseInfo(QuoteVo quoteVo, ZiJinCrawlerConfigureParameters parameters, String operatorCode) {
         ZiJinCrawlerQuotationRequest.BaseInfo baseInfo = new ZiJinCrawlerQuotationRequest.BaseInfo();
         ZiJinCrawlerQuotationRequest.BaseInfo baseInfo = new ZiJinCrawlerQuotationRequest.BaseInfo();
-        baseInfo.setAgentCode("P214001000622");
-        baseInfo.setAgreementNo("P214001000622-01");
+        baseInfo.setAgentCode(parameters.get代理code());
+        baseInfo.setAgreementNo(parameters.get代理code()+"-01");
         baseInfo.setBusinessNature("1");
         baseInfo.setBusinessNature("1");
-        baseInfo.setComCode("2140105601");
-        baseInfo.setComName("山西太原综改支公司直销业务一部");
-        baseInfo.setHandler1Code("214003263");
-        baseInfo.setHandler1Name("程涛");
-        baseInfo.setOperatorCode("214003053");
+        baseInfo.setComCode(parameters.getComCode());
+        baseInfo.setComName(parameters.getComName());
+        baseInfo.setHandler1Code(parameters.getUserCode());
+        baseInfo.setHandler1Name(parameters.getUserName());
+        baseInfo.setOperatorCode(operatorCode);
         baseInfo.setStartDate(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
         baseInfo.setStartDate(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
         baseInfo.setStartDateCI(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
         baseInfo.setStartDateCI(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
         baseInfo.setStartHour("00");
         baseInfo.setStartHour("00");
@@ -827,13 +819,13 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
         baseInfo.setXbFlag(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setXbFlag(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setXbFlagCI(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setXbFlagCI(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setGoalInsuredFlag("0");
         baseInfo.setGoalInsuredFlag("0");
-        baseInfo.setConfigName("天勤");
+        baseInfo.setConfigName("");
         baseInfo.setId("1dec8ac2ced74973842a5b098669813a");
         baseInfo.setId("1dec8ac2ced74973842a5b098669813a");
-        baseInfo.setBusinessName("个人代理");
+        baseInfo.setBusinessName(parameters.getBusinessNatureName());
         baseInfo.setIdMongo("1dec8ac2ced74973842a5b098669813a");
         baseInfo.setIdMongo("1dec8ac2ced74973842a5b098669813a");
-        baseInfo.setDesc("天勤");
-        baseInfo.setHanderCode("214003263");
-        baseInfo.setHanderName("程涛");
+        baseInfo.setDesc("");
+        baseInfo.setHanderCode(parameters.getUserCode());
+        baseInfo.setHanderName(parameters.getUserName());
         baseInfo.setDemandNo("01ZKIC140026051910017933666448");
         baseInfo.setDemandNo("01ZKIC140026051910017933666448");
         if (quoteVo.getBiRiskInfoVo() != null) {
         if (quoteVo.getBiRiskInfoVo() != null) {
             baseInfo.setDemandNoCI("01ZKIC140026051910017933666448");// 这个先放开看行不
             baseInfo.setDemandNoCI("01ZKIC140026051910017933666448");// 这个先放开看行不

+ 10 - 8
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

@@ -26,10 +26,7 @@ import com.jzg.commons.util.idgen.IdGenerate;
 import com.jzg.organization.mapper.PtlAgreementCostMapper;
 import com.jzg.organization.mapper.PtlAgreementCostMapper;
 import com.jzg.organization.mapper.PtlAgreementCostRuleMapper;
 import com.jzg.organization.mapper.PtlAgreementCostRuleMapper;
 import com.jzg.organization.mapper.PtlAgreementCostTypeMapper;
 import com.jzg.organization.mapper.PtlAgreementCostTypeMapper;
-import com.jzg.organization.service.PtlAgreementCostRuleService;
-import com.jzg.organization.service.PtlAgreementCostService;
-import com.jzg.organization.service.PtlAgreementCostTypeService;
-import com.jzg.organization.service.PtlAgreementUndwrtRulesAttrService;
+import com.jzg.organization.service.*;
 import com.jzg.organization.state.CostState;
 import com.jzg.organization.state.CostState;
 import com.jzg.organization.state.listener.CostStateListener;
 import com.jzg.organization.state.listener.CostStateListener;
 import io.seata.spring.annotation.GlobalTransactional;
 import io.seata.spring.annotation.GlobalTransactional;
@@ -89,6 +86,9 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
     @Autowired
     @Autowired
     private PtlAgreementCostRuleMapper ptlAgreementCostRuleMapper;
     private PtlAgreementCostRuleMapper ptlAgreementCostRuleMapper;
 
 
+    @Autowired
+    private PtlAgreementService ptlAgreementService;
+
     /**
     /**
      * 报价配置/费用管理/新增费用
      * 报价配置/费用管理/新增费用
      *
      *
@@ -117,6 +117,7 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
                     log.info("新增费用的时候,需要指定关联的协议信息。ptlAgreemenCostAdd=[{}]", JSONUtil.toJsonStr(ptlAgreemenCostAdd));
                     log.info("新增费用的时候,需要指定关联的协议信息。ptlAgreemenCostAdd=[{}]", JSONUtil.toJsonStr(ptlAgreemenCostAdd));
                     return HttpResult.error("新增费用的时候,需要指定关联的协议信息");
                     return HttpResult.error("新增费用的时候,需要指定关联的协议信息");
                 }
                 }
+                PtlAgreement agreement = ptlAgreementService.getById(costAdd.getPtlAgreementId());
                 ptlAgreementCostAdd.setPtlAgreementId(costAdd.getPtlAgreementId());
                 ptlAgreementCostAdd.setPtlAgreementId(costAdd.getPtlAgreementId());
                 ptlAgreementCostAdd.setProductId(costAdd.getProductId());
                 ptlAgreementCostAdd.setProductId(costAdd.getProductId());
                 ptlAgreementCostAdd.setProductName(costAdd.getProductName());
                 ptlAgreementCostAdd.setProductName(costAdd.getProductName());
@@ -127,7 +128,7 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
 //                    throw new SystemException("已存在相同且有效的费用规则,请检查");
 //                    throw new SystemException("已存在相同且有效的费用规则,请检查");
 //                }
 //                }
                 PtlAgreementCost ptlAgreementCost = BeanUtil.copyProperties(ptlAgreementCostAdd, PtlAgreementCost.class);
                 PtlAgreementCost ptlAgreementCost = BeanUtil.copyProperties(ptlAgreementCostAdd, PtlAgreementCost.class);
-                ptlAgreementCost.setCostRules(buildDescString(ptlAgreementCostAdd.getRuleConditions()));
+                ptlAgreementCost.setCostRules(buildDescString(agreement.getCompanyId(), ptlAgreementCostAdd.getRuleConditions()));
                 if (baseMapper.insert(ptlAgreementCost) <= 0) {
                 if (baseMapper.insert(ptlAgreementCost) <= 0) {
                     log.error("插入操作失败");
                     log.error("插入操作失败");
                     throw new RuntimeException(ReturnInformation.FAILURE_MESSAGE);
                     throw new RuntimeException(ReturnInformation.FAILURE_MESSAGE);
@@ -167,10 +168,11 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
                 }
                 }
             }
             }
         }
         }
+        PtlAgreement agreement = ptlAgreementService.getById(ptlAgreementCostEnd.getPtlAgreementId());
         PtlAgreementCost ptlAgreementCost = BeanUtil.copyProperties(ptlAgreementCostEnd, PtlAgreementCost.class);
         PtlAgreementCost ptlAgreementCost = BeanUtil.copyProperties(ptlAgreementCostEnd, PtlAgreementCost.class);
         // modify by lipf, 2026年5月22日11:28:34 设置为待审核状态
         // modify by lipf, 2026年5月22日11:28:34 设置为待审核状态
         ptlAgreementCost.setApproved(0);
         ptlAgreementCost.setApproved(0);
-        ptlAgreementCost.setCostRules(buildDescString(ptlAgreementCostEnd.getRuleConditions()));
+        ptlAgreementCost.setCostRules(buildDescString(agreement.getCompanyId(), ptlAgreementCostEnd.getRuleConditions()));
         if (baseMapper.updateById(ptlAgreementCost) <= 0) {
         if (baseMapper.updateById(ptlAgreementCost) <= 0) {
             throw new RuntimeException(ReturnInformation.UPDATE_FAILED);
             throw new RuntimeException(ReturnInformation.UPDATE_FAILED);
         }
         }
@@ -196,11 +198,11 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
     }
     }
 
 
 
 
-    public String buildDescString(List<?> list){
+    public String buildDescString(String companyId, List<?> list){
         if (CollectionUtils.isEmpty(list)){
         if (CollectionUtils.isEmpty(list)){
             return null;
             return null;
         }
         }
-        return BuildDescUtils.buildDesc(BeanUtil.copyToList(list, PtlAgreementUndwrtRulesAttr.class), agreementUndwrtRulesAttrService.getUndwrtRulesAttrList());
+        return BuildDescUtils.buildDesc(companyId, BeanUtil.copyToList(list, PtlAgreementUndwrtRulesAttr.class), agreementUndwrtRulesAttrService.getUndwrtRulesAttrList());
     }
     }
 
 
     public boolean verify(PtlAgreementCostAdd ptlAgreementCostAdd){
     public boolean verify(PtlAgreementCostAdd ptlAgreementCostAdd){