UserQueue.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  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. $auto_cs_uid = getAutoCsUid();
  26. $where = [
  27. ['status', '=', 1],
  28. ['is_online', '=', 1],
  29. ['role', '=', 3],
  30. ['user_id', '<>', $auto_cs_uid],
  31. ];
  32. while(true) {
  33. //排队用户
  34. $list = User::where('status', 1)->where('is_online', 1)->where('service_status', 0)
  35. ->order('service_start', 'asc')
  36. ->select()
  37. ->toArray();
  38. if (empty($list)) {
  39. sleep(5);
  40. }
  41. foreach ($list as $item) {
  42. //查询当前最少接线数的客服
  43. // $kefu_chat_max = Config::getKefuChatMax();//单个客服接线上限
  44. $kefu_chat_max = (int)Config::where('field','kefu_chat_max')->value('val');
  45. $where[] = ['chat_num', '<', $kefu_chat_max];
  46. $cs_user = User::where($where)->order('chat_num', 'asc')->find();
  47. if (!$cs_user) {
  48. break;
  49. }
  50. $this->handleChat($item, $cs_user, $cs_user->uid);
  51. }
  52. }
  53. }
  54. /**
  55. * 自动接线
  56. */
  57. public function handleChat($user, $cs_user, $admin_id)
  58. {
  59. try {
  60. Db::startTrans();
  61. $cs_uid = $cs_user->user_id;
  62. $user_id = $user['user_id'];
  63. User::where('user_id', $user_id)->update(['cs_uid'=>$cs_uid,'service_status' => 1, 'service_start' => time(), 'timeout_type' => 0]);
  64. //更新客服接线数量
  65. User::where('user_id', $cs_uid)->update(['chat_num'=>Db::raw('chat_num+1')]);
  66. //客服接线次数更新
  67. KefuWork::addNum($admin_id, 'chat_num');
  68. $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
  69. if ($friend) {
  70. $robot_id = $friend->friend_user_id;
  71. $friend->friend_user_id = $cs_uid;
  72. $friend->save();
  73. $chat_identify = chat_identify($cs_uid,$user_id);
  74. Message::where(['from_user' => $user_id, 'to_user' => $robot_id])->update(['to_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  75. Message::where(['from_user' => $robot_id, 'to_user' => $user_id])->update(['from_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  76. }
  77. //客服对接记录表
  78. KefuLog::addData($cs_uid, $user_id, 3);
  79. Db::commit();
  80. //通知客服已接线
  81. wsSendMsg(0,'handleChat',['user_id'=>$user_id]);
  82. // 如果设置了欢迎语则发送欢迎语
  83. $first_auto_reply = Config::getFieldValue('first_auto_reply', $user['language_code']);
  84. if(!empty($first_auto_reply)){
  85. if($cs_user){
  86. $userInfo['dispalayName']=$cs_user['realname'];
  87. $userInfo['id']=$cs_user['user_id'];
  88. $userInfo['avatar']=avatarUrl($cs_user['avatar'],$cs_user['realname'],$cs_user['user_id']);
  89. $msg=[
  90. 'id'=>\utils\Str::getUuid(),
  91. 'user_id'=>$cs_uid,
  92. 'content'=>$first_auto_reply,
  93. 'toContactId'=>$user['user_id'],
  94. 'sendTime'=>time()*1000,
  95. 'type'=>'html',
  96. 'is_group'=>0,
  97. 'status'=>'succeed',
  98. 'fromUser'=>$userInfo,
  99. 'at'=>[]
  100. ];
  101. Message::sendMsg($msg,0,1);
  102. }
  103. }
  104. //自动回复-人工客服接线成功
  105. Message::sendAutoReply('transfer_to_human_success', $user_id, $cs_uid, $user['language_code']);
  106. //自动回复-人工客服接线成功欢迎语
  107. Message::sendAutoReply('transfer_to_human_success_reply', $user_id, $cs_uid,$user['language_code']);
  108. } catch (\Exception $e) {
  109. Db::rollback();
  110. }
  111. }
  112. }