UserTimeout.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. namespace app\admin\command;
  3. use think\console\Command;
  4. use think\console\Input;
  5. use think\console\Output;
  6. use app\admin\model\User;
  7. use app\admin\model\Config;
  8. use app\admin\model\KefuTime;
  9. use think\facade\Db;
  10. use GatewayClient\Gateway;
  11. /**
  12. * Worker 命令行类
  13. */
  14. class UserTimeout extends Command
  15. {
  16. public function configure()
  17. {
  18. $this->setName('user:timeout')
  19. ->setDescription('用户会话检测');
  20. }
  21. public function execute(Input $input, Output $output)
  22. {
  23. //检测离线用户状态
  24. $this->checkOfflineUser();
  25. $config = Config::whereIn('field',['kefu_timeout_reminder','kefu_timeout_warning','user_timeouted_warning', 'user_timeout_warning','user_inline_finished'])->column('val','field');
  26. $user_timeout_warning = 0;
  27. if (isset($config['user_timeout_warning']) && $config['user_timeout_warning'] > 0) {
  28. $user_timeout_warning = $config['user_timeout_warning'];
  29. //用户等待即将超时预警
  30. $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 1)
  31. ->where('service_start', '<=', time() - $user_timeout_warning)
  32. ->select()
  33. ->toArray();
  34. $this->sendMessage($list, 1);
  35. $output->writeln('用户等待即将超时预警:'.count($list));
  36. }
  37. if (isset($config['user_timeouted_warning']) && $config['user_timeouted_warning'] > 0) {
  38. $user_timeouted_warning = $config['user_timeouted_warning'];
  39. //用户等待已超时预警
  40. $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 1)
  41. ->where('service_start', '<=', time() - $user_timeouted_warning)
  42. ->where(function($query) use ($user_timeout_warning){
  43. if ($user_timeout_warning > 0) {
  44. $query->where('service_start', '>', time() - $user_timeout_warning);
  45. }
  46. })
  47. ->select()
  48. ->toArray();
  49. $this->sendMessage($list, 2);
  50. $output->writeln('用户等待已超时预警'.count($list));
  51. }
  52. $kefu_timeout_warning = 0;
  53. if (isset($config['kefu_timeout_warning']) && $config['kefu_timeout_warning'] > 0) {
  54. $kefu_timeout_warning = $config['kefu_timeout_warning'];
  55. //用户服务中-即将超时预警时间
  56. $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 2)
  57. ->where('service_start', '<=', time() - $kefu_timeout_warning)
  58. ->select()
  59. ->toArray();
  60. $this->sendMessage($list, 3);
  61. $output->writeln('用户服务中-即将超时预警'.count($list));
  62. }
  63. if (isset($config['kefu_timeout_reminder']) && $config['kefu_timeout_reminder'] > 0) {
  64. $timeout_reminder = $config['kefu_timeout_reminder'];
  65. //用户服务中-已超时提醒
  66. $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 2)
  67. ->where('service_start', '<=', time() - $timeout_reminder)
  68. ->where(function($query) use ($kefu_timeout_warning){
  69. if ($kefu_timeout_warning > 0) {
  70. $query->where('service_start', '>', time() - $kefu_timeout_warning);
  71. }
  72. })
  73. ->select()
  74. ->toArray();
  75. $output->writeln('用户服务中-已超时提醒'.count($list));
  76. $this->sendMessage($list, 4);
  77. }
  78. if (isset($config['user_inline_finished']) && $config['user_inline_finished'] > 0) {
  79. $user_inline_finished = $config['user_inline_finished'] * 60;
  80. //会员离线后自动结束会话时间
  81. $list = User::where('role', 0)
  82. ->where('is_online', 0)
  83. ->whereIn('service_status', [0,1,2])
  84. ->where('offline_time', '<=', time() - $user_inline_finished)
  85. ->select()
  86. ->toArray();
  87. $cs_uid = getAutoCsUid();//获取机器人ID
  88. foreach($list as $user) {
  89. try {
  90. Db::startTrans();
  91. //用户转给机器人客服
  92. User::where('user_id', $user['user_id'])->update(['service_status' => 0, 'service_start' => 0, 'cs_uid'=>$cs_uid]);
  93. KefuTime::endData($user['uid'], 3, $user['cs_uid']); //结束接线时间
  94. Db::commit();
  95. //通知客服已结束
  96. wsSendMsg($user['cs_uid'],'handleChat',['user_id'=>$user['user_id']]);
  97. } catch (\Exception $e) {
  98. Db::rollback();
  99. }
  100. }
  101. $output->writeln('用户服务中-会员离线后自动结束会话时间'.count($list));
  102. }
  103. }
  104. //检测离线用户,更新在线状态
  105. public function checkOfflineUser()
  106. {
  107. Gateway::$registerAddress = config('gateway.registerAddress');
  108. $onlineList=Gateway::getAllUidList();
  109. $userOnlineList = User::where('is_online', '>', 0)->column('user_id');
  110. foreach($userOnlineList as $user_id) {
  111. if(!isset($onlineList[$user_id])) {
  112. User::where('user_id', $user_id)->update(['is_online' => 0]);
  113. }
  114. }
  115. }
  116. /**
  117. * 发送提醒通知
  118. */
  119. public function sendMessage($list, $type)
  120. {
  121. foreach($list as $user) {
  122. //通知客服已结束
  123. wsSendMsg($user['cs_uid'],'timeout',['user_id'=>$user['user_id'], 'type'=>$type]);
  124. }
  125. }
  126. }