diff --git a/src/main/java/cn/van/business/util/JDUtil.java b/src/main/java/cn/van/business/util/JDUtil.java
index 6988245..e46cf28 100644
--- a/src/main/java/cn/van/business/util/JDUtil.java
+++ b/src/main/java/cn/van/business/util/JDUtil.java
@@ -143,7 +143,7 @@ public class JDUtil {
*
* 订单号:
*/
- private static final String WENAN_D = "单:\n" + "{单号} \n备注:{单的备注}\n" + "分销标记:{分销标记}\n" + "型号:\n" + "{型号}" + "\n" + "链接:\n" + "{链接}" + "\n" + "下单付款:\n" + "\n" + "后返金额:\n" + "\n" + "地址:\n" + "{地址}" + "\n" + "物流链接:\n" + "\n" + "订单号:\n" + "\n" + "下单人:\n" + "\n";
+ private static final String WENAN_D = "单:\n" + "{单号} \n" + "分销标记:{分销标记}\n" + "第三方单号:\n" + "—————————\n" + "下单链接(必须用这个):\n" + "{链接}\n" + "下单地址(注意带分机):\n" + "{地址}\n" + "—————————\n" + "型号:{型号}\n" + "\n" + "下单人(需填):\n" + "\n" + "下单付款(注意核对):\n" + "\n" + "后返金额(注意核对):\n" + "\n" + "订单号(需填):\n" + "\n" + "物流链接(需填):\n" + "\n" + "备注(下单号码有变动/没法带分机号的写这里):\n" + "{单的备注}\n" + "—————————\n" + "京粉实际价格:不用填";
final WXUtil wxUtil;
private final StringRedisTemplate redisTemplate;
@@ -2885,58 +2885,82 @@ public class JDUtil {
public 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, "型号:", "链接:");
- extractField(input, fields, "链接:", "下单付款:");
- extractField(input, fields, "下单付款:", "后返金额:");
- extractField(input, fields, "后返金额:", "地址:");
- extractField(input, fields, "地址:", "物流链接:");
- extractField(input, fields, "物流链接:", "订单号:");
- extractField(input, fields, "订单号:", "下单人:");
-
- // 手动提取"下单人"
- Pattern buyerPattern = Pattern.compile("下单人:\\s*(.*?)\\s*(?=单:|\\Z)", Pattern.DOTALL);
- Matcher buyerMatcher = buyerPattern.matcher(input);
- if (buyerMatcher.find()) {
- fields.put("下单人", buyerMatcher.group(1).trim());
+ // 适配新模板格式的字段提取
+ // 新格式:单: -> 分销标记: -> 第三方单号: -> 下单链接(必须用这个): -> 下单地址(注意带分机): -> 型号: -> 下单人(需填): -> 下单付款(注意核对): -> 后返金额(注意核对): -> 订单号(需填): -> 物流链接(需填): -> 备注(下单号码有变动/没法带分机号的写这里):
+ // 使用更灵活的正则,支持分隔线"—————————"
+ extractFieldWithSeparator(input, fields, "单:", "分销标记:");
+ extractFieldWithSeparator(input, fields, "分销标记:", "第三方单号:");
+ extractFieldWithSeparator(input, fields, "第三方单号:", "下单链接(必须用这个):");
+ extractFieldWithSeparator(input, fields, "下单链接(必须用这个):", "下单地址(注意带分机):");
+ extractFieldWithSeparator(input, fields, "下单地址(注意带分机):", "型号:");
+ extractFieldWithSeparator(input, fields, "型号:", "下单人(需填):");
+ extractFieldWithSeparator(input, fields, "下单人(需填):", "下单付款(注意核对):");
+ extractFieldWithSeparator(input, fields, "下单付款(注意核对):", "后返金额(注意核对):");
+ extractFieldWithSeparator(input, fields, "后返金额(注意核对):", "订单号(需填):");
+ extractFieldWithSeparator(input, fields, "订单号(需填):", "物流链接(需填):");
+ extractFieldWithSeparator(input, fields, "物流链接(需填):", "备注(下单号码有变动/没法带分机号的写这里):");
+
+ // 手动提取"备注"字段(最后一个字段,可能后面有分隔线或"京粉实际价格")
+ Pattern remarkPattern = Pattern.compile("备注(下单号码有变动/没法带分机号的写这里):\\s*(.*?)\\s*(?=—————————|京粉实际价格|\\Z)", Pattern.DOTALL);
+ Matcher remarkMatcher = remarkPattern.matcher(input);
+ if (remarkMatcher.find()) {
+ String remarkValue = remarkMatcher.group(1).trim();
+ // 去掉可能的分隔线
+ remarkValue = remarkValue.replaceAll("^—————————\\s*", "").trim();
+ fields.put("备注", remarkValue);
}
// 构建 JDOrder 对象
JDOrder order = new JDOrder();
- order.setRemark(fields.getOrDefault("单", null));
+ // 单号(格式:2025-12-13 006)
+ String orderNo = fields.getOrDefault("单", "").trim();
+ order.setRemark(orderNo);
order.setDistributionMark(fields.getOrDefault("分销标记", null));
order.setModelNumber(fields.getOrDefault("型号", null));
- order.setLink(fields.getOrDefault("链接", null));
+ // 下单链接(必须用这个)
+ order.setLink(fields.getOrDefault("下单链接(必须用这个)", null));
+ // 备注字段
order.setStatus(fields.getOrDefault("备注", null));
+ // 第三方单号
+ String thirdPartyOrderNo = fields.getOrDefault("第三方单号", null);
+ if (thirdPartyOrderNo != null && !thirdPartyOrderNo.trim().isEmpty()) {
+ order.setThirdPartyOrderNo(thirdPartyOrderNo.trim());
+ }
try {
- order.setPaymentAmount(Double.parseDouble(fields.getOrDefault("下单付款", "0")));
+ String paymentStr = fields.getOrDefault("下单付款(注意核对)", "0").trim();
+ if (!paymentStr.isEmpty() && !paymentStr.equals("0")) {
+ order.setPaymentAmount(Double.parseDouble(paymentStr));
+ }
} catch (NumberFormatException ignored) {
}
try {
- order.setRebateAmount(Double.parseDouble(fields.getOrDefault("后返金额", "0")));
+ String rebateStr = fields.getOrDefault("后返金额(注意核对)", "0").trim();
+ if (!rebateStr.isEmpty() && !rebateStr.equals("0")) {
+ order.setRebateAmount(Double.parseDouble(rebateStr));
+ }
} catch (NumberFormatException ignored) {
}
- order.setAddress(fields.getOrDefault("地址", null));
- order.setLogisticsLink(extractFirstUrl(fields.getOrDefault("物流链接", "")));
- order.setOrderId(fields.getOrDefault("订单号", null));
- order.setBuyer(fields.getOrDefault("下单人", null));
+ // 下单地址(注意带分机)
+ order.setAddress(fields.getOrDefault("下单地址(注意带分机)", null));
+ order.setLogisticsLink(extractFirstUrl(fields.getOrDefault("物流链接(需填)", "")));
+ order.setOrderId(fields.getOrDefault("订单号(需填)", null));
+ order.setBuyer(fields.getOrDefault("下单人(需填)", null));
// 设置下单时间,格式为 yyyy-MM-dd HH:mm:ss
try {
- String dateStr = fields.getOrDefault("单", "").split(" ")[0];
- SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
- order.setOrderTime(sdf.parse(dateStr));
+ if (!orderNo.isEmpty()) {
+ String dateStr = orderNo.split("\\s+")[0]; // 从"2025-12-13 006"中提取日期部分
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ order.setOrderTime(sdf.parse(dateStr));
+ } else {
+ order.setOrderTime(new Date());
+ }
} catch (Exception e) {
order.setOrderTime(new Date());
}
@@ -2944,6 +2968,22 @@ public class JDUtil {
return order;
}
+ // 提取字段的方法(支持分隔线)
+ private void extractFieldWithSeparator(String input, Map map, String startKeyword, String endKeyword) {
+ // 支持分隔线"—————————"作为字段分隔符
+ Pattern pattern = Pattern.compile(startKeyword + "\\s*(.*?)\\s*(?=" + Pattern.quote(endKeyword) + "|—————————|\\Z)", Pattern.DOTALL);
+ Matcher matcher = pattern.matcher(input);
+
+ if (matcher.find()) {
+ String value = matcher.group(1).trim();
+ // 去掉可能的分隔线
+ value = value.replaceAll("^—————————\\s*", "").replaceAll("\\s*—————————$", "").trim();
+ // 去掉字段标签本身(如果被匹配到了)
+ value = value.replaceAll("^" + Pattern.quote(startKeyword), "").trim();
+ map.put(startKeyword.replace(":", ""), value);
+ }
+ }
+
// 提取字段的方法
private void extractField(String input, Map map, String startKeyword, String endKeyword) {
Pattern pattern = Pattern.compile(startKeyword + "\\s*(.*?)\\s*(?=" + endKeyword + "|\\Z)", Pattern.DOTALL);