文件
mashangyoujiu/_ai_archive/scripts/test_order_dispatch.php

393 行
14 KiB
PHP

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

<?php
/**
* 测试订单发布到骑手端脚本
* 用于测试订单创建、分配和骑手接单流程
*/
// 设置错误报告
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 引入ThinkPHP框架
define('APP_PATH', './Application/');
define('RUNTIME_PATH', './Runtime/');
require './ThinkPHP/ThinkPHP.php';
class OrderDispatchTest {
private $merchantId = 1;
private $storeId = 1;
public function __construct() {
echo "=== 骑手订单分配测试脚本 ===\n\n";
}
/**
* 运行完整测试流程
*/
public function runFullTest() {
echo "开始完整测试流程...\n\n";
// 1. 创建测试订单
$orderId = $this->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 "<pre>";
$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 "</pre>";
}