ServiceTimer.php 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Http\Controllers\ServiceController;
  4. use App\Http\Models\Order;
  5. use App\Http\Models\User;
  6. use App\Http\Models\UserLabel;
  7. use DB;
  8. use Exception;
  9. use Illuminate\Console\Command;
  10. use Log;
  11. class ServiceTimer extends Command
  12. {
  13. protected $signature = 'serviceTimer';
  14. protected $description = '服务计时器';
  15. public function __construct()
  16. {
  17. parent::__construct();
  18. }
  19. public function handle()
  20. {
  21. $jobStartTime = microtime(TRUE);
  22. // 扣减用户到期商品的流量
  23. $this->decGoodsTraffic();
  24. $jobEndTime = microtime(TRUE);
  25. $jobUsedTime = round(($jobEndTime-$jobStartTime), 4);
  26. Log::info('---【'.$this->description.'】完成---,耗时'.$jobUsedTime.'秒');
  27. }
  28. // 扣减用户到期商品的流量
  29. private function decGoodsTraffic()
  30. {
  31. //获取失效的套餐
  32. $orderList = Order::query()->with(['goods'])->where('status', 2)->where('is_expire', 0)->whereHas('goods', function($q){ $q->where('type', 2); })->where('expire_at', '<=', date('Y-m-d H:i:s'))->get();
  33. if($orderList->isNotEmpty()){
  34. try{
  35. DB::beginTransaction();
  36. foreach($orderList as $order){
  37. // 过期本订单
  38. Order::query()->where('oid', $order->oid)->update(['is_expire' => 1]);
  39. // 过期生效中的加油包
  40. Order::query()
  41. ->with(['goods'])
  42. ->where('user_id', $order->user_id)
  43. ->where('status', 2)
  44. ->where('is_expire', 0)
  45. ->whereHas('goods', function($q){
  46. $q->where('type', 1);
  47. })->update(['is_expire' => 1]);
  48. if(empty($order->user) || empty($order->goods)){
  49. continue;
  50. }
  51. // 清理全部流量
  52. Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $order->user->transfer_enable, 0, '[定时任务]用户所购商品到期,扣减商品对应的流量');
  53. User::query()->where('id', $order->user_id)->update(['u' => 0, 'd' => 0, 'transfer_enable' => 0, 'reset_time' => NULL]);
  54. // 删除对应用户的所有标签
  55. UserLabel::query()->where('user_id', $order->user_id)->delete();
  56. // 检查该订单对应用户是否有预支付套餐
  57. $prepaidOrder = Order::query()->where('user_id', $order->user_id)->where('status', 3)->orderBy('oid', 'asc')->first();
  58. if($prepaidOrder){
  59. (new ServiceController)->activePrepaidOrder($prepaidOrder->oid);
  60. }
  61. }
  62. DB::commit();
  63. } catch(Exception $e){
  64. Log::error($this->description.':'.$e);
  65. DB::rollBack();
  66. }
  67. }
  68. }
  69. }