MemberUserService.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. <?php
  2. namespace App\Services;
  3. use App\Enums\TransactionStatus;
  4. use App\Enums\TransactionType;
  5. use App\Enums\UserStatus;
  6. use App\Models\MemberBadBehavior;
  7. use App\Models\MemberUser;
  8. use App\Models\WalletTransRecord;
  9. use Illuminate\Support\Facades\Auth;
  10. use Illuminate\Support\Facades\DB;
  11. use Illuminate\Support\Facades\Log;
  12. use Slowlyo\OwlAdmin\Services\AdminService;
  13. /**
  14. * 用户管理
  15. *
  16. * @method MemberUser getModel()
  17. * @method MemberUser|\Illuminate\Database\Query\Builder query()
  18. */
  19. class MemberUserService extends AdminService
  20. {
  21. protected string $modelName = MemberUser::class;
  22. /**
  23. * 获取用户列表
  24. *
  25. * @param array $params 查询参数
  26. */
  27. public function manageUserList($viewName, array $whereParams, array $pageParams, array $sortParams = [])
  28. {
  29. try {
  30. $query = DB::table($viewName);
  31. // 获取分页数据
  32. // 条件筛选
  33. foreach ($whereParams as $key => $value) {
  34. if (is_string($value)) {
  35. $query->where($key, 'like', "%{$value}%");
  36. } else {
  37. $query->where($key, $value);
  38. }
  39. }
  40. // 排序
  41. ! empty($sortParams) && $query->orderBy($sortParams['orderBy'], $sortParams['orderDir']);
  42. $result = $query->paginate($pageParams['perPage'], ['*'], 'page', $pageParams['page']);
  43. return response()->json([
  44. 'code' => 200,
  45. 'message' => 'success',
  46. 'data' => $result,
  47. ]);
  48. } catch (\Exception $e) {
  49. Log::error('获取用户列表失败:'.$e->getMessage());
  50. return response()->json([
  51. 'code' => 500,
  52. 'message' => '获取用户列表失败',
  53. ]);
  54. }
  55. }
  56. /**
  57. * 拉黑用户
  58. *
  59. * @param array $data 包含 user_id 和 reason
  60. */
  61. public function blockUser(array $data): array
  62. {
  63. try {
  64. DB::beginTransaction();
  65. // 获取用户信息
  66. $user = MemberUser::findOrFail($data['user_id']);
  67. // 验证用户当前状态
  68. abort_if($user->state === UserStatus::CLOSE->value, 422, '用户已经被拉黑');
  69. // 更新用户状态为拉黑
  70. $user->state = UserStatus::CLOSE->value;
  71. $user->save();
  72. DB::commit();
  73. return [
  74. 'code' => 200,
  75. 'message' => '拉黑成功',
  76. 'data' => null,
  77. ];
  78. } catch (\Exception $e) {
  79. DB::rollBack();
  80. Log::error('拉黑用户失败', [
  81. 'user_id' => $data['user_id'],
  82. 'error' => $e->getMessage(),
  83. 'trace' => $e->getTraceAsString(),
  84. ]);
  85. throw $e;
  86. }
  87. }
  88. /**
  89. * 冻结用户余额
  90. *
  91. * @param array $data 包含 user_id, amount 和 reason
  92. */
  93. public function freezeUserBalance(array $data): array
  94. {
  95. try {
  96. DB::beginTransaction();
  97. // 获取用户及其钱包信息
  98. $user = MemberUser::with('wallet')->findOrFail($data['user_id']);
  99. $wallet = $user->wallet()->lockForUpdate()->firstOrFail();
  100. // 验证可用余额是否足够
  101. abort_if($wallet->available_amount < $data['amount'], 422, '用户可用余额不足');
  102. // 更新钱包余额
  103. $wallet->available_amount -= $data['amount'];
  104. $wallet->frozen_amount += $data['amount'];
  105. $wallet->save();
  106. // 记录冻结流水
  107. WalletTransRecord::create([
  108. 'user_id' => $data['user_id'],
  109. 'type' => TransactionType::FREEZE->value,
  110. 'amount' => $data['amount'],
  111. 'before_amount' => $wallet->available_amount + $data['amount'],
  112. 'after_amount' => $wallet->available_amount,
  113. 'operator_id' => Auth::user()->id,
  114. 'operator_type' => 'admin',
  115. 'remark' => $data['reason'],
  116. 'state' => TransactionStatus::SUCCESS->value,
  117. ]);
  118. DB::commit();
  119. return [
  120. 'code' => 200,
  121. 'message' => '冻结成功',
  122. 'data' => null,
  123. ];
  124. } catch (\Exception $e) {
  125. DB::rollBack();
  126. Log::error('冻结用户余额失败', [
  127. 'user_id' => $data['user_id'],
  128. 'amount' => $data['amount'],
  129. 'error' => $e->getMessage(),
  130. 'trace' => $e->getTraceAsString(),
  131. ]);
  132. throw $e;
  133. }
  134. }
  135. /**
  136. * 记录用户不良行为
  137. *
  138. * @param array $data 包含 user_id, type, title, description, evidence(可选), related_order_id(可选)
  139. */
  140. public function recordBadBehavior(array $data): array
  141. {
  142. try {
  143. DB::beginTransaction();
  144. // 验证用户是否存在
  145. $user = MemberUser::findOrFail($data['user_id']);
  146. // 创建不良行为记录
  147. MemberBadBehavior::create([
  148. 'user_id' => $data['user_id'],
  149. 'type' => $data['type'],
  150. 'title' => $data['title'],
  151. 'description' => $data['description'],
  152. 'evidence' => $data['evidence'] ?? null,
  153. 'related_order_id' => $data['related_order_id'] ?? null,
  154. 'operator_id' => Auth::user()->id,
  155. 'operator_type' => 'admin',
  156. 'occurred_at' => $data['occurred_at'] ?? now(),
  157. ]);
  158. DB::commit();
  159. return [
  160. 'code' => 200,
  161. 'message' => '记录成功',
  162. 'data' => null,
  163. ];
  164. } catch (\Exception $e) {
  165. DB::rollBack();
  166. Log::error('记录用户不良行为失败', [
  167. 'user_id' => $data['user_id'],
  168. 'type' => $data['type'],
  169. 'error' => $e->getMessage(),
  170. 'trace' => $e->getTraceAsString(),
  171. ]);
  172. throw $e;
  173. }
  174. }
  175. }