Files
zyt/EXPRESS_TRACKING_SYNC_COMPLETE.md
T
2026-04-07 18:13:03 +08:00

245 lines
6.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 物流追踪系统同步完成报告
## 问题分析
### 用户疑问
"定时任务找不到快递单号,明明订单里有快递单号"
### 根本原因
定时任务查询的是 `zyt_express_tracking` 表(物流追踪表),而不是 `zyt_tcm_prescription_order` 表(订单表)。
这两个表是分离的:
- **订单表**:存储业务订单信息,包括快递单号
- **物流追踪表**:专门存储物流追踪信息和轨迹历史
需要将订单表中的快递单号同步到物流追踪表,定时任务才能找到并更新。
## 解决方案
### 1. 创建同步命令
创建了 `SyncTrackingNumbers` 命令,用于将订单表中的快递单号同步到物流追踪表。
**文件**`server/app/command/SyncTrackingNumbers.php`
**使用方法**
```bash
php think express:sync
```
### 2. 注册命令
`server/config/console.php` 中注册了两个命令:
```php
'commands' => [
'express:auto-update' => 'app\\command\\ExpressAutoUpdate', // 自动更新
'express:sync' => 'app\\command\\SyncTrackingNumbers', // 同步快递单号
],
```
### 3. 执行同步
```bash
$ php think express:sync
开始同步现有订单快递单号...
找到 1 个有快递单号的订单
跳过: JD0230761381812 (已存在)
========================================
同步完成!
========================================
总数: 1
成功: 0
跳过: 1
失败: 0
耗时: 0.28秒
```
## 当前状态
### 物流追踪记录状态
```
快递单号: JD0230761381812
快递公司: auto
当前状态: 3 - 已签收
是否签收: 是
自动更新: 禁用
下次更新时间: 1970-01-01 08:00:00 (0)
当前时间: 2026-04-07 17:12:50
是否应该更新: 否
不更新原因: 自动更新未启用 已签收 状态为终态
```
### 为什么定时任务总数为0
**答案**:这是正常的!
这个快递单号已经是"已签收"状态(state=3),系统自动:
1. 停止了自动更新(`auto_update = 0`
2. 标记为已签收(`is_signed = 1`
3. 状态为终态(state = 3
**定时任务的过滤条件**
```php
$list = ExpressTracking::where('auto_update', 1) // ✗ 当前为0
->where('next_update_time', '<=', $now) // ✗ 当前为0
->where('is_signed', 0) // ✗ 当前为1
->whereNotIn('current_state', [3, 4, 5]) // ✗ 当前为3
->whereNull('delete_time')
->limit($limit)
->select();
```
所有条件都不满足,所以不会被查询到。这是设计的预期行为,避免浪费查询次数。
## 工作流程
### 新订单的物流追踪流程
1. **订单创建/编辑时**
```php
ExpressTrackingService::createOrUpdate([
'order_id' => $orderId,
'order_type' => 'prescription',
'tracking_number' => $trackingNumber,
'express_company' => $expressCompany,
'recipient_phone' => $phone,
'recipient_name' => $name,
'recipient_address' => $address,
]);
```
- 创建物流追踪记录
- 立即查询一次物流信息
- 设置 `auto_update = 1`(启用自动更新)
- 设置 `next_update_time = now`(立即更新)
2. **定时任务自动更新**
```bash
php think express:auto-update
```
- 每10分钟执行一次
- 只查询未签收的订单
- 更新物流信息和轨迹
- 检测状态变更
3. **签收后自动停止**
- 检测到签收状态(state=3)
- 设置 `is_signed = 1`
- 设置 `auto_update = 0`(停止自动更新)
- 记录签收时间
### 现有订单的同步
对于已有的订单(如当前的 JD0230761381812),需要手动同步:
```bash
# 同步现有订单快递单号
php think express:sync
# 同步后会立即查询一次物流信息
# 如果已签收,会自动停止更新
```
## 测试验证
### 1. 检查物流追踪记录
```bash
php check_tracking_status.php
```
### 2. 测试同步命令
```bash
php think express:sync
```
### 3. 测试自动更新
```bash
php think express:auto-update
```
### 4. 查看日志
```bash
tail -f runtime/log/202X-XX-XX.log
```
## 下一步操作
### 1. 集成到订单系统
在订单创建/编辑的控制器或逻辑层中添加:
**文件**`server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php`
```php
use app\common\service\ExpressTrackingService;
// 在保存订单后
if (!empty($params['tracking_number'])) {
ExpressTrackingService::createOrUpdate([
'order_id' => $orderId,
'order_type' => 'prescription',
'tracking_number' => $params['tracking_number'],
'express_company' => $params['express_company'] ?? 'auto',
'recipient_phone' => $params['recipient_phone'],
'recipient_name' => $params['recipient_name'],
'recipient_address' => $params['shipping_address'],
]);
}
```
### 2. 配置定时任务
#### Windows(任务计划程序)
```batch
schtasks /create /tn "ExpressAutoUpdate" /tr "php D:\web\zyt\server\think express:auto-update" /sc minute /mo 10
```
#### Linuxcrontab
```bash
crontab -e
# 添加以下行
0,10,20,30,40,50 * * * * cd /path/to/server && php think express:auto-update >> /dev/null 2>&1
```
### 3. 测试新订单
1. 创建一个新订单,填写快递单号
2. 检查 `zyt_express_tracking` 表是否自动创建记录
3. 等待10分钟,查看是否自动更新
4. 查看 `zyt_express_trace` 表是否有轨迹记录
## 相关文件
### 核心文件
- `server/app/common/service/ExpressTrackingService.php` - 物流追踪服务
- `server/app/command/ExpressAutoUpdate.php` - 自动更新命令
- `server/app/command/SyncTrackingNumbers.php` - 同步命令
- `server/config/console.php` - 命令注册
### 数据库
- `server/database/migrations/create_express_tracking_tables.sql` - 创建表
- `server/database/migrations/sync_existing_tracking_numbers.sql` - 同步SQL
### 工具脚本
- `server/install_tracking_tables.php` - 安装表
- `server/check_tracking_status.php` - 检查状态
### 文档
- `EXPRESS_TRACKING_SYSTEM.md` - 系统架构
- `EXPRESS_TRACKING_QUICKSTART.md` - 快速开始
- `EXPRESS_TRACKING_FIXES.md` - 修复记录
- `EXPRESS_TRACKING_COMMAND_FIX.md` - 命令修复
- `EXPRESS_TRACKING_SYNC_COMPLETE.md` - 本文档
## 总结
✅ 问题已解决:订单表和物流追踪表已同步
✅ 定时任务正常工作:正确过滤已签收订单
✅ 自动停止机制:签收后自动停止更新,节省查询次数
✅ 同步命令可用:`php think express:sync`
✅ 自动更新命令可用:`php think express:auto-update`
**当前状态**:系统已就绪,等待新订单测试。现有订单(JD0230761381812)已签收,不会再更新。
**建议**
1. 在订单创建/编辑时集成 `ExpressTrackingService::createOrUpdate()`
2. 配置定时任务(每10分钟执行一次)
3. 创建一个新的未签收订单进行完整测试