Procházet zdrojové kódy

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

lipf před 2 měsíci
rodič
revize
312ea02f04
21 změnil soubory, kde provedl 506 přidání a 102 odebrání
  1. 51 0
      commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostBatchAdjustParam.java
  2. 24 2
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/entity/request/PremiumCalculationRequest.java
  3. 18 12
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java
  4. 83 2
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java
  5. 1 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerRequestImpl.java
  6. 37 8
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/build/DaJiaCrawlerQuoteResultsVoBuild.java
  7. 1 1
      tenant/insurance/quotation-dajia/src/main/java/com/jzg/quotation/dajia/crawler/service/impl/DaJiaCrawlerRequestImpl.java
  8. 4 11
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Request/PremiumRequest.java
  9. 1 1
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerCacheComponent.java
  10. 2 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/dto/GuoRenPrpTmainDTO.java
  11. 2 2
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  12. 1 5
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerRequestImpl.java
  13. 21 10
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java
  14. 7 5
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/aspect/QuoteVerificationAspect.java
  15. 4 3
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsOrdersServiceImpl.java
  16. 111 15
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java
  17. 10 2
      tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/entity/request/YangGuangAccuracyCalculateRequest.java
  18. 20 20
      tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/constant/enums/ZmCrawlerFloatFlag.java
  19. 7 0
      tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java
  20. 9 0
      tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java
  21. 92 0
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

+ 51 - 0
commons/src/main/java/com/jzg/commons/entity/dto/PtlAgreementCostBatchAdjustParam.java

