Просмотр исходного кода

泰山请检查医保外用药险别保额档次bug优化

wangguoqiang 3 месяцев назад
Родитель
Сommit
eeb724f6ab

+ 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());
                     }
                 });
             }