*/
class SubSpendController extends ThinkController
{
const model_name = 'Spend';
public $OpAuthList;
public function lists()
{
list($is_sub_data, $startTime, $endTime) = $this->setSelectDate();
// dump($is_sub_data);
// dump($startTime);
// dump($endTime);
// dd(1);
$map['pay_time'] = array('BETWEEN', array($startTime, $endTime));
if (isset($_REQUEST['is_check'])) {
$map['is_check'] = (int)($_REQUEST['is_check']);
}
if (isset($_REQUEST['user_account'])) {
$map['user_account'] = array('like', trim($_REQUEST['user_account']));
unset($_REQUEST['user_account']);
}
if (isset($_REQUEST['spend_ip'])) {
$map['spend_ip'] = array('like', trim($_REQUEST['spend_ip']) . '%');
unset($_REQUEST['spend_ip']);
}
if (isset($_REQUEST['game_name'])) {
if ($_REQUEST['game_name'] == '全部') {
unset($_REQUEST['game_name']);
} else {
$map['game_id'] = ['in', array_column(getGameByName($_REQUEST['game_name'], $_REQUEST['game_type']), 'id')];
unset($_REQUEST['game_name']);
}
}
if (isset($_REQUEST['game_type']) && $_REQUEST['game_type']) {
$map['sdk_version'] = $_REQUEST['game_type'];
}
if (isset($_REQUEST['server_id'])) {
$map['server_id'] = $_REQUEST['server_id'];
unset($_REQUEST['server_id']);
}
if (isset($_REQUEST['pay_order_number'])) {
$map['pay_order_number'] = array('like', trim($_REQUEST['pay_order_number']));
unset($_REQUEST['pay_order_number']);
}
if (isset($_REQUEST['extend'])) {
$map['extend'] = array('like', trim($_REQUEST['extend']));
unset($_REQUEST['extend']);
}
if (isset($_REQUEST['pay_status'])) {
$map['pay_status'] = $_REQUEST['pay_status'];
unset($_REQUEST['pay_status']);
}
if (isset($_REQUEST['pay_way'])) {
if ($_REQUEST['pay_way'] == 2) {
$map['pay_way'] = ['in', '2,3,4'];
} else {
$map['pay_way'] = $_REQUEST['pay_way'];
}
unset($_REQUEST['pay_way']);
}
if (isset($_REQUEST['pay_game_status'])) {
$map['pay_game_status'] = $_REQUEST['pay_game_status'];
unset($_REQUEST['pay_game_status']);
}
if ($_REQUEST['merchant_id']) {
$map['merchant_id'] = $_REQUEST['merchant_id'];
unset($_REQUEST['merchant_id']);
}
if (isset($_REQUEST['promote_id']) || isset($_REQUEST['company_id'])) {
$promoteId = I('promote_id',-1);
$companyId = I('company_id',-1);
if ($promoteId == 0 || $companyId == 0) {
$map['promote_id'] = 0;
} else {
if($companyId != -1){
$promoteMap['company_id'] = $companyId;
}
if($promoteId != -1){
$promoteMap['chain'] = ['like', "%/$promoteId/%"];
}
$promoteIds = M('Promote', 'tab_')->where($promoteMap)->getField('id', true);
$promoteIds[] = $promoteId;
$map['promote_id'] = ['in', $promoteIds];
}
}
if ($_REQUEST['data_order'] != '') {
$data_order = reset(explode(',', $_REQUEST['data_order']));
$data_order_type = end(explode(',', $_REQUEST['data_order']));
$this->assign('userarpu_order', $data_order);
$this->assign('userarpu_order_type', $data_order_type);
$sort = $data_order == 3 ? 'desc' : 'asc';
$order = $data_order_type . ' ' . $sort;
} else {
$order = ' pay_time desc ';
}
if (I('platform_type', 0) != 0) {
$sy = I('platform_type', 0) == 1 ? '=' : '<>';
$game_id = M("Game","tab_")->where('unique_code ' . $sy . ' ""')->getField("id",true);
$map['game_id'] = ['in',$game_id];
}
D("Spend")->addSubsiteWhere($map);
$this->meta_title = $this->m_title = '游戏充值';
$this->assign('commonset', M('Kuaijieicon')->where(['url' => 'Spend/lists', 'status' => 1])->find());
$data = $this->getSpendList($_GET["p"], $map, $order,$is_sub_data);
if (!empty($data['data'])) {
$adminUsernameList = getAdminUsernameList(array_column($data['data'], 'market_admin_id'));
foreach ($data['data'] as $key=>&$value) {
($value['promote_account']=='官方渠道')?($value['promote_account']=C('OFFICIEL_CHANNEL')):'';
$value['market_admin_username'] = $adminUsernameList[$value['market_admin_id']] ?? '无';
$value['is_check_str'] = D(self::model_name)::IsCheckStr[$value['is_check']];
//拆分游戏名称和设备类型
$game_arr = explode("(", rtrim($value['game_name'], ")"));
$value['game_name'] = $game_arr[0];
$value['sdk_version_name'] = $game_arr[1];
}
}
$promoteCompany = M('promote_company','tab_')->field('id, company_name as name')->where(['status' => 1])->select();
array_unshift($promoteCompany,['id'=>0,'name'=>C('OFFICIEL_CHANNEL')]);
$this->assign('promoteCompany', $promoteCompany);
$this->assign('showMarketAdmin', session('user_auth')['show_market_admin']);
$this->assign('showPromote', session('user_auth')['show_promote']);
$this->assign('isMarketAdmin', $isMarketAdmin);
$this->assign('marketAdmins', getMarketAdmins());
$this->assign('list_data', $data['data']);
$this->assign('_page', $data['page']);
$show_data_power = (is_administrator()|| session('user_auth')['show_data']);
$this->assign('show_data_power', $show_data_power);
if(!IS_ROOT){
$this->OpAuthList= getModuleControllerAuth();
}
$this->assign('menubtn',$this->menuAuth($is_sub_data));
$this->display();
}
public function exportList()
{
$xlsName = $_REQUEST['xlsname'];
$startDate = empty($_REQUEST['timestart']) ? date('Y-m-d', strtotime('-6 day', time())) : $_REQUEST['timestart'];
$endDate = empty($_REQUEST['timeend']) ? date('Y-m-d') : $_REQUEST['timeend'];
$startTime = strtotime($startDate);
$endTime = strtotime($endDate) + 86399;
$map['pay_time'] = array('BETWEEN', array($startTime, $endTime));
$is_sub_data = I("issubdata",0);
if($is_sub_data == 1){
$SpendModel = M("spend","tab_",SUBSITE_DB);
}else{
$SpendModel = M("spend","tab_");
}
unset($_REQUEST['timestart']);
unset($_REQUEST['timeend']);
if (isset($_REQUEST['user_account'])) {
$map['user_account'] = array('like', trim($_REQUEST['user_account']));
unset($_REQUEST['user_account']);
}
if (isset($_REQUEST['spend_ip'])) {
$map['spend_ip'] = array('like', trim($_REQUEST['spend_ip']) . '%');
unset($_REQUEST['spend_ip']);
}
if (isset($_REQUEST['game_name'])) {
if ($_REQUEST['game_name'] == '全部') {
unset($_REQUEST['game_name']);
} else {
$map['game_id'] = ['in', array_column(getGameByName($_REQUEST['game_name'], $_REQUEST['game_type']), 'id')];
unset($_REQUEST['game_name']);
}
}
if (isset($_REQUEST['game_type']) && $_REQUEST['game_type']) {
$map['sdk_version'] = $_REQUEST['game_type'];
}
if (isset($_REQUEST['server_id'])) {
$map['server_id'] = $_REQUEST['server_id'];
unset($_REQUEST['server_id']);
}
if (isset($_REQUEST['pay_order_number'])) {
$map['pay_order_number'] = array('like', trim($_REQUEST['pay_order_number']));
unset($_REQUEST['pay_order_number']);
}
if (isset($_REQUEST['extend'])) {
$map['extend'] = array('like', trim($_REQUEST['extend']));
unset($_REQUEST['extend']);
}
if (isset($_REQUEST['pay_status'])) {
$map['pay_status'] = $_REQUEST['pay_status'];
unset($_REQUEST['pay_status']);
}
if (isset($_REQUEST['pay_way'])) {
if ($_REQUEST['pay_way'] == 2) {
$map['pay_way'] = ['in', '2,3,4'];
} else {
$map['pay_way'] = $_REQUEST['pay_way'];
}
unset($_REQUEST['pay_way']);
}
if (isset($_REQUEST['is_check'])) {
$map['is_check'] = (int)($_REQUEST['is_check']);
unset($_REQUEST['is_check']);
}
if ($_REQUEST['merchant_id']) {
$map['merchant_id'] = $_REQUEST['merchant_id'];
unset($_REQUEST['merchant_id']);
}
if (isset($_REQUEST['pay_game_status'])) {
$map['pay_game_status'] = $_REQUEST['pay_game_status'];
unset($_REQUEST['pay_game_status']);
}
if (isset($_REQUEST['promote_id']) || isset($_REQUEST['company_id'])) {
$promoteId = I('promote_id',-1);
$companyId = I('company_id',-1);
if ($promoteId == 0 || $companyId == 0) {
$map['promote_id'] = 0;
} else {
if($companyId != -1){
$promoteMap['company_id'] = $companyId;
}
if($promoteId != -1){
$promoteMap['chain'] = ['like', "%/$promoteId/%"];
}
$promoteIds = M('Promote', 'tab_')->where($promoteMap)->getField('id', true);
$promoteIds[] = $promoteId;
$map['promote_id'] = ['in', $promoteIds];
}
}
if ($_REQUEST['data_order'] != '') {
$data_order = reset(explode(',', $_REQUEST['data_order']));
$data_order_type = end(explode(',', $_REQUEST['data_order']));
$this->assign('userarpu_order', $data_order);
$this->assign('userarpu_order_type', $data_order_type);
$sort = $data_order == 3 ? 'desc' : 'asc';
$order = $data_order_type . ' ' . $sort;
} else {
$order = ' pay_time desc ';
}
if (I('platform_type', 0) != 0) {
$sy = I('platform_type', 0) == 1 ? '=' : '<>';
$game_id = M("Game","tab_")->where('unique_code ' . $sy . ' ""')->getField("id",true);
$map['game_id'] = ['in',$game_id];
}
// if (intval(($endTime + 1) - $startTime) / (24 * 3600) <= 31) {
// $map1 = $map;
// $map1['pay_status'] = 1;
// } else {
// $map = '1 = 2';
// $map1 = $map;
// }
D("Spend")->addSubsiteWhere($map);
$map1 = $map;
$map1['pay_status'] = 1;
$total = $SpendModel->where($map1)->sum('pay_amount');
// var_dump($total);die();
$total=$total?$total:0;
$headers = [
'pay_order_number' => '支付订单号',
'extend' => 'CP订单号',
'pay_time' => '充值时间',
'payed_time' => '支付时间',
'user_account' => '玩家账号',
'game_name' => '游戏名称',
'sdk_version' => '设备类型',
'game_id' => '所属CP',
'promote_account' => L('Subordinate_channel'),
'0 as company_name' => '所属推广公司',
'market_admin_id' => '所属市场专员',
'merchant_id' => '所属商户',
'spend_ip' => '充值ip',
'server_id' => '区服ID',
'server_name' => '游戏区服',
'game_player_id' => '角色ID',
'game_player_name' => '角色名称',
'cost' => '订单金额',
'pay_amount' => '实付金额',
'pay_way' => '充值方式',
'pay_status' => L('Order_status'),
'pay_game_status' => '游戏通知状态',
'is_check' => '是否参与结算',
'promote_id' => "消费"."{$total}",
];
$xlsCell = array_values($headers);
$fields = array_keys($headers);
// ----获取游戏的基本信息begin
//获取游戏公司
$cpCompanyDb = M("partner","tab_")->field("id,partner")->order("id asc")->select();
$cpCompany = [];
foreach ($cpCompanyDb as $index => $cp) {
$cpCompany[$cp['id']]=$cp['partner'];
}
unset($cpCompanyDb);
//获取所有游戏
$gameDb = M("Game","tab_")->field("id,relation_game_name,partner_id")->order("id asc")->select();
$gameInfo = [];
foreach ($gameDb as $index => $g) {
$partner_name = $cpCompany[$g['partner_id']];
$g['partner_name'] = $partner_name;
$gameInfo[$g['id']]=$g;
}
unset($cpCompany);
unset($gameDb);
// ----获取游戏的基本信息end
$csvFileName = $xlsName.'.csv';
//设置好告诉浏览器要下载excel文件的headers
header('Content-Description: File Transfer');
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'. $csvFileName .'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
$fp = fopen('php://output', 'a');//打开output流
mb_convert_variables('GBK', 'UTF-8', $xlsCell);
fputcsv($fp, $xlsCell);//将数据格式化为CSV格式并写入到output流中
$accessNum = $SpendModel
->where($map)
->count();
$perSize = 10000;//每次查询的条数
$pages = ceil($accessNum / $perSize);
// var_dump($count);die();
for($i = 1; $i <= $pages; $i++) {
$xlsData = $SpendModel
->field($fields)
->where($map)
->limit(($i-1)*$perSize ,$perSize)
->order($order ? $order : 'pay_time desc')
->select();
if ($showMarketAdmin == 1) {
$adminUsernameList = getAdminUsernameList(array_column($xlsData, 'market_admin_id'));
}
$promoters = D('Promote')->where(['id'=>['in', array_unique(array_column($xlsData, 'promote_id'))]])->field('id, company_id')->select();
$promoters = $promoters ? array_column($promoters, 'company_id', 'id') : [];
$companys = $promoters ? M('promote_company', 'tab_')->where(['id'=>['in', array_unique(array_values($promoters))]])->field('id, company_name')->select() : [];
$companys = $companys ? array_column($companys, 'company_name', 'id') : [];
foreach($xlsData as $value) {
//游戏信息匹配
$thisGameInfo = $gameInfo[$value["game_id"]];
$value['game_name'] =$thisGameInfo['relation_game_name'];
$value['sdk_version'] = $value['sdk_version'] == 1 ? "安卓" : "苹果";
$value['game_id'] = $thisGameInfo['partner_name'];
$value['is_check'] = D("Spend")::IsCheckStr[$value['is_check']];
$value['company_name'] = $promoters[$value['promote_id']] == 0 ? C('OFFICIEL_CHANNEL') : ($companys[$promoters[$value['promote_id']]] ?? '');
unset($value['promote_id']);
$value['pay_time'] = date('Y-m-d H:i:s',$value['pay_time']);
if($value['pay_status'] == 1) {
$value['payed_time'] = date('Y-m-d H:i:s',$value['payed_time']);
}else {
$value['payed_time'] = "------";
}
$value['merchant_id'] = getMerchantName($value['merchant_id']);
checkEncryptionAuth($value['user_account'],'spend_lists');
($value['promote_account']=='官方渠道'||$value['promote_account']=='自然注册')?($value['promote_account']=C('OFFICIEL_CHANNEL')):'';
$value['extend'] = $value['extend'].'`';
$value['pay_way'] = get_pay_way($value['pay_way']);
$value['pay_status'] = get_info_status($value['pay_status'],9);
$value['pay_game_status'] = get_info_status($value['pay_game_status'],14);
$value['market_admin_id'] = $adminUsernameList[$value['market_admin_id']] ?? '无';
mb_convert_variables('GBK', 'UTF-8', $value);
fputcsv($fp, $value);
}
unset($xlsData);//释放变量的内存
//刷新输出缓冲到浏览器
ob_flush();
flush();//必须同时使用 ob_flush() 和flush() 函数来刷新输出缓冲。
}
fclose($fp);
//操作日志
$GetData = $_GET;
unset($GetData['xlsname']);
addOperationLog(['op_type'=>3,'key'=>getNowDate(),'url'=>U('Spend/lists',$GetData),'menu'=>'充值-游戏订单-游戏充值-导出']);
}
protected function menuAuth($is_sub_data = false)
{
$is_can_add = D("CmdTasks")->isCanAddTask("SubSpendSet");
if($is_can_add){
$mentBtn = [
"addSubSpendSet"=>"固定订单",
"updateSubSpend"=>"重固订单"
];
}else{
$mentBtn = [];
}
if($is_sub_data){
$mentBtn['changeSubSpend'] = "订单换绑";
$mentBtn['addStatement'] = "参与结算";
$mentBtn['removeStatement'] = "移出结算";
}
$resarr = [];
foreach ($mentBtn as $k => $v) {
if(IS_ROOT){
$resarr[] = $v;
}else{
if(in_array($k,$this->OpAuthList)){
$resarr[] = $v;
}
}
}
return $resarr;
}
public function addSubSpendSet(){
if(!isset($_REQUEST['time'])) $this->error("参数错误");
$time = $_REQUEST['time'];
$params = "php ".SUBSITE_INDEX." SubSpendSet/setSubSpend/time/{$time}";
$r = D("CmdTasks")->addTask("SubSpendSet",$params);
if($r){
$this->ajaxReturn(["status"=>1,"info"=>"固化数据任务登记成功,请等待两三分钟后查看结果"]);
}else{
$this->ajaxReturn(["status"=>0,"info"=>"固化数据任务登记错误"]);
}
}
public function changeSubSpend(){
if (IS_POST) {
$this->editSubSpend();
}else{
$this->showChooseSubSpendCount();
}
}
public function updateSubSpend(){
if(!isset($_REQUEST['begin']) || !isset($_REQUEST['end'])) $this->error("参数错误");
$begin = $_REQUEST['begin'];
$end = $_REQUEST['end'];
$params = "php ".SUBSITE_INDEX." SubSpendSet/recountSubSpend/begin/{$begin}/end/{$end}";
$r = D("CmdTasks")->addTask("SubSpendSet",$params);
if($r){
$this->ajaxReturn(["status"=>1,"info"=>"重算任务登记成功,请等待两三分钟后查看结果"]);
}else{
$this->ajaxReturn(["status"=>0,"info"=>"重算任务登记错误"]);
}
}
public function addStatement()
{
if(!isset($_REQUEST['ids'])) $this->error("参数错误");
$ids = $_REQUEST['ids'];
$this->editOrderIscheck($ids,2,1);
$this->ajaxReturn(array(
'status' => 1,
"info"=>"操作成功"
));
}
public function removeStatement()
{
if(!isset($_REQUEST['ids'])) $this->error("参数错误");
$ids = $_REQUEST['ids'];
$this->editOrderIscheck($ids,1,2);
$this->ajaxReturn(array(
'status' => 1,
"info"=>"操作成功"
));
}
protected function editSubSpend(){
if(!isset($_REQUEST['ids']) || !isset($_REQUEST['company_id']) ) $this->error("参数错误");
$ids = $_REQUEST['ids'];
$company_id = $_REQUEST['company_id'];
if($company_id == 0){
$saveData = [
"promote_id"=>0,
"promote_account"=>'官方渠道',
"market_admin_id"=>0,
];
}else{
//获取会长及adminid
$promote = M("promote","tab_")->field("id,account,admin_id")->where("company_id = '{$company_id}' and level = '1' and status = '1'")->find();
$saveData = [
"promote_id"=>$promote['id'],
"promote_account"=>$promote['account'],
"market_admin_id"=>$promote['admin_id'],
];
}
$where = [
"id"=>['in',$ids]
];
M("spend","tab_",SUBSITE_DB)->where($where)->save($saveData);
$this->ajaxReturn([
'status' => 1,
"info"=>"换绑成功"
]);
}
protected function showChooseSubSpendCount(){
if(!isset($_REQUEST['ids'])) $this->error("参数错误");
$ids = $_REQUEST['ids'];
$dbres = M("spend","tab_",SUBSITE_DB)->where("id in ({$ids})")->group("promote_id")->getField("promote_id,SUM(pay_amount) pay_amount");
//获取公司
$promoteIds = implode(",",array_keys($dbres));
$company = M("promote","tab_")
->alias('p')
->where("p.id in ({$promoteIds})")
->join("tab_promote_company c on p.company_id = c.id","left")
->group("p.company_id")
->getField("company_id,group_concat(p.id) promote_ids,c.company_name");
$sendData = [
"count" => 0,
"list"=>[]
];
foreach ($company as $k => $v) {
$v['promote_ids'] = explode(",",$v['promote_ids']);
$v['pay_amount'] = 0;
foreach($v['promote_ids'] as $promote_id){
$v['pay_amount'] += ($dbres[$promote_id]-0);
unset($dbres[$promote_id]);
}
unset($v['promote_ids'],$v['company_id']);
$sendData['count'] += $v['pay_amount'];
$sendData['list'][] = $v;
}
if(count($dbres) > 0){
$office_pay_amount = 0;
foreach ($dbres as $value) {
$office_pay_amount += ($value-0);
}
$sendData['list'][]= ["company_name"=>C('OFFICIEL_CHANNEL'),"pay_amount"=>$office_pay_amount];
$sendData['count'] += $office_pay_amount;
}
//获取所有公司
$promoteCompany = M('promote_company','tab_')->field('id, company_name as name')->where(['status' => 1])->select();
array_unshift($promoteCompany,['id'=>0,'name'=>C('OFFICIEL_CHANNEL')]);
$this->assign('promoteCompany', $promoteCompany);
$this->assign('data', $sendData);
$this->assign('ids', $ids);
$this->display("showChooseSubSpendCount");
}
protected function editOrderIscheck($ids,$oldval,$newval){
$dbres = M("spend","tab_",SUBSITE_DB)->where("id in ({$ids}) and is_check = '{$oldval}'")->select();
if(empty($dbres)) return false;
$changeIds = implode(",",array_column($dbres,"id"));
//执行操作
$res = D(self::model_name)->where("id in ({$changeIds}) and is_check = '{$oldval}'")->save(['is_check'=>$newval]);
if(empty($res)) return false;
//日志
if($newval == 1){
$op_name = "加入结算";
$key = "addStatement";
}else{
$op_name = "移出结算";
$key = "removeStatement";
}
addOperationLog(['op_type'=>1,'key'=>$key,"op_name"=>$op_name,"content"=>json_encode(["ids"=>$_REQUEST['ids'],"is_check"=>$newval])]);
return true;
}
protected function setSelectDate()
{
$startDate = empty($_REQUEST['timestart']) ? date('Y-m-d', strtotime('-6 day', time())) : $_REQUEST['timestart'];
$endDate = empty($_REQUEST['timeend']) ? date('Y-m-d') : $_REQUEST['timeend'];
unset($_REQUEST['timestart']);
unset($_REQUEST['timeend']);
$startTime = strtotime($startDate);
$endTime = strtotime($endDate) + 86399;
$is_sub_data = false;
$lastSynTime = M("Kv","sub_",SUBSITE_DB)->where("`key` = 'sub_spend_syn_time'")->getField("value");
if($lastSynTime >= $startTime && $lastSynTime < $endTime){
$this->redirect(ACTION_NAME, array('timestart' => $startDate,"timeend"=>date('Y-m-d',$lastSynTime)));
}
if($lastSynTime >= $startTime && $lastSynTime <= $endTime){
$is_sub_data = true;
$endTime = $lastSynTime;
}
if($lastSynTime > $endTime){
$is_sub_data = true;
}
$this->assign('startDate', date('Y-m-d',$startTime));
$this->assign('endDate', date('Y-m-d',$endTime));
$this->assign('isSubData', $is_sub_data ? 1 : 0);
$this->assign('lastSynTime', date('Y-m-d',$lastSynTime));
return [$is_sub_data,$startTime,$endTime];
}
protected function getSpendList($p = 1, $map = array(), $order, $is_sub_data)
{
$page = intval($p);
$page = $page ? $page : 1; //默认显示第一页数据
if (isset($_REQUEST['row'])) {
$row = $_REQUEST['row'];
} else {
$row = 10;
}
if($is_sub_data){
$SpendModel = M("spend","tab_",SUBSITE_DB);
}else{
$SpendModel = M("spend","tab_");
}
$list = $SpendModel
->where($map)
->page($page, $row)
->order($order ? $order : 'pay_time desc')
->select();
$count = $SpendModel->where($map)->count();
if($count < 20000){
$page = set_pagination_all($count, $row);
}else{
$page = set_pagination($count, $row);
}
$data['data'] = $list;
if ($page) {
$data['page'] = $page;
}
$total = null_to_0($SpendModel->where($map)->where("pay_status = 1")->sum('pay_amount'));
$this->assign('total', $total);
return $data;
}
}