|
|
@@ -0,0 +1,117 @@
|
|
|
+package com.fs.crm.utils;
|
|
|
+
|
|
|
+import com.fs.crm.vo.CrmOrderInfoVo;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.format.DateTimeParseException;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 订单信息提取工具类(适配字段间隔不确定 + Java 8日期转换)
|
|
|
+ */
|
|
|
+public class CidUserOrderExtractor {
|
|
|
+ // 优化后的正则:加入\\s*匹配任意空白间隔,忽略字段间不确定的空格/换行
|
|
|
+ private static final String ORDER_REGEX =
|
|
|
+ "(.*?)\\s*-\\s*(.+?)\\s*(.*?)\\s*日期\\s*(\\d{4}-\\d{2}-\\d{2}\\s*\\d{2}:\\d{2}:\\d{2})\\s*" +
|
|
|
+ "订单号\\s*(\\d+)\\s*商品\\s*(.+?)\\s*规格\\s*(.+?)\\s*物流\\s*(.+?)\\s*" +
|
|
|
+ "数量(件)\\s*(\\d+)\\s*实付金额\\s*(\\d+(\\.\\d+)?)";
|
|
|
+
|
|
|
+ private static final Pattern ORDER_PATTERN = Pattern.compile(ORDER_REGEX);
|
|
|
+
|
|
|
+ // Java 8 日期格式化器(线程安全,可全局复用,对应订单日期格式:yyyy-MM-dd HH:mm:ss)
|
|
|
+ private static final DateTimeFormatter DATE_TIME_FORMATTER =
|
|
|
+ DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 提取单个订单文本的信息(适配间隔不确定)
|
|
|
+ * @param orderText 原始订单文本(允许字段间有任意空白/换行)
|
|
|
+ * @return 封装后的OrderInfo对象
|
|
|
+ */
|
|
|
+ public static CrmOrderInfoVo extractSingleOrder(String orderText) {
|
|
|
+ if (orderText == null || orderText.trim().isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 预处理:将多个连续空白替换为单个空格(可选,进一步提高匹配稳定性)
|
|
|
+ String standardizedText = orderText.replaceAll("\\s+", " ");
|
|
|
+ Matcher matcher = ORDER_PATTERN.matcher(standardizedText);
|
|
|
+ CrmOrderInfoVo orderInfo = new CrmOrderInfoVo();
|
|
|
+
|
|
|
+ if (matcher.find()) {
|
|
|
+ try {
|
|
|
+ // 1. 提取各分组字段(忽略间隔,正则已适配)
|
|
|
+ String platform = matcher.group(1).trim();
|
|
|
+ String shop = matcher.group(2).trim();
|
|
|
+ String dateStr = matcher.group(3).trim();
|
|
|
+ String orderNo = matcher.group(4).trim();
|
|
|
+ String productName = matcher.group(5).trim();
|
|
|
+ String specification = matcher.group(6).trim();
|
|
|
+ String logistics = matcher.group(7).trim();
|
|
|
+ String quantityStr = matcher.group(8).trim();
|
|
|
+ String payAmountStr = matcher.group(9).trim();
|
|
|
+
|
|
|
+ // 2. Java 8 日期转换:字符串 → LocalDateTime(核心步骤)
|
|
|
+ LocalDateTime buyDate = parseDateToLocalDateTime(dateStr);
|
|
|
+
|
|
|
+ // 3. 其他字段类型转换
|
|
|
+ Integer quantity = Integer.parseInt(quantityStr);
|
|
|
+ BigDecimal payAmount = new BigDecimal(payAmountStr);
|
|
|
+
|
|
|
+ // 4. 封装到实体类
|
|
|
+ orderInfo.setPlatform(platform);
|
|
|
+ orderInfo.setShop(shop);
|
|
|
+ orderInfo.setBuyDate(buyDate);
|
|
|
+ orderInfo.setOrderNo(orderNo);
|
|
|
+ orderInfo.setProductName(productName);
|
|
|
+ orderInfo.setSpecification(specification);
|
|
|
+ orderInfo.setQuantity(quantity);
|
|
|
+ orderInfo.setLogistics(logistics);
|
|
|
+ orderInfo.setPayAmount(payAmount);
|
|
|
+
|
|
|
+ } catch (NumberFormatException | DateTimeParseException e) {
|
|
|
+ System.err.println("字段类型转换失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return orderInfo;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Java 8 日期字符串转换为LocalDateTime(单独抽取,便于复用和异常处理)
|
|
|
+ * @param dateStr 日期字符串(格式:yyyy-MM-dd HH:mm:ss,允许中间有多个空格)
|
|
|
+ * @return LocalDateTime对象,转换失败返回null
|
|
|
+ */
|
|
|
+ private static LocalDateTime parseDateToLocalDateTime(String dateStr) {
|
|
|
+ if (dateStr == null || dateStr.trim().isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 标准化日期字符串:将中间的多个空格替换为单个空格(确保格式匹配)
|
|
|
+ String standardDateStr = dateStr.replaceAll("\\s+", " ");
|
|
|
+ // Java 8 核心转换方法:parse(String, DateTimeFormatter)
|
|
|
+ return LocalDateTime.parse(standardDateStr, DATE_TIME_FORMATTER);
|
|
|
+ } catch (DateTimeParseException e) {
|
|
|
+ System.err.println("日期转换失败,格式不匹配(要求:yyyy-MM-dd HH:mm:ss):" + e.getMessage());
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * Java 8 LocalDateTime转换为自定义格式字符串(扩展方法,便于展示/存储)
|
|
|
+ * @param localDateTime 待转换的LocalDateTime对象
|
|
|
+ * @param pattern 自定义日期格式(如:yyyy/MM/dd HH:mm)
|
|
|
+ * @return 格式化后的日期字符串
|
|
|
+ */
|
|
|
+ public static String formatLocalDateTime(LocalDateTime localDateTime, String pattern) {
|
|
|
+ if (localDateTime == null || pattern == null || pattern.trim().isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern(pattern);
|
|
|
+ return localDateTime.format(customFormatter);
|
|
|
+ }
|
|
|
+}
|