add im api
This commit is contained in:
parent
caa048d50d
commit
057d9091f2
@ -3,6 +3,9 @@
|
||||
namespace app\common\controller;
|
||||
|
||||
use alioss\alioss;
|
||||
use app\common\model\auth\Admin;
|
||||
use app\common\model\auth\AdminRole;
|
||||
use app\common\model\Company;
|
||||
use app\common\model\im\UserImMessage;
|
||||
use app\common\model\user\User;
|
||||
use GatewayClient\Gateway;
|
||||
@ -10,6 +13,54 @@ use think\response\Json;
|
||||
|
||||
class ImController extends BaseLikeAdminController
|
||||
{
|
||||
//获取场景值
|
||||
private function sceneText($scene): string
|
||||
{
|
||||
if($scene == 0){
|
||||
$scene = 'app';
|
||||
}else{
|
||||
$scene = 'web';
|
||||
}
|
||||
return $scene;
|
||||
}
|
||||
|
||||
//获取发送者信息
|
||||
private function getFromUserInfo($uid,$scene): array
|
||||
{
|
||||
//如果是从app端发送的消息,发送者为app端的user用户
|
||||
//如果是从web端发送的消息,发送者为web端的admin用户
|
||||
if($scene == 0){
|
||||
//app端 获取user表数据
|
||||
$data = User::field('id,nickname as name,avatar')->where('id',$uid)->findOrEmpty()->toArray();
|
||||
}elseif($scene == 1){
|
||||
//web端 获取admin表数据
|
||||
$data = Admin::field('id,name,avatar')->where('id',$uid)->findOrEmpty()->toArray();
|
||||
|
||||
}else{
|
||||
$data = [];
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
//获取接收者信息
|
||||
private function getToUserInfo($uid,$scene): array
|
||||
{
|
||||
//如果是从app端发送的消息,接收者为web端的admin用户
|
||||
//如果是从web端发送的消息,接收者为app端的user用户
|
||||
if($scene == 0){
|
||||
//app端 获取admin表数据
|
||||
$data = Admin::field('id,name,avatar')->where('id',$uid)->findOrEmpty()->toArray();
|
||||
}elseif($scene == 1){
|
||||
//web端 获取user表数据
|
||||
$data = User::field('id,nickname as name,avatar')->where('id',$uid)->findOrEmpty()->toArray();
|
||||
}else{
|
||||
$data = [];
|
||||
}
|
||||
return $data;
|
||||
}
|
||||
|
||||
/*****************************************************************************************************************************************************************************/
|
||||
|
||||
//绑定uid
|
||||
public function doBindUid(): Json
|
||||
{
|
||||
@ -18,126 +69,127 @@ class ImController extends BaseLikeAdminController
|
||||
return $this->fail('请求方式错误');
|
||||
}
|
||||
//获取请求参数
|
||||
$params = $this->request->post(['client_id','user_id']);
|
||||
if(empty($params['client_id']) || empty($params['user_id'])){
|
||||
$params = $this->request->post(['client_id','user_id','scene']);
|
||||
if(empty($params['client_id']) || empty($params['user_id']) || !isset($params['scene'])){
|
||||
return $this->fail('参数错误');
|
||||
}
|
||||
Gateway::bindUid($params['client_id'], $params['user_id']);
|
||||
if(!in_array($params['scene'],[0,1])){
|
||||
return $this->fail('场景错误');
|
||||
}
|
||||
Gateway::bindUid($params['client_id'], $this->sceneText($params['scene']).'_'.$params['user_id']);
|
||||
return $this->success('绑定成功');
|
||||
}
|
||||
|
||||
//发送消息
|
||||
public function sendMessage(): Json
|
||||
public function sendTextMsg(): Json
|
||||
{
|
||||
//验证请求方式
|
||||
if(!$this->request->isPost()){
|
||||
return $this->fail('请求方式错误');
|
||||
}
|
||||
//获取请求参数
|
||||
$params = $this->request->post(['msg_id','from_user_id','to_user_id','content','type']);
|
||||
if(empty($params['msg_id']) || empty($params['from_user_id']) || empty($params['to_user_id']) || empty($params['content']) || empty($params['type'])){
|
||||
$params = $this->request->post(['from_user_id','to_user_id','content','type','scene']);
|
||||
//验证请求参数
|
||||
if(empty($params['from_user_id']) || empty($params['to_user_id']) || empty($params['content']) || empty($params['type']) || !isset($params['scene'])){
|
||||
return $this->fail('参数错误');
|
||||
}
|
||||
if(!in_array($params['type'],['text','image','video'])){
|
||||
if($params['type'] !== 'text'){
|
||||
return $this->fail('消息类型错误');
|
||||
}
|
||||
//判断消息是否存在
|
||||
$msgData = UserImMessage::where('msg_id',$params['msg_id'])->findOrEmpty();
|
||||
if(!$msgData->isEmpty()){
|
||||
return $this->fail('该消息已发送');
|
||||
if(!in_array($params['scene'],[0,1])){
|
||||
return $this->fail('消息场景错误');
|
||||
}
|
||||
//获取发送者信息
|
||||
$fromUserInfo = User::where('id',$params['from_user_id'])->findOrEmpty();;
|
||||
if($fromUserInfo->isEmpty()){
|
||||
return $this->fail('未找到发送者信息');
|
||||
$fromUserInfo = $this->getFromUserInfo($params['from_user_id'],$params['scene']);
|
||||
if(empty($fromUserInfo)){
|
||||
return $this->fail('发送者信息错误');
|
||||
}
|
||||
//获取接收者信息
|
||||
$toUserInfo = User::where('id',$params['to_user_id'])->findOrEmpty();
|
||||
if($toUserInfo->isEmpty()){
|
||||
return $this->fail('未找到接收者信息');
|
||||
$toUserInfo = $this->getToUserInfo($params['to_user_id'],$params['scene']);
|
||||
if(empty($toUserInfo)){
|
||||
return $this->fail('接收者信息错误');
|
||||
}
|
||||
//存储信息
|
||||
$saveData = [
|
||||
'msg_id' => $params['msg_id'],
|
||||
'from_user_id' => $params['from_user_id'],
|
||||
'to_user_id' => $params['to_user_id'],
|
||||
'content' => $params['content'],
|
||||
'type' => 'type',
|
||||
'is_read' => 1,
|
||||
'type' => $params['type'],
|
||||
'is_read' => 0,
|
||||
'is_undo' => 0,
|
||||
'is_delete' => 0,
|
||||
'create_time' => time(),
|
||||
'extends' => null,
|
||||
];
|
||||
//发送消息
|
||||
$sendData = [
|
||||
'msg_id' => $params['msg_id'],
|
||||
'from_user_id' => $params['from_user_id'],
|
||||
'from_user_name' => $fromUserInfo['nickname'],
|
||||
'from_user_avatar' => $fromUserInfo['avatar'],
|
||||
'to_user_id' => $params['to_user_id'],
|
||||
'to_user_name' => $toUserInfo['nickname'],
|
||||
'to_user_avatar' => $toUserInfo['avatar'],
|
||||
'content' => $params['content'],
|
||||
'type' => 'type',
|
||||
'is_read' => 0,
|
||||
'is_undo' => 0,
|
||||
'is_delete' => 0,
|
||||
'create_time' => $saveData['create_time'],
|
||||
'extends' => null,
|
||||
];
|
||||
//保存消息
|
||||
try {
|
||||
$model = new UserImMessage();
|
||||
$result = $model->save($saveData);
|
||||
if($result){
|
||||
Gateway::sendToUid($params['to_user_id'], json_encode($sendData));
|
||||
return $this->success('发送成功');
|
||||
}else{
|
||||
$model->save($saveData);
|
||||
if(empty($model->id)){
|
||||
return $this->fail('发送失败');
|
||||
}
|
||||
//发送消息
|
||||
$sendData = [
|
||||
'id' => $model->id,
|
||||
'from_user_id' => $params['from_user_id'],
|
||||
'from_user_name' => $fromUserInfo['name'],
|
||||
'from_user_avatar' => $fromUserInfo['avatar'],
|
||||
'to_user_id' => $params['to_user_id'],
|
||||
'to_user_name' => $toUserInfo['name'],
|
||||
'to_user_avatar' => $toUserInfo['avatar'],
|
||||
'content' => $params['content'],
|
||||
'type' => $params['type'],
|
||||
'is_read' => 0,
|
||||
'create_time' => $saveData['create_time'],
|
||||
'extends' => null,
|
||||
];
|
||||
if($params['scene'] == 0) {
|
||||
//给admin用户发
|
||||
Gateway::sendToUid($this->sceneText(1).'_'.$params['to_user_id'], json_encode($sendData));
|
||||
}else{
|
||||
//给user用户发
|
||||
Gateway::sendToUid($this->sceneText(0).'_'.$params['to_user_id'], json_encode($sendData));
|
||||
}
|
||||
return $this->success('发送成功');
|
||||
}catch (\Exception $e) {
|
||||
return $this->fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
//上传文件
|
||||
public function upload(): Json
|
||||
public function sendFileMsg(): Json
|
||||
{
|
||||
//验证请求方式
|
||||
if(!$this->request->isPost()){
|
||||
return $this->fail('请求方式错误');
|
||||
}
|
||||
//获取请求参数
|
||||
$params = $this->request->post(['msg_id','from_user_id','to_user_id','type']);
|
||||
$params = $this->request->post(['from_user_id','to_user_id','type','scene']);
|
||||
//获取参数
|
||||
$file = $this->request->file('file');
|
||||
if(empty($file) || empty($params['msg_id']) || empty($params['from_user_id']) || empty($params['to_user_id']) || empty($params['type'])){
|
||||
if(empty($file) || empty($params['from_user_id']) || empty($params['to_user_id']) || empty($params['type']) || !isset($params['scene'])){
|
||||
return $this->fail('参数错误');
|
||||
}
|
||||
if(!in_array($params['type'],['image','video'])){
|
||||
return $this->fail('消息类型错误');
|
||||
}
|
||||
//判断消息是否存在
|
||||
$msgData = UserImMessage::where('msg_id',$params['msg_id'])->findOrEmpty();
|
||||
if(!$msgData->isEmpty()){
|
||||
return $this->fail('该消息已发送');
|
||||
if(!in_array($params['scene'],[0,1])){
|
||||
return $this->fail('消息场景错误');
|
||||
}
|
||||
//获取发送者信息
|
||||
$fromUserInfo = User::where('id',$params['from_user_id'])->findOrEmpty();;
|
||||
if($fromUserInfo->isEmpty()){
|
||||
return $this->fail('未找到发送者信息');
|
||||
$fromUserInfo = $this->getFromUserInfo($params['from_user_id'],$params['scene']);
|
||||
if(empty($fromUserInfo)){
|
||||
return $this->fail('发送者信息错误');
|
||||
}
|
||||
//获取接收者信息
|
||||
$toUserInfo = User::where('id',$params['to_user_id'])->findOrEmpty();
|
||||
if($toUserInfo->isEmpty()){
|
||||
return $this->fail('未找到接收者信息');
|
||||
$toUserInfo = $this->getToUserInfo($params['to_user_id'],$params['scene']);
|
||||
if(empty($toUserInfo)){
|
||||
return $this->fail('接收者信息错误');
|
||||
}
|
||||
$filePath =$file->getRealPath();
|
||||
$fileType = $file->extension();
|
||||
$fileSize = $file->getSize();
|
||||
$ali_oss = new alioss();
|
||||
$result = '';
|
||||
switch ($params['type']) {
|
||||
case 'image':
|
||||
$result = $ali_oss -> uploadImg($filePath,$fileType,$fileSize);
|
||||
@ -148,23 +200,30 @@ class ImController extends BaseLikeAdminController
|
||||
default:
|
||||
return $this->fail('文件类型错误~');
|
||||
}
|
||||
if($result && $result['code'] == 1){
|
||||
//存储信息
|
||||
$saveData = [
|
||||
'msg_id' => $params['msg_id'],
|
||||
'from_user_id' => $params['from_user_id'],
|
||||
'to_user_id' => $params['to_user_id'],
|
||||
'content' => $result['data'],
|
||||
'type' => 'type',
|
||||
'is_read' => 1,
|
||||
'is_undo' => 0,
|
||||
'is_delete' => 0,
|
||||
'create_time' => time(),
|
||||
'extends' => $params['type'] == 'video' ? json_encode(['poster_img'=>$result['data'].'?x-oss-process=video/snapshot,t_1000,m_fast,w_800,f_png']) : null,
|
||||
];
|
||||
if(!$result || $result['code'] == 0){
|
||||
return $this->fail($result['msg']);
|
||||
}
|
||||
//存储信息
|
||||
$saveData = [
|
||||
'from_user_id' => $params['from_user_id'],
|
||||
'to_user_id' => $params['to_user_id'],
|
||||
'content' => $result['data'],
|
||||
'type' => $params['type'],
|
||||
'is_read' => 0,
|
||||
'is_undo' => 0,
|
||||
'is_delete' => 0,
|
||||
'create_time' => time(),
|
||||
'extends' => $params['type'] == 'video' ? json_encode(['poster_img'=>$result['data'].'?x-oss-process=video/snapshot,t_1000,m_fast,w_800,f_png']) : null,
|
||||
];
|
||||
try {
|
||||
$model = new UserImMessage();
|
||||
$model->save($saveData);
|
||||
if(empty($model->id)){
|
||||
return $this->fail('发送失败');
|
||||
}
|
||||
//发送消息
|
||||
$sendData = [
|
||||
'msg_id' => $params['msg_id'],
|
||||
'id' => $model->id,
|
||||
'from_user_id' => $params['from_user_id'],
|
||||
'from_user_name' => $fromUserInfo['nickname'],
|
||||
'from_user_avatar' => $fromUserInfo['avatar'],
|
||||
@ -172,28 +231,21 @@ class ImController extends BaseLikeAdminController
|
||||
'to_user_name' => $toUserInfo['nickname'],
|
||||
'to_user_avatar' => $toUserInfo['avatar'],
|
||||
'content' => $result['data'],
|
||||
'type' => 'type',
|
||||
'type' => $params['type'],
|
||||
'is_read' => 0,
|
||||
'is_undo' => 0,
|
||||
'is_delete' => 0,
|
||||
'create_time' => $saveData['create_time'],
|
||||
'extends' => $params['type'] == 'video' ? json_encode(['poster_img'=>$result['data'].'?x-oss-process=video/snapshot,t_1000,m_fast,w_800,f_png']) : null,
|
||||
];
|
||||
//保存消息
|
||||
try {
|
||||
$model = new UserImMessage();
|
||||
$result = $model->save($saveData);
|
||||
if($result){
|
||||
Gateway::sendToUid($params['to_user_id'], json_encode($sendData));
|
||||
return $this->success('发送成功');
|
||||
}else{
|
||||
return $this->fail('发送失败');
|
||||
}
|
||||
}catch (\Exception $e) {
|
||||
return $this->fail($e->getMessage());
|
||||
if($params['scene'] == 0) {
|
||||
//给admin用户发
|
||||
Gateway::sendToUid($this->sceneText(1).'_'.$params['to_user_id'], json_encode($sendData));
|
||||
}else{
|
||||
//给user用户发
|
||||
Gateway::sendToUid($this->sceneText(0).'_'.$params['to_user_id'], json_encode($sendData));
|
||||
}
|
||||
}else{
|
||||
return $this->fail($result['msg']);
|
||||
return $this->success('发送成功');
|
||||
}catch (\Exception $e) {
|
||||
return $this->fail($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -205,28 +257,83 @@ class ImController extends BaseLikeAdminController
|
||||
return $this->fail('请求方式错误');
|
||||
}
|
||||
//获取请求参数
|
||||
$params = $this->request->post(['user_id','page_no','page_size']);
|
||||
if(empty($params['user_id']) || empty($params['page_no']) || empty($params['page_size'])){
|
||||
$params = $this->request->post(['from_user_id','to_user_id','scene','page_no','page_size']);
|
||||
if(empty($params['from_user_id']) || empty($params['to_user_id']) || !isset($params['scene']) || empty($params['page_no']) || empty($params['page_size'])){
|
||||
return $this->fail('参数错误');
|
||||
}
|
||||
//获取用户信息
|
||||
$userInfo = User::where('id',$params['user_id'])->findOrEmpty();
|
||||
if($userInfo->isEmpty()){
|
||||
return $this->fail('未找到用户信息');
|
||||
if(!in_array($params['scene'],[0,1])){
|
||||
return $this->fail('消息场景错误');
|
||||
}
|
||||
//获取发送者信息
|
||||
$fromUserInfo = $this->getFromUserInfo($params['from_user_id'],$params['scene']);
|
||||
if(empty($fromUserInfo)){
|
||||
return $this->fail('发送者信息错误');
|
||||
}
|
||||
//获取接收者信息
|
||||
$toUserInfo = $this->getToUserInfo($params['to_user_id'],$params['scene']);
|
||||
if(empty($toUserInfo)){
|
||||
return $this->fail('接收者信息错误');
|
||||
}
|
||||
//获取用户消息
|
||||
$msgData = UserImMessage::field('id,from_user_id,to_user_id,content,type,is_read,is_undo,is_delete,create_time,extends')
|
||||
->where('from_user_id',$params['user_id'])
|
||||
->order('create_time desc')->page($params['page_no'],$params['page_size'])->select()->each(function($item) use($userInfo){
|
||||
$toUserInfo = User::field('nickname,avatar')->where('id',$item['to_user_id'])->findOrEmpty();
|
||||
if(!$toUserInfo->isEmpty()){
|
||||
$item['from_user_name'] = $userInfo['nickname'];
|
||||
$item['from_user_avatar'] = $userInfo['avatar'];
|
||||
$item['to_user_name'] = $toUserInfo['nickname'];
|
||||
$item['to_user_avatar'] = $toUserInfo['avatar'];
|
||||
}
|
||||
$msgData = UserImMessage::field('id,from_user_id,to_user_id,content,type,is_read,create_time,extends')
|
||||
->where([['from_user_id','=',$params['from_user_id']],['to_user_id','=',$params['to_user_id']]])
|
||||
->whereOr([['from_user_id','=',$params['to_user_id']],['to_user_id','=',$params['from_user_id']]])
|
||||
->order('create_time desc')->page($params['page_no'],$params['page_size'])->select()->each(function($item) use($params,$fromUserInfo,$toUserInfo) {
|
||||
if($item['from_user_id'] == $params['from_user_id']){
|
||||
$item['from_user_name'] = $fromUserInfo['name'];
|
||||
$item['from_user_avatar'] = $fromUserInfo['avatar'];
|
||||
}else{
|
||||
$item['from_user_name'] = $toUserInfo['name'];
|
||||
$item['from_user_avatar'] = $toUserInfo['avatar'];
|
||||
}
|
||||
if($item['to_user_id'] == $params['to_user_id']){
|
||||
$item['to_user_name'] = $toUserInfo['name'];
|
||||
$item['to_user_avatar'] = $toUserInfo['avatar'];
|
||||
}else{
|
||||
$item['to_user_name'] = $fromUserInfo['name'];
|
||||
$item['to_user_avatar'] = $fromUserInfo['avatar'];
|
||||
}
|
||||
|
||||
})->toArray();
|
||||
//返回数据
|
||||
return $this->success('请求成功',$msgData);
|
||||
}
|
||||
|
||||
//获取联系人列表
|
||||
public function contactList(): Json{
|
||||
//验证请求方式
|
||||
if(!$this->request->isPost()){
|
||||
return $this->fail('请求方式错误');
|
||||
}
|
||||
//获取请求参数
|
||||
$params = $this->request->post(['user_id']);
|
||||
if(empty($params['user_id'])){
|
||||
return $this->fail('参数错误');
|
||||
}
|
||||
//获取用户信息
|
||||
$userInfo = Admin::where('id',$params['user_id'])->findOrEmpty();
|
||||
//验证用户信息
|
||||
if($userInfo->isEmpty()){
|
||||
return $this->fail('未找到用户信息');
|
||||
}
|
||||
//验证用户身份
|
||||
if(empty($userInfo['role_id']) || $userInfo['role_id'][0] != 8){
|
||||
return $this->fail('用户角色错误');
|
||||
}
|
||||
//获取片区经理创建的公司
|
||||
$company = Company::field('id')->where('area_manager',$userInfo['id'])->column('id');
|
||||
//获取公司的成员
|
||||
$users = User::field('id,nickname as name,avatar')->where('company_id','in',$company)->select()->each(function($item) use($params) {
|
||||
//获取消息
|
||||
$msg_no_read = UserImMessage::field('id')->where('from_user_id',$item['id'])->where('to_user_id',$params['user_id'])->where('is_read',0)->count();
|
||||
$last_msg = UserImMessage::field('id,content,create_time')->where('from_user_id',$item['id'])->where('to_user_id',$params['user_id'])->where('is_read',0)->order('create_time desc')->limit(1)->findOrEmpty();
|
||||
$item['mag'] = [
|
||||
'no_read_num' => $msg_no_read,
|
||||
'last_msg_content' => $last_msg['content'],
|
||||
'last_msg_time' => $last_msg['create_time'],
|
||||
];
|
||||
})->toArray();
|
||||
//返回数据
|
||||
return $this->success('请求成功',$users);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user