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 72a4573..393993d 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 @@ -17,6 +17,8 @@ import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import org.springframework.data.redis.core.StringRedisTemplate; +import java.util.concurrent.TimeUnit; /** * 将 jd 项目中 JDUtil 的指令能力,抽取为无微信依赖的本地执行版。 @@ -31,6 +33,8 @@ public class InstructionServiceImpl implements IInstructionService { private IJDOrderService jdOrderService; @Resource private SuperAdminService superAdminService; + @Resource + private StringRedisTemplate stringRedisTemplate; @Override public String execute(String command) { @@ -182,12 +186,13 @@ public class InstructionServiceImpl implements IInstructionService { if (raw.isEmpty()) return "TF 指令格式:TF\t型号\t数量\t地址(可含其它字段)"; String[] parts = raw.split("\t"); if (parts.length < 3) return "TF 指令至少包含:型号、数量、地址 三段(以制表符分隔)"; - String model = parts[0].trim(); + String model = sanitizeModel(parts[0]); String quantityStr = parts[1].trim(); int quantity; try { quantity = Integer.parseInt(quantityStr); } catch (Exception e) { return "数量格式错误"; } StringBuilder address = new StringBuilder(); for (int i = 2; i < parts.length; i++) address.append(parts[i]); + String addressClean = sanitizeAddress(address.toString()); String jf = PRODUCT_WITH_JF.getOrDefault(model, ""); StringBuilder sheng = new StringBuilder(); @@ -196,7 +201,7 @@ public class InstructionServiceImpl implements IInstructionService { .append(model).append("\n") .append(jf).append("\n") .append(quantity).append("\n") - .append(address); + .append(addressClean); return generateOrderText(sheng.toString()); } @@ -232,7 +237,11 @@ public class InstructionServiceImpl implements IInstructionService { if (split.length != 6) { return "生 指令格式:\n生\n分销标记\n型号\n转链链接\n数量\n地址"; } - return generateOrderText(input); + // 轻度清洗:移除**、| 等噪声 + split[2] = sanitizeModel(split[2]); + split[3] = sanitizeLink(split[3]); + split[5] = sanitizeAddress(split[5]); + return generateOrderText(String.join("\n", split)); } private String generateOrderText(String shengInput) { @@ -246,11 +255,17 @@ public class InstructionServiceImpl implements IInstructionService { int num = 1; try { num = Integer.parseInt(split[4].trim()); } catch (Exception ignore) {} String address = split[5].trim(); - String today = new java.text.SimpleDateFormat("yyyy-MM-dd ").format(new Date()); + String redisKey = "order_count:" + today; StringBuilder out = new StringBuilder(); - for (int i = 1; i <= Math.max(1, num); i++) { - String orderId = today + String.format("%03d", i); + int total = Math.max(1, num); + for (int i = 0; i < total; i++) { + Long curr = stringRedisTemplate != null ? stringRedisTemplate.opsForValue().increment(redisKey) : null; + if (curr != null && Boolean.TRUE.equals(stringRedisTemplate.getExpire(redisKey) == null || stringRedisTemplate.getExpire(redisKey) <= 0 ? Boolean.TRUE : Boolean.FALSE)) { + stringRedisTemplate.expire(redisKey, 1, TimeUnit.DAYS); + } + String seq = curr == null ? String.format("%03d", i + 1) : String.format("%03d", curr); + String orderId = today + seq; out.append("单:\n").append(orderId) .append(" \n备注:").append(remark) .append("\n分销标记:").append(fenxiao) @@ -258,7 +273,7 @@ public class InstructionServiceImpl implements IInstructionService { .append("\n链接:\n").append(link) .append("\n下单付款:\n\n后返金额:\n\n地址:\n").append(address) .append("\n物流链接:\n\n订单号:\n\n下单人:\n\n"); - if (i < num) out.append("\n"); + if (i < total - 1) out.append("\n"); } return out.toString(); } @@ -283,6 +298,38 @@ public class InstructionServiceImpl implements IInstructionService { return result; } + // ===== 文本清洗 ===== + private String sanitizeModel(String s) { + if (s == null) return ""; + s = s.replace("\\n", ""); + s = removeNoiseSymbols(s); + return normalizeWhitespace(s); + } + + private String sanitizeAddress(String s) { + if (s == null) return ""; + s = s.replaceAll("\\[.*?]", ""); + s = removeNoiseSymbols(s); + return normalizeWhitespace(s); + } + + private String sanitizeLink(String s) { + if (s == null) return ""; + return normalizeWhitespace(s.trim()); + } + + private String removeNoiseSymbols(String s) { + // 移除常见噪声:**、*、|(含全角)、零宽字符等 + s = s.replaceAll("\\*+", ""); + s = s.replace("|", "").replace("|", ""); + s = s.replace("\u200B", "").replace("\uFEFF", ""); + return s; + } + + private String normalizeWhitespace(String s) { + return s.replaceAll("[\\t ]+", " ").replaceAll("\n{3,}", "\n\n").trim(); + } + private String handleTransferLike(String input) { // 前端仍复用已有 /jarvis/jdorder/generatePromotionContent 接口,这里仅提供一个回显占位 return "指令入口:请在\"一键转链\"页面使用(输入文案/链接后点生成)";