Files
jianfeng-server/app/im/controller/Im.php
2025-10-02 10:33:06 +08:00

624 lines
23 KiB
PHP
Executable File

<?php
namespace app\im\controller;
use app\ApiRest;
use app\Common\service\LongbingUserInfoService;
use app\im\model\ImMessageFriend;
use app\im\service\ImMessageFriendService;
use app\im\service\ImService;
use longbingcore\tools\LongbingDefault;
use longbingcore\tools\LongbingTime;
use think\App;
use think\Request;
use app\im\model\ImChart;
use app\im\model\ImChat;
use app\im\model\ImMessage;
use app\im\model\ImUser;
use app\im\model\ImMyReply;
use app\im\model\ImReplyType;
use app\card\model\UserInfo;
use app\card\model\UserPhone;
use app\im\model\ImClient;
class Im extends ApiRest
{
public $user_id = null;
public $user = null;
public function __construct(App $app) {
parent::__construct($app);
$this->user_id = $this->getUserId();
$this->user = $this->getUserInfo();
}
//获取客户列表
public function listCustomer()
{
//获取参数列表
$param = $this->_param;
//获取用户列表
$user_id = $this->user_id;
//判断用户是否存在
if(empty($user_id)) return $this->error('not login ,please login again.');
//生成分页信息
$page_config = array(
'page' => 1,
'page_count' => 10
);
//获取分页信息
if(isset($param['page']) && $param['page'] > 0) $page_config['page'] = $param['page'];
if(isset($param['page_count']) && $param['page_count'] > 0) $page_config['page_count'] = $param['page_count'];
//生成查询模型
$chat_model = new ImChat();
//生成消息查询模型
$message_model = new ImMessage();
//生成用户查询模型
// $user_model = new ImUser();
//生成查询
$page_config['total'] = $chat_model->listChatCount($user_id ,$this->_uniacid );
$chats = $chat_model->listChat($user_id ,$this->_uniacid ,$page_config);
$data = [];
if(!empty($chats))
{
foreach($chats as $key => $value)
{
//获取客户信息
$customer_id = null;
if(!in_array($value['user_id'], [$user_id])) $customer_id = $value['user_id'];
if(!in_array($value['target_id'], [$user_id])) $customer_id = $value['target_id'];
if(empty($customer_id)) continue;
//获取客户信息
// $value['customer'] = $user_model->getUser(['id' => $customer_id]);
$customer = longbingGetUser($customer_id ,$this->_uniacid);
if(!empty($customer['is_staff']))
{
$customer_info = longbingGetUserInfo($customer_id ,$this->_uniacid);
if(isset($customer_info['is_staff']) && !empty($customer_info['is_staff']))
{
if(!empty($customer_info['avatar'])) {
$customer_info = transImagesOne($customer_info ,['avatar'] ,$this->_uniacid);
}
//是员工 就用员工头像 By.jingshuixian
//if(!empty($customer_info['avatar'])) $customer['avatarUrl'] = $customer_info['avatar'];
}
}
$value['customer'] = $customer;
if(empty($value['customer'])) continue;
//获取最后一条消息
$lastmessage = $message_model->lastMessage(['chat_id' => $value['id']]);
//如果最后一条消息是图片
if(isset($lastmessage['message_type']) && !in_array($lastmessage['message_type'], ['text' ])) $lastmessage['content'] = lang($lastmessage['message_type']);
$value['lastmessage'] = $lastmessage;
//获取未读消息总数
$not_rear_message_count = $message_model->listMessageCount(['chat_id' => $value['id'] ,'user_id' => $customer_id ,'target_id' => $user_id ,'status' => 1]);
//未读消息总数
$value['not_read_message_count'] = $not_rear_message_count;
//获取时间
if(isset($value['update_time']) && !empty($value['update_time'])) $value['time'] = date('Y-m-d H:i:s', $value['update_time']);
//判断用户是否存在头像
if(!isset($value['customer']['avatarUrl']) || empty($value['customer']['avatarUrl'])) $value['customer']['avatarUrl'] = $this->defaultImage['avatar'];
//判断客户是否是员工
if(isset($value['customer']['is_staff']) && !empty($value['customer']['is_staff']))
{
//获取员工信息
$user_info = longbingGetUserInfo($customer_id ,$this->_uniacid);
if(isset($user_info['is_staff']) && !empty($user_info['is_staff']) && isset($user_info['name']) && !empty($user_info['name'])){
$value['customer']['nickName'] = $user_info['name'];
}
}
$data[] = $value;
}
}
$page_config['total_page'] = (int)($page_config['total'] / $page_config['page_count']);
if(($page_config['total'] % $page_config['page_count']) > 0) $page_config['total_page'] = $page_config['total_page'] + 1;
$result = $page_config;
$result['data'] = $data;
//总计未读数
$result['unReadMessageCount'] = ImService::getUnReadMessageCount($this->user_id);
//数据处理
return $this->success($result);
}
/**
* @author jingshuixian
* @DataTime: 2020/1/16 15:58
* @功能说明:新版获取用户列表信息
*/
public function listCustomerV2(){
//获取参数列表
$param = $this->_param;
//获取用户列表
$user_id = $this->user_id;
//判断用户是否存在
if(empty($user_id)) return $this->error('not login ,please login again.');
//初始化朋友列表,兼容老数据
ImMessageFriendService::initOldFriendList($this->_uniacid , $user_id) ;
$result = ImMessageFriendService::getFriendList($this->_uniacid , $user_id , $param['page_count'] ) ;
//总计未读数
$result['unReadMessageCount'] = ImService::getUnReadMessageCount($this->user_id);
//数据处理
return $this->success($result);
}
//获取未读消息列表
public function listNotReadMessage()
{
//获取参数
$param = $this->_param;
$user_id = $this->user_id;
if(!isset($param['chat_id']) || !isset($param['target_id'])) return $this->error(lang('not chat id ,please check param'));
if(isset($param['target_id']) && !isset($param['chat_id']) && !empty($param['target_id']))
{
//获取chat数据
$chat = longbingGetChat($user_id ,$param['target_id'] ,$this->_uniacid);
if(isset($chat['id'])) $param['chat_id'] = $chat['id'];
}
//判断chat_id参数是否存在
if(!isset($param['chat_id'])) return $this->error('not chat id ,please check param');
//if(!isset($param['user_id'])) return $this->error('not user id ,please check param');
$chat_id = $param['chat_id'];
//获取客户关系
$chat = longbingGetChatById($chat_id ,$this->_uniacid);
//判断数据是否存在
if(empty($chat)) return $this->error('not the chat ,please check chat id');
$customer_id = $chat['user_id'];
if(in_array($customer_id, [$this->user_id])) $customer_id = $chat['target_id'];
$user_id = $this->user_id;
//生成查询模型
$message_model = new ImMessage();
//查询数据
$messages = $message_model->listNotReadMessage(['chat_id' => $chat_id ,'target_id' => $user_id]);
$result['data'] = [];
if(!empty($page_config['total'])){
foreach($messages as $key => $val)
{
if(isset($val['create_time']) && !empty($val['create_time'])) $val['time'] = date('Y-m-d H:i:s', $val['create_time']);
$result['data'][] = $val;
}
}
if(isset($this->user['qr_path'])) $this->user = transImagesOne ( $this->user, ['qr_path'] );
$result['user'] = $this->user;
$customer = getUser($customer_id ,$this->_uniacid);
if(isset($customer['qr_path'])) $customer = transImagesOne ( $customer, ['qr_path'] );
$result['customer'] = $customer;
return $this->success($result);
}
//获取消息列表
public function listMessage()
{
$user = longbingGetUser($this->user_id ,$this->_uniacid);
//获取参数
$param = $this->_param;
$chat_id = null;
$customer_id = null;
$chat = null;
//判断参数是否存在
if(isset($param['chat_id'])) $chat_id = $param['chat_id'];
if(isset($param['customer_id'])) $customer_id = $param['customer_id'];
if(empty($chat_id) && empty($customer_id)) $this->error(lang('not customer id,please check param'));
//参数处理(兼容处理)
$result = [];
if(!empty($chat_id))
{
$chat = longbingGetChatById($chat_id ,$this->_uniacid);
}
else{
$chat = longbingGetChat($this->user_id ,$customer_id ,$this->_uniacid ,true);
}
//生成分页信息
$page_config = array(
'page' => 1,
'page_count' => 20
);
//获取分页信息
if(isset($param['page']) && $param['page'] > 0) $page_config['page'] = $param['page'];
if(isset($param['page_count']) && $param['page_count'] > 0) $page_config['page_count'] = $param['page_count'];
if(!empty($chat))
{
$customer_id = $chat['user_id'];
if(empty($chat_id)) $chat_id = $chat['chat_id'];
if(in_array($customer_id, [$this->user_id])) $customer_id = $chat['target_id'];
//生成消息查询模型
$message_model = new ImMessage();
//获取查询总数
$page_config['total'] = $message_model->listMessageCount(['chat_id' => $chat_id]);
//生成分页数据
$page_config['total_page'] = (int)($page_config['total'] / $page_config['page_count']);
if(($page_config['total'] % $page_config['page_count']) > 0) $page_config['total_page'] = $page_config['total_page'] + 1;
//生成返回数据
}else{
$page_config['total'] = 0;
$page_config['total_page'] = 0;
}
$result = $page_config;
$result['data'] = [];
//获取客户信息
$customer = longbingGetUser($customer_id ,$this->_uniacid);
if(empty($customer)) return $this->error(lang('user not exist.'));
//获取头像
if(isset($customer['avatarUrl'])) {
$customer = transImagesOne ( $customer, ['avatarUrl'] ,$this->_uniacid);
}else{
$customer['avatarUrl'] = $this->defaultImage['avatarUrl'];
}
//判断客户是否是员工
if(!empty($customer['is_staff']))
{
$customer_info = longbingGetUserInfo($customer_id ,$this->_uniacid);
if(isset($customer_info['is_staff']) && !empty($customer_info['is_staff']))
{
if(!empty($customer_info['avatar'])) {
$customer_info = transImagesOne($customer_info ,['avatar'] ,$this->_uniacid);
}
if(!empty($customer_info['avatar'])) $customer['avatarUrl'] = $customer_info['avatar'];
}
}
//获取客户电话号码和微信号码
$customer['wechat'] = null;
$phone = null;
$user_info_model = new UserInfo();
//获取微信和电话号码
$user_info = $user_info_model->getUserPhone($customer_id ,$this->_uniacid);
if(isset($user_info['phone']) && !empty($user_info['phone'])) $phone = $user_info['phone'];
if(isset($user_info['wechat']) && !empty($user_info['wechat'])) $customer['wechat'] = $user_info['wechat'];
if(empty($phone)){
$user_phone_model = new UserPhone();
$user_phone = $user_phone_model->getUserPhone($customer_id ,$this->_uniacid);
if(isset($user_phone['phone']) && !empty($user_phone['phone'])) $phone = $user_phone['phone'];
}
//判断聊天者是否是客户
$customer['is_customer'] = false;
$collection_model = new ImClient();
if(!empty($collection_model->isCustomer($this->user_id , $customer_id ,$this->_uniacid))) $customer['is_customer'] = true;
//判断客户是否是员工
if(isset($customer['is_staff']) && !empty($customer['is_staff']))
{
$customer_info = longbingGetUserInfo($customer_id ,$this->_uniacid);
if(isset($customer_info['is_staff']) && !empty($customer_info['is_staff']) && isset($customer_info['name']) && !empty($customer_info['name'])){
$customer['nickName'] = $customer_info['name'];
//生成第一条默认返回数据
$result['data'][] = array(
'chat_id' => $chat['id'],
'user_id' => $customer_id,
'target_id' => $this->user_id,
'status' => 2,
'uniacid' => $this->_uniacid,
'message_type' => 'welcome',
'content' => lang('Hello, I am ') . $customer['nickName'] . lang(', May I help you? Please contact me!')
);
}
}
$customer['phone'] = $phone;
if(!empty($page_config['total'])){
$msgwhere[] = ['chat_id','=',$chat_id];
//自己发送的
$msgwhere[] = ['is_show','<>',2];
$msgwhere[] = ['user_id','=',$this->getUserId()];
$msgwhere[] = ['deleted','=',0];
$whereT[] = ['deleted','=',0];
//自己接受的
$whereT[] = ['target_id','=',$this->getUserId()];
$whereT[] = ['target_is_show','<>',2];
$whereT[] = ['chat_id','=',$chat_id];
foreach($message_model->listMessageV2($msgwhere ,$page_config,$whereT) as $key => $val)
{
if(isset($val['create_time']) && !empty($val['create_time'])) $val['time'] = date('Y-m-d H:i:s', $val['create_time']);
$result['data'][] = $val;
}
//dump($this->getUserId(),$chat['user_id'],$msgwhere,$result['data']);exit;
}
// if(isset($this->user['qr_path'])) $this->user = transImagesOne ( $this->user, ['qr_path'] );
//判断用户是否是员工
if(!empty($user['is_staff']))
{
$user_info = longbingGetUserInfo($this->user_id ,$this->_uniacid);
if(isset($user_info['is_staff']) && !empty($user_info['is_staff']))
{
if(!empty($user_info['avatar'])) {
$user_info = transImagesOne($user_info ,['avatar'] ,$this->_uniacid);
}
if(!empty($user_info['avatar'])) $user['avatarUrl'] = $user_info['avatar'];
}
}
//默认头像处理
//没有头像就给一个默认头像
$customer['avatarUrl'] = empty($customer['avatarUrl']) ? LongbingDefault::$avatarImgUrl : $customer['avatarUrl'];
$user['avatarUrl'] = empty($user['avatarUrl']) ? LongbingDefault::$avatarImgUrl : $user['avatarUrl'];
$result['user'] = $user;
$result['customer'] = $customer;
//阅读所有消息
$result['readMessageNumber'] = ImService::readMessage($this->_uniacid ,$this->user_id , $customer_id);
return $this->success($result);
}
//标记已读消息
public function readMessage()
{
$param = $this->_param ;
$message_model = new ImMessage();
$count = 0 ;
if ( isset($param['id']) ) {
$id = $param['id'] ;
$message = $message_model->find($id);
if($message){
ImService::readMessage($this->_uniacid ,$this->user_id , $message['user_id'] ) ;
}
}
return $this->success(['count' => $count ] );
}
//获取常用话术
public function listReply()
{
//获取用户信息
$user_id = $this->user_id;
//生成话术分类查询模型
$reply_type_model = new ImReplyType();
//生成快速回复话术查询模型
$reply_model = new ImMyReply();
//获取自定义话术
$my_replys = $reply_model->listReply(['uniacid' => $this->_uniacid ,'user_id' => $user_id ,'status' => 1]);
$result[] = ['title' => lang('my reply') , 'data' => $my_replys ,'is_myself' => true];
//获取types
$types = $reply_type_model->listAllType(['uniacid' => $this->_uniacid ,'status' => 1]);
foreach($types as $type)
{
$data['title'] = $type['title'];
$data['data'] = $reply_model->listReply(['uniacid' => $this->_uniacid ,'user_id' => 0 ,'status' => 1 ,'type' => $type['id']]);
$data['is_myself'] = false;
$result[] = $data;
}
return $this->success($result);
}
//创建和更新常用话术
public function addReply()
{
//获取参数
$input = $this->_input;
$param = $this->_param;
if(!isset($input['content'])) return $this->error('content is not exist ,please check .');
$is_create = true;
if(isset($input['id']) && !empty($input['id'])) $is_create = false;
//获取用户信息
$user_id = $this->user_id;
//生成快速回复话术查询模型
$my_reply_model = new ImMyReply();
if($is_create)
{
//创建
$result = $my_reply_model->createReply(['uniacid' => $this->_uniacid ,'status' => 1 ,'content' => $input['content'] ,'user_id' => $user_id]);
}else{
//修改
$result = $my_reply_model->updateReply(['id' =>$param['id'] , 'uniacid' => $this->_uniacid ,'user_id' => $user_id] ,['content' => $input['content']]);
}
//获取自定义话术
return $this->success($result);
}
//删除常用话术
public function delReply()
{
$param = $this->_param;
$user_id = $this->user_id;
if(!isset($param['id'])) return $this->error('reoly id is not exist ,please check .');
//生成快速回复话术查询模型
$my_reply_model = new ImMyReply();
//删除话术
$result = $my_reply_model->deleteReply(['id' =>$param['id'] ,'uniacid' => $this->_uniacid ,'user_id' => $user_id]);
return $this->success($result);
}
/**
* 腾讯IM签名
*
* @author shuixian
* @DataTime: 2019/12/10 11:30
*/
public function getTimUserSig(){
//需要远程获取和加密
$sdkappid = 1400288706 ;
$key = 'd31548b81e57bf823e12d240e4cce237e09f666bdff3fc325eb4bc386e62832d' ;
$user_id = $this->_param['user_id'];
$userSig = longbing_publics_tim_genSig($sdkappid , $key , $user_id );
$result = ['user_id'=>$user_id , 'userSig' => $userSig] ;
return $this->success($result);
}
/**
* 保存聊天信息
*
* @return \think\Response
* @author shuixian
* @DataTime: 2019/12/11 9:29
*/
public function sendMessage(){
//获取参数列表
//{type: "text", content: "456789", target_id: 14, uniacid: "8890", user_id: 20} //发消息
//{"action":"getUnReadMessageCount","status":true,"message":"","data":{"count":2}} // 获取未读消息树
$param = $this->_param;
//获取房间ID
$chat_id = ImService::getChatId($this->_uniacid , $this->user_id, $param['target_id']);
//还需要校验参数合法新
$value['message_type'] = $param['message_type'];
$value['chat_id'] = $chat_id;//需要获取和判断
$value['user_id'] = $this->user_id;
$value['target_id'] = $param['target_id']; //需要判断接收用户的合法性
$value['content'] = $param['content'];
$value['status'] = 1;
$value['uniacid'] = $this->_uniacid;
$value['create_time'] = time();
$value['update_time'] = time();
$value['is_show'] = 1;
$result = ImService::addMessage($value);
if($result){
$value['id'] = $result ;
ImService::sendImMessageTmpl($this->_uniacid , $value['user_id'] , $value['target_id']) ;
return $this->success( $value );
}else{
$this->error('');
}
}
/**
* @author jingshuixian
* @DataTime: 2020/1/15 13:13
* @功能说明:获取目标客户发送的消息数量
*/
public function getCustomerUnReadMessageCount(){
$param = $this->_param ;
$user_id = $this->user_id;
$target_id = 0 ;
$count = 0 ;
if (isset($param['target_id'])) {
$target_id = $param['target_id'];
$count = ImService::getUnReadMessageCountByUserIdAndTargetId( $target_id , $user_id);
}
$data[] = ['action'=> 'getCustomerUnReadMessageCount' , 'data' => ['count' => $count, 'user_id' => $user_id , 'target_id' => $target_id ] ] ;
$data[] = ['action' => 'getUnReadMessageCount' , 'data' => ['count' => ImService::getUnReadMessageCount($user_id) ] ] ;
$message_model = new ImMessage();
$messageList = $message_model->where( [ ['user_id' , '=' ,$target_id ] ,[ 'target_id' , '=' , $user_id ] , ['status', '=' , 1]] )->select();
foreach ($messageList as $item ){
$data[] = ['action' => 'getNewMessage' , 'data' => $item ] ;
}
$key = 'message'.$user_id.'-'.$target_id;
//获取撤回消息
$cancel_msg = getCache($key,$this->_uniacid);
$data[] = ['action' => 'getCancelMessage' , 'data' => $cancel_msg ] ;
setCache($key,[],0,$this->_uniacid);
return $this->success( $data ) ;
}
/**
* @author chenniang
* @DataTime: 2021-05-26 17:33
* @功能说明:修改消息状态 1都可见 2删除对方可见 撤回都不可见
*/
public function updateMsgStatus(){
$input = $this->_input;
$message_model = new ImMessage();
$info = $message_model->where(['id'=>$input['id']])->find()->toArray();
//撤回只有送人课操作
if($input['is_show']==-1){
$update['is_show'] = -1;
if($info['target_is_show']==1){
$update['target_is_show'] = -1;
}
}
//删除
if($input['is_show']==2){
//判断我是否是发送者
if($info['user_id']==$this->getUserId()){
$update['is_show'] = 2;
}else{
$update['target_is_show'] = 2;
}
}
$res = $message_model->where(['id'=>$input['id']])->update($update);
$data = $message_model->where(['id'=>$input['id']])->find();
if(!empty($data)){
$data = $data->toArray();
$key = 'message'.$data['target_id'].'-'.$data['user_id'];
setCache($key,$data,0,$this->_uniacid);
}
return $this->success( $res ) ;
}
}