订单操作记录系统是一个用于记录和追踪订单操作历史的完整解决方案。本系统采用现代化的架构设计,区分前端用户操作和后台管理员操作,支持AOP(面向切面编程)模式,提供丰富的查询和统计功能。
本系统采用分层架构设计,明确各层职责:
模型层 (OrderAction.php)
服务层 (OrderActionService.php)
枚举层 (OrderActionEnum.php)
装饰器层 (OrderActionDecorator.php)
提供完整的类型定义和验证:
use app\common\Enum\OrderActionEnum;
// 操作类型
OrderActionEnum::ACTION_CREATE // 创建订单
OrderActionEnum::ACTION_PAY // 支付订单
OrderActionEnum::ACTION_SHIP // 发货
OrderActionEnum::ACTION_RECEIVE // 确认收货
OrderActionEnum::ACTION_CANCEL // 取消订单
OrderActionEnum::ACTION_REFUND // 退款
OrderActionEnum::ACTION_RETURN // 退货
OrderActionEnum::ACTION_COMPLETE // 完成订单
OrderActionEnum::ACTION_COMMENT // 评价
OrderActionEnum::ACTION_MODIFY // 修改订单
OrderActionEnum::ACTION_REMIND // 催单
OrderActionEnum::ACTION_ADMIN_CANCEL // 管理员取消
OrderActionEnum::ACTION_AUTO_CANCEL // 系统自动取消
OrderActionEnum::ACTION_AUTO_CONFIRM // 系统自动确认收货
// 用户类型
OrderActionEnum::USER_TYPE_CUSTOMER // 前端用户
OrderActionEnum::USER_TYPE_ADMIN // 后台管理员
OrderActionEnum::USER_TYPE_SYSTEM // 系统操作
// 操作员类型
OrderActionEnum::OPERATOR_TYPE_USER // 用户操作
OrderActionEnum::OPERATOR_TYPE_ADMIN // 管理员操作
OrderActionEnum::OPERATOR_TYPE_SYSTEM // 系统操作
// 优先级
OrderActionEnum::PRIORITY_LOW // 低优先级
OrderActionEnum::PRIORITY_NORMAL // 普通优先级
OrderActionEnum::PRIORITY_HIGH // 高优先级
OrderActionEnum::PRIORITY_URGENT // 紧急优先级
负责数据访问和基本数据处理:
use app\common\model\OrderAction;
// 基础查询方法
$actions = OrderAction::getByOrderSn('ORDER001');
$lastAction = OrderAction::getLatestByOrderSn('ORDER001');
$hasAction = OrderAction::hasActionType('ORDER001', OrderActionEnum::ACTION_PAY);
$stats = OrderAction::getStatsData('ORDER001');
// 批量插入
OrderAction::insertBatch($data);
// 兼容性方法(已废弃,建议使用服务类)
OrderAction::push('ORDER001', 'admin', '修改订单');
主要业务逻辑类,所有业务操作都应该通过服务类进行:
use app\common\Service\OrderActionService;
// 通用添加方法
OrderActionService::addAction([
'order_sn' => 'ORDER001',
'action_type' => OrderActionEnum::ACTION_PAY,
'operator' => 'user123',
'memo' => '支付成功',
'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER,
'user_id' => 123,
'extra_data' => ['payment_method' => 'alipay']
]);
// 用户操作记录
OrderActionService::addUserAction(
'ORDER001',
OrderActionEnum::ACTION_PAY,
'user123',
'支付成功',
123,
['payment_method' => 'alipay']
);
// 管理员操作记录
OrderActionService::addAdminAction(
'ORDER001',
OrderActionEnum::ACTION_SHIP,
'admin001',
'订单发货',
1,
['tracking_number' => 'SF123456']
);
// 系统操作记录
OrderActionService::addSystemAction(
'ORDER001',
OrderActionEnum::ACTION_AUTO_CANCEL,
'订单超时自动取消',
['timeout_minutes' => 30]
);
// 兼容老接口
OrderActionService::push('ORDER001', 'admin', '修改订单');
// 批量添加操作记录
$batch_data = [
[
'order_sn' => 'ORDER001',
'action_type' => OrderActionEnum::ACTION_CREATE,
'operator' => 'user123',
'memo' => '创建订单',
'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER,
'user_id' => 123
],
[
'order_sn' => 'ORDER002',
'action_type' => OrderActionEnum::ACTION_CREATE,
'operator' => 'user456',
'memo' => '创建订单',
'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER,
'user_id' => 456
]
];
OrderActionService::addBatchActions($batch_data);
// 获取订单所有操作记录
$actions = OrderActionService::getOrderActions('ORDER001');
// 获取特定类型的操作记录
$payActions = OrderActionService::getOrderActions('ORDER001', OrderActionEnum::ACTION_PAY);
// 获取管理员操作记录
$adminActions = OrderActionService::getOrderActions('ORDER001', '', OrderActionEnum::USER_TYPE_ADMIN);
// 获取最后一次操作
$lastAction = OrderActionService::getLastAction('ORDER001');
// 检查是否存在某个操作
$hasPaid = OrderActionService::hasAction('ORDER001', OrderActionEnum::ACTION_PAY);
// 获取操作统计
$stats = OrderActionService::getActionStats('ORDER001');
// 获取操作时间线
$timeline = OrderActionService::getActionTimeline('ORDER001');
$timelineNoSystem = OrderActionService::getActionTimeline('ORDER001', false);
// 记录状态变化
OrderActionService::recordStatusChange(
'ORDER001',
'created',
'paid',
'user123',
OrderActionEnum::USER_TYPE_CUSTOMER,
123,
'支付完成'
);
// 获取操作次数统计
$payCount = OrderActionService::getActionCount('ORDER001', OrderActionEnum::ACTION_PAY);
// 获取用户操作历史
$userHistory = OrderActionService::getUserActionHistory(123, OrderActionEnum::USER_TYPE_CUSTOMER, 10);
// 获取高优先级操作
$highPriorityActions = OrderActionService::getHighPriorityActions('ORDER001');
// 数据验证
list($isValid, $error) = OrderActionService::validateActionData([
'order_sn' => 'ORDER001',
'action_type' => OrderActionEnum::ACTION_PAY,
'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER
]);
// 清理过期记录
OrderActionService::cleanExpiredActions(90); // 清理90天前的记录
提供AOP模式的自动记录功能:
use app\common\library\OrderActionDecorator;
// 为服务类添加自动记录功能
$orderService = new OrderService();
// 用户操作装饰器
$decoratedService = OrderActionDecorator::forUser($orderService, 'user123', 123);
$decoratedService->createOrder($orderData); // 自动记录创建订单操作
// 管理员操作装饰器
$decoratedService = OrderActionDecorator::forAdmin($orderService, 'admin001', 1);
$decoratedService->cancelOrder('ORDER001'); // 自动记录取消订单操作
// 系统操作装饰器
$decoratedService = OrderActionDecorator::forSystem($orderService);
$decoratedService->processExpiredOrders(); // 自动记录系统处理操作
// 用户创建订单
OrderActionService::addUserAction(
$order_sn,
OrderActionEnum::ACTION_CREATE,
$user_name,
'用户创建订单',
$user_id,
['channel' => 'web']
);
// 用户支付订单
OrderActionService::addUserAction(
$order_sn,
OrderActionEnum::ACTION_PAY,
$user_name,
'订单支付成功',
$user_id,
[
'payment_method' => 'alipay',
'amount' => 99.99,
'transaction_id' => 'TXN123456'
]
);
// 管理员发货
OrderActionService::addAdminAction(
$order_sn,
OrderActionEnum::ACTION_SHIP,
$admin_name,
'订单已发货',
$admin_id,
[
'courier' => 'SF Express',
'tracking_number' => 'SF123456789',
'estimated_delivery' => '2024-01-15'
]
);
// 系统自动取消超时订单
OrderActionService::addSystemAction(
$order_sn,
OrderActionEnum::ACTION_AUTO_CANCEL,
'订单超时自动取消',
[
'timeout_minutes' => 30,
'original_create_time' => $create_time
]
);
// 记录订单状态变化
OrderActionService::recordStatusChange(
$order_sn,
'pending',
'paid',
$operator,
$user_type,
$user_id,
'支付完成,状态更新'
);
// 获取订单所有操作记录
$actions = OrderActionService::getOrderActions('ORDER001');
// 获取支付相关操作
$payActions = OrderActionService::getOrderActions(
'ORDER001',
OrderActionEnum::ACTION_PAY
);
// 获取管理员操作
$adminActions = OrderActionService::getOrderActions(
'ORDER001',
'',
OrderActionEnum::USER_TYPE_ADMIN
);
// 限制返回数量
$recentActions = OrderActionService::getOrderActions('ORDER001', '', '', 5);
// 获取操作统计
$stats = OrderActionService::getActionStats('ORDER001');
/*
返回格式:
{
"total_count": 5,
"user_count": 3,
"admin_count": 2,
"system_count": 0,
"action_types": {
"create": 1,
"pay": 1,
"ship": 1,
"receive": 1,
"complete": 1
},
"actions_data": [...]
}
*/
// 获取操作次数
$payCount = OrderActionService::getActionCount('ORDER001', OrderActionEnum::ACTION_PAY);
// 获取完整时间线
$timeline = OrderActionService::getActionTimeline('ORDER001');
// 排除系统操作
$userTimeline = OrderActionService::getActionTimeline('ORDER001', false);
// 时间线数据结构
/*
[
{
"id": 1,
"time": 1704038400,
"time_text": "2024-01-01 00:00:00",
"operator": "user123",
"action_type": "create",
"action_text": "创建订单",
"user_type": "customer",
"user_text": "前端用户",
"memo": "用户创建订单",
"priority": 2,
"priority_text": "普通优先级",
"extra_data": "{\"channel\":\"web\"}"
}
]
*/
// 获取用户操作历史
$userHistory = OrderActionService::getUserActionHistory(
123,
OrderActionEnum::USER_TYPE_CUSTOMER,
10
);
// 获取高优先级操作
$urgentActions = OrderActionService::getHighPriorityActions('ORDER001');
// 检查特定操作是否存在
$hasBeenPaid = OrderActionService::hasAction('ORDER001', OrderActionEnum::ACTION_PAY);
$hasBeenShipped = OrderActionService::hasAction('ORDER001', OrderActionEnum::ACTION_SHIP);
// 验证操作数据
list($isValid, $error) = OrderActionService::validateActionData([
'order_sn' => 'ORDER001',
'action_type' => OrderActionEnum::ACTION_PAY,
'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER,
'priority' => OrderActionEnum::PRIORITY_HIGH
]);
if (!$isValid) {
echo "验证失败: " . $error;
}
CREATE TABLE `fa_shop_order_action` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_sn` varchar(50) NOT NULL COMMENT '订单编号',
`operator` varchar(100) NOT NULL COMMENT '操作人',
`memo` text COMMENT '备注',
`action_type` varchar(20) NOT NULL DEFAULT 'modify' COMMENT '操作类型',
`user_type` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '用户类型',
`operator_type` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '操作员类型',
`priority` tinyint(1) NOT NULL DEFAULT 2 COMMENT '优先级',
`user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID',
`ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'IP地址',
`user_agent` varchar(500) NOT NULL DEFAULT '' COMMENT '用户代理',
`extra_data` text COMMENT '额外数据',
`createtime` int(11) NOT NULL DEFAULT 0 COMMENT '创建时间',
PRIMARY KEY (`id`),
KEY `idx_order_sn` (`order_sn`),
KEY `idx_action_type` (`action_type`),
KEY `idx_user_type` (`user_type`),
KEY `idx_user_id` (`user_id`),
KEY `idx_createtime` (`createtime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单操作记录表';
idx_order_sn
: 订单编号索引(最常用)idx_action_type
: 操作类型索引idx_user_type
: 用户类型索引idx_user_id
: 用户ID索引idx_createtime
: 创建时间索引// 批量插入多个订单的操作记录
$batch_data = [];
foreach ($orders as $order) {
$batch_data[] = [
'order_sn' => $order['order_sn'],
'action_type' => OrderActionEnum::ACTION_CREATE,
'operator' => $order['user_name'],
'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER,
'user_id' => $order['user_id'],
'memo' => '批量创建订单'
];
}
OrderActionService::addBatchActions($batch_data);
// 定期清理过期记录
OrderActionService::cleanExpiredActions(90); // 保留90天
// 使用限制减少数据量
$recentActions = OrderActionService::getOrderActions('ORDER001', '', '', 10);
// 只查询必要的字段
$actions = OrderAction::getByOrderSn('ORDER001')->field('id,action_type,operator,createtime');
✅ 推荐:始终使用服务类
// 好的做法
OrderActionService::addUserAction($order_sn, $action_type, $operator, $memo, $user_id);
❌ 不推荐:直接操作模型
// 不好的做法
OrderAction::create($data);
✅ 推荐:使用枚举常量
// 好的做法
OrderActionService::addUserAction(
'ORDER001',
OrderActionEnum::ACTION_PAY,
'user123',
'支付成功',
123
);
❌ 不推荐:硬编码字符串
// 不好的做法
OrderActionService::addUserAction('ORDER001', 'pay', 'user123', '支付成功', 123);
✅ 推荐:数据验证
// 好的做法
list($isValid, $error) = OrderActionService::validateActionData($data);
if ($isValid) {
OrderActionService::addAction($data);
}
✅ 推荐:适当的异常处理
// 好的做法
try {
$result = OrderActionService::addUserAction($order_sn, $action_type, $operator, $memo, $user_id);
if (!$result) {
// 处理失败情况
Log::error("订单操作记录失败: {$order_sn}");
}
} catch (Exception $e) {
// 处理异常
Log::error("订单操作记录异常: " . $e->getMessage());
}
✅ 推荐:批量操作
// 好的做法:批量处理
OrderActionService::addBatchActions($batch_data);
❌ 不推荐:循环单个操作
// 不好的做法:循环单个插入
foreach ($orders as $order) {
OrderActionService::addUserAction(...);
}
使用不同的方法:
OrderActionService::addUserAction()
OrderActionService::addAdminAction()
OrderActionService::addSystemAction()
使用专门的状态变化记录方法:
OrderActionService::recordStatusChange($order_sn, $old_status, $new_status, $operator, $user_type, $user_id);
使用装饰器模式:
$decoratedService = OrderActionDecorator::forUser($orderService, 'user123', 123);
$decoratedService->createOrder($data); // 自动记录操作
使用枚举常量进行查询:
$payActions = OrderActionService::getOrderActions('ORDER001', OrderActionEnum::ACTION_PAY);
使用批量操作和分页查询:
// 批量插入
OrderActionService::addBatchActions($batch_data);
// 分页查询
$actions = OrderActionService::getOrderActions('ORDER001', '', '', 20);
订单操作记录系统提供了完整的订单操作追踪功能,采用现代化的架构设计,分离了数据访问层和业务逻辑层,确保代码的可维护性和可扩展性。通过合理使用服务类、枚举常量和装饰器模式,可以构建一个高效、可靠的订单操作记录系统。