OrderActionExample.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?php
  2. /**
  3. * 订单操作记录系统使用示例
  4. *
  5. * 这个文件展示了如何使用重新设计的订单操作记录系统,
  6. * 包括枚举、模型、服务和AOP装饰器的使用方法。
  7. */
  8. // 引入相关类
  9. use app\common\Service\Order\OrderActionService;
  10. use app\common\Service\Order\OrderActionDecorator;
  11. use app\common\Enum\OrderActionEnum;
  12. use app\common\model\OrderAction;
  13. /**
  14. * 示例1: 基础使用方法
  15. */
  16. class BasicUsageExample
  17. {
  18. /**
  19. * 记录用户操作
  20. */
  21. public function recordUserAction()
  22. {
  23. // 用户支付订单
  24. OrderActionService::recordUserAction(
  25. 'P202512345678901234', // 订单编号
  26. OrderActionEnum::ACTION_PAY, // 操作类型
  27. '张三', // 操作者
  28. '用户通过支付宝支付订单', // 备注
  29. 12345, // 用户ID
  30. ['payment_method' => 'alipay'] // 额外数据
  31. );
  32. // 用户确认收货
  33. OrderActionService::recordUserAction(
  34. 'P202512345678901234',
  35. OrderActionEnum::ACTION_RECEIVE,
  36. '张三',
  37. '用户确认收货',
  38. 12345,
  39. ['confirm_time' => date('Y-m-d H:i:s')]
  40. );
  41. }
  42. /**
  43. * 记录管理员操作
  44. */
  45. public function recordAdminAction()
  46. {
  47. // 管理员发货
  48. OrderActionService::recordAdminAction(
  49. 'P202512345678901234',
  50. OrderActionEnum::ACTION_SHIP,
  51. '管理员-李四',
  52. '订单已发货,快递单号:SF1234567890',
  53. 1001,
  54. [
  55. 'express_company' => '顺丰速运',
  56. 'express_no' => 'SF1234567890'
  57. ]
  58. );
  59. // 管理员取消订单
  60. OrderActionService::recordAdminAction(
  61. 'P202512345678901234',
  62. OrderActionEnum::ACTION_ADMIN_CANCEL,
  63. '管理员-王五',
  64. '商品库存不足,取消订单',
  65. 1002,
  66. ['cancel_reason' => '库存不足']
  67. );
  68. }
  69. /**
  70. * 记录系统操作
  71. */
  72. public function recordSystemAction()
  73. {
  74. // 系统自动取消超时订单
  75. OrderActionService::recordSystemAction(
  76. 'P202512345678901234',
  77. OrderActionEnum::ACTION_AUTO_CANCEL,
  78. '订单超时未支付,系统自动取消',
  79. ['timeout_minutes' => 30]
  80. );
  81. // 系统自动确认收货
  82. OrderActionService::recordSystemAction(
  83. 'P202512345678901234',
  84. OrderActionEnum::ACTION_AUTO_CONFIRM,
  85. '发货后7天自动确认收货',
  86. ['auto_confirm_days' => 7]
  87. );
  88. }
  89. }
  90. /**
  91. * 示例2: 使用AOP装饰器
  92. */
  93. class AopDecoratorExample
  94. {
  95. /**
  96. * 模拟订单服务
  97. */
  98. public function mockOrderService()
  99. {
  100. return new class {
  101. public function payOrder($orderSn, $paymentData)
  102. {
  103. // 模拟支付逻辑
  104. sleep(1);
  105. return ['status' => 'success', 'transaction_id' => 'TXN12345'];
  106. }
  107. public function shipOrder($orderSn, $expressData)
  108. {
  109. // 模拟发货逻辑
  110. sleep(1);
  111. return ['status' => 'shipped', 'express_no' => $expressData['express_no']];
  112. }
  113. public function cancelOrder($orderSn, $reason)
  114. {
  115. // 模拟取消订单逻辑
  116. return ['status' => 'cancelled', 'reason' => $reason];
  117. }
  118. };
  119. }
  120. /**
  121. * 使用装饰器记录用户操作
  122. */
  123. public function useDecoratorForUser()
  124. {
  125. $orderService = $this->mockOrderService();
  126. // 为用户操作创建装饰器
  127. $decoratedService = OrderActionDecorator::forUser(
  128. $orderService,
  129. '张三', // 操作者
  130. 12345, // 用户ID
  131. ['memo' => '用户支付订单']
  132. );
  133. // 执行支付操作,会自动记录操作日志
  134. $result = $decoratedService->payOrder('P202512345678901234', [
  135. 'payment_method' => 'alipay',
  136. 'amount' => 99.99
  137. ]);
  138. return $result;
  139. }
  140. /**
  141. * 使用装饰器记录管理员操作
  142. */
  143. public function useDecoratorForAdmin()
  144. {
  145. $orderService = $this->mockOrderService();
  146. // 为管理员操作创建装饰器
  147. $decoratedService = OrderActionDecorator::forAdmin(
  148. $orderService,
  149. '管理员-李四', // 操作者
  150. 1001, // 管理员ID
  151. ['memo' => '管理员发货']
  152. );
  153. // 执行发货操作,会自动记录操作日志
  154. $result = $decoratedService->shipOrder('P202512345678901234', [
  155. 'express_company' => '顺丰速运',
  156. 'express_no' => 'SF1234567890'
  157. ]);
  158. return $result;
  159. }
  160. /**
  161. * 使用装饰器记录系统操作
  162. */
  163. public function useDecoratorForSystem()
  164. {
  165. $orderService = $this->mockOrderService();
  166. // 为系统操作创建装饰器
  167. $decoratedService = OrderActionDecorator::forSystem(
  168. $orderService,
  169. ['memo' => '系统自动取消订单']
  170. );
  171. // 执行取消操作,会自动记录操作日志
  172. $result = $decoratedService->cancelOrder('P202512345678901234', '超时未支付');
  173. return $result;
  174. }
  175. }
  176. /**
  177. * 示例3: 查询操作记录
  178. */
  179. class QueryExample
  180. {
  181. /**
  182. * 查询订单的所有操作记录
  183. */
  184. public function getAllActions()
  185. {
  186. $orderSn = 'P202512345678901234';
  187. $actions = OrderActionService::getOrderActions($orderSn);
  188. foreach ($actions as $action) {
  189. echo "操作类型: {$action->action_type_text}, ";
  190. echo "操作者: {$action->operator}, ";
  191. echo "用户类型: {$action->user_type_text}, ";
  192. echo "时间: {$action->createtime_text}, ";
  193. echo "备注: {$action->memo}\n";
  194. }
  195. }
  196. /**
  197. * 查询特定类型的操作记录
  198. */
  199. public function getActionsByType()
  200. {
  201. $orderSn = 'P202512345678901234';
  202. // 查询支付操作
  203. $payActions = OrderActionService::getOrderActions(
  204. $orderSn,
  205. OrderActionEnum::ACTION_PAY
  206. );
  207. // 查询用户操作
  208. $userActions = OrderActionService::getOrderActions(
  209. $orderSn,
  210. '',
  211. OrderActionEnum::USER_TYPE_CUSTOMER
  212. );
  213. return [
  214. 'pay_actions' => $payActions,
  215. 'user_actions' => $userActions
  216. ];
  217. }
  218. /**
  219. * 获取操作统计信息
  220. */
  221. public function getActionStats()
  222. {
  223. $orderSn = 'P202512345678901234';
  224. $stats = OrderActionService::getActionStats($orderSn);
  225. echo "总操作数: {$stats['total_count']}\n";
  226. echo "用户操作数: {$stats['user_count']}\n";
  227. echo "管理员操作数: {$stats['admin_count']}\n";
  228. echo "系统操作数: {$stats['system_count']}\n";
  229. echo "操作类型统计:\n";
  230. foreach ($stats['action_types'] as $type => $count) {
  231. echo " {$type}: {$count}次\n";
  232. }
  233. }
  234. /**
  235. * 获取操作时间轴
  236. */
  237. public function getActionTimeline()
  238. {
  239. $orderSn = 'P202512345678901234';
  240. $timeline = OrderActionService::getActionTimeline($orderSn);
  241. foreach ($timeline as $item) {
  242. echo "[{$item['createtime_text']}] ";
  243. echo "{$item['action_type_text']} ";
  244. echo "by {$item['operator']} ";
  245. echo "({$item['user_type_text']}) ";
  246. echo "- {$item['memo']}\n";
  247. }
  248. }
  249. }
  250. /**
  251. * 示例4: 状态变化自动记录
  252. */
  253. class StatusChangeExample
  254. {
  255. /**
  256. * 订单状态变化时自动记录
  257. */
  258. public function recordStatusChange()
  259. {
  260. $orderSn = 'P202512345678901234';
  261. // 订单从未支付(101)变为已支付(201)
  262. OrderActionService::recordStatusChange(
  263. $orderSn,
  264. 101, // 旧状态
  265. 201, // 新状态
  266. '张三', // 操作者
  267. OrderActionEnum::USER_TYPE_CUSTOMER,
  268. 12345 // 用户ID
  269. );
  270. // 订单从已支付(201)变为已发货(301)
  271. OrderActionService::recordStatusChange(
  272. $orderSn,
  273. 201,
  274. 301,
  275. '管理员-李四',
  276. OrderActionEnum::USER_TYPE_ADMIN,
  277. 1001
  278. );
  279. // 订单从已发货(301)变为已完成(401)
  280. OrderActionService::recordStatusChange(
  281. $orderSn,
  282. 301,
  283. 401,
  284. 'system',
  285. OrderActionEnum::USER_TYPE_SYSTEM,
  286. 0
  287. );
  288. }
  289. }
  290. /**
  291. * 示例5: 批量操作记录
  292. */
  293. class BatchOperationExample
  294. {
  295. /**
  296. * 批量记录操作
  297. */
  298. public function batchRecord()
  299. {
  300. $actions = [
  301. [
  302. 'order_sn' => 'P202512345678901234',
  303. 'action_type' => OrderActionEnum::ACTION_CREATE,
  304. 'operator' => '张三',
  305. 'memo' => '用户创建订单',
  306. 'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER,
  307. 'user_id' => 12345,
  308. 'extra' => ['create_source' => 'app']
  309. ],
  310. [
  311. 'order_sn' => 'P202512345678901234',
  312. 'action_type' => OrderActionEnum::ACTION_PAY,
  313. 'operator' => '张三',
  314. 'memo' => '用户支付订单',
  315. 'user_type' => OrderActionEnum::USER_TYPE_CUSTOMER,
  316. 'user_id' => 12345,
  317. 'extra' => ['payment_method' => 'alipay']
  318. ],
  319. [
  320. 'order_sn' => 'P202512345678901234',
  321. 'action_type' => OrderActionEnum::ACTION_SHIP,
  322. 'operator' => '管理员-李四',
  323. 'memo' => '订单发货',
  324. 'user_type' => OrderActionEnum::USER_TYPE_ADMIN,
  325. 'user_id' => 1001,
  326. 'extra' => ['express_no' => 'SF1234567890']
  327. ]
  328. ];
  329. OrderActionService::batchRecord($actions);
  330. }
  331. }
  332. /**
  333. * 示例6: 数据库表结构更新建议
  334. */
  335. class DatabaseSchemaUpdate
  336. {
  337. /**
  338. * 建议的数据库表结构更新SQL
  339. */
  340. public function getSuggestedSchema()
  341. {
  342. return "
  343. ALTER TABLE `fa_shop_order_action`
  344. ADD COLUMN `action_type` varchar(50) NOT NULL DEFAULT '' COMMENT '操作类型' AFTER `memo`,
  345. ADD COLUMN `user_type` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '用户类型' AFTER `action_type`,
  346. ADD COLUMN `operator_type` varchar(20) NOT NULL DEFAULT 'admin' COMMENT '操作员类型' AFTER `user_type`,
  347. ADD COLUMN `user_id` int(11) NOT NULL DEFAULT 0 COMMENT '用户ID' AFTER `operator_type`,
  348. ADD COLUMN `priority` tinyint(4) NOT NULL DEFAULT 2 COMMENT '优先级' AFTER `user_id`,
  349. ADD COLUMN `ip` varchar(50) NOT NULL DEFAULT '' COMMENT 'IP地址' AFTER `priority`,
  350. ADD COLUMN `user_agent` varchar(500) NOT NULL DEFAULT '' COMMENT '用户代理' AFTER `ip`,
  351. ADD COLUMN `extra_data` text COMMENT '额外数据' AFTER `user_agent`,
  352. ADD INDEX `idx_action_type` (`action_type`),
  353. ADD INDEX `idx_user_type` (`user_type`),
  354. ADD INDEX `idx_user_id` (`user_id`),
  355. ADD INDEX `idx_priority` (`priority`);
  356. ";
  357. }
  358. }
  359. /**
  360. * 使用总结:
  361. *
  362. * 1. 基础使用: 直接调用OrderActionService的静态方法
  363. * 2. AOP装饰器: 通过装饰器模式自动记录操作
  364. * 3. 查询功能: 提供多种查询方法获取操作记录
  365. * 4. 状态变化: 自动根据订单状态变化记录操作
  366. * 5. 批量操作: 支持批量记录多个操作
  367. * 6. 数据库扩展: 需要更新数据库表结构以支持新功能
  368. *
  369. * 优势:
  370. * - 类型安全: 使用枚举确保操作类型和用户类型的一致性
  371. * - 扩展性: 易于添加新的操作类型和用户类型
  372. * - 自动化: 通过装饰器模式实现自动记录
  373. * - 性能监控: 记录执行时间和内存使用情况
  374. * - 灵活性: 支持多种使用场景和查询需求
  375. */