From bbcf9bb7f4dce9a6b64339e49ea5d8787308f90d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8D=92?= Date: Wed, 5 Nov 2025 20:19:10 +0800 Subject: [PATCH] 1 --- .../service/impl/InstructionServiceImpl.java | 84 ++++++++++++++++--- .../mapper/jarvis/OrderRowsMapper.xml | 2 +- 2 files changed, 74 insertions(+), 12 deletions(-) diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java index 191f75e..23ed456 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/service/impl/InstructionServiceImpl.java @@ -1220,12 +1220,26 @@ private String handleTF(String input) { // 参照 JDUtil.parseOrderFromText private JDOrder parseOrderFromText(String input) { - input = input.replaceAll("\\s+", " ").trim(); + // 不要替换所有空格,保留换行符用于正确解析 Map fields = new HashMap<>(); + + // 先尝试新格式(带第三方单号和京粉实际价格) extractField(input, fields, "单:", "备注:"); extractField(input, fields, "备注:", "分销标记:"); - extractField(input, fields, "分销标记:", "第三方单号:"); - extractField(input, fields, "第三方单号:", "型号:"); + + // 检查是否有"第三方单号:"字段,如果没有则是旧格式 + boolean hasThirdPartyOrderNo = input.contains("第三方单号:"); + boolean hasJingfenPrice = input.contains("京粉实际价格:"); + + if (hasThirdPartyOrderNo) { + // 新格式:有第三方单号字段 + extractField(input, fields, "分销标记:", "第三方单号:"); + extractField(input, fields, "第三方单号:", "型号:"); + } else { + // 旧格式:分销标记后面直接是型号 + extractField(input, fields, "分销标记:", "型号:"); + } + extractField(input, fields, "型号:", "链接:"); extractField(input, fields, "链接:", "下单付款:"); extractField(input, fields, "下单付款:", "后返金额:"); @@ -1233,21 +1247,52 @@ private String handleTF(String input) { extractField(input, fields, "地址:", "物流链接:"); extractField(input, fields, "物流链接:", "订单号:"); extractField(input, fields, "订单号:", "下单人:"); - extractField(input, fields, "下单人:", "京粉实际价格:"); - extractField(input, fields, "京粉实际价格:", ""); - java.util.regex.Pattern buyerPattern = java.util.regex.Pattern.compile("下单人:\\s*(.*?)\\s*(?=京粉实际价格:|单:|\\Z)", java.util.regex.Pattern.DOTALL); + + if (hasJingfenPrice) { + // 新格式:有京粉实际价格字段 + extractField(input, fields, "下单人:", "京粉实际价格:"); + extractField(input, fields, "京粉实际价格:", ""); + } else { + // 旧格式:下单人后面没有京粉实际价格 + extractField(input, fields, "下单人:", ""); + } + + // 使用正则提取下单人(兼容新旧格式) + String nextField = hasJingfenPrice ? "京粉实际价格:" : "单:"; + java.util.regex.Pattern buyerPattern = java.util.regex.Pattern.compile("下单人:\\s*(.*?)\\s*(?=" + nextField + "|\\Z)", java.util.regex.Pattern.DOTALL); java.util.regex.Matcher buyerMatcher = buyerPattern.matcher(input); if (buyerMatcher.find()) { - fields.put("下单人", buyerMatcher.group(1).trim()); + String buyer = buyerMatcher.group(1).trim(); + // 如果提取的内容包含换行符,可能是提取过度了,只取第一行 + if (buyer.contains("\n")) { + buyer = buyer.split("\n")[0].trim(); + } + fields.put("下单人", buyer); } JDOrder order = new JDOrder(); order.setRemark(fields.getOrDefault("单", null)); - order.setDistributionMark(fields.getOrDefault("分销标记", null)); + + // 处理分销标记:如果提取的内容包含换行符,说明可能提取过度了,只取第一行 + String distributionMark = fields.getOrDefault("分销标记", null); + if (distributionMark != null && distributionMark.contains("\n")) { + // 如果包含换行符,只取第一行,并清理可能的额外内容 + String firstLine = distributionMark.split("\n")[0].trim(); + // 检查第一行是否包含其他字段的关键词(如"型号:"),如果有则截断 + if (firstLine.contains("型号:") || firstLine.contains("链接:")) { + int index = firstLine.indexOf("型号:"); + if (index < 0) index = firstLine.indexOf("链接:"); + if (index > 0) { + firstLine = firstLine.substring(0, index).trim(); + } + } + distributionMark = firstLine; + } + order.setDistributionMark(distributionMark); + // 优先从字段中获取第三方单号,如果没有则从分销标记中提取 String thirdPartyOrderNo = fields.getOrDefault("第三方单号", null); if (thirdPartyOrderNo == null || thirdPartyOrderNo.trim().isEmpty()) { - String distributionMark = fields.getOrDefault("分销标记", null); if (distributionMark != null && !distributionMark.isEmpty()) { thirdPartyOrderNo = extractOrderNumber(distributionMark); } @@ -1289,10 +1334,27 @@ private String handleTF(String input) { } private void extractField(String input, Map map, String startKeyword, String endKeyword) { - java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(startKeyword + "\\s*(.*?)\\s*(?=" + endKeyword + "|\\Z)", java.util.regex.Pattern.DOTALL); + // 如果结束关键词为空,匹配到字符串末尾 + String endPattern = endKeyword.isEmpty() ? "\\Z" : endKeyword; + java.util.regex.Pattern pattern = java.util.regex.Pattern.compile(startKeyword + "\\s*(.*?)\\s*(?=" + endPattern + ")", java.util.regex.Pattern.DOTALL); java.util.regex.Matcher matcher = pattern.matcher(input); if (matcher.find()) { - String value = matcher.group(1).trim().replaceAll("^" + startKeyword, "").trim(); + String value = matcher.group(1).trim(); + // 移除可能的前缀(如果value以startKeyword开头) + if (value.startsWith(startKeyword)) { + value = value.substring(startKeyword.length()).trim(); + } + // 如果值包含换行符,且结束关键词存在,需要确保只取到第一个换行符或结束关键词之前 + if (!endKeyword.isEmpty() && value.contains("\n")) { + // 检查是否包含结束关键词 + int endIndex = value.indexOf(endKeyword); + if (endIndex >= 0) { + value = value.substring(0, endIndex).trim(); + } else { + // 如果找不到结束关键词,取第一个换行符之前的内容 + value = value.split("\n")[0].trim(); + } + } map.put(startKeyword.replace(":", ""), value); } } diff --git a/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml b/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml index aa0e2bf..edd4100 100644 --- a/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml @@ -124,7 +124,7 @@ and order_time >= #{params.beginTime} and order_time <= #{params.endTime} - +1 order by ${params.orderBy} ${params.isAsc}