lip преди 3 месеца
родител
ревизия
614c2c40ec

+ 43 - 2
app/admin/controller/Admin.php

@@ -11,6 +11,8 @@ use think\facade\Db;
 use app\admin\validate\AdminValidate;
 use app\admin\model\User;
 use think\facade\Session;
+use app\admin\model\KefuTime;
+use thans\jwt\facade\JWTAuth;
 
 class Admin extends BaseController
 {
@@ -98,14 +100,19 @@ class Admin extends BaseController
             if ($usernameCount > 0) {
                 return $this->error('用户名已存在');
             }
+
+            $role = AdminModel::getRole($params['role_id']);
+
             if (!empty($id)) {
                 unset($params['username']);
                 AdminModel::where('id', $id)->update($params);
+                User::where('uid', $id)->where('from', 0)->update(['role' => $role]);
             } else {
                 $admin = AdminModel::create($params);
 
                 //插入user
                 $params['id'] = $admin->id;
+                $params['role'] = $role;
                 User::addCs($params);
             }
 
@@ -233,11 +240,45 @@ class Admin extends BaseController
                 'adminInfo' => $admin,
             ];
 
-            //通知客服签到
-            wsSendMsg($userInfo['id'],'sign',['is_sign'=>1]);
+            //判断是否是客服
+            if ($userInfo['role'] == 3) {
+                //通知客服签到
+                wsSendMsg($userInfo['id'],'sign',['is_sign'=>1]);
+
+                //添加客服登录时间
+                KefuTime::addData($admin->id, 2);
+            }
+            
         } catch (\Exception $e) {
             return $this->error($e->getMessage());
         }
         return $this->success($data);
     }
+
+    //退出登录
+    public function logout(){
+        try {
+            $jwtData = JWTAuth::auth();
+        } catch (\Exception $e) {
+            return success(lang('user.logoutOk'));
+        }
+
+        $userInfo = $jwtData['info']->getValue();
+        //解密token中的用户信息
+        $userInfo = str_encipher($userInfo,false, config('app.aes_token_key'));
+
+        if (!$userInfo) {
+            return success(lang('user.logoutOk'));
+        }
+        //解析json
+        $userInfo = (array)json_decode($userInfo, true);
+        if($userInfo){
+            wsSendMsg(0,'isOnline',['id'=>$userInfo['user_id'],'is_online'=>0]);
+            
+            //结束客服在线时间
+            KefuTime::endData($this->admin_id, 2);
+        }
+        JWTAuth::invalidate(JWTAuth::token()->get());
+        return success(lang('user.logoutOk'));
+    }
 }

+ 12 - 32
app/admin/controller/Kefu.php

@@ -50,8 +50,8 @@ class Kefu extends BaseController
                 $value['transfer_num'] = intval($value['transfer_num']);
                 $value['intervention_num'] = intval($value['intervention_num']);
                 $value['completed_num'] = intval($value['completed_num']);
