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