Files
ProxyPanel/app/Http/Controllers/Admin/MarketingController.php
2025-01-01 16:40:07 +08:00

141 lines
5.4 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Level;
use App\Models\Marketing;
use App\Models\User;
use App\Models\UserGroup;
use App\Models\UserHourlyDataFlow;
use App\Notifications\Custom;
use Helpers;
use Illuminate\Contracts\View\View;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Notification;
use Validator;
class MarketingController extends Controller
{
public function index(Request $request): View
{ // 群发消息列表
$query = Marketing::query();
$request->whenFilled('status', function ($value) use ($query) {
$query->whereStatus($value);
});
return view('admin.article.marketing', [
'marketingMessages' => $query->latest()->paginate(15)->appends($request->except('page')),
'userGroups' => UserGroup::all()->pluck('name', 'id')->toArray(),
'levels' => Level::all()->pluck('name', 'level')->toArray(),
]);
}
public function create(string $type, Request $request): JsonResponse
{ // 推送消息
if ($request->isMethod('GET')) {
return response()->json(['status' => 'success', 'count' => $this->userStat($request)]);
}
$validator = Validator::make($request->all(), ['title' => 'required|string', 'content' => 'required|string']);
if ($validator->fails()) {
return response()->json(['status' => 'fail', 'message' => $validator->getMessageBag()->first()]);
}
$title = $request->input('title');
$content = $request->input('content');
if ($type === 'push') {
// if (! sysConfig('is_push_bear')) {
// return response()->json(['status' => 'fail', 'message' => '推送失败请先启用并配置PushBear']);
// }
//
// Notification::send(PushBearChannel::class, new Custom($title, $content));
// return response()->json(['status' => 'success', 'message' => '发送完成']);
return response()->json(['status' => 'fail', 'message' => trans('common.developing')]);
}
if ($type === 'email') {
$users = $this->userStat($request);
if ($users->isNotEmpty()) {
Notification::send($users, new Custom($title, $content, ['mail']));
Helpers::addMarketing($users->pluck('id')->toJson(), '1', $title, $content);
return response()->json(['status' => 'success', 'message' => trans('admin.marketing.processed')]);
}
return response()->json(['status' => 'fail', 'message' => trans('admin.marketing.targeted_users_not_found')]);
}
return response()->json(['status' => 'fail', 'message' => trans('admin.marketing.unknown_sending_type')]);
}
private function userStat(Request $request): Collection|int
{
$users = User::query();
foreach (['id', 'username', 'status', 'enable', 'user_group_id', 'level'] as $field) {
$request->whenFilled($field, function ($value) use ($users, $field) {
$users->whereIn($field, array_map('trim', explode(',', $value)));
});
}
// 流量使用超过N%
$request->whenFilled('traffic', function (int $value) use ($users) {
$users->whereRaw('(u + d)/transfer_enable >= ?', [$value / 100]);
});
// 过期日期
$request->whenFilled('expire_start', function ($value) use ($users) {
$users->where('expired_at', '>=', $value);
});
$request->whenFilled('expire_end', function ($value) use ($users) {
$users->where('expired_at', '<=', $value);
});
// 最近N分钟活跃过
$request->whenFilled('lastAlive', function ($value) use ($users) {
$users->where('t', '>=', now()->subMinutes($value)->timestamp);
});
$paidOrderCondition = function ($query) {
$query->whereStatus(2)->whereNotNull('goods_id')->where('amount', '>', 0);
};
// 付费服务中
$request->whenFilled('paying', function () use ($users) {
$users->whereHas('orders', function ($query) {
$query->whereStatus(2)->whereNotNull('goods_id')->whereIsExpire(0)->where('amount', '>', 0);
});
});
// 曾付费但当前无服务
$request->whenFilled('notPaying', function () use ($users, $paidOrderCondition) {
$users->whereHas('orders', $paidOrderCondition)->whereDoesntHave('orders', function ($query) use ($paidOrderCondition) {
$query->where($paidOrderCondition)->whereIsExpire(0);
});
});
// 付费购买过
$request->whenFilled('paid', function () use ($users, $paidOrderCondition) {
$users->whereHas('orders', $paidOrderCondition);
});
// 从未付费购买过
$request->whenFilled('neverPay', function () use ($users, $paidOrderCondition) {
$users->whereDoesntHave('orders', $paidOrderCondition);
});
// 1小时内流量异常用户
$request->whenFilled('flowAbnormal', function () use ($users) {
$users->whereIn('id', (new UserHourlyDataFlow)->trafficAbnormal());
});
return $request->isMethod('POST') ? $users->get() : $users->count();
}
}