123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- <?php
- /**
- * 订单操作记录系统使用示例
- *
- * 这个文件展示了如何使用重新设计的订单操作记录系统,
- * 包括枚举、模型、服务和AOP装饰器的使用方法。
- */
- // 引入相关类
- use app\common\Service\Order\OrderActionService;
- use app\common\Service\Order\OrderActionDecorator;
- use app\common\Enum\OrderActionEnum;
- use app\common\model\OrderAction;
- /**
- * 示例1: 基础使用方法
- */
- class BasicUsageExample
- {
- /**
- * 记录用户操作
- */
- public function recordUserAction()
- {
- // 用户支付订单
- OrderActionService::recordUserAction(
- 'P202512345678901234', // 订单编号
- OrderActionEnum::ACTION_PAY, // 操作类型
- '张三', // 操作者
- '用户通过支付宝支付订单', // 备注
- 12345, // 用户ID
- ['payment_method' => '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. 数据库扩展: 需要更新数据库表结构以支持新功能
- *
- * 优势:
- * - 类型安全: 使用枚举确保操作类型和用户类型的一致性
- * - 扩展性: 易于添加新的操作类型和用户类型
- * - 自动化: 通过装饰器模式实现自动记录
- * - 性能监控: 记录执行时间和内存使用情况
- * - 灵活性: 支持多种使用场景和查询需求
- */
|