-                $value['inprocess'] = 0;//进行中
-                $value['unprocessed'] = 0;//待处理
+                $value['inprocess'] = User::where('cs_uid',$value['id'])->where('service_status',2)->count();//进行中
+                $value['unprocessed'] = User::where('cs_uid',$value['id'])->where('service_status',1)->count();//待处理
             }
             
         } catch (Exception $e) {
@@ -70,9 +70,13 @@ class Kefu extends BaseController
             $page = $params['page'] ?? 1;
             $limit = $params['limit'] ?? 15;
 
-            $query = KefuWork::alias('kefu_work')->join('admin', 'kefu_work.admin_id = admin.id', 'left');
+            $query = KefuWork::alias('kefu_work')
+                        ->join('admin', 'kefu_work.admin_id = admin.id', 'left')
+                        ->join('user', 'kefu_work.admin_id = user.uid', 'left')
+                        ->where('user.from', 0);
+
             if (isset($params['is_online'])) {
-                $query->where('is_online', $params['is_online']);
+                $query->where('user.is_online', $params['is_online']);
             }
             if (!empty($params['start_time'])) {
                 $query->where('kefu_work.created_at', '>=', $params['start_time'].'00:00:00');
@@ -82,18 +86,13 @@ class Kefu extends BaseController
             }
 
             $count = $query->count();
-            $list = $query->field(['admin.username','admin.nickname','admin.is_online', 'kefu_work.*'])
+            $list = $query->field(['admin.username','admin.nickname','user.is_online', 'kefu_work.*'])
                         ->order('kefu_work.id', 'desc')           
                         ->limit($limit)
                         ->page($page)
                         ->select();
             foreach ($list as &$value) {
-                // $value['chat_num'] = intval($value['chat_num']);
-                // $value['transfer_num'] = intval($value['transfer_num']);
-                // $value['intervention_num'] = intval($value['intervention_num']);
-                // $value['completed_num'] = intval($value['completed_num']);
-                // $value['inprocess'] = 0;//进行中
-                // $value['unprocessed'] = 0;//待处理
+                $value['avg_time'] = $value['service_time'] && $value['chat_num'] ? intval($value['service_time'] / $value['chat_num']) : 0; //客服平均服务时间
             }
             
         } catch (Exception $e) {
@@ -125,28 +124,9 @@ class Kefu extends BaseController
         $user_id = User::getCsId($admin_id);
         wsSendMsg($user_id,'sign',['is_sign'=>0]);
 
-        $is_online = Admin::isOnline($admin_id);
-        if ($is_online == 0 ) {
-            Admin::setOnline($admin_id, 1);
-            //上线通知
-            wsSendMsg(0,'isOnline',['id'=>$user_id, 'is_online'=>1]);
-        }
-        return $this->success([], '签到成功');
-    }
+        //上线通知
+        wsSendMsg(0,'isOnline',['id'=>$user_id, 'is_online'=>1]);
 
-    //客服状态设置
-    public function setStatus()
-    {
-        try {
-            $admin_id = $this->admin_id;
-            KefuWork::addNum($admin_id, 'sign_num');//客服签到次数更新
-            //签到记录
-            Sign::create([          
-                'admin_id' => $admin_id,
-            ]);
-        } catch (\Exception $e) {
-            return $this->error($e->getMessage());
-        }
         return $this->success([], '签到成功');
     }
 

+ 13 - 21
app/admin/model/Admin.php

@@ -9,31 +9,23 @@ class Admin extends BaseModel
     protected $autoWriteTimestamp = true;
     protected $createTime = 'created_at';
     protected $updateTime = 'updated_at';
+
+    //获取角色类型:1超管;2普管;3客服
+    public static function getRole($role_id) {
+        $role_name = Role::where('id', $role_id)->value('name');
+        $role = !empty($role_id) ? 2 : 1;
+        if ($role_name && strpos($role_name, '客服') !== false) {
+            $role = 3;
+        }
+        return $role;
+    }
     public function role()
-{
+    {
     return $this->hasOne(Role::class, 'id', 'role_id')->field(['id', 'name']);
-}
+    }
     public function department()
     {
         return $this->hasOne(Department::class, 'id', 'department_id')->field(['id', 'name']);
     }
-
-    public static function isOnline($id)
-    {
-        return self::where('id', $id)->value('is_online');
-    }
-
-    public static function setOnline($id, $is_online)
-    {
-        if ($is_online == 0) {
-            //结束今日的签到
-            $sign = Sign::where('admin_id', $id)->where('created_at', '>=', date('Y-m-d'))->order('id', 'desc')->find();
-            if ($sign && $sign->time == 0) {
-                $sign->time = time() - strtotime($sign->created_at);
-                $sign->updated_at = date('Y-m-d H:i:s');
-                $sign->save();
-            }
-        }
-        return self::where('id', $id)->update(['is_online' => $is_online]);
-    }
+    
 }

+ 48 - 0
app/admin/model/KefuTime.php