@@ -0,0 +1,51 @@
+package com.jzg.commons.entity.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+/**
+ * 批量加减费用请求参数
+ *
+ * @author lipf
+ * @date 2026/7/24
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "批量加减费用请求参数")
+public class PtlAgreementCostBatchAdjustParam {
+
+    @NotEmpty(message = "费用ID列表不能为空")
+    @Schema(description = "费用ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> costIds;
+
+    @NotNull(message = "操作类型不能为空")
+    @Schema(description = "操作类型:ADD-加,SUBTRACT-减", requiredMode = Schema.RequiredMode.REQUIRED, example = "ADD")
+    private String operationType;
+
+    @Schema(description = "交强险入口比例调整值(百分比)")
+    private BigDecimal jqInletRatio;
+
+    @Schema(description = "交强险出口比例调整值(百分比)")
+    private BigDecimal jqExportRatio;
+
+    @Schema(description = "商业险入口比例调整值(百分比)")
+    private BigDecimal syInletRatio;
+
+    @Schema(description = "商业险出口比例调整值(百分比)")
+    private BigDecimal syExportRatio;
+
+    @Schema(description = "驾意险入口比例调整值(百分比)")
+    private BigDecimal jyInletRatio;
+
+    @Schema(description = "驾意险出口比例调整值(百分比)")
+    private BigDecimal jyExportRatio;
+
+}

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

@@ -18,6 +18,7 @@ import lombok.NoArgsConstructor;
 
 import java.math.BigDecimal;
 import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
@@ -656,13 +657,24 @@ public class PremiumCalculationRequest {
         private String endDate;
 
         public static List<Risk> buildRiskList(RiskInfoVo ciRiskInfoVo,RiskInfoVo biRiskInfoVo) {
+            String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
             List<Risk> riskList = new ArrayList<>();
             if (ciRiskInfoVo != null) {
                 Risk risk = new Risk();
                 risk.setRiskCode("0801");
                 risk.setStartDate(XmlDateTimeFormatter.format(ciRiskInfoVo.getStartDate()));
                 risk.setEndDate(XmlDateTimeFormatter.format(ciRiskInfoVo.getEndDate()));
-                risk.setEffectFlag(ciRiskInfoVo.isInstantFlag() ? "1" : "0");
+                String startDate = ciRiskInfoVo.getStartDate();
+                // 判断及时起保 是否为今天 是否为0点
+                if (startDate != null && startDate.length() >= 19) {
+                    String datePart = startDate.substring(0, 10);
+                    String timePart = startDate.substring(11);
+                    if (today.equals(datePart) && !"00:00:00".equals(timePart)) {
+                        risk.setEffectFlag("1");
+                    } else {
+                        risk.setEffectFlag("0");
+                    }
+                }
                 riskList.add(risk);
             }
             if (biRiskInfoVo != null) {
@@ -670,7 +682,17 @@ public class PremiumCalculationRequest {
                 risk.setRiskCode("0808");
                 risk.setStartDate(XmlDateTimeFormatter.format(biRiskInfoVo.getStartDate()));
                 risk.setEndDate(XmlDateTimeFormatter.format(biRiskInfoVo.getEndDate()));
-                risk.setEffectFlag(biRiskInfoVo.isInstantFlag() ? "1" : "0");
+                String startDate = biRiskInfoVo.getStartDate();
+                // 判断及时起保 是否为今天 是否为0点
+                if (startDate != null && startDate.length() >= 19) {
+                    String datePart = startDate.substring(0, 10);
+                    String timePart = startDate.substring(11);
+                    if (today.equals(datePart) && !"00:00:00".equals(timePart)) {
+                        risk.setEffectFlag("1");
+                    } else {
+                        risk.setEffectFlag("0");
+                    }
+                }
                 riskList.add(risk);
             }
             return riskList;

+ 18 - 12
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java

@@ -6,6 +6,7 @@ import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.dadi.crawler.entity.response.DaDiQuoteResponse;
+import com.jzg.quotation.dadi.crawler.entity.response.DaDiVehiclePricResponse;
 import com.jzg.quotation.dadi.utils.DaDiVehicleUtils;
 import org.apache.http.util.TextUtils;
 
@@ -20,7 +21,7 @@ import java.util.List;
  */
 public class DaDiCrawlerQuoteResultVoBuild {
 
-    public static QuoteResultsVo build(QuoteVo quoteVo, DaDiQuoteResponse daDiQuoteResponse) {
+    public static QuoteResultsVo build(QuoteVo quoteVo, DaDiQuoteResponse daDiQuoteResponse, DaDiVehiclePricResponse vehiclePricResponse) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         DaDiQuoteResponse.UwResultDTO uwResult = daDiQuoteResponse.getUwResult();
@@ -32,7 +33,6 @@ public class DaDiCrawlerQuoteResultVoBuild {
 
         for (DaDiQuoteResponse.UwResultDTO.UnderwriteRuleInfosDTO underwriteRuleInfo : underwriteRuleInfos) {
             if (!"3".equals(underwriteRuleInfo.getUwType())) {
-                quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.PAY_PENDING);
                 eMsg += underwriteRuleInfo.getRuleDescription() + ";";
             }
         }
@@ -58,8 +58,8 @@ public class DaDiCrawlerQuoteResultVoBuild {
             quoteResultsVo.setBiRiskInfoVo(biRiskInfoVo);
         }
 
-        //设置保费,车船税,投保单号
-        buildParams(daDiQuoteResponse, quoteResultsVo);
+        //设置保费,车船税,投保单号,折旧价
+        buildParams(daDiQuoteResponse, quoteResultsVo, vehiclePricResponse);
         return quoteResultsVo;
     }
 
@@ -94,7 +94,7 @@ public class DaDiCrawlerQuoteResultVoBuild {
         return riskInfoVo;
     }
 
-    public static void buildParams(DaDiQuoteResponse daDiQuoteResponse, QuoteResultsVo quoteResultsVo) {
+    public static void buildParams(DaDiQuoteResponse daDiQuoteResponse, QuoteResultsVo quoteResultsVo, DaDiVehiclePricResponse vehiclePricResponse) {
         //交强险保费
         int trafficDuePremium = daDiQuoteResponse.getInsurancePlan().getTrafficDuePremium();
         quoteResultsVo.getCosts().setCiPremium(String.valueOf(trafficDuePremium));
@@ -104,20 +104,26 @@ public class DaDiCrawlerQuoteResultVoBuild {
         //车船税
         int sumPayment = daDiQuoteResponse.getInsurancePlan().getTax().getSumPayment();
         quoteResultsVo.getCosts().setVvTax(String.valueOf(sumPayment));
+        int niPremium = 0;
         //设置非车保费
-        if (!daDiQuoteResponse.getInsurancePlan().getAccidentInsure().isEmpty()) {
-            int niPremium = daDiQuoteResponse.getInsurancePlan().getAccidentInsure().get(0).getWealthAccPremium();
+        if (daDiQuoteResponse.getInsurancePlan().getAccidentInsure() != null && daDiQuoteResponse.getInsurancePlan().getAccidentInsure().size() > 0) {
+            niPremium = daDiQuoteResponse.getInsurancePlan().getAccidentInsure().get(0).getWealthAccPremium();
             quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
-        }else if (!daDiQuoteResponse.getInsurancePlan().getHealthInsurance().isEmpty()) {
-            int niPremium = daDiQuoteResponse.getInsurancePlan().getHealthInsurance().get(0).getWealthAccPremium();
+        } else if (daDiQuoteResponse.getInsurancePlan().getHealthInsurance() != null && daDiQuoteResponse.getInsurancePlan().getHealthInsurance().size() > 0) {
+            niPremium = daDiQuoteResponse.getInsurancePlan().getHealthInsurance().get(0).getWealthAccPremium();
             quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
-        }else  if (!daDiQuoteResponse.getInsurancePlan().getPropertyInsurance().isEmpty()) {
-            int niPremium = daDiQuoteResponse.getInsurancePlan().getHealthInsurance().get(0).getWealthAccPremium();
+        } else if (daDiQuoteResponse.getInsurancePlan().getPropertyInsurance() != null && daDiQuoteResponse.getInsurancePlan().getPropertyInsurance().size() > 0) {
+            niPremium = daDiQuoteResponse.getInsurancePlan().getPropertyInsurance().get(0).getWealthAccPremium();
             quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
         }
 
         //总保费
-        int sumPremium = trafficDuePremium + businessDuePremium + sumPayment;
+        int sumPremium = trafficDuePremium + businessDuePremium + sumPayment + niPremium;
+        //车辆折旧价(从车价查询接口获取实际价值)
+        String actualValue = vehiclePricResponse.getActualValue();
+        if (!TextUtils.isEmpty(actualValue)) {
+            quoteResultsVo.setCarActualValue(new java.math.BigDecimal(actualValue));
+        }
         quoteResultsVo.getCosts().setSumPremium(String.valueOf(sumPremium));
     }
 

+ 83 - 2
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java

@@ -96,6 +96,8 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
         private String businessEffectiveStartDate;
         @SerializedName("businessEffectiveEndDate")
         private String businessEffectiveEndDate;
+        @SerializedName("businessQuotationNo")
+        private String businessQuotationNo;
         @SerializedName("trafficIsEffective")
         private String trafficIsEffective;
         @SerializedName("trafficSumInsured")
@@ -104,6 +106,10 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
         private String businessIsEffective;
         @SerializedName("wealthAccChecked")
         private String wealthAccChecked;
+        @SerializedName("minSharedPremium")
+        private double minSharedPremium;
+        @SerializedName("maxSharedPremium")
+        private double maxSharedPremium;
         @SerializedName("quoteFlag")
         private String quoteFlag;
         @SerializedName("cDiscountRate")
@@ -118,20 +124,40 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
         private int trafficDuePremium;
         @SerializedName("businessDuePremium")
         private int businessDuePremium;
+        @SerializedName("trafficStdPremium")
+        private int trafficStdPremium;
+        @SerializedName("businessStdPremium")
+        private int businessStdPremium;
+        @SerializedName("businessBeforeVatPremium")
+        private double businessBeforeVatPremium;
+        @SerializedName("businessSumInsured")
+        private int businessSumInsured;
+        @SerializedName("trafficTotalFloat")
+        private double trafficTotalFloat;
+        @SerializedName("businessTotalFloat")
+        private double businessTotalFloat;
         @SerializedName("trafficNcdRate")
         private double trafficNcdRate;
+        @SerializedName("businessNcdRate")
+        private double businessNcdRate;
         @SerializedName("trafficQueryPastDate")
         private String trafficQueryPastDate;
         @SerializedName("trafficQuerySequenceNo")
         private String trafficQuerySequenceNo;
+        @SerializedName("businessQuerySequenceNo")
+        private String businessQuerySequenceNo;
         @SerializedName("trafficQuotationNo")
         private String trafficQuotationNo;
         @SerializedName("trafficRenewalFlag")
         private String trafficRenewalFlag;
         @SerializedName("trafficRenewalType")
         private String trafficRenewalType;
-        @SerializedName("trafficStdPremium")
-        private int trafficStdPremium;
+        @SerializedName("businessQueryPastDate")
+        private String businessQueryPastDate;
+        @SerializedName("businessRenewalFlag")
+        private String businessRenewalFlag;
+        @SerializedName("businessRenewalType")
+        private String businessRenewalType;
         @SerializedName("violationLevel")
         private String violationLevel;
         @SerializedName("businessProductCode")
@@ -146,6 +172,12 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
         private List<AccidentInsureDTO> healthInsurance;
         @SerializedName("propertyInsurance")
         private List<AccidentInsureDTO> propertyInsurance;
+        @SerializedName("lastPolicy")
+        private LastPolicyDTO lastPolicy;
+        @SerializedName("queryCoverageResVO")
+        private QueryCoverageResVODTO queryCoverageResVO;
+        @SerializedName("businessRisks")
+        private List<BusinessRiskDTO> businessRisks;
 
 
         @NoArgsConstructor
@@ -245,6 +277,55 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
                 private String subsidyDay;
             }
         }
+
+        @NoArgsConstructor
+        @Data
+        public static class BusinessRiskDTO {
+            @SerializedName("kindCode")
+            private String kindCode;
+            @SerializedName("kindName")
+            private String kindName;
+            @SerializedName("kindFlag")
+            private String kindFlag;
+            @SerializedName("brokenCode")
+            private String brokenCode;
+            @SerializedName("premium")
+            private double premium;
+            @SerializedName("amount")
+            private int amount;
+            @SerializedName("rate")
+            private double rate;
+            @SerializedName("discount")
+            private int discount;
+            @SerializedName("standardPremium")
+            private double standardPremium;
+            @SerializedName("quantity")
+            private int quantity;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class LastPolicyDTO {
+            @SerializedName("lastEffectiveDate")
+            private String lastEffectiveDate;
+            @SerializedName("lastExpireDate")
+            private String lastExpireDate;
+            @SerializedName("lastProducerCode")
+            private String lastProducerCode;
+            @SerializedName("lastModelCode")
+            private String lastModelCode;
+            @SerializedName("lastModel")
+            private String lastModel;
+        }
+
+        @NoArgsConstructor
+        @Data
+        public static class QueryCoverageResVODTO {
+            @SerializedName("lastStartDate")
+            private String lastStartDate;
+            @SerializedName("lastEndDate")
+            private String lastEndDate;
+        }
     }
 
     @NoArgsConstructor

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

@@ -105,7 +105,7 @@ public class DaDiCrawlerRequestImpl implements DaDiCrawlerRequest {
             daDiCrawlerOrderService.save(daDiCrawlerOrder);
         }
 
-        return DaDiCrawlerQuoteResultVoBuild.build(quoteVo, daDiQuoteResponse);
+        return DaDiCrawlerQuoteResultVoBuild.build(quoteVo, daDiQuoteResponse, vehiclePricVo);
     }
 
     /**

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

@@ -11,10 +11,12 @@ import com.jzg.commons.entity.quote.vo.RiskInfoVo;
 import com.jzg.commons.entity.quote.vo.aggregated.OrderStatusResultVo;
 import com.jzg.commons.entity.quote.vo.aggregated.QuoteResultsVo;
 import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.constant.enums.quote.RenewalEnum;
 import com.jzg.quotation.commons.utils.TimeProcessing;
 import com.jzg.quotation.dajia.crawler.constant.enums.DaJiaCrawlerOrderState;
 import com.jzg.quotation.dajia.crawler.entity.request.quote.BusinessInsuranceDTO;
 import com.jzg.quotation.dajia.crawler.entity.request.quote.CompulsoryInsuranceDTO;
+import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerActualValueResponse;
 import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerOrderListRevisedResponse;
 import com.jzg.quotation.dajia.crawler.entity.response.DaJiaCrawlerSaveResponse;
 import org.apache.logging.log4j.LogManager;
@@ -24,6 +26,7 @@ import org.springframework.util.ObjectUtils;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.stream.Collectors;
 
 /**
@@ -47,7 +50,7 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
      * @param daJiaCrawlerSaveResponse 大家财险保存
      * @return 报价结果
      */
-    public static QuoteResultsVo buildQuoteResultsVo(String orderNo, QuoteVo quoteVo, DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse) {
+    public static QuoteResultsVo buildQuoteResultsVo(String orderNo, QuoteVo quoteVo, DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse,DaJiaCrawlerActualValueResponse daJiaCrawlerActualValueResponse) {
         QuoteResultsVo quoteResultsVo = new QuoteResultsVo();
         buildKindInfoVo(quoteVo.getKindInfoVo(), daJiaCrawlerSaveResponse.getBusinessInsurance().getItemKinds());
         quoteResultsVo.setOrdersNo(orderNo);
@@ -67,16 +70,15 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         quoteResultsVo.setQuoteStatusEnum(InsOrderStatusEnum.WAIT_AUDIT);
         // 评分
         quoteResultsVo.setScoreVo(buildScoreVo(daJiaCrawlerSaveResponse));
-        // 非车费用
-        quoteResultsVo.getCosts().setNiPremium(daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium().equals("") ? "0.00" : daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium());
         // 交强保费 车船税 商业保费
-        buildOtherInfo(quoteResultsVo, daJiaCrawlerSaveResponse.getCompulsoryInsurance(), daJiaCrawlerSaveResponse.getBusinessInsurance());
+        buildOtherInfo(quoteResultsVo, daJiaCrawlerSaveResponse);
         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());
+        quoteResultsVo.setCarActualValue(StringUtils.isNotEmpty(daJiaCrawlerActualValueResponse.getActualValue()) ? new BigDecimal(daJiaCrawlerActualValueResponse.getActualValue()) : BigDecimal.ZERO);
         log.info("构建返回信息:{}",JSONObject.toJSONString(quoteResultsVo));
         return quoteResultsVo;
     }
@@ -121,13 +123,19 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         return ciRiskInfoVo;
     }
 
