createTestOrder(); if (!$orderId) { echo "❌ 创建测试订单失败,终止测试\n"; return false; } // 2. 测试订单分配 $this->testOrderDispatch($orderId); // 3. 模拟骑手接单 $this->simulateRiderAcceptOrder($orderId); // 4. 测试订单状态更新 $this->testOrderStatusUpdate($orderId); echo "\n=== 测试完成 ===\n"; return true; } /** * 创建测试订单 */ public function createTestOrder() { echo "1. 创建测试订单...\n"; try { // 创建骑手订单记录 $riderOrderModel = M('rider_order'); $orderData = [ 'bill_id' => 'TEST_' . date('YmdHis') . rand(1000, 9999), 'order_no' => 'RO' . date('YmdHis') . rand(1000, 9999), 'merchant_id' => $this->merchantId, 'store_id' => $this->storeId, 'customer_name' => '测试客户', 'customer_phone' => '13800138000', 'delivery_address' => '测试地址:北京市朝阳区测试街道123号', 'delivery_lat' => 39.9042, 'delivery_lng' => 116.4074, 'store_lat' => 39.9000, 'store_lng' => 116.4000, 'order_amount' => 58.50, 'delivery_fee' => 8.00, 'total_amount' => 66.50, 'order_type' => 1, // 外卖订单 'order_status' => 0, // 待分配 'rider_id' => 0, 'add_time' => date('Y-m-d H:i:s'), 'expected_delivery_time' => date('Y-m-d H:i:s', time() + 3600), // 1小时后 'order_items' => json_encode([ ['name' => '宫保鸡丁', 'price' => 28.00, 'quantity' => 1], ['name' => '蛋炒饭', 'price' => 18.00, 'quantity' => 1], ['name' => '紫菜蛋花汤', 'price' => 12.50, 'quantity' => 1] ]), 'remark' => '测试订单,请及时配送' ]; $orderId = $riderOrderModel->add($orderData); if ($orderId) { echo " ✅ 测试订单创建成功\n"; echo " 📋 订单ID: {$orderId}\n"; echo " 📋 订单号: {$orderData['order_no']}\n"; echo " 💰 订单金额: ¥{$orderData['total_amount']}\n"; echo " 📍 配送地址: {$orderData['delivery_address']}\n\n"; return $orderId; } else { echo " ❌ 订单创建失败\n\n"; return false; } } catch (Exception $e) { echo " ❌ 创建订单异常: " . $e->getMessage() . "\n\n"; return false; } } /** * 测试订单分配 */ public function testOrderDispatch($orderId) { echo "2. 测试订单分配...\n"; try { // 获取订单信息 $riderOrderModel = M('rider_order'); $orderInfo = $riderOrderModel->find($orderId); if (!$orderInfo) { echo " ❌ 订单不存在\n\n"; return false; } // 使用订单分配业务类 if (class_exists('Common\Business\RiderOrderDispatch')) { $dispatch = new \Common\Business\RiderOrderDispatch(); // 测试获取可用骑手 echo " 🔍 获取可用骑手...\n"; $availableResult = $dispatch->getAvailableRiders($orderInfo); if ($availableResult['status'] == 1 && !empty($availableResult['data'])) { $riders = $availableResult['data']; echo " ✅ 找到 " . count($riders) . " 个可用骑手\n"; foreach ($riders as $index => $rider) { echo " 骑手" . ($index + 1) . ": {$rider['rider_name']} (ID: {$rider['id']})\n"; echo " 状态: " . ($rider['work_status'] == 1 ? '在线' : '离线') . "\n"; echo " 认证: " . ($rider['auth_status'] == 2 ? '已认证' : '未认证') . "\n"; if (isset($rider['distance'])) { echo " 距离: {$rider['distance']}km\n"; } } // 测试自动分配 echo "\n 🎯 测试自动分配...\n"; $dispatchParam = [ 'bill_id' => $orderInfo['bill_id'], 'merchant_id' => $orderInfo['merchant_id'], 'store_id' => $orderInfo['store_id'], 'auto_assign' => true ]; $dispatchResult = $dispatch->dispatchOrder($dispatchParam); if ($dispatchResult['status'] == 1) { echo " ✅ 自动分配成功\n"; if (isset($dispatchResult['data']['rider_name'])) { echo " 👤 分配给骑手: {$dispatchResult['data']['rider_name']}\n"; } } else { echo " ⚠️ 自动分配失败: {$dispatchResult['msg']}\n"; } } else { echo " ⚠️ 暂无可用骑手: " . ($availableResult['msg'] ?? '未知原因') . "\n"; } } else { echo " ❌ 订单分配业务类不存在\n"; } echo "\n"; } catch (Exception $e) { echo " ❌ 订单分配异常: " . $e->getMessage() . "\n\n"; } } /** * 模拟骑手接单 */ public function simulateRiderAcceptOrder($orderId) { echo "3. 模拟骑手接单...\n"; try { // 获取订单信息 $riderOrderModel = M('rider_order'); $orderInfo = $riderOrderModel->find($orderId); if (!$orderInfo) { echo " ❌ 订单不存在\n\n"; return false; } // 如果订单已分配给骑手,模拟接单 if ($orderInfo['rider_id'] > 0) { echo " 📱 骑手 {$orderInfo['rider_id']} 收到订单推送\n"; // 模拟骑手接单 $acceptData = [ 'order_status' => 1, // 已接单 'accept_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s') ]; $result = $riderOrderModel->where(['id' => $orderId])->save($acceptData); if ($result !== false) { echo " ✅ 骑手接单成功\n"; echo " ⏰ 接单时间: " . $acceptData['accept_time'] . "\n"; // 更新骑手状态为忙碌 $riderModel = M('rider_info'); $riderModel->where(['id' => $orderInfo['rider_id']])->save(['work_status' => 2]); echo " 👤 骑手状态更新为忙碌\n"; } else { echo " ❌ 骑手接单失败\n"; } } else { echo " ⚠️ 订单尚未分配给骑手\n"; } echo "\n"; } catch (Exception $e) { echo " ❌ 模拟接单异常: " . $e->getMessage() . "\n\n"; } } /** * 测试订单状态更新 */ public function testOrderStatusUpdate($orderId) { echo "4. 测试订单状态更新...\n"; try { $riderOrderModel = M('rider_order'); // 模拟配送流程 $statusFlow = [ ['status' => 2, 'name' => '已取餐', 'time_field' => 'pickup_time'], ['status' => 3, 'name' => '配送中', 'time_field' => 'delivery_start_time'], ['status' => 4, 'name' => '已送达', 'time_field' => 'delivery_complete_time'] ]; foreach ($statusFlow as $step) { sleep(1); // 模拟时间间隔 $updateData = [ 'order_status' => $step['status'], $step['time_field'] => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s') ]; $result = $riderOrderModel->where(['id' => $orderId])->save($updateData); if ($result !== false) { echo " ✅ 订单状态更新为: {$step['name']}\n"; echo " ⏰ 更新时间: " . $updateData[$step['time_field']] . "\n"; } else { echo " ❌ 状态更新失败: {$step['name']}\n"; } } // 完成订单后,释放骑手 $orderInfo = $riderOrderModel->find($orderId); if ($orderInfo && $orderInfo['rider_id'] > 0) { $riderModel = M('rider_info'); $riderModel->where(['id' => $orderInfo['rider_id']])->save(['work_status' => 1]); echo " 👤 骑手状态恢复为在线\n"; } echo "\n"; } catch (Exception $e) { echo " ❌ 状态更新异常: " . $e->getMessage() . "\n\n"; } } /** * 查看系统状态 */ public function showSystemStatus() { echo "=== 系统状态概览 ===\n"; try { // 骑手状态统计 $riderModel = M('rider_info'); $onlineRiders = $riderModel->where(['work_status' => 1, 'status' => 1])->count(); $busyRiders = $riderModel->where(['work_status' => 2, 'status' => 1])->count(); $totalRiders = $riderModel->where(['status' => 1])->count(); echo "👥 骑手状态:\n"; echo " 在线: {$onlineRiders} 人\n"; echo " 忙碌: {$busyRiders} 人\n"; echo " 总计: {$totalRiders} 人\n\n"; // 订单状态统计 $orderModel = M('rider_order'); $pendingOrders = $orderModel->where(['order_status' => 0])->count(); $acceptedOrders = $orderModel->where(['order_status' => 1])->count(); $deliveringOrders = $orderModel->where(['order_status' => ['in', '2,3']])->count(); $completedOrders = $orderModel->where(['order_status' => 4])->count(); echo "📋 订单状态:\n"; echo " 待分配: {$pendingOrders} 单\n"; echo " 已接单: {$acceptedOrders} 单\n"; echo " 配送中: {$deliveringOrders} 单\n"; echo " 已完成: {$completedOrders} 单\n\n"; } catch (Exception $e) { echo "❌ 获取系统状态异常: " . $e->getMessage() . "\n\n"; } } /** * 清理测试数据 */ public function cleanupTestData() { echo "🧹 清理测试数据...\n"; try { $riderOrderModel = M('rider_order'); // 删除测试订单(订单号以TEST_开头的) $result = $riderOrderModel->where("bill_id LIKE 'TEST_%'")->delete(); if ($result !== false) { echo " ✅ 清理了 {$result} 条测试订单记录\n"; } else { echo " ⚠️ 没有找到测试数据或清理失败\n"; } } catch (Exception $e) { echo " ❌ 清理数据异常: " . $e->getMessage() . "\n"; } echo "\n"; } } // 主程序 if (php_sapi_name() === 'cli') { // 命令行模式 $test = new OrderDispatchTest(); if (isset($argv[1])) { switch ($argv[1]) { case 'status': $test->showSystemStatus(); break; case 'cleanup': $test->cleanupTestData(); break; case 'create': $test->createTestOrder(); break; case 'full': default: $test->runFullTest(); break; } } else { $test->runFullTest(); } } else { // Web模式 echo "
";
$test = new OrderDispatchTest();
$action = $_GET['action'] ?? 'full';
switch ($action) {
case 'status':
$test->showSystemStatus();
break;
case 'cleanup':
$test->cleanupTestData();
break;
case 'create':
$test->createTestOrder();
break;
case 'full':
default:
$test->runFullTest();
break;
}
echo "";
}