*/ 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; } }