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

336 lines
7.6 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.
# 物流追踪系统 - 快速开始
## 5分钟快速部署
### 1. 安装数据库表
**Linux/Mac:**
```bash
chmod +x install_express_tracking.sh
./install_express_tracking.sh
```
**Windows:**
```cmd
install_express_tracking.bat
```
**或手动执行SQL:**
```bash
mysql -u root -p your_database < server/database/migrations/create_express_tracking_tables.sql
```
### 2. 注册命令
编辑 `server/config/console.php`,在 `commands` 数组中添加:
```php
'commands' => [
// ... 其他命令
'express:auto-update' => \app\command\ExpressAutoUpdate::class,
],
```
### 3. 测试命令
```bash
cd server
php think express:auto-update
```
应该看到:
```
开始自动更新物流信息...
更新完成!
总数: 0
成功: 0
失败: 0
耗时: 0.05秒
```
### 4. 配置定时任务
**Linux/Mac (crontab):**
```bash
crontab -e
# 添加以下行(每10分钟执行)
*/10 * * * * cd /path/to/your/server && php think express:auto-update >> /dev/null 2>&1
```
**Windows (计划任务):**
```cmd
schtasks /create /tn "ExpressAutoUpdate" /tr "php D:\path\to\server\think express:auto-update" /sc minute /mo 10
```
---
## 使用示例
### 示例1:订单发货时创建追踪
```php
use app\common\service\ExpressTrackingService;
// 在订单发货时调用
$tracking = ExpressTrackingService::createOrUpdate([
'order_id' => $order->id,
'order_type' => 'prescription',
'tracking_number' => 'JD0230761381812',
'express_company' => 'jd',
'recipient_phone' => $order->recipient_phone,
'recipient_name' => $order->recipient_name,
'recipient_address' => $order->shipping_address,
]);
// 系统会:
// 1. 创建追踪记录
// 2. 立即查询物流信息
// 3. 存储到数据库
// 4. 开始自动更新
```
### 示例2:查询物流详情
```php
// 获取完整物流信息
$detail = ExpressTrackingService::getDetail($trackingId);
// 返回数据包含:
// - 基本信息(单号、快递公司、收件人等)
// - 当前状态(在途、派件、签收等)
// - 所有轨迹记录(时间、内容、位置)
// - 状态变更历史
```
### 示例3:手动更新
```php
// 手动触发更新
$result = ExpressTrackingService::queryAndUpdate($trackingId, false);
// 返回最新的物流信息
```
---
## 集成到现有系统
### 修改订单创建逻辑
`server/app/adminapi/logic/tcm/PrescriptionOrderLogic.php``create()` 方法中添加:
```php
public static function create(array $params, int $adminId, array $adminInfo)
{
// ... 原有代码
$order->save();
// 【新增】创建物流追踪
if (!empty($params['tracking_number'])) {
\app\common\service\ExpressTrackingService::createOrUpdate([
'order_id' => $order->id,
'order_type' => 'prescription',
'tracking_number' => $params['tracking_number'],
'express_company' => $params['express_company'] ?? 'auto',
'recipient_phone' => $order->recipient_phone,
'recipient_name' => $order->recipient_name,
'recipient_address' => $order->shipping_address,
]);
}
return $out;
}
```
### 修改订单编辑逻辑
`edit()` 方法中添加:
```php
public static function edit(array $params, int $adminId, array $adminInfo)
{
// ... 原有代码
$order->save();
// 【新增】更新物流追踪
if (array_key_exists('tracking_number', $params) && !empty($params['tracking_number'])) {
\app\common\service\ExpressTrackingService::createOrUpdate([
'order_id' => $order->id,
'order_type' => 'prescription',
'tracking_number' => $params['tracking_number'],
'express_company' => $order->express_company,
'recipient_phone' => $order->recipient_phone,
'recipient_name' => $order->recipient_name,
'recipient_address' => $order->shipping_address,
]);
}
return $out;
}
```
### 修改物流查询接口
`logisticsTrace()` 方法开头添加:
```php
public static function logisticsTrace(int $id, string $expressCompanyOverride, int $adminId, array $adminInfo): ?array
{
// ... 权限检查等原有代码
// 【新增】优先从数据库获取
$tracking = \app\common\model\ExpressTracking::where('order_id', $id)
->where('order_type', 'prescription')
->whereNull('delete_time')
->find();
if ($tracking) {
// 如果距离上次查询超过5分钟,重新查询
if (time() - $tracking->last_query_time > 300) {
\app\common\service\ExpressTrackingService::queryAndUpdate($tracking->id, false);
$tracking->refresh();
}
// 返回数据库中的数据
$traces = $tracking->traces->map(function($trace) {
return [
'time' => $trace->trace_time,
'context' => $trace->trace_context,
'status' => $trace->status,
'location' => $trace->location,
];
})->toArray();
$payload = [
'carrier' => $tracking->express_company,
'carrier_label' => $tracking->express_company_name,
'traces' => $traces,
'state' => $tracking->current_state,
'state_text' => $tracking->current_state_text,
'source' => $tracking->data_source,
'official_urls' => ExpressTrackService::officialUrls($tracking->tracking_number),
'tracking_number' => $tracking->tracking_number,
'is_signed' => $tracking->is_signed,
'estimated_arrival_time' => $tracking->estimated_arrival_time,
];
return $payload;
}
// 如果数据库中没有,走原有逻辑
// ... 原有查询代码
}
```
---
## 验证安装
### 1. 检查数据库表
```sql
SHOW TABLES LIKE 'zyt_express%';
-- 应该看到4个表:
-- zyt_express_tracking
-- zyt_express_trace
-- zyt_express_state_log
-- zyt_express_query_log
```
### 2. 测试创建追踪
```php
$tracking = ExpressTrackingService::createOrUpdate([
'order_id' => 1,
'order_type' => 'test',
'tracking_number' => 'JD0230761381812',
'express_company' => 'jd',
'recipient_phone' => '13800138000',
'recipient_name' => '测试',
'recipient_address' => '测试地址',
]);
var_dump($tracking->id); // 应该返回ID
```
### 3. 检查定时任务
```bash
# 查看crontab
crontab -l | grep express
# 手动执行一次
cd server && php think express:auto-update
# 查看日志
tail -f runtime/log/info.log
```
---
## 常见问题
### Q: 定时任务不执行?
**A:** 检查crontab配置和PHP路径
```bash
# 查看crontab
crontab -l
# 检查PHP路径
which php
# 查看cron日志
tail -f /var/log/cron
```
### Q: 快递100返回"找不到对应公司"
**A:** 账号未充值,请先充值快递100账户
- 登录:https://www.kuaidi100.com/
- 充值后重试
### Q: 如何停止某个快递的自动更新?
**A:**
```php
$tracking = ExpressTracking::find($id);
$tracking->auto_update = 0;
$tracking->save();
```
### Q: 如何修改更新频率?
**A:**
```php
// 修改单个追踪记录的更新间隔
$tracking->update_interval = 3600; // 1小时
$tracking->save();
// 或修改crontab执行频率
crontab -e
# 改为每30分钟: */30 * * * *
```
---
## 下一步
1. ✅ 确认快递100已充值
2. ✅ 集成到订单系统
3. ✅ 配置定时任务
4. ✅ 测试物流查询
5. 📖 阅读完整文档:`EXPRESS_TRACKING_SYSTEM.md`
---
## 技术支持
- 完整文档:`EXPRESS_TRACKING_SYSTEM.md`
- 快递100文档:https://api.kuaidi100.com/
- 问题排查:`KUAIDI100_TROUBLESHOOTING.md`