Переглянути джерело

诚泰重复投保逻辑的增加

dongxin 1 рік тому
батько
коміт
bfb04ee11a

+ 1 - 1
src/main/java/com/ydtech/modules/order/components/chengtai/ChengTaiRequestApiComponents.java

@@ -213,7 +213,7 @@ public class ChengTaiRequestApiComponents {
         if (!flag){
             throw new SystemException("验签失败");
         }
-        if (!ResponseCode.R_000.getCode().equals(responseCode)) {
+        if (!ResponseCode.R_000.getCode().equals(responseCode) && !responseMsg.contains("重复投保")) {
             throw new SystemException(responseMsg);
         }
     }

+ 3 - 0
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/InsurePremiumRequest.java

@@ -242,6 +242,8 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
             private String validAtOnce;
             @JsonProperty("validDate")
             private String validDate;
+            @JsonProperty("expiryDate")
+            private String expiryDate;
 
             public ContractMainDTO(BaseQuoteInfoVo quoteInfoVo,boolean isNewEnergy){
                 if(isNewEnergy){
@@ -257,6 +259,7 @@ public class InsurePremiumRequest extends ChengTaiBaseRequest{
                         this.validAtOnce = StringUtils.isBlank(riskInfoVo.getInstantFlag())
                                 || "0".equals(riskInfoVo.getInstantFlag()) ? "0" : "1"; // 及时起保
                         this.validDate =riskInfoVo.getStartDate();
+                        this.expiryDate = riskInfoVo.getEndDate();
                         this.renewalFlag = "0";
                     }
                 }

+ 2 - 2
src/main/java/com/ydtech/modules/order/entity/api/chengtai/response/InsurePremiumResponse.java

@@ -213,7 +213,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse {
             @JsonProperty("validDate")
             private String validDate;
             @JsonProperty("coveragePremium")
-            private String coveragePremium;
+            private Double coveragePremium;
             @JsonProperty("glassClassCode")
             private String glassClassCode;
             @JsonProperty("calculateFlag")
@@ -540,7 +540,7 @@ public class InsurePremiumResponse extends ChengTaiBaseResponse {
             @JsonProperty("riskCode")
             private String riskCode;
             @JsonProperty("totalPremium")
-            private String totalPremium;
+            private Double totalPremium;
             @JsonProperty("policyNo")
             private String policyNo;
             @JsonProperty("validAtOnce")

+ 94 - 4
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -36,6 +36,7 @@ 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.DateTimeUtil;
 import com.ydtech.utils.StringUtils;
 import com.ydtech.utils.baidu.FileUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,7 +44,6 @@ 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.*;
@@ -117,7 +117,9 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         PersonAreaVo personAreaVo = new PersonAreaVo();
         buildRegion(quoteInfoVo,personAreaVo);
         InsurePremiumRequest insurePremiumRequest = new InsurePremiumRequest(quoteInfoVo,carModelListDTO, carActualValueResponse,personAreaVo,parameters,quoteVo, carModelListDTO);
-        InsurePremiumResponse insurePremiumResponse = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+
+        // 重复报价
+        InsurePremiumResponse insurePremiumResponse = this.getResponse(insurePremiumRequest, httpHeaders);
 
         String message = "";
         if(!ResponseCode.R_000.getCode().equals(insurePremiumResponse.getCode())){
@@ -153,6 +155,94 @@ 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 response = chengTaiRequestApiComponents.quoteApi(insurePremiumRequest,httpHeaders);
+            return response;
+        }
+        return insurePremiumResponse;
+    }
+
+    /**
+     * 重复投保时间处理
+     *
+     * @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);
@@ -205,7 +295,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 +341,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())) {