2023-09-28 10:30:14 +08:00
< ? php
namespace app\common\controller ;
use alioss\alioss ;
2023-09-28 17:16:22 +08:00
use app\common\model\auth\Admin ;
use app\common\model\Company ;
2023-09-28 10:30:14 +08:00
use app\common\model\im\UserImMessage ;
use app\common\model\user\User ;
use GatewayClient\Gateway ;
2023-10-20 17:28:41 +08:00
use think\App ;
2023-10-07 16:04:47 +08:00
use think\facade\Db ;
2023-09-28 10:30:14 +08:00
use think\response\Json ;
class ImController extends BaseLikeAdminController
{
2023-10-20 17:28:41 +08:00
public function __construct ( App $app )
{
parent :: __construct ( $app );
2023-10-21 11:56:43 +08:00
Gateway :: $registerAddress = env ( 'worker.address' ) . ':' . env ( 'worker.port' );
2023-10-20 17:28:41 +08:00
}
//获取场景值
2023-09-28 17:16:22 +08:00
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表数据
2023-10-09 12:00:50 +08:00
$data = User :: field ( 'id,nickname as name,avatar,register_id' ) -> where ( 'id' , $uid ) -> findOrEmpty () -> toArray ();
2023-09-28 17:16:22 +08:00
} 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表数据
2023-10-09 12:00:50 +08:00
$data = User :: field ( 'id,nickname as name,avatar,register_id' ) -> where ( 'id' , $uid ) -> findOrEmpty () -> toArray ();
2023-09-28 17:16:22 +08:00
} else {
$data = [];
}
return $data ;
}
/*****************************************************************************************************************************************************************************/
2023-09-28 10:30:14 +08:00
//绑定uid
public function doBindUid () : Json
{
//验证请求方式
if ( ! $this -> request -> isPost ()){
return $this -> fail ( '请求方式错误' );
}
//获取请求参数
2023-09-28 17:16:22 +08:00
$params = $this -> request -> post ([ 'client_id' , 'user_id' , 'scene' ]);
if ( empty ( $params [ 'client_id' ]) || empty ( $params [ 'user_id' ]) || ! isset ( $params [ 'scene' ])){
2023-09-28 10:30:14 +08:00
return $this -> fail ( '参数错误' );
}
2023-09-28 17:16:22 +08:00
if ( ! in_array ( $params [ 'scene' ],[ 0 , 1 ])){
return $this -> fail ( '场景错误' );
}
Gateway :: bindUid ( $params [ 'client_id' ], $this -> sceneText ( $params [ 'scene' ]) . '_' . $params [ 'user_id' ]);
2023-10-08 09:14:39 +08:00
return $this -> success ( '绑定成功' ,[ 'msg' => $this -> sceneText ( $params [ 'scene' ]) . '_' . $params [ 'user_id' ]]);
2023-09-28 10:30:14 +08:00
}
//发送消息
2023-09-28 17:16:22 +08:00
public function sendTextMsg () : Json
2023-09-28 10:30:14 +08:00
{
//验证请求方式
if ( ! $this -> request -> isPost ()){
return $this -> fail ( '请求方式错误' );
}
//获取请求参数
2023-10-09 09:45:15 +08:00
$params = $this -> request -> post ([ 'from_user_id' , 'to_user_id' , 'msg_id' , 'content' , 'type' , 'scene' ]);
2023-09-28 17:16:22 +08:00
//验证请求参数
2023-10-09 09:45:15 +08:00
if ( empty ( $params [ 'from_user_id' ]) || empty ( $params [ 'to_user_id' ]) || empty ( $params [ 'content' ]) || empty ( $params [ 'msg_id' ]) || empty ( $params [ 'type' ]) || ! isset ( $params [ 'scene' ])){
2023-09-28 10:30:14 +08:00
return $this -> fail ( '参数错误' );
}
2023-09-28 17:16:22 +08:00
if ( $params [ 'type' ] !== 'text' ){
2023-09-28 10:30:14 +08:00
return $this -> fail ( '消息类型错误' );
}
2023-09-28 17:16:22 +08:00
if ( ! in_array ( $params [ 'scene' ],[ 0 , 1 ])){
return $this -> fail ( '消息场景错误' );
2023-09-28 10:30:14 +08:00
}
//获取发送者信息
2023-09-28 17:16:22 +08:00
$fromUserInfo = $this -> getFromUserInfo ( $params [ 'from_user_id' ], $params [ 'scene' ]);
if ( empty ( $fromUserInfo )){
return $this -> fail ( '发送者信息错误' );
2023-09-28 10:30:14 +08:00
}
//获取接收者信息
2023-09-28 17:16:22 +08:00
$toUserInfo = $this -> getToUserInfo ( $params [ 'to_user_id' ], $params [ 'scene' ]);
if ( empty ( $toUserInfo )){
return $this -> fail ( '接收者信息错误' );
2023-09-28 10:30:14 +08:00
}
//存储信息
$saveData = [
'from_user_id' => $params [ 'from_user_id' ],
'to_user_id' => $params [ 'to_user_id' ],
'content' => $params [ 'content' ],
2023-10-09 09:45:15 +08:00
'msg_id' => $params [ 'msg_id' ],
2023-09-28 17:16:22 +08:00
'type' => $params [ 'type' ],
2023-10-07 16:04:47 +08:00
'is_read' => 0 ,
2023-09-28 10:30:14 +08:00
'is_undo' => 0 ,
'is_delete' => 0 ,
2023-09-28 17:16:22 +08:00
'create_time' => time (),
2023-09-28 10:30:14 +08:00
'extends' => null ,
];
//保存消息
try {
$model = new UserImMessage ();
2023-09-28 17:16:22 +08:00
$model -> save ( $saveData );
if ( empty ( $model -> id )){
2023-09-28 10:30:14 +08:00
return $this -> fail ( '发送失败' );
}
2023-09-28 17:16:22 +08:00
//发送消息
$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' ],
2023-10-09 09:45:15 +08:00
'msg_id' => $params [ 'msg_id' ],
2023-09-28 17:16:22 +08:00
'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 ));
2023-10-09 12:00:50 +08:00
//极光推送
if ( isset ( $toUserInfo [ 'register_id' ]) && ! empty ( $toUserInfo [ 'register_id' ])){
push_message ( $toUserInfo [ 'register_id' ], $fromUserInfo [ 'name' ] . ': ' . $params [ 'content' ]);
}
2023-09-28 17:16:22 +08:00
}
2023-10-07 11:30:10 +08:00
return $this -> success ( '发送成功' , $sendData );
2023-09-28 10:30:14 +08:00
} catch ( \Exception $e ) {
return $this -> fail ( $e -> getMessage ());
}
}
//上传文件
2023-09-28 17:16:22 +08:00
public function sendFileMsg () : Json
2023-09-28 10:30:14 +08:00
{
//验证请求方式
if ( ! $this -> request -> isPost ()){
return $this -> fail ( '请求方式错误' );
}
//获取请求参数
2023-10-09 09:45:15 +08:00
$params = $this -> request -> post ([ 'from_user_id' , 'to_user_id' , 'msg_id' , 'type' , 'scene' ]);
2023-09-28 10:30:14 +08:00
//获取参数
$file = $this -> request -> file ( 'file' );
2023-10-09 09:45:15 +08:00
if ( empty ( $file ) || empty ( $params [ 'from_user_id' ]) || empty ( $params [ 'to_user_id' ]) || empty ( $params [ 'msg_id' ]) || empty ( $params [ 'type' ]) || ! isset ( $params [ 'scene' ])){
2023-09-28 10:30:14 +08:00
return $this -> fail ( '参数错误' );
}
if ( ! in_array ( $params [ 'type' ],[ 'image' , 'video' ])){
return $this -> fail ( '消息类型错误' );
}
2023-09-28 17:16:22 +08:00
if ( ! in_array ( $params [ 'scene' ],[ 0 , 1 ])){
return $this -> fail ( '消息场景错误' );
2023-09-28 10:30:14 +08:00
}
//获取发送者信息
2023-09-28 17:16:22 +08:00
$fromUserInfo = $this -> getFromUserInfo ( $params [ 'from_user_id' ], $params [ 'scene' ]);
if ( empty ( $fromUserInfo )){
return $this -> fail ( '发送者信息错误' );
2023-09-28 10:30:14 +08:00
}
//获取接收者信息
2023-09-28 17:16:22 +08:00
$toUserInfo = $this -> getToUserInfo ( $params [ 'to_user_id' ], $params [ 'scene' ]);
if ( empty ( $toUserInfo )){
return $this -> fail ( '接收者信息错误' );
2023-09-28 10:30:14 +08:00
}
$filePath = $file -> getRealPath ();
$fileType = $file -> extension ();
$fileSize = $file -> getSize ();
$ali_oss = new alioss ();
switch ( $params [ 'type' ]) {
case 'image' :
$result = $ali_oss -> uploadImg ( $filePath , $fileType , $fileSize );
break ;
case 'video' :
$result = $ali_oss -> uploadVideo ( $filePath , $fileType , $fileSize );
break ;
default :
return $this -> fail ( '文件类型错误~' );
}
2023-09-28 17:16:22 +08:00
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' ],
2023-10-09 09:45:15 +08:00
'msg_id' => $params [ 'msg_id' ],
2023-09-28 17:16:22 +08:00
'type' => $params [ 'type' ],
2023-10-07 16:04:47 +08:00
'is_read' => 0 ,
2023-09-28 17:16:22 +08:00
'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 ( '发送失败' );
}
2023-09-28 10:30:14 +08:00
//发送消息
$sendData = [
2023-09-28 17:16:22 +08:00
'id' => $model -> id ,
2023-09-28 10:30:14 +08:00
'from_user_id' => $params [ 'from_user_id' ],
2023-10-07 10:53:08 +08:00
'from_user_name' => $fromUserInfo [ 'name' ],
2023-09-28 10:30:14 +08:00
'from_user_avatar' => $fromUserInfo [ 'avatar' ],
'to_user_id' => $params [ 'to_user_id' ],
2023-10-07 10:53:08 +08:00
'to_user_name' => $toUserInfo [ 'name' ],
2023-09-28 10:30:14 +08:00
'to_user_avatar' => $toUserInfo [ 'avatar' ],
'content' => $result [ 'data' ],
2023-10-09 09:45:15 +08:00
'msg_id' => $params [ 'msg_id' ],
2023-09-28 17:16:22 +08:00
'type' => $params [ 'type' ],
2023-09-28 10:30:14 +08:00
'is_read' => 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 ,
];
2023-09-28 17:16:22 +08:00
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 ));
2023-10-09 12:00:50 +08:00
//极光推送
if ( isset ( $toUserInfo [ 'register_id' ]) && ! empty ( $toUserInfo [ 'register_id' ])){
$push_msg = $params [ 'type' ] == 'image' ? '[图片]' : '[视频]' ;
push_message ( $toUserInfo [ 'register_id' ], $fromUserInfo [ 'name' ] . ': ' . $push_msg );
}
2023-09-28 10:30:14 +08:00
}
2023-10-07 11:30:10 +08:00
return $this -> success ( '发送成功' , $sendData );
2023-09-28 17:16:22 +08:00
} catch ( \Exception $e ) {
return $this -> fail ( $e -> getMessage ());
2023-09-28 10:30:14 +08:00
}
}
//消息列表
public function msgList () : Json
{
//验证请求方式
if ( ! $this -> request -> isPost ()){
return $this -> fail ( '请求方式错误' );
}
//获取请求参数
2023-09-28 17:16:22 +08:00
$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' ])){
2023-09-28 10:30:14 +08:00
return $this -> fail ( '参数错误' );
}
2023-09-28 17:16:22 +08:00
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 ( '接收者信息错误' );
2023-09-28 10:30:14 +08:00
}
2023-10-07 16:04:47 +08:00
//将消息设置为已读
2023-10-08 14:50:19 +08:00
UserImMessage :: where ([[ 'from_user_id' , '=' , $params [ 'to_user_id' ]],[ 'to_user_id' , '=' , $params [ 'from_user_id' ]]]) -> update ([ 'is_read' => 1 ]);
2023-09-28 10:30:14 +08:00
//获取用户消息
2023-10-08 14:50:19 +08:00
$msgData = Db :: name ( 'user_im_message' ) -> field ( 'id,from_user_id,to_user_id,content,type,is_read,create_time,extends' )
-> whereRaw ( " (from_user_id = { $params [ 'from_user_id' ] } AND to_user_id = { $params [ 'to_user_id' ] } ) OR (from_user_id = { $params [ 'to_user_id' ] } AND to_user_id = { $params [ 'from_user_id' ] } ) " )
-> order ( 'create_time desc' )
-> page ( $params [ 'page_no' ], $params [ 'page_size' ])
-> select () -> toArray ();
2023-10-08 09:14:39 +08:00
foreach ( $msgData as $k => $v ){
if ( $v [ 'from_user_id' ] == $params [ 'from_user_id' ]){
$msgData [ $k ][ 'from_user_name' ] = $fromUserInfo [ 'name' ];
$msgData [ $k ][ 'from_user_avatar' ] = $fromUserInfo [ 'avatar' ];
} else {
$msgData [ $k ][ 'from_user_name' ] = $toUserInfo [ 'name' ];
$msgData [ $k ][ 'from_user_avatar' ] = $toUserInfo [ 'avatar' ];
}
if ( $v [ 'to_user_id' ] == $params [ 'to_user_id' ]){
$msgData [ $k ][ 'to_user_name' ] = $toUserInfo [ 'name' ];
$msgData [ $k ][ 'to_user_avatar' ] = $toUserInfo [ 'avatar' ];
} else {
$msgData [ $k ][ 'to_user_name' ] = $fromUserInfo [ 'name' ];
$msgData [ $k ][ 'to_user_avatar' ] = $fromUserInfo [ 'avatar' ];
}
}
2023-09-28 10:30:14 +08:00
//返回数据
return $this -> success ( '请求成功' , $msgData );
}
2023-09-28 17:16:22 +08:00
//获取联系人列表
public function contactList () : Json {
//验证请求方式
if ( ! $this -> request -> isPost ()){
return $this -> fail ( '请求方式错误' );
}
//获取请求参数
2023-10-10 17:07:06 +08:00
$params = $this -> request -> post ([ 'user_id' , 'keywords' ]);
2023-09-28 17:16:22 +08:00
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' );
//获取公司的成员
2023-10-10 17:07:06 +08:00
$params [ 'keywords' ] = ! empty ( $params [ 'keywords' ]) ? $params [ 'keywords' ] : '' ;
$users = User :: field ( 'id,nickname as name,avatar' ) -> where ( 'company_id' , 'in' , $company ) -> where ( 'nickname' , 'like' , '%' . $params [ 'keywords' ] . '%' ) -> select () -> each ( function ( $item ) use ( $params ) {
2023-09-28 17:16:22 +08:00
//获取消息
$msg_no_read = UserImMessage :: field ( 'id' ) -> where ( 'from_user_id' , $item [ 'id' ]) -> where ( 'to_user_id' , $params [ 'user_id' ]) -> where ( 'is_read' , 0 ) -> count ();
2023-10-08 14:50:19 +08:00
$last_msg = Db :: name ( 'user_im_message' ) -> field ( 'id,content,type,create_time' )
-> whereRaw ( " (from_user_id = { $item [ 'id' ] } AND to_user_id = { $params [ 'user_id' ] } ) OR (from_user_id = { $params [ 'user_id' ] } AND to_user_id = { $item [ 'id' ] } ) " )
-> order ( 'create_time desc' ) -> limit ( 1 ) -> findOrEmpty ();
2023-09-28 17:42:06 +08:00
$item [ 'no_read_num' ] = $msg_no_read ;
2023-10-09 12:00:50 +08:00
$item [ 'last_msg_content' ] = empty ( $last_msg ) ? '' : $last_msg [ 'content' ];
$item [ 'last_msg_type' ] = empty ( $last_msg ) ? '' : $last_msg [ 'type' ];
$item [ 'last_msg_time' ] = empty ( $last_msg ) ? '' : $last_msg [ 'create_time' ];
2023-09-28 17:16:22 +08:00
}) -> toArray ();
2023-09-28 17:42:06 +08:00
$key = array_column ( $users , 'last_msg_time' );
array_multisort ( $key , SORT_DESC , $users );
2023-09-28 17:16:22 +08:00
//返回数据
return $this -> success ( '请求成功' , $users );
}
2023-10-07 09:46:30 +08:00
2023-10-07 10:53:08 +08:00
//获取片区经理用户id
2023-10-07 09:46:30 +08:00
public function getAreaManager () : Json
{
//验证请求方式
if ( ! $this -> request -> isPost ()){
return $this -> fail ( '请求方式错误' );
}
//获取请求参数
$params = $this -> request -> post ([ 'user_id' ]);
if ( empty ( $params [ 'user_id' ])){
return $this -> fail ( '参数错误' );
}
//获取其用户的公司id
$userInfo = User :: field ( 'id,company_id' ) -> where ( 'id' , $params [ 'user_id' ]) -> findOrEmpty ();
if ( empty ( $userInfo )){
return $this -> fail ( '未获取到用户信息' );
}
//获取公司信息
$companyInfo = Company :: field ( 'area_manager' ) -> where ( 'id' , $userInfo [ 'company_id' ]) -> findOrEmpty ();
if ( empty ( $companyInfo )){
return $this -> fail ( '用户信息错误' );
}
if ( $params [ 'user_id' ] == $companyInfo [ 'area_manager' ]){
return $this -> fail ( '用户身份错误错误' );
}
2023-10-08 14:50:19 +08:00
//获取用户信息
$adminInfo = Admin :: field ( 'id,name,avatar' ) -> where ( 'id' , $companyInfo [ 'area_manager' ]) -> findOrEmpty ();
2023-10-10 09:13:32 +08:00
//获取片区经理给用户发送的未读消息数
$msg_num = UserImMessage :: field ( 'id' ) -> where ([
[ 'from_user_id' , '=' , $adminInfo [ 'id' ]],
[ 'to_user_id' , '=' , $params [ 'user_id' ]],
[ 'is_read' , '=' , 0 ]
]) -> count ();
2023-10-07 09:46:30 +08:00
//返回
2023-10-10 09:13:32 +08:00
return $this -> success ( '请求成功' ,[ 'to_user_id' => $adminInfo [ 'id' ], 'manager_name' => $adminInfo [ 'name' ], 'manager_avatar' => $adminInfo [ 'avatar' ], 'msg_num' => $msg_num ]);
2023-10-07 09:46:30 +08:00
}
2023-09-28 10:30:14 +08:00
}