EndOrderAdminTask.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. $this->logger = $logger;
  21. }
  22. public function __invoke()
  23. {
  24. // 获取需要处理的订单ID列表 判断是否能够结束
  25. $currentTime = date('Y-m-d H:i:s');
  26. $orderIds = Order::where('status', 1) //已经审核,等待结束
  27. ->where('edtime', '<=', $currentTime)
  28. ->pluck('id')
  29. ->toArray();
  30. //单个处理
  31. // foreach ($orderIds as $orderId) {
  32. // $data = ['id' => $orderId];
  33. // $this->singleOverOrder($data);
  34. // }
  35. // 批量处理结束订单
  36. if ($orderIds) {
  37. $this->logger->info('需要处理的订单ID列表:' . implode(', ', $orderIds));
  38. $this->OverOder($orderIds);
  39. }
  40. //过期时间
  41. //$exploredTime = date('Y-m-d H:i:s', (time() + 60 * 60 * 2));
  42. // 获取所有状态为6的订单
  43. $orders = Order::where('status', 6) // 未审核等待过期
  44. ->get();
  45. $expiredOrderIds = [];
  46. foreach ($orders as $order) {
  47. // 计算 created_at + 2小时
  48. $exploredTime = date('Y-m-d H:i:s', strtotime($order->created_at . ' +2 hours'));
  49. $this->logger->info('exploredTime: ' . $exploredTime . ' 当前时间' . $order->created_at);
  50. // 检查当前时间是否大于 exploredTime
  51. if (time() > strtotime($exploredTime)) {
  52. $expiredOrderIds[] = $order->id;
  53. }
  54. }
  55. if ($expiredOrderIds) {
  56. $this->logger->info('需要处理的订单ID列表:' . implode(', ', $expiredOrderIds));
  57. //单个处理
  58. // 获取需要处理的订单ID列表 判断是否能够过期
  59. $this->ExpiredOrder($expiredOrderIds);
  60. }
  61. }
  62. /**
  63. * 处理单个订单是否结束
  64. */
  65. private function singleOverOrder(array $data)
  66. {
  67. $order = Order::where('id', $data['id'])->first();
  68. if (empty($order)) {
  69. $this->logger->warning("没有找到订单ID: {$data['id']}");
  70. return;
  71. }
  72. Db::beginTransaction();
  73. try {
  74. $order->status = 7;
  75. $order->ad_status = 7;
  76. $order->save();
  77. //获取 order_ad 表中的记录
  78. $orderAds = OrderAd::where('order_id', $data['id'])->get();
  79. if ($orderAds->isEmpty()) {
  80. $this->logger->warning("没有找到订单ID: {$data['id']} 的 order_ad 记录");
  81. return;
  82. }
  83. //获取 order_ad 表中的记录
  84. OrderAd::where('order_id', $data['id'])
  85. ->update(['status' => 7]);
  86. //在ad表中删除的数据
  87. Ad::where('order_id', $data['id'])->delete();
  88. Db::commit();
  89. } catch (\Exception $e) {
  90. Db::rollBack();
  91. $this->logger->error("处理订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
  92. }
  93. }
  94. private function OverOder(array $data): void
  95. {
  96. Db::beginTransaction();
  97. try {
  98. //设置订单状态
  99. Order::whereIn('id', $data)->update(['status' => 7, 'ad_status' => 7]);
  100. //设置广告状态
  101. OrderAd::whereIn('order_id', $data)->update(['status' => 7]);
  102. //ad 变更状态为已经审核但是不生效,或者删除订单,或者加入别的状态:比如过期
  103. Ad::whereIn('order_id', $data)->update(['status' => 2]);
  104. Db::commit();
  105. } catch (\Exception $e) {
  106. Db::rollBack();
  107. $this->logger->error("处理订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
  108. }
  109. }
  110. private function ExpiredOrder(array $data): void
  111. {
  112. Db::beginTransaction();
  113. try {
  114. //设置订单状态
  115. Order::whereIn('id', $data)->update(['status' => 5, 'ad_status' => 5]);
  116. //设置广告状态
  117. OrderAd::whereIn('order_id', $data)->update(['status' => 5]);
  118. Db::commit();
  119. } catch (\Exception $e) {
  120. Db::rollBack();
  121. $this->logger->error("处理订单ID: {$data['id']} 时发生错误: " . $e->getMessage());
  122. }
  123. }
  124. }