@@ -0,0 +1,48 @@
+<?php
+
+namespace app\admin\model;
+
+use app\BaseModel;
+
+class KefuTime extends BaseModel
+{
+    protected $autoWriteTimestamp = true;
+    protected $createTime = 'created_at';
+    protected $updateTime = 'updated_at';
+
+    public static function addData($admin_id, $type) {
+        return self::create([
+            'admin_id' => $admin_id,
+            'type' => $type,
+            'start_time' => time(),
+            'status' => 0,
+        ]);
+    }
+
+    //结束服务时间
+    public static function endData($admin_id, $type) {
+        $exits = KefuTime::where('admin_id', $admin_id)->where('type', $type)->where("created_at", '>=', date("Y-m-d"))->orderBy('id', 'desc')->find();
+        if ($exits && $exits->status == 0) {
+            $exits->status = 1;
+            $exits->end_time = time();
+            $exits->save();
+
+            $info = KefuWork::where('admin_id', $admin_id)->where("created_at", '>=', date("Y-m-d"))->find();
+            if ($type == 1) { 
+                $info->busy_time += $exits->end_time - $exits->start_time;
+                $info->save();
+            } elseif ($type == 2) { 
+                $info->online_time += $exits->end_time - $exits->start_time;
+                $info->save();
+            } elseif ($type == 3) { 
+                $info->chat_time += $exits->end_time - $exits->start_time;
+                $info->save();
+            } elseif ($type == 4) { 
+                $info->service_time += $exits->end_time - $exits->start_time;
+                $info->save();
+            }
+            return true;
+        }
+        return false;
+    }
+}

+ 25 - 0
app/admin/model/KefuWork.php

@@ -21,6 +21,31 @@ class KefuWork extends BaseModel
             $info->$field += 1;
             $info->save();
         }
+
+        $type = 0;
+        if ($field == 'busy_num') {
+            $type = 1;
+            $time_field = 'busy_time';
+        } else if ($field == 'sign_num' || $field == 'online_num') {
+            $type = 4;
+            $time_field = 'service_time';
+        } elseif ($field == 'chat_num') {
+            $type = 3;
+            $time_field = 'chat_time';
+        }
+
+        if ($type) {
+            $exits = KefuTime::where('admin_id', $admin_id)->where('type', $type)->where("created_at", '>=', date("Y-m-d"))->orderBy('id', 'desc')->find();
+            if ($exits && $exits->status == 0) {
+                $exits->status = 1;
+                $exits->end_time = time();
+                $exits->save();
+
+                $info->$time_field += $exits->end_time - $exits->start_time;
+            }
+
+            KefuTime::addData($admin_id, $type);
+        }
         return true;
     }
 }

+ 1 - 2
app/admin/model/User.php

@@ -65,7 +65,7 @@ class User extends BaseModel
             'realname' => $params['nickname'] ?? '',
             'password' => $params['password'],
             'sex' => $params['sex'],
-            'role' => $params['id'] == 1 ? 1 : 2,
+            'role' => $params['role'],
             'remark' => $params['remark'] ?? '',
             'cs_uid' => $params['id'],
             'friend_limit' => 500,
@@ -74,7 +74,6 @@ class User extends BaseModel
             'from' => 0,
             'uid' => $params['id'],
         ]);
-
     }
 
 }

+ 2 - 6
app/common.php

@@ -779,12 +779,8 @@ function wsSendMsg($user, $type,  $data, $isGroup=0)
             Gateway::$send($user, $message);
         }
         
