MarketingController.php 5.0 KB

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