'alipay'] // 额外数据 ); // 用户确认收货 OrderActionService::recordUserAction( 'P202512345678901234', OrderActionEnum::ACTION_RECEIVE, '张三', '用户确认收货', 12345, ['confirm_time' => date('Y-m-d H:i:s')] ); } /** * 记录管理员操作 */ public function recordAdminAction() { // 管理员发货 OrderActionService::recordAdminAction( 'P202512345678901234', OrderActionEnum::ACTION_SHIP, '管理员-李四', '订单已发货,快递单号:SF1234567890', 1001, [ 'express_company' => '顺丰速运', 'express_no' => 'SF1234567890' ] ); // 管理员取消订单 OrderActionService::recordAdminAction( 'P202512345678901234', OrderActionEnum::ACTION_ADMIN_CANCEL, '管理员-王五', '商品库存不足,取消订单', 1002, ['cancel_reason' => '库存不足'] ); } /** * 记录系统操作 */ public function recordSystemAction() { // 系统自动取消超时订单 OrderActionService::recordSystemAction( 'P202512345678901234', OrderActionEnum::ACTION_AUTO_CANCEL, '订单超时未支付,系统自动取消', ['timeout_minutes' => 30] ); // 系统自动确认收货 OrderActionService::recordSystemAction( 'P202512345678901234', OrderActionEnum::ACTION_AUTO_CONFIRM, '发货后7天自动确认收货', ['auto_confirm_days' => 7] ); } } /** * 示例2: 使用AOP装饰器 */ class AopDecoratorExample { /** * 模拟订单服务 */ public function mockOrderService() { return new class { public function payOrder($orderSn, $paymentData) { // 模拟支付逻辑 sleep(1); return ['status' => 'success', 'transaction_id' => 'TXN12345']; } public function shipOrder($orderSn, $expressData) { // 模拟发货逻辑 sleep(1); return ['status' => 'shipped', 'express_no' => $expressData['express_no']]; } public function cancelOrder($orderSn, $reason) { // 模拟取消订单逻辑 return ['status' => 'cancelled', 'reason' => $reason]; } }; } /** * 使用装饰器记录用户操作 */ public function useDecoratorForUser() { $orderService = $this->mockOrderService(); // 为用户操作创建装饰器 $decoratedService = OrderActionDecorator::forUser( $orderService, '张三', // 操作者 12345, // 用户ID ['memo' => '用户支付订单'] ); // 执行支付操作,会自动记录操作日志 $result = $decoratedService->payOrder('P202512345678901234', [ 'payment_method' => 'alipay', 'amount' => 99.99 ]); return $result; } /** * 使用装饰器记录管理员操作 */ public function useDecoratorForAdmin() { $orderService = $this->mockOrderService(); // 为管理员操作创建装饰器 $decoratedService = OrderActionDecorator::forAdmin( $orderService, '管理员-李四', // 操作者 1001, // 管理员ID ['memo' => '管理员发货'] ); // 执行发货操作,会自动记录操作日志 $result = $decoratedService->shipOrder('P202512345678901234', [ 'express_company' => '顺丰速运', 'express_no' => 'SF1234567890' ]); return $result; } /** * 使用装饰器记录系统操作 */ public function useDecoratorForSystem() { $orderService = $this->mockOrderService(); // 为系统操作创建装饰器 $decoratedService = OrderActionDecorator::forSystem( $orderService, ['memo' => '系统自动取消订单'] ); // 执行取消操作,会自动记录操作日志 $result = $decoratedService->cancelOrder('P202512345678901234', '超时未支付'); return $result; } } /** * 示例3: 查询操作记录 */ class QueryExample { /** * 查询订单的所有操作记录 */ public function getAllActions() { $orderSn = 'P202512345678901234'; $actions = OrderActionService::getOrderActions($orderSn); foreach ($actions as $action) { echo "操作类型: {$action->action_type_text}, "; echo "操作者: {$action->operator}, "; echo "用户类型: {$action->user_type_text}, "; echo "时间: {$action->createtime_text}, "; echo "备注: {$action->memo}\n"; } } /** * 查询特定类型的操作记录 */ public function getActionsByType() { $orderSn = 'P202512345678901234'; // 查询支付操作 $payActions = OrderActionService::getOrderActions( $orderSn, OrderActionEnum::ACTION_PAY ); // 查询用户操作 $userActions = OrderActionService::getOrderActions( $orderSn, '', OrderActionEnum::USER_TYPE_CUSTOMER ); return [ 'pay_actions' => $payActions, 'user_actions' => $userActions ]; } /** * 获取操作统计信息 */ public function getActionStats() { $orderSn = 'P202512345678901234'; $stats = OrderActionService::getActionStats($orderSn); echo "总操作数: {$stats['total_count']}\n"; echo "用户操作数: {$stats['user_count']}\n"; echo "管理员操作数: {$stats['admin_count']}\n"; echo "系统操作数: {$stats['system_count']}\n"; echo "操作类型统计:\n"; foreach ($stats['action_types'] as $type => $count) { echo " {$type}: {$count}次\n"; } } /** * 获取操作时间轴 */ public function getActionTimeline() { $orderSn = 'P202512345678901234'; $timeline = OrderActionService::getActionTimeline($orderSn); foreach ($timeline as $item) { echo "[{$item['createtime_text']}] "; echo "{$item['action_type_text']} "; echo "by {$item['operator']} "; echo "({$item['user_type_text']}) "; echo "- {$item['memo']}\n"; } } } /** * 示例4: 状态变化自动记录 */ class StatusChangeExample { /** * 订单状态变化时自动记录 */ public function recordStatusChange() { $orderSn = 'P202512345678901234'; // 订单从未支付(101)变为已支付(201) OrderActionService::recordStatusChange( $orderSn, 101, // 旧状态 201, // 新状态 '张三', // 操作者 OrderActionEnum::USER_TYPE_CUSTOMER, 12345 // 用户ID ); // 订单从已支付(201)变为已发货(301) OrderActionService::recordStatusChange( $orderSn, 201, 301, '管理员-李四', OrderActionEnum::USER_TYPE_ADMIN, 1001 ); // 订单从已发货(301)变为已完成(401) OrderActionService::recordStatusChange( $orderSn, 301, 401, 'system', OrderActionEnum::USER_TYPE_SYSTEM, 0 ); } } /** * 示例5: 批量操作记录 */ class BatchOperationExample { /** * 批量记录操作 */ public function batchRecord() { $actions = [ [ 'order_sn' => 'P202512345678901234', 'action_type' => OrderActionEnum::ACTION_CREATE, 'operator' => '张三', 'memo' => '用户创建订单', 'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER, 'user_id' => 12345, 'extra' => ['create_source' => 'app'] ], [ 'order_sn' => 'P202512345678901234', 'action_type' => OrderActionEnum::ACTION_PAY, 'operator' => '张三', 'memo' => '用户支付订单', 'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER, 'user_id' => 12345, 'extra' => ['payment_method' => 'alipay'] ], [ 'order_sn' => 'P202512345678901234', 'action_type' => OrderActionEnum::ACTION_SHIP, 'operator' => '管理员-李四', 'memo' => '订单发货', 'user_type' => OrderActionEnum::USER_TYPE_ADMIN, 'user_id' => 1001, 'extra' => ['express_no' => 'SF1234567890'] ] ]; OrderActionService::batchRecord($actions); } } /** * 示例6: 数据库表结构更新建议 */ class DatabaseSchemaUpdate { /** * 建议的数据库表结构更新SQL */ public function getSuggestedSchema() { return " ALTER TABLE `fa_shop_order_action` ADD COLUMN `action_type` varchar(50) NOT NULL DEFAULT '' COMMENT '操作类型' AFTER `memo`, ADD COLUMN `user_type` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '用户类型' AFTER `action_type`, ADD COLUMN `operator_type` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '操作员类型' AFTER `user_type`, ADD COLUMN `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID' AFTER `operator_type`, ADD COLUMN `priority` tinyint(4) NOT NULL DEFAULT 2 COMMENT '优先级' AFTER `user_id`, ADD COLUMN `ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'IP地址' AFTER `priority`, ADD COLUMN `user_agent` varchar(500) NOT NULL DEFAULT '' COMMENT '用户代理' AFTER `ip`, ADD COLUMN `extra_data` text COMMENT '额外数据' AFTER `user_agent`, ADD INDEX `idx_action_type` (`action_type`), ADD INDEX `idx_user_type` (`user_type`), ADD INDEX `idx_user_id` (`user_id`), ADD INDEX `idx_priority` (`priority`); "; } } /** * 使用总结: * * 1. 基础使用: 直接调用OrderActionService的静态方法 * 2. AOP装饰器: 通过装饰器模式自动记录操作 * 3. 查询功能: 提供多种查询方法获取操作记录 * 4. 状态变化: 自动根据订单状态变化记录操作 * 5. 批量操作: 支持批量记录多个操作 * 6. 数据库扩展: 需要更新数据库表结构以支持新功能 * * 优势: * - 类型安全: 使用枚举确保操作类型和用户类型的一致性 * - 扩展性: 易于添加新的操作类型和用户类型 * - 自动化: 通过装饰器模式实现自动记录 * - 性能监控: 记录执行时间和内存使用情况 * - 灵活性: 支持多种使用场景和查询需求 */