Quellcode durchsuchen

处理诚泰 重复投保问题

785834757 vor 4 Monaten
Ursprung
Commit
7dad425e10

+ 127 - 23
src/main/java/com/ydtech/modules/order/service/impl/ChengTaiOrderApiServiceImpl.java

@@ -254,6 +254,65 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
         return null;
     }
 
+    private static String extractDate(String text) {
+        java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("\\d{4}-\\d{2}-\\d{2}");
+        java.util.regex.Matcher matcher = pattern.matcher(text);
+        if (matcher.find()) {
+            return matcher.group();
+        }
+        return null;
+    }
+
+    private String formatToStandardDateTime(String raw) {
+        if (raw == null || raw.isEmpty()) return "";
+
+        // 提取所有数字
+        List<String> nums = new ArrayList<>();
+        Matcher m = Pattern.compile("\\d+").matcher(raw);
+        while (m.find()) nums.add(m.group());
+
+        if (nums.size() < 3) return raw;
+
+        String ymd = nums.get(0) + "-" + nums.get(1) + "-" + nums.get(2);
+        String hh = nums.size() >= 4 ? nums.get(3) : "00";
+        String mm = nums.size() >= 5 ? nums.get(4) : "00";
+        String ss = nums.size() >= 6 ? nums.get(5) : "00";
+
+        return ymd + " " + hh + ":" + mm + ":" + ss;
+    }
+
+    private List<String> multipleStartDate(PremiumCalculationResponse response) {
+        List<String> timeList = new ArrayList<>();
+        if (response == null || response.getHead() == null) {
+            return timeList;
+        }
+
+        String errorMsg = response.getHead().getErrorMessage();
+        if (errorMsg == null || errorMsg.isEmpty()) {
+            return timeList;
+        }
+
+        // 正则匹配:起保日期 + 日期时间(兼容所有格式)
+        Pattern pattern = Pattern.compile("起保日期[\\s:]+([\\d\\s:-]+)");
+        Matcher matcher = pattern.matcher(errorMsg);
+
+        while (matcher.find() && timeList.size() < 2) {
+            String rawDate = matcher.group(1).trim();
+            String formattedDate = formatToStandardDateTime(rawDate);
+            timeList.add(formattedDate);
+        }
+
+        return timeList;
+    }
+
+    private String addOneYear(String dateStr) {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime dateTime = LocalDateTime.parse(dateStr, formatter);
+        // 加 1 年
+        LocalDateTime nextYear = dateTime.plusYears(1);
+        return nextYear.format(formatter);
+    }
+
     /**
      * 重复报价
      *
@@ -270,35 +329,80 @@ public class ChengTaiOrderApiServiceImpl implements ChengTaiOrderApiService {
              * 重复投保
              */
             // 获取新起保时间 终保时间
