You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

401 lines
15 KiB
PHTML

5 years ago
<?php
namespace Admin\Controller;
/**
5 years ago
* 游戏流水聚合接口
* @author chenzhi
5 years ago
*/
class SpendCountSetController extends \Think\Controller
{
public $beginThismonth;
public $endThismonth;
public $date;
public $nowdata;
public $model;
public $usermodel;
5 years ago
public $continue=false;//单元测试,开启后可访问独立函数测试
5 years ago
public function _initialize(){
//初始化
$this->beginThismonth = mktime(0,0,0,date('m')-1,1,date('Y'));
$this->endThismonth = mktime(0,0,0,date('m'),1,date('Y'))-1;
5 years ago
$this->date = date('Y')."-".((date('m')-1) > 9 ? (date('m')-1) : "0".(date('m')-1));
$this->nowdata =time();
5 years ago
$this->model =M("spend_count",'tab_');
$this->usermodel =M("spend_user_count",'tab_');
$this->monthmodel =M("spend_month_count",'tab_');
5 years ago
$this->gamemodel =M("spend_count",'tab_');
5 years ago
}
5 years ago
/**
* 更新某月数据
5 years ago
*/
public function setMonthSpendCount()
5 years ago
{
$month = I("count_date");
if(empty($month)) die("参数错误");
$this->date = $month;
$tarry = explode('-',$month);
$this->beginThismonth=mktime(0,0,0,$tarry[1],1,$tarry[0]);
$this->endThismonth=mktime(0,0,0,$tarry[1]-0+1,1,$tarry[0])-1;
$this->reCount();
$this->setSpendCount();
5 years ago
}
/**
* 强制重新聚合
*/
public function reCount()
{
$recount = I("recount");
if(empty($recount) || $recount != 1){return ;}
# code...
//清理之前的聚合
$temp =array(
"count_date"=>$this->date
);
5 years ago
$this->gamemodel->where($temp)->delete();
$this->usermodel->where($temp)->delete();
$this->monthmodel->where($temp)->delete();
echo "重置成功执行重新生成:";
}
5 years ago
/**
* 每个月的统计接口
*/
5 years ago
public function setSpendCount()
{
set_time_limit(0);
$t1 = microtime(true);
5 years ago
//判断是否已经聚合
$countRes = M("spend_count","tab_")->field("count(*) date_count")->where("count_date = '{$this->date}'")->find()['date_count'];
$countUserRes = M("spend_user_count","tab_")->field("count(*) date_count")->where("count_date = '{$this->date}'")->find()['date_count'];
if($countRes > 0 || $countUserRes >0){
die("error:Repeated statistics,msg:{$this->date}已经聚合过");
5 years ago
}
$this->model->startTrans();
$this->usermodel->startTrans();
5 years ago
$this->continue =true;
//执行游戏表统计
$this->setGameCount();
5 years ago
// //执行用户表统计
5 years ago
$this->setUserCount();
5 years ago
// //执行月份统计
5 years ago
$this->setMonthCount();
//执行
5 years ago
$this->model->commit();
$this->usermodel->commit();
$t2 = microtime(true);
die("success runtime:".round($t2-$t1,3).'s');
5 years ago
}
/**
* 获取游戏聚合
*/
public function setGameCount()
{
5 years ago
if(!$this->continue){
die("api error");
}
$this->getCashData();
$this->getBalanceData();
$this->getInsideData();
# code...
}
5 years ago
//获取游戏现金流水
protected function getCashData()
5 years ago
{
5 years ago
$this->createGameCount("cash_count");
5 years ago
}
//获取平台币聚合
protected function getBalanceData()
5 years ago
{
5 years ago
$this->createGameCount("balance_coin_count");
5 years ago
}
//获取绑定币充值
protected function getInsideData()
5 years ago
{
5 years ago
$this->createGameCount("inside_cash_count");
5 years ago
5 years ago
}
5 years ago
protected function createGameCount($type)
5 years ago
{
$map = array(
"pay_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)),
5 years ago
"spend.pay_status"=>1
5 years ago
);
5 years ago
5 years ago
if($type == "cash_count"){
//现金统计
$map['pay_way'] = array("GT",0);
5 years ago
}elseif($type == "balance_coin_count"){
$map['pay_way']= array("EQ",0);
}elseif($type == "inside_cash_count"){
$map['pay_way']= array("LT",0);
5 years ago
}
$field = "IFNULL(game.partner_id,0) partner_id,partner.partner partner_name,
spend.promote_id,spend.promote_account,spend.game_id,spend.game_name,sum(pay_amount) {$type},
5 years ago
IFNULL(promote.level,0) level,IFNULL(promote.chain,'/') chain,
5 years ago
'{$this->date}' as count_date,'{$this->nowdata}' as create_time";
$spendRes = M()
->table("tab_spend spend")
->field($field)
->where($map)
->join("tab_promote promote ON spend.promote_id = promote.id","left")
->join("tab_game game ON spend.game_id = game.id","left")
->join("tab_partner partner ON partner.id = game.partner_id","left")
->group('spend.promote_id,spend.game_id')
->select();
if(empty($spendRes)){
return ;
}
//集中两个表
if($type == "cash_count"){
$dbres = $this->gamemodel->addAll($spendRes);
if(!$dbres){
$this->model->rollback();
die("error");
}
}else{
for ($i=0; $i < count($spendRes); $i++) {
5 years ago
$spendRes[$i][$type] || $spendRes[$i][$type]=0;
5 years ago
# code...
$tempmap = array(
"game_id"=>$spendRes[$i]['game_id'],
"promote_id"=>$spendRes[$i]['promote_id'],
"count_date"=>$this->date
);
$dbres = $this->gamemodel->where($tempmap)->find();
5 years ago
if(empty($dbres)){
5 years ago
//不存在
$tempdbres = $this->gamemodel->add($spendRes[$i]);
if(!$tempdbres){
$this->model->rollback();
die("error");
}
}else{
5 years ago
$dbres[$type] = $dbres[$type]-0+$spendRes[$i][$type];
5 years ago
$tempdbres = $this->gamemodel->save($dbres);
5 years ago
if($tempdbres === false){
5 years ago
$this->model->rollback();
die("error");
}
}
}
}
# code...
}
5 years ago
/** --------以下为设定角色聚合---------- **/
5 years ago
/**
* 获取角色聚合
*/
public function setUserCount()
{
//获取会长信息
5 years ago
$adddata=array();
$userarr = array();
$this->getUserCountInit($adddata,$userarr);
$this->getUserInsideData($adddata,$userarr);
$this->addUserDb($adddata);
5 years ago
}
//用户聚合
5 years ago
public function getUserCountInit(&$adddata,&$userarr)
5 years ago
{
5 years ago
$gameres = $this->gamemodel->field("sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count,sum(inside_cash_count) bind_coin_count,chain,level,promote_id,promote_account")
5 years ago
->where("count_date='{$this->date}'")->group("promote_id")->select();
if(empty($gameres)){
return;
}
$count = count($gameres);
$adddata=array();
$userarr = array();
//执行
for ($i=0; $i < $count; $i++) {
$d = $gameres[$i];
if($d['level'] == 0){
$adddata[$d['promote_id']] = $d;
$userarr[] =$d['promote_id'];
}else{
//获取所有链路
$chain = trim($d['chain'],"/");
$pid = explode("/", $chain);
5 years ago
$pid[] = $d['promote_id'];//添加自己
5 years ago
for ($k=0; $k <count($pid); $k++) {
if(in_array($pid[$k], $userarr)){
//存在
5 years ago
$adddata[$pid[$k]]["cash_count"] += $d['cash_count'];
$adddata[$pid[$k]]["balance_coin_count"] += $d['balance_coin_count'];
$adddata[$pid[$k]]["bind_coin_count"] += $d['bind_coin_count'];
}else{
//不存在
//获取链路
$temp = $this->getChain($pid[$k]);
$temp['cash_count'] = $d['cash_count'];
$temp['balance_coin_count'] = $d['balance_coin_count'];
$temp['bind_coin_count'] = $d['bind_coin_count'];
$adddata[$pid[$k]] = $temp;
$userarr[] =$pid[$k];
5 years ago
}
}
}
}
}
5 years ago
//获取chain
protected function getChain($id){
return M("Promote","tab_")->field("id promote_id,account promote_account,chain,level")->where("id='".$id."'")->find();
5 years ago
}
5 years ago
//渠道角色统计仅计算推广员的平台币发放与收回
5 years ago
protected function getUserInsideData(&$adddata,&$userarr)
{
$insideRes = M()
5 years ago
->table("tab_promote_coin")
->field("*")
->where(array(
5 years ago
"create_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)),
"source_id"=>0,
5 years ago
"status"=>1
))
->select();
if(!empty($insideRes)){
for ($i=0; $i < count($insideRes); $i++) {
# code...
if($insideRes[$i]['type'] > 1){
$insideRes[$i]['num'] = ( 0- $insideRes[$i]['num']);
}
5 years ago
//获取链路
$d = $this->getChain($insideRes[$i]['promote_id']);
5 years ago
$chain = trim($d['chain'],"/");
$pid = explode("/", $chain);
$pid[] = $d['promote_id'];//添加自己
if($d['level'] == 0){
if(in_array($d["promote_id"], $userarr)){
//存在
$adddata[$pid[$k]]["inside_cash_count"] += $insideRes[$i]['num'];
}else{
$d['inside_cash_count'] = $insideRes[$i]['num'];
$adddata[$d['promote_id']] = $d;
$userarr[] =$d['promote_id'];
}
}else{
for ($k=0; $k <count($pid); $k++) {
if(in_array($pid[$k], $userarr)){
//存在
$adddata[$pid[$k]]["inside_cash_count"] += $insideRes[$i]['num'];
}else{
//不存在
//获取链路
$temp = $this->getChain($pid[$k]);
$temp['inside_cash_count'] = $insideRes[$i]['num'];
$adddata[$pid[$k]] = $temp;
$userarr[] =$pid[$k];
}
}
}
}
}
}
5 years ago
//添加用户统计表
protected function addUserDb(&$adddata){
$count = count($adddata);
if($count < 1){return;}
foreach ($adddata as $k => $v) {
isset($v["cash_count"]) || $v["cash_count"]=0;
isset($v["balance_coin_count"]) || $v["balance_coin_count"]=0;
isset($v["bind_coin_count"]) || $v["bind_coin_count"]=0;
isset($v["inside_cash_count"]) || $v["inside_cash_count"]=0;
//设定时间
$v["count_date"] = $this->date;
$v["create_time"] = $this->nowdata;
//聚合不含内充流水
$v['all_count'] = $v["cash_count"]-0+$v["balance_coin_count"]-0+$v["bind_coin_count"];
$this->usermodel->add($v);
5 years ago
}
}
5 years ago
/** --------以下为设定月份聚合---------- **/
5 years ago
/**
* @param 现金流水 cash_count 游戏中充值的现金
* @param 平台币流水 balance_coin_count 游戏中消耗的平台币
* @param 绑定币流水 bind_coin_count 游戏中绑定币的消耗
* @param 内充流水 inside_cash_count:(推广员的平台币发放-收回)+(后台发放给玩家平台币-回收平台币 + (后台发放绑币给玩家 -回收的绑币)
* @param 平台币充值 balance_coin_deposit
* @return void
*/
public function setMonthCount()
{
$initdata = $this->getMonthInit();
$balance = $this->getBalanceUser();
$bind = $this->getBindUser();
$deposit = $this->getBalanceDeposit();
5 years ago
$initdata["inside_cash_count"] = $initdata["inside_cash_count"]-0+$balance-0+$bind;
$initdata["balance_coin_deposit"] = $deposit;
$initdata["all_count"] = $initdata["inside_cash_count"]-0+$initdata["cash_count"]-0+$deposit;
$initdata["count_date"] = $this->date;
$initdata["create_time"] = $this->nowdata;
M("spend_month_count","tab_")->add($initdata);
5 years ago
# code...
}
//获取除了内充的
protected function getMonthInit()
{
$tempmap = array(
"count_date"=>$this->date,
5 years ago
"level"=>0
);
5 years ago
return M("spend_user_count","tab_")->field("sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count,sum(bind_coin_count) bind_coin_count,sum(inside_cash_count) inside_cash_count")->where($tempmap)->find();
}
//获取平台币充值流水
protected function getBalanceDeposit()
{
$map = array(
"create_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)),
"pay_status"=>1
);
$deposit = M("deposit","tab_")->field("SUM(pay_amount) pay_amount")->where($map)->find()['pay_amount'];
$deposit || $deposit=0;
return $deposit;
}
//设置 后台发放平台币给玩家 及 回收玩家 的最终值
protected function getBalanceUser()
{
$map = array(
"create_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)),
"status"=>1
);
$add = M("provide_user","tab_")->field("sum(amount) amount")->where($map)->find()['amount'];
$add || $add=0;
$jq = M("user_coin","tab_")->field("sum(num) num")->where(array(
"create_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth))
))->find()['num'];
$jq || $jq=0;
return $add-$jq;
}
//设置 后台发放绑币给玩家 及 回收玩家绑币 的最终值
protected function getBindUser()
{
$map = array(
"create_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)),
"status"=>1
);
$add = M("provide","tab_")->field("sum(amount) amount")->where($map)->find()['amount'];
$add || $add=0;
$jq = M("deduct_bind_record","tab_")->field("sum(quantity) quantity")->where(array(
"create_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth))
))->find()['quantity'];
$jq || $jq=0;
return $add-$jq;
}
5 years ago
}