'创建成功', 1 => '生成成功', 2 => '同步订单错误', 3 => '忽略/取消', 8 => '回调成功', 9 => '发货成功', 10 => '补单成功', ]; // 订单类型 0:线上充值,1:线下充值,2:客服订单 static $order_type = [ 0 => '线上充值', 1 => '线下充值', 2 => '客服订单', ]; // 离线天数 public $offline_day = 1; public function all() { // echo 111;exit; $kf_id = session('l_user_id'); $uwdb = db('user_workers'); // 客服信息 $userInfo = db('users')->alias('a')->field('a.*,b.name')->join('ws_groups b', 'b.id = a.group_id')->where('a.id', session('l_user_id'))->find(); //获取该客服拥有的支付方式 $type = db('payment_type')->where('status', 1)->select(); $payment_information = db('payment')->alias('a')->join('payment_type w', 'a.payment_type = w.id')->where(['is_use' => 1, 'a.status' => 1, 'kf_id' => session('l_user_id')])->select(); $payment_img = db('payment')->alias('a')->join('payment_type w', 'a.payment_type = w.id')->where(['is_use' => 1, 'a.status' => 1, 'kf_id' => session('l_user_id')])->find(); // 获取超过三天的离线用户 // $now_time = strtotime(date('Y-m-d', strtotime("-{$this->offline_day} day"))); // $out_line_list = db('service_log')->field('user_id id') // ->where('kf_id', $kf_id) // ->where('start_time', '<', $now_time) // ->where('end_time', '>', 0) // ->select(); // 保留离线消息的用户 // $offline_msg = $this->getOfflineMsgNew(); // foreach($out_line_list as $k =>$v) { // if (isset($offline_msg[$v['id']]) && count($offline_msg[$v['id']]) > 0) { // unset($out_line_list[$k]); // } // } // dump($out_line_list);die; // 获取 客服有效充值方式 $pay_arr = self::getPayType(session('l_user_id')); $kfInfo = db('users')->field('id,user_name,user_avatar,remaining_amount, organize_id')->where(['id' => $kf_id, 'status' => 1])->find(); if ($kfInfo['organize_id']) { $word = db('words')->where('organize_id', $kfInfo['organize_id'])->whereOr('kf_id', session('l_user_id'))->select(); } else { $word = db('words')->whereOr('kf_id', session('l_user_id'))->select(); } //当前客服工作者 $worker = $this->checkWorkStatus(); $worker['name'] = $worker['name'] ?? ''; $this->assign([ 'word' => $word, 'uinfo' => $userInfo, 'groups' => db('groups')->where('status', 1)->select(), 'status' => db('kf_config')->where('id', 1)->find(), 'token' => session('kf_token'), 'type' => $type, 'payment_information' => $payment_information, 'payment_img' => $payment_img, 'pay_types' => $pay_arr, 'amount' => $kfInfo['remaining_amount'], 'out_line_list' => json_encode([]), 'worker' => $worker, ]); return $this->fetch('index/all'); } public function index() { // 客服信息 $userInfo = db('users')->where('id', session('l_user_id'))->find(); $type = db('payment_type')->where('status', 1)->select(); $payment_information = db('payment')->alias('a')->join('payment_type w', 'a.payment_type = w.id')->where(['is_use' => 1, 'a.status' => 1, 'kf_id' => session('l_user_id')])->select(); $payment_img = db('payment')->alias('a')->join('payment_type w', 'a.payment_type = w.id')->where(['is_use' => 1, 'a.status' => 1, 'kf_id' => session('l_user_id')])->find(); // dump($payment_information);die; $google_secret = $userInfo['google_secret']; unset($userInfo['google_secret']); $this->assign([ 'word' => db('words')->where('kf_id', null)->whereOr('kf_id', session('l_user_id'))->select(), 'uinfo' => $userInfo, 'groups' => db('groups')->where('status', 1)->select(), 'status' => db('kf_config')->where('id', 1)->find(), 'token' => session('kf_token'), 'type' => $type, 'payment_information' => $payment_information, 'payment_img' => $payment_img, 'ga_android' => config('ga_android'), 'ga_ios' => config('ga_ios'), 'google_secret' => $google_secret ? 1 : 0, ]); return $this->fetch(); } // 获取服务用户列表 // 此方法是为了防止客服工作期间错误的刷新工作台,导致服务人员消失的问题 public function getUserList() { if (request()->isAjax()) { $keyword = input('keyword'); $ldb = db('finish_recharge'); $kfId = session('l_user_id'); // 此处只查询过去 三个小时 内的未服务完的用户 $userList = db('service_log')->field('user_id id,user_name name,user_avatar avatar,data,user_ip ip,end_time time,is_recharged') ->where('kf_id', session('l_user_id')) // ->where('start_time', '>', time() - 3600 * 24) ->where('end_time', 0) ->where(function ($query) use ($keyword) { if (!empty($keyword)) { $query->where('user_name', 'LIKE', "{$keyword}%")->whereOr('user_id', $keyword); } }) ->order('start_time', 'desc') ->select(); // 获取 离线用户发给客服的离线消息数量(即未读消息) // $offline_msg = []; // if ($userList) { // $user_id_arr = array_column($userList, 'id'); // if ($user_id_arr) { // $where = ['from_id' => ['IN', $user_id_arr], 'to_id' => 'KF' . session('l_user_id'), 'client_save' => 0]; // $offline_msg = db('offline_msg')->field('count(id) as msg_total, from_id as user_id') // ->where($where) // ->group('from_id')->select(); // if ($offline_msg) { // $offline_msg = array_column($offline_msg, null, 'user_id'); // // 将这些消息标记为已存储到前端 // db('offline_msg')->where($where)->update(['client_save' => 1]); // } // } // } $offline_msg = $this->getOfflineMsgNew(); $del_redis_key = []; foreach ($userList as $k => $v) { // 检测离线用户是否是当天和有未读消息 if (isset($offline_msg[$v['id']])) { $unrand = count($offline_msg[$v['id']]); $v['offline_msg'] = $offline_msg[$v['id']]; array_push($del_redis_key, $v['id']); } else { $unrand = 0; $v['offline_msg'] = []; } // $v['qrcode'] = qrCode(); $v['qrcode'] = ''; $v['unread'] = $unrand; // 是否是充值用户 // $check_pay = $ldb->where(['uid' => $v['id'], 'kf_id' => $kfId])->find(); // $v['is_pay_user'] = !empty($check_pay) ? true : false; $v['is_pay_user'] = $v['is_recharged'] == 1 ? true : false; $userList[$k] = $v; } if ($del_redis_key) { $this->delOfflineMsg($del_redis_key); } return json(['code' => 1, 'data' => $userList, 'msg' => 'ok']); } } // 获取离线用户列表 // 此方法是为了防止客服工作期间错误的刷新工作台,导致服务人员消失的问题 public function getOfflineUserList() { if (request()->isAjax()) { // 分页请求 $param = input('get.'); $keyword = input('keyword'); $ldb = db('finish_recharge'); $kfId = session('l_user_id'); $sldb= db('service_log'); // $now_time = strtotime(date('Y-m-d', strtotime("-{$this->offline_day} day"))); $now_time = time() - ($this->offline_day * 24 * 60 * 60); //获取总条数 $count = $sldb ->where('kf_id', $kfId) ->where('end_time', '>', 0) ->where('end_time', '>', $now_time) ->where(function ($query) use ($keyword) { if (!empty($keyword)) { $query->where('user_name', 'LIKE', "{$keyword}%")->whereOr('user_id', $keyword); } }) ->count(); // $count=count($list); //获取每页显示的条数 $limit = $param['limit']; //获取当前页数 $page = $param['page']; //计算出从那条开始查询 $start = ($page-1)*$limit; // 此处只查询服务完的已经离线的用户 $userList = $sldb->field('user_id id,user_name name,user_avatar avatar,data,user_ip ip, end_time, is_recharged') ->where('kf_id', $kfId) ->where('end_time', '>', 0) ->where(function ($query) use ($keyword) { if (!empty($keyword)) { $query->where('user_name', 'LIKE', "{$keyword}%")->whereOr('user_id', $keyword); } }) ->limit($start, $limit) ->order('end_time', 'desc') ->select(); // 当前客服的离线消息 $offline_msg = $this->getOfflineMsgNew(); $data_list = []; $del_redis_key = []; foreach ($userList as $k => &$v) { // 检测离线用户是否是当天和有未读消息 if (isset($offline_msg[$v['id']])) { $unrand = count($offline_msg[$v['id']]); $v['offline_msg'] = $offline_msg[$v['id']]; array_push($del_redis_key, $v['id']); } else { $unrand = 0; $v['offline_msg'] = []; } // dump($offline_msg); if ($v['end_time'] < $now_time && $unrand == 0) { // unset($userList[$k]); continue; } $v['data'] = json_decode(base64_decode($v['data']), true); // $v['qrcode'] = qrCode(); $v['qrcode'] = ''; $v['unread'] = $unrand; // $userList[$k] = $v; // $check_pay = $ldb->where(['uid' => $v['id'], 'kf_id' => $kfId])->find(); $v['is_pay_user'] = $v['is_recharged'] == 1 ? true : false; $data_list[] = $v; } if ($del_redis_key) { $this->delOfflineMsg($del_redis_key); } return json(['code' => 1, 'data' => $data_list, 'count' => $count, 'total_page' => ceil($count / $limit), 'msg' => 'ok']); } } /** * 获取客服离线后的消息 */ public function getOfflineMsgNew() { $kfId = session('l_user_id'); $redis = new Redis(); $logs = $redis::instance()->hgetAll('offmsg_KF' . $kfId); if (!$logs) return []; foreach ($logs as $key => $vo) { $logs[$key] = json_decode($vo, true); foreach($logs[$key] as $k => &$v) { $v['time_line'] = date('Y-m-d H:i:s', $v['time_line']); } } // $redis::instance()->del('offmsg_KF' . $kfId); return $logs; } /** * 删除离线消息 */ public function delOfflineMsg($ids) { $kfId = session('l_user_id'); $redis = new Redis(); $del = $redis::instance()->hdel('offmsg_KF' . $kfId, ...$ids); return $del; } /** * 获取客服离线后的消息 */ public function getOfflineMsg() { if (request()->isAjax()) { $param = input('param.'); // $logs = db("offline_msg")->where(['to_id'=>'KF' . session('l_user_id')])->select(); $logs = db('offline_msg')->where(function ($query) use ($param) { $query->where('from_id', $param['uid'])->where('to_id', 'KF' . session('l_user_id')); })->order('id', 'asc')->select(); if (!empty($logs)) { db('offline_msg')->where(['to_id' => 'KF' . session('l_user_id')])->where(['from_id' => $param['uid']])->delete(); } foreach ($logs as $key => $vo) { unset($logs[$key]['id']); $logs[$key]['type'] = 'user'; $logs[$key]['time_line'] = date('Y-m-d H:i:s', $vo['time_line']); // if($vo['from_id'] == 'KF' . session('l_user_id')){ // $logs[$key]['type'] = 'mine'; // } } return json(['code' => 1, 'data' => $logs, 'msg' => '', 'total' => '']); } } // ip 定位 public function getCity() { $ip = input('param.ip'); $ip2region = new \Ip2Region(); $info = $ip2region->btreeSearch($ip); $city = explode('|', $info['region']); if (0 != $info['city_id']) { return json(['code' => 1, 'data' => $city['2'] . $city['3'] . $city['4'], 'msg' => 'ok']); } else { return json(['code' => 1, 'data' => $city['0'], 'msg' => 'ok']); } } /** * 选择支付类型先择支付账号 */ public function changeType() { $id = input('param.id'); $res = db('payment')->where('payment_type', $id)->where('kf_id', $this->kf2Num(session('l_user_id')))->select(); // $data = db('payment')->where(['payment_type'=>$id])->where('kf_id',$this->kf2Num(session('l_user_id')))->select(); if ($res) { return json(['code' => 1, 'data' => $res, 'msg' => 'ok']); } else { $res = array(['id' => 0]); return json(['code' => 1, 'data' => $res, 'msg' => 'ok']); } } /** * 选择支付账号 */ public function changeAccount() { $id = input('param.id'); $type = input('param.type'); if ($id) { $is_use['is_use'] = 1; $res = db('payment')->where('id', $id)->where('kf_id', $this->kf2Num(session('l_user_id')))->update($is_use); } else { $is_use['is_use'] = 0; $res = db('payment')->where('payment_type', $type)->where('kf_id', $this->kf2Num(session('l_user_id')))->update($is_use); } if ($res) { return json(['code' => 1, 'data' => $res, 'msg' => 'ok']); } else { return json(['code' => 0, 'data' => '', 'msg' => '更换失败,请稍后再试']); } } public function payment_information() { $kfId = session('l_user_id'); $id = input('param.id'); $res = db('payment')->alias('a')->where(['payment_type' => $id, 'is_use' => 1, 'a.status' => 1, 'kf_id' => $kfId])->join('payment_type w', 'a.payment_type = w.id')->find(); return $res; } /** * 金币充值 */ public function rechargeCoin() { return json(['code' => 0, 'data' => '', 'msg' => '暂不支持使用']); $kfId = session('l_user_id'); $kfInfo = db('users')->field('id,user_name,user_avatar,remaining_amount')->where(['id' => $kfId, 'status' => 1])->find(); if (request()->isAjax()) { if (empty($kfInfo)) { return json(['code' => 0, 'data' => '', 'msg' => '客服已被禁止使用']); } if (empty(input('id'))) { return json(['code' => 0, 'data' => '', 'msg' => '玩家id不能为空']); } if (empty(input('coin_num'))) { return json(['code' => 0, 'data' => '', 'msg' => '充值金额不能为空']); } if (empty(input('customer_way'))) { return json(['code' => 0, 'data' => '', 'msg' => '支付方式不能为空']); } if (empty(input('pay_url'))) { return json(['code' => 0, 'data' => '', 'msg' => '支付凭证不能为空']); } if ($kfInfo['remaining_amount'] < trim(input('coin_num'))) { return json(['code' => 0, 'data' => '', 'msg' => '充值失败,请确认客服剩余额度']); } $userId = input('id'); $coinNum = trim(input('coin_num')) * 100; $money = input('coin_num'); $kfInfo = db('users')->field('id,user_name,user_avatar,group_id, organize_id')->where(['id' => $kfId, 'status' => 1])->find(); if (empty($kfInfo)) { return json(['code' => 0, 'data' => '', 'msg' => '客服已被禁止使用']); } $service_log = db('service_log')->where(['user_id' => $userId, 'kf_id' => $kfId])->field('user_ip, user_id, user_name, user_avatar')->order('id desc')->find(); if (!$service_log) { return json(['code' => 0, 'data' => '', 'msg' => '该用户暂无信息记录~']); } $log_data = [ 'uid' => $service_log['user_id'], 'money' => $money, 'pay_type' => input('customer_way'), 'pay_url' => input('pay_url'), 'udata' => $service_log, ]; $param['customer_id'] = $kfId; $param['customer_name'] = $kfInfo['user_name']; $param['customer_head'] = $kfInfo['user_avatar']; $param['customer_voucher'] = input('pay_url'); $param['snid'] = $userId; $param['price'] = $coinNum; $param['customer_way'] = input('customer_way/d'); $param['ip'] = $service_log['user_ip']; // self::addRechargeLog($log_data, $kfId); // self::updateStatis($money); $api = "/power/customer_service/push_order/"; $res = callRemoteApi($api, $param); if ($res['Tag'] == 0) { $result = db('users')->where(['id' => $kfId])->setDec('remaining_amount', input('coin_num/d')); $amount_res = db('users')->where(['id' => $kfId])->setInc('recharge_amount', input('coin_num/d')); if ($result && $amount_res) { // 添加充值记录 self::addRechargeLog($log_data, $kfId, $kfInfo['organize_id']); // 更新统计数据 self::updateStatis($money, $kfInfo['group_id']); return json(['code' => 1, 'msg' => '充值成功!', 'data' => input('coin_num')]); } } return json(['code' => 0, 'data' => '', 'msg' => '充值失败!']); } // 获取 客服有效充值方式 $pay_arr = self::getPayType($kfId); $amount = $kfInfo['remaining_amount']; return $this->fetch('index/rechargeCoin', ['pay_types' => $pay_arr, 'amount' => $amount]); } /** * 添加充值记录 * @param [type] $pay_data [description] 充值数据 * @param [type] $kf_id [description] 客服id */ public function addRechargeLog($pay_data, $kf_id, $oid) { if (!is_array($pay_data) || !$pay_data || !$kf_id) return false; $rldb = db('recharge_log'); $data = [ 'kf_id' => $kf_id, 'u_id' => $pay_data['uid'], 'u_data' => json_encode($pay_data['udata']), 'money' => $pay_data['money'], 'pay_type' => $pay_data['pay_type'], 'pay_url' => $pay_data['pay_url'], 'organize_id' => $oid, 'date' => time(), 'status' => 1, ]; $save = $rldb->insert($data); return $save; } /** * 充值记录 */ public function addRechargeRecord() { $kfId = session('l_user_id'); $uwdb = db('user_workers'); $userId = input('id'); $userName = input('user_name'); $amount = trim(input('amount')); $bankUserName = trim(input('bank_user_name')); $bankNumber = trim(input('bank_number')); // 检测是否有在工作的客服 $worker = $this->checkWorkStatus(); if (empty($worker)) { return json(['code' => 0, 'msg' => '请先交接一位工作者!', 'data' => '']); } if (empty($userId)) { return json(['code' => 0, 'msg' => '用户ID不能为空!', 'data' => '']); } $kfInfo = db('users')->field('group_id')->where(['id' => $kfId, 'status' => 1])->find(); $record = db('recharge_record'); $data = [ 'kf_id' => $kfId, 'user_id' => $userId, 'user_name' => $userName, 'amount' => $amount, 'payment_type' => empty(input('payment_type')) ? '' : input('payment_type'), 'group_id' => $kfInfo['group_id'], 'bank_user_name' => $bankUserName, 'bank_number' => $bankNumber, 'worker_id' => $worker['id'], 'worker_name' => $worker['name'], 'created_time' => date('Y-m-d H:i:s'), ]; $save = $record->insert($data); if ($save) { return json(['code' => 1, 'msg' => '记录成功!', 'data' => []]); } else { return json(['code' => 0, 'msg' => '系统异常!', 'data' => []]); } } /** * 获取充值记录 */ public function getRechargeRecord() { $udb = db('users'); $kfId = session('l_user_id'); if (request()->isAjax()) { $limit = input('limit'); $offset = (input('page') - 1) * $limit; $kf_info = $udb->where('id', $kfId)->find(); $recordInfo = db('recharge_record')->where(['kf_id' => $kfId, 'group_id' => $kf_info['group_id']])->limit($offset, $limit)->order('id desc')->select(); $total = db('recharge_record')->where(['kf_id' => $kfId, 'group_id' => $kf_info['group_id']])->count(); return json(['code' => 0, 'msg' => '获取成功', 'count' => $total, 'data' => $recordInfo]); } return $this->fetch('index/rechargeRecord'); } /** * 更新统计数据 * @param [type] $ [description] * @return [type] [description] */ public static function updateStatis($money, $group) { if (empty($money)) return false; $sdb = db('service_data'); $now_time = date('Y-m-d'); $now_h = date('H'); $check = $sdb->where(['add_hour' => $now_h])->find(); $param = [ 'is_talking' => isset($check['is_talking']) ? $check['is_talking'] : 0, 'in_queue' => 0, 'online_kf' => isset($check['is_talking']) ? $check['is_talking'] : 0, 'success_in' => isset($check['success_in']) ? $check['success_in'] : 0, 'total_in' => isset($check['total_in']) ? $check['total_in'] : 0, 'order_num' => isset($check['order_num']) ? $check['order_num'] + 1 : 1, 'money_total' => isset($check['money_total']) ? $money + $check['money_total'] : 0, 'add_date' => $now_time, 'add_hour' => date('H'), 'add_minute' => date('i'), 'group_id' => $group, ]; if ($check) { $save = $sdb->where(['add_hour' => $now_h])->update($param); } else { $save = $sdb->insert($param); } // 存入redis缓存 $date = date("Ymd"); $hash_money_key = "statistics_recharge_money_day_{$date}_{$group}"; $hash_order_key = "statistics_order_day_{$date}_{$group}"; //每天零点过期 $expire_time = mktime(23, 59, 59) - time(); // 充值金额 $check_money = Cache::has($hash_money_key); if (!$check_money) { Cache::set($hash_money_key, $money, $expire_time); } else { Cache::inc($hash_money_key, $money); } // 订单 $check_order = Cache::has($hash_order_key); if (!$check_order) { Cache::set($hash_order_key, 1, $expire_time); } else { Cache::inc($hash_order_key, 1); } return $save; } /** * 获取 客服有效充值方式 * @param int $kfId 客服id * @return array */ public static function getPayType($kfId) { return db('payment')->alias('p') ->join('payment_type pt', 'p.payment_type = pt.id') ->where(['p.kf_id' => $kfId, 'p.status' => 1, 'p.is_use' => 1]) ->column('pt.type_name', 'pt.id'); } /** * 获取历史订单记录 */ public function getOrderList() { if (request()->isAjax()) { if (empty(input('kf_id')) || empty(input('kf_name'))) { return json(['code' => 0, 'data' => '', 'msg' => '缺少参数']); } // $where = []; // if(!empty(input('id'))){ // $where[] = ['id','=',input('id')]; // } // if(!empty(input('snid'))){ // $where[] = ['snid','=',input('snid')]; // } // if(!empty(input('create_time'))){ // $where[] = ['create_time','=',input('create_time')]; // } $page = empty(input('page')) ? 1 : input('page'); $limit = empty(input('limit')) ? 20 : input('limit'); $param['customer_id'] = input('kf_id'); $param['customer_name'] = input('kf_name'); $param['page'] = $page; $param['limit'] = $limit; // $param['status'] = 0; //待定 $api = "/power/customer_service/order_list"; $res = callRemoteApi($api, $param); // dump($res);return; if ($res && $res['Tag'] == 0) { return json(['code' => 0, 'msg' => '获取成功', 'count' => $res['Msg']['total'], 'data' => $res['Msg']['data']]); } else { return json(['code' => 1, 'msg' => 'error', 'count' => '', 'data' => []]); } } // 客服信息 $userInfo = db('users')->where('id', session('l_user_id'))->find(); // 支付类型 $pay_type = db('payment_type')->where(['status' => 1])->column('type_name', 'id'); $this->assign([ 'uinfo' => $userInfo, 'order_status' => json_encode(self::$order_status), 'pay_type' => json_encode($pay_type), 'order_type' => json_encode(self::$order_type), ]); return $this->fetch('index/getorderlist'); } //删除离线用户 public function delOfflineUser() { if (request()->isAjax()) { $user_id = input('user_id'); $res = db('service_log')->where('user_id', $user_id)->where('end_time', '>', 0)->delete(); if ($res) { return json(['code' => 1, 'msg' => 'ok', 'data' => $res]); } return json(['code' => 0, 'data' => '', 'msg' => '删除失败!']); } } // 获取 客服评价列表 public function getRateList() { if (request()->isAjax()) { $kfId = session('l_user_id'); $count = 0; $data = []; $list = db('kf_rate')->where(['kf_id' => $kfId])->paginate(20)->toArray(); if ($list) { $count = $list['total']; $data = $list['data']; } return json(['code' => 0, 'msg' => '获取成功', 'count' => $count, 'data' => $data]); } return $this->fetch('index/getratelist'); } /** * 标记用户为已充值用户 */ public function payUserConfrim() { if (request()->isPost()) { // $ldb = db('finish_recharge'); $sldb = db('service_log'); $kfId = session('l_user_id'); $uid = input('uid'); if ($uid === '') return resultJson(2, '参数错误'); // 检测是否已经标记 $check = $sldb->where(['user_id' => $uid, 'kf_id' => $kfId])->find(); // $check = $ldb->where(['uid' => $uid, 'kf_id' => $kfId])->find(); if ($check['is_recharged'] == 1) return resultJson(3, '用户已标记'); $save = $sldb->where(['user_id' => $uid, 'kf_id' => $kfId])->update(['is_recharged' => 1]); // $save = $ldb->insert(['uid' => $uid, 'kf_id' => $kfId, 'created_time' => date('Y-m-d H:i:s')]); if (!$save) return resultJson(0, '标记失败'); return resultJson(1, '标记成功'); } } /** * 检测客户是否充值 */ public function checkIsPayUser() { if (request()->isPost()) { $ldb = db('finish_recharge'); $kfId = session('l_user_id'); $uid = input('uid'); $check = $ldb->where(['uid' => $uid, 'kf_id' => $kfId])->find(); if ($check) return resultJson(1, '已充值'); return resultJson(0, '未充值'); } } /** * 交接工作者 */ public function changeWorker() { $uwdb = db('user_workers'); $uwldb = db('user_workers_log'); $kf_id = session('l_user_id'); // 默认支付 $list = $uwdb->where(['kf_id' => $kf_id])->select(); $day = date('Y-m-d'); foreach($list as $k => $vo) { $up = $uwldb->where(['worker_id' => $vo['id'], 'type' => 1])->where('worker_date', '>=', $day)->order('worker_date desc')->find(); $down = $uwldb->where(['worker_id' => $vo['id'], 'type' => 2])->where('worker_date', '>=', $day)->order('worker_date desc')->find(); $check = $this->checkWorkerStatus($vo['id']); $list[$k]['start_date'] = !empty($up) ? $up['worker_date'] : ''; $list[$k]['end_date'] = !empty($down) && $check == true ? $down['worker_date'] : ''; $list[$k]['money'] = !empty($down) ? $down['money'] : ''; $list[$k]['is_use'] = $this->checkWorkerStatus($vo['id']); } $this->assign([ 'list' => $list, ]); return $this->fetch('index/son/changeWorker'); } /** * 添加工作者 */ public function addWorker() { if (request()->isPost()) { $uwdb = db('user_workers'); $kf_id = session('l_user_id'); $name = input('name'); if (!$name) return resultJson(0, '参数错误'); $save = $uwdb->insert(['name' => $name, 'kf_id' => $kf_id, 'date' => date("Y-m-d H:i:s")]); if (!$save) return resultJson(0, '失败'); return resultJson(1, '成功'); } } /** * 客服工作者更改工作状态 */ public function changeWorkStatus() { if (request()->isPost()) { $uwdb = db('user_workers'); $uwldb = db('user_workers_log'); $rrdb = db('recharge_record'); $kf_id = session('l_user_id'); $id = input('id'); $type = input('type'); if (!$id || !$type) return resultJson(0, '参数错误'); // 检测工作者的状态 $is_worker = $this->checkWorkStatus(); if ($type == 1 && !empty($is_worker)) return resultJson(3, '有工作者还没有下班'); if ($type == 2 && empty($is_worker)) return resultJson(3, '还没有工作者上班'); if ($type == 2 && $is_worker['id'] != $id) return resultJson(3, '你还没有上班'); $date = date('Y-m-d H:i:s'); if($type == 2) { $up = $uwldb->where(['worker_id' => $id, 'type' => 1])->order('worker_date desc')->find(); $money = $rrdb->where('worker_id', $id)->where('created_time', '>=', $up['worker_date'])->sum('amount'); } else { $money = 0; } $worker = $uwdb->where('id', $id)->find(); $data = [ 'worker_date' => $date, 'money' => $money, 'worker_id' => $id, 'kf_id' => $kf_id, 'worker_name' => $worker['name'], 'type' => $type, ]; $save = $uwldb->insert($data); if (!$save) return resultJson(0, '失败'); return resultJson(1, '成功'); } } /** * 检测自身服状态 * @param id 客服id * des: false 上班中, true 休息中 */ public function checkWorkerStatus($id) { $uwldb = db('user_workers_log'); $up_num = $uwldb->where(['worker_id' => $id, 'type' => 1])->count(); $down_num = $uwldb->where(['worker_id' => $id, 'type' => 2])->count(); $result = ($up_num - $down_num) != 0 ? false : true; return $result; } /** * 检测全部客服状态 */ public function checkWorkStatus() { $uwdb = db('user_workers'); $kf_id = session('l_user_id'); $wlist = $uwdb->where('kf_id', $kf_id)->select(); foreach($wlist as $k => $vo) { $check = $this->checkWorkerStatus($vo['id']); if (!$check) return $vo; } return []; } /** * 获取工作记录 */ public function getWorkersLog() { $uwdb = db('user_workers_log'); $kfId = session('l_user_id'); if (request()->isAjax()) { $limit = input('limit'); $offset = (input('page') - 1) * $limit; $list = $uwdb->where(['kf_id' => $kfId])->limit($offset, $limit)->order('worker_date desc')->select(); foreach ($list as $k => $vo) { $list[$k]['type_name'] = $vo['type'] == 1 ? '上班打卡' : '下班打卡'; } $total = $uwdb->where(['kf_id' => $kfId])->count(); return json(['code' => 0, 'msg' => '获取成功', 'count' => $total, 'data' => $list]); } return $this->fetch('index/workersLog'); } /** * 检测用户是否在线 */ public function checkUserOnline() { if (request()->isAjax()) { $kf_id = session('l_user_id'); $udb = db('users'); $check = $this->isKfOnline($kf_id); return json(['code' => 1, 'msg' => '获取成功', 'online' => $check]); } } /** * 查看用户是否在线 */ private function isKfOnline($kfId) { if (is_numeric($kfId)) $kfId = 'KF' . $kfId; $redis = new Redis(); $result = $redis::instance()->hexists('kfList', $kfId); return $result; } /** * 获取离线用户删除列表 */ public function getOfflineUserDelList() { if (request()->isAjax()) { $sldb = db('service_log'); $kf_id = session('l_user_id'); $now_time = time() - ($this->offline_day * 24 * 60 * 60); $out_line_list = $sldb->field('user_id id') ->where('kf_id', $kf_id) ->where('start_time', '<', $now_time) ->where('end_time', '>', 0) ->order('end_time asc') ->limit(5000) ->select(); // 保留离线消息的用户 $offline_msg = $this->getOfflineMsgNew(); foreach($out_line_list as $k =>$v) { if (isset($offline_msg[$v['id']]) && count($offline_msg[$v['id']]) > 0) { unset($out_line_list[$k]); } } return resultJson(1, '成功', $out_line_list); } } }