|
|
@@ -1,9 +1,14 @@
|
|
|
package com.jzg.quotation.chengtai.api.service.impl;
|
|
|
|
|
|
-import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import cn.hutool.core.collection.CollUtil;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.fasterxml.jackson.annotation.JsonProperty;
|
|
|
+import com.jzg.commons.util.StringUtils;
|
|
|
+import com.jzg.commons.util.http.HttpUtils;
|
|
|
import com.jzg.quotation.chengtai.api.build.ChengTaiAPIQuoteResultsVoBuild;
|
|
|
import com.jzg.quotation.chengtai.api.component.ChengTaiRequestApiComponent;
|
|
|
import com.jzg.quotation.chengtai.api.entity.ChengTaiApiConfigureParameters;
|
|
|
+import com.jzg.quotation.chengtai.api.entity.constants.ResponseCode;
|
|
|
import com.jzg.quotation.chengtai.api.entity.po.ChengTaiApiOrder;
|
|
|
import com.jzg.quotation.chengtai.api.entity.request.*;
|
|
|
import com.jzg.quotation.chengtai.api.entity.response.*;
|
|
|
@@ -18,11 +23,17 @@ import com.jzg.commons.entity.quote.vo.AttributionInformationVo;
|
|
|
import com.jzg.commons.entity.quote.vo.CarInfoVo;
|
|
|
import com.jzg.quotation.commons.filter.CarModelsFilterUtils;
|
|
|
import com.jzg.quotation.commons.standard.conversion.ConfigureParametersConversion;
|
|
|
+import com.jzg.quotation.commons.utils.DateTimeUtil;
|
|
|
+import com.jzg.quotation.commons.utils.HttpUtil;
|
|
|
+import lombok.Data;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.util.List;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.*;
|
|
|
|
|
|
/**
|
|
|
* @description: 诚泰财险 API 计算
|
|
|
@@ -61,15 +72,209 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
|
|
|
InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponent.calculatePremium(insurePremiumRequest,httpHeaders,chengTaiApiProperties.getPartnerCode());
|
|
|
|
|
|
// 处理重复投保
|
|
|
-
|
|
|
+ repeatCoverhandler(insurePremiumRequest, insurePremiumResponse,httpHeaders);
|
|
|
// 处理验车码
|
|
|
-
|
|
|
+ codeRecognitionHandler(insurePremiumRequest, insurePremiumResponse,httpHeaders);
|
|
|
// 处理验车码识别错误
|
|
|
+ this.codeRecognitionErrHandler(insurePremiumRequest, insurePremiumResponse,httpHeaders);
|
|
|
+
|
|
|
chengTaiCrawlerOrderService.saveOrderInfo(quoteVo,insurePremiumResponse);
|
|
|
|
|
|
return ChengTaiAPIQuoteResultsVoBuild.buildQuoteResultsVo(quoteVo, insurePremiumResponse);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 验车码识别错误处理
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ * @param insurePremiumResponse
|
|
|
+ * @param httpHeaders
|
|
|
+ */
|
|
|
+ private void codeRecognitionErrHandler(InsurePremiumRequest insurePremiumRequest,
|
|
|
+ InsurePremiumResponse insurePremiumResponse,
|
|
|
+ HttpHeaders httpHeaders) {
|
|
|
+ InsurePremiumRequest.CiContractDTO ciContractReq = insurePremiumRequest.getCiContract();
|
|
|
+ InsurePremiumRequest.BiContractDTO biContractReq = insurePremiumRequest.getBiContract();
|
|
|
+ if(Objects.nonNull(ciContractReq)){
|
|
|
+ InsurePremiumRequest.CiContractDTO.PlatFormMessageDTO platFormMessageDTO = ciContractReq.getPlatFormMessage();
|
|
|
+ platFormMessageDTO.setAnswer(replacingStrings(platFormMessageDTO.getAnswer()));
|
|
|
+ }
|
|
|
+ if(Objects.nonNull(biContractReq)){
|
|
|
+ InsurePremiumRequest.BiContractDTO.PlatFormMessageDTO platFormMessageDTO = biContractReq.getPlatFormMessage();
|
|
|
+ platFormMessageDTO.setAnswer(replacingStrings(platFormMessageDTO.getAnswer()));
|
|
|
+ }
|
|
|
+ insurePremiumResponse = chengTaiRequestApiComponent.calculatePremium(insurePremiumRequest,httpHeaders,chengTaiApiProperties.getPartnerCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ public static String replacingStrings(String code) {
|
|
|
+ if (StringUtils.isEmpty(code)) {
|
|
|
+ return code;
|
|
|
+ }
|
|
|
+ if (code.length() > 4) {
|
|
|
+ return code.substring(code.length() - 4);
|
|
|
+ }
|
|
|
+ return code
|
|
|
+ .replace("3", "j")
|
|
|
+ .replace("0", "o");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理验车码
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ * @param insurePremiumResponse
|
|
|
+ * @param httpHeaders
|
|
|
+ */
|
|
|
+ private void codeRecognitionHandler(InsurePremiumRequest insurePremiumRequest,
|
|
|
+ InsurePremiumResponse insurePremiumResponse,
|
|
|
+ HttpHeaders httpHeaders) {
|
|
|
+ InsurePremiumResponse.BiContractDTO biContract = insurePremiumResponse.getBiContract();
|
|
|
+ InsurePremiumResponse.CiContractDTO ciContract = insurePremiumResponse.getCiContract();
|
|
|
+
|
|
|
+ Boolean biBoo = false;
|
|
|
+ Boolean ciBoo = false;
|
|
|
+ if(Objects.nonNull(biContract)){
|
|
|
+ Double biTotalPremium = biContract.getContractMain().getTotalPremium();
|
|
|
+ if(Objects.isNull(biTotalPremium)){
|
|
|
+ biBoo = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(Objects.nonNull(ciContract)){
|
|
|
+ Double ciTotalPremium = ciContract.getContractMain().getTotalPremium();
|
|
|
+ if(Objects.isNull(ciTotalPremium)){
|
|
|
+ ciBoo = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (biBoo || ciBoo) {
|
|
|
+ this.platRepetition(insurePremiumResponse,insurePremiumRequest);
|
|
|
+ insurePremiumResponse = chengTaiRequestApiComponent.calculatePremium(insurePremiumRequest,httpHeaders,chengTaiApiProperties.getPartnerCode());
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转保车处理
|
|
|
+ * @param response
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ */
|
|
|
+ private void platRepetition(InsurePremiumResponse response, InsurePremiumRequest insurePremiumRequest) {
|
|
|
+ String jqImageStr = null;
|
|
|
+ String syImageStr = null;
|
|
|
+ insurePremiumRequest.setOrderId(response.getOrderId());
|
|
|
+ InsurePremiumResponse.CiContractDTO ciContract = response.getCiContract();
|
|
|
+ InsurePremiumResponse.BiContractDTO biContract = response.getBiContract();
|
|
|
+ //交强险
|
|
|
+ if (Objects.nonNull(ciContract)) {
|
|
|
+ jqImageStr = ciContract.getPlatFormMessage().getQuestion();
|
|
|
+ }
|
|
|
+ //商业险
|
|
|
+ if (Objects.nonNull(biContract)) {
|
|
|
+ syImageStr = biContract.getPlatFormMessage().getQuestion();
|
|
|
+ }
|
|
|
+ Map<String, String> bodyMap = new HashMap<>();
|
|
|
+ bodyMap.put("jqImage", StringUtils.toString(jqImageStr, ""));
|
|
|
+ bodyMap.put("syImage", StringUtils.toString(syImageStr, ""));
|
|
|
+ String sendBody = JSON.toJSONString(bodyMap);
|
|
|
+ String ocrStr = HttpUtils.sendPost("http://39.98.41.104:8088/getres", sendBody);
|
|
|
+ CheckCodeResp resp = JSON.parseObject(ocrStr).toJavaObject(CheckCodeResp.class);
|
|
|
+
|
|
|
+ if(Objects.nonNull(ciContract)){
|
|
|
+ InsurePremiumRequest.CiContractDTO ciContractReq = insurePremiumRequest.getCiContract();
|
|
|
+ InsurePremiumRequest.CiContractDTO.PlatFormMessageDTO platFormMessage = ciContractReq.getPlatFormMessage();
|
|
|
+ if(Objects.isNull(platFormMessage)){
|
|
|
+ platFormMessage = new InsurePremiumRequest.CiContractDTO.PlatFormMessageDTO();
|
|
|
+ }
|
|
|
+ BeanUtils.copyProperties(ciContract.getPlatFormMessage(), platFormMessage);
|
|
|
+ platFormMessage.setAnswer(resp.jqImageCode);
|
|
|
+ ciContractReq.setPlatFormMessage(platFormMessage);
|
|
|
+ insurePremiumRequest.setCiContract(ciContractReq);
|
|
|
+ }
|
|
|
+ if(Objects.nonNull(biContract)){
|
|
|
+ InsurePremiumRequest.BiContractDTO biContractReq = insurePremiumRequest.getBiContract();
|
|
|
+ InsurePremiumRequest.BiContractDTO.PlatFormMessageDTO platFormMessage = biContractReq.getPlatFormMessage();
|
|
|
+ if(Objects.isNull(platFormMessage)){
|
|
|
+ platFormMessage = new InsurePremiumRequest.BiContractDTO.PlatFormMessageDTO();
|
|
|
+ }
|
|
|
+ BeanUtils.copyProperties(biContract.getPlatFormMessage(), platFormMessage);
|
|
|
+ platFormMessage.setAnswer(resp.syImageCode);
|
|
|
+ biContractReq.setPlatFormMessage(platFormMessage);
|
|
|
+ insurePremiumRequest.setBiContract(biContractReq);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理重复投保
|
|
|
+ *
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ * @param insurePremiumResponse
|
|
|
+ * @param httpHeaders
|
|
|
+ */
|
|
|
+ private void repeatCoverhandler(InsurePremiumRequest insurePremiumRequest,
|
|
|
+ InsurePremiumResponse insurePremiumResponse,
|
|
|
+ HttpHeaders httpHeaders) {
|
|
|
+ if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode()) && insurePremiumResponse.getMessage().contains("重复投保")){
|
|
|
+ String err = insurePremiumResponse.getMessage();
|
|
|
+ List<String> errList = Arrays.asList(err.split("。"));
|
|
|
+ if(CollUtil.isEmpty(errList)){ return; }
|
|
|
+ errList.stream().forEach(a ->{
|
|
|
+ if (a.contains("交强险平台") && a.contains("重复投保")){
|
|
|
+ InsurePremiumRequest.CiContractDTO ciContract = insurePremiumRequest.getCiContract();
|
|
|
+ InsurePremiumRequest.CiContractDTO.ContractMainDTO contractMain = ciContract.getContractMain();
|
|
|
+ Map<String, String> timeMap = this.timeHandler(a, contractMain.getExpiryDate());
|
|
|
+ contractMain.setValidDate(timeMap.get("startTime"));
|
|
|
+ contractMain.setExpiryDate(timeMap.get("endTime"));
|
|
|
+ ciContract.setContractMain(contractMain);
|
|
|
+ insurePremiumRequest.setCiContract(ciContract);
|
|
|
+ }
|
|
|
+ if (a.contains("商业险险平台") && a.contains("重复投保")){
|
|
|
+ InsurePremiumRequest.BiContractDTO biContract = insurePremiumRequest.getBiContract();
|
|
|
+ InsurePremiumRequest.BiContractDTO.ContractMainDTO contractMain = biContract.getContractMain();
|
|
|
+ Map<String, String> timeMap = this.timeHandler(a, contractMain.getExpiryDate());
|
|
|
+ contractMain.setValidDate(timeMap.get("startTime"));
|
|
|
+ contractMain.setExpiryDate(timeMap.get("endTime"));
|
|
|
+ biContract.setContractMain(contractMain);
|
|
|
+ insurePremiumRequest.setBiContract(biContract);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ insurePremiumResponse = chengTaiRequestApiComponent.calculatePremium(insurePremiumRequest,httpHeaders,chengTaiApiProperties.getPartnerCode());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 重复投保时间处理再报价
|
|
|
+ * @param errStr
|
|
|
+ * @param expiryDate
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private Map<String, String> timeHandler(String errStr, String expiryDate) {
|
|
|
+ // 定义时间格式
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
|
|
+ LocalDateTime dateTime = null;
|
|
|
+ if(errStr.contains("终保日期")){
|
|
|
+ String startTime = errStr.substring(errStr.indexOf("终保日期")+5,errStr.indexOf("终保日期")+21);
|
|
|
+ // 解析原始时间
|
|
|
+ dateTime = LocalDateTime.parse(startTime, formatter1);
|
|
|
+ }else{
|
|
|
+ String startTime = expiryDate;
|
|
|
+ // 解析原始时间
|
|
|
+ dateTime = LocalDateTime.parse(startTime, formatter);
|
|
|
+ }
|
|
|
+ LocalDateTime tomorrowMidnight = dateTime;
|
|
|
+ //判断是否是整点 如果是整点则不进行明天的零点操作
|
|
|
+ if(dateTime.getHour() != 0 || dateTime.getMinute() != 0 || dateTime.getSecond() != 0)
|
|
|
+ {
|
|
|
+ tomorrowMidnight = dateTime.toLocalDate().plusDays(1).atStartOfDay();
|
|
|
+ }
|
|
|
+ LocalDateTime end = tomorrowMidnight.plusYears(1L);
|
|
|
+ String startTime = DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN);
|
|
|
+ LocalDateTime localDateTime = end.minusSeconds(1L);
|
|
|
+ String endTime = DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN);
|
|
|
+ Map<String, String> timeMap = new HashMap<String, String>();
|
|
|
+ timeMap.put("startTime", startTime);
|
|
|
+ timeMap.put("endTime", endTime);
|
|
|
+ return timeMap;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public UnderwritingResultsVo underwriting(UnderwritingVo underwritingVo) {
|
|
|
OrderBase orderBase = underwritingVo.getOrder();
|
|
|
@@ -127,4 +332,15 @@ public class ChengTaiApiRequestImpl implements ChengTaiApiRequest {
|
|
|
public void queryOrderState(OrderBase orderBase) {
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ @Data
|
|
|
+ static class CheckCodeResp {
|
|
|
+
|
|
|
+ @JsonProperty(value = "jqImageCode")
|
|
|
+ String jqImageCode;
|
|
|
+
|
|
|
+ @JsonProperty(value = "syImageCode")
|
|
|
+ String syImageCode;
|
|
|
+
|
|
|
+ }
|
|
|
}
|