This commit is contained in:
2025-11-06 22:16:47 +08:00
parent 42c6c8bc23
commit 8d409157c5
2 changed files with 32 additions and 17 deletions

View File

@@ -141,7 +141,7 @@ if (phone != null && phoneCol != null) {
### 成功提取手机号码 ### 成功提取手机号码
``` ```
✓ 从备注中提取手机号码 - 单号: JY2025110601, 手机号: 13800138000 ✓ 从status字段提取手机号码 - 单号: JY2025110601, 手机号: 13800138000
✓ 准备写入手机号码 - 单号: JY2025110601, 手机号: 13800138000, 行: 3, 列: 6 ✓ 准备写入手机号码 - 单号: JY2025110601, 手机号: 13800138000, 行: 3, 列: 6
✓ 写入成功 - 行: 3, 单号: JY2025110601, 物流链接: https://3.cn/xxx, 手机号: 13800138000 ✓ 写入成功 - 行: 3, 单号: JY2025110601, 物流链接: https://3.cn/xxx, 手机号: 13800138000
``` ```
@@ -162,15 +162,16 @@ if (phone != null && phoneCol != null) {
## 使用示例 ## 使用示例
### 订单备注示例 ### 订单Status字段示例
| 备注内容 | 提取结果 | 说明 | | Status内容 | 提取结果 | 说明 |
|---------|---------|------| |---------|---------|------|
| `联系电话138 0013 8000` | `13800138000` | ✅ 成功提取 | | `联系电话138 0013 8000` | `13800138000` | ✅ 成功提取 |
| `手机号138-0013-8000` | `13800138000` | ✅ 成功提取 | | `手机号138-0013-8000` | `13800138000` | ✅ 成功提取 |
| `电话:(138)00138000` | `13800138000` | ✅ 成功提取 | | `电话:(138)00138000` | `13800138000` | ✅ 成功提取 |
| `13800138000 张三` | `13800138000` | ✅ 成功提取 | | `13800138000 张三` | `13800138000` | ✅ 成功提取 |
| `备注:无电话` | `null` | ❌ 未提取 | | `17703916233` | `17703916233` | ✅ 成功提取 |
| `无电话` | `null` | ❌ 未提取到 |
| `12345678901` | `null` | ❌ 不符合规则不是1开头 | | `12345678901` | `null` | ❌ 不符合规则不是1开头 |
| `1280013800` | `null` | ❌ 不符合规则第2位不是3-9 | | `1280013800` | `null` | ❌ 不符合规则第2位不是3-9 |
@@ -189,14 +190,14 @@ if (phone != null && phoneCol != null) {
### 向后兼容 ### 向后兼容
- ✅ 如果表头中**没有**"下单电话"列,功能自动跳过,不影响其他字段的同步 - ✅ 如果表头中**没有**"下单电话"列,功能自动跳过,不影响其他字段的同步
- ✅ 如果订单备注中**没有**手机号码,功能自动跳过,不影响其他字段的同步 - ✅ 如果订单status字段中**没有**手机号码,功能自动跳过,不影响其他字段的同步
- ✅ 不影响现有的物流链接、是否安排、标记字段的同步 - ✅ 不影响现有的物流链接、是否安排、标记字段的同步
### 可选性 ### 可选性
此功能是**完全可选**的: 此功能是**完全可选**的:
1. 不需要在表头中添加"下单电话"列 1. 不需要在表头中添加"下单电话"列
2. 订单备注可以不包含手机号码 2. 订单status字段可以不包含手机号码
3. 功能会自动识别和适配 3. 功能会自动识别和适配
## 测试建议 ## 测试建议
@@ -205,7 +206,7 @@ if (phone != null && phoneCol != null) {
1. **正常场景** 1. **正常场景**
- 表头包含"下单电话"列 - 表头包含"下单电话"列
- 订单备注包含手机号码 - 订单status字段包含手机号码
- 预期:手机号码正确写入 - 预期:手机号码正确写入
2. **无电话列场景** 2. **无电话列场景**
@@ -214,7 +215,7 @@ if (phone != null && phoneCol != null) {
3. **无手机号场景** 3. **无手机号场景**
- 表头包含"下单电话"列 - 表头包含"下单电话"列
- 订单备注不包含手机号码 - 订单status字段不包含手机号码
- 预期:其他字段正常同步,手机号码列为空 - 预期:其他字段正常同步,手机号码列为空
4. **多种格式场景** 4. **多种格式场景**
@@ -223,11 +224,11 @@ if (phone != null && phoneCol != null) {
### 测试步骤 ### 测试步骤
1. 在腾讯文档表头添加"下单电话"列 1. 在腾讯文档表头添加"下单电话"列(或"电话"、"手机"
2. 在订单备注中添加手机号码(不同格式 2. 确保订单的status字段包含手机号码例如17703916233
3. 点击"批量同步物流"按钮 3. 点击"批量同步物流"按钮
4. 查看日志,确认提取和写入成功 4. 查看后端日志,确认提取和写入成功
5. 查看腾讯文档,确认手机号码正确显示 5. 查看腾讯文档,确认手机号码正确显示在"下单电话"列
## 未来优化建议 ## 未来优化建议

View File

@@ -799,11 +799,15 @@ public class TencentDocController extends BaseController {
*/ */
private String extractPhoneFromRemark(String text) { private String extractPhoneFromRemark(String text) {
if (text == null || text.trim().isEmpty()) { if (text == null || text.trim().isEmpty()) {
log.debug("文本为空,无法提取手机号码");
return null; return null;
} }
log.debug("原始文本: [{}]", text);
// 移除所有空格、横线、括号等分隔符 // 移除所有空格、横线、括号等分隔符
String cleanedText = text.replaceAll("[\\s\\-\\(\\)\\[\\]\\\\】]", ""); String cleanedText = text.replaceAll("[\\s\\-\\(\\)\\[\\]\\\\】]", "");
log.debug("清理后文本: [{}]", cleanedText);
// 匹配11位手机号码1开头的11位数字 // 匹配11位手机号码1开头的11位数字
java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("1[3-9]\\d{9}"); java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("1[3-9]\\d{9}");
@@ -811,10 +815,11 @@ public class TencentDocController extends BaseController {
if (matcher.find()) { if (matcher.find()) {
String phone = matcher.group(); String phone = matcher.group();
log.debug("从文本中提取手机号码: {}", phone); log.info("成功提取手机号码: [{}] <- 原文本: [{}]", phone, text);
return phone; return phone;
} }
log.debug("未找到匹配的手机号码,文本: [{}]", text);
return null; return null;
} }
@@ -999,10 +1004,12 @@ public class TencentDocController extends BaseController {
} }
// 查找所有相关列 // 查找所有相关列
log.info("开始识别表头列,共 {} 列", headerRowData.size());
for (int i = 0; i < headerRowData.size(); i++) { for (int i = 0; i < headerRowData.size(); i++) {
String cellValue = headerRowData.getString(i); String cellValue = headerRowData.getString(i);
if (cellValue != null) { if (cellValue != null) {
String cellValueTrim = cellValue.trim(); String cellValueTrim = cellValue.trim();
log.debug("列 {} 内容: [{}]", i, cellValueTrim);
// 识别"单号"列 // 识别"单号"列
if (orderNoColumn == null && cellValueTrim.contains("单号")) { if (orderNoColumn == null && cellValueTrim.contains("单号")) {
@@ -1029,12 +1036,13 @@ public class TencentDocController extends BaseController {
} }
// 识别"下单电话"列(可选) // 识别"下单电话"列(可选)
if (phoneColumn == null && (cellValueTrim.contains("下单电话") || cellValueTrim.contains("电话") || cellValueTrim.contains("手机"))) { if (phoneColumn == null && (cellValueTrim.contains("下单电话"))) {
phoneColumn = i; phoneColumn = i;
log.info("✓ 识别到 '下单电话' 列:第 {} 列(索引{}", i + 1, i); log.info("✓ 识别到 '下单电话' 列:第 {} 列(索引{},列名: [{}]", i + 1, i, cellValueTrim);
} }
} }
} }
log.info("表头列识别完成");
// 检查必需的列是否都已识别 // 检查必需的列是否都已识别
if (orderNoColumn == null) { if (orderNoColumn == null) {
@@ -1188,10 +1196,16 @@ public class TencentDocController extends BaseController {
// 从status字段中提取手机号码 // 从status字段中提取手机号码
String phone = null; String phone = null;
if (phoneColumn != null) { if (phoneColumn != null) {
phone = extractPhoneFromRemark(order.getStatus()); String statusValue = order.getStatus();
log.debug("准备从status字段提取手机号 - 单号: {}, status内容: [{}]", orderNo, statusValue);
phone = extractPhoneFromRemark(statusValue);
if (phone != null) { if (phone != null) {
log.info("✓ 从status字段提取手机号码 - 单号: {}, 手机号: {}", orderNo, phone); log.info("✓ 从status字段提取手机号码 - 单号: {}, status: [{}], 手机号: {}", orderNo, statusValue, phone);
} else {
log.debug("未能从status字段提取手机号码 - 单号: {}, status: [{}]", orderNo, statusValue);
} }
} else {
log.debug("phoneColumn为null跳过手机号提取 - 单号: {}", orderNo);
} }
// 构建更新请求 // 构建更新请求