|
|
@@ -2,7 +2,11 @@ package com.jzg.quotation.hengbang.crawler.service.Impl;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
//import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.convert.Convert;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
+import cn.hutool.core.map.MapUtil;
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.crypto.digest.DigestUtil;
|
|
|
import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
import com.jzg.commons.constants.ProductsType;
|
|
|
@@ -35,11 +39,7 @@ import lombok.RequiredArgsConstructor;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
|
|
|
|
|
|
-import java.text.SimpleDateFormat;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
|
|
|
@@ -110,12 +110,22 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
|
|
|
String plyappno = hbCrawlerRequestComponent.quoteImmediately(quoteimmediatelyRequest, headers);
|
|
|
// 5.1 报价第二步,提交报价数据,返回是否重复投保,脱保等提示信息,用于页面展示
|
|
|
HbCrawlerCalculationRequest calculationRequest = new HbCrawlerCalculationRequest(quoteVo, plyappno);
|
|
|
+ // 非车信息匹配核心
|
|
|
+ matchingAccident(quoteVo, headers, plyappno, calculationRequest);
|
|
|
String calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
|
|
|
HbCrawlerProposalResponse proposalResponse = null;
|
|
|
// 脱保情况 重新赋值核心建议起保时间 二次报价
|
|
|
if(calculationResult.contains("脱保")){
|
|
|
calculationRequest.setOutofwarrantytype("N");
|
|
|
calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
|
|
|
+ // 重复投保 重新赋值核心建议起保时间 二次报价
|
|
|
+ } else if(calculationResult.contains("重复投保")){
|
|
|
+ String time = extractDuplicateEndTime(calculationResult);
|
|
|
+ if (time != null) {
|
|
|
+ calculationRequest.setBegintimeCi(time);
|
|
|
+ calculationRequest.setBegintimeBi(time);
|
|
|
+ }
|
|
|
+ calculationResult = hbCrawlerRequestComponent.getCalculationResult(calculationRequest, headers);
|
|
|
}
|
|
|
if(calculationResult.equals("成功")){
|
|
|
// 5.2 报价第三步,获取报价数据
|
|
|
@@ -127,19 +137,53 @@ public class HengBangCrawlerRequestImpl implements HengBangCrawlerRequest {
|
|
|
}
|
|
|
return HbCrawlerQuoteResultVoBuild.build(quoteVo, proposalResponse, calculationResult);
|
|
|
}
|
|
|
- private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
|
|
- private static final Pattern START_TIME_PATTERN = Pattern.compile("起保起期设置为:(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})[.。!;;]?");
|
|
|
|
|
|
/**
|
|
|
- * 提取系统自动分配的起保时间(从提示文本中)
|
|
|
- * @param calculationResult 系统提示文本
|
|
|
- * @return 提取到的时间字符串(如:2025-12-02 11:46:00),未提取到返回 null
|
|
|
+ * 注释
|
|
|
+ * @param quoteVo
|
|
|
+ * @param headers
|
|
|
+ * @param plyappno
|
|
|
+ * @param calculationRequest
|
|
|
+ */
|
|
|
+ private void matchingAccident(final QuoteVo quoteVo, final HttpHeaders headers,
|
|
|
+ final String plyappno, final HbCrawlerCalculationRequest calculationRequest) {
|
|
|
+ if (quoteVo.getAccidentalDrivings() == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ final List<Map<String, Object>> accidentalDrivingList = hbCrawlerRequestComponent.lastAccident(plyappno, headers);
|
|
|
+ // 根据核心返回非车列表 去匹配前端的非车code
|
|
|
+ final Map<String, Object> contentMap = MapUtil.newHashMap();
|
|
|
+ accidentalDrivingList.forEach(e -> {
|
|
|
+ if (ObjectUtil.isNotNull(e.get("programcode"))) {
|
|
|
+ contentMap.put(Convert.toStr(e.get("programcode")).trim(), e);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ List<Object> accidnentList = new ArrayList<>();
|
|
|
+ quoteVo.getAccidentalDrivings().stream()
|
|
|
+ .filter(e -> StrUtil.isNotEmpty(e.getProductCode()))
|
|
|
+ .filter(e -> ObjectUtil.isNull(contentMap.get(e.getProductCode().trim())))
|
|
|
+ .forEach(accidnentList::add);
|
|
|
+ calculationRequest.setAccidentInsuranceList(accidnentList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重复投保提取时间
|
|
|
+ private static final Pattern DUPLICATE_END_TIME_PATTERN = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
|
|
|
+ /**
|
|
|
+ * 提取系统自动分配的起保时间
|
|
|
+ * @param calculationResult 核心提示
|
|
|
+ * @return 提取到的时间字符串,未提取到返回 null
|
|
|
*/
|
|
|
- private String extractSystemAssignedTime(String calculationResult) {
|
|
|
- Matcher matcher = START_TIME_PATTERN.matcher(calculationResult);
|
|
|
- return matcher.find() ? matcher.group(1) : null;
|
|
|
+ private String extractDuplicateEndTime(String calculationResult) {
|
|
|
+ Matcher matcher = DUPLICATE_END_TIME_PATTERN.matcher(calculationResult);
|
|
|
+ if (matcher.find()) {
|
|
|
+ String shortEndTime = matcher.group(1); // 提取到 2025-12-14 16:00
|
|
|
+ return shortEndTime + ":00"; // 补全秒数为 2025-12-14 16:00:00
|
|
|
+ }
|
|
|
+ return null;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
/**
|
|
|
* 提交核保 子订单
|
|
|
* @param underwritingVo
|