526 lines
20 KiB
PHP
526 lines
20 KiB
PHP
<?php
|
|
|
|
/**
|
|
* 首页控制器
|
|
*/
|
|
|
|
namespace app\service\controller;
|
|
use think\Cache;
|
|
|
|
class Index extends Base
|
|
{
|
|
// 订单状态
|
|
static $order_status = [
|
|
0 => '创建成功',
|
|
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');
|
|
}
|
|
}
|