diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/OrderRowsController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/OrderRowsController.java index 91ab243..58b66d8 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/OrderRowsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/jarvis/OrderRowsController.java @@ -3,6 +3,7 @@ package com.ruoyi.web.controller.jarvis; import java.io.IOException; import java.util.*; import javax.servlet.http.HttpServletResponse; +import org.springframework.web.bind.annotation.RequestParam; import com.ruoyi.jarvis.domain.SuperAdmin; import com.ruoyi.jarvis.service.SuperAdminService; @@ -37,8 +38,28 @@ public class OrderRowsController extends BaseController * 查询京粉订单列表 */ @GetMapping("/list") - public TableDataInfo list(OrderRows orderRows) + public TableDataInfo list(OrderRows orderRows, @RequestParam(required = false) String orderBy, @RequestParam(required = false) String orderSort) { + // 处理排序参数:将 orderBy 和 orderSort 转换为 params 中的 orderBy 和 isAsc + if (orderBy != null && !orderBy.isEmpty()) { + if (orderRows.getParams() == null) { + orderRows.setParams(new HashMap<>()); + } + Map params = orderRows.getParams(); + // 将字段名转换为数据库列名 + if ("estimateCosPrice".equals(orderBy)) { + params.put("orderBy", "estimate_cos_price"); + } else { + params.put("orderBy", orderBy); + } + // 将 orderSort (asc/desc) 转换为 isAsc (asc/desc) + if ("asc".equals(orderSort)) { + params.put("isAsc", "asc"); + } else if ("desc".equals(orderSort)) { + params.put("isAsc", "desc"); + } + } + startPage(); List list = orderRowsService.selectOrderRowsList(orderRows); return getDataTable(list); diff --git a/ruoyi-system/src/main/java/com/ruoyi/jarvis/domain/JDOrder.java b/ruoyi-system/src/main/java/com/ruoyi/jarvis/domain/JDOrder.java index 762fbc9..2e13cf5 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/jarvis/domain/JDOrder.java +++ b/ruoyi-system/src/main/java/com/ruoyi/jarvis/domain/JDOrder.java @@ -78,6 +78,10 @@ public class JDOrder extends BaseEntity { @Excel(name = "参与统计") private Integer isCountEnabled; + /** 第三方单号 */ + @Excel(name = "第三方单号") + private String thirdPartyOrderNo; + } 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 75debc9..6ecad6a 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 @@ -42,7 +42,7 @@ public class InstructionServiceImpl implements IInstructionService { private IProductJdConfigService productJdConfigService; // 录单模板(与 jd/JDUtil 中 WENAN_D 保持一致) - 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"; @Override public List execute(String command) { @@ -805,7 +805,14 @@ private String handleTF(String input) { } private String handlePDD(String input) { - // 拼多多格式: + // 拼多多新格式: + // 拼多多251102-457567158704072 + // 赵政委[6947] + // 17283248756 + // 安徽省 宿州市 埇桥区 映月湾东区3栋103[6947] + // eb150 + + // 旧格式兼容: // 🕒 林[1518] // 17284023487 // 广西壮族自治区 柳州市 柳北区 绿城·杨柳郡柳园7栋[1518] @@ -813,62 +820,79 @@ private String handleTF(String input) { // 如果输入只是"拼多多",返回提示信息 if (input.equals("拼多多") || input.trim().equals("拼多多")) { - return "请粘贴拼多多格式数据:\n第一行:🕒 姓名[编号]\n第二行:电话\n第三行:地址[编号]\n第四行:型号\n\n示例:\n🕒 林[1518]\n17284023487\n广西壮族自治区 柳州市 柳北区 绿城·杨柳郡柳园7栋[1518]\neb150"; + return "请粘贴拼多多格式数据:\n新格式(推荐):\n拼多多251102-457567158704072\n赵政委[6947]\n17283248756\n安徽省 宿州市 埇桥区 映月湾东区3栋103[6947]\neb150\n\n旧格式(兼容):\n🕒 林[1518]\n17284023487\n广西壮族自治区 柳州市 柳北区 绿城·杨柳郡柳园7栋[1518]\neb150"; } - // 移除"拼多多"前缀(如果有) - String data = input.replaceFirst("^拼多多\\s*[\r\n]+", "").trim(); + String[] lines = input.split("\r?\n"); + String thirdPartyOrderNo = null; + int nameLineIndex = 0; + boolean isNewFormat = false; - String[] lines = data.split("\r?\n"); - if (lines.length < 4) { - return "拼多多格式错误,需要4行数据:\n1. 🕒 姓名[编号]\n2. 电话\n3. 地址[编号]\n4. 型号"; + // 检查是否是新格式(第一行包含"拼多多"后跟订单号) + if (lines.length > 0) { + String firstLine = lines[0].trim(); + // 匹配格式:拼多多数字-数字(如:拼多多251102-457567158704072) + Pattern orderNoPattern = Pattern.compile("拼多多(\\d+-\\d+)"); + Matcher matcher = orderNoPattern.matcher(firstLine); + if (matcher.find()) { + thirdPartyOrderNo = matcher.group(1); // 提取订单号部分(不含"拼多多") + isNewFormat = true; + nameLineIndex = 1; // 新格式下,姓名在第二行 + } else { + // 旧格式:移除"拼多多"前缀(如果有) + String data = input.replaceFirst("^拼多多\\s*[\r\n]+", "").trim(); + lines = data.split("\r?\n"); + nameLineIndex = 0; + } } - // 解析第一行:🕒 林[1518] -> 提取姓名 - String nameLine = lines[0].trim(); - // 先移除"拼多多"文本(如果存在) - nameLine = nameLine.replace("拼多多", "").trim(); + // 检查行数 + int requiredLines = isNewFormat ? 5 : 4; + if (lines.length < requiredLines) { + return "拼多多格式错误,需要" + requiredLines + "行数据:" + (isNewFormat ? + "\n1. 拼多多订单号\n2. 姓名[编号]\n3. 电话\n4. 地址[编号]\n5. 型号" : + "\n1. 🕒 姓名[编号]\n2. 电话\n3. 地址[编号]\n4. 型号"); + } + + // 解析姓名行 + String nameLine = lines[nameLineIndex].trim(); // 移除emoji和特殊字符,提取中文姓名 String name = extractChinese(nameLine); // 如果提取失败,尝试直接从第一行提取(去除emoji、符号和括号内容后剩余的中文) if (name.isEmpty()) { // 移除所有emoji和特殊符号,只保留中文 String cleaned = nameLine.replaceAll("[🕒\\[\\]]", "").replaceAll("\\[.*?\\]", "").trim(); - // 再次移除"拼多多"(防止遗漏) - cleaned = cleaned.replace("拼多多", "").trim(); // 只保留中文字符 name = extractChinese(cleaned); - } else { - // 确保提取的姓名不包含"拼多多" - if (name.contains("拼多多")) { - name = name.replace("拼多多", "").trim(); - } } // 提取编号(如果有) String suffix = extractBetweenBrackets(nameLine); - // 解析第二行:电话 - String phone = lines[1].trim(); + // 解析电话行 + int phoneLineIndex = nameLineIndex + 1; + String phone = lines[phoneLineIndex].trim(); - // 解析第三行:地址 -> 去除编号括号 - String addressLine = lines[2].trim(); + // 解析地址行 + int addressLineIndex = nameLineIndex + 2; + String addressLine = lines[addressLineIndex].trim(); // 移除编号括号和其中的内容 String address = addressLine.replaceAll("\\[.*?]", "").trim(); - // 解析第四行:型号 - String modelNumber = lines[3].trim(); + // 解析型号行 + int modelLineIndex = nameLineIndex + 3; + String modelNumber = lines[modelLineIndex].trim(); // 清洗型号 modelNumber = sanitizeModel(modelNumber); // 构建完整地址:姓名 + 固定号码(13068923963) + 地址 + 原始电话 + 转 + 编号 - // 格式:林 13068923963 广西壮族自治区 柳州市 柳北区 绿城·杨柳郡柳园7栋 17284023487转1518 + // 格式:赵政委 13068923963 安徽省 宿州市 埇桥区 映月湾东区3栋103 17283248756转6947 StringBuilder fullAddress = new StringBuilder(); // 确保姓名不为空,如果仍为空则使用默认值(但这种情况应该不会发生) if (!name.isEmpty()) { fullAddress.append(name); } else { // 如果姓名提取失败,记录日志(生产环境可以移除) - System.err.println("警告:拼多多格式姓名提取失败,第一行内容:" + nameLine); + System.err.println("警告:拼多多格式姓名提取失败,姓名行内容:" + nameLine); } // 固定的号码 fullAddress.append(" 13068923963 "); @@ -883,10 +907,16 @@ private String handleTF(String input) { // 获取转链链接 String jf = productJdConfigService.getJdUrlByProductModel(modelNumber); + // 构建分销标记:如果有第三方单号,则包含在括号中 + String distributionMark = "PDD"; + if (thirdPartyOrderNo != null && !thirdPartyOrderNo.isEmpty()) { + distributionMark = "PDD(" + thirdPartyOrderNo + ")"; + } + // 构建"生"指令格式 StringBuilder sheng = new StringBuilder(); sheng.append("生\n") - .append("PDD") // 分销标记:拼多多 + .append(distributionMark) // 分销标记:拼多多(包含第三方单号) .append("\n") .append(modelNumber) .append("\n") @@ -981,10 +1011,14 @@ private String handleTF(String input) { } } + // 从分销标记中提取第三方单号 + String thirdPartyOrderNo = extractOrderNumber(fenxiao); + String thirdPartyOrderNoValue = (thirdPartyOrderNo != null && !thirdPartyOrderNo.isEmpty()) ? thirdPartyOrderNo : ""; + for (int i = 0; i < total; i++) { int currentCount = startCount + i; String orderId = today + String.format("%03d", currentCount); - String current = WENAN_D.replace("{单号}", orderId).replace("{单的备注}", remark).replace("{分销标记}", fenxiao).replace("{链接}", link).replace("{地址}", address).replace("{型号}", model).replaceAll("[|]", ""); + String current = WENAN_D.replace("{单号}", orderId).replace("{单的备注}", remark).replace("{分销标记}", fenxiao).replace("{第三方单号}", thirdPartyOrderNoValue).replace("{链接}", link).replace("{地址}", address).replace("{型号}", model).replaceAll("[|]", ""); out.append(current); if (i < total - 1) out.append("\n"); } @@ -994,16 +1028,27 @@ private String handleTF(String input) { /** * 从分销标记中提取订单编号 * 例如:从 "H-TF(10.10 腾锋 JY202510093195)" 中提取 "JY202510093195" + * 例如:从 "PDD(251102-457567158704072)" 中提取 "251102-457567158704072" */ 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(); + // 优先匹配 JY 开头后跟数字的模式(TF订单) + Pattern jyPattern = Pattern.compile("JY\\d+"); + Matcher jyMatcher = jyPattern.matcher(fenxiao); + if (jyMatcher.find()) { + return jyMatcher.group(); + } + // 匹配拼多多订单号格式:数字-数字(在括号内) + Pattern pddPattern = Pattern.compile("\\(([\\d-]+)\\)"); + Matcher pddMatcher = pddPattern.matcher(fenxiao); + if (pddMatcher.find()) { + String orderNo = pddMatcher.group(1); + // 验证格式是否为数字-数字(拼多多格式) + if (orderNo.matches("\\d+-\\d+")) { + return orderNo; + } } return null; } @@ -1152,7 +1197,8 @@ private String handleTF(String input) { 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, "下单付款:", "后返金额:"); @@ -1169,6 +1215,15 @@ private String handleTF(String input) { JDOrder order = new JDOrder(); order.setRemark(fields.getOrDefault("单", null)); order.setDistributionMark(fields.getOrDefault("分销标记", null)); + // 优先从字段中获取第三方单号,如果没有则从分销标记中提取 + String thirdPartyOrderNo = fields.getOrDefault("第三方单号", null); + if (thirdPartyOrderNo == null || thirdPartyOrderNo.trim().isEmpty()) { + String distributionMark = fields.getOrDefault("分销标记", null); + if (distributionMark != null && !distributionMark.isEmpty()) { + thirdPartyOrderNo = extractOrderNumber(distributionMark); + } + } + order.setThirdPartyOrderNo(thirdPartyOrderNo != null && !thirdPartyOrderNo.trim().isEmpty() ? thirdPartyOrderNo.trim() : null); order.setModelNumber(fields.getOrDefault("型号", null)); order.setLink(fields.getOrDefault("链接", null)); order.setStatus(fields.getOrDefault("备注", null)); diff --git a/ruoyi-system/src/main/resources/mapper/jarvis/JDOrderMapper.xml b/ruoyi-system/src/main/resources/mapper/jarvis/JDOrderMapper.xml index e0a01bf..3a49896 100644 --- a/ruoyi-system/src/main/resources/mapper/jarvis/JDOrderMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/jarvis/JDOrderMapper.xml @@ -19,11 +19,12 @@ + select id, remark, distribution_mark, model_number, link, payment_amount, rebate_amount, - address, logistics_link, order_id, buyer, order_time, create_time, update_time, status, is_count_enabled + address, logistics_link, order_id, buyer, order_time, create_time, update_time, status, is_count_enabled, third_party_order_no from jd_order @@ -95,11 +96,11 @@ insert into jd_order ( remark, distribution_mark, model_number, link, payment_amount, rebate_amount, address, logistics_link, - order_id, buyer, order_time, create_time, update_time, status, is_count_enabled + order_id, buyer, order_time, create_time, update_time, status, is_count_enabled, third_party_order_no ) values ( #{remark}, #{distributionMark}, #{modelNumber}, #{link}, #{paymentAmount}, #{rebateAmount}, #{address}, #{logisticsLink}, - #{orderId}, #{buyer}, #{orderTime}, now(), now(), #{status}, #{isCountEnabled} + #{orderId}, #{buyer}, #{orderTime}, now(), now(), #{status}, #{isCountEnabled}, #{thirdPartyOrderNo} ) @@ -119,6 +120,7 @@ order_time = #{orderTime}, status = #{status}, is_count_enabled = #{isCountEnabled}, + third_party_order_no = #{thirdPartyOrderNo}, update_time = now() where id = #{id} diff --git a/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml b/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml index 56272c3..aa0e2bf 100644 --- a/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/jarvis/OrderRowsMapper.xml @@ -124,7 +124,14 @@ and order_time >= #{params.beginTime} and order_time <= #{params.endTime} - order by order_time desc + + + order by ${params.orderBy} ${params.isAsc} + + + order by order_time desc + + diff --git a/sql/add_third_party_order_no_field.sql b/sql/add_third_party_order_no_field.sql new file mode 100644 index 0000000..4aeaf34 --- /dev/null +++ b/sql/add_third_party_order_no_field.sql @@ -0,0 +1,4 @@ +-- 为京东订单表添加第三方单号字段 +-- 字段说明:third_party_order_no 存储第三方平台的订单号 +ALTER TABLE jd_order ADD COLUMN third_party_order_no VARCHAR(255) DEFAULT NULL COMMENT '第三方单号'; +