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

379 lines
11 KiB
PHP

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace Admin\Controller;
use Think\Controller;
/**
* 聚合渠道结算接口对接
* @author cz
*/
class AggregateFinanceSetController extends Controller {
public $apihost;
public $cpapihost;
public $token = "LYHTQDJS";
public function _initialize(){
$apihost = M("Kv")->field("value")->where("`key` = 'aggregate_finance_api'")->find();
$cpapihost = M("Kv")->field("value")->where("`key` = 'aggregate_cp_settlement_api'")->find();
if(empty($apihost) || empty($cpapihost)){
echo "请先设置请求接口aggregate_finance_api和aggregate_cp_settlement_api的值".PHP_EOL;die;
}
$this->apihost = $apihost['value'];
$this->cpapihost = $cpapihost['value'];
}
public function setFreeDateCount($begin,$end='')
{
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]);
}
}
public function setDailyCount($stime="now")
{
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){
echo $nowdate.":".PHP_EOL;
echo "--周结begin".PHP_EOL;
// $this->setWeekCount($stime);
$this->cpStatement(0,$stime);
}
if($d == 1){
echo $nowdate.":".PHP_EOL;
echo "--月结&补点begin".PHP_EOL;
// $this->setMonthCount($stime);
$this->cpStatement(1,$stime);
// $this->cpStatement(2,$stime);
}
}else{
echo $nowdate."非周一和月初,无需任何处理".PHP_EOL;
}
}
protected function setWeekCount($stime)//进行周结
{
$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;
$this->getAndSaveData(0,$begintime,$endtime);
}
protected function setMonthCount($stime)//进行周结
{
$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;//上个月的月末时间戳
//普通月结
$this->getAndSaveData(1,$begintime,$endtime);
//补点
$this->getAndSaveData(2,$begintime,$endtime);
}
protected function getAndSaveData($type,$begintime,$endtime)
{
$sign = md5($begintime.$endtime.$type.$this->token);
$arr = [
"begintime"=>$begintime,
"endtime"=>$endtime,
"type"=>$type,
"sign"=>$sign
];
$dataurl .= $this->apihost."&".http_build_query($arr);
$html = file_get_contents($dataurl);
$rsp = json_decode($html,true);
if($rsp['code'] != 1){
echo $rsp['error'].PHP_EOL;die;
}
//成功插入
$Aggregate = M("aggregate_statement","tab_");
$begintimestr = date("Y-m-d",$begintime);
$endtimestr = date("Y-m-d",$endtime);
if($rsp['count'] > 0){
//插入数据
foreach ($rsp['data'] as $k => $v) {
foreach ($v["game_list"] as $ke => &$va) {
$va['begintime'] = $begintimestr;
$va['endtime'] = $endtimestr;
$va['fax_ratio'] = 0;
}
$v["statement_info"] = json_encode($v["game_list"],JSON_UNESCAPED_UNICODE);
unset($v["game_list"]);
$v['begintime'] = $begintime;
$v['endtime'] = $endtime;
$v['create_time'] = time();
$v['admin_name'] = "system";
$v['admin_id'] = 0;
$v['second_party_info'] = json_encode([
"partner"=>$v['channel_name']
],JSON_UNESCAPED_UNICODE);
$Aggregate->add($v);
}
}
if($type == 0){
echo "----周结统计ok".PHP_EOL;
}elseif($type == 1){
echo "----月结统计ok".PHP_EOL;
}elseif($type == 2){
echo "----补点统计ok".PHP_EOL;
}
}
/**
* 重算聚合接口数据
* @param [type] $id
* @return void
*/
public function updateAggregateFinanceData($id)
{
//获取基础信息
$Aggregate = M("aggregate_statement","tab_");
$info = $Aggregate->where("id='{$id}'")->find();
$sign = md5($info['begintime'].$info['endtime'].$info['withdraw_type'].$this->token);
$arr = [
"begintime"=>$info['begintime'],
"endtime"=>$info['endtime'],
"type"=>$info['withdraw_type'],
"sign"=>$sign,
"channel_id"=>$info['channel_id']
];
$dataurl .= $this->apihost."&".http_build_query($arr);
$html = file_get_contents($dataurl);
$rsp = json_decode($html,true);
if($rsp['code'] != 1){
echo $rsp['error'].PHP_EOL;die;
}
//更新信息
$begintimestr = date("Y-m-d",$info['begintime']);
$endtimestr = date("Y-m-d",$info['endtime']);
if($rsp['count'] > 0){
//插入数据
foreach ($rsp['data'] as $k => $v) {
foreach ($v["game_list"] as $ke => &$va) {
$va['begintime'] = $begintimestr;
$va['endtime'] = $endtimestr;
$va['fax_ratio'] = 0;
}
$v["statement_info"] = json_encode($v["game_list"],JSON_UNESCAPED_UNICODE);
unset($v["game_list"]);
$v['create_time'] = time();
$v['admin_name'] = $_SESSION['onethink_admin']['user_auth']['username'];
$v['admin_id'] = $_SESSION['onethink_admin']['user_auth']['uid'];
$v['verify_status'] = 0;
$first_party_info = json_decode($info['first_party_info'], 1);
if($first_party_info['partner'] == $info['channel_name']){
$v['second_party_info'] = $info['first_party_info'];
$v['first_party_info'] = $info['second_party_info'];
$v['pay_type'] =0;
}
$res = $Aggregate->where("id='{$id}'")->save($v);
if(empty($res)){
return false;
}
}
}else{
$savedata = [
"create_time"=>time(),
"admin_name"=>$_SESSION['onethink_admin']['user_auth']['username'],
"admin_id"=>$_SESSION['onethink_admin']['user_auth']['uid'],
"verify_status"=>0,
"statement_info"=>json_encode([],JSON_UNESCAPED_UNICODE),
"ratio_money"=>0,
"pay_money"=>0
];
$first_party_info = json_decode($info['first_party_info'], 1);
if($first_party_info['partner'] == $info['channel_name']){
$savedata['second_party_info'] = $info['first_party_info'];
$savedata['first_party_info'] = $info['second_party_info'];
$savedata['pay_type'] =0;
}
$res = $Aggregate->where("id='{$id}'")->save($savedata);
if(empty($res)){
return false;
}
}
return true;
}
/**
* 上游结算
* @param [string] $type 0:周结 1:月结 2周结补点
*/
public function cpStatement($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;//上个月的月末时间戳
}
//获取哪些要结算
if($type == 1){
$cpDbRes = M("Partner","tab_")->where("settlement_type = 2")->select();
}else{
$cpDbRes = M("Partner","tab_")->where("settlement_type = 1")->select();
}
$cpList=[];
foreach ($cpDbRes as $k => $v) {
$cpList[$v['id']] =$v;
}
$cp_id = implode(",",array_flip(array_flip(array_column($cpDbRes,'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);
$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] = ["pay_money"=>$va['pay_money']];
}
}
}else{
$cpList[$k]["list"] = $v["list"];
}
}
//比例计算及保存
foreach($cpList as $v){
dd($v);
}
# code...
}
/**
* 获取本地上游结算
*/
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")->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,
"payed_time"=>["BETWEEN",[$begintime,$endtime]],
"game_id"=>["in",$gmstr]
];
$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{
$game_name = $v['original_package_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;
}
}