Răsfoiți Sursa

Merge branch 'master' of http://39.101.143.165:8090/785834757/jzg

lipf 3 luni în urmă
părinte
comite
8e14bcb7bb
25 a modificat fișierele cu 346 adăugiri și 70 ștergeri
  1. 3 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesAddParam.java
  2. 5 0
      commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java
  3. 3 0
      commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRules.java
  4. 13 13
      commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java
  5. 3 0
      commons/src/main/java/com/jzg/commons/entity/vo/AgreementRulesVo.java
  6. 51 3
      tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java
  7. 8 2
      tenant/insurance/quotation-chengtai/src/main/java/com/jzg/quotation/chengtai/api/service/impl/ChengTaiApiRequestImpl.java
  8. 10 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/build/DaDiCrawlerQuoteResultVoBuild.java
  9. 2 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerRequestComponent.java
  10. 2 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiEleProposalQRCoreDataRequest.java
  11. 18 28
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiInsurancePlanRequest.java
  12. 1 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQuoteRequest.java
  13. 7 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiEleProposalQRCoreDataResponse.java
  14. 4 0
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiJointSalesResponse.java
  15. 63 1
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiQuoteResponse.java
  16. 12 2
      tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/service/impl/DaDiCrawlerRequestImpl.java
  17. 51 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/entity/request/GuoRenCrawlerProposalNoSaveRequest.java
  18. 12 0
      tenant/insurance/quotation-guoren/src/main/java/com/jzg/quotation/guoren/crawler/service/impl/GuoRenCrawlerQuoteProcessServiceImpl.java
  19. 1 1
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java
  20. 17 2
      tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java
  21. 7 0
      tenant/insurance/quotation-taiping/src/main/java/com/jzg/quotation/taiping/crawler/service/impl/TaipingCrawlerRequestImpl.java
  22. 32 11
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/build/TaiShanCrawlerQuoteRequestVoBuild.java
  23. 16 0
      tenant/insurance/quotation-taishan/src/main/java/com/jzg/quotation/taishan/crawler/service/impl/TaiShanCrawlerRequestImpl.java
  24. 2 2
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlAgreementUndwrtRulesServiceImpl.java
  25. 3 1
      tenant/organization/src/main/java/com/jzg/organization/service/impl/PtlSchemeServiceImpl.java

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesAddParam.java

