ufutx.dma/app/Http/Controllers/ChatController.php
2026-03-04 14:42:40 +08:00

137 lines
5.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Facades\ChatService;
use App\Http\Response\ResponseJson;
use App\Models\Group;
use App\Models\GroupMessage;
use App\Models\GroupMessageConfig;
use App\Models\GroupUser;
use App\Models\Guide;
use App\Models\Order;
use GatewayClient\Gateway;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redis;
class ChatController extends Controller
{
use ResponseJson;
public function __construct()
{
if (config('app.env') == 'production'){
Gateway::$registerAddress = '192.168.1.204:1238';
}else {
Gateway::$registerAddress = '192.168.62.13:1238';
}
}
public function bindClient(Request $request, $client_id)
{
ChatService::bindUid($client_id, auth()->id());
return $this->success('ok');
}
public function joinGroup(Request $request)
{
$user_id = auth()->id();
//最近订单
$order = Order::with('group')->where('user_id', $user_id)->where('pay_status', 'PAID')->orderByDesc('id')->first();
$client_id = ChatService::getClientIdByUid($user_id);
if (empty($client_id)) return $this->failure("已断开连接");
ChatService::joinGroup($client_id, $order->group->id);
$order->group->order_user_id = $user_id;
return $this->success('ok', $order->group);
}
public function groupInfo(Request $request, Group $group)
{
//群成员
$group->users;
return $this->success('ok', $group);
}
public function leaveGroup(Request $request)
{
$client_id = ChatService::getClientIdByUid(auth()->id());
$group_id = $request->input('group_id');
ChatService::leaveGroup($client_id, $group_id);
return $this->success('ok');
}
public function sendMessage(Request $request, $group_id)
{
$user = auth()->user();
$content_type = $request->input('content_type');
$content = $request->input('content');
//记录数据库 todo
$message = [
'group_id'=>$group_id,
'user_id'=>$user->id,
'content'=>$content,
'content_type'=>$content_type,
];
DB::beginTransaction();
$msg = GroupMessage::create($message);
//获取某个分组所有在线uid列表。
$uid_infos = ChatService::getUidListByGroup($group_id);
if (is_array($uid_infos) && count($uid_infos)) {
//在线用户
$uids = array_keys($uid_infos);
//所有用户
$group_user_ids = GroupUser::where('group_id', $group_id)->pluck('user_id')->toArray();
$diff_user_ids = array_diff($group_user_ids, $uids);
foreach ($diff_user_ids as $uid) {
if ($uid == $user->id) continue;
$config = GroupMessageConfig::firstOrCreate(['group_id'=>$group_id, 'user_id'=>$uid]);
GroupMessageConfig::where(['id'=>$config->id])->update(['last_msg_id'=>$msg->id]);
}
}
DB::commit();
//获取客户端id
$res = ChatService::getClientIdByUid($user->id);
if (empty($res)) return $this->failure("已断开连接");
// Log::info('用户id: '.$user->id);
// Log::info('客户端id: '.$res);
//发送socket消息
$role_name = GroupUser::where(['group_id'=>$group_id, 'user_id'=>$user->id])->value('role_name');
$message = ['type'=>'say', 'from_client_id'=>$res, 'from_client_name'=>$user->name, 'from_client_avatar'=>$user->avatar, 'from_user_id'=>$user->id, 'content'=>$content, 'content_type'=>$content_type,'created_at'=>$msg->created_at->toDateTimeString(), 'message_id'=>$msg->id, 'role_name'=>$role_name];
ChatService::sendToGroup($group_id, $message);
return $this->success('ok');
}
public function chatMessages(Request $request, $group_id)
{
$group_users = GroupUser::where('group_id', $group_id)->get();
$messages = GroupMessage::with('user')->where('group_id', $group_id)->orderByDesc('id')->simplePaginate(30);
foreach ($messages as $message) {
$role = $group_users->where('user_id', $message->user_id)->first();
$message->role_name = $role? $role->role_name:'';
}
return $this->success('ok', $messages);
}
/**
* 服务人员进入群聊
* @param Request $request
* @param Order $order
*/
public function serviceJoinGroup(Request $request, Order $order)
{
$client_id = ChatService::getClientIdByUid(auth()->id());
ChatService::joinGroup($client_id, $order->group->id);
return $this->success('ok', $order->group);
}
public function serviceJoinGroupV2(Request $request, Group $group)
{
$group->order_user_id = $group->order->user_id;
$client_id = ChatService::getClientIdByUid(auth()->id());
ChatService::joinGroup($client_id, $group->id);
unset($group->order);
return $this->success('ok', $group);
}
}