diff --git a/src/main/java/cn/van/business/util/JDUtil.java b/src/main/java/cn/van/business/util/JDUtil.java index 4bec84c..6500822 100644 --- a/src/main/java/cn/van/business/util/JDUtil.java +++ b/src/main/java/cn/van/business/util/JDUtil.java @@ -2667,30 +2667,51 @@ public class JDUtil { // 生成当前日期 JDOrder jdOrder = parseOrderFromText(input.trim().replace("元", "")); - if (Util.isAnyEmpty(jdOrder.getOrderId(), jdOrder.getBuyer(), jdOrder.getOrderTime(), jdOrder.getPaymentAmount(), jdOrder.getRebateAmount(), jdOrder.getAddress(), jdOrder.getLogisticsLink(), jdOrder.getModelNumber(), jdOrder.getLink(), jdOrder.getOrderId(), jdOrder.getBuyer())) { - // 警告缺少的字段getOrderId - StringBuilder sb = new StringBuilder(); - if (Util.isEmpty(jdOrder.getOrderId())) { - sb.append("单号\n"); - } - if (Util.isEmpty(jdOrder.getBuyer())) { - sb.append("下单人\n"); - } - if (Util.isEmpty(jdOrder.getPaymentAmount())) { - sb.append("下单价格\n"); - } - if (Util.isEmpty(jdOrder.getRebateAmount())) { - sb.append("后返金额\n"); - } - if (Util.isEmpty(jdOrder.getLogisticsLink())) { - sb.append("物流链接\n"); - } - if (Util.isEmpty(jdOrder.getAddress())) { - sb.append("收货地址\n"); - } - if (Util.isEmpty(jdOrder.getModelNumber())) { - sb.append("型号\n"); - } + // 验证必填字段(根据新模板格式) + // 单号存储在remark字段中,订单号存储在orderId字段中 + StringBuilder sb = new StringBuilder(); + boolean hasError = false; + + if (Util.isEmpty(jdOrder.getRemark())) { + sb.append("单号\n"); + hasError = true; + } + if (Util.isEmpty(jdOrder.getBuyer())) { + sb.append("下单人\n"); + hasError = true; + } + if (Util.isEmpty(jdOrder.getPaymentAmount())) { + sb.append("下单价格\n"); + hasError = true; + } + if (Util.isEmpty(jdOrder.getRebateAmount())) { + sb.append("后返金额\n"); + hasError = true; + } + if (Util.isEmpty(jdOrder.getLogisticsLink())) { + sb.append("物流链接\n"); + hasError = true; + } + if (Util.isEmpty(jdOrder.getAddress())) { + sb.append("收货地址\n"); + hasError = true; + } + if (Util.isEmpty(jdOrder.getModelNumber())) { + sb.append("型号\n"); + hasError = true; + } + if (Util.isEmpty(jdOrder.getOrderTime())) { + sb.append("下单时间\n"); + hasError = true; + } + + if (hasError) { + // 添加调试信息:打印解析到的字段值 + logger.warn("录单解析失败,解析到的字段值: remark={}, buyer={}, paymentAmount={}, rebateAmount={}, logisticsLink={}, address={}, modelNumber={}, orderTime={}", + jdOrder.getRemark(), jdOrder.getBuyer(), jdOrder.getPaymentAmount(), + jdOrder.getRebateAmount(), jdOrder.getLogisticsLink(), jdOrder.getAddress(), + jdOrder.getModelNumber(), jdOrder.getOrderTime()); + for (int i = 0; i < 3; i++) { wxUtil.sendTextMessage(fromWxid, "[炸弹] [炸弹] [炸弹] 录单警告!!! \n缺少表单字段 \n" + sb, 1, fromWxid, true); } @@ -2917,8 +2938,8 @@ public class JDUtil { } } - // 调试:打印提取到的字段(可选,生产环境可以注释掉) - // logger.debug("解析到的字段: {}", fields); + // 调试:打印提取到的字段 + logger.info("解析到的字段: {}", fields); // 构建 JDOrder 对象 JDOrder order = new JDOrder(); @@ -2982,9 +3003,10 @@ public class JDUtil { String escapedStart = Pattern.quote(startKeyword); String escapedEnd = Pattern.quote(endKeyword); - // 匹配模式:startKeyword + 可选的空白和换行 + 字段值(非贪婪,支持多行) + 可选的空白和换行 + 后面是endKeyword或分隔线或结束 + // 匹配模式:startKeyword + 可选的空白和换行 + 字段值(非贪婪,支持多行) + 后面是换行+endKeyword或换行+分隔线或结束 // 使用[\s\S]来匹配包括换行在内的所有字符 - String patternStr = escapedStart + "[\\s\\n]*([\\s\\S]*?)(?=[\\s\\n]*" + escapedEnd + "|[\\s\\n]*—————————|\\Z)"; + // 改进:更精确地匹配字段值,确保能捕获到换行后的内容 + String patternStr = escapedStart + "[\\s\\n]*([\\s\\S]*?)(?=\\s*\\n?\\s*" + escapedEnd + "|\\s*\\n?\\s*—————————|\\Z)"; Pattern pattern = Pattern.compile(patternStr, Pattern.DOTALL); Matcher matcher = pattern.matcher(input); @@ -3001,11 +3023,18 @@ public class JDUtil { String key = startKeyword.replace(":", "").trim(); if (!value.isEmpty()) { map.put(key, value); + logger.debug("成功提取字段: {} = {}", key, value.length() > 50 ? value.substring(0, 50) + "..." : value); + } else { + logger.debug("字段值为空: {}", key); } + } else { + logger.debug("未找到字段值: startKeyword={}", startKeyword); } + } else { + logger.debug("正则未匹配: startKeyword={}, endKeyword={}", startKeyword, endKeyword); } } catch (Exception e) { - logger.warn("提取字段失败: startKeyword={}, endKeyword={}, error={}", startKeyword, endKeyword, e.getMessage()); + logger.warn("提取字段失败: startKeyword={}, endKeyword={}, error={}", startKeyword, endKeyword, e.getMessage(), e); } }