@@ -21,6 +21,9 @@ public class AgreementRulesAddParam {
     @Schema(description = "生效截止时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
     @Schema(description = "规则属性")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;
 

+ 5 - 0
commons/src/main/java/com/jzg/commons/entity/dto/AgreementRulesEditParam.java

@@ -2,6 +2,7 @@ package com.jzg.commons.entity.dto;
 
 import com.jzg.commons.entity.po.PtlAgreementUndwrtRulesAttrLink;
 import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotEmpty;
 import jakarta.validation.constraints.NotNull;
 import lombok.Data;
 
@@ -27,6 +28,10 @@ public class AgreementRulesEditParam {
     @Schema(description = "生效截止时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
+    @NotEmpty(message = "规则属性不能为空")
     @Schema(description = "规则属性(单条模式)")
     private List<PtlAgreementUndwrtRulesAttrLink> rulesAttrList;
 

+ 3 - 0
commons/src/main/java/com/jzg/commons/entity/po/PtlAgreementUndwrtRules.java

@@ -29,6 +29,9 @@ public class PtlAgreementUndwrtRules extends BaseModel {
     @Schema(description = "生效结束时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

+ 13 - 13
commons/src/main/java/com/jzg/commons/entity/quote/vo/aggregated/QuoteEchoVo.java

@@ -371,20 +371,20 @@ public class QuoteEchoVo extends QuoteVo {
             }
         });
         // 添加交强险种信息
-//        if(ProductsType.isContainDj(insOrdersVo.getProductId())){
-//            KindInfoVo jqKindInfoVo = new KindInfoVo();
-//            jqKindInfoVo.setKindCode("J1");
-//            jqKindInfoVo.setKindName("机动车交通事故责任强制保险");
-//            if(Objects.nonNull(insOrdersVo.getInsOrdersCosts().getJqPremium())) {
-//                jqKindInfoVo.setPremium(insOrdersVo.getInsOrdersCosts().getJqPremium().toString());
-//            }
-//            jqKindInfoVo.setAmount("200000");
-//            jqKindInfoVo.setServiceTimes("200000");
-//            jqKindInfoVo.setUnitAmount("200000");
-//            insOrdersVo.getKindInfoVo().add(0,jqKindInfoVo);
-//        }
+        if(ProductsType.isContainDj(insOrdersVo.getProductId())){
+            KindInfoVo jqKindInfoVo = new KindInfoVo();
+            jqKindInfoVo.setKindCode("J1");
+            jqKindInfoVo.setKindName("机动车交通事故责任强制保险");
+            if(Objects.nonNull(insOrdersVo.getInsOrdersCosts().getJqPremium())) {
+                jqKindInfoVo.setPremium(insOrdersVo.getInsOrdersCosts().getJqPremium().toString());
+            }
+            jqKindInfoVo.setAmount("200000");
+            jqKindInfoVo.setServiceTimes("200000");
+            jqKindInfoVo.setUnitAmount("200000");
+            insOrdersVo.getKindInfoVo().add(0,jqKindInfoVo);
+        }
         // 移除交强
-        insOrdersVo.getKindInfoVo().removeIf(item -> "J1".equals(item.getKindCode()));
+//        insOrdersVo.getKindInfoVo().removeIf(item -> "J1".equals(item.getKindCode()));
 
         this.setKindInfoVo(insOrdersVo.getKindInfoVo());
         this.setAccidentalDrivings(insOrdersVo.getAccidentalDrivings());

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

@@ -29,6 +29,9 @@ public class AgreementRulesVo extends BaseModel {
     @Schema(description = "生效截止时间")
     private String endTime;
 
+    @Schema(description = "人工输入描述")
+    private String inputDescription;
+
     /** 规则描述 */
     @Schema(description = "规则描述")
     private String ruleDescription;

+ 51 - 3
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -33,7 +33,10 @@ import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.http.HttpHeaders;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -221,7 +224,15 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         saveThePolicyNumber(ordersNo, applyApplicationResponse);
         UnderwritingResultsVo underwritingResultsVo = new UnderwritingResultsVo();
         AnShengCrawlerOrder anShengCrawlerOrder = anShengCrawlerOrderService.getById(ordersNo);
-        if (!applyApplicationResponse.getCode().equals(200)) {
+
+        PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
+        if (applyApplicationResponse.getCode().equals(200)) {
+            PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+            paymentLinkVo.setOrder(underwritingVo.getOrder());
+            paymentLinkResultsVo = loopAcquisitionPaymentLink(paymentLinkVo);
+        }
+
+        if (!applyApplicationResponse.getCode().equals(200) && StringUtils.isEmpty(paymentLinkResultsVo.getPaymentLink())) {
             underwritingResultsVo.setUnderwritingResult(applyApplicationResponse.getMessage());
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.AUDIT_FAIL);
             return underwritingResultsVo;
@@ -231,12 +242,49 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
             if (anShengCrawlerOrder.getNiInfos().size() > 0) {
                 underwritingResultsVo.setJyApplyNo(anShengCrawlerOrder.getNiInfos().get(0).getNiPolicyNumber());
             }
+            underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
             underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
         }
-        underwritingResultsVo.setPaymentLink("");
         return underwritingResultsVo;
     }
 
+
+
+    /**
+     *  调用接口的业务方法(有返回值)
+     */
+    private PaymentLinkResultsVo loopAcquisitionPaymentLink(PaymentLinkVo paymentLinkVo) {
+        int retryCount = 0;
+        int maxRetry = 15;
+        long sleepTime = 3000;
+        PaymentLinkResultsVo paymentLink = null;
+        while (retryCount < maxRetry) {
+            try {
+                paymentLink = getPaymentLink(paymentLinkVo);
+                log.info("第{}次获取支付链接信息:{}", retryCount, JSONObject.toJSONString(paymentLink));
+                if (paymentLink != null && StringUtils.isNotEmpty(paymentLink.getPaymentLink())) {
+                    break;
+                }
+                Thread.sleep(sleepTime);
+            } catch (Exception e) {
+                e.printStackTrace();
+                log.error("安盛支付二维码异常信息:{}",e.getMessage());
+                try {
+                    Thread.sleep(sleepTime);
+                } catch (InterruptedException ie) {
+                    Thread.currentThread().interrupt();
+                    break;
+                }
+            } finally {
+                retryCount++;
+            }
+        }
+        return paymentLink;
+    }
+
+
+
+
     /**
      * 保存投保单号
      *

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

@@ -288,9 +288,15 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
                         String ocrStr = HttpUtil.sendPost("http://39.98.41.104:8088/getres", sendBody);
                         CheckCodeResp resp = JSONUtil.toBean(ocrStr, CheckCodeResp.class);
                         if(StringUtils.isNotEmpty(resp.getJqImageCode())){
+                            if(quoteVo.getCiTransferCode() != null && !quoteVo.getCiTransferCode().equals("")){
+                                resp.setJqImageCode(quoteVo.getCiTransferCode());
+                            }
                             quoteVo.setCiTransferCode(resp.getJqImageCode().replace("0", "O"));
                         }
                         if(StringUtils.isNotEmpty(resp.getSyImageCode())){
+                            if(quoteVo.getBiTransferCode() != null && !quoteVo.getBiTransferCode().equals("")){
+                                resp.setSyImageCode(quoteVo.getBiTransferCode());
+                            }
                             quoteVo.setBiTransferCode(resp.getSyImageCode().replace("0", "O"));
                         }
                         premiumCalculationRequest = new PremiumCalculationRequest(quoteVo, carActualValue, parameters, vehicle, orderNumber);
@@ -407,7 +413,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
         // 人工核保
         if (submitResponse.getProposal().getUnderWriteInd().equals("8")
                 || submitResponse.getProposal().getUnderWriteInd().equals("9")) {
-            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.WAIT_AUDIT);
+            underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.STAFF_PROCESS);
             underwritingResultsVo.setJqApplyNo(submitResponse.getProposal().getCompProposalNo());
             underwritingResultsVo.setSyApplyNo(submitResponse.getProposal().getCommProposalNo());
             if (submitResponse.getProposal().getNoCarProposalNo() != null) {
@@ -415,7 +421,7 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
             }
             // 获取支付链接
             String message = submitResponse.getHead().getErrorMessage();
-            underwritingResultsVo.setUnderwritingResult(message);
+            underwritingResultsVo.setUnderwritingResult("自核转人工,原因:"+ message);
             PaymentLinkResultsVo paymentLinkResultsVo = getPaymentLink(paymentLinkVo);
             underwritingResultsVo.setPaymentLink(paymentLinkResultsVo.getPaymentLink());
         }

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

@@ -105,7 +105,16 @@ public class DaDiCrawlerQuoteResultVoBuild {
         int sumPayment = daDiQuoteResponse.getInsurancePlan().getTax().getSumPayment();
         quoteResultsVo.getCosts().setVvTax(String.valueOf(sumPayment));
         //设置非车保费
-//        quoteResultsVo.getCosts().setNiPremium(proposalResponse.getAccidentTotalPremium());
+        if (!daDiQuoteResponse.getInsurancePlan().getAccidentInsure().isEmpty()) {
+            int 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();
+            quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
+        }else  if (!daDiQuoteResponse.getInsurancePlan().getPropertyInsurance().isEmpty()) {
+            int niPremium = daDiQuoteResponse.getInsurancePlan().getHealthInsurance().get(0).getWealthAccPremium();
+            quoteResultsVo.getCosts().setNiPremium(String.valueOf(niPremium));
+        }
 
         //总保费
         int sumPremium = trafficDuePremium + businessDuePremium + sumPayment;

+ 2 - 1
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/component/DaDiCrawlerRequestComponent.java

@@ -3,6 +3,7 @@ package com.jzg.quotation.dadi.crawler.component;
 import cn.hutool.core.collection.CollUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.alibaba.nacos.common.utils.CollectionUtils;
 import com.jzg.commons.entity.po.SysUploadFiles;
 import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
@@ -440,7 +441,7 @@ public class DaDiCrawlerRequestComponent {
         String url = RequestUrl.CALCULATION_PREMIUM.getRequestUrl(daDiCrawlerProperties.getBaseUrl());
 
         DaDiQuoteRequest daDiQuoteRequest = new DaDiQuoteRequest(quoteVo, orderId, checks, daDiVehicleChannelRequest.getComCode(), daDiInsurancePlanRequest, carModelRequest, daDiVehicleChannelRequest);
-        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiQuoteRequest));
+        String requestBody = DaDiAESUtils.encryptStr(JSON.toJSONString(daDiQuoteRequest, SerializerFeature.DisableCircularReferenceDetect));
         String responseBody = networkRequest.doPost(url, requestBody, headers);
         log.info("\n----------------------> 获取报价信息请求成功, \n----------------------> 响应结果:[{}],", responseBody);
         DaDiBaseResponse daDiBaseResponse = JSONObject.parseObject(responseBody, DaDiBaseResponse.class);

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

@@ -13,6 +13,8 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 public class DaDiEleProposalQRCoreDataRequest extends DaDiOrderInfoRequest {
 
+    private String flag = "";
+
     public DaDiEleProposalQRCoreDataRequest(String orderId, String comCode, String userCode) {
         this.orderId = orderId;
         this.comCode = comCode;

+ 18 - 28
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiInsurancePlanRequest.java

@@ -259,17 +259,17 @@ public class DaDiInsurancePlanRequest extends DaDiBaseRequest {
     /**
      * 意外险投保信息(可为空)
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> accidentInsure;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> accidentInsure = new ArrayList<>();
 
     /**
      * 健康险投保信息(可为空)
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> healthInsure;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> healthInsure = new ArrayList<>();
 
     /**
      * 财产险投保信息(可为空)
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> propertyInsure;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> propertyInsure = new ArrayList<>();
 
     /**
      * 总保费
@@ -279,17 +279,17 @@ public class DaDiInsurancePlanRequest extends DaDiBaseRequest {
     /**
      * 意外险方案
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> accidentInsurance;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> accidentInsurance = new ArrayList<>();
 
     /**
      * 健康险方案
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> healthInsurance;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> healthInsurance = new ArrayList<>();
 
     /**
      * 财产险方案
      */
-    private List<DaDiJointSalesResponse.InsuranceDTO> propertyInsurance;
+    private List<DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO> propertyInsurance = new ArrayList<>();
 
     /**
      * 再保险项
@@ -454,41 +454,31 @@ public class DaDiInsurancePlanRequest extends DaDiBaseRequest {
                 this.wealthAccSeatCount = quoteVo.getCarInfoVo().getSeatCount();
             }
 
-            DaDiJointSalesResponse.InsuranceDTO insuranceListDTO;
-            // 按产品分类拆分到意外险/健康险/财产险
-            List<DaDiJointSalesResponse.InsuranceDTO> accidentList = new ArrayList<>();
-            List<DaDiJointSalesResponse.InsuranceDTO> healthList = new ArrayList<>();
-            List<DaDiJointSalesResponse.InsuranceDTO> propertyList = new ArrayList<>();
-
-
             for (AccidentalDrivingVo accidentalDriving : accidentalDrivings) {
                 for (Map.Entry<String, List<DaDiJointSalesResponse.InsuranceDTO>> stringListEntry : jointSales.toMap().entrySet()) {
                     for (DaDiJointSalesResponse.InsuranceDTO insuranceDTO : stringListEntry.getValue()) {
-                        if (accidentalDriving.getProductCode().equals(insuranceDTO.getFormulaGroupCode())) {
-                            if (accidentalDriving.getProductCode().equals(insuranceDTO.getFormulaGroupCode())) {
-                                insuranceListDTO = insuranceDTO;
-                                insuranceListDTO.setFormulaGroupCode(insuranceDTO.getFormulaGroupCode());
-                                insuranceListDTO.setFormulaGroupName(insuranceDTO.getFormulaGroupName());
-                                insuranceListDTO.setIsNingdeEraVehicleBatteryCheck(insuranceDTO.getIsNingdeEraVehicleBatteryCheck());
+                        for (DaDiJointSalesResponse.InsuranceDTO.JointSalesSolutionVOSDTO jointSalesSolutionVO : insuranceDTO.getJointSalesSolutionVOS()) {
+                            if (accidentalDriving.getProductCode().equals(jointSalesSolutionVO.getFormulaCode())) {
+                                jointSalesSolutionVO.setFormulaGroupCode(insuranceDTO.getFormulaGroupCode());
+                                jointSalesSolutionVO.setFormulaGroupName(insuranceDTO.getFormulaGroupName());
+                                jointSalesSolutionVO.setIsNingdeEraVehicleBatteryCheck(insuranceDTO.getIsNingdeEraVehicleBatteryCheck());
                                 if (stringListEntry.getKey().equals("accidentInsurance")) {
-                                    accidentList.add(insuranceListDTO);
+                                    accidentInsurance.add(jointSalesSolutionVO);
+                                    accidentInsure.add(jointSalesSolutionVO);
                                 } else if (stringListEntry.getKey().equals("healthInsurance")) {
-                                    healthList.add(insuranceListDTO);
+                                    healthInsurance.add(jointSalesSolutionVO);
+                                    healthInsure.add(jointSalesSolutionVO);
                                 } else if (stringListEntry.getKey().equals("propertyInsurance")) {
-                                    propertyList.add(insuranceListDTO);
+                                    propertyInsurance.add(jointSalesSolutionVO);
+                                    propertyInsure.add(jointSalesSolutionVO);
                                 }
+                                break;
                             }
                         }
                     }
                 }
             }
 
-            this.accidentInsurance = accidentList;
-            this.healthInsurance = healthList;
-            this.propertyInsurance = propertyList;
-            this.accidentInsure = accidentList.isEmpty() ? null : accidentList;
-            this.healthInsure = healthList.isEmpty() ? null : healthList;
-            this.propertyInsure = propertyList.isEmpty() ? null : propertyList;
         } else {
             this.wealthAccChecked = "0";
             this.accidentInsurance = new ArrayList<>();

+ 1 - 1
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/request/DaDiQuoteRequest.java

@@ -129,7 +129,7 @@ public class DaDiQuoteRequest extends DaDiBaseRequest {
     /**
      * 投保方案
      */
-    private Object insurancePlan;
+    private DaDiInsurancePlanRequest insurancePlan;
 
     /**
      * 车主信息

+ 7 - 1
tenant/insurance/quotation-dadi/src/main/java/com/jzg/quotation/dadi/crawler/entity/response/DaDiEleProposalQRCoreDataResponse.java

@@ -1,5 +1,6 @@
 package com.jzg.quotation.dadi.crawler.entity.response;
 
+import com.google.gson.annotations.SerializedName;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -14,5 +15,10 @@ import lombok.NoArgsConstructor;
 public class DaDiEleProposalQRCoreDataResponse extends DaDiBaseResponse {
 
 
-
+    @SerializedName("url")
+    private String url;
+    @SerializedName("paymentNo")
+    private String paymentNo;
+    @SerializedName("checkNo")
+    private String checkNo;
 }

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

@@ -57,10 +57,14 @@ public class DaDiJointSalesResponse extends DaDiBaseResponse{
             private String formulaCode;
             @SerializedName("scene")
             private String scene;
+            @SerializedName("isNingdeEraVehicleBatteryCheck")
+            private String isNingdeEraVehicleBatteryCheck;
             @SerializedName("customElement")
             private String customElement;
             @SerializedName("formulaName")
             private String formulaName;
+            @SerializedName("formulaGroupCode")
+            private String formulaGroupCode;
             @SerializedName("formulaGroupName")
             private String formulaGroupName;
             @SerializedName("productCode")

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

@@ -140,8 +140,13 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
         private String trafficProductCode;
         @SerializedName("accidentInsurance")
         private String accidentInsurance;
+        @SerializedName("accidentInsure")
+        private List<AccidentInsureDTO> accidentInsure;
         @SerializedName("healthInsurance")
-        private String healthInsurance;
+        private List<AccidentInsureDTO> healthInsurance;
+        @SerializedName("propertyInsurance")
+        private List<AccidentInsureDTO> propertyInsurance;
+
 
         @NoArgsConstructor
         @Data
@@ -183,6 +188,63 @@ public class DaDiQuoteResponse extends DaDiBaseResponse {
             }
 
         }
+
+        @NoArgsConstructor
+        @Data
+        public static class AccidentInsureDTO {
+            @SerializedName("forms")
+            private List<FormsDTO> forms;
+            @SerializedName("isShowInsured")
+            private String isShowInsured;
+            @SerializedName("jointSalesSolutionItems")
+            private List<JointSalesSolutionItemsDTO> jointSalesSolutionItems;
+            @SerializedName("policyNature")
+            private String policyNature;
+            @SerializedName("wealthAccPremium")
+            private int wealthAccPremium;
+
+            @NoArgsConstructor
+            @Data
+            public static class FormsDTO {
+                @SerializedName("customformcontent")
+                private String customformcontent;
+                @SerializedName("customformtitle")
+                private String customformtitle;
+                @SerializedName("formcategory")
+                private String formcategory;
+                @SerializedName("id")
+                private int id;
+                @SerializedName("plandefid")
+                private long plandefid;
+                @SerializedName("planformid")
+                private String planformid;
+                @SerializedName("productelementcode")
+                private String productelementcode;
+                @SerializedName("productelementid")
+                private String productelementid;
+            }
+
+            @NoArgsConstructor
+            @Data
+            public static class JointSalesSolutionItemsDTO {
+                @SerializedName("defaultAmount")
+                private int defaultAmount;
+                @SerializedName("defaultValue")
+                private int defaultValue;
+                @SerializedName("insureUnit")
+                private String insureUnit;
+                @SerializedName("kindCode")
+                private String kindCode;
+                @SerializedName("kindName")
+                private String kindName;
+                @SerializedName("linkSeats")
+                private int linkSeats;
+                @SerializedName("subsidyAmount")
+                private String subsidyAmount;
+                @SerializedName("subsidyDay")
+                private String subsidyDay;
+            }
+        }
     }
 
     @NoArgsConstructor

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

@@ -151,7 +151,10 @@ public class DaDiCrawlerRequestImpl implements DaDiCrawlerRequest {
 
             if (underwriting.getUwType().equals("3")) {
                 DaDiPayNoDataResponse payNoDataResponse = daDiCrawlerRequestComponent.getPayNo(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
-                DaDiEleProposalQRCoreDataResponse eleProposalQRCoreData = daDiCrawlerRequestComponent.getEleProposalQRCoreData(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+                PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+                paymentLinkVo.setOrder(underwritingVo.getOrder());
+                underwritingResultsVo.setPaymentLink(getPaymentLink(paymentLinkVo).getPaymentLink());
+                underwritingResultsVo.setCompanyOrderNo(payNoDataResponse.getPayApplyNo());
                 underwritingResultsVo.setUnderwritingStatus(InsOrderStatusEnum.PAY_PENDING);
             } else {
                 underwritingResultsVo.setUnderwritingResult(msg + DaDiVehicleUtils.UW_TYPE_MAP.get(underwriting.getUwType()));
@@ -172,7 +175,14 @@ public class DaDiCrawlerRequestImpl implements DaDiCrawlerRequest {
 
     @Override
     public PaymentLinkResultsVo getPaymentLink(PaymentLinkVo paymentLinkVo) throws Exception {
-        return null;
+        AttributionInformationVo attributionInformationVo = paymentLinkVo.getOrder().getAttributionInformationVo();
+        HttpHeaders headers = daDiCrawlerQuoteProcessService.getHeaders(attributionInformationVo.getUsername(), attributionInformationVo.getPassword());
+        DaDiCrawlerOrder daDiCrawlerOrder = daDiCrawlerOrderService.findByOrdersNo(paymentLinkVo.getOrder().getOrdersNo());
+        DaDiEleProposalQRCoreDataResponse eleProposalQRCoreData = daDiCrawlerRequestComponent.getEleProposalQRCoreData(headers, daDiCrawlerOrder.getPlyappno(), attributionInformationVo);
+        PaymentLinkResultsVo paymentLinkResultsVo = new PaymentLinkResultsVo();
+        paymentLinkResultsVo.setPayLinkStatus(true);
+        paymentLinkResultsVo.setPaymentLink(eleProposalQRCoreData.getUrl());
+        return paymentLinkResultsVo;
     }
 
     @Override

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

@@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
 import com.jzg.quotation.guoren.crawler.entity.dto.GuoRenBcDTO;
 import com.jzg.quotation.guoren.crawler.entity.response.GuoRenCrawlerCalculationPremiumData;
+import org.springframework.util.StringUtils;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
@@ -43,6 +44,56 @@ public class GuoRenCrawlerProposalNoSaveRequest implements Serializable {
         }
         this.bi = biDto;
         this.ci = guoRenCrawlerCalculationPremiumData.getCi();
+        // 将试算响应中的报价ID回填到bc中
+        fillProposalNoFromResponse(guoRenCrawlerCalculationPremiumData);
+    }
+
+    /**
+     * 从试算响应中提取报价ID,回填到保存请求的bc字段中
+     * 解决保司合规规则"报价ID缺失"问题
+     */
+    private void fillProposalNoFromResponse(GuoRenCrawlerCalculationPremiumData response) {
+        if (response == null) {
+            return;
+        }
+        // 1. 从响应的BC中回填proposalNo到请求的BC
+        GuoRenCrawlerCalculationPremiumData.BcDTO responseBc = response.getBc();
+        if (responseBc != null) {
+            // 回填BC.prpTmain.proposalNo
+            if (responseBc.getPrpTmain() != null && StringUtils.hasText(responseBc.getPrpTmain().getProposalNo())) {
+                String bcProposalNo = responseBc.getPrpTmain().getProposalNo();
+                String bcDemandNo = responseBc.getPrpTmain().getDemandNo();
+                if (this.bc.getPrpTmain() != null) {
+                    this.bc.getPrpTmain().setProposalNo(bcProposalNo);
+                    this.bc.getPrpTmain().setDemandNo(bcDemandNo);
+                }
+                if (this.bc.getPrpTitemCar() != null) {
+                    this.bc.getPrpTitemCar().setProposalNo(bcProposalNo);
+                }
+            }
+        }
+        // 2. 从响应的CI中回填proposalNo到ciInsureDemand
+        GuoRenCrawlerCalculationPremiumData.CiDTO responseCi = response.getCi();
+        if (responseCi != null && responseCi.getPrpTmain() != null
+                && StringUtils.hasText(responseCi.getPrpTmain().getProposalNo())) {
+            String ciProposalNo = responseCi.getPrpTmain().getProposalNo();
+            String demandNo = responseCi.getPrpTmain().getDemandNo();
+            if (this.ci != null && this.ci.getCiInsureDemand() != null) {
+                this.ci.getCiInsureDemand().setProposalNo(ciProposalNo);
+                this.ci.getCiInsureDemand().setDemandNo(demandNo);
+            }
+        }
+        // 3. 从响应的BI中回填proposalNo到ciInsureDemand
+        GuoRenCrawlerCalculationPremiumData.BiDTO responseBi = response.getBi();
+        if (responseBi != null && responseBi.getPrpTmain() != null
+                && StringUtils.hasText(responseBi.getPrpTmain().getProposalNo())) {
+            String biProposalNo = responseBi.getPrpTmain().getProposalNo();
+            String biDemandNo = responseBi.getPrpTmain().getDemandNo();
+            if (this.bi != null && this.bi.getCiInsureDemand() != null) {
+                this.bi.getCiInsureDemand().setProposalNo(biProposalNo);
+                this.bi.getCiInsureDemand().setDemandNo(biDemandNo);
+            }
+        }
     }
 
 }

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

@@ -210,11 +210,23 @@ public class GuoRenCrawlerQuoteProcessServiceImpl implements GuoRenCrawlerQuoteP
         ReinsuranceCaptchaVo reinsuranceCaptchaVo1 = exteriorUtilsRequest.reinsuranceCaptchaIdentify(reinsuranceCaptchaVo);
         crawlerCalculationPremiumRequest.getCi().getPrpTmain().setDemandNo(demandNoCi);
         crawlerCalculationPremiumRequest.getCi().getPrpTmain().setAnswer(reinsuranceCaptchaVo1.getCiCaptcha());
+        // 回填第一次试算返回的proposalNo,避免第二次calculationPremium后丢失报价ID
+        crawlerCalculationPremiumRequest.getCi().getPrpTmain().setProposalNo(
+                calculationPremium.getCi().getPrpTmain().getProposalNo());
         crawlerCalculationPremiumRequest.getCi().setCiInsureDemand(calculationPremium.getCi().getCiInsureDemand());
         crawlerCalculationPremiumRequest.getCi().setPrptengageList(calculationPremium.getCi().getPrptengageList());
+        // BC也需要回填proposalNo
+        if (calculationPremium.getBc() != null && calculationPremium.getBc().getPrpTmain() != null
+                && org.springframework.util.StringUtils.hasText(calculationPremium.getBc().getPrpTmain().getProposalNo())) {
+            crawlerCalculationPremiumRequest.getBc().getPrpTmain().setProposalNo(
+                    calculationPremium.getBc().getPrpTmain().getProposalNo());
+        }
         if (crawlerCalculationPremiumRequest.getBi().getPrpTmain() != null) {
             crawlerCalculationPremiumRequest.getBi().getPrpTmain().setDemandNo(demandNoBi);
             crawlerCalculationPremiumRequest.getBi().getPrpTmain().setAnswer(reinsuranceCaptchaVo1.getBiCaptcha());
+            // 回填BI的proposalNo
+            crawlerCalculationPremiumRequest.getBi().getPrpTmain().setProposalNo(
+                    calculationPremium.getBi().getPrpTmain().getProposalNo());
             crawlerCalculationPremiumRequest.getBi().setCiInsureDemand(calculationPremium.getBi().getCiInsureDemand());
             crawlerCalculationPremiumRequest.getBi().setPrptengageList(calculationPremium.getBi().getPrptengageList());
         }

+ 1 - 1
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/async/AsyncGetPayLink.java

@@ -32,7 +32,7 @@ public class AsyncGetPayLink {
     @Async("asyncTaskExecutor")
     public void paymentLink(QuotationBaseService quoteService,OrderBase order, String companyCode ){
         try {
-            if (StringUtils.equals(CompanyConstants.TPBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)
+            if (StringUtils.equals(CompanyConstants.TKIC.getCompanyCode(),companyCode)
                     || StringUtils.equals(CompanyConstants.TSBX.getCompanyCode(),companyCode) || StringUtils.equals(CompanyConstants.HTIC.getCompanyCode(),companyCode)
             ){
                 PaymentLinkVo paymentLinkVo = new PaymentLinkVo();

+ 17 - 2
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/controller/QrCodeController.java

@@ -9,6 +9,8 @@ import com.jzg.commons.core.page.HttpResult;
 import com.jzg.commons.entity.orders.po.*;
 import com.jzg.commons.entity.po.EsmInsCompany;
 import com.jzg.commons.entity.po.QrBarcodeConfig;
+import com.jzg.commons.entity.quote.vo.aggregated.PaymentLinkVo;
+import com.jzg.commons.entity.quote.vo.base.OrderBase;
 import com.jzg.commons.exception.SystemException;
 import com.jzg.commons.util.AssertionUtils;
 import com.jzg.commons.util.LocalDateTimeUtils;
@@ -51,6 +53,7 @@ public class QrCodeController extends BaseController {
     private final InsOrdersCarInfoService insOrdersCarInfoService;
     private final InsOrdersRiskService insOrdersRiskService;
     private final PlatformClient platformClient;
+    private final UnifyOrderManager unifyOrderManager;
     //二维码生成地址
     @Value("${qrcode.genAddress}")
     private String qrCodeGenAddress;
@@ -60,7 +63,7 @@ public class QrCodeController extends BaseController {
 
     @GetMapping(value = "/getQrCode")
     @Operation(summary = "获取二维码")
-    public ModelAndView getQrCode(@NotBlank(message = "订单号号不能为空") @RequestParam("orderNo") String orderNo) {
+    public ModelAndView getQrCode(@NotBlank(message = "订单号号不能为空") @RequestParam("orderNo") String orderNo) throws Exception {
         // 获取保存支付url
         InsOrders orders = insOrdersService.getById(orderNo);
         List<InsOrdersCarUserInfo> carUserInfoList = insOrdersCarUserInfoService.getByOrderId(orderNo);
@@ -96,6 +99,13 @@ public class QrCodeController extends BaseController {
 
         InsOrdersQrcode ordersQrcode = insOrdersQrcodeService.getOneOrSave(orders);
         if(ordersQrcode.getJumpUrl() == null || ordersQrcode.getJumpUrl().isEmpty()){
+            // 尝试获取支付连接
+            PaymentLinkVo paymentLinkVo = new PaymentLinkVo();
+            OrderBase orderBase = new OrderBase();
+            orderBase.setOrdersNo(orderNo);
+            paymentLinkVo.setOrder(orderBase);
+            HttpResult httpResult = unifyOrderManager.getPaymentLink(paymentLinkVo);
+
             throw new SystemException("订单不存在支付连接");
         }
 
@@ -203,7 +213,12 @@ public class QrCodeController extends BaseController {
                     }
                 } else {
                     // 本身就是 base64
-                    finalQrUrl = "data:image/png;base64," + jumpUrl;
+                    boolean isBase64Image = jumpUrl.startsWith("data:image/");
+                    if(!isBase64Image) {
+                        finalQrUrl = "data:image/png;base64," + jumpUrl;
+                    }else{
+                        finalQrUrl = jumpUrl;
+                    }
                 }
 
                 qrCodeVo.setQrCodeUrl(finalQrUrl);

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

@@ -7,6 +7,8 @@ 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;
 import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
 import com.jzg.quotation.taiping.crawler.build.TaiPingCrawlerQuoteResultsVoBuild;
 import com.jzg.quotation.taiping.crawler.component.TaiPingCrawlerCacheComponent;
@@ -40,6 +42,11 @@ public class TaipingCrawlerRequestImpl implements TaipingCrawlerRequest {
         taiPingCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword());
     }
 
+    @Override
+    public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
+        return null;
+    }
+
     @Override
     public QuoteResultsVo quote(QuoteVo quoteVo) {
         HttpHeaders httpHeaders = taiPingCrawlerRequestComponent.getHeaders();

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

@@ -17,6 +17,9 @@ import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
 public class TaiShanCrawlerQuoteRequestVoBuild {
 
     public static TaiShanCrawlerQuotationRequest toQuotationDto(QuoteVo quoteVo, TaiShanCrawlerCarResponse.CarModelInfo modelsDTO, String currentValue, TaiShanCrawlerConfigureParameters parameters, TaiShanCrawlerDeptResponse taiShanCrawlerDeptResponse, AttributionInformationVo attributionInformationVo, String policyPersonId, String insuredPersonId) {
@@ -240,7 +243,17 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
         int seatNumber = Integer.parseInt(modelsDTO.getNewSeatNumber());
 
         for (KindInfoVo infoVo : kindInfoVoList) {
-            String kindCode = infoVo.getKindCode();
+            // 注意:kindCode是泰山编码(如030006),platformKindCode才是掌柜编码(如A)
+            // switch使用掌柜编码匹配,与Python insurance_Map的key一致
+            String kindCode = infoVo.getPlatformKindCode();
+            log.info("泰山报价-险种编码: kindCode(泰山)={}, amount={}, platformKindCode(掌柜)={}", infoVo.getKindCode(), infoVo.getAmount(), kindCode);
+
+            // 跳过不在商业险映射表中的险种(如交强险等),与Python insurance_Map一致
+            if (!BUSINESS_KIND_CODES.contains(kindCode)) {
+                log.info("泰山报价-跳过非商业险种: platformKindCode={}", kindCode);
+                continue;
+            }
+
             TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind itemKind;
 
             // 获取对应险种的模板默认值(与Python insurance_Map对应)
@@ -249,6 +262,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                 case "A":
                     itemKind = buildDefaultItemKind("030006", "机动车损失保险", 1);
                     itemKind.setAmount(actualValue);
+                    itemKind.setIndemLmt(actualValue);
                     itemKind.setDeductible("375001");
                     break;
 
@@ -260,7 +274,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setIndemLmtLvl("306006018"); // 默认200万以上
                     for (String[] limit : THIRD_LIMIT_AMT) {
                         double cnameVal = extractNumberFromWan(limit[0]);
-                        if (cnameVal == Double.parseDouble(infoVo.getAmount())) {
+                        if (Math.abs(cnameVal - Double.parseDouble(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmtLvl(limit[1]);
                             break;
                         }
@@ -270,12 +284,11 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                 // D3: 车上人员责任险(驾驶人)
                 case "D3":
                     itemKind = buildDefaultItemKind("030001", "车上人员责任险(驾驶人)", 3);
-                    itemKind.setAmount(Integer.parseInt(infoVo.getAmount()));
+                    itemKind.setAmount(infoVo.getAmount());
                     itemKind.setLiabDaysLmt(1);
                     // 匹配医保外医疗费用档次以获取indemLmtLvl(与Python一致)
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
-                            itemKind.setAmount(infoVo.getAmount());
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmt(actualValue);
                             itemKind.setIndemLmtLvl(med[1]);
                             break;
@@ -291,7 +304,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setPerAmt(d4Amount);
                     itemKind.setLiabDaysLmt(seatNumber - 1);
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmt(actualValue);
                             itemKind.setIndemLmtLvl(med[1]);
                             break;
@@ -305,7 +318,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setAmount(infoVo.getAmount());
                     itemKind.setIndemLmt(infoVo.getAmount());
                     for (String[] scratch : CAR_SCRATCH_LEVELS) {
-                        if (Float.parseFloat(scratch[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (Math.abs(Float.parseFloat(scratch[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmtLvl(scratch[1]);
                             break;
                         }
@@ -326,9 +339,9 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setIndemLmt("500000");
                     itemKind.setIndemLmtLvl("390N27"); // 默认50万
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setAmount(infoVo.getAmount());
-                            itemKind.setIndemLmt(infoVo.getAmount());
+                            itemKind.setIndemLmt(actualValue);
                             itemKind.setIndemLmtLvl(med[1]);
                             break;
                         }
@@ -342,7 +355,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setIndemLmt("500000");
                     itemKind.setIndemLmtLvl("390N27"); // 默认50万
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setIndemLmtLvl(med[1]);
                             itemKind.setAmount(infoVo.getAmount());
                             itemKind.setIndemLmt(infoVo.getAmount());
@@ -360,7 +373,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
                     itemKind.setPerAmt("500000");
                     itemKind.setIndemLmtLvl("390N27"); // 默认50万
                     for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
-                        if (!"保额共享".equals(med[0]) && Float.parseFloat(med[0]) == Float.parseFloat(infoVo.getAmount())) {
+                        if (!"保额共享".equals(med[0]) && Math.abs(Float.parseFloat(med[0]) - Float.parseFloat(infoVo.getAmount())) < 0.01) {
                             itemKind.setAmount(Integer.parseInt(infoVo.getAmount()) * (seatNumber - 1));
                             itemKind.setIndemLmt(infoVo.getAmount());
                             itemKind.setLiabDaysLmt(seatNumber - 1);
@@ -435,6 +448,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
 
                 default:
                     // 未识别的险种,回退原有逻辑填充
+                    log.warn("泰山报价-未识别的险种编码: kindCode={}, 走fallback逻辑", kindCode);
                     itemKind = fallbackBuildItemKind(infoVo, kindList.size());
                     break;
             }
@@ -564,6 +578,13 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
 
     // ==================== Python 档位静态常量(与 tsbxitem.py 保持一致) ====================
 
+    /** 商业险种编码集合(与Python insurance_Map的key一致),用于过滤非商业险种 */
+    private static final Set<String> BUSINESS_KIND_CODES = new HashSet<>(Arrays.asList(
+            "A", "B", "D3", "D4", "G1", "L", "F",
+            "SY_FJ_YBW1", "SY_FJ_YBW2", "SY_FJ_YBW3",
+            "MJ1", "MJ2", "BD", "TY4"
+    ));
+
     /** 【第三者责任险】限额档次 */
     private static final List<String[]> THIRD_LIMIT_AMT = Arrays.asList(
             new String[]{"10万元", "306006005"},

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

@@ -233,6 +233,22 @@ public class TaiShanCrawlerRequestImpl implements TaiShanCrawlerRequest {
                         itemKind.setBefPremium(res.getBefPremium());
                         itemKind.setBefAnnPrm(res.getBefAnnPrm());
                         itemKind.setBasePrm(res.getBasePrm());
+                        itemKind.setPureRiskPremium(res.getPureRiskPremium());
+                        // 覆盖报价响应中的其他关键字段(与Python直接使用price_res['result']作为save数据一致)
+                        itemKind.setIndemLmtLvl(res.getIndemLmtLvl());
+                        itemKind.setDisCoef(res.getDisCoef());
+                        itemKind.setDuctDiscount(res.getDuctDiscount());
+                        itemKind.setDeductibleRatio(res.getDeductibleRatio());
+                        itemKind.setAfterPremiumYear(res.getAfterPremiumYear());
+                        itemKind.setCalcPrm(res.getCalcPrm());
+                        itemKind.setResvNumberRoad(res.getResvNumberRoad());
+                        itemKind.setResvNumberDriver(res.getResvNumberDriver());
+                        itemKind.setAbsoluteDeductible(res.getAbsoluteDeductible());
+                        itemKind.setResvNumAutonomy(res.getResvNumAutonomy());
+                        itemKind.setAmtVar(res.getAmtVar());
+                        itemKind.setPrmVar(res.getPrmVar());
+                        itemKind.setPkId(res.getPkId());
+                        itemKind.setSeqNo(res.getSeqNo());
                     }
                 });
             }

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

@@ -208,6 +208,7 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         rules.setOrderNum(orderNum);
         rules.setStartTime(param.getStartTime());
         rules.setEndTime(param.getEndTime());
+        rules.setInputDescription(param.getInputDescription());
         rules.setAgreementId(param.getAgreementId());
         rules.setParentId(parentId);
         return rules;
@@ -356,8 +357,7 @@ public class PtlAgreementUndwrtRulesServiceImpl extends ServiceImpl<PtlAgreement
         // 获取费用因子属性(公共逻辑,仅查询一次)
         List<PtlAgreementUndwrtRulesAttr> attrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList();
         Map<String, PtlAgreementUndwrtRulesAttr> attrMap = attrList.stream()
-                .filter(attr -> attr.getCompanyIds().equals("all"))
-                .filter(attr -> attr.getCompanyIds().equals(agreement.getCompanyId()))
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(agreement.getCompanyId()))
                 .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
 
         // 确定需要处理的规则ID列表

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

@@ -301,7 +301,9 @@ public class PtlSchemeServiceImpl extends ServiceImpl<PtlSchemeMapper, PtlScheme
         List<PtlSchemeRulesAttrLink> linkList = ptlSchemeRulesAttrLinkMapper.selectList(new LambdaQueryWrapper<PtlSchemeRulesAttrLink>().eq(PtlSchemeRulesAttrLink::getSchemeId, schemeId));
         // 获取费用因子属性
         List<PtlAgreementUndwrtRulesAttr> attrList = agreementUndwrtRulesAttrService.getUndwrtRulesAttrList(companyId);
-        Map<String, PtlAgreementUndwrtRulesAttr> attrMap = attrList.stream().collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
+        Map<String, PtlAgreementUndwrtRulesAttr> attrMap = attrList.stream()
+                .filter(attr -> "all".equals(attr.getCompanyIds()) || attr.getCompanyIds().equals(companyId))
+                .collect(Collectors.toMap(PtlAgreementUndwrtRulesAttr::getAttrCode, attr -> attr));
         List<PtlAgreementUndwrtRulesAttr> newAttrList = new ArrayList<>();
         linkList.forEach(link -> {
             if (attrMap.containsKey(link.getAttrCode())) {