This commit is contained in:
2025-11-05 19:37:58 +08:00
parent 9dd567c86c
commit 5fbaf2e323
6 changed files with 141 additions and 41 deletions

View File

@@ -78,6 +78,10 @@ public class JDOrder extends BaseEntity {
@Excel(name = "参与统计")
private Integer isCountEnabled;
/** 第三方单号 */
@Excel(name = "第三方单号")
private String thirdPartyOrderNo;
}

View File

@@ -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<String> 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<String, String> 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));