vali 6 yıl önce
ebeveyn
işleme
01b938d21b

+ 33 - 0
application/admin/controller/Kfonitoring.php

@@ -0,0 +1,33 @@
+<?php
+
+namespace app\admin\controller;
+
+use app\common\tools;
+use app\common\KfjkLogic;
+use app\admin\model\Users as UserModel;
+
+class Kfonitoring extends Base
+{
+
+    public function kfjiankong()
+    {
+        $kfgroup = tools::getKfGroup();
+        $return = [] ;
+
+        if (request()->isAjax()) {
+            list($groupid,$onlinestatus,$type3) = explode(',',input('get.searchText'));
+
+            $logic = new KfjkLogic();
+            $kdidsArray = $logic->getValiKF($groupid,$onlinestatus);
+            $return = $logic->getAllData($kdidsArray);
+
+            return json($return);
+        }
+        $this->assign('kfgroup',$kfgroup);
+        return $this->fetch('kfonitoring/kfjiankong');
+    }
+
+
+
+
+}

+ 24 - 0
application/admin/model/Kfonlline.php

@@ -0,0 +1,24 @@
+<?php
+namespace app\admin\model;
+
+use think\Model;
+
+/**
+ * 智能问答分组模型
+ */
+class Kfonlline extends Model
+{
+    public function getOnlineAll(){
+        $return = [] ;
+        $ret =   $this->all();
+        if ($ret){
+            $return[$ret['uid']] = $ret['uid'];
+        }
+        return $return ;
+    }
+
+    public function  user(){
+        $this->hasOne('Users','uid','id');
+    }
+
+}

+ 7 - 0
application/admin/model/Users.php

@@ -8,5 +8,12 @@ use think\Model;
  */
 class Users extends Model
 {
+    public function getByGroup($group=0){
+        if ($group){
+            return $this->where(['group_id'=>$group])->select();
+        }else{
+            return $this->all();
+        }
+    }
 
 }

+ 110 - 0
application/admin/view/kfonitoring/add.html

@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>添加公告</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__JS__/layui/css/layui.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-8">
+            <div class="ibox float-e-margins">
+                <div class="ibox-title">
+                    <h5>添加公告</h5>
+                </div>
+                <div class="ibox-content">
+                    <form class="form-horizontal m-t layui-form" id="commentForm" method="post" action="{:url('kfnotice/add')}">
+
+                        <div class="form-group">
+                            <label class="col-sm-3 control-label">内容:</label>
+                            <div class="input-group col-sm-4">
+                                <textarea name="atext" id="atext" required="true" placeholder="请输入内容" class="layui-textarea"></textarea>
+                            </div>
+                        </div>
+                        <div class="form-group">
+                            <div class="col-sm-4 col-sm-offset-6">
+                                <button class="btn btn-primary" type="submit">提交</button>
+                            </div>
+                        </div>
+                    </form>
+                </div>
+            </div>
+
+        </div>
+    </div>
+</div>
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/validate/jquery.validate.min.js"></script>
+<script src="__JS__/plugins/validate/messages_zh.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script src="__JS__/layui/layui.js"></script>
+<script src="__JS__/jquery.form.js"></script>
+<script type="text/javascript">
+
+    layui.use(['form', 'upload'], function(){
+        var form = layui.form;
+    });
+
+    var index = '';
+    function showStart(){
+        index = layer.load(0, {shade: false});
+        return true;
+    }
+
+    function showSuccess(res){
+
+        layer.ready(function(){
+            layer.close(index);
+            if(1 == res.code){
+               layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function(){
+                   window.location.href = res.data;
+               });
+            }else if(111 == res.code){
+                window.location.reload();
+            }else{
+                layer.msg(res.msg, {anim: 6});
+            }
+        });
+    }
+
+    $(document).ready(function(){
+        // 添加管理员
+        var options = {
+            beforeSubmit:showStart,
+            success:showSuccess
+        };
+
+        $('#commentForm').submit(function(){
+            $(this).ajaxSubmit(options);
+            return false;
+        });
+    });
+
+    // 表单验证
+    $.validator.setDefaults({
+        highlight: function(e) {
+            $(e).closest(".form-group").removeClass("has-success").addClass("has-error")
+        },
+        success: function(e) {
+            e.closest(".form-group").removeClass("has-error").addClass("has-success")
+        },
+        errorElement: "span",
+        errorPlacement: function(e, r) {
+            e.appendTo(r.is(":radio") || r.is(":checkbox") ? r.parent().parent().parent() : r.parent())
+        },
+        errorClass: "help-block m-b-none",
+        validClass: "help-block m-b-none"
+    });
+
+</script>
+</body>
+</html>

+ 129 - 0
application/admin/view/kfonitoring/index.html

