EndOrderAdminTask.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. <?php
  2. declare (strict_types = 1);
  3. namespace App\Task;
  4. use App\Model\Ad;
  5. use App\Model\Order;
  6. use App\Model\OrderAd;
  7. use Hyperf\Contract\StdoutLoggerInterface;
  8. use Hyperf\DbConnection\Db;
  9. use Hyperf\Di\Annotation\Inject;
  10. use Psr\Log\LoggerInterface;
  11. class EndOrderAdminTask
  12. {
  13. /**
  14. * @Inject
  15. * @var StdoutLoggerInterface
  16. */
  17. private $logger;
  18. public function __construct(LoggerInterface $logger)
  19. {
  20. date_default_timezone_set('Asia/Shanghai');
  21. $this->logger = $logger;
  22. }
  23. public function __invoke()
  24. {
  25. // 获取需要处理的订单ID列表 判断是否能够结束
  26. $currentTime = date('Y-m-d H:i:s');
  27. $orderIds = Order::where('status', 1) //已经审核,等待结束
  28. ->where('edtime', '<=', $currentTime)
  29. ->pluck('id')
  30. ->toArray();
  31. //获取需要处理的订单id,判断是否生效
  32. $orderIdsTO2 = Order::where('status', 1) //已经审核,等待开始
  33. ->where('sttime', '<=', $currentTime)
  34. ->where('edtime', '>=', $currentTime)
  35. ->pluck('id')
  36. ->toArray();
  37. //单个处理
  38. // foreach ($orderIds as $orderId) {
  39. // $data = ['id' => $orderId];
  40. // $this->singleOverOrder($data);
  41. // }
  42. // 批量处理结束订单
  43. if ($orderIds) {
  44. $this->logger->info('需要处理结束单ID列表:' . implode(', ', $orderIds));
  45. $this->OverOder($orderIds);
  46. }
  47. if ($orderIdsTO2) {
  48. $this->logger->info('需要处理开始单ID列表:' . implode(', ', $orderIdsTO2));
  49. $this->startOder($orderIdsTO2);
  50. }
  51. //过期时间
  52. //$exploredTime = date('Y-m-d H:i:s', (time() + 60 * 60 * 2));
  53. // 获取所有状态为6的订单
  54. $orders = Order::where('status', 6) // 未审核等待过期
  55. ->get();
  56. $expiredOrderIds = [];
  57. foreach ($orders as $order) {
  58. // 计算 created_at + 24小时
  59. $exploredTime = date('Y-m-d H:i:s', strtotime($order->created_at . ' +24 hours'));
  60. $this->logger->info('exploredTime: ' . $exploredTime . ' 当前时间' . $order->created_at);
  61. // 检查当前时间是否大于 exploredTime
  62. if (time() > strtotime($exploredTime)) {
  63. $expiredOrderIds[] = $order->id;
  64. }
  65. }
  66. if ($expiredOrderIds) {
  67. $this->logger->info('需要处理过期的订单ID列表:' . implode(', ', $expiredOrderIds));
  68. //单个处理
  69. // 获取需要处理的订单ID列表 判断是否能够过期
  70. $this->ExpiredOrder($expiredOrderIds);
  71. }
  72. }
  73. /**
  74. * 处理单个订单是否结束
  75. */
  76. private function singleOverOrder(array $data)
  77. {
  78. $order = Order::where('id', $data['id'])->first();
  79. if (empty($order)) {
  80. $this->logger->warning("没有找到订单ID: {$data['id']}");
  81. return;
  82. }
  83. Db::beginTransaction();
  84. try {
  85. $order->status = 7;
  86. $order->ad_status = 7;
  87. $order->save();
  88. //获取 order_ad 表中的记录
  89. $orderAds = OrderAd::where('order_id', $data['id'])->get();
  90. if ($orderAds->isEmpty()) {
  91. $this->logger->warning("没有找到订单ID: {$data['id']} 的 order_ad 记录");
  92. return;
  93. }
  94. //获取 order_ad 表中的记录
  95. OrderAd::where('order_id', $data['id'])
  96. ->update(['status' => 7]);
  97. //在ad表中删除的数据
  98. Ad::where('order_id', $data['id'])->delete();
  99. Db::commit();
  100. } catch (\Exception $e) {
  101. Db::rollBack();
  102. $this->logger->error("处理订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
  103. }
  104. }
  105. private function startOder(array $data): void
  106. {
  107. Db::beginTransaction();
  108. try {
  109. //ad 变更状态为已经审核但是不生效,或者删除订单,或者加入别的状态:比如过期
  110. Order::whereIn('id', $data)->update(['status' => 1, 'ad_status' => 8]);
  111. OrderAd::whereIn('order_id', $data)->update(['status' => 1]);
  112. $pid = OrderAd::whereIn('order_id', $data)->pluck('pid')->toArray();
  113. Ad::whereIn('pid', $pid)->update(['status' => 1]);
  114. Db::commit();
  115. } catch (\Exception $e) {
  116. Db::rollBack();
  117. $this->logger->error("处理启用订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
  118. }
  119. }
  120. private function OverOder(array $data): void
  121. {
  122. Db::beginTransaction();
  123. try {
  124. //设置订单状态
  125. Order::whereIn('id', $data)->update(['status' => 7, 'ad_status' => 7]);
  126. //设置广告状态
  127. OrderAd::whereIn('order_id', $data)->update(['status' => 7]);
  128. //ad 变更状态为已经审核但是不生效,或者删除订单,或者加入别的状态:比如过期
  129. $pid = OrderAd::whereIn('order_id', $data)->pluck('pid')->toArray();
  130. Ad::whereIn('pid', $pid)->update(['status' => 2]);
  131. Db::commit();
  132. } catch (\Exception $e) {
  133. Db::rollBack();
  134. $this->logger->error("处理结束订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
  135. }
  136. }
  137. private function ExpiredOrder(array $data): void
  138. {
  139. Db::beginTransaction();try {
  140. //设置订单状态
  141. Order::whereIn('id', $data)->update(['status' => 5, 'ad_status' => 5]);
  142. //设置广告状态
  143. OrderAd::whereIn('order_id', $data)->update(['status' => 5]);
  144. Db::commit();
  145. } catch (\Exception $e) {
  146. Db::rollBack();
  147. $this->logger->error("处理过期订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
  148. }
  149. }
  150. }