| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- <?php
- namespace app\admin\command;
- use think\console\Command;
- use think\console\Input;
- use think\console\Output;
- use app\admin\model\User;
- use app\admin\model\Config;
- use app\admin\model\KefuWork;
- use app\admin\model\KefuLog;
- use app\enterprise\model\{Message,Friend};
- use Exception;
- use think\facade\Db;
- /**
- * Worker 命令行类
- */
- class UserQueue extends Command
- {
- public function configure()
- {
- $this->setName('user:queue')
- ->setDescription('用户排队,自动分配客服');
- }
- public function execute(Input $input, Output $output)
- {
- $auto_cs_uid = getAutoCsUid();
- $where = [
- ['status', '=', 1],
- ['is_online', '=', 1],
- ['role', '=', 3],
- ['user_id', '<>', $auto_cs_uid],
- ];
- while(true) {
- //排队用户
- $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 0)
- ->order('service_start', 'asc')
- ->select()
- ->toArray();
- if (empty($list)) {
- sleep(5);
- }
- foreach ($list as $item) {
- //查询当前最少接线数的客服
- // $kefu_chat_max = Config::getKefuChatMax();//单个客服接线上限
- $kefu_chat_max = (int)Config::where('field','kefu_chat_max')->value('val');
- $where[] = ['chat_num', '<', $kefu_chat_max];
- $cs_user = User::where($where)->order('chat_num', 'asc')->find();
- if (!$cs_user) {
- break;
- }
- $this->handleChat($item, $cs_user, $cs_user->uid);
- }
- }
- }
- /**
- * 自动接线
- */
- public function handleChat($user, $cs_user, $admin_id)
- {
- try {
- Db::startTrans();
- $cs_uid = $cs_user->user_id;
- $user_id = $user['user_id'];
-
- User::where('user_id', $user_id)->update(['cs_uid'=>$cs_uid,'service_status' => 1, 'service_start' => time(), 'timeout_type' => 0]);
-
- //更新客服接线数量
- User::where('user_id', $cs_uid)->update(['chat_num'=>Db::raw('chat_num+1')]);
- //客服接线次数更新
- KefuWork::addNum($admin_id, 'chat_num');
- $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
- if ($friend) {
- $robot_id = $friend->friend_user_id;
- $friend->friend_user_id = $cs_uid;
- $friend->save();
- $chat_identify = chat_identify($cs_uid,$user_id);
- Message::where(['from_user' => $user_id, 'to_user' => $robot_id])->update(['to_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
- Message::where(['from_user' => $robot_id, 'to_user' => $user_id])->update(['from_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
- }
- //客服对接记录表
- KefuLog::addData($cs_uid, $user_id, 3);
- Db::commit();
- //通知客服已接线
- wsSendMsg(0,'handleChat',['user_id'=>$user_id]);
-
- // 如果设置了欢迎语则发送欢迎语
- $first_auto_reply = Config::getFieldValue('first_auto_reply', $user['language_code']);
- if(!empty($first_auto_reply)){
- if($cs_user){
- $userInfo['dispalayName']=$cs_user['realname'];
- $userInfo['id']=$cs_user['user_id'];
- $userInfo['avatar']=avatarUrl($cs_user['avatar'],$cs_user['realname'],$cs_user['user_id']);
- $msg=[
- 'id'=>\utils\Str::getUuid(),
- 'user_id'=>$cs_uid,
- 'content'=>$first_auto_reply,
- 'toContactId'=>$user['user_id'],
- 'sendTime'=>time()*1000,
- 'type'=>'html',
- 'is_group'=>0,
- 'status'=>'succeed',
- 'fromUser'=>$userInfo,
- 'at'=>[]
- ];
- Message::sendMsg($msg,0,1);
- }
- }
-
- //自动回复-人工客服接线成功
- Message::sendAutoReply('transfer_to_human_success', $user_id, $cs_uid, $user['language_code']);
- //自动回复-人工客服接线成功欢迎语
- Message::sendAutoReply('transfer_to_human_success_reply', $user_id, $cs_uid,$user['language_code']);
- } catch (\Exception $e) {
- Db::rollback();
- }
- }
- }
|