@@ -0,0 +1,129 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>管理员列表</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <!-- Panel Other -->
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>管理员列表</h5>
+        </div>
+        <div class="ibox-content">
+            <!--搜索框开始-->
+            <form id='commentForm' role="form" method="post" class="form-inline pull-right">
+                <div class="content clearfix m-b">
+                    <div class="form-group">
+                        <label>模糊搜索内容:</label>
+                        <input type="text" class="form-control" id="username" name="user_name">
+                    </div>
+                    <div class="form-group">
+                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜 索</strong>
+                        </button>
+                    </div>
+                </div>
+            </form>
+            <!--搜索框结束-->
+            <div class="example-wrap">
+                <div class="example">
+                    <table id="cusTable">
+                        <thead>
+                        <th data-field="id">ID</th>
+                        <th data-field="uid">uid</th>
+                        <th data-field="atext">内容</th>
+                        <th data-field="ctime">发布时间</th>
+                        <th data-field="readtime">读时间</th>
+                        <th data-field="operate">操作</th>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+            <!-- End Example Pagination -->
+        </div>
+    </div>
+</div>
+<!-- End Panel Other -->
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script type="text/javascript">
+    function initTable() {
+        //先销毁表格
+        $('#cusTable').bootstrapTable('destroy');
+        //初始化表格,动态从服务器加载数据
+        $("#cusTable").bootstrapTable({
+            method: "get",  //使用get请求到服务器获取数据
+            url: "{:url('kfnotice/index')}", //获取数据的地址
+            striped: true,  //表格显示条纹
+            pagination: true, //启动分页
+            pageSize: 10,  //每页显示的记录数
+            pageNumber:1, //当前第几页
+            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            sidePagination: "server", //表示服务端请求
+            paginationFirstText: "首页",
+            paginationPreText: "上一页",
+            paginationNextText: "下一页",
+            paginationLastText: "尾页",
+            queryParamsType : "undefined",
+            queryParams: function queryParams(params) {   //设置查询参数
+                var param = {
+                    pageNumber: params.pageNumber,
+                    pageSize: params.pageSize,
+                    searchText:$('#username').val()
+                };
+                return param;
+            },
+            onLoadSuccess: function(res){  //加载成功时执行
+                if(111 == res.code){
+                    window.location.reload();
+                }
+                layer.msg("加载成功", {time : 1000});
+            },
+            onLoadError: function(){  //加载失败时执行
+                layer.msg("加载数据失败");
+            }
+        });
+    }
+
+    $(document).ready(function () {
+        //调用函数,初始化表格
+        initTable();
+
+        //当点击查询按钮的时候执行
+        $("#search").bind("click", initTable);
+    });
+
+    function Del(id) {
+        layer.confirm('确认删除记录?', {icon: 3, title: '提示'}, function (index) {
+            //do something
+            $.getJSON("{:url('kfnotice/del')}", {'id': id}, function (res) {
+                if (1 == res.code) {
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function () {
+                        initTable();
+                    });
+                } else if (111 == res.code) {
+                    window.location.reload();
+                } else {
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+    }
+</script>
+</body>
+</html>

+ 158 - 0
application/admin/view/kfonitoring/kfjiankong.html

@@ -0,0 +1,158 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+    <title>客服监控</title>
+    <link rel="shortcut icon" href="favicon.ico">
+    <link href="__CSS__/bootstrap.min.css?v=3.3.6" rel="stylesheet">
+    <link href="__CSS__/font-awesome.min.css?v=4.4.0" rel="stylesheet">
+    <link href="__CSS__/plugins/bootstrap-table/bootstrap-table.min.css" rel="stylesheet">
+    <link href="__CSS__/animate.min.css" rel="stylesheet">
+    <link href="__CSS__/style.min.css?v=4.1.0" rel="stylesheet">
+</head>
+<body class="gray-bg">
+<div class="wrapper wrapper-content animated fadeInRight">
+    <!-- Panel Other -->
+    <div class="ibox float-e-margins">
+        <div class="ibox-title">
+            <h5>客服监控</h5>
+        </div>
+        <div class="ibox-content">
+            <!--搜索框开始-->
+            <form id='commentForm' role="form" method="get" class="form-inline">
+                <div class="content clearfix m-b">
+
+                    <div class="form-group">
+                        <select name="type1" id="type1" class="form-control">
+                            <option value="0">所有分组</option>
+                            {volist name="kfgroup" id="vo" key="k" }
+                            <option value="{$k}">{$vo}</option>
+                            {/volist}
+                        </select>
+                    </div>
+
+                    <div class="form-group">
+                        <lable>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</lable>
+                        <select name="type2" id="type2" class="form-control">
+                            <option value="0">所有状态</option>
+                            <option value="1">在线状态</option>
+                            <option value="2">休息状态</option>
+                            <option value="3">隐身状态</option>
+                        </select>
+                    </div>
+
+                    <div class="form-group">
+                        <lable>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</lable>
+                        <select name="type3" id="type3" class="form-control">
+                            <option value="0">所有会话</option>
+                            <option value="1">正常会话</option>
+                            <option value="2">报警回话</option>
+                        </select>
+                    </div>
+
+                    <div class="form-group">
+                        <lable>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</lable>
+                        <button class="btn btn-primary" type="button" style="margin-top:5px" id="search"><strong>搜 索</strong>
+                        </button>
+                    </div>
+                </div>
+            </form>
+            <!--搜索框结束-->
+            <div class="example-wrap">
+                <div class="example">
+                    <table id="cusTable">
+                        <thead>
+                        <th data-field="id">客服</th>
+                        <th data-field="hhl">会话量</th>
+                        <th data-field="jdl">接待量</th>
+                        <th data-field="pjhhsc">平均会话时长</th>
+                        <th data-field="cpl">参评率</th>
+                        <th data-field="mydl">满意度率</th>
+                        <th data-field="pjxysc">平均响应时长</th>
+                        <th data-field="jrxxsc">今日休息时长</th>
+                        <th data-field="">发消息</th>
+                        </thead>
+                    </table>
+                </div>
+            </div>
+            <!-- End Example Pagination -->
+        </div>
+    </div>
+</div>
+<!-- End Panel Other -->
+<script src="__JS__/jquery.min.js?v=2.1.4"></script>
+<script src="__JS__/bootstrap.min.js?v=3.3.6"></script>
+<script src="__JS__/content.min.js?v=1.0.0"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/bootstrap-table-mobile.min.js"></script>
+<script src="__JS__/plugins/bootstrap-table/locale/bootstrap-table-zh-CN.min.js"></script>
+<script src="__JS__/plugins/layer/layer.min.js"></script>
+<script type="text/javascript">
+    function initTable() {
+        //先销毁表格
+        $('#cusTable').bootstrapTable('destroy');
+        //初始化表格,动态从服务器加载数据
+        $("#cusTable").bootstrapTable({
+            method: "get",  //使用get请求到服务器获取数据
+            url: "{:url('kfonitoring/kfjiankong')}", //获取数据的地址
+            striped: true,  //表格显示条纹
+            pagination: true, //启动分页
+            pageSize: 20,  //每页显示的记录数
+            pageNumber:1, //当前第几页
+            pageList: [5, 10, 15, 20, 25],  //记录数可选列表
+            sidePagination: "server", //表示服务端请求
+            paginationFirstText: "首页",
+            paginationPreText: "上一页",
+            paginationNextText: "下一页",
+            paginationLastText: "尾页",
+            queryParamsType : "undefined",
+            queryParams: function queryParams(params) {   //设置查询参数
+                var param = {
+                    pageNumber: params.pageNumber,
+                    pageSize: params.pageSize,
+                    searchText:$('#type1').val() + ','+ $('#type2').val()+ ',' + $('#type3').val()
+                };
+                return param;
+            },
+            onLoadSuccess: function(res){  //加载成功时执行
+                if(111 == res.code){
+                    window.location.reload();
+                }
+                layer.msg("加载成功", {time : 1000});
+            },
+            onLoadError: function(){  //加载失败时执行
+                layer.msg("加载数据失败");
+            }
+        });
+    }
+
+    $(document).ready(function () {
+        //调用函数,初始化表格
+        initTable();
+
+        //当点击查询按钮的时候执行
+        $("#search").bind("click", initTable);
+    });
+
+    function Del(id) {
+        layer.confirm('确认删除记录?', {icon: 3, title: '提示'}, function (index) {
+            //do something
+            $.getJSON("{:url('kfnotice/del')}", {'id': id}, function (res) {
+                if (1 == res.code) {
+                    layer.alert(res.msg, {title: '友情提示', icon: 1, closeBtn: 0}, function () {
+                        initTable();
+                    });
+                } else if (111 == res.code) {
+                    window.location.reload();
+                } else {
+                    layer.alert(res.msg, {title: '友情提示', icon: 2});
+                }
+            });
+
+            layer.close(index);
+        })
+    }
+</script>
+</body>
+</html>

+ 135 - 0
application/common/KfjkLogic.php

@@ -0,0 +1,135 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: Administrator
+ * Date: 2019/7/6
+ * Time: 16:59
+ */
+
+namespace App\common;
+
+use app\admin\model\Kfonlline;
+use app\admin\model\Users;
+use think\Db;
+
+
+/**
+ * [
+ * 用户名:
+ * 会话量:今日客服累计的的会话量   hyl
+ * 接待量:当前客服正在接待的会话数  jdl
+ * 平均会话时长:今日客服的平均会话时长,即访客进入到会话结束时时间间隔的平均值  pjhusc
+ * 参评率:今日客服的累计参评率,即参加评价的数量和接入会话数量的比值  cpl
+ * 满意度率:今日客服的累计满意度率,即满意的数量和评价会话数量的比值   mydl
+ * 平均响应时长:今日客服的平均响应时长,即访客访问和客服回复时间间隔的平均值。  pjxysc
+ * 今日休息时长:今日客服的休息时长的累计值   jrxxsc
+ * ]
+ */
+class KfjkLogic
+{
+
+    public function getAllData($uidarray)
+    {
+        if (empty($uidarray)) {
+            return false;
+        }
+
+        $todayall = $this->getTodayServiceData($uidarray);
+        if (!$todayall){
+            return false ;
+        }
+
+
+
+
+
+
+    }
+
+
+    public function getValiKF($groupid, $onlinestatus)
+    {
+        $groupusers = [];
+        $kfgroup = (new Users)->getByGroup($groupid);
+
+        if (!$kfgroup) {
+            return [];
+        }
+
+        foreach ($kfgroup as $val) {
+            $groupusers[] = $val['id'];
+        }
+
+        if ($onlinestatus) {
+            $m = (new Kfonlline())->getOnlineAll();
+            if (!$m) {
+                return [];
+            }
+
+            $statuukfs = [];
+            foreach ($m as $sval) {
+                if (($sval['status']) == $onlinestatus) {
+                    $statuukfs[] = $sval['uid'];
+                }
+            }
+
+            if (!$statuukfs) {
+                return [];
+            }
+            return $statuukfs;
+        }
+        return $groupusers;
+    }
+
+    public function hyl($kfuid)
+    {
+
+    }
+
+    public function jdl($kfuid)
+    {
+
+    }
+
+    public function pjhusc($kfuid)
+    {
+
+
+    }
+
+    public function cpl($kfuid)
+    {
+
+    }
+
+    public function mydl($kfuid)
+    {
+
+    }
+
+    public function pjxysc($kfuid)
+    {
+
+    }
+
+    public function jrxxsc($kfuid)
+    {
+
+    }
+
+    public function getTodayServiceData($kfuidArray = [])
+    {
+        $today_begin = strtotime(date("Y-m-d"));
+        $today_end = $today_begin + 86400;
+
+        $filds = "group_id,kf_id,user_id,status,start_time,intime,end_time,evaluate_id" ;
+        if ($kfuidArray) {
+            $ret = Db::name('service_log')->field($filds)->where(['start_time' => ['>=', $today_begin], 'kf_id' => ['IN', $kfuidArray]])->where(['start_time' => ['<', $today_end]])->select();
+        } else {
+            $ret = Db::name('service_log')->field($filds)->where(['start_time' => ['>=', $today_begin]])->where(['start_time' => ['<', $today_end]])->select();
+        }
+
+        return $ret;
+    }
+
+}

+ 31 - 0
application/common/tools.php

@@ -1,4 +1,6 @@
 <?php
+
+namespace app\common;
 /**
  * Created by PhpStorm.
  * User: Administrator
@@ -6,6 +8,8 @@
  * Time: 12:51
  */
 
+use think\Db;
+
 class tools
 {
     public static function writedebuglog($type, $data)
@@ -16,5 +20,32 @@ class tools
         Db::table('debug_log')->insert(['mtype' => $type, 'data' => $data]);
     }
 
+    public static function getKfGroup($cache = 1, $all = 0)
+    {
+        $key = md5(__FILE__ . 'getKfGroup');
+        if ($cache) {
+            $cval = cache($key);
+            if ($cval) {
+                return $cval;
+            }
+        }
+
+        $return = [];
+        if ($all) {
+            $ret = Db::name('groups')->all();
+        } else {
+            $ret = Db::name('groups')->where('status', 1)->select();
+        }
+
+        foreach ($ret as $val) {
+            $return[$val['id']] = $val['name'];
+        }
+        cache($key, $return, ['expire' => 600]);
+        return $return;
+    }
+
+
+
+
 
 }

+ 11 - 3
application/config.php

@@ -26,10 +26,18 @@ return [
     // 管理员登录时间
     'save_time' => 86400,
 
+
+    'cache' => [
+        'type' => 'File',
+        'path' => CACHE_PATH,
+        'prefix' => '',
+        'expire' => 0,
+    ],
+
     // 应用命名空间
-    'app_namespace'          => 'app',
+    'app_namespace' => 'app',
     // 应用调试模式
-    'app_debug'              => true,
+    'app_debug' => true,
     // 应用Trace
-    'app_trace'              => false
+    'app_trace' => false
 ];