'创建成功', 1 => '生成成功', 2 => '同步订单错误', 3 => '忽略/取消', 8 => '回调成功', 9 => '发货成功', 10 => '补单成功', ]; // 订单类型 0:线上充值,1:线下充值,2:客服订单 static $order_type = [ 0 => '线上充值', 1 => '线下充值', 2 => '客服订单', ]; public function all() { // echo 111;exit; $kf_id = session('l_user_id'); // 客服信息 $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('-3 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(); // 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(); } $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($out_line_list), ]); 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; $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 ]); return $this->fetch(); } // 获取服务用户列表 // 此方法是为了防止客服工作期间错误的刷新工作台,导致服务人员消失的问题 public function getUserList() { if(request()->isAjax()){ // 此处只查询过去 三个小时 内的未服务完的用户 $userList = db('service_log')->field('user_id id,user_name name,user_avatar avatar,data,user_ip ip,end_time time') ->where('kf_id', session('l_user_id')) // ->where('start_time', '>', time() - 3600 * 24) ->where('end_time', 0)->select(); foreach ($userList as $k=>$v){ $v['data'] = json_decode(base64_decode($v['data']),true); $v['qrcode'] = qrCode(); $userList[$k] = $v; } return json(['code' => 1, 'data' => $userList, 'msg' => 'ok']); } } // 获取离线用户列表 // 此方法是为了防止客服工作期间错误的刷新工作台,导致服务人员消失的问题 public function getOfflineUserList() { if(request()->isAjax()){ // 此处只查询服务完的已经离线的用户 $userList = db('service_log')->field('user_id id,user_name name,user_avatar avatar,data,user_ip ip, end_time') ->where('kf_id', session('l_user_id')) ->where('end_time','>', 0)->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]); } } } $data_list = []; foreach ($userList as $k => &$v) { // 检测离线用户是否是当天和有未读消息 $now_time = strtotime(date('Y-m-d', strtotime('-3 day'))); $unrand = $offline_msg && isset($offline_msg[$v['id']]) ? $offline_msg[$v['id']]['msg_total'] : 0; // 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['unread'] = $unrand; // $userList[$k] = $v; $data_list[] = $v; } return json(['code' => 1, 'data' => $data_list, 'msg' => 'ok']); } } /** * 获取客服离线后的消息 */ 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(){ $id = input('param.id'); $res = db('payment')->alias('a')->where(['payment_type'=>$id,'is_use'=>1])->join('payment_type w','a.payment_type = w.id')->find(); return $res; } /** * 金币充值 */ public function rechargeCoin(){ $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; } /** * 更新统计数据 * @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' => 2, ]; 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'); } }