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 50fed97..f4eeb1c 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 @@ -622,7 +622,24 @@ private String handleTF(String input) { } String address = split[5].trim(); - // 与 JDUtil 一致:地址 24 小时去重校验(白名单放行) + // 第一重判断:从分销标记中提取订单编号进行去重(如 JY202510093195) + if (stringRedisTemplate != null) { + String orderNumber = extractOrderNumber(fenxiao); + if (orderNumber != null && !orderNumber.isEmpty()) { + String orderNumberKey = "order_number:" + orderNumber; + String existedOrderNumber = stringRedisTemplate.opsForValue().get(orderNumberKey); + if (existedOrderNumber != null) { + String warn = "[炸弹] [炸弹] [炸弹] 此订单编号(" + orderNumber + ")已经存在,请勿重复生成订单 [炸弹] [炸弹] [炸弹] "; + StringBuilder warnOut = new StringBuilder(); + warnOut.append(warn).append("\n"); + return warnOut.toString().trim(); + } + // 记录订单编号,24小时过期 + stringRedisTemplate.opsForValue().set(orderNumberKey, orderNumber, 1, TimeUnit.DAYS); + } + } + + // 第二重判断:地址 24 小时去重校验(白名单放行) if (stringRedisTemplate != null) { String addressKey = "address:" + address; String existed = stringRedisTemplate.opsForValue().get(addressKey); @@ -682,6 +699,23 @@ private String handleTF(String input) { return out.toString(); } + /** + * 从分销标记中提取订单编号 + * 例如:从 "H-TF(10.10 腾锋 JY202510093195)" 中提取 "JY202510093195" + */ + private String extractOrderNumber(String fenxiao) { + if (fenxiao == null || fenxiao.isEmpty()) { + return null; + } + // 匹配 JY 开头后跟数字的模式 + Pattern pattern = Pattern.compile("JY\\d+"); + Matcher matcher = pattern.matcher(fenxiao); + if (matcher.find()) { + return matcher.group(); + } + return null; + } + private String extractChinese(String s) { Matcher m = Pattern.compile("[\\u4E00-\\u9FA5]+").matcher(s); return m.find() ? m.group() : "";