"周结", "1"=>"月结", "2"=>"补点" ]; public $token = "LYHTQDJS"; public function _initialize(){ $cpapihost = M("Kv")->field("value")->where("`key` = 'aggregate_cp_settlement_api'")->find(); if(empty($cpapihost)){ echo "请先设置请求接口aggregate_cp_settlement_api的值".PHP_EOL;die; } $this->cpapihost = $cpapihost['value']; } /** * Undocumented function * * @param [type] $begin 开始时间 2020-04-01 * @param string $end 结束时间,默认今天 * @param string $company all/pc/cp/pu 全部 下游公司 上游 下游个人 * @return void */ public function setFreeDateCount($begin,$end='',$company='all') { if($end == '') $end = $begin; //判断日期格式 $patten = "/^\d{4}[\-](0?[1-9]|1[012])[\-](0?[1-9]|[12][0-9]|3[01])$/"; if (!preg_match($patten, $begin)) { die("开始时间格式错误"); } if (!preg_match($patten, $end)) { die("结束时间格式错误"); } if(strtotime($end) < strtotime($begin)){ die("结束时间不能比开始时间小"); } if(strtotime($end)+86399-24*3600 > time()){ die("结束时间不能大于当前"); } $starttime = $begin?strtotime($begin):mktime(0,0,0,date('m'),date('d'),date('Y')); $endtime = $end?strtotime($end)+86399:$starttime+86399; $datelist = get_date_list($starttime,$endtime,1); $countdate = count($datelist); for($i=0;$i<$countdate;$i++){ $this->setDailyCount($datelist[$i],$company); } } public function setDailyCount($stime="now",$company='all') { if(!IS_CLI){ die("只支持脚本访问"); } if($stime=="now"){ $stime=time(); }else{ $stime = strtotime($stime); } $nowdate = date("Y-m-d",$stime); $w = (int)date("w",$stime); $d = (int)date("d",$stime); if($w == 1 || $d == 1){ if($w == 1){ if($company == "all"){ echo $nowdate.":".PHP_EOL; echo "--周结begin".PHP_EOL; $this->cpStatement(0,$stime); echo "∟----CP周结统计ok".PHP_EOL; $this->promoteCompanyStatement(0,$stime); echo "∟----推广公司周结统计ok".PHP_EOL; if(!IS_SUBSITE){ $this->promoteUserPool(0,$stime); echo "∟----推广个人周结ok".PHP_EOL; } } if($company == "cp"){ $this->cpStatement(0,$stime); echo "∟----CP周结统计ok".PHP_EOL; } if($company == "pc"){ $this->promoteCompanyStatement(0,$stime); echo "∟----推广公司周结统计ok".PHP_EOL; } if($company == "pu"){ $this->promoteUserPool(0,$stime); echo "∟----推广个人周结ok".PHP_EOL; } } if($d == 1){ if($company == "all"){ echo $nowdate.":".PHP_EOL; echo "--月结&补点begin".PHP_EOL; $this->cpStatement(1,$stime); $this->cpStatement(2,$stime); echo "∟----CP月结&补点统计ok".PHP_EOL; $this->promoteCompanyStatement(1,$stime); $this->promoteCompanyStatement(2,$stime); $this->officeCompanyStatement($stime); //官方结算 echo "∟----官方/推广公司月结&补点统计ok".PHP_EOL; if(!IS_SUBSITE){ $this->promoteUserPool(1,$stime); $this->promoteUserPool(2,$stime); echo "∟----推广个人月结&补点统计ok".PHP_EOL; } } if($company == "cp"){ $this->cpStatement(1,$stime); $this->cpStatement(2,$stime); echo "∟----CP月结&补点统计ok".PHP_EOL; } if($company == "pc"){ $this->promoteCompanyStatement(1,$stime); $this->promoteCompanyStatement(2,$stime); $this->officeCompanyStatement($stime); //官方结算 echo "∟----官方/推广公司月结&补点统计ok".PHP_EOL; } if($company == "pu"){ $this->promoteUserPool(1,$stime); $this->promoteUserPool(2,$stime); echo "∟----推广个人月结&补点统计ok".PHP_EOL; } } }else{ echo $nowdate."非周一和月初,无需任何处理".PHP_EOL; } } /** * 上游结算 * @param [string] $type 0:周结 1:月结 2:周结补点 */ public function cpStatement($type,$stime,$company_id=false,$recount=true) { $t = $this->setBeginAndEndTime($type,$stime);; $begintime = $t[0]; $endtime = $t[1]; if($company_id === false){ //非重算 $where = [ "_string"=>"first_company_type = '1' OR second_company_type = '1'" ]; }else{ $where = [ "_string"=>"(first_company_type = '1' AND first_company_id in ({$company_id}) ) OR (second_company_type = '1' AND second_company_id in ({$company_id}) )" ]; } //获取哪些要结算 if($type == 1){ $where['settlement_type']=2; $cpDbRes = M("CompanyRelation","tab_")->where($where)->select(); }else{ $where['settlement_type']=1; $cpDbRes = M("CompanyRelation","tab_")->where($where)->select(); } $cpList=[]; $js_id = [];//己方公司 foreach ($cpDbRes as $k => $v) { if($v['first_company_type'] == 1){ $cpList[$v['first_company_id']] =$v; $js_id[] =$v['second_company_id']; }else{ $cpList[$v['second_company_id']] =$v; $js_id[] =$v['first_company_id']; } } if(count($js_id) ==0 || count($cpList) == 0){return ;} $cp_id = implode(",",array_flip(array_flip(array_keys($cpList))));//已绑定关系 $js_id = implode(",",array_unique($js_id)); //获取cp公司 $cpmap = [ "id"=>['in',$cp_id], "_string"=>"(validity_start_time > 0 AND validity_end_time = 0 ) OR validity_end_time >= {$endtime}" ]; $tmpp = M("Partner","tab_")->field("id,partner,link_man,link_phone,address,company_tax_no,payee_name,bank_account,opening_bank,channel_rate,invoice_rate,taxation_rate,company_type,ali_user,ali_account,has_advance_charge,has_server_fee,server_fee")->where($cpmap)->select(); if(empty($tmpp)){ return true; } $cp =[]; foreach ($tmpp as $v) { $cp[$v['id']]=$v; } $cp_id = implode(",",array_column($tmpp,"id")); //结算的id unset($tmpp); //获取己方公司 $our = []; $tmpp = M("CompanyInfo","tab_")->field("id,partner,link_man,link_phone,address,company_tax_no,payee_name,bank_account,opening_bank")->where(["id"=>['in',$js_id]])->select(); foreach ($tmpp as $v) { $our[$v['id']]=$v; } unset($tmpp); unset($js_id); //获取本地数据 $locals = $this->getLocalStatementData($begintime,$endtime,$cp_id); //获取聚合数据 $sign = md5($begintime.$endtime."1".$this->token); $arr = [ "begintime"=>$begintime, "endtime"=>$endtime, "type"=>1, "sign"=>$sign, "cp_id"=>$cp_id ]; $dataurl .= $this->cpapihost."&".http_build_query($arr); $html = file_get_contents($dataurl); //防止并发压力 sleep(3); $rsp = json_decode($html,true); if($rsp['code'] != 1){ echo $rsp['error'].PHP_EOL;die; }else{ $rsp = $rsp['data']; } //整合数据本地 foreach($locals as $k=>$v){ $cpList[$k]["list"] = $v["list"]; } //整合数据,聚合 foreach($rsp as $k=>$v){ if(isset($cpList[$k]["list"])){ //已经存在 foreach($rsp[$k]["list"] as $ke=>$va){ if(isset($cpList[$k]["list"][$ke])){ $cpList[$k]["list"][$ke]['pay_money'] += $va['pay_money']; }else{ $cpList[$k]["list"][$ke] = $va; } } }else{ $cpList[$k]["list"] = $v["list"]; } } //比例计算及保存 // TODO:此处不判断现游戏名=原包名,但却不是同一款游戏 $verify_log=json_encode(["create_user"=>"system","create_time"=>date("Y-m-d H:i:s")]); $GameDb = M("Game","tab_"); $StatementDb = SM("CompanyStatement","tab_"); $statement_begin_time = date("Y.m.d",$begintime); $statement_end_time = date("Y.m.d",$endtime); foreach($cpList as $k=>$v){ $add_data=[]; $handleed_data = []; //1.获取甲乙方信息 if($v['first_company_type'] == 1){ //甲方上游 $cp[$v['first_company_id']]['invoice_type'] = $v['invoice_type']; $cp[$v['first_company_id']]['invoice_content'] = $v['invoice_content']; $add_data['first_party_info'] = json_encode($cp[$v['first_company_id']],JSON_UNESCAPED_UNICODE); $add_data['second_party_info'] = json_encode($our[$v['second_company_id']],JSON_UNESCAPED_UNICODE); $add_data['company_id'] = $v['first_company_id']; $add_data['company_name'] = $v['first_company_name']; }else{ //乙方上游 $cp[$v['second_company_id']]['invoice_type'] = $v['invoice_type']; $cp[$v['second_company_id']]['invoice_content'] = $v['invoice_content']; $add_data['first_party_info'] = json_encode($our[$v['first_company_id']],JSON_UNESCAPED_UNICODE); $add_data['second_party_info'] = json_encode($cp[$v['second_company_id']],JSON_UNESCAPED_UNICODE); $add_data['company_id'] = $v['second_company_id']; $add_data['company_name'] = $v['second_company_name']; } $add_data['pay_type'] = $v['collection']; $add_data['withdraw_type'] = $type; $add_data['statement_begin_time'] = $begintime; $add_data['statement_end_time'] = $endtime; $add_data['statement_money'] = 0; $add_data['pay_amount'] = 0; $add_data['verify_log'] = $verify_log; $add_data['op_time'] =time(); $add_data['statement_info'] =[]; $add_data['company_belong']=9;//上游 $add_data['company_type']=$cp[$add_data['company_id']]['company_type']; $add_data['is_payment']=$v['is_payment']; //获取渠道及税费费率 $promote_ratio = $cp[$add_data['company_id']]['channel_rate'] ?? 0; $fax_ratio = $cp[$add_data['company_id']]['taxation_rate'] ?? 0; //游戏统计 if (isset($v['list'])) { foreach ($v['list'] as $ke=>$va) { $game =[]; $game['pay_amount'] =$va['pay_money']; $game['game_name'] =$ke; //获取游戏id及比例 $game_id = $GameDb->where("relation_game_name='{$ke}' OR original_package_name='{$ke}'")->field("id,relation_game_id")->find(); if (empty($game_id) && isset($va['unique_code']) && !empty($va['unique_code'])) { $unique_code = $va['unique_code']; $game_id = $GameDb->where("unique_code='{$unique_code }'")->field("id,relation_game_id")->find(); } if (empty($game_id)) { $game['relation_game_id']=0; $tratio = 0; } else { //获取比例 $game['relation_game_id']=$game_id['relation_game_id']; if ($type == 1) { $tratio = getGameCpRadio($game_id['id'], $va['pay_money'], true); } elseif ($type == 0) { $tratio = getGameCpRadio($game_id['id'], $va['pay_money'], false); } else { //补丁 $tratio1 = getGameCpRadio($game_id['id'], $va['pay_money'], true); $tratio2 = getGameCpRadio($game_id['id'], $va['pay_money'], false); $tratio = $tratio1-$tratio2; if ($tratio <= 0) { continue; } } } if ($v['first_company_type'] == 1) { $game['first_ratio']=$tratio-0; $game['second_ratio']=100-$tratio; } else { $game['first_ratio']=100-$tratio; $game['second_ratio']=$tratio-0; } $add_data['pay_amount'] += $va['pay_money']; $game['sum_money']=round($va['pay_money']*(100-$promote_ratio)*$tratio*(100-$fax_ratio)/(100*100*100), 2);//结算金额=平台总额*(1-渠道费)*分成比例*(1-税费费率) $add_data['statement_money'] += $game['sum_money']; $game['fax_ratio']=$fax_ratio; $game['promote_ratio']=$promote_ratio; $game['statement_begin_time']=$statement_begin_time; $game['statement_end_time']=$statement_end_time; $game['statement_type']=0; $RewardRecordRes = $this->getPromoteUserGameRewardRecordCp($add_data['company_id'],$statement_begin_time,$statement_end_time); if ( ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] == '0') || ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] == '0') ) { $game['fine'] = 0; $game['reward'] = 0; } else { $game['fine'] = $RewardRecordRes['fine']?$RewardRecordRes['fine']:0; $game['reward'] = $RewardRecordRes['reward']?$RewardRecordRes['reward']:0; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] = (string)$RewardRecordRes['fine']; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] = (string)$RewardRecordRes['reward']; } $add_data['statement_info'][] = $game; } }else{ $add_data['statement_info'] = []; } $add_data['platform_amount'] = $add_data['pay_amount']; if($type < 2){ //非补点奖罚 $rrmap = array( "confirm_time" => ['between', [$begintime,$endtime]], "company_type"=>1, "company_id"=>$add_data['company_id'], "settlement_type"=>2, ); $rfres = M("RewardDetail","tab_") ->field(" IFNULL(SUM(CASE WHEN type = 1 THEN amount ELSE 0 END),0) as reward_count, IFNULL(SUM(CASE WHEN type = 2 THEN amount ELSE 0 END),0) as fine_count ") ->where($rrmap)->find(); if($rfres['reward_count'] > 0){ $reward_count = $rfres['reward_count']; $add_data['statement_info'][] = array( "statement_begin_time"=>$statement_begin_time, "statement_end_time"=>$statement_end_time, 'statement_type'=>2, "game_name"=>"奖励", 'pay_amount'=>$reward_count, 'sum_money'=>$reward_count, ); $add_data['statement_money']+=$reward_count; $add_data['pay_amount']+=$reward_count; } if($rfres['fine_count'] > 0){ $fine_count = $rfres['fine_count']; $add_data['statement_info'][] = array( "statement_begin_time"=>$statement_begin_time, "statement_end_time"=>$statement_end_time, 'statement_type'=>1, "game_name"=>"罚款", 'pay_amount'=>$fine_count, 'sum_money'=>$fine_count, ); $add_data['statement_money'] -= $fine_count; $add_data['pay_amount'] -= $fine_count;; } //获取服务器费用 $tmp_company_info= $cp[$add_data['company_id']]; if($tmp_company_info['has_server_fee'] == 1 && $tmp_company_info['server_fee'] >0){ $server_count = $tmp_company_info['server_fee']; $add_data['statement_info'][] = array( "statement_begin_time"=>$statement_begin_time, "statement_end_time"=>$statement_end_time, 'statement_type'=>1, "game_name"=>"服务器费用", 'pay_amount'=>$server_count, 'sum_money'=>$server_count, ); $add_data['statement_money'] -= $server_count; $add_data['pay_amount'] -= $server_count;; } } $add_data['statement_info'] = json_encode($add_data['statement_info'],JSON_UNESCAPED_UNICODE); if($type == 2 && $add_data['statement_money'] == 0){ //金额为0不补点 continue; } if($add_data['platform_amount'] == 0 && $add_data['statement_money'] == 0){ //全等于0表示没有流水,小于0依旧要结算 continue; } //添加 if($recount && $company_id !== false){ //非重算 return $add_data; } $StatementDb->add($add_data); } } /** * 获取本地上游结算 */ public function getLocalStatementData($begintime,$endtime,$cp_id) { $game_where = "partner_id in ({$cp_id})"; $game = M('game','tab_'); $gameDbRes = $game->field("id,relation_game_name as game_name,partner_id as cp_id,original_package_name,select_package_name")->where($game_where)->select(); $gameList=[]; foreach ($gameDbRes as $k => $v) { $gameList[$v['id']] =$v; } //获取所有id $gmstr = implode(",",array_flip(array_flip(array_column($gameDbRes,'id')))); //获取支付记录 $paywhere = [ "pay_status"=>1, "pay_game_status"=>1, "payed_time"=>["BETWEEN",[$begintime,$endtime]], "game_id"=>["in",$gmstr] ]; D("Spend")->addSubsiteWhere($paywhere); $paydb = M('spend','tab_'); $paylist = $paydb->field("game_id,SUM(pay_amount) pay_amount")->where($paywhere)->group("game_id")->select(); if(empty($paylist)){ return []; } //绑定价格 foreach ($paylist as $k => $v) { $gameList[$v['game_id']]['pay_money'] =$v["pay_amount"]; } unset($paylist); //按游戏名称及cp整理数据 $cplList = []; foreach ($gameList as $k => $v) { if($v['pay_money'] <= 0) continue; //0值不发送 if(empty($v['original_package_name'])){ $game_name = $v['game_name']; }else{ if($v['select_package_name'] == 0){ $game_name = $v['original_package_name']; }else{ $game_name = $v['game_name']; } } $cp_id = $v['cp_id']; unset($v['cp_id']); $ymoney = $cplList[$cp_id]['list'][$game_name]["pay_money"]?:0; $cplList[$cp_id]['list'][$game_name]["pay_money"] =$ymoney+$v["pay_money"]; // if($type==2){ // $cplList[$cp_id]['list'][$game_name]["list"][] =$v; //传递列表详情 // } } return $cplList; } //官方结算 public function officeCompanyStatement($stime,$recount=false) { $t = $this->setBeginAndEndTime(1,$stime); $begintime = $t[0]; $endtime = $t[1]; //获取官方信息 $pc_map = [ "id"=>["IN",$pc_id], "_string"=>"(validity_start_time > 0 AND validity_end_time = 0 ) OR validity_end_time >= {$endtime}", "company_type"=>1 ]; //获取pc公司 $company = M("CompanyInfo","tab_")->field("id,partner,link_man,link_phone,address,company_tax_no,payee_name,bank_account,opening_bank")->where("partner = '海南万盟天下科技有限公司'")->find(); $first_party_info = json_encode($company,JSON_UNESCAPED_UNICODE); $company['partner'] = C("OFFICIEL_CHANNEL"); $second_party_info = json_encode($company,JSON_UNESCAPED_UNICODE); $add_data=[ "first_party_info"=>$first_party_info, "second_party_info"=>$second_party_info, "pay_type"=>2, "withdraw_type"=>1, "statement_begin_time"=>$begintime, "statement_end_time"=>$endtime, "statement_money"=>0, "pay_amount"=>0, "platform_amount"=>0, "verify_log"=>json_encode(["create_user"=>"system","create_time"=>date("Y-m-d H:i:s")]), "op_time"=>time(), "is_payment"=>2, "statement_info"=>[], "company_belong"=>0, "company_name"=>C("OFFICIEL_CHANNEL"), "company_id"=>0, "company_type"=>1 ]; //获取渠道及发票税率 $fax_ratio = 0; //税费费率 $company_belong = 0; $Promote = M("Promote","tab_"); $Spend = M("Spend","tab_"); $spenMap = [ "s.pay_status"=>1, "s.payed_time"=>['between', [$begintime,$endtime]], "s.promote_id"=>0 ]; D("Spend")->addSubsiteWhere($spenMap,"s"); $list = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,g.relation_game_id,g.relation_game_name game_name')->where($spenMap)->group('relation_game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); if(empty($list)){return;} $statement_begin_time = date("Y.m.d",$begintime); $statement_end_time = date("Y.m.d",$endtime); foreach ($list as $k => $v) { $v['fax_ratio'] = 0; $v['statement_begin_time']=$statement_begin_time; $v['statement_end_time']=$statement_end_time; $v['ratio']=0; $v['sum_money'] = 0; $v['statement_type']=0; $add_data['platform_amount'] += $v['pay_amount']; $add_data['pay_amount'] += $v['pay_amount']; $add_data['statement_info'][] = $v; } $add_data['statement_info'] = json_encode($add_data['statement_info'],JSON_UNESCAPED_UNICODE); if($recount){ //非重算 return $add_data; } SM("CompanyStatement","tab_")->add($add_data); } /** * 下游结算 */ public function promoteCompanyStatement($type,$stime,$company_id=false,$recount=true) { $t = $this->setBeginAndEndTime($type,$stime); $begintime = $t[0]; $endtime = $t[1]; if($company_id === false){ //非重算 $where = [ "_string"=>"first_company_type = '2' OR second_company_type = '2'" ]; }else{ $where = [ "_string"=>"(first_company_type = '2' AND first_company_id in ({$company_id}) ) OR (second_company_type = '2' AND second_company_id in ({$company_id}) )" ]; } //获取哪些要结算 if($type == 1){ $where['settlement_type']=2; $pcDbRes = M("CompanyRelation","tab_")->where($where)->select(); }else{ $where['settlement_type']=1; $pcDbRes = M("CompanyRelation","tab_")->where($where)->select(); } $pcList=[]; $js_id = [];//己方公司 foreach ($pcDbRes as $k => $v) { if($v['first_company_type'] == 2){ $pcList[$v['first_company_id']] =$v; $js_id[] =$v['second_company_id']; }else{ $pcList[$v['second_company_id']] =$v; $js_id[] =$v['first_company_id']; } } $pc_id = implode(",",array_flip(array_flip(array_keys($pcList)))); $js_id = implode(",",array_unique($js_id)); if(count($js_id) ==0 || count($pcList) == 0){ //无需处理 return ; } $pc_map = [ "id"=>["IN",$pc_id], "_string"=>"(validity_start_time > 0 AND validity_end_time = 0 ) OR validity_end_time >= {$endtime}", "company_type"=>1 ]; //获取pc公司 $tmpp = M("PromoteCompany","tab_")->field("id,uid,company_name partner,settlement_contact link_man,address,contact_phone link_phone,bank_name opening_bank,bank_address payee_name,bank_card bank_account,fax_ratio,taxation_rate,company_belong,company_type,ali_user,ali_account,has_server_fee,server_fee,has_ratio,turnover_ratio") ->where($pc_map) ->select(); // dump($tmpp); if(empty($tmpp)){ return true; } $pc =[]; $Promote = M("Promote","tab_"); foreach ($tmpp as $v) { // //获取会长的支付宝账号 // $p_map = [ // "company_id"=>$v['id'], // "withdraw_done"=>1 // ]; // $pres = $Promote->field("alipay_account,alipay_real_name")->where($p_map)->find(); // if(!empty($pres) && !empty($pres['alipay_account']) && !empty($pres['alipay_real_name'])){ // $v['ali_user'] = $pres['alipay_real_name']; // $v['ali_account'] = $pres['alipay_account']; // } if($v['has_ratio']){ $v['turnover_ratio'] = json_decode($v['turnover_ratio'],true); } $pc[$v['id']]=$v; } unset($tmpp); //获取己方公司 $our = []; $tmpp = M("CompanyInfo","tab_")->field("id,partner,link_man,link_phone,address,company_tax_no,payee_name,bank_account,opening_bank")->where(["id"=>['in',$js_id]])->select(); foreach ($tmpp as $v) { $our[$v['id']]=$v; } unset($tmpp); unset($js_id); $this->getPromoteCompanySpend($pcList,array_unique(array_keys($pcList)),$begintime,$endtime); //数据整合 $verify_log=json_encode(["create_user"=>"system","create_time"=>date("Y-m-d H:i:s")]); $StatementDb = SM("CompanyStatement","tab_"); $statement_begin_time = date("Y.m.d",$begintime); $statement_end_time = date("Y.m.d",$endtime); $RewardRecord = M("RewardDetail","tab_"); foreach($pcList as $k=>$v){ if(!isset($pc[$k])){continue;}//不存在的公司不结算 if($pc[$k]['has_ratio'] == 1){ $company_ratio = $this->getCompanyRatio($v['pay_amount'],$pc[$k]['turnover_ratio']); }else{ $company_ratio = 0; } $add_data=[]; //1.获取甲乙方信息 if($v['first_company_type'] > 0){ //甲方合作 $pc[$v['first_company_id']]['invoice_type'] = $v['invoice_type']; $pc[$v['first_company_id']]['invoice_content'] = $v['invoice_content']; $add_data['first_party_info'] = json_encode($pc[$v['first_company_id']],JSON_UNESCAPED_UNICODE); $add_data['second_party_info'] = json_encode($our[$v['second_company_id']],JSON_UNESCAPED_UNICODE); $add_data['company_id'] = $v['first_company_id']; $add_data['company_name'] = $v['first_company_name']; }else{ //乙方合作 $pc[$v['second_company_id']]['invoice_type'] = $v['invoice_type']; $pc[$v['second_company_id']]['invoice_content'] = $v['invoice_content']; $add_data['first_party_info'] = json_encode($our[$v['first_company_id']],JSON_UNESCAPED_UNICODE); $add_data['second_party_info'] = json_encode($pc[$v['second_company_id']],JSON_UNESCAPED_UNICODE); $add_data['company_id'] = $v['second_company_id']; $add_data['company_name'] = $v['second_company_name']; } $add_data['pay_type'] = $v['collection']; $add_data['withdraw_type'] = $type; $add_data['statement_begin_time'] = $begintime; $add_data['statement_end_time'] = $endtime; $add_data['statement_money'] = 0; $add_data['pay_amount'] = 0; $add_data['verify_log'] = $verify_log; $add_data['op_time'] =time(); $add_data['is_payment']=$v['is_payment']; $add_data['statement_info'] =[]; //获取渠道及发票税率 $fax_ratio = $pc[$add_data['company_id']]['taxation_rate'] ?? 0; //税费费率 $company_belong = $pc[$add_data['company_id']]['company_belong']; $add_data['company_belong']=$company_belong; $add_data['company_type']=$pc[$add_data['company_id']]['company_type']; if(!isset($v['game_list'])){continue;} //获取多段比例 $game_ratio_list = D("CompanyGameRatio")->getPromoteCompanyGameRatio($add_data['company_id'],$v['game_ids'],$begintime,$endtime,$company_belong); $handleed_data = []; foreach ($game_ratio_list as $t_game_id => $t_game_ratio) { $game =[]; $game['game_name'] =$v['game_list'][$t_game_id]['game_name']; $game['relation_game_id'] =$v['game_list'][$t_game_id]['relation_game_id']; if(isset($v['game_list'][$t_game_id]['all_pay_amount'])){ $game_all_payment = $v['game_list'][$t_game_id]['all_pay_amount']-0; }else{ // $game_all_payment = $v['game_list'][$t_game_id]['pay_amount']-0; $game_all_payment = $v['game_list'][$t_game_id]['ratio_pay_amount']-0; } // dump($tratio); $game['fax_ratio']=$fax_ratio-0; $game['statement_type']=0; if(count($t_game_ratio) == 1){ $tmp_game_ratio = $t_game_ratio[0]; $game['pay_amount'] =$this->getRelationGameIdSpend($add_data['company_id'],$t_game_id,$tmp_game_ratio['begintime'],$tmp_game_ratio['endtime']); // $game['pay_amount'] = $v['game_list'][$t_game_id]['pay_amount']; $game['pay_amount'] -=0; $game['statement_begin_time']=$statement_begin_time; $game['statement_end_time']=$statement_end_time; $add_data['pay_amount'] += $game['pay_amount']; if($type == 1){ $tratio =$this->getTurnoverRatio($game_all_payment,$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio += $company_ratio; // if ($add_data['company_id'] == 5) { // dump($game_all_payment); // dump($this->getTurnoverType($t_game_id,$k,$begintime,$endtime)); // dump($tmp_game_ratio); // } }elseif($type == 0){ // $tratio = $tmp_game_ratio['ratio']; $turnover_type = $this->getTurnoverType($t_game_id,$k,$begintime,$endtime); if ($turnover_type == 2 || $turnover_type == 4) { $tratio =$this->getTurnoverRatio($game_all_payment,$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); } else { $tratio = $tmp_game_ratio['ratio']; } }else{ //补点 $turnover_type = $this->getTurnoverType($t_game_id,$k,$begintime,$endtime); if ($turnover_type == 2 || $turnover_type == 4) { continue; } $tratio1 =$this->getTurnoverRatio($game_all_payment,$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio2 =$tmp_game_ratio['ratio']; $tratio = $tratio1-$tratio2+$company_ratio; if($tratio <= 0){ continue;} } if($v['type'] == 2){ $game['increment_ratio']=$tratio; }else{ $game['ratio']=$tratio; } $RewardRecordRes = $this->getPromoteUserGameRewardRecord($add_data['company_id'],$statement_begin_time,$statement_end_time); if ( ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] == '0') || ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] == '0') ) { $game['fine'] = 0; $game['reward'] = 0; } else { $game['fine'] = $RewardRecordRes['fine']?$RewardRecordRes['fine']:0; $game['reward'] = $RewardRecordRes['reward']?$RewardRecordRes['reward']:0; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] = (string)$RewardRecordRes['fine']; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] = (string)$RewardRecordRes['reward']; } $game['sum_money']=round($game['pay_amount']*$tratio*(100-$fax_ratio)/(100*100),2);//结算金额=平台总额*(分成比例+补点比例)*(1-税费费率) $add_data['statement_money'] += $game['sum_money']; if ($game['pay_amount'] != '0') { $add_data['statement_info'][] = $game; } }else{ // dd($t_game_ratio); for ($i=0; $i < count($t_game_ratio); $i++) { $tmp_game_ratio = $t_game_ratio[$i]; $temp_game = $game; $temp_game['statement_begin_time']=date("Y.m.d",$tmp_game_ratio['begintime']); $temp_game['statement_end_time']=date("Y.m.d",$tmp_game_ratio['endtime']); // dd($t_game_id); $temp_game['pay_amount'] =$this->getRelationGameIdSpend($add_data['company_id'],$t_game_id,$tmp_game_ratio['begintime'],$tmp_game_ratio['endtime']); $temp_game['pay_amount'] -=0; $add_data['pay_amount'] += $temp_game['pay_amount']; if($type == 1){ // if ($add_data['company_id'] == 5) { // dump($game_all_payment); // dump($this->getTurnoverType($t_game_id,$k,$begintime,$endtime)); // dump($tmp_game_ratio); // } $tratio =$this->getTurnoverRatio($game_all_payment,$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio += $company_ratio; }elseif($type == 0){ // $tratio = $t_game_ratio['ratio']; $turnover_type = $this->getTurnoverType($t_game_id,$k,$begintime,$endtime); if ($turnover_type == 2 || $turnover_type == 4) { $tratio =$this->getTurnoverRatio($game_all_payment,$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); } else { $tratio = $tmp_game_ratio['ratio']; } }else{ $turnover_type = $this->getTurnoverType($t_game_id,$k,$begintime,$endtime); if ($turnover_type == 2 || $turnover_type == 4) { continue; } //补点 $tratio1 =$this->getTurnoverRatio($game_all_payment,$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio2 =$tmp_game_ratio['ratio']; $tratio = $tratio1-$tratio2+$company_ratio; if($tratio <= 0){ continue;} } if($v['type'] == 2){ $temp_game['increment_ratio']=$tratio; }else{ $temp_game['ratio']=$tratio; } $RewardRecordRes = $this->getPromoteUserGameRewardRecord($add_data['company_id'],$temp_game['statement_begin_time'],$temp_game['statement_end_time']); if ( ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] == '0') || ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] == '0') ) { $game['fine'] = 0; $game['reward'] = 0; } else { $game['fine'] = $RewardRecordRes['fine']?$RewardRecordRes['fine']:0; $game['reward'] = $RewardRecordRes['reward']?$RewardRecordRes['reward']:0; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] = (string)$RewardRecordRes['fine']; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] = (string)$RewardRecordRes['reward']; } $temp_game['sum_money']=round($temp_game['pay_amount']*$tratio*(100-$fax_ratio)/(100*100),2);//结算金额=平台总额*(分成比例+补点比例)*(1-税费费率) $add_data['statement_money'] += $temp_game['sum_money']; if ($temp_game['pay_amount'] != '0') { $add_data['statement_info'][] = $temp_game; } } } } $add_data['platform_amount'] = $add_data['pay_amount']; if($type < 2){ //非补点计算奖罚 $rrmap = array( "confirm_time" => ['between', [$begintime,$endtime]], "company_type"=>2, "company_id"=>$add_data['company_id'], "settlement_type"=>2, ); $rfres = M("RewardDetail","tab_") ->field(" IFNULL(SUM(CASE WHEN type = 1 THEN amount ELSE 0 END),0) as reward_count, IFNULL(SUM(CASE WHEN type = 2 THEN amount ELSE 0 END),0) as fine_count ") ->where($rrmap)->find(); if($rfres['reward_count'] > 0){ $reward_count = $rfres['reward_count']; $add_data['statement_info'][] = array( "statement_begin_time"=>$statement_begin_time, "statement_end_time"=>$statement_end_time, 'statement_type'=>2, "game_name"=>"奖励", 'pay_amount'=>$reward_count, 'sum_money'=>$reward_count, ); $add_data['statement_money']+=$reward_count; $add_data['pay_amount']+=$reward_count; } if($rfres['fine_count'] > 0){ $fine_count = $rfres['fine_count']; $add_data['statement_info'][] = array( "statement_begin_time"=>$statement_begin_time, "statement_end_time"=>$statement_end_time, 'statement_type'=>1, "game_name"=>"罚款", 'pay_amount'=>$fine_count, 'sum_money'=>$fine_count, ); $add_data['statement_money'] -= $fine_count; $add_data['pay_amount'] -= $fine_count;; } //获取服务器费用 $tmp_company_info= $pc[$add_data['company_id']]; if($tmp_company_info['has_server_fee'] == 1 && $tmp_company_info['server_fee'] >0){ $server_count = $tmp_company_info['server_fee']; $add_data['statement_info'][] = array( "statement_begin_time"=>$statement_begin_time, "statement_end_time"=>$statement_end_time, 'statement_type'=>1, "game_name"=>"服务器费用", 'pay_amount'=>$server_count, 'sum_money'=>$server_count, ); $add_data['statement_money'] -= $server_count; $add_data['pay_amount'] -= $server_count;; } } $is_continue = false; $statement_data = $add_data['statement_info']; foreach ($statement_data as $skey => $sval) { if ($sval) { $is_continue = true; } } if (!$is_continue) { continue; } $add_data['statement_info'] = json_encode($add_data['statement_info'],JSON_UNESCAPED_UNICODE); if($type == 2 && $add_data['statement_money'] == 0){ //金额为0不补点 continue; } if($add_data['platform_amount'] == 0){ continue; } //添加 if($recount === true && $company_id !== false){ //非重算 return $add_data; } $StatementDb->add($add_data); } } //设定开始结束时间 public function setBeginAndEndTime($type,$stime){ if($type == 0){ $begintime = mktime(0,0,0,date('m',$stime),date('d',$stime)-7,date('Y',$stime)); $endtime = mktime(0,0,0,date('m',$stime),date('d',$stime),date('Y',$stime))-1; }else{ $thismonth = date('m',$stime); $thisyear = date('Y',$stime); if ($thismonth == 1) { $lastmonth = 12; $lastyear = $thisyear - 1; } else { $lastmonth = $thismonth - 1; $lastyear = $thisyear; } $lastStartDay = $lastyear . '-' . $lastmonth . '-1'; $lastEndDay = $lastyear . '-' . $lastmonth . '-' . date('t', strtotime($lastStartDay)); $begintime = strtotime($lastStartDay);//上个月的月初时间戳 $endtime = strtotime($lastEndDay)+24*3600-1;//上个月的月末时间戳 } return [$begintime,$endtime]; } //获取推广公司推广金额 public function getPromoteCompanySpend(&$pcList,$idarr,$begintime,$endtime){ $res = []; $all_res = []; $cp_res = []; $cp_all_res = []; //获取推广员 if(count($idarr) == 0){return $res;} $Promote = M("Promote","tab_"); $Spend = M("Spend","tab_"); $spenMap = [ "s.pay_status"=>1, "s.payed_time"=>['between', [$begintime,$endtime]], "s.is_check"=>1 ]; D("Spend")->addSubsiteWhere($spenMap); $cpMap = [ "s.pay_status"=>1, "s.payed_time"=>['between', [$begintime,$endtime]] ]; D("Spend")->addSubsiteWhere($cpMap); $cpAllMap =[ "s.pay_status"=>1, "s.payed_time"=>['elt',$endtime] ]; D("Spend")->addSubsiteWhere($cpAllMap); for ($i=0; $i field("group_concat(id) ids,count(id) count")->where("company_id = '{$company_id}'")->group("company_id")->find(); if($pres['count'] ==0 ){continue;} $spenMap['s.promote_id']=["in",$pres['ids']]; //获取支付记录 $list = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($spenMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); $allSpendMap = $spenMap; unset($allSpendMap["s.payed_time"]); $allspend_list = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($allSpendMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); foreach($allspend_list as $k=>$v){ try { $all_res[$company_id]["pay_amount"] += $v['pay_amount']; } catch (\Throwable $th) { $all_res[$company_id]["pay_amount"] = $v['pay_amount']; } if(isset($all_res[$company_id][$v['relation_game_id']])){ // $all_res[$company_id][$v['relation_game_id']]['pay_amount'] += $v['pay_amount']; }else{ unset($v['game_id']); $all_res[$company_id][$v['relation_game_id']]= $v; } } if(empty($list)){continue;} foreach($list as $k=>$v){ try { $res[$company_id]["pay_amount"] += $v['pay_amount']; } catch (\Throwable $th) { $res[$company_id]["pay_amount"] = $v['pay_amount']; } if(isset($res[$company_id][$v['relation_game_id']])){ // $res[$company_id][$v['relation_game_id']]['pay_amount'] += $v['pay_amount']; $res[$company_id][$v['relation_game_id']]['ratio_pay_amount'] += $v['pay_amount']; }else{ unset($v['game_id']); $v['ratio_pay_amount'] = $v['pay_amount']; $res[$company_id][$v['relation_game_id']]= $v; } } $game_ids = implode(",",array_unique(array_column($list,"relation_game_id"))); $game_ids = $this->getModuleRatioGame($company_id,$game_ids,$begintime,$endtime); $sameGame = $this->getTheSameGame($game_ids); if(!empty($sameGame)){ foreach ($sameGame as $k => $v) { $temp = 0; for ($j=0; $j < count($v); $j++) { // $turnover_where = [ // "relation_game_id"=>$v[$j], // "company_id"=>$company_id, // "_string"=>"begin_time <={$endtime} AND ( end_time = 0 OR end_time >= {$begintime})" // ]; // $turnover_type = D("CompanyGameRatio")->field("turnover_type")->where($turnover_where)->find()['turnover_type']; $turnover_type = $this->getTurnoverType($v[$j],$company_id,$begintime,$endtime); if ($turnover_type == 2) { $res[$company_id][$v[$j]]['ratio_pay_amount'] = $all_res[$company_id][$v[$j]]['pay_amount']; $temp += $all_res[$company_id][$v[$j]]['pay_amount']; } elseif($turnover_type == 3){ if (empty($cp_res[$company_id])) { $cpSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); // if ($company_id == 5) { // dump($cpMap); // } foreach($cpSpendList as $ck=>$cv){ try { $cp_res[$company_id]["pay_amount"] += $cv['pay_amount']; } catch (\Throwable $th) { $cp_res[$company_id]["pay_amount"] = $cv['pay_amount']; } if(isset($cp_res[$company_id][$cv['relation_game_id']])){ // $cp_res[$company_id][$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; }else{ unset($cv['game_id']); $cp_res[$company_id][$cv['relation_game_id']]= $cv; } } } $res[$company_id][$v[$j]]['ratio_pay_amount'] = $cp_res[$company_id][$v[$j]]['pay_amount']; $temp += $cp_res[$company_id][$v[$j]]['pay_amount']; } elseif($turnover_type == 4){ if (empty($cp_all_res[$company_id])) { $cpAllSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpAllMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); foreach ($cpAllSpendList as $ck => $cv) { try { $cp_all_res[$company_id]["pay_amount"] += $cv['pay_amount']; } catch (\Throwable $th) { $cp_all_res[$company_id]["pay_amount"] = $cv['pay_amount']; } if (isset($cp_all_res[$company_id][$cv['relation_game_id']])) { // $cp_all_res[$company_id][$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; } else { unset($cv['game_id']); $cp_all_res[$company_id][$cv['relation_game_id']] = $cv; } } } $res[$company_id][$v[$j]]['ratio_pay_amount'] = $cp_all_res[$company_id][$v[$j]]['pay_amount']; $temp += $cp_all_res[$company_id][$v[$j]]['pay_amount']; } else { // $res[$company_id][$v[$j]]['ratio_pay_amount'] = $res[$company_id][$v[$j]]['pay_amount']; $temp += $res[$company_id][$v[$j]]['pay_amount']; } } $sameGame[$k] = $temp; } foreach ($sameGame as $k => $v) { $res[$company_id][$k]['all_pay_amount'] = $v; // $game[$k]['pay_amount']= $v; } } } foreach($res as $key=>$value){ foreach ($value as $k => $v){ if ($k!='pay_amount') { $turnover_type = $this->getTurnoverType($k,$key,$begintime,$endtime); if ($turnover_type == 2) { $res[$key][$k]['ratio_pay_amount'] = $all_res[$key][$k]['pay_amount']; } elseif($turnover_type == 3){ if (empty($cp_res[$key])) { // if ($key == 5) { // dump(2); // dump($cpMap); // dump($cp_res); // } $cpSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); foreach($cpSpendList as $ck=>$cv){ try { $cp_res[$key]["pay_amount"] += $cv['pay_amount']; } catch (\Throwable $th) { $cp_res[$key]["pay_amount"] = $cv['pay_amount']; } if(isset($cp_res[$key][$cv['relation_game_id']])){ // $cp_res[$key][$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; }else{ unset($cv['game_id']); $cp_res[$key][$cv['relation_game_id']]= $cv; } } } $res[$key][$k]['ratio_pay_amount'] = $cp_res[$key][$k]['pay_amount']; } elseif($turnover_type == 4){ if (empty($cp_all_res[$key])) { $cpAllSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpAllMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); foreach ($cpAllSpendList as $ck => $cv) { try { $cp_all_res[$key]["pay_amount"] += $cv['pay_amount']; } catch (\Throwable $th) { $cp_all_res[$key]["pay_amount"] = $cv['pay_amount']; } if (isset($cp_all_res[$key][$cv['relation_game_id']])) { // $cp_all_res[$key][$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; } else { unset($cv['game_id']); $cp_all_res[$key][$cv['relation_game_id']] = $cv; } } } $res[$key][$k]['ratio_pay_amount'] = $cp_all_res[$key][$k]['pay_amount']; } } } } foreach($res as $k=>$v){ $pcList[$k]["pay_amount"] = $v['pay_amount']; unset($v['pay_amount']); $pcList[$k]['game_list'] = $v; $pcList[$k]['game_ids'] = implode(",",array_keys($pcList[$k]['game_list'])); } } /** * 返回结算流水类型 */ public function getTurnoverType($relation_game_id = 0, $company_id = 0, $begin_time = 0, $end_time = 0){ $company_belong = M("promote_company","tab_")->field("company_belong")->where(['id'=>$company_id])->find(); if (!$company_belong) { return 0; } $turnover_where = [ "relation_game_id"=>$relation_game_id, "company_id"=>$company_id, "_string"=>"begin_time <={$end_time} AND ( end_time = 0 OR end_time >= {$begin_time})" ]; $turnover_type = D("CompanyGameRatio")->field("turnover_type")->where($turnover_where)->find(); if (!$turnover_type) { $turnover_where = [ "company_belong"=>$company_belong['company_belong'], "relation_game_id"=>$relation_game_id, "company_id"=>0, "_string"=>"begin_time <={$end_time} AND ( end_time = 0 OR end_time >= {$begin_time})" ]; $turnover_type = D("CompanyGameRatio")->field("turnover_type")->where($turnover_where)->find(); } //判断特殊比例是否存在,存在直接返回结算流水类型 if (!$turnover_type) { //判断公司内外团类型是否存在,不存在直接返回0 if (!$company_belong) { return 0; } else { $company_belong = $company_belong['company_belong']; } $mould_where = [ "relation_game_id"=>$relation_game_id, "company_belong"=>$company_belong, "_string"=>"begin_time <={$end_time} AND ( end_time = 0 OR end_time >= {$begin_time})" ]; $mould_data = M("game_ratio_mould","tab_")->where($mould_where)->find(); //判断游戏比例模板是否存在,不存在直接返回0,否则返回查询的类型 if ($mould_data) { return $mould_data['turnover_type']; } else { return 0; } } else { return $turnover_type['turnover_type']; } } //获取推广公司推广金额 protected function getPuPromoteSpend(&$pcList,$idarr,$begintime,$endtime){ $res = []; //获取推广员 if(count($idarr) == 0){return $res;} $Promote = M("Promote","tab_"); $Spend = M("Spend","tab_"); $spenMap = [ "s.pay_status"=>1, "s.payed_time"=>['between', [$begintime,$endtime]], "s.is_check"=>1 ]; D("Spend")->addSubsiteWhere($spenMap,"s"); $cpallgame = []; $cpgame = []; $cpMap = [ "s.pay_status"=>1, "s.payed_time"=>['between', [$begintime,$endtime]] ]; D("Spend")->addSubsiteWhere($cpMap,"s"); $cpAllMap = [ "s.pay_status"=>1, "s.payed_time"=>['elt',$endtime] ]; D("Spend")->addSubsiteWhere($cpAllMap,"s"); // unset($cpAllMap["s.payed_time"]); for ($i=0; $i field("id,account")->where("company_id = '{$company_id}'")->select(); if(empty($pres)){continue;} $spenMap['s.promote_id']=["in",array_column($pres,"id")]; $promote_a = []; foreach($pres as $key=>$value){ $promote_a[$value['id']] = $value['account']; } unset($pres); //获取支付记录 $list = $Spend ->alias('s') ->field("sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name,IFNULL(if(substring_index(substring_index(promote.`chain`,'/',2),'/',-1)='',s.promote_id,substring_index(substring_index(promote.`chain`,'/',2),'/',-1)),0) p_id") ->where($spenMap) ->group('p_id,game_id') ->join("tab_promote promote ON s.promote_id = promote.id","left") ->join("left join tab_game g on s.game_id = g.id") ->select(); $all_spendMap = $spenMap; unset($all_spendMap['s.payed_time']); $all_list = $Spend ->alias('s') ->field("sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name,IFNULL(if(substring_index(substring_index(promote.`chain`,'/',2),'/',-1)='',s.promote_id,substring_index(substring_index(promote.`chain`,'/',2),'/',-1)),0) p_id") ->where($all_spendMap) ->group('p_id,game_id') ->join("tab_promote promote ON s.promote_id = promote.id","left") ->join("left join tab_game g on s.game_id = g.id") ->select(); // if ($company_id == 64) { // dump($all_list); // } if(empty($list)){continue;} $game = []; foreach($list as $k=>$v){ if(isset($game[$v['relation_game_id']])){ $game[$v['relation_game_id']]['pay_amount'] += $v['pay_amount']; }else{ $game[$v['relation_game_id']]['pay_amount'] = $v['pay_amount']; } } $allgame = []; foreach($all_list as $k=>$v){ if(isset($allgame[$v['relation_game_id']])){ $allgame[$v['relation_game_id']]['pay_amount'] += $v['pay_amount']; }else{ $allgame[$v['relation_game_id']]['pay_amount'] = $v['pay_amount']; } } //同cp,同一个原包名的共享总流水分成 $game_ids = implode(",",array_keys($game)); $game_ids = $this->getModuleRatioGame($company_id,$game_ids,$begintime,$endtime); $sameGame = $this->getTheSameGame($game_ids); if(!empty($sameGame)){ foreach ($sameGame as $k => $v) { $temp = 0; for ($j=0; $j < count($v); $j++) { $turnover_type = $this->getTurnoverType($v[$j],$company_id,$begintime,$endtime); if ($turnover_type == 2) { $temp += $allgame[$v[$j]]['pay_amount']; } elseif($turnover_type == 3) { if (empty($cpgame)) { $cpSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); // if ($company_id == 43) { // dump($cpMap); // } foreach($cpSpendList as $ck=>$cv){ if(isset($cpgame[$cv['relation_game_id']])){ $cpgame[$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; }else{ $cpgame[$cv['relation_game_id']]['pay_amount'] = $cv['pay_amount']; } } } $temp += $cpgame[$v[$j]]['pay_amount']; } elseif($turnover_type == 4) { if (empty($cpallgame)) { $cpAllSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpAllMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); foreach($cpAllSpendList as $ck=>$cv){ if(isset($cpallgame[$cv['relation_game_id']])){ $cpallgame[$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; }else{ $cpallgame[$cv['relation_game_id']]['pay_amount'] = $cv['pay_amount']; } } } $temp += $cpallgame[$v[$j]]['pay_amount']; } else { // $res[$company_id][$v[$j]]['ratio_pay_amount'] = $res[$company_id][$v[$j]]['pay_amount']; $temp += $game[$v[$j]]['pay_amount']; } // $temp += $game[$v[$j]]['pay_amount']; } $sameGame[$k] = $temp; } foreach ($sameGame as $k => $v) { $game[$k]['pay_amount']= $v; } } $pcList[$company_id]['game_ids'] = implode(",",array_keys($game)); foreach($list as $k=>$v){ try { $res[$company_id]["pay_amount"] += $v['pay_amount']; } catch (\Throwable $th) { $res[$company_id]["pay_amount"] = $v['pay_amount']; } $p_account = $promote_a[$v['p_id']]; if(isset($res[$company_id][$p_account][$v['relation_game_id']])){ // $res[$company_id][$p_account][$v['relation_game_id']]['pay_amount'] += $v['pay_amount']; }else{ unset($v['game_id']); $res[$company_id][$p_account][$v['relation_game_id']]= $v; $turnover_type = $this->getTurnoverType($v['relation_game_id'],$company_id,$begintime,$endtime); if ($turnover_type == 2) { // $temp += $allgame[$v[$j]]['pay_amount']; $res[$company_id][$p_account][$v['relation_game_id']]['all_pay_amount']= $allgame[$v['relation_game_id']]['pay_amount']; } elseif($turnover_type == 3) { if (empty($cpgame)) { $cpSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); // if ($company_id == 43) { // dump($cpMap); // } foreach($cpSpendList as $ck=>$cv){ if(isset($cpgame[$cv['relation_game_id']])){ $cpgame[$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; }else{ $cpgame[$cv['relation_game_id']]['pay_amount'] = $cv['pay_amount']; } } } $res[$company_id][$p_account][$v['relation_game_id']]['all_pay_amount']= $cpgame[$v['relation_game_id']]['pay_amount']; } elseif($turnover_type == 4) { if (empty($cpallgame)) { $cpAllSpendList = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount,s.game_id,g.relation_game_id,g.relation_game_name game_name')->where($cpAllMap)->group('game_id') ->join("left join tab_game g on s.game_id = g.id") ->select(); foreach($cpAllSpendList as $ck=>$cv){ if(isset($cpallgame[$cv['relation_game_id']])){ $cpallgame[$cv['relation_game_id']]['pay_amount'] += $cv['pay_amount']; }else{ $cpallgame[$cv['relation_game_id']]['pay_amount'] = $cv['pay_amount']; } } } $res[$company_id][$p_account][$v['relation_game_id']]['all_pay_amount']= $cpallgame[$v['relation_game_id']]['pay_amount']; } else { // $res[$company_id][$v[$j]]['ratio_pay_amount'] = $res[$company_id][$v[$j]]['pay_amount']; $res[$company_id][$p_account][$v['relation_game_id']]['all_pay_amount']= $game[$v['relation_game_id']]['pay_amount']; } // $res[$company_id][$p_account][$v['relation_game_id']]['all_pay_amount']= $game[$v['relation_game_id']]['pay_amount']; $res[$company_id][$p_account][$v['relation_game_id']]['game_type_name'] = $this->getGameTypeName($v['relation_game_id']); } } } foreach($res as $k=>$v){ $pcList[$k]["pay_amount"] = $v['pay_amount']; unset($v['pay_amount']); foreach($v as $ke=>$va){ $tmp = [ "account"=>$ke, 'game_list'=>$va ]; $pcList[$k]['list'][] = $tmp; } } } public function promoteUserPool($type,$stime,$recount = false){ $t = $this->setBeginAndEndTime($type,$stime); $begintime = $t[0]; $endtime = $t[1]; $user = [ "pay_amount"=>0, "statement_money"=>0, "lack_statement_money"=>0, "withdraw_type"=>$type, "platform_amount"=>0, "create_lack_ids"=>[], "del_lack_ids"=>[], "statement_begin_time"=>$begintime, "statement_end_time"=>$endtime, "fine"=>0, "reward"=>0, "verify_status"=>0, "company_type"=>2, "verify_log"=>json_encode(["create_user"=>"system","create_time"=>date("Y-m-d H:i:s")]), "op_time"=>time(), "statement_num"=>"PL_".date('Ymd').date('His').sp_random_num(3) ]; // $users = $user = $basedata; // $users['is_payment'] = 1; // $users['statement_num'] = "PL_".date('Ymd').date('His').sp_random_num(3); // $user['is_payment'] = 2; // $user['statement_num'] = "PL_".date('Ymd').date('His').sp_random_num(3); if($type == 0){//周结 $this->doPromoteUserPool($user,0,$stime,$recount); }else if($type == 1){ $users['withdraw_type'] = 1; $user['withdraw_type'] = 1; //月结&补点 $this->doPromoteUserPool($user,1,$stime,$recount); }else{ $users['withdraw_type'] = 2; $user['withdraw_type'] = 2; $this->doPromoteUserPool($user,2,$stime,$recount); } $this->savePromotateUserPool($user); } /** * 下游个人汇总单 */ public function doPromoteUserPool(&$user,$type,$stime,$recount = false) { $t = $this->setBeginAndEndTime($type,$stime); $begintime = $t[0]; $endtime = $t[1]; $where = [ "_string"=>"first_company_type = '2' OR second_company_type = '2'" ]; //获取哪些要结算 if($type == 1){//月结 $where['settlement_type']=2; $pcDbRes = M("CompanyRelation","tab_")->where($where)->select(); }else{ $where['settlement_type']=1; $pcDbRes = M("CompanyRelation","tab_")->where($where)->select(); } $pcList=[]; $js_id = [];//己方公司 foreach ($pcDbRes as $k => $v) { if($v['first_company_type'] == 2){ $pcList[$v['first_company_id']] =$v; $js_id[] =$v['second_company_id']; }else{ $pcList[$v['second_company_id']] =$v; $js_id[] =$v['first_company_id']; } } //获取pc公司 $pc_id = implode(",",array_flip(array_flip(array_keys($pcList)))); $pu_map = [ "id"=>["IN",$pc_id], "_string"=>"(validity_start_time > 0 AND validity_end_time = 0 ) OR validity_end_time >= {$endtime}", "company_type"=>2 ]; $tmpp = M("PromoteCompany","tab_") ->field("id,uid,company_name partner,settlement_contact link_man,contact_phone link_phone,bank_name opening_bank,bank_address payee_name,bank_card bank_account,fax_ratio,taxation_rate,company_belong,company_type,ali_user,ali_account,has_server_fee,server_fee,has_ratio,turnover_ratio") ->where($pu_map) ->select(); if(count($tmpp)<1){return;} $pc =[]; $Promote = M("Promote","tab_"); foreach ($tmpp as $v) { $p_map = [ "company_id"=>$v['id'], "withdraw_done"=>1 ]; // $pres = $Promote->field("alipay_account,alipay_real_name")->where($p_map)->find(); // if(!empty($pres) && !empty($pres['alipay_account']) && !empty($pres['alipay_real_name'])){ // $v['ali_user'] = $pres['alipay_real_name']; // $v['ali_account'] = $pres['alipay_account']; // } if($v['has_ratio']){ $v['turnover_ratio'] = json_decode($v['turnover_ratio'],true); } $pc[$v['id']]=$v; $pc[$v['id']]['is_payment']=$pcList[$v['id']]['is_payment']; } unset($tmpp); $this->getPuPromoteSpend($pc,array_unique(array_keys($pc)),$begintime,$endtime); // dump($pc);die(); $StatementDb = SM("CompanyStatement","tab_"); $statement_begin_time = date("Y.m.d",$begintime); $statement_end_time = date("Y.m.d",$endtime); // $RewardRecord = M("RewardRecord","tab_"); $LackStatement = SM("company_lack_statement_info","tab_"); $StatementInfo = SM("company_statement_info","tab_"); foreach($pc as $k=>&$v){ $fax_ratio = $v['taxation_rate']; $RewardRecordRes = $this->getPromoteUserRewardRecord($v['id'],$begintime,$endtime); if($v['has_ratio'] == 1){ $company_ratio = $this->getCompanyRatio($v['pay_amount'],$pc[$k]['turnover_ratio']); }else{ $company_ratio = 0; } //获取其他信息 $v = $this->getCompanyOtherInfo($v,$k); $countdata = &$user; $v['statement_money'] = 0; $v['pay_amount'] = 0; if($type < 2 && $RewardRecordRes){ $v['fine'] = $RewardRecordRes['fine']; $v['reward'] = $RewardRecordRes['reward']; $v['statement_money'] -= $v['fine']; $v['statement_money'] += $v['reward']; }else{ $v['fine'] = 0; $v['reward'] = 0; } $v['platform_amount'] = 0; if(!isset($v['list'])){continue;} $company_belong = $pc[$v['id']]['company_belong']; //服务器费用 if ($type < 2) { if ($v['has_server_fee'] == 1 && $v['server_fee'] > 0) { $v['statement_info'][] = [ "game_name"=>"服务器费用", "sum_money"=>-$v['server_fee'], "pay_amount"=>-$v['server_fee'], 'statement_type'=>1, "statement_begin_time"=>$statement_begin_time, "statement_end_time"=>$statement_end_time ]; $v['pay_amount'] -= $v['server_fee']; $v['statement_money'] -= $v['server_fee']; } } $promoteCompanyGameRatio = D("CompanyGameRatio")->getPromoteCompanyGameRatio($v['id'],$v['game_ids'],$begintime,$endtime,$company_belong); $handleed_data = []; foreach($v['list'] as $ke=>$va){ $templist = $va['game_list']; $va['game_list'] = []; foreach($templist as $p_id => $p_info){ $ratioCount = count($promoteCompanyGameRatio[$p_info['relation_game_id']]); $isMoreRatio = $ratioCount > 1 ? true : false; if(!$isMoreRatio){ $tmp_game_ratio = $promoteCompanyGameRatio[$p_info['relation_game_id']][0]; if($type == 1){ $tratio =$this->getTurnoverRatio($p_info['all_pay_amount'],$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio += $company_ratio; }elseif($type == 0){ // $tratio =$this->getTurnoverRatio($p_info['all_pay_amount'],$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); // $tratio = $tmp_game_ratio['ratio']; $turnover_type = $this->getTurnoverType($p_info['relation_game_id'],$k,$begintime,$endtime); // if ($v['id'] == 5) { // dump($p_info['all_pay_amount']); // dump($turnover_type); // dump($tmp_game_ratio); // } if ($turnover_type == 2||$turnover_type == 4) { $tratio =$this->getTurnoverRatio($p_info['all_pay_amount'],$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); } else { $tratio = $tmp_game_ratio['ratio']; } }else{ $turnover_type = $this->getTurnoverType($p_info['relation_game_id'],$k,$begintime,$endtime); if ($turnover_type == 2||$turnover_type == 4) { continue; } //补点 $tratio1 =$this->getTurnoverRatio($p_info['all_pay_amount'],$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio2 =$tmp_game_ratio['ratio']; $tratio = $tratio1-$tratio2+$company_ratio; if($tratio <= 0){ continue;} } $tratio -= 0; if($type == 2){ $p_info['increment_ratio']=$tratio; }else{ $p_info['ratio']=$tratio; } $p_info['pay_amount'] = $this->getRelationGameIdPromoteSpend($p_info["p_id"],$p_info['relation_game_id'],$tmp_game_ratio['begintime'],$tmp_game_ratio['endtime']); $p_info['pay_amount'] = number_format($p_info['pay_amount'],2,'.',''); $v['platform_amount'] += $p_info['pay_amount']; $p_info['sum_money']=round($p_info['pay_amount']*$tratio/100,2); //个人等于 结算金额*比例 $v['pay_amount'] += $p_info['sum_money']; $v['statement_money'] += $p_info['sum_money']; $p_info['fax_ratio']=$fax_ratio; $p_info['statement_begin_time']=$statement_begin_time; $p_info['statement_end_time']=$statement_end_time; $RewardRecordRes = $this->getPromoteUserGameRewardRecord($v['id'],$statement_begin_time,$statement_end_time); if ( ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] == '0') || ($handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] || $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] == '0') ) { $p_info['fine'] = 0; $p_info['reward'] = 0; } else { $p_info['fine'] = $RewardRecordRes['fine']?$RewardRecordRes['fine']:0; $p_info['reward'] = $RewardRecordRes['reward']?$RewardRecordRes['reward']:0; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['fine'] = (string)$RewardRecordRes['fine']; $handleed_data[$v['id'].$statement_begin_time.$statement_end_time]['reward'] = (string)$RewardRecordRes['reward']; } // if ($p_info['relation_game_id'] == 191 && $v['id'] == 334) { // dump($RewardRecordRes); // } $p_info['statement_type']=0; if ($p_info['pay_amount'] !='0') { $va['game_list'][] = $p_info; } }else{ for ($i=0; $i < $ratioCount; $i++) { $temp_game = []; $tmp_game_ratio = $promoteCompanyGameRatio[$p_info['relation_game_id']][$i]; if($type == 1){ $tratio =$this->getTurnoverRatio($p_info['all_pay_amount'],$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio += $company_ratio; }elseif($type == 0){ $turnover_type = $this->getTurnoverType($p_info['relation_game_id'],$k,$begintime,$endtime); // if ($v['id'] == 5) { // dump($p_info['all_pay_amount']); // dump($turnover_type); // dump($tmp_game_ratio); // } if ($turnover_type == 2 || $turnover_type == 4) { $tratio =$this->getTurnoverRatio($p_info['all_pay_amount'],$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); } else { $tratio = $tmp_game_ratio['ratio']; } }else{ $turnover_type = $this->getTurnoverType($p_info['relation_game_id'],$k,$begintime,$endtime); if ($turnover_type == 2 || $turnover_type == 4) { continue; } //补点 $tratio1 =$this->getTurnoverRatio($p_info['all_pay_amount'],$tmp_game_ratio['ratio'],$tmp_game_ratio['turnover_ratio']); $tratio2 =$tmp_game_ratio['ratio']; $tratio = $tratio1-$tratio2+$company_ratio; if($tratio <= 0){ continue;} } $tratio -= 0; if($type == 2){ $temp_game['increment_ratio']=$tratio; }else{ $temp_game['ratio']=$tratio; } $temp_game['pay_amount'] = $this->getRelationGameIdPromoteSpend($p_info["p_id"],$p_info['relation_game_id'],$tmp_game_ratio['begintime'],$tmp_game_ratio['endtime']); $temp_game['pay_amount'] -=0; $temp_game['pay_amount'] = number_format($temp_game['pay_amount'],2,'.',''); $v['platform_amount'] += $temp_game['pay_amount']; $temp_game['sum_money']=round($temp_game['pay_amount']*$tratio/100,2); //个人等于 结算金额*比例 $v['pay_amount'] += $temp_game['sum_money']; $v['statement_money'] += $temp_game['sum_money']; $temp_game['fax_ratio']=$fax_ratio-0; $temp_game['statement_begin_time']=date("Y.m.d",$tmp_game_ratio['begintime']); $temp_game['statement_end_time']=date("Y.m.d",$tmp_game_ratio['endtime']); $temp_game['statement_type']=0; $RewardRecordRes = $this->getPromoteUserGameRewardRecord($v['id'],$temp_game['statement_begin_time'],$temp_game['statement_end_time']); if ( ($handleed_data[$v['id'].$temp_game['statement_begin_time'].$temp_game['statement_end_time']]['fine'] || $handleed_data[$v['id'].$temp_game['statement_begin_time'].$temp_game['statement_end_time']]['fine'] == '0') || ($handleed_data[$v['id'].$temp_game['statement_begin_time'].$temp_game['statement_end_time']]['reward'] || $handleed_data[$v['id'].$temp_game['statement_begin_time'].$temp_game['statement_end_time']]['reward'] == '0') ) { $temp_game['fine'] = 0; $temp_game['reward'] = 0; } else { $temp_game['fine'] = $RewardRecordRes['fine']?$RewardRecordRes['fine']:0; $temp_game['reward'] = $RewardRecordRes['reward']?$RewardRecordRes['reward']:0; $handleed_data[$v['id'].$temp_game['statement_begin_time'].$temp_game['statement_end_time']]['fine'] = (string)$RewardRecordRes['fine']; $handleed_data[$v['id'].$temp_game['statement_begin_time'].$temp_game['statement_end_time']]['reward'] = (string)$RewardRecordRes['reward']; } // if ($p_info['relation_game_id'] == 191 && $v['id'] == 334) { // dump($RewardRecordRes); // } $temp_game['statement_type']=0; $temp_game['relation_game_id']=$p_info["relation_game_id"]; $temp_game['game_name']=$p_info["game_name"]; $temp_game['game_type_name']=$p_info["game_type_name"]; $temp_game['all_pay_amount']=$p_info["all_pay_amount"]; if ($temp_game['pay_amount'] != '0') { $va['game_list'][] = $temp_game; } } } } $v['statement_info'][] = $va; } $company_info = [ 'account'=>$v['account'], "company_relation_str"=>$v['company_relation_str'], "company_belong_str"=>$v['company_belong_str'], "company_type_str"=>$v['company_type_str'], "nickname"=>$v['nickname'], "payee_name"=>$v['payee_name'], "bank_account"=>$v['bank_account'], "opening_bank"=>$v['opening_bank'], "ali_user"=>$v['ali_user'], "ali_account"=>$v['ali_account'] ]; if($v['platform_amount'] < 300){ $lackcompany =[ "company_id"=>$k, "company_type"=>2, "company_name"=>$v['partner'], "company_info"=>json_encode($company_info,JSON_UNESCAPED_UNICODE), "statement_money"=>$v['statement_money'], "pay_amount"=>$v['pay_amount'], "platform_amount"=>$v['platform_amount'], "fine"=>$v['fine'], "reward"=>$v['reward'], "statement_begin_time"=>$begintime, "statement_end_time"=>$endtime, "statement_pool_num"=>$countdata['statement_num'],//母单 "is_payment"=>$v['is_payment'], "statement_info"=>json_encode($v['statement_info'],JSON_UNESCAPED_UNICODE) ]; } $is_continue = false; $statement_data = $v['statement_info']; foreach ($statement_data as $skey => $sval) { if ($sval['game_list']) { $is_continue = true; } // dump($sval); } if (!$is_continue) { continue; } //无需补点不统计其他金额 if($type == 2 && $v['statement_money'] == 0){ continue ; } //聚合未结算数据 $lsres = $LackStatement->where("company_id='{$k}' and is_pool = 0")->select(); $del_lack_ids = []; if(count($lsres) > 0){ //进行聚合 foreach($lsres as $key=>$val){ $del_lack_ids[] = $val['id']; $v['statement_money'] += $val['statement_money']; $v['pay_amount'] += $val['pay_amount']; $v['fine'] += $val['fine']; $v['reward'] += $val['reward']; $v['platform_amount'] += $val['platform_amount']; $t_statement_info = json_decode($val['statement_info'],true); $statement_info = []; foreach($t_statement_info as $p=>$info){ $statement_info[$info['account']] = $info['game_list']; } foreach($v['statement_info'] as $p=>$info){ if(isset($statement_info[$info['account']])){ $v['statement_info'][$p]['game_list'] = array_merge($statement_info[$info['account']],$v['statement_info'][$p]['game_list']); unset($statement_info[$info['account']]); } } if(!empty($statement_info)){ foreach($statement_info as $p=>$info){ $v['statement_info'][] = ["account"=>$p,"game_list"=>$info]; } } } } if($v['platform_amount'] == 0 && $v['statement_money'] == 0){ continue ; } if($v['platform_amount'] < 300){ //存未满 // if($lackcompany['pay_amount'] != 0){ $lask_id = $LackStatement->add($lackcompany); $countdata['create_lack_ids'][] =$lask_id; $countdata['lack_statement_money'] +=$lackcompany['statement_money']; $countdata['lack_platform_amount'] +=$lackcompany['platform_amount']; // } }else{ // if($v['pay_amount'] != 0){ //存成功配置单号 $company =[ "pool_id"=>0, "company_id"=>$k, "company_type"=>2, "company_name"=>$v['partner'], "company_info"=>json_encode($company_info,JSON_UNESCAPED_UNICODE), "statement_money"=>$v['statement_money'], "pay_amount"=>$v['pay_amount'], "platform_amount"=>$v['platform_amount'], "fine"=>$v['fine'], "reward"=>$v['reward'], "statement_begin_time"=>$begintime, "statement_end_time"=>$endtime, "statement_info"=>json_encode($v['statement_info'],JSON_UNESCAPED_UNICODE), "statement_num"=>"JS_".date('Ymd').date('His').$v['company_id'].sp_random_string(5) ]; if($v['is_payment'] == 1){ $company['verify_status'] = 0; }else{ $company['verify_status'] = 2; } $companyid = $StatementInfo->add($company); $countdata['info_ids'][] =$companyid; $countdata['del_lack_ids'] =array_merge($countdata['del_lack_ids'],$del_lack_ids); $countdata['statement_money'] +=$v['statement_money']; $countdata['pay_amount'] +=$v['pay_amount']; $countdata['platform_amount'] +=$v['platform_amount']; $countdata['fine'] +=$v['fine']; $countdata['reward'] +=$v['reward']; // } } } } /** * 保存信息汇总信息 */ public function savePromotateUserPool($data){ if(IS_CLI){ $op_name ="system"; }else{ $op_name =$_SESSION['onethink_admin']['user_auth']["username"]; } if(empty($data['create_lack_ids']) && empty($data['del_lack_ids']) && empty($data['info_ids'])){ //补点为空不重算 return ; } if($data['statement_money'] == 0){ $data['verify_status'] = 5; $data['verify_log'] = json_encode(["create_user"=>$op_name,"create_time"=>date("Y-m-d H:i:s"),"verify_user"=>"system","verify_time"=>date("Y-m-d H:i:s"),"payment_user"=>"system","payment_time"=>date("Y-m-d H:i:s")]); }else{ $data['verify_log'] = json_encode(["create_user"=>$op_name,"create_time"=>date("Y-m-d H:i:s")]); } $data['create_lack_ids'] = implode(",",$data['create_lack_ids']); $data['del_lack_ids'] = implode(",",$data['del_lack_ids']); $info = implode(",",$data['info_ids']); unset($data['info_ids']); $id = SM("company_statement_pool","tab_")->add($data); //回写 if(!empty($info)){ $save["pool_id"]=$id; SM("company_statement_info","tab_")->where("id in ({$info})")->save($save); } if(!empty($data['del_lack_ids'])){ SM("company_lack_statement_info","tab_")->where("id in ({$data['del_lack_ids']})")->save(["is_pool"=>1]); } } /** * 获取公司额为信息 */ public function getCompanyOtherInfo($company_info,$company_id) { $pl = M("promote_company","tab_") ->alias('pc') ->field("p.account,p.company_relation,IFNULL(s.real_name,'-') nickname") ->join("left join (select company_id,account,company_relation,admin_id from tab_promote where level = 1 group by company_id ) p on p.company_id = pc.id")//获取会长 ->join("left join sys_member s on s.uid = p.admin_id") ->where("pc.id = {$company_id}") ->find(); $company = array_merge($company_info,$pl); $company['company_relation_str'] =getCompanyRelation($company['company_relation']); $company['company_belong_str'] =getCompanyBlong($company['company_belong']); $company['company_type_str'] = "个人"; return $company; } /** * 获取游戏分类名称 */ public function getGameTypeName($relation_game_id){ return M("Game","tab_")->field("game_type_name")->where("relation_game_id = '{$relation_game_id}'")->find()['game_type_name']; } /** * 获取公司比例加成 * @param [type] $paymount 支付金额 * @param [type] $turnover_ratio 梯度 */ protected function getCompanyRatio($paymount,$turnover_ratio) { $ratio = 0; foreach($turnover_ratio as $k=>$v){ if($v['instanceof'] == 1){ if($paymount >= $v['turnover']){ $ratio = $v['ratio']; } }else{ if($paymount > $v['turnover']){ $ratio = $v['ratio']; } } } return $ratio; } /** * 获取游戏奖罚 */ protected function getPromoteUserGameRewardRecord($cpmpamy_id,$begintime,$endtime) { $begintime = strtotime(str_replace('.','-',$begintime)); $endtime = strtotime(str_replace('.','-',$endtime))+86499; //获取所有公司的奖罚 $rrmap = array( "d.confirm_time" => ['between', [$begintime,$endtime]], "d.company_type"=>2, "d.company_id"=>$cpmpamy_id, "d.settlement_type"=>2, // "relation_game_id"=>$relation_game_id, ); $rfres = M("RewardDetail","tab_") ->alias("d") ->field(" IFNULL(SUM(CASE WHEN type = 1 THEN amount ELSE 0 END),0) as reward, IFNULL(SUM(CASE WHEN type = 2 THEN amount ELSE 0 END),0) as fine") ->join('tab_reward_record as r on d.record_id = r.id', 'LEFT') ->where($rrmap) ->group("company_id") ->find(); // $rfres = M('reward_record', 'tab_') // ->alias('r') // ->field(" // IFNULL(SUM(CASE WHEN type = 1 THEN amount ELSE 0 END),0) as reward, // IFNULL(SUM(CASE WHEN type = 2 THEN amount ELSE 0 END),0) as fine") // ->where($rrmap) // ->join('tab_reward_detail as d on d.record_id = r.id', 'LEFT') // ->group("company_id") // ->find(); // if ($relation_game_id == 191 && $cpmpamy_id == 334) { // dump($rfres); // } if(empty($rfres)){ return false; }else{ return $rfres; } } /** * 获取上游游戏奖罚 */ protected function getPromoteUserGameRewardRecordCp($cpmpamy_id,$begintime,$endtime) { $begintime = strtotime(str_replace('.','-',$begintime)); $endtime = strtotime(str_replace('.','-',$endtime))+86499; //获取所有公司的奖罚 $rrmap = array( "d.confirm_time" => ['between', [$begintime,$endtime]], "d.company_type"=>1, "d.company_id"=>$cpmpamy_id, "d.settlement_type"=>2, // "relation_game_id"=>$relation_game_id, ); $rfres = M("RewardDetail","tab_") ->alias("d") ->field(" IFNULL(SUM(CASE WHEN type = 1 THEN amount ELSE 0 END),0) as reward, IFNULL(SUM(CASE WHEN type = 2 THEN amount ELSE 0 END),0) as fine") ->join('tab_reward_record as r on d.record_id = r.id', 'LEFT') ->where($rrmap) ->group("company_id") ->find(); if(empty($rfres)){ return false; }else{ return $rfres; } } /** * 获取公司奖罚 */ protected function getPromoteUserRewardRecord($cpmpamy_id,$begintime,$endtime) { //获取所有公司的奖罚 $rrmap = array( "d.confirm_time" => ['between', [$begintime,$endtime]], "d.company_type"=>2, "d.company_id"=>$cpmpamy_id, "d.settlement_type"=>2, ); $rfres = M("RewardDetail","tab_") ->alias("d") ->field(" IFNULL(SUM(CASE WHEN type = 1 THEN amount ELSE 0 END),0) as reward, IFNULL(SUM(CASE WHEN type = 2 THEN amount ELSE 0 END),0) as fine") ->where($rrmap) ->group("company_id") ->find(); if(empty($rfres)){ return false; }else{ return $rfres; } } /** * 获取比例 * * @param [type] $amount 总额 * @param [type] $ratio 默认比例 * @param [type] $turnover_ratio 比例梯度 * @return void */ protected function getTurnoverRatio($amount,$ratio,$turnover_ratio) { if(empty($turnover_ratio)){ return $ratio; } if(!is_array($turnover_ratio)){ $turnover_ratio = json_decode($turnover_ratio,true); } foreach($turnover_ratio as $k=>$v){ if($v['instanceof'] == 1){ if($amount >= $v['turnover']){ $ratio = $v['ratio']; } }else{ if($amount > $v['turnover']){ $ratio = $v['ratio']; } } } return $ratio; } protected function getRelationGameIdSpend($company_id,$relation_game_id,$begintime,$endtime) { $res = []; //获取推广员 $Promote = M("Promote","tab_"); $Spend = M("Spend","tab_"); $spenMap = [ "s.pay_status"=>1, "s.payed_time"=>['between', [$begintime,$endtime]], "s.is_check"=>1 ]; $company_id = $company_id; $pres = $Promote->field("group_concat(id) ids,count(id) count")->where("company_id = '{$company_id}'")->group("company_id")->find(); if($pres['count'] ==0 ){return 0;} $spenMap['s.promote_id']=["in",$pres['ids']]; //游戏 $game_id = D("Game")->changeRelationGameidToGameid($relation_game_id); // dd($game_id); $spenMap['s.game_id'] =['in',$game_id]; D("Spend")->addSubsiteWhere($spenMap); //获取支付记录 $pay_amount = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount')->where($spenMap)->find(); return $pay_amount['pay_amount'] ?? 0; } protected function getRelationGameIdPromoteSpend($promote_id,$relation_game_id,$begintime,$endtime) { $res = []; //获取推广员 $Promote = M("Promote","tab_"); $Spend = M("Spend","tab_"); $spenMap = [ "s.pay_status"=>1, "s.payed_time"=>['between', [$begintime,$endtime]], "s.is_check"=>1 ]; D("Spend")->addSubsiteWhere($spenMap); $Pmap = [ "chain"=>["LIKE","%/{$promote_id}/%"], "_logic"=>"OR", "id"=>$promote_id ]; $pres = $Promote->field("group_concat(id) ids,count(id) count")->where($Pmap)->group("company_id")->find(); if($pres['count'] ==0 ){return 0;} $spenMap['s.promote_id']=["in",$pres['ids']]; //游戏 $game_id = D("Game")->changeRelationGameidToGameid($relation_game_id); // dd($game_id); $spenMap['s.game_id'] =['in',$game_id]; //获取支付记录 $pay_amount = $Spend->alias('s')->field('sum(s.pay_amount) pay_amount')->where($spenMap)->find(); return $pay_amount['pay_amount'] ?? 0; } /** * 获取游戏是否有特殊比例,返回没有特殊比例的游戏 * return string "148,157" */ protected function getModuleRatioGame($company_id,$relation_game_ids,$begintime,$endtime){ $where = [ "relation_game_id"=>["in",$relation_game_ids], "company_id"=>$company_id, "_string"=>"begin_time <={$endtime} AND ( end_time = 0 OR end_time >= {$begintime})" ]; $dbres = D("CompanyGameRatio")->field("relation_game_id")->where($where)->select(); if (!$dbres) { $company_belong = M("promote_company","tab_")->field("company_belong")->where(['id'=>$company_id])->find(); $where = [ "company_id"=>0, "company_belong"=>$company_belong['company_belong'], "relation_game_id"=>["in",$relation_game_ids], "_string"=>"begin_time <={$endtime} AND ( end_time = 0 OR end_time >= {$begintime})" ]; $dbres = D("CompanyGameRatio")->field("relation_game_id")->where($where)->select(); } if(is_string($relation_game_ids)) $relation_game_ids = explode(",",$relation_game_ids); $array_mer = []; foreach ($relation_game_ids as $key => $value) { $turnover_type = $this->getTurnoverType($value,$company_id,$begintime,$endtime); if ($turnover_type == 2 || $turnover_type == 3 || $turnover_type == 4) { $mercy_game = M("game",'tab_')->field("original_package_name")->where(['relation_game_id'=>$value])->find()['original_package_name']; $original_game_id = M("game",'tab_') ->field("relation_game_id") ->where(['original_package_name'=>$mercy_game,'relation_game_id'=>['neq',$value]]) ->group("relation_game_id") ->select(); foreach ($original_game_id as $k => $v) { if(!in_array($v['relation_game_id'], $relation_game_ids)){ $array_mer[] = $v['relation_game_id']; } } } } $relation_game_ids = array_merge($relation_game_ids,$array_mer); if(empty($dbres)){ return implode(",",$relation_game_ids); }else{ $dbres = array_column($dbres,"relation_game_id"); $diff = array_diff($relation_game_ids,$dbres); return implode(",",$diff); } } /** * 识别游戏为同款游戏,共享流水分成比例 * return [ * 148 =>["148","157"], * 157=>["148","157"] * ] */ protected function getTheSameGame($relation_game_ids) { if(empty($relation_game_ids)) return []; $where = [ "id"=>["in",$relation_game_ids] ]; $Gameinfo = D("Game")->field("relation_game_id,partner_id,original_package_name")->where($where)->select(); if(empty($Gameinfo)){ return []; } $data = []; foreach ($Gameinfo as $k => $v) { if(empty($v['original_package_name'])) continue; if(!isset($data[$v['partner_id']])){ $data[$v['partner_id']] = []; } if(!isset($data[$v['partner_id']][$v['original_package_name']])){ $data[$v['partner_id']][$v['original_package_name']] = [$v['relation_game_id']]; }else{ $data[$v['partner_id']][$v['original_package_name']][] = $v['relation_game_id']; } } $senddata = []; foreach ($data as $k => $partenr) { foreach($partenr as $ke => $game){ $gamecount = count($game); if($gamecount > 1){ for ($i=0; $i < $gamecount; $i++) { $senddata[$game[$i]] = $game; } } } } return $senddata; } /** * 重算接口 * 不进行结算方式重算 * @param [type] $id 原数据id * @param string $admin_user 操作用户 * @return void bool */ public function updateCompanyStatementData($id,$admin_user='system') { //获取数据 $StatementDb = SM("CompanyStatement","tab_"); $dbres = $StatementDb->where("id='{$id}'")->find(); //获取时间 $stime = $dbres['statement_end_time']-0+1; $company_id = $dbres['company_id']; if($company_id == 0){ $savedata = $this->officeCompanyStatement($stime,true); }else{ if($dbres['company_belong'] == 9){ //上游 $savedata = $this->cpStatement($dbres['withdraw_type'],$stime,$company_id); }else{ $savedata = $this->promoteCompanyStatement($dbres['withdraw_type'],$stime,$company_id); } } //重写用户 $savedata['verify_log'] = json_encode(["create_user"=>$admin_user,"create_time"=>date("Y-m-d H:i:s")]); $savedata['verify_status'] = 0; $savedata['confirm_status'] = 0; $savedata['confirm_log'] = ''; $savedata['id'] = $dbres['id']; return $StatementDb->save($savedata); } }