ServiceTimer.php 2.5 KB

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