Просмотр исходного кода

紫金:修复投保日期超出整年问题

wangrq 3 месяцев назад
Родитель
Сommit
7048e6c9db

+ 47 - 0
tenant/insurance/quotation-commons/src/main/java/com/jzg/quotation/commons/utils/DateTimeUtil.java

@@ -54,6 +54,10 @@ public class DateTimeUtil {
      */
     public static final String UNSIGNED_DATE_PATTERN = "yyyyMMdd";
 
+    private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern(DATETIME_PATTERN);
+    private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DATE_PATTERN);
+    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm");
+
 
     /**
      * 获取当前日期和时间字符串.
@@ -525,6 +529,49 @@ public class DateTimeUtil {
         return LocalDateTime.parse(dateStr, DateTimeFormatter.ofPattern(DATETIME_PATTERN));
     }
 
+    /**
+     * 从标准时间字符串(如 "2026-07-02 12:00:00")中提取日期部分
+     *
+     * @param dateTimeStr 标准时间字符串,格式:yyyy-MM-dd HH:mm:ss
+     * @return 日期字符串,格式:yyyy-MM-dd
+     */
+    public static String extractDate(String dateTimeStr) {
+        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
+        return dateTime.format(DATE_FORMATTER);
+    }
+
+    /**
+     * 从标准时间字符串(如 "2026-07-02 12:00:00")中提取时分部分
+     *
+     * @param dateTimeStr 标准时间字符串,格式:yyyy-MM-dd HH:mm:ss
+     * @return 时分字符串,格式:HH:mm
+     */
+    public static String extractTime(String dateTimeStr) {
+        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
+        return dateTime.format(TIME_FORMATTER);
+    }
+
+    /**
+     * 从标准时间字符串(如 "2026-07-02 12:00:00")中提取小时
+     *
+     * @param dateTimeStr 标准时间字符串,格式:yyyy-MM-dd HH:mm:ss
+     * @return 小时,如 "12"
+     */
+    public static String extractHour(String dateTimeStr) {
+        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
+        return String.format("%02d", dateTime.getHour());
+    }
+
+    /**
+     * 从标准时间字符串(如 "2026-07-02 12:00:00")中提取分钟
+     *
+     * @param dateTimeStr 标准时间字符串,格式:yyyy-MM-dd HH:mm:ss
+     * @return 分钟,如 "00"
+     */
+    public static String extractMinute(String dateTimeStr) {
+        LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
+        return String.format("%02d", dateTime.getMinute());
+    }
 
 
     public static void main(String[] args) throws ParseException {

+ 62 - 17
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/build/ZiJinCrawlerQuoteRequestBuild.java

@@ -6,6 +6,7 @@ import com.jzg.commons.constants.quote.enums.quote.LicenseKindCode;
 import com.jzg.commons.entity.quote.vo.*;
 import com.jzg.commons.util.IDCardUtils;
 import com.jzg.commons.util.StringUtils;
+import com.jzg.quotation.commons.utils.DateTimeUtil;
 import com.jzg.quotation.zijin.api.constant.enums.MotorVehicleInsuranceEnum;
 import com.jzg.quotation.zijin.api.constant.enums.RiskCodeEnum;
 import com.jzg.quotation.zijin.crawler.component.ZiJinCrawlerRequestComponent;
@@ -239,22 +240,8 @@ public class ZiJinCrawlerQuoteRequestBuild {
         baseInfo.setHandler1Code(parameters.getUserCode());
         baseInfo.setHandler1Name(parameters.getUserName());
         baseInfo.setOperatorCode(operatorCode);
-        // 交强险日期
-        baseInfo.setStartDateCI(quoteVo.getCiRiskInfoVo().getStartDate().substring(0, 10));
-        baseInfo.setStartHourCI("00");
-        baseInfo.setStartMinuteCI("00");
-        baseInfo.setEndDateCI(quoteVo.getCiRiskInfoVo().getEndDate().substring(0, 10));
-        baseInfo.setEndHourCI("24");
-        baseInfo.setEndMinuteCI("00");
-        // 商业险日期
-        if (quoteVo.getBiRiskInfoVo() != null) {
-            baseInfo.setStartDate(quoteVo.getBiRiskInfoVo().getStartDate().substring(0, 10));
-            baseInfo.setStartHour("00");
-            baseInfo.setStartMinute("00");
-            baseInfo.setEndDate(quoteVo.getBiRiskInfoVo().getEndDate().substring(0, 10));
-            baseInfo.setEndHour("24");
-            baseInfo.setEndMinute("00");
-        }
+        // 设置报价日期
+        buildDate(quoteVo, baseInfo);
         // 经测试:燃油单强设为0,交三不设置(待确认),会返回转保标志,紫金系统可以忽略进行下一步报价
         baseInfo.setXbFlag(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
         baseInfo.setXbFlagCI(quoteVo.getBiRiskInfoVo() == null ? "0" : null);
@@ -268,7 +255,7 @@ public class ZiJinCrawlerQuoteRequestBuild {
         baseInfo.setHanderName(parameters.getUserName());
         baseInfo.setDemandNo("01ZKIC140026051910017933666448");
         if (quoteVo.getBiRiskInfoVo() != null) {
-            baseInfo.setDemandNoCI("01ZKIC140026051910017933666448");// 这个先放开看行不
+            baseInfo.setDemandNoCI("01ZKIC140026051910017933666448");
         }
         // 经测试:燃油: 单交设为2,交三设为0
         baseInfo.setCalculateFlag(quoteVo.getBiRiskInfoVo() == null ? "2" : "0");
@@ -279,6 +266,64 @@ public class ZiJinCrawlerQuoteRequestBuild {
         return baseInfo;
     }
 
+    /**
+     * 设置交强险、商业险日期
+     * @param quoteVo
+     * @param baseInfo
+     */
+    private static void buildDate(QuoteVo quoteVo, ZiJinCrawlerQuotationRequest.BaseInfo baseInfo) {
+        buildCiDate(quoteVo.getCiRiskInfoVo().getStartDate(), quoteVo.getCiRiskInfoVo().getEndDate(), baseInfo);
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            buildBiDate(quoteVo.getBiRiskInfoVo().getStartDate(), quoteVo.getBiRiskInfoVo().getEndDate(), baseInfo);
+        }
+    }
+
+    /**
+     * 设置交强险日期
+     *
+     * @param startDateTime 起保日期时间
+     * @param endDateTime   终保日期时间
+     * @param baseInfo      基础信息对象
+     */
+    private static void buildCiDate(String startDateTime, String endDateTime, ZiJinCrawlerQuotationRequest.BaseInfo baseInfo) {
+        baseInfo.setStartDateCI(DateTimeUtil.extractDate(startDateTime));
+        baseInfo.setStartHourCI(DateTimeUtil.extractHour(startDateTime));
+        baseInfo.setStartMinuteCI(DateTimeUtil.extractMinute(startDateTime));
+        baseInfo.setEndDateCI(DateTimeUtil.extractDate(endDateTime));
+        baseInfo.setEndHourCI(DateTimeUtil.extractHour(endDateTime));
+        baseInfo.setEndMinuteCI(DateTimeUtil.extractMinute(endDateTime));
+    }
+
+    /**
+     * 设置商业险日期
+     *
+     * @param startDateTime 起保日期时间
+     * @param endDateTime   终保日期时间
+     * @param baseInfo      基础信息对象
+     */
+    private static void buildBiDate(String startDateTime, String endDateTime, ZiJinCrawlerQuotationRequest.BaseInfo baseInfo) {
+        baseInfo.setStartDate(DateTimeUtil.extractDate(startDateTime));
+        baseInfo.setStartHour(DateTimeUtil.extractHour(startDateTime));
+        baseInfo.setStartMinute(DateTimeUtil.extractMinute(startDateTime));
+        baseInfo.setEndDate(DateTimeUtil.extractDate(endDateTime));
+        baseInfo.setEndHour(DateTimeUtil.extractHour(endDateTime));
+        baseInfo.setEndMinute(DateTimeUtil.extractMinute(endDateTime));
+    }
+
+    /**
+     * 设置重复投保日期(用于处理重复投保场景,从重复投保消息中提取结束时间作为新的起保时间)
+     *
+     * @param startDate 起保日期
+     * @param endDate   终保日期
+     * @param quoteVo   报价实体
+     * @param baseInfo  基础信息对象
+     */
+    public static void buildDuplicateInsuranceDate(String startDate, String endDate, QuoteVo quoteVo, ZiJinCrawlerQuotationRequest.BaseInfo baseInfo) {
+        buildCiDate(startDate, endDate, baseInfo);
+        if (quoteVo.getBiRiskInfoVo() != null) {
+            buildBiDate(startDate, endDate, baseInfo);
+        }
+    }
 
     /**
      * 构建车主信息对象

+ 1 - 6
tenant/insurance/quotation-zijin/src/main/java/com/jzg/quotation/zijin/crawler/service/impl/ZiJinCrawlerRequestImpl.java

@@ -142,12 +142,7 @@ public class ZiJinCrawlerRequestImpl implements ZiJinCrawlerRequest {
                     String newEndTime = TimeProcessing.minusOneSecondAfterYear(startTime);
                     String startDate = TimeProcessing.dateTimeToDate(startTime);
                     String endDate = TimeProcessing.minusDays(TimeProcessing.dateTimeToDate(newEndTime), 1);
-                    // 修改交强险起保时间(保司接口期望日期格式为 yyyy-MM-dd)
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDateCI(startDate);
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDateCI(endDate);
-                    // 修改商业险起保时间
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setStartDate(quoteVo.getBiRiskInfoVo() != null ? startDate : null);
-                    ziJinCrawlerQuotationRequest.getBaseInfo().setEndDate(quoteVo.getBiRiskInfoVo() != null ? endDate : null);
+                    ZiJinCrawlerQuoteRequestBuild.buildDuplicateInsuranceDate(startDate, endDate, quoteVo, ziJinCrawlerQuotationRequest.getBaseInfo());
                     log.info("紫金报价重复投保日期参数: startTime={}, endTime={}", startTime, newEndTime);
                     ziJinCrawlerQuotationResponse = ziJinCrawlerRequestComponent.quotation(ziJinCrawlerQuotationRequest, headers);
                     log.info("紫金报价重复投保后响应: {}", JSON.toJSONString(ziJinCrawlerQuotationResponse));