-    private static void buildOtherInfo(QuoteResultsVo quoteResultsVo, CompulsoryInsuranceDTO compulsoryInsurance, BusinessInsuranceDTO businessInsurance) {
+    private static void buildOtherInfo(QuoteResultsVo quoteResultsVo, DaJiaCrawlerSaveResponse daJiaCrawlerSaveResponse) {
+        BusinessInsuranceDTO businessInsurance = daJiaCrawlerSaveResponse.getBusinessInsurance();
+        CompulsoryInsuranceDTO compulsoryInsurance = daJiaCrawlerSaveResponse.getCompulsoryInsurance();
         // 交强
+        BigDecimal sumPremium = BigDecimal.ZERO;
+        BigDecimal totalAmount = BigDecimal.ZERO;
         if (!ObjectUtils.isEmpty(quoteResultsVo.getCiRiskInfoVo())) {
             CompulsoryInsuranceDTO.ProductInfoDTO ciProductInfo = compulsoryInsurance.getProductInfo();
             quoteResultsVo.getCosts().setCiPremium(ciProductInfo.getPremium());
             quoteResultsVo.setCiPolicyNumber(ciProductInfo.getProposalNo());
             quoteResultsVo.getCosts().setVvTax(compulsoryInsurance.getCarShipTax().getTotalTax());
+            sumPremium = sumPremium.add(new BigDecimal(compulsoryInsurance.getCarShipTax().getTotalTax()).add(new BigDecimal(ciProductInfo.getPremium())));
+            totalAmount = totalAmount.add(new BigDecimal(ciProductInfo.getPremium()));
         }
 
         // 商业
@@ -135,8 +143,18 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
             BusinessInsuranceDTO.ProductInfoDTO biProductInfo = businessInsurance.getProductInfo();
             quoteResultsVo.getCosts().setBiPremium(biProductInfo.getPremium());
             quoteResultsVo.setBiPolicyNumber(biProductInfo.getProposalNo());
+            sumPremium = sumPremium.add(new BigDecimal(biProductInfo.getPremium()));
+            totalAmount = totalAmount.add(new BigDecimal(biProductInfo.getPremium()));
         }
-
+        if (StringUtils.isNotEmpty(daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium())){
+            sumPremium = sumPremium.add(new BigDecimal(daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium()));
+            totalAmount = totalAmount.add(new BigDecimal(daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium()));
+        }
+        // 非车费用
+        String string = daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium().equals("") ? "0.00" : daJiaCrawlerSaveResponse.getDriveInsurance().getProductInfo().getPremium();
+        quoteResultsVo.getCosts().setSumPremium(sumPremium.toString());
+        quoteResultsVo.getCosts().setTotalAmount(totalAmount.toString());
+        quoteResultsVo.getCosts().setNiPremium(string);
     }
 
     private static List<KindInfoVo> buildKindInfoVo(List<KindInfoVo> kindInfoVo, List<BusinessInsuranceDTO.ItemKindsDTO> itemKinds) {
@@ -164,13 +182,24 @@ public final class DaJiaCrawlerQuoteResultsVoBuild {
         if (!ObjectUtils.isEmpty(compulsoryInsurance)) {
             scoreVo.setJqLossRation(StringUtils.isNotEmpty(compulsoryInsurance.getCoefficientInfo().getLossRatioCi()) ? compulsoryInsurance.getCoefficientInfo().getLossRatioCi() : null);
             scoreVo.setCiClaims(String.valueOf(new BigDecimal(compulsoryInsurance.getCoefficientInfo().getLastPolicyNum()).intValue()));
-            scoreVo.setJqRenewal(compulsoryInsurance.getCoefficientInfo().getRenewalFrequency());
+            String renewalFrequency = compulsoryInsurance.getCoefficientInfo().getRenewalFrequency();
+            if (StringUtils.isNotEmpty(renewalFrequency) && Objects.equals(renewalFrequency, "0")){
+                scoreVo.setJqRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
+            }else {
+                scoreVo.setJqRenewal(String.valueOf(RenewalEnum.Renewal.getCode()));
+            }
+
         }
         boolean sy = CollectionUtil.isNotEmpty(businessInsurance.getItemKinds());
         if (sy) {
             scoreVo.setSyLossRation(StringUtils.isNotEmpty(businessInsurance.getCoefficientInfo().getLossRatioBi()) ? businessInsurance.getCoefficientInfo().getLossRatioBi() : null);
             scoreVo.setBiClaims(String.valueOf(new BigDecimal(businessInsurance.getCoefficientInfo().getLastPolicyNum()).intValue()));
-            scoreVo.setSyRenewal(businessInsurance.getCoefficientInfo().getRenewalFrequency());
+            String renewalFrequency = businessInsurance.getCoefficientInfo().getRenewalFrequency();
+            if (StringUtils.isNotEmpty(renewalFrequency) && Objects.equals(renewalFrequency, "0")){
+                scoreVo.setSyRenewal(String.valueOf(RenewalEnum.Transfer.getCode()));
+            }else {
+                scoreVo.setSyRenewal(String.valueOf(RenewalEnum.Renewal.getCode()));
+            }
         }
         // 总赔付率 违章评分 高速风险分
         String carIllegalScore;

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

@@ -202,7 +202,7 @@ public class DaJiaCrawlerRequestImpl implements DaJiaCrawlerRequest {
         // 4.1 持久化订单信息到本地数据库
         daJiaCrawlerOrderService.saveOrderInfo(quoteVo, daJiaCrawlerSaveResponse, daJiaCrawlerInitDataRequest.getBusinessNo());
         // 4.2 构建并返回报价结果
-        return DaJiaCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), quoteVo, daJiaCrawlerSaveResponse);
+        return DaJiaCrawlerQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo.getOrder().getOrdersNo(), quoteVo, daJiaCrawlerSaveResponse,daJiaCrawlerActualValueResponse);
     }
 
 

