新增赠送金币功能:任意用户可从自己余额赠送金币给他人,成功后聊天室系统传音广播;职务奖励金币移入管理区,删除管理区私信按钮

This commit is contained in:
2026-03-18 20:12:17 +08:00
parent c7063e02c2
commit 0ca028f73d
5 changed files with 137 additions and 9 deletions

View File

@@ -1135,4 +1135,73 @@ class ChatController extends Controller
return $isLeveledUp;
}
/**
* 用户间赠送金币(任何登录用户均可调用)
*
* 从自己的余额中扣除指定金额,转入对方账户,
* 并在房间内通过「系统传音」广播一条赠送提示。
*/
public function giftGold(Request $request): JsonResponse
{
$request->validate([
'to_user' => 'required|string',
'room_id' => 'required|integer',
'amount' => 'required|integer|min:1|max:999999',
]);
$sender = Auth::user();
$toName = $request->input('to_user');
$roomId = $request->integer('room_id');
$amount = $request->integer('amount');
// 不能给自己转账
if ($toName === $sender->username) {
return response()->json(['status' => 'error', 'message' => '不能给自己赠送哦~']);
}
// 查目标用户
$receiver = User::where('username', $toName)->first();
if (! $receiver) {
return response()->json(['status' => 'error', 'message' => '用户不存在']);
}
// 余额校验
if (($sender->jjb ?? 0) < $amount) {
return response()->json([
'status' => 'error',
'message' => '金币不足!您当前余额 '.($sender->jjb ?? 0)." 金币,无法赠送 {$amount} 金币。",
]);
}
// 执行转账(直接操作字段,与 sendFlower 保持一致风格)
$sender->decrement('jjb', $amount);
$receiver->increment('jjb', $amount);
// 广播「系统传音」条目至全房间
$sysMsg = [
'id' => $this->chatState->nextMessageId($roomId),
'room_id' => $roomId,
'from_user' => '系统传音',
'to_user' => '大家',
'content' => "💝 【{$sender->username}】 向 【{$toName}】 赠送了 {$amount} 金币!",
'is_secret' => false,
'font_color' => '#b45309',
'action' => '',
'sent_at' => now()->toDateTimeString(),
];
$this->chatState->pushMessage($roomId, $sysMsg);
broadcast(new MessageSent($roomId, $sysMsg));
SaveMessageJob::dispatch($sysMsg);
return response()->json([
'status' => 'success',
'message' => "赠送成功!已向 {$toName} 赠送 {$amount} 金币。",
'data' => [
'my_jjb' => $sender->fresh()->jjb,
'target_jjb' => $receiver->fresh()->jjb,
],
]);
}
}