From 5ee21eb78139dc16b8df361d6f54ab6b1d835e11 Mon Sep 17 00:00:00 2001 From: chenzhi Date: Thu, 1 Jul 2021 11:14:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MarketPerformanceSetController.class.php | 391 ++++++++++++++++++ .../Controller/TimingController.class.php | 10 +- 2 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 Application/Admin/Controller/MarketPerformanceSetController.class.php diff --git a/Application/Admin/Controller/MarketPerformanceSetController.class.php b/Application/Admin/Controller/MarketPerformanceSetController.class.php new file mode 100644 index 000000000..b1d020f0c --- /dev/null +++ b/Application/Admin/Controller/MarketPerformanceSetController.class.php @@ -0,0 +1,391 @@ +adddata = [];//置空否者会脚本进来会重复计算 + $this->date = $month; + $tarry = explode('-',$month); + $this->year= $tarry[0]; + if(strlen($tarry[1]) < 2) $tarry[1]="0".$tarry[1]; + + $this->month= $tarry[1]; + $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->settleupMarketorderModel=SM("settleup_marketorder","tab_"); + $this->reCount(); + $this->setSettleupMarketorder(); + } + /** + * 强制重新聚合 + */ + private function reCount() + { + // $this->settleupMarketorderModel->where(['pay_time'=>$this->date])->delete(); + echo "旧数据清理成功".PHP_EOL; + } + /** + * 计算公司毛利 + */ + private function setSettleupMarketorder() + { + $this->getInsideCompanyid(); + $this->getChannelRatio(); + $this->getAllDownFlowSpend(); + $this->getAllGameInfo(); + $this->getCompanyOtherInfo(); + $this->getPuStatement(); + $this->getPuSpecialStatement(); + $this->performanceSet(); + dd($this->downFlowData); + + echo "{$this->year}-{$this->month}生成成功".PHP_EOL; + } + /** + * 获取公司内部公司id + */ + private function getInsideCompanyid() + { + $res = M("PromoteCompany","tab_")->where("is_inside = 1")->field("id")->select(); + if($res){ + $res = array_column($res,"id"); + $res[] = 0; + }else{ + $res = [0]; + } + $this->inSideCompanyIds = implode(",",$res); + } + /** + * 支付服务商渠道费 + */ + private function getChannelRatio() + { + $res = M("payment_merchant","tab_")->getField("id,config",true); + foreach ($res as $k => $v) { + $config = json_decode($v,true); + if(array_key_exists("channel_rate",$config) && $config['channel_rate'] > 0){ + $res[$k] = $config['channel_rate']; + }else{ + $res[$k] = 0; + } + } + $res[0] = 0; + $this->channelRatio = $res; + unset($res); + } + + /** + * 获取所有下游公司支付信息 + */ + private function getAllDownFlowSpend() + { + $where = [ + "pay_status"=>1, + "payed_time"=>["between",[$this->beginThismonth,$this->endThismonth]], + "p.company_id"=>["NOT IN",$this->inSideCompanyIds], + "p.company_belong"=>['GT',0] + ]; + $dbres = M("Spend","tab_") + ->alias("s") + ->field("substring_index(game_name, '(', 1) relation_game_name, + SUM(pay_amount) pay_amount, + IFNULL(SUM(CASE WHEN is_refund = 1 THEN pay_amount ELSE 0 END),0) as refund_amount, + IFNULL(SUM(CASE WHEN is_check = 2 THEN pay_amount ELSE 0 END),0) as no_statement_amount, + p.company_id,p.company_belong,merchant_id") + ->join("tab_promote as p on s.promote_id = p.id") + ->where($where) + ->group("relation_game_name,company_id,merchant_id") + ->order("pay_amount desc")->select(); + foreach ($dbres as $v) { + if(array_key_exists('cp_pay_amount',$this->downFlowData[$v['company_id']][$v['relation_game_name']])){ + $this->downFlowData[$v['company_id']][$v['relation_game_name']] = [ + "cp_pay_amount"=>0, + "promote_pay_amount"=>0, + "channel_amount"=>0, + "refund_amount"=>0, + "no_statement_amount"=>0, + "special_amount"=>0, + "ratio"=>0 + ]; + } + $channel_amount = round($v['pay_amount']*$this->channelRatio[$v['merchant_id']]/100,2); + $cp_amount = $v['pay_amount']-$v['refund_amount']; + $promote_amount = $v['pay_amount']-$v['refund_amount']-$v['no_statement_amount']; + + $this->downFlowData[$v['company_id']][$v['relation_game_name']]['channel_amount'] += $channel_amount; + $this->downFlowData[$v['company_id']][$v['relation_game_name']]['cp_pay_amount'] += $cp_amount; + $this->downFlowData[$v['company_id']][$v['relation_game_name']]['promote_pay_amount'] += $promote_amount; + $this->downFlowData[$v['company_id']][$v['relation_game_name']]['refund_amount'] += $refund_amount; + $this->downFlowData[$v['company_id']][$v['relation_game_name']]['no_statement_amount'] += $v['no_statement_amount']; + } + unset($dbres); + } + /** + * 获取游戏信息及cp结算比例 + */ + private function getAllGameInfo() + { + $games=[]; + foreach ( $this->downFlowData as $key => $value) { + $games = array_merge(array_keys($value),$games); + } + $games = array_unique($games); + //获取游戏信息 + $gameRes = M("Game","tab_")->where(['relation_game_name'=>['in',$games]])->getField("relation_game_name,relation_game_id",TRUE); + foreach ($gameRes as $k => $v) { + $this->gameInfo[$k]['relation_game_id'] = $v; + $this->gameInfo[$k]['cp_ratio'] = 0; + } + $this->getCpStatement(); + } + /** + * 获取公司信息及推广员账号,市场员信息 + */ + private function getCompanyOtherInfo() + { + $companyIds = array_unique(array_keys($this->downFlowData)); + $companyRes = M("promote_company","tab_")->alias("pc") + ->join("tab_promote as p on p.company_id = pc.id") + ->join("sys_member as m on p.admin_id = m.uid") + ->where(['pc.id'=>['in',$companyIds],'p.level'=>1]) + ->group("pc.id") + ->getField("pc.id,pc.company_name,pc.uid,pc.company_belong,pc.develop_type,p.id promote_id,p.account,p.admin_id,m.real_name",TRUE); + $this->companyInfo = $companyRes; + } + + /** + * 获取下游结算比例,以最后一周的结算比例为最终比例 + */ + private function getPuStatement() + { + //1.获取下游周结结算单 + $where = [ + "_string"=>"statement_begin_time between {$this->beginThismonth} and {$this->endThismonth} OR statement_end_time between {$this->beginThismonth} and {$this->endThismonth}", + "company_type"=>2, + "withdraw_type"=>0 + ]; + $statement_pool = M("company_statement_pool","tab_")->where($where)->order("statement_begin_time desc")->select(); + //获取结算分段 + $date_arr = []; + foreach ($statement_pool as $k => $v) { + $tem = [ + "statement_begin_time"=>$v['statement_begin_time'], + "statement_end_time"=>$v['statement_end_time'], + "begin_time"=>date("Y.m.d",$v['statement_begin_time']), + "end_time"=>date("Y.m.d",$v['statement_end_time']), + "withdraw_type"=>0 + ]; + if($v['statement_begin_time'] < $this->beginThismonth){ + $tem['statement_begin_time'] = $this->beginThismonth; + $tem['begin_time'] = date("Y.m.d",$this->beginThismonth); + } + if($v['statement_end_time'] > $this->endThismonth){ + $tem['statement_end_time'] = $this->endThismonth; + $tem['end_time'] = date("Y.m.d",$this->endThismonth); + } + $this->getPuAllStatement($tem,$v); + $this->getPuCompanyStatement($tem);//对公周结 + $date_arr[] = $tem; + } + //2.获取对公的下游 + $tem = [ + "statement_begin_time"=>$this->beginThismonth, + "statement_end_time"=>$this->endThismonth, + "begin_time"=>date("Y.m.d",$this->beginThismonth), + "end_time"=>date("Y.m.d",$this->endThismonth), + "withdraw_type"=>1 + ]; + $this->getPuCompanyStatement($tem); + + } + /** + * 获取所有个人周结 + */ + private function getPuAllStatement($time,$pool){ + $id = $pool['id']; + //获取基本信息 + $infolist = M("company_statement_info","tab_")->where("pool_id = '{$id}'")->select(); + //获取母单 + if(!empty($pool['create_lack_ids'])){ + $l_ids = $pool['create_lack_ids']; + $lack_info = M("company_lack_statement_info","tab_")->where("id in ({$l_ids})")->select(); + $infolist =array_merge($infolist,$lack_info); + } + foreach ($infolist as $v) { + $sinfo = json_decode($v['statement_info'],true); + foreach ($sinfo as $va) { + foreach ($va["game_list"] as $val) { + + //奖罚不算 + if( !array_key_exists($val['game_name'],$this->gameInfo) ){ + continue; + } + //其他计算日期不算 + if( ($val['statement_begin_time'] != $time['begin_time']) && ($val['statement_end_time'] != $time['end_time']) ){ + continue; + } + if(!array_key_exists($val['game_name'],$this->downFlowData[$v['company_id']])){ + continue; + } + if(!array_key_exists("ratio",$this->downFlowData[1][$v['company_id']][$val['game_name']])){ + $this->downFlowData[$v['company_id']][$val['game_name']]["ratio"] = $val['ratio']; + } + } + } + } + } + + /** + * 对公的下游结算 + */ + private function getPuCompanyStatement($time) + { + $where = [ + "company_belong"=>["NOT IN",[0,9]], + "withdraw_type"=>$time['withdraw_type'] + ]; + if($time['recount']){ + $where['_string'] = "statement_begin_time = {$time['statement_begin_time']} OR statement_end_time = {$time['statement_end_time']}"; + }else{ + $where['statement_begin_time'] = $time['statement_begin_time']; + $where['statement_end_time'] = $time['statement_end_time']; + } + $res = M("company_statement","tab_")->where($where)->select(); + if($res){ + foreach ($res as $v) { + $sinfo = json_decode($v['statement_info'],true); + foreach ($sinfo as $val) { + //奖罚不算 + if( !array_key_exists($val['game_name'],$this->gameInfo) ){ + continue; + } + //其他计算日期不算 + if( ($val['statement_begin_time'] != $time['begin_time']) && ($val['statement_end_time'] != $time['end_time']) ){ + continue; + } + if(!array_key_exists($val['game_name'],$this->downFlowData[$v['company_id']])){ + continue; + } + if(!array_key_exists("ratio",$this->downFlowData[$v['company_id']][$val['game_name']])){ + $this->downFlowData[$v['company_id']][$val['game_name']]["ratio"] = $val['ratio']; + } + } + } + } + } + /** + * 特殊补点 + */ + private function getPuSpecialStatement() + { + $where = [ + "company_belong"=>["NOT IN",[0,9]], + "withdraw_type"=>3, + "_string"=>"statement_begin_time >= {$this->beginThismonth} and statement_end_time <= {$this->endThismonth}" + ]; + $res = M("company_statement","tab_")->where($where)->select(); + if($res){ + foreach ($res as $v) { + $sinfo = json_decode($v['statement_info'],true); + foreach ($sinfo as $va) { + foreach ($va["game_list"] as $val) { + //奖罚不算 + if( !array_key_exists($val['game_name'],$this->gameInfo) ){ + continue; + } + if( array_key_exists("special_amount",$this->downFlowData[$val['company_id']][$val['game_name']]) ){ + $this->downFlowData[$v['company_id']][$val['game_name']]["special_amount"] += $val['sum_money']; + }else{ + $this->downFlowData[$v['company_id']][$val['game_name']]["special_amount"] = $val['sum_money']; + } + + } + } + } + } + } + //获取cp结算单 + private function getCpStatement() + { + $where = [ + "company_belong"=>9, + "withdraw_type"=>1, + "statement_begin_time"=>$this->beginThismonth, + "statement_end_time"=>$this->endThismonth + ]; + $res = M("company_statement","tab_")->where($where)->select(); + if($res){ + foreach ($res as $v) { + $sinfo = json_decode($v['statement_info'],true); + foreach ($sinfo as $val) { + //获取真实游戏名 + $games = $this->cpOPName2GName($val['game_name'],$v['company_id']); + foreach ($games as $game) { + if( !array_key_exists($game,$this->gameInfo) ){ + continue; + } + if($v['pay_type'] == 1){ + $ratio = $val['first_ratio']; + }else{ + $ratio = $val['second_ratio']; + } + $this->gameInfo[$game]['cp_ratio'] = $ratio; + } + } + } + } + } + //结算包名还原游戏名 + private function cpOPName2GName($OPName,$company_id) + { + $where = [ + "partner_id"=>$company_id, + "_string"=>"original_package_name = '{$OPName}' OR relation_game_name = '{$OPName}'" + ]; + $game = M("Game","tab_")->field("relation_game_name")->where($where)->group("relation_game_name")->select(); + if($game){ + return array_column($game,"relation_game_name"); + }else{ + return [$OPName]; + } + } + /** + * 计算相应数据 + */ + private function performanceSet() + { + + + } + + +} diff --git a/Application/Admin/Controller/TimingController.class.php b/Application/Admin/Controller/TimingController.class.php index d167bf035..6d40c92a0 100644 --- a/Application/Admin/Controller/TimingController.class.php +++ b/Application/Admin/Controller/TimingController.class.php @@ -836,9 +836,16 @@ class TimingController extends AdminController { return $spend; } - //计算市场专员业绩公式 参数 time 2020-10 public function caculateMarketStream () { + if ($_REQUEST['time']) { + $count_date = $_REQUEST['time']; + }else{ + $count_date = date('Y-m',strtotime(date('Y',time()).'-'.(date('m',time())-1).'-01')); + } + A("MarketPerformanceSet")->setFreeMonth($count_date); + die(); + echo date("Y-m-d H:i:s")."----------------------市场结算管理计算----------------------\n"; $map['pay_time'] = date('Y-m',strtotime(date('Y',time()).'-'.(date('m',time())-1).'-01')); @@ -846,6 +853,7 @@ class TimingController extends AdminController { if ($_REQUEST['time']) { $map['pay_time'] = $_REQUEST['time']; } + $spend_map = []; $time_start = 0; $time_end = 0;