Răsfoiți Sursa

诚泰报价转保车、投保日期格式转化

Qchen 4 luni în urmă
părinte
comite
d3604fb515

+ 6 - 5
src/main/java/com/ydtech/modules/order/entity/api/chengtai/request/PremiumCalculationRequest.java

@@ -101,10 +101,10 @@ public class PremiumCalculationRequest {
 
     public PremiumCalculationRequest(BaseQuoteInfoVo quoteInfoVo, BigDecimal actualValue,
                                      ChengTaiConfigureParameters  parameters, CarModelQueryResponse.vehicle vehicle,
-                                     BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo,List<RiskInfoVo> riskList) {
+                                     BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo,List<RiskInfoVo> riskList,String orderNumber) {
         this.Head = new head(parameters);
         this.BasePart = new basePart(quoteInfoVo,
-                quoteVo);
+                quoteVo,orderNumber);
         this.ItemMotor = new itemMotor(quoteInfoVo.getOwnerInfo(),quoteInfoVo.getCarInfo(),vehicle,actualValue);
         this.riskListWrapper = new RiskListWrapper();
         this.riskListWrapper.setRisks(Risk.buildRiskList(riskList));
@@ -217,7 +217,7 @@ public class PremiumCalculationRequest {
         @JacksonXmlProperty(localName = "insuredType")
         private String insuredType;
 
-        public basePart(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo) {
+        public basePart(BaseQuoteInfoVo quoteInfoVo, BaseQuoteVo<InsDrivingIntentionInsurance> quoteVo,String orderNumber) {
             String productId = quoteInfoVo.getProductId();
             if ("0330".equals(productId)) {
                 this.planCode = "0801";
@@ -228,9 +228,10 @@ public class PremiumCalculationRequest {
             }
             this.cityCode = "140100";
             this.renewInd = "0";
+            this.orderNumber = orderNumber;
             //转保答案
-            //this.compRenewalAnswer = "";
-            //this.commRenewalAnswer = "";
+            this.compRenewalAnswer = quoteVo.getRenewalCodeJq();
+            this.commRenewalAnswer = quoteVo.getRenewalCodeSy();
             if(!Objects.isNull(quoteVo.getAccidentalDrivingVo())) {
                 JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(quoteVo.getAccidentalDrivingVo()));
                 this.insuredType = "03";

+ 110 - 36
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -1,9 +1,11 @@
 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.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ydtech.config.properties.ChengTaiApiConfigurationProperties;
 import com.ydtech.constants.enums.InsuranceOrderPdf;
 import com.ydtech.constants.enums.InsuranceRisk;
@@ -18,10 +20,12 @@ import com.ydtech.modules.order.components.ConfigureParametersComponents;
 import com.ydtech.modules.order.components.InsImagesUploadCacheComponents;
 import com.ydtech.modules.order.components.chengtai.ChengTaiRequestApiComponent;
 import com.ydtech.modules.order.components.chengtai.ChengTaiRequestApiComponents;
+import com.ydtech.modules.order.components.gouren.GuorenDuplicateInsuranceComponent;
 import com.ydtech.modules.order.constants.QuoteNumberConstant;
 import com.ydtech.modules.order.dao.SysQuoteRecordMapper;
 import com.ydtech.modules.order.entity.*;
 import com.ydtech.modules.order.entity.api.chengtai.SecurityUrl;
+import com.ydtech.modules.order.entity.api.chengtai.XmlDateTimeFormatter;
 import com.ydtech.modules.order.entity.api.chengtai.constants.*;
 import com.ydtech.modules.order.entity.api.chengtai.request.*;
 import com.ydtech.modules.order.entity.api.chengtai.response.*;
@@ -36,10 +40,12 @@ import com.ydtech.modules.order.entity.vo.BaseQuoteInfoVo;
 import com.ydtech.modules.order.entity.vo.BaseQuoteVo;
 import com.ydtech.modules.order.entity.vo.PolicyPrintVo;
 import com.ydtech.modules.order.service.*;
+import com.ydtech.modules.order.utils.TimeProcessing;
 import com.ydtech.modules.protocol.entity.po.PtlAgreementAttribution;
 import com.ydtech.modules.protocol.service.PtlAgreementAttributionService;
 import com.ydtech.utils.*;
 import com.ydtech.utils.baidu.FileUtil;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -50,8 +56,12 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 @Service
@@ -241,36 +251,77 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         /** 3. 计算车辆实际价值 */
         BigDecimal carActualValue = calculateCarActualValue(vehicle,quoteInfoVo.getCarInfo());
         /** 4. 报价 */
-        PremiumCalculationRequest premiumCalculationRequest = new PremiumCalculationRequest(quoteInfoVo,carActualValue,parameters,vehicle,quoteVo,quoteInfoVo.getRiskList());
+        PremiumCalculationRequest premiumCalculationRequest = new PremiumCalculationRequest(quoteInfoVo,carActualValue,parameters,vehicle,quoteVo,quoteInfoVo.getRiskList(),null);
         PremiumCalculationResponse premiumCalculationResponse = chengTaiRequestApiComponent.premiumCalculation(premiumCalculationRequest);
         // 报价失败
         if (!premiumCalculationResponse.getHead().getResponseCode().equals("0000")) {
-            //重复投保 测试环境报不出重复投保
             /**
-             *
+             * 重复投保
              */
-            InsOrders insOrders = insOrdersService.getById(quoteVo.getOrderNo());
-            InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
-            String subOrderNo = insOrdersService.responseFailedOrder(quoteVo,quoteInfoVo, ptlAgreementAttribution, insOrders, premiumCalculationResponse.getHead().getErrorMessage(), insOrderStatusEnum);
-            SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
-                    QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
-            sysQuoteRecords.add(sysQuoteRecord);
-            //存储报价记录
-            sysQuoteRecords.forEach(item->{
-                item.setSubOrderNo(subOrderNo);
-            });
-            sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
-            //刷新redis中的报价次数
-            sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
-            throw new SystemException(premiumCalculationResponse.getHead().getErrorMessage());
+            // 获取新起保时间 终保时间
+            final String startDate = extractEndDate(premiumCalculationResponse);
+            String endDate;
+            if (startDate != null){
+                if (startDate.endsWith("00:00:00")) {
+                    endDate = TimeProcessing.minusOneSecondAfterYear(startDate);
+                } else {
+                    endDate = TimeProcessing.minusOneDayAfterYear(startDate);
+                }
+                final String formatStartDate = XmlDateTimeFormatter.format(startDate);
+                final String formatEndDate = XmlDateTimeFormatter.format(endDate);
+                quoteInfoVo.getRiskList().forEach(riskInfoVo -> {
+                    riskInfoVo.setStartDate(formatStartDate);
+                    riskInfoVo.setEndDate(formatEndDate);
+                });
+                premiumCalculationRequest = new PremiumCalculationRequest(quoteInfoVo,carActualValue,parameters,vehicle,quoteVo,quoteInfoVo.getRiskList(),null);
+                premiumCalculationResponse = chengTaiRequestApiComponent.premiumCalculation(premiumCalculationRequest);
+            } else {
+                InsOrders insOrders = insOrdersService.getById(quoteVo.getOrderNo());
+                InsOrderStatusEnum insOrderStatusEnum = InsOrderStatusEnum.QUOTE_FAILED;
+                String subOrderNo = insOrdersService.responseFailedOrder(quoteVo,quoteInfoVo, ptlAgreementAttribution, insOrders, premiumCalculationResponse.getHead().getErrorMessage(), insOrderStatusEnum);
+                SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
+                        QuoteNumberConstant.QuoteAction.QUOTE_FAILED.getCode().toString(),QuoteNumberConstant.QuoteResult.FAIL.getCode().toString());
+                sysQuoteRecords.add(sysQuoteRecord);
+                //存储报价记录
+                sysQuoteRecords.forEach(item->{
+                    item.setSubOrderNo(subOrderNo);
+                });
+                sysQuoteRecordMapper.insertBatch(sysQuoteRecords);
+                //刷新redis中的报价次数
+                sysQuoteRedisService.refreshQuoteNum(quoteVo.getCompanyId(),quoteInfoVo.getUserid(),sysQuoteRecords);
+                throw new SystemException(premiumCalculationResponse.getHead().getErrorMessage());
+            }
         }
-        // 处理报价数据
-        QuoteRespVo quoteRespVo = getQuoteRespVo(premiumCalculationResponse, quoteInfoVo);
-        quoteRespVo.setCoreModels(vehicle.toCoreModelsVo());
+        // 转保处理
+        String ciQuestion = premiumCalculationResponse.getCompRisk() != null
+                ? premiumCalculationResponse.getCompRisk().getBasePart().getQuestion()
+                : null;
+        String biQuestion = premiumCalculationResponse.getCommRisk() != null
+                ? premiumCalculationResponse.getCommRisk().getBasePart().getQuestion()
+                : null;
         // 订单号
         String orderNumber = premiumCalculationResponse.getCompRisk() != null
                 ? premiumCalculationResponse.getCompRisk().getFtrno().getOrderNumber()
                 : premiumCalculationResponse.getCommRisk().getFtrno().getOrderNumber();
+        Map<String, String> bodyMap = new HashMap<>();
+        if (Objects.nonNull(ciQuestion)) {
+            bodyMap.put("jqImage", ciQuestion);
+        }
+        if (Objects.nonNull(biQuestion)) {
+            bodyMap.put("syImage", biQuestion);
+        }
+        String sendBody = JsonUtils.toJson(bodyMap);
+        if (!"{}".equals(sendBody)) {
+            String ocrStr = HttpUtil.sendPost("http://39.98.41.104:8088/getres", sendBody);
+            CheckCodeResp resp = JSONUtil.toBean(ocrStr, CheckCodeResp.class);
+            quoteVo.setRenewalCodeJq(resp.getJqImageCode());
+            quoteVo.setRenewalCodeSy(resp.getSyImageCode());
+            premiumCalculationRequest = new PremiumCalculationRequest(quoteInfoVo,carActualValue,parameters,vehicle,quoteVo,quoteInfoVo.getRiskList(),orderNumber);
+            premiumCalculationResponse = chengTaiRequestApiComponent.premiumCalculation(premiumCalculationRequest);
+        }
+        // 处理报价数据
+        QuoteRespVo quoteRespVo = getQuoteRespVo(premiumCalculationResponse, quoteInfoVo);
+        quoteRespVo.setCoreModels(vehicle.toCoreModelsVo());
         HttpResult<QuoteRespVo> quoteRespVoHttpResult = respOrder(premiumCalculationResponse, quoteRespVo, ptlAgreementAttribution, orderNumber, quoteInfoVo,premiumCalculationRequest);
 
                 SysQuoteRecord sysQuoteRecord = new SysQuoteRecord(quoteInfoVo.getUserid(),quoteVo.getCompanyId(),quoteInfoVo.getCarInfo().getLicenseNo(),
@@ -323,6 +374,22 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         return carActualValue;
     }
 
+    /**
+     * 重复报价提取终保日期
+     * @param response
+     * @return
+     */
+    private String extractEndDate(PremiumCalculationResponse response) {
+        String targetText = response.getHead().getErrorMessage();
+        Pattern pattern = Pattern.compile("终保日期 (\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2})");
+        Matcher matcher = pattern.matcher(targetText);
+        if (matcher.find()) {
+            String dateStr = matcher.group(1);
+            return dateStr + ":00";
+        }
+        return null;
+    }
+
 //    /**
 //     * 重复报价
 //     * @param insurePremiumRequest
@@ -689,14 +756,21 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         List<RiskInfoVo> riskList = yaQuoteInfoVo.getRiskList();
         // 报价险种放入保费
         List<QuoteRiskRespVo> riskList1 = QuoteRiskRespVo.toQuoteRiskRespVoList(riskList, jqPremium, syPremium);
-
+        final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         for (QuoteRiskRespVo quoteRiskRespVo : riskList1) {
+            // 时间格式转换
+            OffsetDateTime startDateTime = OffsetDateTime.parse(quoteRiskRespVo.getStartDate());
+            OffsetDateTime endDateTime = OffsetDateTime.parse(quoteRiskRespVo.getEndDate());
+
+            String startDateStr = startDateTime.format(FORMATTER);
+            String endDateStr = endDateTime.format(FORMATTER);
+
             if (InsuranceRisk.TRAFFIC.getCode().equals(quoteRiskRespVo.getRiskCode())) {
-                quoteRespVo.setStartDateJq(quoteRiskRespVo.getStartDate());
-                quoteRespVo.setEndDateJq(quoteRiskRespVo.getEndDate());
+                quoteRespVo.setStartDateJq(startDateStr);
+                quoteRespVo.setEndDateJq(endDateStr);
             } else if (InsuranceRisk.BUSINESS.getCode().equals(quoteRiskRespVo.getRiskCode())) {
-                quoteRespVo.setStartDateSy(quoteRiskRespVo.getStartDate());
-                quoteRespVo.setEndDateSy(quoteRiskRespVo.getEndDate());
+                quoteRespVo.setStartDateSy(startDateStr);
+                quoteRespVo.setEndDateSy(endDateStr);
             }
         }
         List<QuoteKindRespVo> kindList1 = new ArrayList<>();
@@ -1563,15 +1637,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;
-//
-//    }
+
+    @Data
+    static class CheckCodeResp {
+
+        @JsonProperty(value = "jqImageCode")
+        String jqImageCode;
+
+        @JsonProperty(value = "syImageCode")
+        String syImageCode;
+
+    }
 }

+ 238 - 0
src/main/java/com/ydtech/modules/order/utils/TimeProcessing.java

@@ -0,0 +1,238 @@
+package com.ydtech.modules.order.utils;
+
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+
+/**
+ * @description: 保司 处理时间 工具类
+ * @author: wenks
+ * @date: 2025/3/5 10:30
+ **/
+public final class TimeProcessing {
+
+    private TimeProcessing() {
+        throw new IllegalStateException("Utility class");
+    }
+
+    public static final DateTimeFormatter DATE_TIME_FORMATTER;
+
+    static {
+        DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+    }
+
+    public static final DateTimeFormatter DATE_FORMATTER;
+
+    static {
+        DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+    }
+
+    public static final long ONE = 1L;
+
+    public static LocalDateTime parseDateTime(String date) {
+        return LocalDateTime.parse(date, DATE_TIME_FORMATTER);
+    }
+
+    public static LocalDate parseDate(String date) {
+        return LocalDate.parse(date, DATE_FORMATTER);
+    }
+
+
+    /**
+     * 时间格式转换
+     * yyyy-MM-dd 转 yyyy-MM-dd HH:mm:ss
+     *
+     * @param date yyyy-MM-dd
+     * @return yyyy-MM-dd HH:mm:ss
+     */
+    public static String dateToDateTime(String date) {
+        return LocalDateTime.of(LocalDate.parse(date, DATE_FORMATTER), LocalTime.MIN).format(DATE_TIME_FORMATTER);
+    }
+
+    public static String dateToDateTimeMax(String date) {
+        return LocalDateTime.of(LocalDate.parse(date, DATE_FORMATTER), LocalTime.MAX).format(DATE_TIME_FORMATTER);
+    }
+
+    public static String dateTimeToDate(String dateTime) {
+        return LocalDateTime.parse(dateTime, DATE_TIME_FORMATTER).format(DATE_FORMATTER);
+    }
+
+    /**
+     * 一年以后减1秒得时间 (适用于零点时)
+     *
+     * @param date 开始时间
+     * @return 结束时间
+     */
+    public static String minusOneSecondAfterYear(String date) {
+        return plusOneYear(date).minusSeconds(ONE).format(DATE_TIME_FORMATTER);
+    }
+    /**
+     * 一年以后减1天得时间 (适用于不是零点时)
+     *
+     * @param date 开始时间
+     * @return 结束时间
+     */
+    public static String minusOneDayAfterYear(String date) {
+        return plusOneYear(date).minusDays(ONE).minusSeconds(ONE).format(DATE_TIME_FORMATTER);
+    }
+
+
+
+    /**
+     * 一年以后得时间
+     *
+     * @param date 开始时间
+     * @return 结束时间
+     */
+    public static LocalDateTime plusOneYear(String date) {
+        return parseDateTime(date).plusYears(ONE);
+    }
+
+    /**
+     * 一年以后得时间
+     *
+     * @param date 开始时间
+     * @return 结束时间
+     */
+    public static String plusOneYearToString(String date) {
+        return plusOneYear(date).format(DATE_TIME_FORMATTER);
+    }
+
+    /**
+     * 几天之前
+     *
+     * @param date 时间
+     * @param days 天数
+     * @return
+     */
+    public static String minusDays(String date, long days) {
+        LocalDate parse = LocalDate.parse(date);
+        return parse.minusDays(days).format(DATE_FORMATTER);
+    }
+
+    /**
+     * 几天后
+     *
+     * @param date 时间
+     * @param days 天数
+     * @return
+     */
+    public static String plusDays(String date, long days) {
+        LocalDate parse = LocalDate.parse(date);
+        return parse.plusDays(days).format(DATE_FORMATTER);
+    }
+
+    /**
+     * 今天的日期
+     *
+     * @return
+     */
+    public static String nowDate() {
+        return LocalDate.now().format(DATE_FORMATTER);
+    }
+
+    public static String nowDateTime() {
+        return LocalDateTime.now().format(DATE_TIME_FORMATTER);
+    }
+
+    /**
+     * 明天的 明天0点0分0秒
+     *
+     * @return 明天0点0分0秒
+     */
+    public static String tomorrowDateTime() {
+        return LocalDateTime.of(LocalDate.now().plusDays(1), LocalTime.MIN).format(DATE_TIME_FORMATTER);
+    }
+
+    public static String tomorrowDate() {
+        return LocalDate.now().plusDays(1).format(DATE_FORMATTER);
+    }
+
+
+    /**
+     * 获取时间范围
+     * 用于查询订单的时候按照时间范围查询
+     *
+     * @param date       时间
+     * @param isDateTime 是否要返回时间类型
+     * @return 时间范围
+     */
+    public static TimeFrame getTimeFrame(String date, boolean isDateTime) {
+        LocalDate dateTime;
+        if (date.length() > 10) {
+            dateTime = LocalDate.parse(date, DATE_TIME_FORMATTER);
+        } else {
+            dateTime = LocalDate.parse(date, DATE_FORMATTER);
+        }
+        LocalDate localDate = dateTime.plusDays(ONE);
+        if (isDateTime) {
+            LocalDateTime startOfDay = LocalDateTime.of(dateTime, LocalTime.MIDNIGHT);
+            LocalDateTime endOfDay = LocalDateTime.of(localDate, LocalTime.MIDNIGHT);
+            return new TimeFrame(startOfDay.format(DATE_TIME_FORMATTER), endOfDay.format(DATE_TIME_FORMATTER));
+        }
+        return new TimeFrame(dateTime.format(DATE_FORMATTER), localDate.format(DATE_FORMATTER));
+    }
+
+    /**
+     * 获取年份范围
+     *
+     * @return 当前年的开始和结束日期
+     */
+    public static TimeFrame getYearRange() {
+        int year = LocalDate.now().getYear();
+        LocalDate firstDay = LocalDate.of(year, 1, 1);
+        LocalDate lastDay = LocalDate.of(year, 12, 31);
+        return new TimeFrame(firstDay.format(DATE_FORMATTER), lastDay.format(DATE_FORMATTER));
+    }
+
+    /**
+     * 获取现在的时间
+     *
+     * @return 现在时间
+     */
+    public static String getNowDateTime() {
+        return LocalDateTime.now().format(DATE_TIME_FORMATTER);
+    }
+
+    /**
+     * 使用年限计算
+     *
+     * @param date 日期
+     * @return 年限
+     */
+    public static int serviceLife(String date) {
+        LocalDate localDate = parseDate(date);
+        LocalDate now = LocalDate.now();
+        Period between = Period.between(localDate, now);
+        return between.getYears();
+    }
+
+    /**
+     * 获取去年的年份
+     * @return 去年的 年
+     */
+    public static int getLastYear(){
+        return LocalDate.now().minusYears(1).getYear();
+    }
+
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class TimeFrame {
+        /**
+         * 开始时间
+         */
+        private String startTime;
+        /**
+         * 结束时间
+         */
+        private String endTime;
+
+    }
+
+}