diff --git a/app/common/controller/ImController.php b/app/common/controller/ImController.php index 88e2886ef..b2c37e842 100644 --- a/app/common/controller/ImController.php +++ b/app/common/controller/ImController.php @@ -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); + } } \ No newline at end of file