AutoDecGoodsTraffic.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\Components\Helpers;
  4. use App\Http\Models\GoodsLabel;
  5. use App\Http\Models\Order;
  6. use App\Http\Models\User;
  7. use App\Http\Models\UserLabel;
  8. use DB;
  9. use Exception;
  10. use Illuminate\Console\Command;
  11. use Log;
  12. class AutoDecGoodsTraffic extends Command
  13. {
  14. protected $signature = 'autoDecGoodsTraffic';
  15. protected $description = '自动扣减用户到期商品的流量';
  16. protected static $systemConfig;
  17. public function __construct()
  18. {
  19. parent::__construct();
  20. self::$systemConfig = Helpers::systemConfig();
  21. }
  22. public function handle()
  23. {
  24. $jobStartTime = microtime(TRUE);
  25. // 扣减用户到期商品的流量
  26. $this->decGoodsTraffic();
  27. $jobEndTime = microtime(TRUE);
  28. $jobUsedTime = round(($jobEndTime-$jobStartTime), 4);
  29. Log::info('执行定时任务【'.$this->description.'】,耗时'.$jobUsedTime.'秒');
  30. }
  31. // 扣减用户到期商品的流量
  32. private function decGoodsTraffic()
  33. {
  34. $orderList = Order::query()->with(['user', 'goods'])->where('status', 2)->where('is_expire', 0)->where('expire_at', '<', date('Y-m-d H:i:s'))->get();
  35. if(!$orderList->isEmpty()){
  36. // 用户默认标签
  37. $defaultLabels = [];
  38. if(self::$systemConfig['initial_labels_for_user']){
  39. $defaultLabels = explode(',', self::$systemConfig['initial_labels_for_user']);
  40. }
  41. DB::beginTransaction();
  42. try{
  43. foreach($orderList as $order){
  44. // 先过期本订单
  45. Order::query()->where('oid', $order->oid)->update(['is_expire' => 1]);
  46. // 再检查该订单对应用户是否还有套餐(非流量包)存在
  47. $haveOrder = Order::query()
  48. ->with(['user', 'goods'])
  49. ->where('is_expire', 0)
  50. ->where('user_id', $order->user_id)
  51. ->whereHas('goods', function($q){
  52. $q->where('type', 2);
  53. })
  54. ->orderBy('oid', 'desc')
  55. ->first();
  56. if(!$haveOrder){
  57. // 如果不存在有效套餐(非流量包),则清空用户重置日
  58. User::query()->where('id', $order->user_id)->update(['traffic_reset_day' => 0]);
  59. }
  60. if(empty($order->user) || empty($order->goods)){
  61. continue;
  62. }
  63. if($order->user->transfer_enable-$order->goods->traffic*1048576 <= 0){
  64. // 写入用户流量变动记录
  65. Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $order->user->transfer_enable, 0, '[定时任务]用户所购商品到期,扣减商品对应的流量(扣完并重置)');
  66. User::query()->where('id', $order->user_id)->update(['u' => 0, 'd' => 0, 'transfer_enable' => 0]);
  67. }else{
  68. // 写入用户流量变动记录
  69. Helpers::addUserTrafficModifyLog($order->user_id, $order->oid, $order->user->transfer_enable, ($order->user->transfer_enable-$order->goods->traffic*1048576), '[定时任务]用户所购商品到期,扣减商品对应的流量(没扣完)');
  70. User::query()->where('id', $order->user_id)->decrement('transfer_enable', $order->goods->traffic*1048576);
  71. // 处理已用流量
  72. if($order->user->u+$order->user->d-$order->goods->traffic*1048576 <= 0){
  73. User::query()->where('id', $order->user_id)->update(['u' => 0, 'd' => 0]);
  74. }else{
  75. // 一般来说d的值远远大于u
  76. if($order->user->d-$order->goods->traffic*1048576 >= 0){
  77. User::query()->where('id', $order->user_id)->decrement('d', $order->goods->traffic*1048576);
  78. }else{ // 如果d不够减,则减u,然后d置0
  79. User::query()->where('id', $order->user_id)->decrement('u', $order->goods->traffic*1048576-$order->user->d);
  80. User::query()->where('id', $order->user_id)->update(['d' => 0]);
  81. }
  82. }
  83. }
  84. // 删除该商品对应用户的所有标签
  85. UserLabel::query()->where('user_id', $order->user->id)->delete();
  86. // 取出用户的其他商品带有的标签
  87. $goodsIds = Order::query()->where('user_id', $order->user->id)->where('oid', '<>', $order->oid)->where('status', 2)->where('is_expire', 0)->groupBy('goods_id')->pluck('goods_id')->toArray();
  88. $goodsLabels = GoodsLabel::query()->whereIn('goods_id', $goodsIds)->groupBy('label_id')->pluck('label_id')->toArray();
  89. // 生成标签
  90. $labels = array_values(array_unique(array_merge($goodsLabels, $defaultLabels))); // 标签去重
  91. foreach($labels as $vo){
  92. $userLabel = new UserLabel();
  93. $userLabel->user_id = $order->user->id;
  94. $userLabel->label_id = $vo;
  95. $userLabel->save();
  96. }
  97. }
  98. DB::commit();
  99. } catch(Exception $e){
  100. Log::error($this->description.':'.$e);
  101. DB::rollBack();
  102. }
  103. }
  104. }
  105. }