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