lip hace 3 meses
padre
commit
91ddbb0460

+ 4 - 0
app/admin/controller/Admin.php

@@ -14,6 +14,8 @@ use app\admin\model\KefuWork;
 use think\facade\Session;
 use app\admin\model\KefuTime;
 use thans\jwt\facade\JWTAuth;
+use app\admin\model\Department;
+use app\admin\model\Role;
 
 class Admin extends BaseController
 {
@@ -213,6 +215,8 @@ class Admin extends BaseController
                     ->select()
                     ->toArray();
             }
+            $admin->role_name = Role::where('id', $admin->role_id)->value('name');
+            $admin->department_name = Department::where('id', $admin->department_id)->value('name');
 
             //如果登录信息中含有client——id则自动进行绑定
             $userInfo = User::where('account', $admin->username)->where('role', '>', 0)->find();

+ 1 - 1
app/admin/controller/Complaint.php

@@ -25,7 +25,7 @@ class Complaint extends BaseController
             $limit = $params['limit'] ?? 15;
             $language_code = $params['language_code'] ?? $this->lang;
             
-            $query = ComplaintModel::alias('complaint')->join('admin', 'admin.id=complaint.kefu_id','left')
+            $query = ComplaintModel::alias('complaint')->join('admin', 'admin.id=complaint.cs_uid','left')
                                     ->where('complaint.language_code', $language_code); 
             if (!empty($params['keyword'])) {
                 $query = $query->where('admin.nickname', 'like', '%'.$params['keyword'].'%')

+ 95 - 18
app/admin/controller/Kefu.php

@@ -11,6 +11,8 @@ use app\admin\model\User;
 use app\admin\model\UserView;
 use app\admin\model\KefuTime;
 use app\admin\model\OperationData;
+use app\admin\model\Department;
+use app\admin\model\Config;
 use app\enterprise\model\{Message,Friend};
 use Exception;
 use think\facade\Db;
@@ -194,27 +196,31 @@ class Kefu extends BaseController
             if ($user->service_status >= 1) {
                 return $this->error('用户已接线');
             }
-            $user->cs_uid = $this->admin_id;
+            $cs_uid = User::getCsId($this->admin_id);
+            $user->cs_uid = $cs_uid;
             $user->service_status = 1;
             $user->save();
 
             $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
-            $robot_id = $friend->friend_user_id;
-            $friend->friend_user_id = $this->admin_id;
-            $friend->save();
-
-            Message::where(['from_user' => $user_id, 'to_user' => $robot_id])->update(['to_user' => $this->admin_id]);
-            Message::where(['from_user' => $robot_id, 'to_user' => $user_id])->update(['from_user' => $this->admin_id]);
+            if ($friend) {
+                $robot_id = $friend->friend_user_id;
+                $friend->friend_user_id = $cs_uid;
+                $friend->save();
+    
+                Message::where(['from_user' => $user_id, 'to_user' => $robot_id])->update(['to_user' => $cs_uid]);
+                Message::where(['from_user' => $robot_id, 'to_user' => $user_id])->update(['from_user' => $cs_uid]);
+            }
 
             KefuWork::addNum($this->admin_id, 'chat_num');//客服接线次数更新
 
             Db::commit();
             //通知客服已接线
-            //wsSendMsg($user_id,'isChat',['is_chat'=>1]);
+            wsSendMsg(0,'handleChat',['user_id'=>$user_id]);
         } catch (\Exception $e) {
             Db::rollback();
             return $this->error($e->getMessage());
         }
