|
|
@@ -1,11 +1,13 @@
|
|
|
package com.ydtech.modules.order.service.impl;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONArray;
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
+import com.fasterxml.jackson.annotation.JsonProperty;
|
|
|
import com.ydtech.constants.enums.InsuranceOrderPdf;
|
|
|
import com.ydtech.constants.enums.InsuranceRisk;
|
|
|
import com.ydtech.constants.enums.dict.InsOrderStatusEnum;
|
|
|
@@ -16,7 +18,9 @@ import com.ydtech.modules.admin.service.SysAreaService;
|
|
|
import com.ydtech.modules.ins.model.vo.*;
|
|
|
import com.ydtech.modules.order.components.ConfigureParametersComponents;
|
|
|
import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
|
|
|
+import com.ydtech.modules.order.components.VerificationCodeIdentification;
|
|
|
import com.ydtech.modules.order.components.chengtai.ChengTaiRequestApiComponents;
|
|
|
+import com.ydtech.modules.order.components.gouren.GuorenDuplicateInsuranceComponent;
|
|
|
import com.ydtech.modules.order.constants.UnderwritingStatus;
|
|
|
import com.ydtech.modules.order.entity.*;
|
|
|
import com.ydtech.modules.order.entity.api.chengtai.constants.CtKindCodeEnum;
|
|
|
@@ -25,7 +29,10 @@ import com.ydtech.modules.order.entity.api.chengtai.constants.ResponseCode;
|
|
|
import com.ydtech.modules.order.entity.api.chengtai.constants.RiskCodeEnum;
|
|
|
import com.ydtech.modules.order.entity.api.chengtai.request.*;
|
|
|
import com.ydtech.modules.order.entity.api.chengtai.response.*;
|
|
|
+import com.ydtech.modules.order.entity.api.zijin.request.CalculatePremiumRequest;
|
|
|
import com.ydtech.modules.order.entity.config.ChengTaiConfigureParameters;
|
|
|
+import com.ydtech.modules.order.entity.crawler.request.RecognitionRequest;
|
|
|
+import com.ydtech.modules.order.entity.crawler.response.RecognitionResponse;
|
|
|
import com.ydtech.modules.order.entity.dto.ReadPdfUrlListDto;
|
|
|
import com.ydtech.modules.order.entity.filter.CarModelsFilterUtils;
|
|
|
import com.ydtech.modules.order.entity.po.InsTaskImagesBase64;
|
|
|
@@ -35,15 +42,15 @@ import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
|
|
|
import com.ydtech.modules.order.service.*;
|
|
|
import com.ydtech.modules.protocol.entity.po.PtlAgreementAttribution;
|
|
|
import com.ydtech.modules.protocol.service.PtlAgreementAttributionService;
|
|
|
-import com.ydtech.utils.CalculateUtils;
|
|
|
-import com.ydtech.utils.StringUtils;
|
|
|
+import com.ydtech.utils.*;
|
|
|
import com.ydtech.utils.baidu.FileUtil;
|
|
|
+import lombok.Data;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.http.HttpHeaders;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import java.math.BigDecimal;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.util.*;
|
|
|
@@ -116,8 +123,10 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
/** 4. 报价 */
|
|
|
PersonAreaVo personAreaVo = new PersonAreaVo();
|
|
|
buildRegion(quoteInfoVo,personAreaVo);
|
|
|
- InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,personAreaVo,parameters,quoteVo, carModelListDTO);
|
|
|
- InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
|
|
|
+ InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,personAreaVo,parameters,quoteVo);
|
|
|
+
|
|
|
+ // 重复报价
|
|
|
+ InsurePremiumResponse insurePremiumResponse = this.getResponse(insurePremiumRequest, httpHeaders);
|
|
|
|
|
|
String message = "";
|
|
|
if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode())){
|
|
|
@@ -153,6 +162,199 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
return responseOrder(insurePremiumResponse, quoteRespVo, ptlAgreementAttribution, insurePremiumResponse.getOrderId());
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 重复报价
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ * @param httpHeaders
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private InsurePremiumResponse getResponse(InsurePremiumRequest insurePremiumRequest, HttpHeaders httpHeaders) throws Exception {
|
|
|
+ InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
|
|
|
+ if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode()) && insurePremiumResponse.getMessage().contains("重复投保")){
|
|
|
+ // 交强险 商业险 重复投保处理
|
|
|
+ this.repetitionInsure(insurePremiumResponse,insurePremiumRequest);
|
|
|
+ insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 转保车处理
|
|
|
+ InsurePremiumResponse.BiContractDTO biContract = insurePremiumResponse.getBiContract();
|
|
|
+ InsurePremiumResponse.CiContractDTO ciContract = insurePremiumResponse.getCiContract();
|
|
|
+ Double biTotalPremium = null;
|
|
|
+ Double ciTotalPremium = null;
|
|
|
+ Boolean biBoo = false;
|
|
|
+ Boolean ciBoo = false;
|
|
|
+ if(Objects.nonNull(biContract)){
|
|
|
+ biTotalPremium = biContract.getContractMain().getTotalPremium();
|
|
|
+ if(Objects.isNull(biTotalPremium)){
|
|
|
+ biBoo = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(Objects.nonNull(ciContract)){
|
|
|
+ ciTotalPremium = ciContract.getContractMain().getTotalPremium();
|
|
|
+ if(Objects.isNull(ciTotalPremium)){
|
|
|
+ ciBoo = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (biBoo || ciBoo) {
|
|
|
+ this.platRepetition(biContract,ciContract,insurePremiumRequest);
|
|
|
+ insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode()) && insurePremiumResponse.getMessage().contains("录入的校验码有误")){
|
|
|
+ this.replaceByte(insurePremiumRequest);
|
|
|
+ insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
|
|
|
+ }
|
|
|
+ return insurePremiumResponse;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 错误字符替换
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ */
|
|
|
+ private void replaceByte(InsurePremiumRequest insurePremiumRequest) {
|
|
|
+ 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()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ 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 biContract
|
|
|
+ * @param ciContract
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ */
|
|
|
+ private void platRepetition(InsurePremiumResponse.BiContractDTO biContract, InsurePremiumResponse.CiContractDTO ciContract, InsurePremiumRequest insurePremiumRequest) {
|
|
|
+ String jqImageStr = null;
|
|
|
+ String syImageStr = null;
|
|
|
+
|
|
|
+ //交强险
|
|
|
+ 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", com.ydtech.utils.StringUtils.toString(jqImageStr, ""));
|
|
|
+ bodyMap.put("syImage", com.ydtech.utils.StringUtils.toString(syImageStr, ""));
|
|
|
+ String sendBody = JsonUtils.toJson(bodyMap);
|
|
|
+ String ocrStr = HttpUtil.sendPost("http://39.98.41.104:8088/getres", sendBody);
|
|
|
+ CheckCodeResp resp = JSONUtil.toBean(ocrStr, 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 insurePremiumResponse
|
|
|
+ * @param insurePremiumRequest
|
|
|
+ */
|
|
|
+ private void repetitionInsure(InsurePremiumResponse insurePremiumResponse, InsurePremiumRequest insurePremiumRequest) {
|
|
|
+ String err = insurePremiumResponse.getMessage();
|
|
|
+ List<String> errList = Arrays.asList(err.split("。"));
|
|
|
+ if(CollUtil.isEmpty(errList)){ return; }
|
|
|
+
|
|
|
+ // 定义时间格式
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+ DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
|
|
|
+ errList.stream().forEach(a ->{
|
|
|
+ if (a.contains("交强险平台") && a.contains("重复投保")){
|
|
|
+ InsurePremiumRequest.CiContractDTO ciContract = insurePremiumRequest.getCiContract();
|
|
|
+ InsurePremiumRequest.CiContractDTO.ContractMainDTO contractMain = ciContract.getContractMain();
|
|
|
+
|
|
|
+ LocalDateTime dateTime = null;
|
|
|
+ if(a.contains("终保日期")){
|
|
|
+ String startTime = a.substring(a.indexOf("终保日期")+5,a.indexOf("终保日期")+21);
|
|
|
+ // 解析原始时间
|
|
|
+ dateTime = LocalDateTime.parse(startTime, formatter1);
|
|
|
+ }else{
|
|
|
+ String startTime = contractMain.getExpiryDate();
|
|
|
+ // 解析原始时间
|
|
|
+ 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);
|
|
|
+ contractMain.setValidDate(DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN));
|
|
|
+ LocalDateTime localDateTime = end.minusSeconds(1L);
|
|
|
+ contractMain.setExpiryDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
|
|
|
+ ciContract.setContractMain(contractMain);
|
|
|
+ insurePremiumRequest.setCiContract(ciContract);
|
|
|
+ }
|
|
|
+ if (a.contains("商业险险平台") && a.contains("重复投保")){
|
|
|
+ InsurePremiumRequest.BiContractDTO biContract = insurePremiumRequest.getBiContract();
|
|
|
+ InsurePremiumRequest.BiContractDTO.ContractMainDTO contractMain = biContract.getContractMain();
|
|
|
+ LocalDateTime dateTime = null;
|
|
|
+ if(a.contains("终保日期")){
|
|
|
+ String startTime = a.substring(a.indexOf("终保日期")+5,a.indexOf("终保日期")+21);
|
|
|
+ // 解析原始时间
|
|
|
+ dateTime = LocalDateTime.parse(startTime, formatter1);
|
|
|
+ }else{
|
|
|
+ String startTime = contractMain.getExpiryDate();
|
|
|
+ // 解析原始时间
|
|
|
+ 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);
|
|
|
+ contractMain.setValidDate(DateTimeUtil.format(tomorrowMidnight, DateTimeUtil.DATETIME_PATTERN));
|
|
|
+ LocalDateTime localDateTime = end.minusSeconds(1L);
|
|
|
+ contractMain.setExpiryDate(DateTimeUtil.format(localDateTime, DateTimeUtil.DATETIME_PATTERN));
|
|
|
+ biContract.setContractMain(contractMain);
|
|
|
+ insurePremiumRequest.setBiContract(biContract);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
private HttpResult<QuoteRespVo> responseOrder(InsurePremiumResponse insurePremiumResponse, QuoteRespVo quoteRespVo, PtlAgreementAttribution ptlAgreementAttribution, String orderId) {
|
|
|
// 保存订单信息
|
|
|
InsAreaCompany insAreaCompany = new InsAreaCompany(quoteRespVo, ptlAgreementAttribution);
|
|
|
@@ -176,7 +378,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
List<InsAreaCompanyAccidentalDriving> insAreaCompanyAccidentalDrivings = new ArrayList<>();
|
|
|
accident.forEach(accidentalDriving -> {
|
|
|
InsAreaCompanyAccidentalDriving insAreaCompanyAccidentalDriving = new InsAreaCompanyAccidentalDriving();
|
|
|
- insAreaCompanyAccidentalDriving.setCompanyId(insAreaCompany.getCompanyId());
|
|
|
+ insAreaCompanyAccidentalDriving.setCompanyId(insAreaCompany.getId());
|
|
|
insAreaCompanyAccidentalDriving.setQuantity(Integer.parseInt(accidentalDriving.getQuantity()));
|
|
|
insAreaCompanyAccidentalDriving.setRideRiskCode(accidentalDriving.getProjectCode());
|
|
|
insAreaCompanyAccidentalDriving.setRideRiskName(accidentalDriving.getProjectName());
|
|
|
@@ -185,7 +387,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
insAreaCompanyService.insertCompanyAndOrders(insAreaCompany, insAreaCompanyAccidentalDrivings);
|
|
|
// 保存交强特约信息
|
|
|
InsAreaCompanyRelatedInfo info = new InsAreaCompanyRelatedInfo();
|
|
|
- info.setCompanyId(insAreaCompany.getCompanyId());
|
|
|
+ info.setCompanyId(insAreaCompany.getId());
|
|
|
info.setJqappoint(quoteRespVo.getJqappoint());
|
|
|
info.setSyappoint(quoteRespVo.getSyappoint());
|
|
|
insAreaCompanyRelatedInfoService.save(info);
|
|
|
@@ -205,7 +407,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
// 交强
|
|
|
if(Objects.nonNull(insurePremiumResponse.getCiContract())){
|
|
|
InsurePremiumResponse.CiContractDTO.ContractMainDTO ciContractMain = insurePremiumResponse.getCiContract().getContractMain();
|
|
|
- jqPremium = Double.parseDouble(ciContractMain.getTotalPremium());
|
|
|
+ jqPremium = ciContractMain.getTotalPremium();
|
|
|
quoteRespVo.setStartDateJq(ciContractMain.getValidDate());
|
|
|
quoteRespVo.setEndDateJq(ciContractMain.getExpiryDate());
|
|
|
//车船税
|
|
|
@@ -251,7 +453,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
CtKindCodeEnum ctKindCodeEnum = Enum.valueOf(CtKindCodeEnum.class, kindInfoVo.getKindCode());
|
|
|
InsurePremiumResponse.BiContractDTO.CoverageDTO coverageDTO = coverage.stream().filter(a -> a.getKindCode().equals(ctKindCodeEnum.getCode())).collect(Collectors.toList()).get(0);
|
|
|
kind.setAmount(coverageDTO.getAmount().doubleValue());
|
|
|
- kind.setCoveragePremium(Double.parseDouble(coverageDTO.getCoveragePremium()));
|
|
|
+ kind.setCoveragePremium(coverageDTO.getCoveragePremium());
|
|
|
kind.setUnitAmount(Objects.isNull(coverageDTO.getUnitAmount()) ? 0 : coverageDTO.getUnitAmount() );
|
|
|
kind.setServiceTimes(coverageDTO.getQuantity());
|
|
|
if (!ObjectUtils.isEmpty(kindInfoVo.getDeductibleRate())) {
|
|
|
@@ -392,7 +594,7 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
InsAreaCompany insAreaCompany = insAreaCompanyService.getByIdIsExist(companyId);
|
|
|
InsOrders insOrders = insOrdersService.getById(insAreaCompany.getOrderno());
|
|
|
LambdaQueryWrapper<InsAreaCompanyRelatedInfo> infoLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- infoLambdaQueryWrapper.eq(InsAreaCompanyRelatedInfo::getCompanyId, insAreaCompany.getCompanyId());
|
|
|
+ infoLambdaQueryWrapper.eq(InsAreaCompanyRelatedInfo::getCompanyId, insAreaCompany.getId());
|
|
|
List<InsAreaCompanyRelatedInfo> infoList = insAreaCompanyRelatedInfoService.list(infoLambdaQueryWrapper);
|
|
|
// 1 通过 协议id获取配置实体
|
|
|
PtlAgreementAttribution ptlAgreementAttribution = ptlAgreementAttributionService.getById(insAreaCompany.getAgreementId());
|
|
|
@@ -755,4 +957,15 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
|
|
|
String dir = "carInsPolicy/" + licensePlate + "/";
|
|
|
return FileUtil.netUrlToFile(url, dir, fileName, uploadFilePath, apiUrl + showFileUrl);
|
|
|
}
|
|
|
+
|
|
|
+ @Data
|
|
|
+ static class CheckCodeResp {
|
|
|
+
|
|
|
+ @JsonProperty(value = "jqImageCode")
|
|
|
+ String jqImageCode;
|
|
|
+
|
|
|
+ @JsonProperty(value = "syImageCode")
|
|
|
+ String syImageCode;
|
|
|
+
|
|
|
+ }
|
|
|
}
|