UserQueue.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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 think\facade\Db;
  12. /**
  13. * Worker 命令行类
  14. */
  15. class UserQueue extends Command
  16. {
  17. public function configure()
  18. {
  19. $this->setName('user:queue')
  20. ->setDescription('用户排队,自动分配客服');
  21. }
  22. public function execute(Input $input, Output $output)
  23. {
  24. $auto_cs_uid = getAutoCsUid();
  25. $where = [
  26. ['status', '=', 1],
  27. ['is_online', '=', 1],
  28. ['role', '=', 3],
  29. ['user_id', '<>', $auto_cs_uid],
  30. ];
  31. while (true) {
  32. //排队用户
  33. $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 0)
  34. ->order('service_start', 'asc')
  35. ->select()
  36. ->toArray();
  37. if (empty($list)) {
  38. sleep(5);
  39. continue;
  40. }
  41. //单个客服接线上限
  42. $kefu_chat_max = (int)Config::where('field', 'kefu_chat_max')->value('val');
  43. foreach ($list as $item) {
  44. //查询当前最少接线数的客服
  45. $cs_user = User::where($where)
  46. ->where('chat_num', '<', $kefu_chat_max)
  47. ->order('chat_num', 'asc')
  48. ->find();
  49. if (!$cs_user) {
  50. //有排队用户但没有可接线客服时,避免空循环占满 CPU
  51. sleep(5);
  52. continue 2;
  53. }
  54. $this->handleChat($item, $cs_user->user_id, $cs_user->uid);
  55. }
  56. //分配失败时用户可能仍在队列中,限制重试频率
  57. sleep(1);
  58. }
  59. }
  60. /**
  61. * 自动接线
  62. */
  63. public function handleChat($user, $cs_uid, $admin_id)
  64. {
  65. try {
  66. Db::startTrans();
  67. $user_id = $user['user_id'];
  68. User::where('user_id', $user_id)->update(['cs_uid'=>$cs_uid,'service_status' => 2, 'service_start' => time(), 'timeout_type' => 0]);
  69. //更新客服接线数量
  70. $chat_num = User::where('cs_uid',$cs_uid)->whereIn('service_status',[1,2])->count();
  71. User::where('user_id', $cs_uid)->update(['chat_num'=>$chat_num]);
  72. //客服接线次数更新
  73. KefuWork::addNum($admin_id, 'chat_num');
  74. $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
  75. if ($friend) {
  76. $robot_id = $friend->friend_user_id;
  77. $friend->friend_user_id = $cs_uid;
  78. $friend->save();
  79. $chat_identify = chat_identify($cs_uid,$user_id);
  80. Message::where(['from_user' => $user_id, 'to_user' => $robot_id])->update(['to_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  81. Message::where(['from_user' => $robot_id, 'to_user' => $user_id])->update(['from_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  82. }
  83. //客服对接记录表
  84. KefuLog::addData($cs_uid, $user_id, 3);
  85. Db::commit();
  86. //通知客服已接线
  87. wsSendMsg(0,'handleChat',['user_id'=>$user_id]);
  88. //通知客服接线用户成功
  89. wsSendMsg($cs_uid,'kefuChat',['user_id'=>$user_id]);
  90. //自动回复-人工客服接线成功
  91. Message::sendAutoReply('transfer_to_human_success', $user_id, $cs_uid, $user['language_code']);
  92. //自动回复-人工客服接线成功欢迎语
  93. Message::sendAutoReply('transfer_to_human_success_reply', $user_id, $cs_uid,$user['language_code']);
  94. } catch (\Exception $e) {
  95. Db::rollback();
  96. }
  97. }
  98. }