User.php 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <?php
  2. namespace app\admin\model;
  3. use app\BaseModel;
  4. use think\model\concern\SoftDelete;
  5. use thans\jwt\facade\JWTAuth;
  6. use app\enterprise\model\{Message,Friend};
  7. class User extends BaseModel
  8. {
  9. use softDelete;
  10. protected $deleteTime = 'delete_time';
  11. protected $defaultSoftDelete = null;
  12. protected $table = 'bot_users';
  13. protected $createTime = 'created_at';
  14. protected $updateTime = 'updated_at';
  15. //时间是日期格式
  16. protected $autoWriteTimestamp = true;
  17. protected $pk = "id";
  18. public static $defaultField = 'user_id,realname,realname as displayName,account,avatar,name_py,email,last_login_ip';
  19. protected $json = ['setting'];
  20. protected $jsonAssoc = true;
  21. /**
  22. * @notes 生成用户编码
  23. * @param string $prefix
  24. */
  25. public static function createUserSn($prefix = '', $length = 8)
  26. {
  27. $rand_str = '';
  28. for ($i = 0; $i < $length; $i++) {
  29. $rand_str .= mt_rand(1, 9);
  30. }
  31. $user_id = $prefix . $rand_str;
  32. if (User::where(['user_id' => $user_id])->find()) {
  33. return self::createUserSn($prefix, $length);
  34. }
  35. return $user_id;
  36. }
  37. public static function getCsId($admin_id) {
  38. return self::where('from', 0)->where('uid', $admin_id)->value('user_id');
  39. }
  40. public static function getAdminId($user_id) {
  41. return self::where('from', 0)->where('user_id', $user_id)->value('uid');
  42. }
  43. public function getAvatarAttr($value,$data)
  44. {
  45. return avatarUrl($data['avatar'],$data['realname'],$data['user_id']);
  46. }
  47. public function getSettingAttr($value)
  48. {
  49. if (!$value) return null;
  50. $setting = $value;
  51. $setting['hideMessageName']= $setting['hideMessageName']=='true' ? true : false;
  52. $setting['hideMessageTime']= $setting['hideMessageTime']=='true' ? true : false;
  53. $setting['avatarCricle']= $setting['avatarCricle']=='true' ? true : false;
  54. $setting['isVoice']= $setting['isVoice']=='true' ? true : false;
  55. $setting['sendKey']=1;//(int)$setting['sendKey'];
  56. return $setting;
  57. }
  58. /**
  59. * 刷新用户token 之前token将被拉黑
  60. * 修改用户数据后 调用该方法 并返回前台更新token
  61. * @param array $info 用户信息
  62. * @param string $terminal 客户端标识
  63. * @return string
  64. * @throws \think\db\exception\DataNotFoundException
  65. * @throws \think\db\exception\DbException
  66. * @throws \think\db\exception\ModelNotFoundException
  67. */
  68. public static function refreshToken($info,$terminal, $admin = [])
  69. {
  70. $info = str_encipher(json_encode($info),true, config('app.aes_token_key'));
  71. $authToken = 'bearer '.JWTAuth::builder(['info' => $info, 'terminal' => $terminal, 'admin' => $admin]);
  72. return $authToken;
  73. }
  74. //添加客服用户
  75. public static function addCs($params) {
  76. self::create([
  77. 'user_id' => User::createUserSn(),
  78. 'account' => $params['username'],
  79. 'realname' => $params['nickname'] ?? '',
  80. 'avatar' => $params['avatar'] ?? '',
  81. 'password' => $params['password'],
  82. 'sex' => $params['sex'],
  83. 'role' => $params['role'],
  84. 'remark' => $params['remark'] ?? '',
  85. 'cs_uid' => $params['id'],
  86. 'friend_limit' => 500,
  87. 'group_limit' => 500,
  88. 'phone' => $params['phone'] ?? '',
  89. 'from' => 0,
  90. 'uid' => $params['id'],
  91. ]);
  92. }
  93. //客服离线后自动结束所有客服会话
  94. public static function KefuOffline($kefu_user_id, $admin_id) {
  95. wsSendMsg(0,'isOnline',['id'=>$kefu_user_id,'is_online'=>0]);
  96. //更新客服状态
  97. User::where('user_id', $kefu_user_id)->update(['is_online'=>0, 'offline_time'=>time(), 'is_finished' => 1, 'chat_num' => 0]);
  98. //更新客服接线的用户
  99. $cs_uid = getAutoCsUid();
  100. $list = User::where('cs_uid', $kefu_user_id)->select()->toArray();
  101. foreach($list as $item) {
  102. //是否弹层提醒
  103. $is_warning = $item['service_status'] == 1 || $item['service_status'] == 2 ? 1 : 0;
  104. $service_status = $item['is_online'] == 1 ? 0 : -1 ;
  105. //更新用户会话状态
  106. User::where('user_id', $item['user_id'])->update(['cs_uid' => $cs_uid, 'service_status' => $service_status, 'service_start' => time(), 'timeout_type' => 0]);
  107. $user_id = $item['user_id'];
  108. $old_cs_uid = $item['cs_uid'];
  109. $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
  110. if ($friend) {
  111. $friend->friend_user_id = $cs_uid;
  112. $friend->save();
  113. $chat_identify = $cs_uid . '-' . $user_id;
  114. Message::where(['from_user' => $user_id, 'to_user' => $old_cs_uid])->update(['to_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  115. Message::where(['from_user' => $old_cs_uid, 'to_user' => $user_id])->update(['from_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
  116. }
  117. //客服对接记录表
  118. KefuLog::addData($cs_uid, $user_id, 3);
  119. //通知关闭聊天框
  120. wsSendMsg($old_cs_uid,'closeChat',['user_id'=>$user_id, 'realname' => $item['realname'], 'is_warning' => $is_warning]);
  121. }
  122. //结束客服忙碌时间
  123. KefuTime::endData($admin_id, 1);
  124. //结束客服在线时间
  125. KefuTime::endData($admin_id, 2);
  126. //结束客服接线时间
  127. KefuTime::endData($admin_id, 3, $kefu_user_id);
  128. //通知客服已结束
  129. wsSendMsg(0,'handleChat',['user_id'=>0]);
  130. }
  131. }