MarketingController.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Level;
  5. use App\Models\Marketing;
  6. use App\Models\User;
  7. use App\Models\UserGroup;
  8. use App\Models\UserHourlyDataFlow;
  9. use App\Notifications\Custom;
  10. use Carbon;
  11. use Helpers;
  12. use Illuminate\Http\JsonResponse;
  13. use Illuminate\Http\Request;
  14. use Notification;
  15. use Response;
  16. use Validator;
  17. class MarketingController extends Controller
  18. {
  19. // 群发消息列表
  20. public function index(Request $request)
  21. {
  22. $query = Marketing::query();
  23. $request->whenFilled('status', function ($value) use ($query) {
  24. $query->whereStatus($value);
  25. });
  26. return view('admin.article.marketing', [
  27. 'marketingMessages' => $query->latest()->paginate(15)->appends($request->except('page')),
  28. 'userGroups' => UserGroup::all()->pluck('name', 'id')->toArray(),
  29. 'levels' => Level::all()->pluck('name', 'level')->toArray(),
  30. ]);
  31. }
  32. // 推送消息
  33. public function create(string $type, Request $request): JsonResponse
  34. {
  35. if ($request->isMethod('GET')) {
  36. return Response::json(['status' => 'success', 'count' => $this->userStat($request)]);
  37. }
  38. $validator = Validator::make($request->all(), ['title' => 'required|string', 'content' => 'required|string']);
  39. if ($validator->fails()) {
  40. return Response::json(['status' => 'fail', 'message' => $validator->getMessageBag()->first()]);
  41. }
  42. $title = $request->input('title');
  43. $content = $request->input('content');
  44. if ($type === 'push') {
  45. // if (! sysConfig('is_push_bear')) {
  46. // return Response::json(['status' => 'fail', 'message' => '推送失败:请先启用并配置PushBear']);
  47. // }
  48. //
  49. // Notification::send(PushBearChannel::class, new Custom($title, $content));
  50. // return Response::json(['status' => 'success', 'message' => '发送完成']);
  51. return Response::json(['status' => 'fail', 'message' => trans('common.developing')]);
  52. }
  53. if ($type === 'email') {
  54. $users = $this->userStat($request);
  55. if ($users->isNotEmpty()) {
  56. Notification::send($users, new Custom($title, $content, ['mail']));
  57. Helpers::addMarketing($users->pluck('id')->toJson(), '1', $title, $content);
  58. return Response::json(['status' => 'success', 'message' => trans('admin.marketing.processed')]);
  59. }
  60. return Response::json(['status' => 'fail', 'message' => trans('admin.marketing.targeted_users_not_found')]);
  61. }
  62. return Response::json(['status' => 'fail', 'message' => trans('admin.marketing.unknown_sending_type')]);
  63. }
  64. private function userStat(Request $request)
  65. {
  66. $users = User::query();
  67. foreach (['id', 'username', 'status', 'enable', 'user_group_id', 'level'] as $field) {
  68. $request->whenFilled($field, function ($value) use ($users, $field) {
  69. $users->whereIn($field, array_map('trim', explode(',', $value)));
  70. });
  71. }
  72. // 流量使用超过N%
  73. $request->whenFilled('traffic', function (int $value) use ($users) {
  74. $users->whereRaw('(u + d)/transfer_enable >= ?', [$value / 100]);
  75. });
  76. // 过期日期
  77. $request->whenFilled('expire_start', function ($value) use ($users) {
  78. $users->where('expired_at', '>=', $value);
  79. });
  80. $request->whenFilled('expire_end', function ($value) use ($users) {
  81. $users->where('expired_at', '<=', $value);
  82. });
  83. // 最近N分钟活跃过
  84. $request->whenFilled('lastAlive', function ($value) use ($users) {
  85. $users->where('t', '>=', Carbon::now()->subMinutes($value)->timestamp);
  86. });
  87. $paidOrderCondition = function ($query) {
  88. $query->whereStatus(2)->whereNotNull('goods_id')->where('amount', '>', 0);
  89. };
  90. // 付费服务中
  91. $request->whenFilled('paying', function () use ($users) {
  92. $users->whereHas('orders', function ($query) {
  93. $query->whereStatus(2)->whereNotNull('goods_id')->whereIsExpire(0)->where('amount', '>', 0);
  94. });
  95. });
  96. // 曾付费但当前无服务
  97. $request->whenFilled('notPaying', function () use ($users, $paidOrderCondition) {
  98. $users->whereHas('orders', $paidOrderCondition)->whereDoesntHave('orders', function ($query) use ($paidOrderCondition) {
  99. $query->where($paidOrderCondition)->whereIsExpire(0);
  100. });
  101. });
  102. // 付费购买过
  103. $request->whenFilled('paid', function () use ($users, $paidOrderCondition) {
  104. $users->whereHas('orders', $paidOrderCondition);
  105. });
  106. // 从未付费购买过
  107. $request->whenFilled('neverPay', function () use ($users, $paidOrderCondition) {
  108. $users->whereDoesntHave('orders', $paidOrderCondition);
  109. });
  110. // 1小时内流量异常用户
  111. $request->whenFilled('flowAbnormal', function () use ($users) {
  112. $users->whereIn('id', (new UserHourlyDataFlow)->trafficAbnormal());
  113. });
  114. return $request->isMethod('POST') ? $users->get() : $users->count();
  115. }
  116. }