MarketingController.php 5.3 KB

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