123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- <?php
- namespace App\Services;
- use App\Enums\TransactionStatus;
- use App\Enums\TransactionType;
- use App\Enums\UserStatus;
- use App\Models\MemberBadBehavior;
- use App\Models\MemberUser;
- use App\Models\WalletTransRecord;
- use Illuminate\Support\Facades\Auth;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Log;
- use Slowlyo\OwlAdmin\Services\AdminService;
- /**
- * 用户管理
- *
- * @method MemberUser getModel()
- * @method MemberUser|\Illuminate\Database\Query\Builder query()
- */
- class MemberUserService extends AdminService
- {
- protected string $modelName = MemberUser::class;
- /**
- * 获取用户列表
- *
- * @param array $params 查询参数
- */
- public function manageUserList($viewName, array $whereParams, array $pageParams, array $sortParams = [])
- {
- try {
- $query = DB::table($viewName);
- // 获取分页数据
- // 条件筛选
- foreach ($whereParams as $key => $value) {
- if (is_string($value)) {
- $query->where($key, 'like', "%{$value}%");
- } else {
- $query->where($key, $value);
- }
- }
- // 排序
- ! empty($sortParams) && $query->orderBy($sortParams['orderBy'], $sortParams['orderDir']);
- $result = $query->paginate($pageParams['perPage'], ['*'], 'page', $pageParams['page']);
- return response()->json([
- 'code' => 200,
- 'message' => 'success',
- 'data' => $result,
- ]);
- } catch (\Exception $e) {
- Log::error('获取用户列表失败:'.$e->getMessage());
- return response()->json([
- 'code' => 500,
- 'message' => '获取用户列表失败',
- ]);
- }
- }
- /**
- * 拉黑用户
- *
- * @param array $data 包含 user_id 和 reason
- */
- public function blockUser(array $data): array
- {
- try {
- DB::beginTransaction();
- // 获取用户信息
- $user = MemberUser::findOrFail($data['user_id']);
- // 验证用户当前状态
- abort_if($user->state === UserStatus::CLOSE->value, 422, '用户已经被拉黑');
- // 更新用户状态为拉黑
- $user->state = UserStatus::CLOSE->value;
- $user->save();
- DB::commit();
- return [
- 'code' => 200,
- 'message' => '拉黑成功',
- 'data' => null,
- ];
- } catch (\Exception $e) {
- DB::rollBack();
- Log::error('拉黑用户失败', [
- 'user_id' => $data['user_id'],
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- ]);
- throw $e;
- }
- }
- /**
- * 冻结用户余额
- *
- * @param array $data 包含 user_id, amount 和 reason
- */
- public function freezeUserBalance(array $data): array
- {
- try {
- DB::beginTransaction();
- // 获取用户及其钱包信息
- $user = MemberUser::with('wallet')->findOrFail($data['user_id']);
- $wallet = $user->wallet()->lockForUpdate()->firstOrFail();
- // 验证可用余额是否足够
- abort_if($wallet->available_amount < $data['amount'], 422, '用户可用余额不足');
- // 更新钱包余额
- $wallet->available_amount -= $data['amount'];
- $wallet->frozen_amount += $data['amount'];
- $wallet->save();
- // 记录冻结流水
- WalletTransRecord::create([
- 'user_id' => $data['user_id'],
- 'type' => TransactionType::FREEZE->value,
- 'amount' => $data['amount'],
- 'before_amount' => $wallet->available_amount + $data['amount'],
- 'after_amount' => $wallet->available_amount,
- 'operator_id' => Auth::user()->id,
- 'operator_type' => 'admin',
- 'remark' => $data['reason'],
- 'state' => TransactionStatus::SUCCESS->value,
- ]);
- DB::commit();
- return [
- 'code' => 200,
- 'message' => '冻结成功',
- 'data' => null,
- ];
- } catch (\Exception $e) {
- DB::rollBack();
- Log::error('冻结用户余额失败', [
- 'user_id' => $data['user_id'],
- 'amount' => $data['amount'],
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- ]);
- throw $e;
- }
- }
- /**
- * 记录用户不良行为
- *
- * @param array $data 包含 user_id, type, title, description, evidence(可选), related_order_id(可选)
- */
- public function recordBadBehavior(array $data): array
- {
- try {
- DB::beginTransaction();
- // 验证用户是否存在
- $user = MemberUser::findOrFail($data['user_id']);
- // 创建不良行为记录
- MemberBadBehavior::create([
- 'user_id' => $data['user_id'],
- 'type' => $data['type'],
- 'title' => $data['title'],
- 'description' => $data['description'],
- 'evidence' => $data['evidence'] ?? null,
- 'related_order_id' => $data['related_order_id'] ?? null,
- 'operator_id' => Auth::user()->id,
- 'operator_type' => 'admin',
- 'occurred_at' => $data['occurred_at'] ?? now(),
- ]);
- DB::commit();
- return [
- 'code' => 200,
- 'message' => '记录成功',
- 'data' => null,
- ];
- } catch (\Exception $e) {
- DB::rollBack();
- Log::error('记录用户不良行为失败', [
- 'user_id' => $data['user_id'],
- 'type' => $data['type'],
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- ]);
- throw $e;
- }
- }
- }
|