|
@@ -2,8 +2,12 @@
|
|
|
|
|
|
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;
|
|
@@ -99,4 +103,107 @@ class MemberUserService extends AdminService
|
|
|
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;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|