|
@@ -110,6 +110,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
|
|
|
private static final Pattern LIMIT_AMOUNT = Pattern.compile("value=\"(.*?)\" id=\"js_actualvalue\"");
|
|
private static final Pattern LIMIT_AMOUNT = Pattern.compile("value=\"(.*?)\" id=\"js_actualvalue\"");
|
|
|
private static final Pattern TRANSFER_FLAG = Pattern.compile("\"erroeType\":\"(.*?)\"");
|
|
private static final Pattern TRANSFER_FLAG = Pattern.compile("\"erroeType\":\"(.*?)\"");
|
|
|
private static final Pattern PAT_END_DATE = Pattern.compile("终保日期\\s*([^;]+)");
|
|
private static final Pattern PAT_END_DATE = Pattern.compile("终保日期\\s*([^;]+)");
|
|
|
|
|
+ private static final Pattern PAT_END_DATE2 = Pattern.compile("终保日期:\\s*([^;]+)");
|
|
|
private static final Pattern RESPONSE_ERR = Pattern.compile("(\"infoName\"\\s*:\\s*\"([^\"]*)\",\\s*\"infomsg\"\\s*:\\s*\"([^\"]*)\"|\"erroeInfo\"\\s*:\\s*\"([^\"]*)\")",Pattern.DOTALL);
|
|
private static final Pattern RESPONSE_ERR = Pattern.compile("(\"infoName\"\\s*:\\s*\"([^\"]*)\",\\s*\"infomsg\"\\s*:\\s*\"([^\"]*)\"|\"erroeInfo\"\\s*:\\s*\"([^\"]*)\")",Pattern.DOTALL);
|
|
|
|
|
|
|
|
private static final Set<String> SPECIAL_USERS = Set.of(
|
|
private static final Set<String> SPECIAL_USERS = Set.of(
|
|
@@ -250,7 +251,7 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
|
|
|
//带重试的获取报价编号、车型型号
|
|
//带重试的获取报价编号、车型型号
|
|
|
Map<String, Object> xbResult = retry(() -> {
|
|
Map<String, Object> xbResult = retry(() -> {
|
|
|
try { return xbQuery(dto.getUsername(), cookie, car); }
|
|
try { return xbQuery(dto.getUsername(), cookie, car); }
|
|
|
- catch (Exception e) { refreshLogin(dto); throw new SystemException(e.getMessage()); }
|
|
|
|
|
|
|
+ catch (Exception e) { refreshLogin(dto); throw new Exception(e); }
|
|
|
}, MAX_RETRIES, RETRY_DELAY_MS, "预报价获取登录信息");
|
|
}, MAX_RETRIES, RETRY_DELAY_MS, "预报价获取登录信息");
|
|
|
|
|
|
|
|
String quotationNo = str(xbResult, "quotationNo");
|
|
String quotationNo = str(xbResult, "quotationNo");
|
|
@@ -631,14 +632,14 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
|
|
|
|
|
|
|
|
private HtCrawlerQuoteResponse.DataDTO resolveQuoteResponse(DuplQuoteResult duplQuoteResult, String decryptData, String mealid, String limitAmount,
|
|
private HtCrawlerQuoteResponse.DataDTO resolveQuoteResponse(DuplQuoteResult duplQuoteResult, String decryptData, String mealid, String limitAmount,
|
|
|
HttpHeaders h, String personalInsuredJSON) {
|
|
HttpHeaders h, String personalInsuredJSON) {
|
|
|
|
|
+ log.info("报价结果: {}", decryptData);
|
|
|
log.info("报价结果: {}", convertResponseMsg(decryptData));
|
|
log.info("报价结果: {}", convertResponseMsg(decryptData));
|
|
|
if (decryptData.contains("未传送车辆过户标志")) {
|
|
if (decryptData.contains("未传送车辆过户标志")) {
|
|
|
log.error("报价失败: {}", convertResponseMsg(decryptData));
|
|
log.error("报价失败: {}", convertResponseMsg(decryptData));
|
|
|
throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData)+(decryptData.contains("1251BI") ? ",请勾选'商业险是否过户'选项" : ""));
|
|
throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData)+(decryptData.contains("1251BI") ? ",请勾选'商业险是否过户'选项" : ""));
|
|
|
}
|
|
}
|
|
|
- if (!decryptData.contains("录入的校验码有误") && decryptData.contains("erroeInfo") && !duplQuoteResult.dupl()) {
|
|
|
|
|
- log.error("报价失败: {}", convertResponseMsg(decryptData));
|
|
|
|
|
- throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData));
|
|
|
|
|
|
|
+ if (decryptData.contains("errrorFlag") && decryptData.contains("carChange")) {
|
|
|
|
|
+ throw new SystemException(decryptData);
|
|
|
}
|
|
}
|
|
|
//车损险保额过高 limitAmount
|
|
//车损险保额过高 limitAmount
|
|
|
if (decryptData.contains("车损险保额不能高于")) {
|
|
if (decryptData.contains("车损险保额不能高于")) {
|
|
@@ -648,20 +649,13 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
|
|
|
decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount, "", personalInsuredJSON), h);
|
|
decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount, "", personalInsuredJSON), h);
|
|
|
return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
|
|
return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
|
|
|
}
|
|
}
|
|
|
- if (decryptData.contains("传送了车辆过户标志,请确认")) {
|
|
|
|
|
- Pattern pattern = Pattern.compile(TRANSFER_FLAG.pattern());
|
|
|
|
|
- Matcher matcher = pattern.matcher(decryptData);
|
|
|
|
|
- String transferFlag = "";
|
|
|
|
|
- if (matcher.find()) transferFlag = matcher.group(1);
|
|
|
|
|
- decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount+","+transferFlag, "", personalInsuredJSON), h);
|
|
|
|
|
- return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
|
|
|
|
|
- }
|
|
|
|
|
if (decryptData.contains("TRANS_MESSAGE") && decryptData.contains("终保日期")) {
|
|
if (decryptData.contains("TRANS_MESSAGE") && decryptData.contains("终保日期")) {
|
|
|
Map<String, String> map = JSONObject.parseObject(decryptData, Map.class);
|
|
Map<String, String> map = JSONObject.parseObject(decryptData, Map.class);
|
|
|
if (map.containsKey("TRANS_MESSAGE") && map.get("TRANS_MESSAGE").contains("交强")) {
|
|
if (map.containsKey("TRANS_MESSAGE") && map.get("TRANS_MESSAGE").contains("交强")) {
|
|
|
- Matcher m = PAT_END_DATE.matcher(decryptData);
|
|
|
|
|
- if (!m.find()) {
|
|
|
|
|
|
|
+ Matcher m = PAT_END_DATE2.matcher(decryptData);
|
|
|
|
|
+ if (m.find()) {
|
|
|
String jiaoqiang_startDate = m.group(1);
|
|
String jiaoqiang_startDate = m.group(1);
|
|
|
|
|
+ log.info("报价响应结果CI,终保日期{}", jiaoqiang_startDate);
|
|
|
duplQuoteResult.q().getCiRiskInfoVo().setStartDate(jiaoqiang_startDate + ":00");
|
|
duplQuoteResult.q().getCiRiskInfoVo().setStartDate(jiaoqiang_startDate + ":00");
|
|
|
LocalDateTime dt = LocalDateTime.parse(jiaoqiang_startDate.replace(" ", "T"), DateTimeFormatter.ofPattern(DATE_FMT_T));
|
|
LocalDateTime dt = LocalDateTime.parse(jiaoqiang_startDate.replace(" ", "T"), DateTimeFormatter.ofPattern(DATE_FMT_T));
|
|
|
String newEnd = dt.plusYears(1).format(DateTimeFormatter.ofPattern(DATE_FMT));
|
|
String newEnd = dt.plusYears(1).format(DateTimeFormatter.ofPattern(DATE_FMT));
|
|
@@ -671,20 +665,36 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
if (map.containsKey("TRANS_MESSAGE") && map.get("TRANS_MESSAGE").contains("商业")) {
|
|
if (map.containsKey("TRANS_MESSAGE") && map.get("TRANS_MESSAGE").contains("商业")) {
|
|
|
- Matcher m = PAT_END_DATE.matcher(decryptData);
|
|
|
|
|
- if (!m.find()) {
|
|
|
|
|
|
|
+ Matcher m = PAT_END_DATE2.matcher(decryptData);
|
|
|
|
|
+ if (m.find()) {
|
|
|
String chesun_startDate = m.group(1);
|
|
String chesun_startDate = m.group(1);
|
|
|
|
|
+ log.info("报价响应结果BI,终保日期{}", chesun_startDate);
|
|
|
duplQuoteResult.q().getBiRiskInfoVo().setStartDate(chesun_startDate);
|
|
duplQuoteResult.q().getBiRiskInfoVo().setStartDate(chesun_startDate);
|
|
|
|
|
+ duplQuoteResult.q().getCiRiskInfoVo().setStartDate(chesun_startDate);
|
|
|
LocalDateTime dt = LocalDateTime.parse(chesun_startDate.replace(" ", "T"), DateTimeFormatter.ofPattern(DATE_FMT_T));
|
|
LocalDateTime dt = LocalDateTime.parse(chesun_startDate.replace(" ", "T"), DateTimeFormatter.ofPattern(DATE_FMT_T));
|
|
|
String newEnd = dt.plusYears(1).format(DateTimeFormatter.ofPattern(DATE_FMT));
|
|
String newEnd = dt.plusYears(1).format(DateTimeFormatter.ofPattern(DATE_FMT));
|
|
|
duplQuoteResult.q().getBiRiskInfoVo().setEndDate(newEnd);
|
|
duplQuoteResult.q().getBiRiskInfoVo().setEndDate(newEnd);
|
|
|
|
|
+ duplQuoteResult.q().getCiRiskInfoVo().setEndDate(newEnd);
|
|
|
decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount, "", personalInsuredJSON), h);
|
|
decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount, "", personalInsuredJSON), h);
|
|
|
return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
|
|
return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- if (decryptData.contains("errrorFlag") && decryptData.contains("carChange")) {
|
|
|
|
|
- throw new SystemException(decryptData);
|
|
|
|
|
|
|
+ if (decryptData.contains("传送了车辆过户标志,请确认")) {
|
|
|
|
|
+ //HtCrawlerQuoteResponse.DataDTO dataDTO = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
|
|
|
|
|
+ //List<HtCrawlerQuoteResponse.DataDTO.BasePartDTOListDTO.BasePartDTO> basePartDTO =
|
|
|
|
|
+ // dataDTO.getBasepartdtolist() != null ? dataDTO.getBasepartdtolist().getBasepartdto() : null;
|
|
|
|
|
+ //String basePartJSON = buildBasePartJSON(basePartDTO==null?new ArrayList<>():basePartDTO);
|
|
|
|
|
+ Pattern pattern = Pattern.compile(TRANSFER_FLAG.pattern());
|
|
|
|
|
+ Matcher matcher = pattern.matcher(decryptData);
|
|
|
|
|
+ String transferFlag = "";
|
|
|
|
|
+ if (matcher.find()) transferFlag = matcher.group(1);
|
|
|
|
|
+ decryptData = req.quote(new HtCrawlerQuoteRequest(duplQuoteResult.q(), mealid, limitAmount+","+transferFlag, "", personalInsuredJSON), h);
|
|
|
|
|
+ return resolveQuoteResponse(duplQuoteResult, decryptData, mealid, limitAmount, h, personalInsuredJSON);
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!decryptData.contains("录入的校验码有误") && decryptData.contains("erroeInfo") && !duplQuoteResult.dupl()) {
|
|
|
|
|
+ log.error("报价失败: {}", convertResponseMsg(decryptData));
|
|
|
|
|
+ throw new SystemException(ERR_PREFIX + convertResponseMsg(decryptData));
|
|
|
}
|
|
}
|
|
|
HtCrawlerQuoteResponse.DataDTO data = null;
|
|
HtCrawlerQuoteResponse.DataDTO data = null;
|
|
|
data = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
|
|
data = JSONObject.parseObject(decryptData, HtCrawlerQuoteResponse.DataDTO.class);
|
|
@@ -782,23 +792,27 @@ public class HuaTaiCrawlerRequestImpl implements HuaTaiCrawlerRequest {
|
|
|
vo.getOrder().setQuoteNo(order.getQuotationRelaNo());
|
|
vo.getOrder().setQuoteNo(order.getQuotationRelaNo());
|
|
|
|
|
|
|
|
HtCrawlerSubmitRequest submit = new HtCrawlerSubmitRequest(vo, params, order.getCiCategory(), order.getBiCategory());
|
|
HtCrawlerSubmitRequest submit = new HtCrawlerSubmitRequest(vo, params, order.getCiCategory(), order.getBiCategory());
|
|
|
|
|
+ log.info("提交核保参数: {}", JSONObject.toJSONString(submit));
|
|
|
String res = req.submit2(submit, req.getHeaders());
|
|
String res = req.submit2(submit, req.getHeaders());
|
|
|
log.info("提交核保结果: {}", res);
|
|
log.info("提交核保结果: {}", res);
|
|
|
|
|
|
|
|
|
|
+ if(res.contains("<html>")) throw new SystemException("核保失败, 服务器繁忙, 请稍后重试");
|
|
|
|
|
+
|
|
|
|
|
+ if (res.contains("起保时间不正确")) {
|
|
|
|
|
+ throw new SystemException("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
try {
|
|
try {
|
|
|
map = MAPPER.readValue(res, Map.class);
|
|
map = MAPPER.readValue(res, Map.class);
|
|
|
} catch (JsonProcessingException e) {
|
|
} catch (JsonProcessingException e) {
|
|
|
- throw new SystemException("核保失败,未知异常, {}", convertResponseMsg(res));
|
|
|
|
|
|
|
+ throw new SystemException("核保失败, {}", convertResponseMsg(res));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (!"1,2,3,4".contains(order.getCiCategory()) || "Y".equals(str(map, "isOver"))
|
|
|
|
|
- || "重新计算保费".equals(str(map, "MSG")) || res.contains("下发修改意见") || res.contains("转人工意见")) {
|
|
|
|
|
|
|
+ if (!"1,2,3,4".contains(order.getCiCategory()) || "Y".equals(str(map, "isOver")) || "Y".equals(str(map, "isOver1"))
|
|
|
|
|
+ || "重新计算保费".equals(str(map, "MSG")) || (res.contains("下发修改意见") && !res.contains("isPassHB")) || res.contains("转人工意见")) {
|
|
|
throw new SystemException("核保失败-------" + convertResponseMsg(res));
|
|
throw new SystemException("核保失败-------" + convertResponseMsg(res));
|
|
|
}
|
|
}
|
|
|
- if (res.contains("起保时间不正确")) {
|
|
|
|
|
- throw new SystemException("起保时间不正确-------即时起保分钟数必须为00/15/30/45\n请重新选择起保时间!");
|
|
|
|
|
- }
|
|
|
|
|
if (res.contains("转人工")) return handleManualUnderwriting(order, params);
|
|
if (res.contains("转人工")) return handleManualUnderwriting(order, params);
|
|
|
if (res.contains("已通过核保未实收") || "Y".equals(str(map, "isPassHB"))) return handlePassedUnderwriting(order, params, vo);
|
|
if (res.contains("已通过核保未实收") || "Y".equals(str(map, "isPassHB"))) return handlePassedUnderwriting(order, params, vo);
|
|
|
|
|
|