kefu/application/service/controller/bak_Index.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');
}
}