| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- <?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\KefuTime;
- use app\admin\model\KefuLog;
- use think\facade\Db;
- use GatewayClient\Gateway;
- /**
- * Worker 命令行类
- */
- class UserTimeout extends Command
- {
- public function configure()
- {
- $this->setName('user:timeout')
- ->setDescription('用户会话检测');
- }
- public function execute(Input $input, Output $output)
- {
- //检测离线用户状态
- $this->checkOfflineUser();
- $config = Config::whereIn('field',['kefu_timeout_reminder','kefu_timeout_warning','user_timeouted_warning', 'user_timeout_warning','user_inline_finished','kefu_inline_finished'])->column('val','field');
-
- $user_timeout_warning = 0;
- if (isset($config['user_timeout_warning']) && $config['user_timeout_warning'] > 0) {
- $user_timeout_warning = $config['user_timeout_warning'];
- //用户等待即将超时预警
- $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 1)
- ->where('service_start', '<=', time() - $user_timeout_warning)
- ->where('timeout_type', 0)
- ->select()
- ->toArray();
- $this->sendMessage($list, 1);
- $output->writeln('用户等待即将超时预警:'.count($list));
- }
- if (isset($config['user_timeouted_warning']) && $config['user_timeouted_warning'] > 0) {
- $user_timeouted_warning = $config['user_timeouted_warning'];
- //用户等待已超时预警
- $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 1)
- ->where('service_start', '<=', time() - $user_timeouted_warning)
- ->where(function($query) use ($user_timeout_warning){
- if ($user_timeout_warning > 0) {
- $query->where('service_start', '<=', time() - $user_timeout_warning);
- }
- })
- ->where('timeout_type', '<',2)
- ->select()
- ->toArray();
- $this->sendMessage($list, 2);
- $output->writeln('用户等待已超时预警'.count($list));
- }
- $kefu_timeout_warning = 0;
- if (isset($config['kefu_timeout_warning']) && $config['kefu_timeout_warning'] > 0) {
- $kefu_timeout_warning = $config['kefu_timeout_warning'];
- //用户服务中-即将超时预警时间
- $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 2)
- ->where('service_start', '<=', time() - $kefu_timeout_warning)
- ->where('timeout_type', '<',3)
- ->select()
- ->toArray();
- $this->sendMessage($list, 3);
- $output->writeln('用户服务中-即将超时预警'.count($list));
- }
- if (isset($config['kefu_timeout_reminder']) && $config['kefu_timeout_reminder'] > 0) {
- $timeout_reminder = $config['kefu_timeout_reminder'];
- //用户服务中-已超时提醒
- $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 2)
- ->where('service_start', '<=', time() - $timeout_reminder)
- ->where(function($query) use ($kefu_timeout_warning){
- if ($kefu_timeout_warning > 0) {
- $query->where('service_start', '<=', time() - $kefu_timeout_warning);
- }
- })
- ->where('timeout_type', '<',4)
- ->select()
- ->toArray();
- $output->writeln('用户服务中-已超时提醒'.count($list));
- $this->sendMessage($list, 4);
- }
- if (isset($config['user_inline_finished']) && $config['user_inline_finished'] > 0) {
- $user_inline_finished = $config['user_inline_finished'] * 60;
- //会员离线后自动结束会话时间
- $list = User::where('role', 0)
- ->where('is_online', 0)
- ->whereIn('service_status', [0,1,2])
- ->where('offline_time', '<=', time() - $user_inline_finished)
- ->select()
- ->toArray();
- $cs_uid = getAutoCsUid();//获取机器人ID
- foreach($list as $user) {
- try {
- Db::startTrans();
- //用户转给机器人客服
- User::where('user_id', $user['user_id'])->update(['service_status' => -1, 'service_start' => 0, 'timeout_type' => 0, 'cs_uid'=>$cs_uid]);
- KefuTime::endData($user['uid'], 3, $user['cs_uid']); //结束接线时间
-
- //客服对接记录表
- KefuLog::addData($cs_uid, $user['user_id'], 3);
- Db::commit();
- $is_warning = $user['service_status'] == 1 || $user['service_status'] == 2 ? 1 : 0;
- //通知关闭聊天框
- wsSendMsg($user['cs_uid'],'closeChat',['user_id'=>$user['user_id'], 'realname' => $user['realname'], 'is_warning' => $is_warning]);
- //通知客服已结束
- wsSendMsg($user['cs_uid'],'handleChat',['user_id'=>$user['user_id']]);
- } catch (\Exception $e) {
- Db::rollback();
- }
- }
- $output->writeln('会员离线后自动结束会话时间'.count($list));
- }
-
- if (isset($config['kefu_inline_finished']) && $config['kefu_inline_finished'] > 0) {
- $kefu_inline_finished = $config['kefu_inline_finished'] * 60;
- //客服离线后自动结束会话时间
- $list = User::where('role', 3)
- ->where('is_online', 0)
- ->where('is_finished', 0)
- ->where('offline_time', '<=', time() - $kefu_inline_finished)
- ->select()
- ->toArray();
- $cs_uid = getAutoCsUid();//获取机器人ID
- foreach($list as $user) {
- try {
- Db::startTrans();
-
- User::kefuOffline($user['user_id'], $user['uid']);
- Db::commit();
- } catch (\Exception $e) {
- Db::rollback();
- }
- }
- $output->writeln('客服离线后自动结束会话时间'.count($list));
- }
- }
- //检测离线用户,更新在线状态
- public function checkOfflineUser()
- {
- Gateway::$registerAddress = config('gateway.registerAddress');
- $onlineList=Gateway::getAllUidList();
- $userOnlineList = User::where('is_online', '>', 0)->column('user_id');
-
- foreach($userOnlineList as $user_id) {
- if(!isset($onlineList[$user_id])) {
- User::where('user_id', $user_id)->update(['is_online' => 0]);
- }
- }
- }
- /**
- * 发送提醒通知
- */
- public function sendMessage($list, $type)
- {
- foreach($list as $user) {
- //更新用户超时提醒的状态
- User::where('user_id', $user['user_id'])->update(['timeout_type' => $type]);
- //通知客服已结束
- wsSendMsg($user['cs_uid'],'timeout',['user_id'=>$user['user_id'], 'realname'=>$user['realname'], 'type'=>$type]);
- }
- }
- }
|