+        return $this->success([], '');
     }
 
     /**
@@ -225,33 +231,38 @@ class Kefu extends BaseController
         try {
             Db::startTrans();
             $user_id = $this->request->param('user_id');
-            $admin_id = $this->request->param('admin_id');
+            $cs_uid = $this->request->param('cs_uid');
 
             $user = User::where('user_id', $user_id)->find();
             if (!$user) {
                 return $this->error('用户不存在');
             }
-            $user->cs_uid = $admin_id;
+            $admin_id = User::getAdminId($cs_uid);
+            $user->cs_uid = $cs_uid;
             $user->service_status = 1;
             $user->save();
 
             $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
-            $old_admin_id = $friend->friend_user_id;
-            $friend->friend_user_id = $admin_id;
-            $friend->save();
+            if ($friend) {
+                $old_cs_uid = $friend->friend_user_id;
+                $friend->friend_user_id = $cs_uid;
+                $friend->save();
+                
+                Message::where(['from_user' => $user_id, 'to_user' => $old_cs_uid])->update(['to_user' => $cs_uid]);
+                Message::where(['from_user' => $old_cs_uid, 'to_user' => $user_id])->update(['from_user' => $cs_uid]);
+                KefuTime::endData($old_cs_uid, 3); //结束接线时间
+            }
 
-            Message::where(['from_user' => $user_id, 'to_user' => $old_admin_id])->update(['to_user' => $admin_id]);
-            Message::where(['from_user' => $old_admin_id, 'to_user' => $user_id])->update(['from_user' => $admin_id]);
             KefuWork::addNum($admin_id, 'chat_num');//客服接线次数更新
-            KefuTime::endData($old_admin_id, 3); //结束接线时间
 
             Db::commit();
             //通知客服已接线
-            //wsSendMsg($user_id,'isChat',['is_chat'=>1]);
+            wsSendMsg(0,'handleChat',['user_id'=>$user_id]);
         } catch (\Exception $e) {
             Db::rollback();
             return $this->error($e->getMessage());
         }
+        return $this->success([], '');
     }
 
     /**
@@ -259,7 +270,73 @@ class Kefu extends BaseController
      */
     public function select() 
     {
-        
+        $department_id = Admin::where('id', $this->admin_id)->value('department_id');
+        $parent_department_id = Department::where('id', $department_id)->value('parent_id');
+        $where[] = ['department_id', '=', $parent_department_id];
+
+        $list = Admin::alias('admin')->join('user', 'admin.id = user.uid', 'left')
+                ->where('user.role', '>', 0)
+                ->where('user.status', 1)
+                ->where('admin.department_id', $department_id)->whereOr(function ($query) use ($parent_department_id) {
+                    if ($parent_department_id) {
+                        $query->where('admin.department_id', $parent_department_id);
+                    }
+                })
+                ->where('admin.id','<>', $this->admin_id)
+                ->order('admin.department_id', 'asc')
+                ->order('user.is_online', 'desc')
+                ->field(['user.user_id','user.account','user.realname','user.avatar','user.is_online','admin.nickname','admin.username'])
+                ->select()
+                ->toArray();
+        return $this->success($list);
+    }
+
+    /**
+     * 客服结束会话
+     */
+    public function finishedChat()
+    { 
+        try {
+            Db::startTrans();
+            $user_id = $this->request->param('user_id');
+
+            $user = User::where('user_id', $user_id)->find();
+            if (!$user) {
+                return $this->error('用户不存在');
+            }
+            
+            if ($user->service_status != 3) {
+                $user->service_status = 3;
+                $user->save();
+               
+                KefuTime::endData($user->cs_uid, 3); //结束接线时间
+    
+                Db::commit();
+                //通知客服已结束
+                wsSendMsg(0,'handleChat',['user_id'=>$user_id]);
+    
+                //给用户发送客服评分的消息
+                $user_open_comment = Config::where('field', 'user_open_comment')->value('val');
+                if ($user_open_comment == 1 ) {
+                    $param = [
+                        'id' => \utils\Str::getUuid(),
+                        'type' => 'text',
+                        'status' => 'going',
+                        'sendTime' => time() * 1000,
+                        'toContactId' => $user_id,
+                        'content' => Config::where('field','kefu_finished_chat')->value('val'),
+                        'file_id' => 0,
+                        'is_group' => 0,
+                        'user_id' => $user->cs_uid,
+                    ];
+                    Message::sendMsg($param, 0);
+                }
+            }
+        } catch (\Exception $e) {
+            Db::rollback();
+            return $this->error($e->getMessage());
+        }
+        return $this->success([], '');
     }
 
 }

