# 物流追踪系统 - 快速开始 ## 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`