This commit is contained in:
2025-11-05 20:19:10 +08:00
parent 0c1c19170d
commit bbcf9bb7f4
2 changed files with 74 additions and 12 deletions

View File

@@ -1220,12 +1220,26 @@ private String handleTF(String input) {
// 参照 JDUtil.parseOrderFromText
private JDOrder parseOrderFromText(String input) {
input = input.replaceAll("\\s+", " ").trim();
// 不要替换所有空格,保留换行符用于正确解析
Map<String, String> 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<String, String> 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);
}
}

View File

@@ -124,7 +124,7 @@
<if test="params.beginTime != null"> and order_time &gt;= #{params.beginTime}</if>
<if test="params.endTime != null"> and order_time &lt;= #{params.endTime}</if>
</where>
<choose>
1 <choose>
<when test="params.orderBy != null and params.orderBy != ''">
order by ${params.orderBy} ${params.isAsc}
</when>