+ 73 - 11
app/enterprise/controller/Im.php

@@ -13,15 +13,77 @@ use think\facade\Cache;
 use app\manage\model\{Config};
 use app\admin\model\GuessAskLanguages;
 use app\admin\model\QuestionLanguages;
+use app\admin\model\Complaint;
+use app\admin\model\ComplaintItem;
 
 class Im extends BaseController
 {
     protected $fileType = ['file', 'image','video','voice','emoji'];
 
+    /**
+     */
+    public function complaintList()
+    {
+        try {
+            $params = $this->request->param();
+
+            $page = $params['page'] ?? 1;
+            $limit = $params['limit'] ?? 15;
+            $language_code = $params['language_code'] ?? $this->lang;
+            
+            $query = ComplaintItem::where('language_code', $language_code); 
+            
+            $count = $query->count();
+            $list = $query->order('weight','desc')
+                        ->limit($limit)
+                        ->page($page)
+                        ->select();
+        } catch (Exception $e) {
+            return error($e->getMessage());
+        }
+        return success('', ['count' => $count, 'list' => $list]);
+    }
+
+    /**
+     * 投诉客服
+     */
+    public function complaint()
+    {
+        $params = $this->request->param();
+        if (empty($params['complaint_item_id'])) {
+            return error('请选择投诉项');
+        }
+        $user_id = $this->userInfo['user_id'];
+        $user = User::where('user_id', $user_id)->find();
+        if (!$user) {
+            return error('用户不存在');
+        }
+        $exist = Complaint::where('user_id', $user_id)->where('cs_uid', $user->cs_uid)->find();
+        if ($exist) {
+            return error('您已投诉过该客服,无需重复投诉');
+        }
+
+        Complaint::create([
+            'user_id' => $user_id,
+            'cs_uid' => $user->cs_uid,
+            'complaint_item_id' => $params['complaint_item_id'],
+            'remark' => $params['remark'] ?? '',
+        ]);
+        $data = $this->request->param();
+        $data['user_id'] = $user['id'];
+        $data['create_time'] = time();
+        $data['status'] = 0;
+        $data['type'] = 1;
+        $res = Db::name('complaint')->insert($data);
+        if ($res) {
+            return $this->success('提交成功');
+        }
+    }
+
     /**
      * 猜你想问列表
      */
-    function guessask()
+    public function guessask()
     {
         try {
             $params = $this->request->param();
@@ -130,9 +192,10 @@ class Im extends BaseController
             if ($user->role > 0) {
                 return error('系统管理员无法转人工');
             }
-            if ($user['service_status'] == -1) {
+            // ($user->service_status == -1) {
                 $user->service_status = 0;
-                $user->service->service_start = time();
+                $user->service_start = time();
+                $user->cs_uid = 0;
                 $user->save();
 
                 //机器人客服
@@ -141,15 +204,15 @@ class Im extends BaseController
                     'id' => \utils\Str::getUuid(),
                     'type' => 'text',
                     'status' => 'going',
-                    'sendTime' => time(),
-                    'toContactId' => !empty($autoTask['user_id']) ? $autoTask['user_id'] : 1,
-                    'content' => $this->globalConfig['transfer_to_human'],
+                    'sendTime' => time() * 1000,
+                    'toContactId' => $user_id,
+                    'content' => Config::where('field','transfer_to_human')->value('val'),
                     'file_id' => 0,
-                    'is_group' => 0
+                    'is_group' => 0,
+                    'user_id' => !empty($autoTask['user_id']) ? $autoTask['user_id'] : 1,
                 ];
                 Message::sendMsg($param, 0);
-            }
-            
+            //
         } catch (Exception $e) {
             return error($e->getMessage());
         }
@@ -158,7 +221,7 @@ class Im extends BaseController
     // 获取联系人列表
     public function getContacts()
     {
-        $data = User::getUserList([['status', '=', 1], ['user_id', '<>', $this->userInfo['user_id']]], $this->userInfo['user_id']);
+        $data = User::getUserList([['status', '=', 1], ['user_id', '<>', $this->userInfo['user_id']]], $this->userInfo['user_id'] , '', $this->userInfo['role']);
         $count=Friend::where(['status'=>2,'friend_user_id'=>$this->uid])->count();
         $time=Friend::where(['friend_user_id'=>$this->uid,'is_invite'=>1])->order('create_time desc')->value('create_time');
         return success('', $data,$count,$time*1000);
@@ -461,7 +524,6 @@ class Im extends BaseController
             }
         }
         
