|
@@ -17,6 +17,9 @@ import java.time.LocalDate;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
import java.util.*;
|
|
|
|
|
|
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
|
+
|
|
|
|
|
+@Slf4j
|
|
|
public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
|
|
|
|
|
public static TaiShanCrawlerQuotationRequest toQuotationDto(QuoteVo quoteVo, TaiShanCrawlerCarResponse.CarModelInfo modelsDTO, String currentValue, TaiShanCrawlerConfigureParameters parameters, TaiShanCrawlerDeptResponse taiShanCrawlerDeptResponse, AttributionInformationVo attributionInformationVo, String policyPersonId, String insuredPersonId) {
|
|
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());
|
|
int seatNumber = Integer.parseInt(modelsDTO.getNewSeatNumber());
|
|
|
|
|
|
|
|
for (KindInfoVo infoVo : kindInfoVoList) {
|
|
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;
|
|
TaiShanCrawlerQuotationRequest.BusinessInsurance.ItemKind itemKind;
|
|
|
|
|
|
|
|
// 获取对应险种的模板默认值(与Python insurance_Map对应)
|
|
// 获取对应险种的模板默认值(与Python insurance_Map对应)
|
|
@@ -249,6 +262,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
case "A":
|
|
case "A":
|
|
|
itemKind = buildDefaultItemKind("030006", "机动车损失保险", 1);
|
|
itemKind = buildDefaultItemKind("030006", "机动车损失保险", 1);
|
|
|
itemKind.setAmount(actualValue);
|
|
itemKind.setAmount(actualValue);
|
|
|
|
|
+ itemKind.setIndemLmt(actualValue);
|
|
|
itemKind.setDeductible("375001");
|
|
itemKind.setDeductible("375001");
|
|
|
break;
|
|
break;
|
|
|
|
|
|
|
@@ -260,7 +274,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
itemKind.setIndemLmtLvl("306006018"); // 默认200万以上
|
|
itemKind.setIndemLmtLvl("306006018"); // 默认200万以上
|
|
|
for (String[] limit : THIRD_LIMIT_AMT) {
|
|
for (String[] limit : THIRD_LIMIT_AMT) {
|
|
|
double cnameVal = extractNumberFromWan(limit[0]);
|
|
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]);
|
|
itemKind.setIndemLmtLvl(limit[1]);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -270,12 +284,11 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
// D3: 车上人员责任险(驾驶人)
|
|
// D3: 车上人员责任险(驾驶人)
|
|
|
case "D3":
|
|
case "D3":
|
|
|
itemKind = buildDefaultItemKind("030001", "车上人员责任险(驾驶人)", 3);
|
|
itemKind = buildDefaultItemKind("030001", "车上人员责任险(驾驶人)", 3);
|
|
|
- itemKind.setAmount(Integer.parseInt(infoVo.getAmount()));
|
|
|
|
|
|
|
+ itemKind.setAmount(infoVo.getAmount());
|
|
|
itemKind.setLiabDaysLmt(1);
|
|
itemKind.setLiabDaysLmt(1);
|
|
|
// 匹配医保外医疗费用档次以获取indemLmtLvl(与Python一致)
|
|
// 匹配医保外医疗费用档次以获取indemLmtLvl(与Python一致)
|
|
|
for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
|
|
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.setIndemLmt(actualValue);
|
|
|
itemKind.setIndemLmtLvl(med[1]);
|
|
itemKind.setIndemLmtLvl(med[1]);
|
|
|
break;
|
|
break;
|
|
@@ -291,7 +304,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
itemKind.setPerAmt(d4Amount);
|
|
itemKind.setPerAmt(d4Amount);
|
|
|
itemKind.setLiabDaysLmt(seatNumber - 1);
|
|
itemKind.setLiabDaysLmt(seatNumber - 1);
|
|
|
for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
|
|
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.setIndemLmt(actualValue);
|
|
|
itemKind.setIndemLmtLvl(med[1]);
|
|
itemKind.setIndemLmtLvl(med[1]);
|
|
|
break;
|
|
break;
|
|
@@ -305,7 +318,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
itemKind.setAmount(infoVo.getAmount());
|
|
itemKind.setAmount(infoVo.getAmount());
|
|
|
itemKind.setIndemLmt(infoVo.getAmount());
|
|
itemKind.setIndemLmt(infoVo.getAmount());
|
|
|
for (String[] scratch : CAR_SCRATCH_LEVELS) {
|
|
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]);
|
|
itemKind.setIndemLmtLvl(scratch[1]);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -326,9 +339,9 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
itemKind.setIndemLmt("500000");
|
|
itemKind.setIndemLmt("500000");
|
|
|
itemKind.setIndemLmtLvl("390N27"); // 默认50万
|
|
itemKind.setIndemLmtLvl("390N27"); // 默认50万
|
|
|
for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
|
|
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.setAmount(infoVo.getAmount());
|
|
|
- itemKind.setIndemLmt(infoVo.getAmount());
|
|
|
|
|
|
|
+ itemKind.setIndemLmt(actualValue);
|
|
|
itemKind.setIndemLmtLvl(med[1]);
|
|
itemKind.setIndemLmtLvl(med[1]);
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -342,7 +355,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
itemKind.setIndemLmt("500000");
|
|
itemKind.setIndemLmt("500000");
|
|
|
itemKind.setIndemLmtLvl("390N27"); // 默认50万
|
|
itemKind.setIndemLmtLvl("390N27"); // 默认50万
|
|
|
for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
|
|
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.setIndemLmtLvl(med[1]);
|
|
|
itemKind.setAmount(infoVo.getAmount());
|
|
itemKind.setAmount(infoVo.getAmount());
|
|
|
itemKind.setIndemLmt(infoVo.getAmount());
|
|
itemKind.setIndemLmt(infoVo.getAmount());
|
|
@@ -360,7 +373,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
itemKind.setPerAmt("500000");
|
|
itemKind.setPerAmt("500000");
|
|
|
itemKind.setIndemLmtLvl("390N27"); // 默认50万
|
|
itemKind.setIndemLmtLvl("390N27"); // 默认50万
|
|
|
for (String[] med : MEDICAL_EXPENSES_OUTSIDE) {
|
|
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.setAmount(Integer.parseInt(infoVo.getAmount()) * (seatNumber - 1));
|
|
|
itemKind.setIndemLmt(infoVo.getAmount());
|
|
itemKind.setIndemLmt(infoVo.getAmount());
|
|
|
itemKind.setLiabDaysLmt(seatNumber - 1);
|
|
itemKind.setLiabDaysLmt(seatNumber - 1);
|
|
@@ -435,6 +448,7 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
|
|
|
|
|
default:
|
|
default:
|
|
|
// 未识别的险种,回退原有逻辑填充
|
|
// 未识别的险种,回退原有逻辑填充
|
|
|
|
|
+ log.warn("泰山报价-未识别的险种编码: kindCode={}, 走fallback逻辑", kindCode);
|
|
|
itemKind = fallbackBuildItemKind(infoVo, kindList.size());
|
|
itemKind = fallbackBuildItemKind(infoVo, kindList.size());
|
|
|
break;
|
|
break;
|
|
|
}
|
|
}
|
|
@@ -564,6 +578,13 @@ public class TaiShanCrawlerQuoteRequestVoBuild {
|
|
|
|
|
|
|
|
// ==================== Python 档位静态常量(与 tsbxitem.py 保持一致) ====================
|
|
// ==================== 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(
|
|
private static final List<String[]> THIRD_LIMIT_AMT = Arrays.asList(
|
|
|
new String[]{"10万元", "306006005"},
|
|
new String[]{"10万元", "306006005"},
|