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 f88d494..72a4573 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 @@ -43,6 +43,16 @@ public class InstructionServiceImpl implements IInstructionService { if (input.startsWith("京") || menuKeywords().contains(input)) { return handleJingFen(input.replaceFirst("^京", "")); } + // TF/H/生 生成类指令 + if (input.startsWith("TF")) { + return handleTF(input); + } + if (input.startsWith("H")) { + return handleH(input); + } + if (input.startsWith("生")) { + return handleSheng(input); + } if (input.startsWith("录单") || input.startsWith("慢单") || input.startsWith("慢搜") || input.startsWith("慢查") || input.startsWith("单")) { return handleRecordLike(input); } @@ -157,6 +167,122 @@ public class InstructionServiceImpl implements IInstructionService { return helpText(); } + // ===== TF/H/生 处理 ===== + private static final Map PRODUCT_WITH_JF = new HashMap<>(); + static { + PRODUCT_WITH_JF.put("ZQD130F-EB130", "https://u.jd.com/Y6ZKmwN"); + PRODUCT_WITH_JF.put("ZQD130F-EB130B", "https://u.jd.com/YGZKHZS"); + PRODUCT_WITH_JF.put("ZQD150F-EB150", " https://u.jd.com/YDZK5rD"); + PRODUCT_WITH_JF.put("ZQD180F-EB200", "https://u.jd.com/YDZKmb2"); + PRODUCT_WITH_JF.put("CXW-298-IQ92DPRO", "https://u.jd.com/Y1AMT2l"); + } + + private String handleTF(String input) { + String raw = input.replaceFirst("^TF", "").trim(); + 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 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 jf = PRODUCT_WITH_JF.getOrDefault(model, ""); + + StringBuilder sheng = new StringBuilder(); + sheng.append("生\n") + .append("H-TF\n") + .append(model).append("\n") + .append(jf).append("\n") + .append(quantity).append("\n") + .append(address); + return generateOrderText(sheng.toString()); + } + + private String handleH(String input) { + String[] lines = input.replaceFirst("^H", "").split("\n"); + if (lines.length < 3) return "H 指令需三行:姓名[后缀]\n电话\n地址 … [后缀] 型号"; + + String nameLine = lines[0].trim(); + String phone = lines[1].trim(); + String addressLine = lines[2].trim(); + + String name = extractChinese(nameLine); + String suffix = extractBetweenBrackets(nameLine); + + String modelNumber = extractLastNonChineseToken(addressLine); + String cleanedAddress = addressLine.replaceAll("\\[.*?]", "").replace(modelNumber, "").replaceAll("\\s+", " ").trim(); + String fullAddress = cleanedAddress + " 安装派送联系" + phone + (suffix.isEmpty()?"":"转" + suffix); + + StringBuilder sheng = new StringBuilder(); + sheng.append("生\n") + .append("H\n") + .append(modelNumber).append("\n") + .append("\n") // 转链链接留空 + .append("1\n") + .append(name).append(fullAddress); + return generateOrderText(sheng.toString()); + } + + private String handleSheng(String input) { + // 输入格式: + // 生\n分销标记\n型号\n转链链接\n数量\n地址 + String[] split = input.split("\n"); + if (split.length != 6) { + return "生 指令格式:\n生\n分销标记\n型号\n转链链接\n数量\n地址"; + } + return generateOrderText(input); + } + + private String generateOrderText(String shengInput) { + String[] split = shengInput.split("\n"); + // 第一行可能是 生 或 生{备注} + String head = split[0].trim(); + String remark = head.replace("生", "").trim(); + String fenxiao = split[1].trim(); + String model = split[2].trim(); + String link = split[3].trim(); + 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()); + StringBuilder out = new StringBuilder(); + for (int i = 1; i <= Math.max(1, num); i++) { + String orderId = today + String.format("%03d", i); + out.append("单:\n").append(orderId) + .append(" \n备注:").append(remark) + .append("\n分销标记:").append(fenxiao) + .append("\n型号:\n").append(model) + .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"); + } + return out.toString(); + } + + private String extractChinese(String s) { + Matcher m = Pattern.compile("[\\u4E00-\\u9FA5]+").matcher(s); + return m.find() ? m.group() : ""; + } + + private String extractBetweenBrackets(String s) { + int a = s.indexOf('['); int b = s.indexOf(']'); + if (a != -1 && b != -1 && b > a) return s.substring(a+1, b); + return ""; + } + + private String extractLastNonChineseToken(String s) { + String[] tokens = s.split("\\s+"); + String result = ""; + for (String t : tokens) { + if (!t.matches(".*[\\u4E00-\\u9FA5].*")) result = t; + } + return result; + } + private String handleTransferLike(String input) { // 前端仍复用已有 /jarvis/jdorder/generatePromotionContent 接口,这里仅提供一个回显占位 return "指令入口:请在\"一键转链\"页面使用(输入文案/链接后点生成)";