diff --git a/Application/Admin/Controller/CompanyStatementPoolController.class.php b/Application/Admin/Controller/CompanyStatementPoolController.class.php index 83f736809..0cb2f2dca 100644 --- a/Application/Admin/Controller/CompanyStatementPoolController.class.php +++ b/Application/Admin/Controller/CompanyStatementPoolController.class.php @@ -1264,6 +1264,13 @@ class CompanyStatementPoolController extends ThinkController $v['company_info'] = json_decode($v['company_info'],true); $v['statement_begin_time'] = date('Y.m.d',$v['statement_begin_time']); $v['statement_end_time'] = date('Y.m.d',$v['statement_end_time']); + + if($is_export){ + $v['remark'] = str_replace(";","\n",$v['remark']); + }else{ + $v['remark'] = str_replace(";","
",$v['remark']); + } + if( isset($v['verify_status'])){ if( $v['verify_status'] ==2 ){ $v['is_payment'] = 2; //不打款 diff --git a/Application/Admin/Controller/CompanyStatementSetController.class.php b/Application/Admin/Controller/CompanyStatementSetController.class.php index 387c29f3e..46528127d 100644 --- a/Application/Admin/Controller/CompanyStatementSetController.class.php +++ b/Application/Admin/Controller/CompanyStatementSetController.class.php @@ -307,7 +307,7 @@ class CompanyStatementSetController extends Controller { $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(); + $game_id = $GameDb->where("(relation_game_name='{$ke}' OR original_package_name='{$ke}') and partner_id = '{$add_data['company_id']}'")->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(); diff --git a/Application/Admin/Controller/GameApiController.class.php b/Application/Admin/Controller/GameApiController.class.php index fed0e08b4..a8a5a2c95 100644 --- a/Application/Admin/Controller/GameApiController.class.php +++ b/Application/Admin/Controller/GameApiController.class.php @@ -4,6 +4,7 @@ */ namespace Admin\Controller; use Admin\Model\SpendModel; +use Base\Service\GameRebateService; use Think\Think; use Base\Tool\Printer; use Base\Tool\TaskClient; @@ -114,4 +115,18 @@ class GameApiController extends Think { $result = $gameResource->apply($order, $role); var_dump($result); } + + public function rebateSend() + { + $service = new GameRebateService(); + $service->sendAll('A'); + $service->sendAll('B'); + $service->sendAll('C'); + } + + public function rebateSendDaily() + { + $service = new GameRebateService(); + $service->sendDaily(date('Y-m-d')); + } } diff --git a/Application/Admin/Controller/GameMarginSetController.class.php b/Application/Admin/Controller/GameMarginSetController.class.php index b7dbc78cb..1ed16b54f 100644 --- a/Application/Admin/Controller/GameMarginSetController.class.php +++ b/Application/Admin/Controller/GameMarginSetController.class.php @@ -373,12 +373,14 @@ class GameMarginSetController extends Controller { }else{ $ratio = $val['second_ratio']; } + $statement_money = round( $this->adddata[$game]['pay_amount'] / $val['pay_amount'] * $val['sum_money'],2); if( array_key_exists("cp_statement_amount",$this->adddata[$game]) ){ $this->adddata[$game]['cp_statement_amount'] += $statement_money; }else{ $this->adddata[$game]['cp_statement_amount'] = $statement_money; } + $this->adddata[$game]['cp_promote_ratio'] = $val['promote_ratio']; $this->adddata[$game]['cp_ratio'] = $ratio; } @@ -391,7 +393,7 @@ class GameMarginSetController extends Controller { { $where = [ "partner_id"=>$company_id, - "_string"=>"original_package_name = '{$OPName}' OR relation_game_name = '{$OPName}'" + "_string"=>"( original_package_name = '{$OPName}' AND select_package_name = 0 ) OR ( relation_game_name = '{$OPName}' AND select_package_name = 1 )" ]; $game = M("Game","tab_")->field("relation_game_name")->where($where)->group("relation_game_name")->select(); if($game){ diff --git a/Application/Admin/Controller/GameRebateController.class.php b/Application/Admin/Controller/GameRebateController.class.php new file mode 100644 index 000000000..cd75e6b33 --- /dev/null +++ b/Application/Admin/Controller/GameRebateController.class.php @@ -0,0 +1,183 @@ +records('A'); + } + + public function accumulative() + { + $this->records('C'); + } + + public function daily() + { + $this->records('B'); + } + + public function records($awardType) + { + $page = I('p', 1); + $row = I('row', 10); + $baseGameId = I('base_game_id', 0); + $serverId = I('server_id', ''); + $roleName = I('role_name', ''); + $userAccount = I('user_account', ''); + $reviewStatus = I('review_status', -1); + $sendStatus = I('send_status', -1); + $reviewerId = I('reviewer_id', 0); + + $where = [ + '_string' => '1=1', + ]; + $where['type'] = $awardType; + if ($baseGameId != 0) { + $where['base_game_id'] = $baseGameId; + } + if ($userAccount != '') { + $where['user_account'] = ['like', $userAccount . '%']; + } + if ($roleName != '') { + $where['role_name'] = ['like', $roleName . '%']; + } + if ($serverId != '') { + $where['server_id'] = $serverId; + } + if ($reviewStatus != -1) { + $where['review_status'] = $reviewStatus; + } + if ($sendStatus != -1) { + $where['send_status'] = $sendStatus; + } + if ($reviewerId != 0) { + $where['reviewer_id'] = $reviewerId; + } + + if (I('send_time_start', '') != '') { + $where['_string'] .= ' and send_time>=' . strtotime(I('send_time_start') . ' 00:00:00'); + } + if (I('send_time_end', '') != '') { + $where['_string'] .= ' and send_time<=' . strtotime(I('send_time_end') . ' 23:59:59'); + } + + $query = M('rebate_orders', 'tab_')->where($where); + + $records = []; + if (I('export', 0) == 1 || $row == 'all') { + $records = $query->select(); + } else { + $countQuery = clone $query; + $records = $query->page($page, $row)->select(); + $count = $countQuery->count(); + } + + $sendStatusList = [ + 0 => '待发放', + 1 => '发放成功', + 2 => '发放异常', + ]; + + $reviewStatusList = [ + 0 => '待审核', + 1 => '审核通过', + 2 => '审核拒绝', + ]; + + $pageTitles = [ + 'A' => '单笔充值福利', + 'B' => '月卡福利发放', + 'C' => '累充福利发放', + ]; + $pageTitle = $pageTitles[$awardType]; + if (count($records) > 0) { + foreach ($records as $key => $record) { + $records[$key]['review_status_text'] = $reviewStatusList[$record['review_status']]; + $records[$key]['review_time'] = $record['review_time'] > 0 ? date('Y-m-d H:i:s', $record['review_time']) : '--'; + $records[$key]['send_status_text'] = $sendStatusList[$record['send_status']]; + $records[$key]['send_time'] = $record['send_time'] > 0 ? date('Y-m-d H:i:s', $record['send_time']) : '--'; + $records[$key]['award_date_range'] = is_null($record['award_started_at']) || is_null($record['award_ended_at']) + ? '' : $record['award_started_at'] . ' ~ ' . $record['award_ended_at']; + $records[$key]['gift_content'] = implode('
', explode('|', $record['gift_content'])); + } + if (I('export', 0) == 1) { + $field = [ + 'base_game_name' => '游戏名称', + 'server_name' => '区服', + 'user_account' => '账号', + 'role_id' => '角色ID', + 'role_name' => '角色名称', + 'pay_amount' => '充值金额', + 'gift_content' => '奖励内容', + 'review_status_text' => '审核状态', + 'review_time' => '审核时间', + 'send_status_text' => '发放状态', + 'send_time' => '发放时间', + 'reviewer_username' => '审核人', + ]; + + addOperationLog(['op_type'=>3,'key'=>getNowDate(),'op_name'=>'导出' . $pageTitle . '记录','url'=>U('GameRebate/records'),'menu'=>'推广员-发放福利管理-' . '导出' . $pageTitle . '记录']); + + data2csv($records, $pageTitle, $field); + exit; + } + } + $page = set_pagination($count, $row == 'all' ? 99999999 : $row); + + if($page) { + $this->assign('_page', $page); + } + + $admins = M('ucenter_member', 'sys_')->field(['id', 'username'])->select(); + $baseGames = M('base_game', 'tab_')->select(); + + $gameRepository = new GameRepository(); + $this->assign('pageTitle', $pageTitle); + $this->assign('awardType', $awardType); + $this->assign('servers', $gameRepository->getServersByBaseGameId($baseGameId)); + $this->assign('admins', $admins); + $this->assign('baseGames', $baseGames); + $this->assign('sendStatusList', $sendStatusList); + $this->assign('reviewStatusList', $reviewStatusList); + $this->assign('records', $records); + $this->display('records'); + } + + public function review() + { + $ids = I('ids', []); + $status = I('status', 0); + try { + $service = new GameRebateService(); + $service->review($ids, $status); + $this->ajaxReturn([ + 'status' => 1, + 'message' => '操作成功' + ]); + } catch (\Exception $e) { + $this->ajaxReturn([ + 'status' => 0, + 'message' => $e->getMessage() + ]); + } + } + + public function getServers() + { + $gameId = I('game_id', 0); + $gameRepository = new GameRepository(); + $servers = $gameRepository->getServersByBaseGameId($gameId); + return $this->ajaxReturn(['status' => 1, 'message' => '获取成功', 'data' => ['servers' => $servers]]); + } +} diff --git a/Application/Admin/Controller/MarketPercentageController.class.php b/Application/Admin/Controller/MarketPercentageController.class.php index c6494cc60..61245096f 100644 --- a/Application/Admin/Controller/MarketPercentageController.class.php +++ b/Application/Admin/Controller/MarketPercentageController.class.php @@ -122,9 +122,10 @@ class MarketPercentageController extends ThinkController // var_dump($map);die(); $data = SM("settleup_marketorder", "tab_") - ->field("pay_time,promote_account,company_name,company_belong,real_name,develop_type,game_name, + ->field("id,pay_time,promote_account,company_name,company_belong,real_name,develop_type,game_name, sum(pay_amount) pay_amount,sum(cp_amount) cp_amount,sum(promote_amount) promote_amount, - sum(channel_amount) channel_amount, sum(company_tax) company_tax,sum(company_profit) company_profit"); + sum(channel_amount) channel_amount, sum(company_tax) company_tax,sum(company_profit) company_profit, + other_amount,refund_amount"); if ($_REQUEST['export']) { $data = $data->where($map) @@ -142,7 +143,8 @@ class MarketPercentageController extends ThinkController $sum = SM("settleup_marketorder", "tab_") ->field("pay_time,promote_account,company_belong,real_name,develop_type,game_name, sum(pay_amount) pay_amount,sum(cp_amount) cp_amount,sum(promote_amount) promote_amount, - sum(channel_amount) channel_amount, sum(company_tax) company_tax,sum(company_profit) company_profit") + sum(channel_amount) channel_amount, sum(company_tax) company_tax,sum(company_profit) company_profit, + sum(other_amount) other_amount,sum(refund_amount) refund_amount") ->where($map) ->find(); @@ -181,9 +183,11 @@ class MarketPercentageController extends ThinkController 'develop_type' => '类型', 'game_name' => '游戏名称', 'pay_amount' => '总流水', - 'cp_amount' => '上游结算流水', - 'promote_amount' => '下游结算流水', + 'cp_amount' => '上游结算额', + 'promote_amount' => '下游结算额', 'channel_amount' => '支付渠道费用', + 'refund_amount'=>'退款金额', + 'other_amount'=>'返点及其他', 'company_tax' => '公司税费', 'company_profit' => '税后毛利额']; @@ -221,6 +225,22 @@ class MarketPercentageController extends ThinkController $this->display(); } + public function otherAmountEdit() + { + if(!array_key_exists('id',$_REQUEST) || !array_key_exists('other_amount',$_REQUEST)){ + $this->ajaxReturn(['status'=>0,'msg'=>'参数错误']); + } + $id = I("id"); + $other_amount = I("other_amount"); + $dbres = M("settleup_marketorder","tab_")->where("id = {$id}")->find(); + $save = [ + 'id'=>$id, + 'company_profit'=>$dbres['company_profit']-($other_amount-$dbres['other_amount']), + 'other_amount'=>$other_amount + ]; + M("settleup_marketorder","tab_")->save($save); + $this->ajaxReturn(['status'=>1,'msg'=>'其他扣款添加成功']); + } public function indexuncaculate($row = 10, $p = 1) { @@ -1275,19 +1295,23 @@ class MarketPercentageController extends ThinkController public function reCaculateBonus() { - - $pay_time = $_REQUEST['pay_time']; - - if (!$pay_time) { - $pay_time = "all"; -// $pay_time = date("Y-m",strtotime('-1 month')); + $type = $_REQUEST['type']; + if(empty($type)){ + die('参数错误'); + } + if($type == 1){ + $action = "caculateMarketStream/time"; + }else{ + $action = "createMarketBonus/pay_time"; + } + $pay_time = date( 'Y-m', strtotime( 'last day of -1 months' ) ); + $params = "php ".SUBSITE_INDEX." Timing/{$action}/{$pay_time}"; + $r = D("CmdTasks")->addTask("MarketPerformanceSet",$params); + if($r){ + $this->ajaxReturn(["status"=>"1",'msg'=>"任务添加成功,大约需等待5分钟后生成"]); + }else{ + $this->ajaxReturn(["status"=>"0","msg"=>'任务添加失败']); } - -// var_dump("cd ".ROOTTT.";php admin.php timing/caculateMarketStream/time/{$pay_time} > /dev/null &");die(); - - exec("source /etc/profile;cd " . ROOTTT . ";php " . SUBSITE_INDEX . " timing/caculateMarketStream/time/{$pay_time} > /dev/null &"); - - $this->ajaxReturn(['status' => 1]); } public function showBonusList($row = 10, $p = 1) diff --git a/Application/Admin/Controller/MarketPerformanceSetController.class.php b/Application/Admin/Controller/MarketPerformanceSetController.class.php new file mode 100644 index 000000000..d5772eea2 --- /dev/null +++ b/Application/Admin/Controller/MarketPerformanceSetController.class.php @@ -0,0 +1,475 @@ +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->setIsTipData(); + $this->getInsideCompanyid(); + $this->getChannelRatio(); + $this->getTaxRatio(); + $this->getAllDownFlowSpend(); + $this->getAllGameInfo(); + $this->getCompanyOtherInfo(); + $this->getPuStatement(); + $this->getPuSpecialStatement(); + $this->performanceSet(); + $this->settleupMarketorderDbSave(); + echo "{$this->year}-{$this->month}生成成功".PHP_EOL; + } + /** + * 获取是否标红提示数据,旧数据比对 + */ + private function setIsTipData() + { + $dbres = $this->settleupMarketorderModel->where(['pay_time'=>$this->date])->select(); + + if($dbres){ + foreach ($dbres as $key => $v) { + $this->oldMarketPerformance[$v['company_id']][$v['game_name']]['company_profit'] = $v['company_profit']; + } + }else{ + $this->oldMarketPerformance = false; + } + //取消所有提示 + $this->settleupMarketorderModel->where("1=1")->save(["is_tip"=>0]); + } + + + + /** + * 获取公司内部公司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); + } + /** + * 支付服务商渠道费 + * TODO:当前默认除了绑定币其他渠道都1% + */ + private function getChannelRatio() + { + $res = M("payment_merchant","tab_")->getField("id,config",true); + foreach ($res as $k => $v) { + $res[$k] = 1; + //------begin------注释的部分表示按实际配置收取 + // $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; + // } + //----------end------ + } + $res[0] = 1;//平台币 + $res[-1] = 0;//绑定币 + $this->channelRatio = $res; + unset($res); + } + /** + * 获取公司税率 + */ + private function getTaxRatio() + { + $where = [ + "time"=>['ELT',$this->beginThismonth] + ]; + $tax_data = M("tax_radio","tab_") + ->field("tax_radio") + ->order("time desc") + ->where($where) + ->find(); + if($tax_data){ + $this->taxRatio = $tax_data['tax_radio']; + }else{ + $this->taxRatio = 0; + } + } + + /** + * 获取所有下游公司支付信息 + */ + private function getAllDownFlowSpend() + { + $where = [ + "pay_status"=>1, + "s.is_check"=>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, + 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($v['relation_game_name'],$this->downFlowData[$v['company_id']])){ + $this->downFlowData[$v['company_id']][$v['relation_game_name']] = [ + "cp_pay_amount"=>0, + "promote_pay_amount"=>0, + "pay_amount"=>0, + "channel_amount"=>0, + "refund_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']; + $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']]['pay_amount'] += $v['pay_amount']; + $this->downFlowData[$v['company_id']][$v['relation_game_name']]['refund_amount'] += $v['refund_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 company_id,pc.company_name,pc.company_belong,pc.develop_type,p.id promote_id,p.account promote_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($this->downFlowData[$v['company_id']][$val['game_name']]["ratio"] == 0){ + $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($this->downFlowData[$v['company_id']][$val['game_name']]["ratio"] == 0){ + $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; + } + $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() + { + foreach ($this->downFlowData as $company_id => $games) { + $baseArr = $this->companyInfo[$company_id]; + $baseArr['pay_time'] = $this->date; + $baseArr['is_settlement'] = 1; + foreach ($games as $k => $v) { + // if($company_id == 452){ + // dd($v); + // } + $game = $this->gameInfo[$k]; + $cp_ratio = $game['cp_ratio']; + $tempArr = $baseArr; + $tempArr['game_id'] = $game['relation_game_id']; + $tempArr['relation_game_id'] = $game['relation_game_id']; + $tempArr['game_name'] = $k; + $tempArr['pay_amount'] = $v['pay_amount']; + $tempArr['cp_amount'] = round($v['cp_pay_amount']*$cp_ratio/100,2); + $tempArr['promote_amount'] = round($v['promote_pay_amount']*$v['ratio']/100+$v['special_amount'],2); + $tempArr['channel_amount'] = $v['channel_amount']; + $tempArr['refund_amount'] = $v['refund_amount']; + $tempArr['company_tax'] = round( ($v['pay_amount']-$tempArr['cp_amount']-$tempArr['promote_amount']) * ($this->taxRatio / 100),2 ); + $tempArr['company_profit'] = $tempArr['pay_amount']-$tempArr['cp_amount']-$tempArr['promote_amount']-$tempArr['channel_amount']-$tempArr['company_tax']; + $tempArr['is_tip'] = 0; + if($this->oldMarketPerformance){ + if(!array_key_exists($company_id,$this->oldMarketPerformance) || !array_key_exists($k,$this->oldMarketPerformance[$company_id])){ + $tempArr['is_tip'] = 1; + }else{ + if($this->oldMarketPerformance[$company_id][$k]['company_profit'] != $tempArr['company_profit'].''){ + $tempArr['is_tip'] = 1; + } + } + } + if($tempArr['promote_amount'] != 0){ + $this->adddata[]= $tempArr; + } + + } + } + } + /** + * 毛利数据库操作 + */ + private function settleupMarketorderDbSave() + { + //删除旧数据 + $this->settleupMarketorderModel->where(['pay_time'=>$this->date])->delete(); + $this->settleupMarketorderModel->addAll($this->adddata); + } + +} diff --git a/Application/Admin/Controller/TimingController.class.php b/Application/Admin/Controller/TimingController.class.php index 8e3771422..b4252f5d8 100644 --- a/Application/Admin/Controller/TimingController.class.php +++ b/Application/Admin/Controller/TimingController.class.php @@ -836,9 +836,17 @@ 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); + $this->createMarketBonus($_REQUEST['time']); + 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 +854,7 @@ class TimingController extends AdminController { if ($_REQUEST['time']) { $map['pay_time'] = $_REQUEST['time']; } + $spend_map = []; $time_start = 0; $time_end = 0; @@ -1349,6 +1358,7 @@ class TimingController extends AdminController { ->field("id,admin_id,pay_time,promote_account,company_belong,tab_settleup_marketorder.real_name,develop_type,game_name, sum(pay_amount) pay_amount,sum(company_profit) company_profit, sum(if((develop_type = 1 or develop_type = 2), pay_amount, 0)) performance_revenue,sum(if(develop_type = 3, pay_amount, 0)) appraisal_bonuses, + sum(if((develop_type = 1 or develop_type = 2), refund_amount, 0)) performance_refund_amount,sum(if(develop_type = 3, refund_amount, 0)) appraisal_refund_amount, sum(company_tax) company_tax, sum(cp_amount) cp_amount,sum(promote_amount) promote_amount") ->where($map) ->where(["admin_id"=>['in',array_keys($accessData)]]) @@ -1360,6 +1370,8 @@ class TimingController extends AdminController { if(isset($accessData[$admin_id])){ $value = array_merge($value,$accessData[$admin_id]); } + $value['performance_revenue'] -= $value['performance_refund_amount']; + $value['appraisal_bonuses'] -= $value['appraisal_refund_amount']; $sum_amount = $value['performance_revenue'] + $value['appraisal_bonuses']; diff --git a/Application/Admin/View/GameRebate/records.html b/Application/Admin/View/GameRebate/records.html new file mode 100644 index 000000000..90973b418 --- /dev/null +++ b/Application/Admin/View/GameRebate/records.html @@ -0,0 +1,404 @@ + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+
+ +
+
+ +
+
+   +
+
+   +
+
+ + - +
+ + +
+
+
+ +
+
+ +
+
+ +
+
+ 搜索 +
+ +
+
+ + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + 游戏名称区服账号角色ID角色名充值金额当日累计充值金额可领取福利日期达到档位金额奖励内容发放状态发放时间审核状态审核时间审核人
aOh! 暂时还没有内容!
+ + + + + + {$data.base_game_name}{$data.server_name}{$data.user_account}{$data.role_id}{$data.role_name}{$data.pay_amount}{$data.pay_amount}{$data.award_date_range}{$data.amount}{$data.gift_content} + {$data.send_status_text} + {$data.send_time} + {$data.review_status_text} + {$data.review_time}{$data.reviewer_username}
+
+
+
+ + 导出 + + {$_page|default=''} +
+ + +
+ + + + + + + + \ No newline at end of file diff --git a/Application/Admin/View/MarketPercentage/index.html b/Application/Admin/View/MarketPercentage/index.html index 02c2d0628..8dae70017 100644 --- a/Application/Admin/View/MarketPercentage/index.html +++ b/Application/Admin/View/MarketPercentage/index.html @@ -43,7 +43,7 @@
- 重算 + 重算
@@ -125,11 +125,14 @@ 类型 游戏名称 总流水 - 上游结算流水 - 下游结算流水 + 上游结算额 + 下游结算额 支付渠道费用 + 退款金额 + 返点及其他 公司税费 税后毛利额 + 操作 @@ -154,8 +157,11 @@ {$data['cp_amount']} {$data['promote_amount']} {$data['channel_amount']} + {$data['refund_amount']} + {$data['other_amount']} {$data['company_tax']} {$data['company_profit']} + 编辑 @@ -170,8 +176,11 @@ {$sum['cp_amount']} {$sum['promote_amount']} {$sum['channel_amount']} + {$sum['refund_amount']} + {$sum['other_amount']} {$sum['company_tax']} {$sum['company_profit']} + @@ -187,6 +196,24 @@ {$_page|default=''} + @@ -206,6 +233,63 @@ //导航高亮 highlight_subnav('{:U('MarketPercentage/index')}'); $(function(){ + $(".edit_oter_amout").on("click",function(){ + var data = $(this).data(); + layer.open({ + type: 1, + title: '编辑', + maxWidth:720, + closeBtn: 1, + shadeClose: false, + content: $("#changeTpl").html(), + success:function(){ + env(data); + } + }); + + }); + function env(data) { + $("#other_amount").val(data.amount); + $("#changeMargin").off("click"); + $("#changeMargin").on("click",function(){ + let other_amount = $("#other_amount").val(); + var reg = /^(\-|\+)?\d+(\.\d*)?$/; + if( !reg.test(other_amount)){ + layer.msg("返点扣款金额格式错误"); + return ; + } + if(other_amount == data.amount){ + layer.msg("无修改请直接关闭窗口"); + return ; + } + //成功 + let send = { + id:data.id, + other_amount:other_amount, + } + $.ajax({ + type: "POST", + url: "{:U('otherAmountEdit')}", + dataType: 'json', + data: send, + success: function (data) { + if (data.status == 1) { + layer.msg(data.msg); + setTimeout(function () { + window.location.reload(); + }, 1500); + } else { + layer.msg(data.msg); + return false; + } + } + }); + }); + + } + + + //搜索功能 $("#search").click(function(){ var url = $(this).attr('url'); @@ -230,54 +314,12 @@ window.location.href = url; }); - $(".paixu").click(function(){ - var that=$(this); - $data_order=that.attr('data-order'); - $order_type='{$userarpu_order}'; - if($order_type==''||$order_type=='4'){ - $(".sortBy").attr('name','data_order'); - val='3,'+$data_order; - $(".sortBy").attr('value',val); - $("#search").click(); - }else if($order_type=='3'){ - $(".sortBy").attr('name','data_order'); - val='4,'+$data_order; - $(".sortBy").attr('value',val); - $("#search").click(); - } - }); //回车自动提交 $('.jssearch').find('input').keyup(function(event){ if(event.keyCode===13){ $("#search").click(); } }); - $("#admin").on('click',function(event) { - var navlist = $(this).find('.i_list_li'); - if (navlist.hasClass('hidden')) { - navlist.removeClass('hidden'); - $(this).find('#i_list_id').focus().val(''); - } else { - navlist.addClass('hidden'); - } - $(document).one("click", function(){ - navlist.addClass('hidden'); - }); - event.stopPropagation(); - }); - - $('#admin #i_list_id').on('keyup',function(event) { - var val = $.trim($(this).val()).toLowerCase(); - $(this).closest('.drop-down').find('#i_list_idh').val(val); - }); - - $("#admin #i_list_li").find("a").each(function(){ - $(this).click(function(){ - var text = $.trim($(this).text()).toLowerCase(); - $(this).closest('.drop-down').find("#i_list_id").val(text); - $(this).closest('.drop-down').find('#i_list_idh').val(text); - }) - }); $('#time_start').datetimepicker({ format: 'yyyy-mm', @@ -321,35 +363,6 @@ }); event.stopPropagation(); }); - /* 状态搜索子菜单 */ - /*渠道删除*/ - $('.delete').click(function(){ - var id = $(this).attr('data-id'); - layer.confirm('渠道删除后,下级渠道同时被删除,所属数据归属于自然渠道!', { - title:'确定要删除该渠道?', - icon:0, - btn: ['删除','取消'] //按钮 - }, function(){ - $.ajax({ - type: "POST", - url: "{:U('del_promote')}", - dataType: 'json', - async: false, - data: {id:id}, - success:function(data){ - if(data.status==1){ - layer.msg(data.msg); - setTimeout(function(){ - window.location.reload(); - },1500); - } - } - }); - }, function(){ - layer.close(); - }); - - }) $('.recaculate').click(function(){ var url = $(this).attr('url'); @@ -361,16 +374,17 @@ $.ajax({ type: "POST", url: url, + data:{type:1}, dataType: 'json', async: false, success:function(data){ if(data.status == 1) { - layer.msg("重新计算需要时间,请等待10分钟后再查看"); + layer.msg(data.msg); setTimeout(function(){ window.location.reload(); },1500); } else { - layer.msg(data.info); + layer.msg(data.msg); } }, }); @@ -384,124 +398,4 @@ - diff --git a/Application/Admin/View/MarketPercentage/marketstaffsettle.html b/Application/Admin/View/MarketPercentage/marketstaffsettle.html index f5fd381e9..9e019d33f 100644 --- a/Application/Admin/View/MarketPercentage/marketstaffsettle.html +++ b/Application/Admin/View/MarketPercentage/marketstaffsettle.html @@ -113,7 +113,7 @@
- 重算 + 重算
@@ -199,8 +199,8 @@ 市场专员 离职时间 级别 -
开发总流水当月自主开发下渠道游戏内充值总和
-
维护总流水当月只维护下渠道游戏内充值总和
+
开发总流水当月自主开发下渠道游戏内充值总和(已减去退款)
+
维护总流水当月只维护下渠道游戏内充值总和(已减去退款)
业绩提成
绩效考核奖金当月开发税后毛利奖金与维护税后毛利奖金之和
绩效系数 @@ -282,6 +282,7 @@ + @@ -635,16 +636,17 @@ $.ajax({ type: "POST", url: url, + data:{type:2}, dataType: 'json', async: false, success:function(data){ if(data.status == 1) { - layer.msg("重新计算需要时间,请等待10分钟后再查看"); + layer.msg(data.msg); setTimeout(function(){ window.location.reload(); },1500); } else { - layer.msg(data.info); + layer.msg(data.msg); } }, diff --git a/Application/Base/Repository/GameRepository.class.php b/Application/Base/Repository/GameRepository.class.php index d05539c13..2ae94a494 100644 --- a/Application/Base/Repository/GameRepository.class.php +++ b/Application/Base/Repository/GameRepository.class.php @@ -55,6 +55,19 @@ class GameRepository ->select(); } + public function getServersByBaseGameId($baseGameId, $fields = ['id', 'server_name', 'server_id']) + { + $baseGame = M('base_game', 'tab_')->where(['id' => $baseGameId])->find(); + $map = []; + $map['game_id'] = ['in', $this->getGameIdsByBaseGame($baseGame)]; + return M('server', 'tab_') + ->field($fields) + ->where($map) + ->group('server_id') + ->order('server_id asc') + ->select(); + } + public function getGameIdsByBaseGame($baseGame, $deviceType = 0) { $gameIds = []; diff --git a/Application/Base/Service/GameRebateService.class.php b/Application/Base/Service/GameRebateService.class.php new file mode 100644 index 000000000..c928812f1 --- /dev/null +++ b/Application/Base/Service/GameRebateService.class.php @@ -0,0 +1,137 @@ + 'http://rebate.99you.cn/xyy_apply.php/23400/', + 'timeout' => 10.0, + ]); + } + + public function sendByOrder($order) + { + $gift = M('rebate_gifts', 'tab_')->where(['type' => $order['type'], 'gift_key' => $order['gift_key']])->find(); + $hasError = false; + $sendResult = ''; + if ($gift['game_currency'] > 0) { + $result = $this->sendCurrency($order['server_id'], $order['role_id'], $gift['game_currency']); + if ($result['code'] != 1) { + $hasError = true; + } + $sendResult .= ($result['msg'] ?? ''); + $sendResult .= ';'; + } + if ($gift['gift_id'] > 0) { + $result = $this->sendGift($order['server_id'], $order['role_id'], $gift['gift_id']); + if ($result['code'] != 1) { + $hasError = true; + } + $sendResult .= ($result['msg'] ?? ''); + } + M('rebate_orders', 'tab_')->where(['id' => $order['id']])->save([ + 'send_status' => $hasError ? 2 : 1, + 'send_time' => time(), + 'send_result' => $sendResult, + ]); + } + + public function sendCurrency($serverId, $roleId, $currency) + { + $sign = md5($currency.$serverId.$roleId.self::SIGN_KEY); + $params = [ + 'act' => 'sendgold', + 'serverid' => $serverId, + 'role_id' => $roleId, + 'money' => $currency, + 'sign' => $sign + ]; + return $this->get('', $params); + } + + public function sendGift($serverId, $roleId, $giftId) + { + $sign = md5($giftId.$serverId.$roleId.self::SIGN_KEY); + $params = [ + 'act' => 'send_email', + 'serverid' => $serverId, + 'role_id' => $roleId, + 'prop_id' => $giftId, + 'sign' => $sign + ]; + return $this->get('', $params); + } + + protected function get($uri, array $params = []) + { + try { + $response = $this->getClient()->get($uri, [ + 'verify' => false, + 'query' => $params, + ]); + $result = (string)$response->getBody(); + return json_decode($result, true); + } catch (\Exception $e) { + return [ + 'code' => 3, + 'msg' => '网络异常:' . $e->getMessage(), + ]; + } + } + + public function review(array $ids, $status) + { + if (!in_array($status, [1, 2])) { + throw new \Exception('状态异常'); + } + if (count($ids) == 0) { + throw new \Exception('请选择要操作的记录'); + } + $orders = M('rebate_orders', 'tab_')->field(['id'])->where(['review_status' => 0, 'id' => ['in', $ids]])->select(); + if (count($orders) != count($ids)) { + throw new \Exception('含有不存在的记录或者已审核的记录'); + } + + $adminInfo = $_SESSION['onethink_admin']['user_auth']; + M('rebate_orders', 'tab_')->where(['review_status' => 0, 'id' => ['in', $ids]])->save([ + 'review_status' => $status, + 'review_time' => time(), + 'reviewer_id' => $adminInfo['uid'], + 'reviewer_username' => $adminInfo['username'], + ]); + } + + public function sendAll($type) + { + $orders = M('rebate_orders', 'tab_')->where(['type' => $type, 'review_status' => 1, 'send_status' => 0])->select(); + foreach ($orders as $order) { + if ($type == 'B') { + if (time() < strtotime($order['award_started_at'] . ' 00:00:00') || time() > strtotime($order['award_ended_at'] . ' 23:59:59')) { + continue; + } + } + $this->sendByOrder($order); + } + } + + public function sendDaily($date) + { + $map = [ + 'type' => 'B', + 'review_status' => 1, + 'send_status' => 1, + 'award_started_at' => ['elt', $date], + 'award_ended_at' => ['egt', $date] + ]; + $orders = M('rebate_orders', 'tab_')->where($map)->select(); + foreach ($orders as $order) { + $this->sendByOrder($order); + } + } +} \ No newline at end of file diff --git a/Application/Base/Tool/GameResource/XyyClient.class.php b/Application/Base/Tool/GameResource/XyyClient.class.php new file mode 100644 index 000000000..a8c53ce6f --- /dev/null +++ b/Application/Base/Tool/GameResource/XyyClient.class.php @@ -0,0 +1,134 @@ + ['uri' => '/', 'method' => 'get'], + ]; + + public function __construct() + { + $this->client = new Client([ + 'base_uri' => 'http://rebate.99you.cn/wdzx_apply.php/23399', + 'timeout' => 10.0, + ]); + } + + public function api($api, array $params = []) + { + $api = $this->apis[$api] ?? null; + if (is_null($api)) { + throw new \Exception('接口不存在'); + } + $params[self::SIGN_NAME] = $this->sign($params); + try { + return $this->request($api, $params); + } catch (\Exception $e) { + $env = C('APP_ENV', null, 'prod'); + return ['code' => 3, 'msg' => '接口请求错误。' . ($env == 'prod' ? '' : $e->getMessage()) , 'data' => []]; + } + } + + public function request($api, $params) + { + if ($api['method'] == 'get') { + return $this->get($api['uri'], $params); + } else { + return $this->post($api['uri'], $params); + } + } + + protected function post($uri, array $params = []) + { + $response = $this->client->post($uri, [ + 'verify' => false, + 'form_params' => $params, + ]); + $result = (string)$response->getBody(); + return json_decode($result, true); + } + + protected function get($uri, array $params = []) + { + $response = $this->client->get($uri, [ + 'verify' => false, + 'query' => $params, + ]); + $result = (string)$response->getBody(); + return json_decode($result, true); + } + + protected function sign($params) + { + return md5($params['orderid'] . $params['serverid'] . $params['role_id'] . self::KEY); + } + + public function apply($order, $role) + { + $data = [ + 'role_id' => $role['role_id'], + 'serverid' => $role['server_id'], + 'amount' => $order['ref_amount'], + // 'money' => intval($order['ref_amount']) * 10, + 'orderid' => $order['order_no'], + ]; + + $result = $this->api('provide', $data); + if ($result['code'] == 1) { + return [ + 'status' => true, + 'message' => $result['msg'], + 'result' => $result + ]; + } else { + return [ + 'status' => false, + 'message' => $result['msg'], + 'result' => $result + ]; + } + } + + public function getResourceTypes($deviceType) + { + if ($deviceType == 'andriod') { + return [['id' => 1, 'name' => '通用', 'device_type' => 'andriod']]; + } elseif ($deviceType == 'ios') { + return [['id' => 2, 'name' => '通用', 'device_type' => 'ios']]; + } + } + + public function getResources($typeId, $deviceType) + { + return [ + 1 => ['ref_id' => 1, 'name' => '60元宝', 'amount' => 6], + 2 => ['ref_id' => 2, 'name' => '300元宝', 'amount' => 30], + 3 => ['ref_id' => 3, 'name' => '980元宝', 'amount' => 98], + 4 => ['ref_id' => 4, 'name' => '1280元宝', 'amount' => 128], + 5 => ['ref_id' => 5, 'name' => '1980元宝', 'amount' => 198], + 6 => ['ref_id' => 6, 'name' => '3280元宝', 'amount' => 328], + 7 => ['ref_id' => 7, 'name' => '6480元宝', 'amount' => 648], + 8 => ['ref_id' => 8, 'name' => '10000元宝', 'amount' => 1000], + 9 => ['ref_id' => 9, 'name' => '20000元宝', 'amount' => 2000], + 10 => ['ref_id' => 10, 'name' => '30000元宝', 'amount' => 3000], + 11 => ['ref_id' => 11, 'name' => '50000元宝', 'amount' => 5000], + 12 => ['ref_id' => 12, 'name' => '100000元宝', 'amount' => 10000], + 13 => ['ref_id' => 13, 'name' => '200000元宝', 'amount' => 20000], + ]; + } +} \ No newline at end of file