-        
         $list = Message::getList($map, $where, 'msg_id desc', $listRows, $pageSize);
         $data = $this->recombileMsg($list,true,$groupManage);
         // 如果是群聊并且是第一页消息,需要推送@数据给用户

+ 13 - 4
app/enterprise/model/User.php

@@ -116,7 +116,7 @@ class User extends BaseModel
    }
 
    //查询用户列表
-   public static function getUserList($map, $user_id, $field = "")
+   public static function getUserList($map, $user_id, $field = "", $role = 0)
    {
       if (!$field) {
          $field = self::$defaultField;
@@ -126,7 +126,11 @@ class User extends BaseModel
       // 如果是社区模式,就只查询自己的好友,如果是企业模式,就查询所有用户
       if($config['sysInfo']['runMode']==1){
          $friendList = Friend::getFriend(['create_user' => $user_id]);
-         $list = self::where($map)->field($field)->select();
+         if ($role > 0) {
+            $list = self::where($map)->whereOr('cs_uid', 0)->field($field)->select();
+         } else {
+            $list = self::where($map)->field($field)->select();
+         }
       }else{
          $friendList = Friend::getFriend(['create_user' => $user_id,'status'=>1]);
          $userList = array_keys($friendList);
@@ -141,7 +145,12 @@ class User extends BaseModel
             $userList=array_merge($userList,$cus);
          }
          $userList = array_unique($userList);
-         $list = self::where($map)->where('user_id', 'in', $userList)->field($field)->select();
+         $map[] = ['user_id','in',$userList];
+         $list = self::where($map)->whereOr(function ($query) use ($role) {
+             if ($role > 0) {
+                $query->where('cs_uid', 0)->where('service_status', 0);
+             }
+         })->field($field)->select();
       }
       $list_chart = chartSort($list, 'realname', false, 'index');
       // 查询未读消息
@@ -224,7 +233,7 @@ class User extends BaseModel
          $list_chart[$k]['avatar'] = avatarUrl($v['avatar'], $v['realname'], $v['user_id'], 120);
          $list_chart[$k]['lastContent'] = '';
          $list_chart[$k]['unread'] = 0;
-         $list_chart[$k]['lastSendTime'] = time() * 1000;
+         $list_chart[$k]['lastSendTime'] = $list_chart[$k]['lastSendTime'] * 1000;//time() * 1000;
          $list_chart[$k]['is_group'] = 0;
          $list_chart[$k]['setting'] = [];
          $list_chart[$k]['is_at'] = 0;

+ 3 - 1
app/lang/zh.php

@@ -99,4 +99,6 @@ return [
     '退出成功' => '退出成功',
     '用户不存在' => '用户不存在',
     '系统管理员无法转人工' => '系统管理员无法转人工',
-]
+    '请选择投诉项' => '请选择投诉项',
+    '您已投诉过该客服,无需重复投诉' => '您已投诉过该客服,无需重复投诉',
+];