beginThismonth = mktime(0,0,0,date('m')-1,1,date('Y')); $this->endThismonth = mktime(0,0,0,date('m'),1,date('Y'))-1; $this->date = date('Y')."-".((date('m')-1) > 9 ? (date('m')-1) : "0".(date('m')-1)); $this->nowdata =time(); $this->model =M("spend_count",'tab_'); $this->usermodel =M("spend_user_count",'tab_'); $this->monthmodel =M("spend_month_count",'tab_'); } /** * TODO:仅供测试,测试结束后删除 * 更新某月数据 */ public function setMonthSpendCount() { $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(); } /** * 强制重新聚合 */ public function reCount() { $recount = I("recount"); if(empty($recount) || $recount != 1){return ;} # code... //清理之前的聚合 $temp =array( "count_date"=>$this->date ); $this->model->where($temp)->delete(); $this->usermodel->where($temp)->delete(); $this->monthmodel->where($temp)->delete(); echo "重置成功执行重新生成:"; } /** * 每个月的统计接口 */ public function setSpendCount() { set_time_limit(0); $t1 = microtime(true); //判断是否已经聚合 $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}已经聚合过"); } $this->model->startTrans(); $this->usermodel->startTrans(); $this->continue =true; //执行游戏表统计 $this->setGameCount(); //执行用户表统计 $this->setUserCount(); //执行月份统计 $this->setMonthCount(); //执行 $this->model->commit(); $this->usermodel->commit(); $t2 = microtime(true); die("success runtime:".round($t2-$t1,3).'s'); } /** * 获取游戏聚合 */ public function setGameCount() { $this->getCashData(); $this->getBalanceData(); $this->getInsideData(); $this->getRoot(); # code... } //获取游戏现金流水 protected function getCashData() { if(!$this->continue){ die("api error"); } $map = array( "pay_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)), "spend.pay_status"=>1, "pay_way"=>array("GT",0) ); $field = "IFNULL(game.partner_id,0) partner_id,partner.partner partner_name, spend.promote_id,spend.promote_account,spend.game_id,spend.game_name, IFNULL(promote.parent_id,0) parent_id,promote.parent_name,sum(pay_amount) cash_count, '{$this->date}' as count_date,'{$this->nowdata}' as create_time"; //获取现金 $cashRes = 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($cashRes)){ $dbres = $this->model->addAll($cashRes); if(!$dbres){ $this->model->rollback(); die("error"); } } # code... } //获取平台币聚合 protected function getBalanceData() { if(!$this->continue){ die("api error"); } $map = array( "pay_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)), "spend.pay_status"=>1, "pay_way"=> array("EQ",0) ); $field = "IFNULL(game.partner_id,0) partner_id,partner.partner partner_name, spend.promote_id,spend.promote_account,spend.game_id,spend.game_name, IFNULL(promote.parent_id,0) parent_id,promote.parent_name,sum(pay_amount) balance_coin_count, '{$this->date}' as count_date,'{$this->nowdata}' as create_time"; $balanceRes = 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($balanceRes)){ for ($i=0; $i < count($balanceRes); $i++) { # code... $tempmap = array( "game_id"=>$balanceRes[$i]['game_id'], "promote_id"=>$balanceRes[$i]['promote_id'], "count_date"=>$this->date ); $dbres = $this->model->where($tempmap)->find(); if(!$dbres){ //不存在 $tempdbres = $this->model->add($balanceRes[$i]); if(!$tempdbres){ $this->model->rollback(); die("error"); } }else{ $dbres["balance_coin_count"] = $balanceRes[$i]['balance_coin_count']; $tempdbres = $this->model->save($dbres); if(!$tempdbres){ $this->model->rollback(); die("error"); } } } } # code... } //获取绑定币充值 protected function getInsideData() { if(!$this->continue){ die("api error"); } $map = array( "pay_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)), "spend.pay_status"=>1, "pay_way"=> array("LT",0) ); $field = "IFNULL(game.partner_id,0) partner_id,partner.partner partner_name, spend.promote_id,spend.promote_account,spend.game_id,spend.game_name, IFNULL(promote.parent_id,0) parent_id,promote.parent_name,sum(pay_amount) inside_cash_count, '{$this->date}' as count_date,'{$this->nowdata}' as create_time"; $balanceRes = 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($balanceRes)){ for ($i=0; $i < count($balanceRes); $i++) { # code... $tempmap = array( "game_id"=>$balanceRes[$i]['game_id'], "promote_id"=>$balanceRes[$i]['promote_id'], "count_date"=>$this->date ); $dbres = $this->model->where($tempmap)->find(); if(!$dbres){ //不存在 $tempdbres = $this->model->add($balanceRes[$i]); if(!$tempdbres){ $this->model->rollback(); die("error"); } }else{ $dbres["inside_cash_count"] = $balanceRes[$i]['inside_cash_count']; $tempdbres = $this->model->save($dbres); if(!$tempdbres){ $this->model->rollback(); die("error"); } } } } } protected function getRoot() { if(!$this->continue){ die("api error"); } $map = array( "parent_id"=>array("GT",0), "count_date"=>$this->date ); $user = $this->model->field("parent_id,promote_id")->where($map)->group("promote_id")->select(); $Promote=M("promote","tab_"); for ($i=0; $i < count($user); $i++) { # code... $map['id']=$user[$i]['parent_id']; $root=$Promote->field('IFNULL(parent_id,0) root_id,parent_name root_name')->where($map)->find(); if(!$root){ $root['root_id']=0; $root['root_name']='官方渠道'; } //保存 $where = array( "promote_id"=>$user[$i]['promote_id'], "count_date"=>$this->date ); $tempdbres = $this->model->where($where)->save($root); if(!$tempdbres){ $this->model->rollback(); die("setRoot error"); } } } /** --------以下为设定角色聚合---------- **/ /** * 获取角色聚合 */ public function setUserCount() { //获取会长信息 $this->getRootUser(); $this->getParentUser(); $this->getPromoteUser(); $this->getUserInsideData(); } //获取会长信息 protected function getRootUser() { if(!$this->continue) die("api error"); //获取所有数据 $month = $this->date; $from = " ( SELECT root_id,root_name,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count FROM tab_spend_count WHERE root_id > 0 and count_date='{$month}' group by root_id UNION ALL SELECT promote_id,promote_account,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count FROM tab_spend_count WHERE parent_id = 0 and count_date='{$month}' group by promote_id UNION ALL SELECT parent_id,parent_name,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count FROM tab_spend_count WHERE parent_id > 0 and root_id = 0 and count_date='{$month}' group by parent_id ) "; $subQueryAll = M()->table($from." a") ->field('root_id,root_name,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count') ->group("a.root_id") // ->having("cash_count > 0 OR balance_coin_count > 0") ->select(); for ($i=0; $i$subQueryAll[$i]['root_id'], "promote_account"=>$subQueryAll[$i]['root_name'], "parent_id"=>0, "parent_name"=>'官方渠道', "root_id"=>0, "root_name"=>'官方渠道', "cash_count"=>$subQueryAll[$i]['cash_count'], "balance_coin_count"=>$subQueryAll[$i]['balance_coin_count'], "all_count"=>$subQueryAll[$i]['cash_count']-0+$subQueryAll[$i]['balance_coin_count'], "count_date"=>$this->date, "create_time"=>$this->nowdata ); $tempdbres = $this->usermodel->add($adddata); if(!$tempdbres){ $this->usermodel->rollback(); die("getRootUser error"); } } } //获取组长信息 protected function getParentUser() { if(!$this->continue) die("api error"); $month =$this->date; //获取数据 $from = " ( SELECT parent_id,parent_name,root_id,root_name,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count FROM tab_spend_count WHERE root_id > 0 and count_date='{$month}' group by parent_id UNION SELECT promote_id,promote_account,parent_id,parent_name,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count FROM tab_spend_count WHERE parent_id >0 and root_id = 0 and count_date='{$month}' group by promote_id ) "; $subQueryAll = M()->table($from." a") ->field('parent_id,parent_name,root_id,root_name,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count') ->group("a.parent_id") // ->having("cash_count > 0 or balance_coin_count > 0 ") ->select(); for ($i=0; $i$subQueryAll[$i]['parent_id'], "promote_account"=>$subQueryAll[$i]['parent_name'], "parent_id"=>$subQueryAll[$i]['root_id'], "parent_name"=>$subQueryAll[$i]['root_name'], "root_id"=>0, "root_name"=>'官方渠道', "cash_count"=>$subQueryAll[$i]['cash_count'], "balance_coin_count"=>$subQueryAll[$i]['balance_coin_count'], "all_count"=>$subQueryAll[$i]['cash_count']-0+$subQueryAll[$i]['balance_coin_count'], "count_date"=>$this->date, "create_time"=>$this->nowdata ); $tempdbres = $this->usermodel->add($adddata); if(!$tempdbres){ $this->usermodel->rollback(); die("getParentUser error"); } } } //获取组员 protected function getPromoteUser() { if(!$this->continue) die("api error"); $month = $this->date;; //获取数据 $from = " ( SELECT promote_id,promote_account,parent_id,parent_name,root_id,root_name,sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count FROM tab_spend_count WHERE parent_id > 0 and root_id > 0 and count_date='{$month}' group by promote_id ) "; $subQueryAll = M()->table($from." a") ->field('*') ->group("a.promote_id") // ->having("cash_count > 0 or balance_coin_count > 0") ->select(); for ($i=0; $i$subQueryAll[$i]['promote_id'], "promote_account"=>$subQueryAll[$i]['promote_account'], "parent_id"=>$subQueryAll[$i]['parent_id'], "parent_name"=>$subQueryAll[$i]['parent_name'], "root_id"=>$subQueryAll[$i]['root_id'], "root_name"=>$subQueryAll[$i]['root_name'], "cash_count"=>$subQueryAll[$i]['cash_count'], "balance_coin_count"=>$subQueryAll[$i]['balance_coin_count'], "all_count"=>$subQueryAll[$i]['cash_count']-0+$subQueryAll[$i]['balance_coin_count'], "count_date"=>$this->date, "create_time"=>$this->nowdata ); $tempdbres = $this->usermodel->add($adddata); if(!$tempdbres){ $this->usermodel->rollback(); die("getPromoteUser error"); } } # code... } //渠道角色统计仅计算推广员的平台币发放与收回 protected function getUserInsideData() { // if(!$this->continue) die("api error"); //获取发送给推广员的数据 $insideRes = M() ->table("tab_promote_coin") ->field("*") ->where(array( "create_time"=> array('BETWEEN',array($this->beginThismonth, $this->endThismonth)), "source_id"=>0, "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']); } $this->createUserCount($insideRes[$i]['promote_id'],$insideRes[$i]['num']); } } } //建立user表空数据 protected function createUserCount($promote_id,$inside_cash_count) { $promote = M("Promote","tab_")->field("id,account,parent_id,parent_name,grand_id,grand_account")->where("id='".$promote_id."'")->find(); if(empty($promote)){ return false; } $temprootarr=array( "parent_id"=>0, "root_id"=>0, "inside_cash_count"=>$inside_cash_count, "all_count"=>$inside_cash_count, "count_date"=>$this->date, "create_time"=>$this->nowdata ); $tempparentarr=array( "root_id"=>0, "inside_cash_count"=>$inside_cash_count, "all_count"=>$inside_cash_count, "count_date"=>$this->date, "create_time"=>$this->nowdata ); $temppromotearr=array( "inside_cash_count"=>$inside_cash_count, "all_count"=>$inside_cash_count, "count_date"=>$this->date, "create_time"=>$this->nowdata ); if($promote["parent_id"] == 0){ //会长 $dbres = M("spend_user_count","tab_")->where(array( "promote_id"=>$promote["id"], "count_date"=>$this->date ))->find(); if(empty($dbres)){ $temprootarr["promote_id"]= $promote['id']; $temprootarr["promote_account"]= $promote['account']; $this->usermodel->add($temprootarr); }else{ //叠加 $this->setInsideCount($promote['id'],$inside_cash_count); } }elseif($promote["parent_id"] > 0 && $promote["grand_id"] == 0){ //是组长 //添加会长 $dbres = M("spend_user_count","tab_")->where(array( "promote_id"=>$promote["parent_id"], "count_date"=>$this->date ))->find(); if(empty($dbres)){ $temprootarr["promote_id"]= $promote['parent_id']; $temprootarr["promote_account"]= $promote['parent_name']; $this->usermodel->add($temprootarr); }else{ //叠加 $this->setInsideCount($promote['parent_id'],$inside_cash_count); } //添加自己 $dbres = M("spend_user_count","tab_")->where(array( "promote_id"=>$promote["id"], "count_date"=>$this->date ))->find(); if(empty($dbres)){ $tempparentarr['promote_id']=$promote['id']; $tempparentarr['promote_account']=$promote['account']; $tempparentarr['parent_id']=$promote["parent_id"]; $tempparentarr['parent_name']=$promote["parent_name"]; $this->usermodel->add($tempparentarr); }else{ //叠加 $this->setInsideCount($promote['id'],$inside_cash_count); } }else{ //推广员 //添加会长 $dbres = M("spend_user_count","tab_")->where(array( "promote_id"=>$promote["grand_id"], "count_date"=>$this->date ))->find(); if(empty($dbres)){ $temprootarr["promote_id"]= $promote['grand_id']; $temprootarr["promote_account"]= $promote['grand_account']; $this->usermodel->add($temprootarr); }else{ //叠加 $this->setInsideCount($promote['grand_id'],$inside_cash_count); } //添加组长 $dbres = M("spend_user_count","tab_")->where(array( "promote_id"=>$promote["parent_id"], "count_date"=>$this->date ))->find(); if(empty($dbres)){ $tempparentarr["promote_id"]= $promote['parent_id']; $tempparentarr["promote_account"]= $promote['parent_name']; $tempparentarr['parent_id']=$promote["grand_id"]; $tempparentarr['parent_name']=$promote["grand_account"]; $this->usermodel->add($tempparentarr); }else{ //叠加 $this->setInsideCount($promote['parent_id'],$inside_cash_count); } $dbres = M("spend_user_count","tab_")->where(array( "promote_id"=>$promote["id"], "count_date"=>$this->date ))->find(); if(empty($dbres)){ $temppromotearr['promote_id']=$promote['id']; $temppromotearr['promote_account']=$promote['account']; $temppromotearr['parent_id']=$promote["parent_id"]; $temppromotearr['parent_name']=$promote["parent_name"]; $temppromotearr['root_id']=$promote['grand_id']; $temppromotearr['root_name']=$promote['grand_account']; $this->usermodel->add($temppromotearr); }else{ //叠加 $this->setInsideCount($promote['id'],$inside_cash_count); } //添加自己 } # code... } //按角色修正inside_cash_count数据 protected function setInsideCount($promote_id,$inside_cash_count) { $tempmap = array( "promote_id"=>$promote_id, "count_date"=>$this->date ); $dbres = M("spend_user_count","tab_")->where($tempmap)->find(); $savedata = array("inside_cash_count"=>$inside_cash_count-0+$dbres['inside_cash_count'],"all_count"=>$inside_cash_count-0+$dbres['all_count']); $tempdbres = $this->usermodel->where($tempmap)->save($savedata); if($tempdbres === false){ $this->usermodel->rollback(); die("setInsideCount error"); } # code... } /** --------以下为设定月份聚合---------- **/ public function setMonthCount() { $initdata = $this->getMonthInit(); $balance = $this->getBalanceUser(); $bind = $this->getBindUser(); $initdata["inside_cash_count"] = $initdata["inside_cash_count"]-0+$balance-0+$bind; $initdata["all_count"] = $initdata["inside_cash_count"]-0+$initdata["balance_coin_count"]-0+$initdata["cash_count"]; $initdata["count_date"] = $this->date; $initdata["create_time"] = $this->nowdata; M("spend_month_count","tab_")->add($initdata); # code... } //获取除了内充的 protected function getMonthInit() { $tempmap = array( "count_date"=>$this->date, "parent_id"=>0 ); return M("spend_user_count","tab_")->field("sum(cash_count) cash_count,sum(balance_coin_count) balance_coin_count,sum(inside_cash_count) inside_cash_count")->where($tempmap)->find(); } //设置 后台发放平台币给玩家 及 回收玩家 的最终值 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; } }