+            //判断出现两次起保日期
+            boolean hasTwoStartDates = premiumCalculationResponse.getHead().getErrorMessage() != null
+                    && premiumCalculationResponse.getHead().getErrorMessage().indexOf("起保日期") != -1          // 第一次出现
+                    && premiumCalculationResponse.getHead().getErrorMessage().indexOf("起保日期",
+                    premiumCalculationResponse.getHead().getErrorMessage().indexOf("起保日期") + 1) != -1; // 第二次出现
+
             final String startDate = extractEndDate(premiumCalculationResponse);
             String endDate;
             if (startDate != null) {
-                if (startDate.endsWith("00:00:00")) {
-                    endDate = TimeProcessing.minusOneSecondAfterYear(startDate);
-                } else {
-                    endDate = TimeProcessing.plusOneYearToString(startDate);
-                }
-                final String formatStartDate = startDate;
-                final String formatEndDate = endDate;
-                PremiumCalculationResponse finalPremiumCalculationResponse = premiumCalculationResponse;
-                quoteInfoVo.getRiskList().forEach(riskInfoVo -> {
-                    String start, end = "";
-
-                    if (riskInfoVo.getRiskCode().equals("0507") && finalPremiumCalculationResponse.getHead().getErrorMessage().contains("交强")) {
-                        riskInfoVo.setStartDate(formatStartDate);
-                        riskInfoVo.setEndDate(formatEndDate);
-                    }
 
-                    // 处理商业险的即时起保
-                    if (riskInfoVo.getRiskCode().equals("0510")) {
-                        if (!formatStartDate.endsWith("00:00:00")) {
-                            start = TimeProcessing.tomorrowDateTime(formatStartDate);
-                            end = TimeProcessing.tomorrowDateTime(formatEndDate);
-                            riskInfoVo.setStartDate(start);
-                            riskInfoVo.setEndDate(end);
+                //如果出现起保日期两次 就是 交强商业都重复投保了
+                if(hasTwoStartDates)
+                {
+                    String jqEndDate,syEndDate = "";
+                    List<String> timeList = multipleStartDate(premiumCalculationResponse);
+                    for(int i=0;i<timeList.size();i++){
+                        timeList.set(i,addOneYear(timeList.get(i)));
+                    }
+                    if(timeList.size() < 2){
+                        throw new SystemException("处理重复投保时间异常");
+                    }
+                    if (timeList.get(0).endsWith("00:00:00")) {
+                        jqEndDate = TimeProcessing.minusOneSecondAfterYear(startDate);
+                    } else {
+                        jqEndDate = TimeProcessing.plusOneYearToString(startDate);
+                    }
+                    if (timeList.get(1).endsWith("00:00:00")) {
+                        syEndDate = TimeProcessing.minusOneSecondAfterYear(startDate);
+                    } else {
+                        syEndDate = TimeProcessing.plusOneYearToString(startDate);
+                    }
+                    String jqFinalEndDate = jqEndDate;
+                    String syFinalEndDate = syEndDate;
+                    quoteInfoVo.getRiskList().forEach(riskInfoVo -> {
+                        // 判断险种代码是 0507
+                        if ("0507".equals(riskInfoVo.getRiskCode())) {
+                            // 设置起保日期(第一次)
+                            riskInfoVo.setStartDate(timeList.get(0));
+                            // 设置终保日期
+                            riskInfoVo.setEndDate(jqFinalEndDate);
+                        }
+                        if("0510".equals(riskInfoVo.getRiskCode())){
+                            riskInfoVo.setStartDate(timeList.get(1));
+                            riskInfoVo.setEndDate(syFinalEndDate);
                         }
+                    });
+                }else {
+                    if (startDate.endsWith("00:00:00")) {
+                        endDate = TimeProcessing.minusOneSecondAfterYear(startDate);
+                    } else {
+                        endDate = TimeProcessing.plusOneYearToString(startDate);
                     }
-                });
+                    final String formatStartDate = startDate;
+                    final String formatEndDate = endDate;
+                    PremiumCalculationResponse finalPremiumCalculationResponse = premiumCalculationResponse;
+                    quoteInfoVo.getRiskList().forEach(riskInfoVo -> {
+                        String start, end = "";
+
+                        if (riskInfoVo.getRiskCode().equals("0507") && finalPremiumCalculationResponse.getHead().getErrorMessage().contains("交强")) {
+                            riskInfoVo.setStartDate(formatStartDate);
+                            riskInfoVo.setEndDate(formatEndDate);
+                        }
+
+                        // 处理商业险的即时起保
+                        if (riskInfoVo.getRiskCode().equals("0510")) {
+                            if (!formatStartDate.endsWith("00:00:00")) {
+                                start = TimeProcessing.tomorrowDateTime(formatStartDate);
+                                end = TimeProcessing.tomorrowDateTime(formatEndDate);
+                                riskInfoVo.setStartDate(start);
+                                riskInfoVo.setEndDate(end);
+                            }
+                        }
+                    });
+                }
                 premiumCalculationRequest = new PremiumCalculationRequest(quoteInfoVo, carActualValue, parameters, vehicle, quoteVo, quoteInfoVo.getRiskList(), null);
                 premiumCalculationResponse = chengTaiRequestApiComponent.premiumCalculation(premiumCalculationRequest);
                 maxQuoteNum--;