lip 3 luni în urmă
părinte
comite
2a66220007

+ 23 - 1
app/admin/command/UserTimeout.php

@@ -111,10 +111,32 @@ class UserTimeout extends Command
                     Db::rollback();
                 }
             }
-            $output->writeln('用户服务中-会员离线后自动结束会话时间'.count($list));
+            $output->writeln('会员离线后自动结束会话时间'.count($list));
         }
         
+        if (isset($config['kefu_inline_finished']) && $config['kefu_inline_finished'] > 0) {
+            $kefu_inline_finished = $config['kefu_inline_finished'] * 60;
+            //客服离线后自动结束会话时间
+            $list = User::where('role', 3)
+                    ->where('is_online', 0)
+                    ->where('is_finished', 0)
+                    ->where('offline_time', '<=', time() - $kefu_inline_finished)
+                    ->select()
+                    ->toArray();
+            $cs_uid = getAutoCsUid();//获取机器人ID
+            foreach($list as $user) {
+                try {
+                    Db::startTrans();
+                    
+                    User::kefuOffline($user['user_id'], $user['uid']);
 
+                    Db::commit();
+                } catch (\Exception $e) {
+                    Db::rollback();
+                }
+            }
+            $output->writeln('客服离线后自动结束会话时间'.count($list));
+        }
     }
 
     //检测离线用户,更新在线状态

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

@@ -294,17 +294,8 @@ class Admin extends BaseController
         //解析json
         $userInfo = (array)json_decode($userInfo, true);
         if($userInfo){
-            wsSendMsg(0,'isOnline',['id'=>$userInfo['user_id'],'is_online'=>0]);
-            
-            //结束客服忙碌时间
-            KefuTime::endData($this->admin_id, 1);
-            //结束客服在线时间
-            KefuTime::endData($this->admin_id, 2);
-            
-            //结束客服接线时间
-            KefuTime::endData($this->admin_id, 3);
-            //结束客服服务时间
-            KefuTime::endData($this->admin_id, 4);
+            //客服离线后自动结束所有客服会话
+            User::KefuOffline($userInfo['user_id'], $this->admin_id);
         }
         JWTAuth::invalidate(JWTAuth::token()->get());
         return success(lang('退出成功'));

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

@@ -26,7 +26,7 @@ class KefuTime extends BaseModel
         if ($type == 3) {
             //更新客服接线数量
             User::where('user_id', $cs_uid)->update(['chat_num'=>Db::raw('chat_num-1')]);
-            
+
             $count = User::where('cs_uid', $cs_uid)->whereIn('service_status', [1,2])->count();
             if ($count == 0) {
                 return false;
@@ -56,4 +56,5 @@ class KefuTime extends BaseModel
         }
         return false;
     }
+
 }

+ 42 - 0
app/admin/model/User.php

@@ -5,6 +5,7 @@ namespace app\admin\model;
 use app\BaseModel;
 use think\model\concern\SoftDelete;
 use thans\jwt\facade\JWTAuth;
+use app\enterprise\model\{Message,Friend};
 
 class User extends BaseModel
 {
@@ -76,4 +77,45 @@ class User extends BaseModel
         ]);
     }
 
+    //客服离线后自动结束所有客服会话
+    public static function KefuOffline($kefu_user_id, $admin_id) {
+
+        wsSendMsg(0,'isOnline',['id'=>$kefu_user_id,'is_online'=>0]);
+        //更新客服状态
+        User::where('user_id', $kefu_user_id)->update(['is_online'=>0, 'offline_time'=>time(), 'is_finished' => 1, 'chat_num' => 0]);
+        //更新客服接线的用户
+        $cs_uid = getAutoCsUid();
+
+        $list = User::where('cs_uid', $kefu_user_id)->select()->toArray();
+        foreach($list as $item) {
+            //更新用户会话状态
+            User::where('user_id', $item['user_id'])->update(['cs_uid' => $cs_uid, 'service_status' => 0, 'service_start' => time()]);
+
+            $user_id = $item['user_id'];
+            $old_cs_uid = $item['cs_uid'];
+
+            $friend = Friend::where('create_user', $user_id)->order('create_time', 'desc')->find();
+            if ($friend) {
+                $friend->friend_user_id = $cs_uid;
+                $friend->save();
+                
+                $chat_identify = $cs_uid . '-' . $user_id;
+                Message::where(['from_user' => $user_id, 'to_user' => $old_cs_uid])->update(['to_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
+                Message::where(['from_user' => $old_cs_uid, 'to_user' => $user_id])->update(['from_user' => $cs_uid, 'chat_identify' => $chat_identify, 'is_read' => 1]);
+            }
+        }
+        //结束客服忙碌时间
+        KefuTime::endData($admin_id, 1);
+        //结束客服在线时间
+        KefuTime::endData($admin_id, 2);
+            
+        //结束客服接线时间
+        KefuTime::endData($admin_id, 3, $kefu_user_id);
+        //结束客服服务时间
+        KefuTime::endData($admin_id, 4);
+        
+        //通知客服已结束
+        wsSendMsg(0,'handleChat',['user_id'=>0]);
+    }
+
 }

+ 2 - 0
app/enterprise/model/User.php

@@ -836,6 +836,8 @@ class User extends BaseModel
         ];
         if ($is_online == 0) {
             $update_data['offline_time'] = time();
+        } else {
+            $update_data['is_finished'] = 0;
         }
         return self::where('user_id', $user_id)->update($update_data);
     }