-        if ($type == 'isOnline' ) {
-            $admin_id = \app\admin\model\User::getAdminId($data['id']);
-            if ($admin_id) {
-                $is_onlie = !empty($data['is_busy']) ? 2 : $data['is_online'];
-                \app\admin\model\Admin::setOnline($admin_id, $is_onlie);
-            }
+        if ($type == 'isOnline' && isset($data['is_online'])) {
+            \app\enterprise\model\User::setOnline($user, $data['is_online']);
         }
      }catch(\Exception $e){
         //忽略错误

+ 9 - 6
app/common/controller/Pub.php

@@ -281,17 +281,20 @@ class Pub
 
     // 设置在线状态
     public function setOnline(){
-        $user_id=input('user_id');
-        $is_online=input('is_online',1);
-        $is_busy = input('is_busy',0);
+        $user_id= (int)input('user_id');
+        $is_online= (int)input('is_online',1);
         try{
             $client_ids=Gateway::getClientIdByUid($user_id);
             // 一个终端登录时才发送下线通知
             if(count($client_ids)<2){
-                wsSendMsg(0,'isOnline',['id'=>$user_id,'is_online'=>$is_online,'is_busy'=>$is_busy]);
+                wsSendMsg(0,'isOnline',['id'=>$user_id,'is_online'=>$is_online]);
+            }
+            //客服在线次数更新
+            if($is_online > 0) {
+                $admin_id = \app\admin\model\User::getAdminId($user_id);
+                $field = $is_online == 1 ? 'online_num' : 'busy_num';
+                \app\admin\model\KefuWork::addNum($admin_id, $field);
             }
-
-            
         }catch(\Exception $e){
             // 未找到用户
         }

+ 43 - 1
app/enterprise/model/User.php

@@ -14,6 +14,9 @@ use think\facade\Request;
 use think\model\concern\SoftDelete;
 use app\manage\model\Config;
 use thans\jwt\facade\JWTAuth;
+use app\admin\model\Sign;
+use app\admin\model\KefuWork;
+use app\admin\model\KefuTime;
 
 class User extends BaseModel
 {
@@ -232,7 +235,7 @@ class User extends BaseModel
             $list_chart[$k]['location'] =$v['last_login_ip'] ? implode(" ", \Ip::find($v['last_login_ip'])) : "未知";
          }
          $is_online=0;
-         if(isset($onlineList[$v['user_id']])){
+         if($v['is_online'] == 0 && isset($onlineList[$v['user_id']])){
             $is_online=1;
          }
          $list_chart[$k]['is_online'] = $is_online;
@@ -765,4 +768,43 @@ class User extends BaseModel
       }
       return true;
    }
+
+   //设置用户在线状态
+    public static function setOnline($user_id, $is_online)
+    {
+        $user = self::where('user_id',$user_id)->find();
+        if (!$user) {
+            return false;
+        }
+
+        //离线
+        if ($is_online == 0 && $user->role == 3) {
+            //结束今日的签到
+            $sign = Sign::where('admin_id', $user->uid)->where('created_at', '>=', date('Y-m-d'))->order('id', 'desc')->find();
+            if ($sign && $sign->time == 0) {
+                $sign->time = time() - strtotime($sign->created_at);
+                $sign->updated_at = date('Y-m-d H:i:s');
+                $sign->save();
+            }
+            //结束客服服务时间
+            KefuTime::endData($user->uid, 4);
+        }
+        //上线
+        if ($user->online == 0 && $is_online == 1 && $user->role == 3) {
+            //添加客服服务时间
+            KefuWork::addNum($user->uid, 'online_num');
+        }
+
+        //忙碌
+         if ($user->online != 2 && $is_online == 2 && $user->role == 3) {
+            //更新客服忙碌次数
+            KefuWork::addNum($user->uid, 'busy_num');
+         }
+        return self::where('user_id', $user_id)->update(['is_online' => $is_online]);
+    }
+
+    public static function isOnline($user_id)
+    {
+        Gateway::isUidOnline($user_id);
+    }
 }

+ 5 - 6
app/worker/Events.php

@@ -24,8 +24,7 @@ use Lcobucci\JWT\Builder;
 use Lcobucci\JWT\Parser;
 use thans\jwt\provider\JWT\Lcobucci;
 use utils\Aes;
-use app\admin\model\Admin;
-use think\facade\Log;
+use app\enterprise\model\User;
 
 class Events
 {
@@ -140,11 +139,11 @@ class Events
         $_SESSION['role']=$userInfo['role'];
 
         if($_SESSION['role'] != 0){
-            $admin_id = $_SESSION['user_id'];
-            $is_online = Admin::isOnline($admin_id);
+            $user_id = $_SESSION['user_id'];
+            $is_online = User::isOnline($user_id);
             if ($is_online == 0) {
                 //更新客服上线状态
-                Admin::setOnline($admin_id, 1);
+                User::setOnline($user_id, 1);
                 Gateway::sendToClient($client_id, json_encode(array(
                     'type'      => 'sign',
                     'data' => ['is_sign' => 1],
@@ -178,7 +177,7 @@ class Events
 
             if($_SESSION['role'] != 0){
                 //更新客服离线状态
-                Admin::setOnline($user_id, 0);
+                User::setOnline($user_id, 0);
             }
         }
         self::onlineStatistics();