|
|
@@ -13,6 +13,8 @@ import com.jzg.commons.entity.quote.vo.identify.ReinsuranceCaptchaVo;
|
|
|
import com.jzg.quotation.commons.annotation.QuoteCrawlerService;
|
|
|
import com.jzg.quotation.commons.constant.InsuranceCode;
|
|
|
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.commons.service.ExteriorUtilsRequest;
|
|
|
import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
|
|
|
@@ -63,6 +65,11 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
huaNongCrawlerQuoteProcessService.login(loginBase.getUsername(), loginBase.getPassword(), null, true);
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public GetCaptchaResponse getCaptcha(GetCaptchaRequest sendCaptchaRequest) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public boolean detectLogin(DetectLoginRequest detectLoginRequest) {
|
|
|
String username = detectLoginRequest.getUsername();
|
|
|
@@ -316,7 +323,8 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
boolean isCiDuplicate = StringUtils.hasText(ciReinsureMsg) &&
|
|
|
(ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
|
|
|
boolean isBiDuplicate = StringUtils.hasText(biReinsureMsg) &&
|
|
|
- (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
|
|
|
+ (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期")
|
|
|
+ || biReinsureMsg.contains("保期:["));
|
|
|
|
|
|
if (isCiDuplicate || isBiDuplicate) {
|
|
|
hasDuplicateInsurance = true;
|
|
|
@@ -344,25 +352,45 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
HuaNongCrawlerQuotedPriceResponse response,
|
|
|
HttpHeaders httpHeaders) {
|
|
|
|
|
|
+ // 收集所有contract中的重复投保信息(与Python一致:遍历所有contract汇总)
|
|
|
+ String ciReinsureEndDate = null;
|
|
|
+ String ciReinsureMessage = null;
|
|
|
+ String biReinsureEndDate = null;
|
|
|
+ String biReinsureMessage = null;
|
|
|
+
|
|
|
for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : response.getBusinessData().getContract()) {
|
|
|
if (contract.getPlatFormMessage() == null) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- String riskCode = contract.getContractMain().getRiskCode();
|
|
|
- String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
|
|
|
- String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
|
|
|
-
|
|
|
- boolean needAdjustCi = "0507".equals(riskCode) &&
|
|
|
- StringUtils.hasText(ciReinsureMsg) &&
|
|
|
- (ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
|
|
|
-
|
|
|
- boolean needAdjustBi = ("0510".equals(riskCode) || "0515".equals(riskCode)) &&
|
|
|
- StringUtils.hasText(biReinsureMsg) &&
|
|
|
- (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
|
|
|
-
|
|
|
- if (needAdjustCi || needAdjustBi) {
|
|
|
- adjustPolicyDate(request, riskCode, contract);
|
|
|
+ String ciEnd = contract.getPlatFormMessage().getCiReinsureEndDate();
|
|
|
+ String ciMsg = contract.getPlatFormMessage().getCiReinsureMessage();
|
|
|
+ String biEnd = contract.getPlatFormMessage().getBiReinsureEndDate();
|
|
|
+ String biMsg = contract.getPlatFormMessage().getBiReinsureMessage();
|
|
|
+
|
|
|
+ if (StringUtils.hasText(ciEnd)) ciReinsureEndDate = ciEnd;
|
|
|
+ if (StringUtils.hasText(ciMsg)) ciReinsureMessage = ciMsg;
|
|
|
+ if (StringUtils.hasText(biEnd)) biReinsureEndDate = biEnd;
|
|
|
+ if (StringUtils.hasText(biMsg)) biReinsureMessage = biMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 与Python一致:三个触发条件
|
|
|
+ boolean ciTrigger = StringUtils.hasText(ciReinsureEndDate)
|
|
|
+ && StringUtils.hasText(ciReinsureMessage)
|
|
|
+ && ciReinsureMessage.contains("终保日期");
|
|
|
+ boolean biTrigger1 = StringUtils.hasText(biReinsureEndDate)
|
|
|
+ && StringUtils.hasText(biReinsureMessage)
|
|
|
+ && biReinsureMessage.contains("终保日期");
|
|
|
+ boolean biTrigger2 = StringUtils.hasText(biReinsureEndDate)
|
|
|
+ && StringUtils.hasText(biReinsureMessage)
|
|
|
+ && biReinsureMessage.contains("保期:[");
|
|
|
+
|
|
|
+ if (ciTrigger || biTrigger1 || biTrigger2) {
|
|
|
+ // 与Python一致:交强险和商业险的起保日期同时更新
|
|
|
+ if (StringUtils.hasText(ciReinsureEndDate)) {
|
|
|
+ adjustPolicyDate(request, "0507", ciReinsureEndDate);
|
|
|
+ }
|
|
|
+ if (StringUtils.hasText(biReinsureEndDate)) {
|
|
|
+ adjustPolicyDate(request, "0510", biReinsureEndDate);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -386,7 +414,8 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
boolean isCiDuplicate = StringUtils.hasText(ciReinsureMsg) &&
|
|
|
(ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
|
|
|
boolean isBiDuplicate = StringUtils.hasText(biReinsureMsg) &&
|
|
|
- (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
|
|
|
+ (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期")
|
|
|
+ || biReinsureMsg.contains("保期:["));
|
|
|
|
|
|
if (isCiDuplicate || isBiDuplicate) {
|
|
|
return true;
|
|
|
@@ -401,63 +430,89 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
HuaNongCrawlerQuotedPriceResponse response,
|
|
|
HttpHeaders httpHeaders) {
|
|
|
|
|
|
+ // 收集所有contract中的重复投保信息
|
|
|
+ String ciReinsureEndDate = null;
|
|
|
+ String ciReinsureMessage = null;
|
|
|
+ String biReinsureEndDate = null;
|
|
|
+ String biReinsureMessage = null;
|
|
|
+
|
|
|
for (HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract : response.getBusinessData().getContract()) {
|
|
|
if (contract.getPlatFormMessage() == null) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
- String riskCode = contract.getContractMain().getRiskCode();
|
|
|
- String ciReinsureMsg = contract.getPlatFormMessage().getCiReinsureMessage();
|
|
|
- String biReinsureMsg = contract.getPlatFormMessage().getBiReinsureMessage();
|
|
|
-
|
|
|
- boolean needAdjustCi = "0507".equals(riskCode) &&
|
|
|
- StringUtils.hasText(ciReinsureMsg) &&
|
|
|
- (ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
|
|
|
-
|
|
|
- boolean needAdjustBi = ("0510".equals(riskCode) || "0515".equals(riskCode)) &&
|
|
|
- StringUtils.hasText(biReinsureMsg) &&
|
|
|
- (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
|
|
|
-
|
|
|
- if (needAdjustCi || needAdjustBi) {
|
|
|
- adjustPolicyDateWithOneMoreDay(request, riskCode, contract);
|
|
|
+ String ciEnd = contract.getPlatFormMessage().getCiReinsureEndDate();
|
|
|
+ String ciMsg = contract.getPlatFormMessage().getCiReinsureMessage();
|
|
|
+ String biEnd = contract.getPlatFormMessage().getBiReinsureEndDate();
|
|
|
+ String biMsg = contract.getPlatFormMessage().getBiReinsureMessage();
|
|
|
+
|
|
|
+ if (StringUtils.hasText(ciEnd)) ciReinsureEndDate = ciEnd;
|
|
|
+ if (StringUtils.hasText(ciMsg)) ciReinsureMessage = ciMsg;
|
|
|
+ if (StringUtils.hasText(biEnd)) biReinsureEndDate = biEnd;
|
|
|
+ if (StringUtils.hasText(biMsg)) biReinsureMessage = biMsg;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 与Python一致:三个触发条件
|
|
|
+ boolean ciTrigger = StringUtils.hasText(ciReinsureEndDate)
|
|
|
+ && StringUtils.hasText(ciReinsureMessage)
|
|
|
+ && ciReinsureMessage.contains("终保日期");
|
|
|
+ boolean biTrigger1 = StringUtils.hasText(biReinsureEndDate)
|
|
|
+ && StringUtils.hasText(biReinsureMessage)
|
|
|
+ && biReinsureMessage.contains("终保日期");
|
|
|
+ boolean biTrigger2 = StringUtils.hasText(biReinsureEndDate)
|
|
|
+ && StringUtils.hasText(biReinsureMessage)
|
|
|
+ && biReinsureMessage.contains("保期:[");
|
|
|
+
|
|
|
+ if (ciTrigger || biTrigger1 || biTrigger2) {
|
|
|
+ // 与Python一致:交强险和商业险的起保日期同时更新,日期+1天
|
|
|
+ if (StringUtils.hasText(ciReinsureEndDate)) {
|
|
|
+ adjustPolicyDateWithPlusOne(request, "0507", ciReinsureEndDate);
|
|
|
+ }
|
|
|
+ if (StringUtils.hasText(biReinsureEndDate)) {
|
|
|
+ adjustPolicyDateWithPlusOne(request, "0510", biReinsureEndDate);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return huaNongCrawlerRequestComponent.quotedPrice(request, httpHeaders);
|
|
|
}
|
|
|
|
|
|
- private void adjustPolicyDateWithOneMoreDay(HuaNongCrawlerQuotedPriceRequestRequest request,
|
|
|
- String riskCode, HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract) {
|
|
|
-
|
|
|
- String lastExpireDate = "";
|
|
|
-
|
|
|
- if ("0507".equals(riskCode)) {
|
|
|
- lastExpireDate = contract.getPlatFormMessage().getCiReinsureEndDate();
|
|
|
- } else if ("0510".equals(riskCode) || "0515".equals(riskCode)) {
|
|
|
- String biReinsureEndDate = contract.getPlatFormMessage().getBiReinsureEndDate();
|
|
|
- String lastPolicyExpireDate = contract.getPlatFormMessage().getLastPolicyExpireDate();
|
|
|
-
|
|
|
- if (StringUtils.hasText(biReinsureEndDate)) {
|
|
|
- lastExpireDate = biReinsureEndDate;
|
|
|
- } else if (StringUtils.hasText(lastPolicyExpireDate)) {
|
|
|
- lastExpireDate = lastPolicyExpireDate;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (StringUtils.hasText(lastExpireDate)) {
|
|
|
- lastExpireDate = ensureDateTimeFormat(lastExpireDate);
|
|
|
- lastExpireDate = plusOneDayDateTime(lastExpireDate);
|
|
|
+ /**
|
|
|
+ * 调整保单日期(与Python get_contract 一致:更新contractMain + 全部coverage的validDate和expiryDate)
|
|
|
+ */
|
|
|
+ private void adjustPolicyDate(HuaNongCrawlerQuotedPriceRequestRequest request,
|
|
|
+ String riskCode, String lastExpireDate) {
|
|
|
+ lastExpireDate = ensureDateTimeFormat(lastExpireDate);
|
|
|
+ applyDateToContract(request, riskCode, lastExpireDate);
|
|
|
+ }
|
|
|
|
|
|
- String finalLastExpireDate = lastExpireDate;
|
|
|
- request.getBusinessData().getContract().stream()
|
|
|
- .filter(dto -> riskCode.equals(dto.getContractMain().getRiskCode()))
|
|
|
- .findFirst()
|
|
|
- .ifPresent(dto -> {
|
|
|
- dto.getContractMain().setValidDate(finalLastExpireDate);
|
|
|
- dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(finalLastExpireDate));
|
|
|
- dto.getCoverage().get(0).setValidDate(finalLastExpireDate);
|
|
|
- });
|
|
|
- }
|
|
|
+ /**
|
|
|
+ * 调整保单日期并+1天(第二次重试用)
|
|
|
+ */
|
|
|
+ private void adjustPolicyDateWithPlusOne(HuaNongCrawlerQuotedPriceRequestRequest request,
|
|
|
+ String riskCode, String lastExpireDate) {
|
|
|
+ lastExpireDate = ensureDateTimeFormat(lastExpireDate);
|
|
|
+ lastExpireDate = plusOneDayDateTime(lastExpireDate);
|
|
|
+ applyDateToContract(request, riskCode, lastExpireDate);
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 将日期应用到请求中的contract:更新contractMain和全部coverage的validDate、expiryDate
|
|
|
+ */
|
|
|
+ private void applyDateToContract(HuaNongCrawlerQuotedPriceRequestRequest request,
|
|
|
+ String riskCode, String finalLastExpireDate) {
|
|
|
+ String expiryDate = TimeProcessing.minusOneSecondAfterYear(finalLastExpireDate);
|
|
|
+ request.getBusinessData().getContract().stream()
|
|
|
+ .filter(dto -> riskCode.equals(dto.getContractMain().getRiskCode()))
|
|
|
+ .findFirst()
|
|
|
+ .ifPresent(dto -> {
|
|
|
+ dto.getContractMain().setValidDate(finalLastExpireDate);
|
|
|
+ dto.getContractMain().setExpiryDate(expiryDate);
|
|
|
+ // 与Python get_contract 一致:所有coverage都更新validDate和expiryDate
|
|
|
+ if (dto.getCoverage() != null) {
|
|
|
+ dto.getCoverage().forEach(cov -> {
|
|
|
+ cov.setValidDate(finalLastExpireDate);
|
|
|
+ cov.setExpiryDate(expiryDate);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
private String plusOneDayDateTime(String dateTime) {
|
|
|
@@ -465,42 +520,6 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
return localDateTime.plusDays(1).format(TimeProcessing.DATE_TIME_FORMATTER);
|
|
|
}
|
|
|
|
|
|
- private void adjustPolicyDate(HuaNongCrawlerQuotedPriceRequestRequest request,
|
|
|
- String riskCode, HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract) {
|
|
|
-
|
|
|
- String lastExpireDate = "";
|
|
|
-
|
|
|
- if ("0507".equals(riskCode)) {
|
|
|
- // 交强险:优先使用 ciReinsureEndDate
|
|
|
- lastExpireDate = contract.getPlatFormMessage().getCiReinsureEndDate();
|
|
|
- } else if ("0510".equals(riskCode) || "0515".equals(riskCode)) {
|
|
|
- // 商业险:优先使用 biReinsureEndDate,其次使用 lastPolicyExpireDate
|
|
|
- String biReinsureEndDate = contract.getPlatFormMessage().getBiReinsureEndDate();
|
|
|
- String lastPolicyExpireDate = contract.getPlatFormMessage().getLastPolicyExpireDate();
|
|
|
-
|
|
|
- if (StringUtils.hasText(biReinsureEndDate)) {
|
|
|
- lastExpireDate = biReinsureEndDate;
|
|
|
- } else if (StringUtils.hasText(lastPolicyExpireDate)) {
|
|
|
- lastExpireDate = lastPolicyExpireDate;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (StringUtils.hasText(lastExpireDate)) {
|
|
|
- // 统一日期格式
|
|
|
- lastExpireDate = ensureDateTimeFormat(lastExpireDate);
|
|
|
-
|
|
|
- String finalLastExpireDate = lastExpireDate;
|
|
|
- request.getBusinessData().getContract().stream()
|
|
|
- .filter(dto -> riskCode.equals(dto.getContractMain().getRiskCode()))
|
|
|
- .findFirst()
|
|
|
- .ifPresent(dto -> {
|
|
|
- dto.getContractMain().setValidDate(finalLastExpireDate);
|
|
|
- dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(finalLastExpireDate));
|
|
|
- dto.getCoverage().get(0).setValidDate(finalLastExpireDate);
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
private HuaNongCrawlerQuotedPriceResponse checkAndHandleRemainingDuplicate(HuaNongCrawlerQuotedPriceResponse response, boolean throwException) {
|
|
|
if (response == null || response.getBusinessData() == null ||
|
|
|
response.getBusinessData().getContract() == null) {
|
|
|
@@ -520,7 +539,8 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
boolean stillCiDuplicate = StringUtils.hasText(ciReinsureMsg) &&
|
|
|
(ciReinsureMsg.contains("重复投保") || ciReinsureMsg.contains("终保日期"));
|
|
|
boolean stillBiDuplicate = StringUtils.hasText(biReinsureMsg) &&
|
|
|
- (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期"));
|
|
|
+ (biReinsureMsg.contains("重复投保") || biReinsureMsg.contains("终保日期")
|
|
|
+ || biReinsureMsg.contains("保期:["));
|
|
|
|
|
|
if (stillCiDuplicate) {
|
|
|
if (errorMsg.length() > 0) {
|
|
|
@@ -579,37 +599,6 @@ public class HuaNongCrawlerRequestImpl implements HuaNongCrawlerRequest {
|
|
|
}
|
|
|
|
|
|
|
|
|
- // 处理重复投保
|
|
|
- private HuaNongCrawlerQuotedPriceResponse repeatQuote(HuaNongCrawlerQuotedPriceRequestRequest huaNongCrawlerQuotedPriceRequest, HuaNongCrawlerQuotedPriceResponse.BusinessDataDTO.ContractDTO contract, HttpHeaders httpHeaders) {
|
|
|
- String riskCode = contract.getContractMain().getRiskCode();
|
|
|
- if ("0510".equals(riskCode) || "0515".equals(riskCode)) {
|
|
|
- String lastExpireDate = contract.getPlatFormMessage().getLastPolicyExpireDate();
|
|
|
- if (lastExpireDate != null && !lastExpireDate.trim().isEmpty()) {
|
|
|
- final String finalRiskCode = riskCode;
|
|
|
- huaNongCrawlerQuotedPriceRequest.getBusinessData().getContract().stream()
|
|
|
- .filter(dto -> finalRiskCode.equals(dto.getContractMain().getRiskCode()))
|
|
|
- .findFirst()
|
|
|
- .ifPresent(dto -> {
|
|
|
- dto.getContractMain().setValidDate(lastExpireDate);
|
|
|
- dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(lastExpireDate));
|
|
|
- });
|
|
|
- }
|
|
|
- } else if ("0507".equals(riskCode)) {
|
|
|
- String lastExpireDate = ensureDateTimeFormat(contract.getPlatFormMessage().getCiReinsureEndDate());
|
|
|
- ;
|
|
|
- if (lastExpireDate != null && !lastExpireDate.trim().isEmpty()) {
|
|
|
- huaNongCrawlerQuotedPriceRequest.getBusinessData().getContract().stream()
|
|
|
- .filter(dto -> "0507".equals(dto.getContractMain().getRiskCode()))
|
|
|
- .findFirst()
|
|
|
- .ifPresent(dto -> {
|
|
|
- dto.getContractMain().setValidDate(lastExpireDate);
|
|
|
- dto.getContractMain().setExpiryDate(TimeProcessing.minusOneSecondAfterYear(lastExpireDate));
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- return huaNongCrawlerRequestComponent.quotedPrice(huaNongCrawlerQuotedPriceRequest, httpHeaders);
|
|
|
- }
|
|
|
-
|
|
|
public String ensureDateTimeFormat(String dateStr) {
|
|
|
if (dateStr == null || dateStr.trim().isEmpty()) {
|
|
|
return "";
|