AutoDecGoodsTraffic.php 5.7 KB

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