+ 4 - 11
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/api/entity/Request/PremiumRequest.java

@@ -6,15 +6,11 @@ import com.alibaba.fastjson.annotation.JSONField;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.constants.InsuranceRisk;
-import com.jzg.commons.entity.quote.vo.CustomerInfoVo;
-import com.jzg.commons.entity.quote.vo.KindInfoVo;
-import com.jzg.commons.entity.quote.vo.RiskInfoVo;
-import com.jzg.commons.entity.quote.vo.VehicleAndVesselTaxVo;
-import com.jzg.commons.util.AssertionUtils;
-import com.jzg.commons.util.StringUtils;
 import com.jzg.commons.constants.quote.enums.quote.EnergyTypeCode;
 import com.jzg.commons.constants.quote.enums.quote.KindCode;
-import com.jzg.commons.entity.quote.vo.QuoteVo;
+import com.jzg.commons.entity.quote.vo.*;
+import com.jzg.commons.util.AssertionUtils;
+import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.guoren.api.constant.enums.BaseTaxation;
 import com.jzg.quotation.guoren.api.constant.enums.ClauseTypeSystem;
@@ -335,10 +331,7 @@ public class PremiumRequest {
             //乘客数
             BigDecimal passengerNum = BigDecimal.valueOf(StringUtils.toInt(vinQ.getSeatCountBC()) - 1);
 
-            boolean isEnergy = false;
-            if (EnergyTypeCode.getNewEnergy().contains(vinQ.getFuelType())) {
-                isEnergy = true;
-            }
+            boolean isEnergy = EnergyTypeCode.getNewEnergy().contains(vinQ.getFuelType());
 
             //起保时间
             prptitemkind.setStartDate(biRiskInfo.getStartDate());

+ 1 - 1
tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/component/GuoRenCrawlerCacheComponent.java

@@ -15,7 +15,7 @@ public class GuoRenCrawlerCacheComponent {
 
     public static final String GUOREN_TOKEN = "guoren:token:";
 
-    public static final Duration GUOREN_TOKEN_TIME = Duration.ofHours(6L);
+    public static final Duration GUOREN_TOKEN_TIME = Duration.ofHours(12L);
 
     /**
      * 缓存 token 信息

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

@@ -322,12 +322,12 @@ public class GuoRenPrpTmainDTO {
         this.immeValiFlag0507 = riskInfoVo.isInstantFlag() ? 1 : 0;
         this.startDate0507 = TimeProcessing.dateTimeToDate(riskInfoVo.getStartDate());
         this.endDate0507 = TimeProcessing.dateTimeToDate(riskInfoVo.getEndDate());
-        this.immeValidStartDate0507 =  DateUtil.toUtcDateTime(riskInfoVo.getStartDate());
+        this.immeValidStartDate0507 = DateUtil.toUtcDateTime(riskInfoVo.getStartDate());
         this.immeValidEndDate0507 = DateUtil.toUtcDateTime(riskInfoVo.getEndDate());
         this.startHour0507 = TimeProcessing.getHour(riskInfoVo.getStartDate());
         this.endHour0507 = TimeProcessing.getHour(riskInfoVo.getEndDate());
         this.startMinute0507 = TimeProcessing.getMinute(riskInfoVo.getStartDate());
-        this.endMinute0507 =  TimeProcessing.getMinute(riskInfoVo.getEndDate());
+        this.endMinute0507 = TimeProcessing.getMinute(riskInfoVo.getEndDate());
         this.startDateFlag0507 = 0;
 
         // 0507t1字段赋值

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

@@ -110,8 +110,8 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
     @Override
     public HttpHeaders getHeaders(String username) {
         HttpHeaders headers = new HttpHeaders();
-//        String token = guoRenCrawlerCacheComponent.getToken(username);
-        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3ODQ3OTMwNzR9.Jc-DOyqO7RatX9veTtF0cfVFF9EhLuP40eaEkSe_Tv8u33YFvosk50nAPdevmJ9t9WW7263S88fpfHy0gFNjTOjUk8KcOqmpJWbC9Q7Ydoq6NTRwKGIVgZI2VLVlPA99fPzTuxl-MPsyEU0_2KV4I_U7LcV5p3w0jEkPLdUFuXM";
+        String token = guoRenCrawlerCacheComponent.getToken(username);
+//        String token = "eyJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJXMzAwMDM5OSIsInVzZXJJZCI6IjQ5NjE4MSIsIm5hbWUiOiLmnY7mmKXmooUiLCJleHAiOjE3ODQ5NDA2NzF9.fl3etn9yGRPrBxaaPgCFdjeg91oRzI9930ee0nOrV9VllMM7uFG9ktudt8iYinQ2ebIDeYMk51Q3ijrMwyuj5eyxiPtfZeoRtBPiAq0N08E_e1a3GZnjaSTM3TopX2vcb9_LHioskQI90Px9OHcr17YkVZ40X1wb-owaHpEmsCc";
         if (!StringUtils.hasText(token)) {
             throw new TokenExpireException("500", "国任财险账号登录过期,请重新登录");
         }

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

@@ -151,8 +151,8 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
             if (startTime == null) {
                 return GuoRenCrawlerQuoteResultsVoBuild.buildFailQuoteResultsVo(quoteVo, calculationPremium);
             } else {
+                // 交强
                 RiskInfoVo ciRiskInfoVo = new RiskInfoVo();
-
                 if (startTime != null && startTime.endsWith("00:00:00")) {
                     ciRiskInfoVo.setInstantFlag(false);
                     endTime = TimeProcessing.minusOneSecondAfterYear(startTime);
@@ -167,10 +167,6 @@ public class GuoRenCrawlerRequestImpl implements GuoRenCrawlerRequest {
                 ciRiskInfoVo.setEndDate(endTime);
 
                 GuoRenPrpTmainDTO prpTMainDTO = new GuoRenPrpTmainDTO(ciRiskInfoVo, TimeProcessing.nowDate());
-
-                // 交强
-                quoteVo.getCiRiskInfoVo().setStartDate(startTime);
-                quoteVo.getCiRiskInfoVo().setEndDate(endTime);
                 crawlerCalculationPremiumRequest.getCi().setPrpTmain(prpTMainDTO);
 
                 crawlerCalculationPremiumRequest.getCi().getPrptitemkindList().forEach(item -> {

+ 21 - 10
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/aop/FactorMatch.java

@@ -359,19 +359,30 @@ public class FactorMatch {
         if (ptlAgreementCostRule.getMin() == null || value == null) {
             return false;
         }
-        // 修复:select 支持多选逗号分隔,所以正确做法是 split 后逐个 equals
-        String[] options = ptlAgreementCostRule.getMin().split(",");
-        for (String opt : options) {
-            if (opt.trim().equals(value.trim())) {
-                return true;
+        if (ptlAgreementCostRule.getOperator().equals("2")) {
+            String [] options = ptlAgreementCostRule.getMin().split(",");
+            for (String opt : options) {
+                if (opt.trim().equals(value.trim())) {
+                    return false;
+                }
             }
-            // 顺带支持是/否归一化
-            String n1 = normalizeYesNo(opt.trim());
-            String n2 = normalizeYesNo(value.trim());
-            if (!n1.equals(opt.trim()) && !n2.equals(value.trim()) && n1.equals(n2)) {
-                return true;
+            return true;
+        } else {
+            // 修复:select 支持多选逗号分隔,所以正确做法是 split 后逐个 equals
+            String[] options = ptlAgreementCostRule.getMin().split(",");
+            for (String opt : options) {
+                if (opt.trim().equals(value.trim())) {
+                    return true;
+                }
+                // 顺带支持是/否归一化
+                String n1 = normalizeYesNo(opt.trim());
+                String n2 = normalizeYesNo(value.trim());
+                if (!n1.equals(opt.trim()) && !n2.equals(value.trim()) && n1.equals(n2)) {
+                    return true;
+                }
             }
         }
+
         return false;
     }
 

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

@@ -188,8 +188,9 @@ public class QuoteVerificationAspect {
                     String[] split = ptlAgreementCostRule.getMin().split(",");
                     boolean isPipei = false;
                     for(int i = 0;i < split.length; i++){
-                        if(split[i].equals(insOrdersCarInfo.getCarNatureCode())) {
+                        if (split[i].equals(insOrdersCarInfo.getCarNatureCode())) {
                             isPipei = true;
+                            break;
                         }
                     }
                     if(!isPipei){
@@ -201,8 +202,9 @@ public class QuoteVerificationAspect {
                     String[] split = ptlAgreementCostRule.getMin().split(",");
                     boolean isPipei = false;
                     for(int i = 0;i < split.length; i++){
-                        if(split[i].equals(insOrdersCarInfo.getCarKindCode())) {
+                        if (split[i].equals(insOrdersCarInfo.getCarKindCode())) {
                             isPipei = true;
+                            break;
                         }
                     }
                     if(!isPipei){
@@ -771,8 +773,9 @@ public class QuoteVerificationAspect {
                             Map<String,Object> level2 = calculateLevel2Distribution(insFeeOrders, totalPremium, level1.get("id").toString(), sysDistributionSetting);
                             if (level2 != null) {
                                 diffAmount = calculateLevel3Distribution(insFeeOrders, totalPremium, level2.get("id").toString(), sysDistributionSetting);
+                                diffAmount = diffAmount.add(new BigDecimal(level2.get("diffAmount").toString()));
                             }
-                            diffAmount = diffAmount.add(new BigDecimal(level2.get("diffAmount").toString())).add(new BigDecimal(level1.get("diffAmount").toString()));
+                            diffAmount = diffAmount.add(new BigDecimal(level1.get("diffAmount").toString()));
                         }
                         break;
                 }
@@ -869,9 +872,8 @@ public class QuoteVerificationAspect {
     public void doBefore(JoinPoint point) {
         Object[] args = point.getArgs();
         for (Object arg : args) {
-            if (arg instanceof QuoteVo) {
+            if (arg instanceof QuoteVo quoteVo) {
                 // 1.根据参数判断是否存在调度信息
-                QuoteVo quoteVo = (QuoteVo)arg;
                 // 过滤险种 前端如果选择不投保的时候 直接过滤掉别让他进报价的逻辑里。
                 if (!quoteVo.getKindInfoVo().isEmpty()) {
                     quoteVo.setKindInfoVo(quoteVo.getKindInfoVo().stream().filter(kindInfoVo ->

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

@@ -941,9 +941,10 @@ public class InsOrdersServiceImpl extends ServiceImpl<InsOrdersMapper, InsOrders
             List<InsOrdersAccidentalDriving> accidentalDrivingList = insOrdersAccidentalDrivingService
                     .list(new LambdaQueryWrapper<InsOrdersAccidentalDriving>().eq(InsOrdersAccidentalDriving::getOrderNo, ordersNo));
             if (CollectionUtil.isNotEmpty(accidentalDrivingList) && jyPremium != null) {
-                // 如果只有一个驾意险产品,直接设置其保费为 niPremium
-                if (accidentalDrivingList.size() == 1) {
-                    accidentalDrivingList.get(0).setAmount(jyPremium.toString());
+                // 按保费乘以数量计算每个驾意险的总保费
+                for (InsOrdersAccidentalDriving driving : accidentalDrivingList){
+                    BigDecimal perPremium = jyPremium.multiply(new BigDecimal(driving.getQuantity())).setScale(2, java.math.RoundingMode.HALF_UP);
+                    driving.setAmount(perPremium.toString());
                 }
                 insOrdersAccidentalDrivingService.updateBatchById(accidentalDrivingList);
             }

+ 111 - 15
tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java

@@ -6,13 +6,13 @@ import com.jzg.commons.constants.quote.enums.base.InsuranceImageEnum;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.commons.entity.quote.vo.aggregated.*;
+import com.jzg.commons.entity.quote.vo.base.LoginBase;
 import com.jzg.commons.entity.quote.vo.base.OrderBase;
+import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.StringUtils;
 import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
 import com.jzg.quotation.commons.constant.InsuranceCode;
-import com.jzg.commons.entity.quote.vo.base.LoginBase;
-import com.jzg.commons.entity.quote.vo.image.InsuranceImageVo;
 import com.jzg.quotation.commons.entity.DetectLoginRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaRequest;
 import com.jzg.quotation.commons.entity.GetCaptchaResponse;
@@ -351,27 +351,123 @@ public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
 
     @Override
     public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
+        // 获取配置信息
         OrderBase order = underwritingVo.getOrder();
         AttributionInformationVo attributionInformationVo = order.getAttributionInformationVo();
-        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(TaipingCrawlerConfigureParameters.class,
-                attributionInformationVo.getConfigInfo());
+        TaipingCrawlerConfigureParameters parameters = ConfigureParametersConversion.conversionEntity(
+                TaipingCrawlerConfigureParameters.class, attributionInformationVo.getConfigInfo());
         HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders(parameters.getGw_user_token());
+
+        // 获取订单信息
         TaiPingCrawlerOrder taiPingCrawlerOrder = taiPingCrawlerOrderRepository.findByOrdersNo(underwritingVo.getOrder().getOrdersNo());
-        // 验证信息
-        TaiPingCrawlerPremiumCalculateData taiPingCrawlerPremiumCalculateData = taiPingCrawlerCacheComponent.getTaiPingCrawlerPremiumCalculateData(underwritingVo.getOrder()
-                .getOrdersNo());
-        TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest = taiPingCrawlerCacheComponent.getTaiPingCrawlerPremiumCalculateRequest(underwritingVo.getOrder()
-                .getOrdersNo());
+
+        // 获取缓存的报价请求
+        TaiPingCrawlerPremiumCalculateRequest taiPingCrawlerPremiumCalculateRequest = taiPingCrawlerCacheComponent
+                .getTaiPingCrawlerPremiumCalculateRequest(underwritingVo.getOrder().getOrdersNo());
+
+        // 重新计算保费(核保前必须设置forceLinkCIFlag关联交商)
         taiPingCrawlerPremiumCalculateRequest.getPfMainDto().setForceLinkCIFlag(true);
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> taiPingCrawlerPremiumCalculate = taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
-        TaiPingCrawlerSubmitValidateRequest taiPingCrawlerSubmitValidateRequest = new TaiPingCrawlerSubmitValidateRequest(taiPingCrawlerPremiumCalculate.getData(), taiPingCrawlerPremiumCalculateRequest,taiPingCrawlerOrder);
-        String request = JSON.toJSONString(taiPingCrawlerSubmitValidateRequest);
-        TaiPingCrawlerBaseResponse<TaiPingCrawlerSubmitValidateData> taiPingCrawlerSubmitValidateData = taiPingCrawlerRequestComponent.submitValidate(taiPingCrawlerPremiumCalculate.getData(), httpHeaders,parameters);
-        // 核保
+        log.info("[太平核保]保费重算请求: orderNo={}", taiPingCrawlerOrder.getCompanyOrderNo());
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerPremiumCalculateData> recalculateResponse =
+                taiPingCrawlerRequestComponent.premiumCalculate(taiPingCrawlerPremiumCalculateRequest, httpHeaders, parameters);
+        if (!recalculateResponse.isSucc()) {
+            throw new SystemException("保费重算失败:" + recalculateResponse.getErrMsg());
+        }
+        log.info("[太平核保]保费重算成功");
+
+        // 提交验证
+        TaiPingCrawlerSubmitValidateRequest submitValidateRequest = new TaiPingCrawlerSubmitValidateRequest(
+                recalculateResponse.getData(), taiPingCrawlerPremiumCalculateRequest, taiPingCrawlerOrder);
+        log.info("[太平核保]提交验证请求: {}", JSON.toJSONString(submitValidateRequest));
+        TaiPingCrawlerBaseResponse<TaiPingCrawlerSubmitValidateData> submitValidateResponse =
+                taiPingCrawlerRequestComponent.submitValidate(recalculateResponse.getData(), httpHeaders, parameters);
+        log.info("[太平核保]提交验证响应: succ={}, errMsg={}", submitValidateResponse.isSucc(), submitValidateResponse.getErrMsg());
+        if (!submitValidateResponse.isSucc()) {
+            throw new SystemException("提交验证失败:" + submitValidateResponse.getErrMsg());
+        }
+
+        // 提交核保
         TaiPingCrawlersSubmitToAuditRequest submitToAuditRequest = new TaiPingCrawlersSubmitToAuditRequest(taiPingCrawlerOrder.getCompanyOrderNo());
-        TaiPingCrawlerBaseResponse<TaiPingCrawlersSubmitToAuditData> submitToAuditData = taiPingCrawlerRequestComponent.submitToAudit(submitToAuditRequest, httpHeaders,parameters);
+        log.info("[太平核保]提交核保请求: {}", JSON.toJSONString(submitToAuditRequest));
+        TaiPingCrawlerBaseResponse<TaiPingCrawlersSubmitToAuditData> submitToAuditResponse =
+                taiPingCrawlerRequestComponent.submitToAudit(submitToAuditRequest, httpHeaders, parameters);
+        log.info("[太平核保]提交核保响应: {}", JSON.toJSONString(submitToAuditResponse));
 
+        // 构建返回结果
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
+        underwritingResultsVo.setOrdersNo(underwritingVo.getOrder().getOrdersNo());
+        underwritingResultsVo.setCompanyOrderNo(taiPingCrawlerOrder.getCompanyOrderNo());
+
+        // 核保请求失败
+        if (!submitToAuditResponse.isSucc()) {
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            underwritingResultsVo.setUnderwritingResult(submitToAuditResponse.getErrMsg());
+            return underwritingResultsVo;
+        }
+
+        // 解析核保结果
+        TaiPingCrawlersSubmitToAuditData submitToAuditData = submitToAuditResponse.getData();
+        if (submitToAuditData == null || submitToAuditData.getSubmitAuditResultDto() == null
+                || submitToAuditData.getSubmitAuditResultDto().getAuditResultList() == null
+                || submitToAuditData.getSubmitAuditResultDto().getAuditResultList().isEmpty()) {
+            underwritingResultsVo.setUnderwritingResult("核保处理中");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+            return underwritingResultsVo;
+        }
+
+        // 提取交强险和商业险核保结果
+        List<TaiPingCrawlersSubmitToAuditData.SubmitAuditResultDtoDTO.AuditResultListDTO> auditResultList =
+                submitToAuditData.getSubmitAuditResultDto().getAuditResultList();
+        String jqUnderWriteInd = "";
+        String syUnderWriteInd = "";
+        String jqProposalNo = "";
+        String syProposalNo = "";
+        for (TaiPingCrawlersSubmitToAuditData.SubmitAuditResultDtoDTO.AuditResultListDTO result : auditResultList) {
+            if ("0801".equals(result.getProductCode())) {
+                jqUnderWriteInd = result.getUnderWriteInd();
+                jqProposalNo = result.getProposalNo();
+            } else if ("0802".equals(result.getProductCode())) {
+                syUnderWriteInd = result.getUnderWriteInd();
+                syProposalNo = result.getProposalNo();
+            }
+        }
+
+        // 设置投保单号
+        underwritingResultsVo.setJqApplyNo(jqProposalNo);
+        underwritingResultsVo.setSyApplyNo(syProposalNo);
+
+        // 根据underWriteInd判断核保状态(与queryOrderState保持一致的映射规则)
+        if ("8".equals(jqUnderWriteInd) || "9".equals(jqUnderWriteInd)
+                || "8".equals(syUnderWriteInd) || "9".equals(syUnderWriteInd)) {
+            // 人工核保
+            underwritingResultsVo.setUnderwritingResult("人工核保");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+        } else if ("2".equals(jqUnderWriteInd) || "2".equals(syUnderWriteInd)) {
+            // 核保失败
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
+            underwritingResultsVo.setUnderwritingResult("核保失败");
+        } else if (containsPass(jqUnderWriteInd) || containsPass(syUnderWriteInd)) {
+            // 核保通过,获取支付链接
+            underwritingResultsVo.setUnderwritingResult("核保通过");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
+            try {
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(underwritingVo.getOrder());
+                PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
+                underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
+            } catch (Exception e) {
+                log.warn("[太平核保]获取支付链接失败: {}", e.getMessage());
+            }
+        } else if ("6".equals(jqUnderWriteInd) || "6".equals(syUnderWriteInd)) {
+            // 已承保
+            underwritingResultsVo.setUnderwritingResult("已承保");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.UNDERWRITED);
+        } else {
+            // 未知状态,默认转人工处理
+            underwritingResultsVo.setUnderwritingResult("核保处理中");
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
+        }
+
         return underwritingResultsVo;
     }
 

+ 10 - 2
tenant/insurance/quotation-yangguang/src/main/java/com/jzg/quotation/yangguang/api/entity/request/YangGuangAccuracyCalculateRequest.java

@@ -240,7 +240,11 @@ public class YangGuangAccuracyCalculateRequest extends YangGuangBaseRequest{
             }
             this.CiStartDate = ciStartTime.format(formatter);
             this.CiEndDate = ciEndTime.format(formatter);
-            this.CiImmediateFlag = quoteVo.getCiRiskInfoVo().isInstantFlag() ? "1" : "0";
+            if (quoteVo.getCiRiskInfoVo().getStartDate().endsWith("00:00:00")) {
+                this.CiImmediateFlag = "0";
+            } else {
+                this.CiImmediateFlag = "1";
+            }
         }
         if (Objects.nonNull(quoteVo.getBiRiskInfoVo())) {
             // 基础保险期限计算
@@ -256,7 +260,11 @@ public class YangGuangAccuracyCalculateRequest extends YangGuangBaseRequest{
             }
             this.BiStartDate = biStartTime.format(formatter);
             this.BiEndDate = biEndTime.format(formatter);
-            this.BiImmediateFlag = quoteVo.getBiRiskInfoVo().isInstantFlag() ? "1" : "0";
+            if (quoteVo.getBiRiskInfoVo().getStartDate().endsWith("00:00:00")) {
+                this.BiImmediateFlag = "0";
+            } else {
+                this.BiImmediateFlag = "1";
+            }
         }
         if (quoteVo.getCiRiskInfoVo() != null && quoteVo.getBiRiskInfoVo() != null) {
             this.PolicyType = "3";

+ 20 - 20
tenant/insurance/quotation-zhongmei/src/main/java/com/jzg/quotation/zhongmei/crawler/constant/enums/ZmCrawlerFloatFlag.java

@@ -16,30 +16,30 @@ public class ZmCrawlerFloatFlag {
 
     static {
         JQ_RATE_FLOAT_FLAG_MAP.put("0", "费率浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("01", "新车,不浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("02", "首次投保,不浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("03", "车辆所有权转移,不浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("04", "临时上道或临时入境,不浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("05", "为摩托车、拖拉机、变拖类、低速载货汽车、三轮汽车,不浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("06", "未如实告知平台车辆信息,无法确定浮动比率,不浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("07", "非重复投保退保的保单续保,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("01", "新车不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("02", "首次投保不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("03", "车辆所有权转移不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("04", "临时上道或临时入境不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("05", "为摩托车、拖拉机、变拖类、低速载货汽车、三轮汽车不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("06", "未如实告知平台车辆信息无法确定浮动比率不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("07", "非重复投保退保的保单续保不浮动");
         JQ_RATE_FLOAT_FLAG_MAP.put("08", "短期保单续保不下浮");
         JQ_RATE_FLOAT_FLAG_MAP.put("09", "短期单投保不浮动");
-        JQ_RATE_FLOAT_FLAG_MAP.put("10", "脱保,不下浮");
-        JQ_RATE_FLOAT_FLAG_MAP.put("99", "不在浮动时间范围内,不浮动");
+        JQ_RATE_FLOAT_FLAG_MAP.put("10", "脱保不下浮");
+        JQ_RATE_FLOAT_FLAG_MAP.put("99", "不在浮动时间范围内不浮动");
 
-        NO_ADJUST_REASON_CODE_MAP.put("01", "过户车,不浮动");
-        NO_ADJUST_REASON_CODE_MAP.put("02", "脱保6个月以上,不浮动");
-        NO_ADJUST_REASON_CODE_MAP.put("03", "本次投保为短期单,不下浮");
-        NO_ADJUST_REASON_CODE_MAP.put("04", "没有上年度保单,不浮动");
-        NO_ADJUST_REASON_CODE_MAP.put("05", "上张保单为短期单,不下浮");
-        NO_ADJUST_REASON_CODE_MAP.put("06", "上张保单做过批改过户,不浮动");
-        NO_ADJUST_REASON_CODE_MAP.put("07", "上年和本年不在同一公司投保,不浮动");
-        NO_ADJUST_REASON_CODE_MAP.put("08", "脱保3个月至6个月(含),不下浮");
+        NO_ADJUST_REASON_CODE_MAP.put("01", "过户车不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("02", "脱保6个月以上不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("03", "本次投保为短期单不下浮");
+        NO_ADJUST_REASON_CODE_MAP.put("04", "没有上年度保单不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("05", "上张保单为短期单不下浮");
+        NO_ADJUST_REASON_CODE_MAP.put("06", "上张保单做过批改过户不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("07", "上年和本年不在同一公司投保不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("08", "脱保3个月至6个月(含)不下浮");
         NO_ADJUST_REASON_CODE_MAP.put("09", "车贷投保多年,不下浮");
-        NO_ADJUST_REASON_CODE_MAP.put("10", "对历史保单(上平台前的保单)的批改,不重新计算系数风险");
-        NO_ADJUST_REASON_CODE_MAP.put("11", "新车,不浮动");
-        NO_ADJUST_REASON_CODE_MAP.put("12", "上年没有出险,赔款金额系数不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("10", "对历史保单(上平台前的保单)的批改不重新计算系数风险");
+        NO_ADJUST_REASON_CODE_MAP.put("11", "新车不浮动");
+        NO_ADJUST_REASON_CODE_MAP.put("12", "上年没有出险赔款金额系数不浮动");
     }
 
     /**

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/AgreementController.java

@@ -19,6 +19,7 @@ import com.jzg.organization.service.PtlAgreementDeptService;
 import com.jzg.organization.service.PtlAgreementService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
@@ -227,6 +228,12 @@ public class AgreementController extends BaseController {
         return ptlAgreementCostService.batchUpdateValidDate(param);
     }
 
+    @Operation(summary = "批量加减费用比例")
+    @PostMapping("/batchAdjustCostRatio")
+    public HttpResult<String> batchAdjustCostRatio(@RequestBody @Valid PtlAgreementCostBatchAdjustParam param) {
+        return ptlAgreementCostService.batchAdjustCostRatio(param);
+    }
+
     /**
      * 外部协议添加
      * @param param

+ 9 - 0
tenant/organization/src/main/java/com/jzg/organization/service/PtlAgreementCostService.java

@@ -69,4 +69,13 @@ public interface PtlAgreementCostService extends IService<PtlAgreementCost> {
      */
     HttpResult<String> batchUpdateValidDate(PtlAgreementCostBatchUpdateValidDateParam param);
 
+    /**
+     * 批量加减费用比例
+     *
+     * @param param 批量调整参数
+     * @author lipf
+     * @date 2026/7/24
+     */
+    HttpResult<String> batchAdjustCostRatio(PtlAgreementCostBatchAdjustParam param);
+
 }

+ 92 - 0
tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementCostServiceImpl.java

@@ -42,6 +42,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
 
+import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Arrays;
@@ -493,12 +494,103 @@ public class PtlAgreementCostServiceImpl extends ServiceImpl<PtlAgreementCostMap
         updateWrapper.in(PtlAgreementCost::getId, finalCostIds);
         updateWrapper.set(PtlAgreementCost::getEffectiveTime, param.getEffectiveTime());
         updateWrapper.set(PtlAgreementCost::getFailureTime, param.getFailureTime());
+        updateWrapper.set(PtlAgreementCost::getApproved, 0); // 0: 未审批
         boolean success = this.update(updateWrapper);
 
         return success
                 ? HttpResult.ok("批量修改成功,共修改 " + finalCostIds.size() + " 条记录")
                 : HttpResult.error("批量修改失败");
     }
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public HttpResult<String> batchAdjustCostRatio(PtlAgreementCostBatchAdjustParam param) {
+        log.info("批量调整费用比例。param=[{}]", JSONUtil.toJsonStr(param));
+
+        if (CollectionUtils.isEmpty(param.getCostIds())) {
+            return HttpResult.error("费用ID列表不能为空");
+        }
+
+        // 查询所有需要调整的费用类型记录
+        LambdaQueryWrapper<PtlAgreementCostType> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.in(PtlAgreementCostType::getPtlAgreementCostId, param.getCostIds());
+        List<PtlAgreementCostType> costTypeList = ptlAgreementCostTypeService.list(queryWrapper);
+
+        if (CollectionUtils.isEmpty(costTypeList)) {
+            return HttpResult.error("未找到需要调整的费用类型记录");
+        }
+
+        boolean isAdd = "ADD".equalsIgnoreCase(param.getOperationType());
+
+        // 校验:至少传递一种险种的比例
+        boolean hasJqRatio = param.getJqInletRatio() != null || param.getJqExportRatio() != null;
+        boolean hasSyRatio = param.getSyInletRatio() != null || param.getSyExportRatio() != null;
+        boolean hasJyRatio = param.getJyInletRatio() != null || param.getJyExportRatio() != null;
 
+        if (!hasJqRatio && !hasSyRatio && !hasJyRatio) {
+            return HttpResult.error("至少需要传递一种险种的比例(交强险/商业险/驾意险)");
+        }
+
+        int adjustedCount = 0;
+        for (PtlAgreementCostType costType : costTypeList) {
+            String costTypeStr = costType.getCostType();
+            boolean wasAdjusted = false;
+
+            // 根据费用类型进行调整
+            if ("交强险".equals(costTypeStr) && hasJqRatio) {
+                adjustCostType(costType, param.getJqInletRatio(), param.getJqExportRatio(), isAdd);
+                wasAdjusted = true;
+            } else if ("商业险".equals(costTypeStr) && hasSyRatio) {
+                adjustCostType(costType, param.getSyInletRatio(), param.getSyExportRatio(), isAdd);
+                wasAdjusted = true;
+            } else if ("驾意险".equals(costTypeStr) && hasJyRatio) {
+                adjustCostType(costType, param.getJyInletRatio(), param.getJyExportRatio(), isAdd);
+                wasAdjusted = true;
+            }
+
+            if (wasAdjusted) {
+                adjustedCount++;
+            }
+        }
+
+        if (adjustedCount == 0) {
+            return HttpResult.error("未找到匹配的费用类型记录进行调整");
+        }
+
+        // 批量更新
+        ptlAgreementCostTypeService.updateBatchById(costTypeList);
+
+        return HttpResult.ok("批量调整成功,共调整 " + adjustedCount + " 条记录");
+    }
+
+    /**
+     * 调整费用类型的各项比例
+     */
+    private void adjustCostType(PtlAgreementCostType costType, BigDecimal inlet,
+                                BigDecimal export, boolean isAdd) {
+        // 入口比例
+        if (inlet != null) {
+            costType.setInlet(calculateNewValue(costType.getInlet(), inlet, isAdd));
+        }
+        // 出口比例
+        if (export != null) {
+            costType.setExport(calculateNewValue(costType.getExport(), export, isAdd));
+        }
+    }
+
+    /**
+     * 计算新值
+     */
+    private BigDecimal calculateNewValue(BigDecimal currentValue, BigDecimal adjustValue, boolean isAdd) {
+        if (currentValue == null) {
+            currentValue = BigDecimal.ZERO;
+        }
+        if (isAdd) {
+            return currentValue.add(adjustValue);
+        } else {
+            BigDecimal result = currentValue.subtract(adjustValue);
+            // 确保结果不小于0
+            return result.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : result;
+        }
+    }
 
 }