UserQueue.php 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  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\KefuWork;
  9. use app\admin\model\KefuLog;
  10. use app\enterprise\model\{Message,Friend};
  11. use Exception;
  12. use think\facade\Db;
  13. /**
  14. * Worker 命令行类
  15. */
  16. class UserQueue extends Command
  17. {
  18. public function configure()
  19. {
  20. $this->setName('user:queue')
  21. ->setDescription('用户排队,自动分配客服');
  22. }
  23. public function execute(Input $input, Output $output)
  24. {
  25. $where = [
  26. ['status', '=', 1],
  27. ['is_online', '=', 1],
  28. ['role', '=', 3],
  29. ];
  30. while(true) {
  31. //查询当前最少接线数的客服
  32. $kefu_chat_max = Config::getKefuChatMax();//单个客服接线上限
  33. if ($kefu_chat_max) {
  34. $where[] = ['chat_num', '<', $kefu_chat_max];
  35. }
  36. //排队用户
  37. $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 0)
  38. ->order('service_start', 'asc')
  39. ->select()
  40. ->toArray();
  41. if (empty($list)) {
  42. sleep(10);
  43. }
  44. foreach ($list as $item) {
  45. $cs_user = User::where($where)->order('chat_num', 'asc')->find();
  46. if (!$cs_user) {
  47. break;
  48. }
  49. $this->handleChat($item, $cs_user->user_id, $cs_user->uid);
  50. }
  51. }
  52. }
  53. /**
  54. * 自动接线
  55. */
  56. public function handleChat($user, $cs_uid, $admin_id)
  57. {
  58. try {
  59. Db::startTrans();
  60. $user_id = $user['user_id'];
  61. User::where('user_id', $user_id)->update(['cs_uid'=>$cs_uid,'service_status' => 1, 'service_start' => time(), 'timeout_type' => 0]);
  62. //更新客服接线数量
  63. User::where('user_id', $cs_uid)->update(['chat_num'=>Db::raw('chat_num+1')]);
  64. //客服接线次数更新
  65. KefuWork::addNum($admin_id, 'chat_num');
  66. $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
  67. if ($friend) {
  68. $robot_id = $friend->friend_user_id;
  69. $friend->friend_user_id = $cs_uid;
  70. $friend->save();
  71. $chat_identify = $cs_uid . '-' . $user_id;
  72. Message::where(['from_user' => $user_id, 'to_user' => $robot_id])->update(['to_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  73. Message::where(['from_user' => $robot_id, 'to_user' => $user_id])->update(['from_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  74. }
  75. //客服对接记录表
  76. KefuLog::addData($cs_uid, $user_id, 3);
  77. Db::commit();
  78. //通知客服已接线
  79. wsSendMsg(0,'handleChat',['user_id'=>$user_id]);
  80. } catch (\Exception $e) {
  81. Db::rollback();
  82. }
  83. }
  84. }