diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java index a23889f..62c6736 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/BatchPublishServiceImpl.java @@ -184,6 +184,8 @@ public class BatchPublishServiceImpl implements IBatchPublishService // 提取SKUID和URL List urls = LineReportParser.extractJdUrls(message); List skuids = LineReportParser.extractSkuids(message); + // 解析每个URL对应的价格(如有) + Map urlPriceMap = LineReportParser.extractPriceForUrls(message); log.info("提取到 {} 个URL, {} 个SKUID", urls.size(), skuids.size()); log.info("提取的URLs: {}", urls); @@ -220,6 +222,11 @@ public class BatchPublishServiceImpl implements IBatchPublishService continue; } + // 如果文本中包含该URL的显式价格,则覆盖价格字段 + if (urlPriceMap.containsKey(url)) { + productInfo.put("price", urlPriceMap.get(url)); + productInfo.put("_priceSource", "text"); + } // 不对URL阶段做去重,保持与输入一致(允许同款多条) products.add(productInfo); Object skuObj = productInfo.get("skuid"); diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/util/LineReportParser.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/util/LineReportParser.java index 5db82f0..a3780cc 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/util/LineReportParser.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/util/LineReportParser.java @@ -18,6 +18,11 @@ public class LineReportParser { // SKUID正则表达式(10-13位数字) private static final Pattern SKUID_PATTERN = Pattern.compile("\\b(\\d{10,13})\\b"); + // 行内价格 + 短链接:示例 1428.28 https://u.jd.com/xxxxx + private static final Pattern PRICE_AND_UJD_PATTERN = Pattern.compile("(?i)\\b(\\d{1,6}(?:\\.\\d{1,2})?)\\b\\s+https?://[^\\s]*u\\.jd\\.com/[^\\s]+"); + // 也支持 URL 在前,后面跟价格: https://u.jd.com/xxxxx 1428.28 + private static final Pattern UJD_AND_PRICE_PATTERN = Pattern.compile("(?i)https?://[^\\s]*u\\.jd\\.com/[^\\s]+\\s+\\b(\\d{1,6}(?:\\.\\d{1,2})?)\\b"); + /** * 从线报消息中提取所有京东链接 * @@ -43,6 +48,67 @@ public class LineReportParser { return urls; } + /** + * 从行文本中提取每个短链接对应的价格(若存在)。 + * 仅关联 u.jd.com 短链,返回 Map + */ + public static Map extractPriceForUrls(String message) { + Map result = new LinkedHashMap<>(); + if (message == null || message.trim().isEmpty()) { + return result; + } + + // 逐行处理,减少跨行误配 + String[] lines = message.split("\r?\n"); + for (String line : lines) { + if (line == null || line.trim().isEmpty()) continue; + + // 价格在前 URL 在后 + Matcher m1 = PRICE_AND_UJD_PATTERN.matcher(line); + while (m1.find()) { + String priceStr = m1.group(1); + Double price = parsePrice(priceStr); + // 从匹配片段中继续提取 URL + String fragment = m1.group(); + Matcher urlM = JD_URL_PATTERN.matcher(fragment); + if (price != null && urlM.find()) { + String url = urlM.group(); + url = url.replaceAll("[\\s,,。!!??]+$", ""); + result.put(url, price); + } + } + + // URL 在前 价格在后 + Matcher m2 = UJD_AND_PRICE_PATTERN.matcher(line); + while (m2.find()) { + String fragment = m2.group(); + Matcher urlM = JD_URL_PATTERN.matcher(fragment); + String url = null; + if (urlM.find()) { + url = urlM.group(); + url = url.replaceAll("[\\s,,。!!??]+$", ""); + } + String priceStr = m2.group(1); + Double price = parsePrice(priceStr); + if (url != null && price != null) { + result.put(url, price); + } + } + } + + return result; + } + + private static Double parsePrice(String s) { + try { + if (s == null) return null; + String t = s.replace(",", "").trim(); + return Double.parseDouble(t); + } catch (Exception e) { + return null; + } + } + /** * 从线报消息中提取所有可能的SKUID *