From 4425750972a9ad64297324dccb7284ecbda5cedc Mon Sep 17 00:00:00 2001 From: zhengyongxing Date: Sat, 27 Feb 2021 16:51:54 +0800 Subject: [PATCH] =?UTF-8?q?2.28=E5=8F=B7=E5=8A=9F=E8=83=BD=E6=8F=90?= =?UTF-8?q?=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Application/Admin/Common/extend.php | 36 ++ Application/Admin/Conf/config.php | 8 +- .../CompanyStatementController.class.php | 499 ++++++++++++++++++ .../CompanyStatementPoolController.class.php | 294 ++++++++++- .../StatementMangementController.class.php | 263 +++++++-- .../Admin/View/CompanyStatement/lists.html | 43 ++ .../CompanyStatement/poolWmStatement.html | 275 ++++++++++ .../CompanyStatement/showCpStatementList.html | 379 +++++++++++++ .../CompanyStatement/showCpStatementView.html | 280 ++++++++++ .../View/CompanyStatementPool/lists.html | 14 +- .../CompanyStatementPool/poolWmStatement.html | 396 ++++++++++++++ .../View/StatementMangement/addreward.html | 467 ++++++++++++++++ .../StatementMangement/rewardManageList.html | 8 + Data/update.sql | 3 + Public/Admin/excel/rewardOrfina.xlsx | Bin 0 -> 15679 bytes Public/Admin/excel/wmStatement.xlsx | Bin 0 -> 10989 bytes 16 files changed, 2923 insertions(+), 42 deletions(-) create mode 100644 Application/Admin/View/CompanyStatement/poolWmStatement.html create mode 100644 Application/Admin/View/CompanyStatement/showCpStatementList.html create mode 100644 Application/Admin/View/CompanyStatement/showCpStatementView.html create mode 100644 Application/Admin/View/CompanyStatementPool/poolWmStatement.html create mode 100644 Application/Admin/View/StatementMangement/addreward.html create mode 100644 Public/Admin/excel/rewardOrfina.xlsx create mode 100644 Public/Admin/excel/wmStatement.xlsx diff --git a/Application/Admin/Common/extend.php b/Application/Admin/Common/extend.php index 1d51bcf8d..3482da870 100644 --- a/Application/Admin/Common/extend.php +++ b/Application/Admin/Common/extend.php @@ -3142,4 +3142,40 @@ function getOrderHtml($field, $orderField, $orderType) } else { return ''; } +} + +function array_repeat($array,$keyid="id",$desc=false) +{ + $array = array_values($array); + //倒叙排列数 + if($desc) + { + $array = array_rsort($array,true); + } + + //提取需要判断的项目变成一维数组 + $a = array_column($array,$keyid); + + //去除一维数组重复值 + $a = array_unique($a); + //提取二维数组项目值 + foreach($array[0] AS $key=>$value) + { + $akey[] = $key; + } + //重新拼接二维数组 + foreach($akey AS $key=>$value) + { + $b = array_column($array,$value); + foreach($a AS $key2=>$value2) + { + $c[$key2][$value] = $b[$key2]; + } + } + + if($desc) + { + $c = array_rsort($c,true); + } + return $c; } \ No newline at end of file diff --git a/Application/Admin/Conf/config.php b/Application/Admin/Conf/config.php index 2b3384f87..1901229ee 100644 --- a/Application/Admin/Conf/config.php +++ b/Application/Admin/Conf/config.php @@ -128,6 +128,12 @@ return array( "tab_market_altogether", "tab_cmd_tasks", "tab_operation_log", - "sys_action_log" + "sys_action_log", + "tab_partner", + "tab_promote_company", + "tab_game", + "tab_reward_detail", + "tab_reward_record", + "tab_promote" ] ); \ No newline at end of file diff --git a/Application/Admin/Controller/CompanyStatementController.class.php b/Application/Admin/Controller/CompanyStatementController.class.php index cb3ad059a..498f391d4 100644 --- a/Application/Admin/Controller/CompanyStatementController.class.php +++ b/Application/Admin/Controller/CompanyStatementController.class.php @@ -227,6 +227,8 @@ class CompanyStatementController extends ThinkController if ($page) { $this->assign('_page', $page); } + + $this->assign("IS_SUBSITE",IS_SUBSITE); $this->assign('data',$data); $this->assign('count',$count); @@ -417,6 +419,503 @@ class CompanyStatementController extends ThinkController )); } + public function checkWmStatement() { + + $ids = $_POST['id']; + + if (!$ids) { + $this->ajaxReturn(["status"=>1]); + } + + $count = SM("company_statement","tab_") + ->where("id in({$ids})") + ->group("company_type,withdraw_type") + ->select(); + + if (count($count)>1) { + $this->ajaxReturn(["status"=>0,"msg"=>""]); + } else { + $this->ajaxReturn(["status"=>1]); + } + + } + + public function poolWmStatement() { + + $ids = $_GET['id']; + + $data = SM("company_statement","tab_") + ->where("id in({$ids})") + ->select(); + + $list = []; + $amount_data = []; + + $company_data = SM("promote_company","tab_")->where(["status"=>1,"company_type"=>$data[0]['company_type']])->select(); + + //游戏数据整合 + foreach ($data as $key => $value) { + + $promote_data = SM("promote","tab_")->field("id")->where(['company_id'=>$value['company_id']])->select(); + $promote_ids = array_column($promote_data,"id"); + + $statement_info = json_decode($value['statement_info'],true); +// dump($statement_info); + if ($value['company_type'] == 1) { + + $list = array_merge($list,$statement_info); + foreach ($statement_info as $k => $v) { + + $statement_begin_time = strtotime(str_replace(".", "-", $v['statement_begin_time'])); + $statement_end_time = strtotime(str_replace(".", "-", $v['statement_end_time'])) + 86399; + + if (!$amount_data['statement_begin_time'] || $amount_data['statement_begin_time'] > $v['statement_begin_time']) { + $amount_data['statement_begin_time'] = $v['statement_begin_time']; + } + + if (!$amount_data['statement_end_time'] || $amount_data['statement_end_time'] < $v['statement_end_time']) { + $amount_data['statement_end_time'] = $v['statement_end_time']; + } + + $user_data = SM("user", "tab_") + ->field("id") + ->where([ + 'promote_id' => ['in', $promote_ids], + 'fgame_name' => ['like', "%{$v['game_name']}%"], + "register_time" => ['between', [$statement_begin_time, $statement_end_time]] + ])->select(); + if ($v['game_name'] != '罚款' && $v['game_name'] != '奖励') { + $amount_data['pay_amount'] += $v["pay_amount"]; + } + if ($v['game_name'] == '罚款') { + $amount_data['sum_money'] -= $v["sum_money"]; + } else { + $amount_data['sum_money'] += $v["sum_money"]; + } + $amount_data['user_newcount'] += count($user_data); + + } + } elseif($value['company_type'] == 2) { + + foreach ($statement_info as $k => $v) { + + $game_list = $v["game_list"]; + + $list = array_merge($list,$game_list); + + foreach ($game_list as $gk=>$gv) { + $statement_begin_time = strtotime(str_replace(".", "-", $gv['statement_begin_time'])); + $statement_end_time = strtotime(str_replace(".", "-", $gv['statement_end_time'])) + 86399; + + if (!$amount_data['statement_begin_time'] || $amount_data['statement_begin_time'] > $gv['statement_begin_time']) { + $amount_data['statement_begin_time'] = $gv['statement_begin_time']; + } + + if (!$amount_data['statement_end_time'] || $amount_data['statement_end_time'] < $gv['statement_end_time']) { + $amount_data['statement_end_time'] = $gv['statement_end_time']; + } + + $user_data = SM("user", "tab_") + ->field("id") + ->where([ + 'promote_id' => ['in', $promote_ids], + 'fgame_name' => ['like', "%{$gv['game_name']}%"], + "register_time" => ['between', [$statement_begin_time, $statement_end_time]] + ])->select(); + if ($gv['game_name'] != '罚款' && $gv['game_name'] != '奖励') { + $amount_data['pay_amount'] += $gv["pay_amount"]; + } + + if ($gv['game_name'] == '罚款') { + $amount_data['sum_money'] -= $gv["sum_money"]; + } else { + $amount_data['sum_money'] += $gv["sum_money"]; + } + $amount_data['user_newcount'] += count($user_data); + } + + } + } + } + + $list = array_repeat($list,"game_name"); + + + $this->assign("company_data",$company_data); + $this->assign("row",count($list)); + $this->assign("data",$list); + $this->assign("amount_data",$amount_data); + $this->assign("js_amount_data",json_encode($amount_data)); + $this->assign("js_data",json_encode($list)); + + $this->display(); + + } + + //子系统列表 + public function showCpStatementList() { + + $params = I('get.'); + $page = $params['p'] ? intval($params['p']) : 1; + $row = $params['row'] ? intval($params['row']) : 10; + + $map['company_belong'] = 9; + + if ($_REQUEST["year"]) { + $start = strtotime($_REQUEST["year"]."-01-01"); + $end = strtotime(date("Y-m-t",strtotime($_REQUEST["year"]."-12"))) + 86399; + $map["statement_begin_time"] = ["between",[$start,$end]]; + } + + $data = SM("company_statement","tab_") + ->field("id,company_id,company_name,sum(statement_money) statement_money,sum(platform_amount) platform_amount") + ->where($map) + ->group("company_id") + ->page($page, $row) + ->select(); + + $count = SM("company_statement","tab_") + ->field("id") + ->where($map) + ->group("company_id") + ->select(); + + $count = count($count); + + $page = set_pagination($count, $row,$params); + if($page) { + $this->assign('_page', $page); + } + + A("FinancialSummary")->getYearList(); + $this->assign("data",$data); + + $this->display(); + + } + + //上游公司 + public function showCpStatementView() { + + $company_id = explode(",",$_REQUEST["company_id"]); + $time = $_REQUEST["time"]; + + $assign_data = []; + $sum = []; + + foreach ($company_id as $ckey => $cvalue) { + + $use_data = [ + "01"=>["time"=>"01"], + "02"=>["time"=>"02"], + "03"=>["time"=>"03"], + "04"=>["time"=>"04"], + "05"=>["time"=>"05"], + "06"=>["time"=>"06"], + "07"=>["time"=>"07"], + "08"=>["time"=>"08"], + "09"=>["time"=>"09"], + "10"=>["time"=>"10"], + "11"=>["time"=>"11"], + "12"=>["time"=>"12"], + ]; + + $map["company_id"] = $cvalue; + $map['company_belong'] = 9; + + $data = SM("company_statement","tab_") + ->field("id,company_id,company_name,FROM_UNIXTIME(statement_begin_time,'%m') time,statement_money,platform_amount,statement_info") + ->where($map) + ->select(); + + $row = 0; + + foreach($data as $key => $value) { + + $data[$key]['statement_info'] = json_decode($value['statement_info'],true); + + $statement_info = $data[$key]['statement_info']; + + $data[$key]['row'] = count($data[$key]['statement_info']); + + $row += $data[$key]['row']; + + foreach ($statement_info as $k => $v) { + + $statement_info[$k]['sum_amount'] = $v["platform_money"] + $v["aggregate_money"] ; + + $real_statement_amount + = number_format($v['platform_money']*(1-$v['promote_ratio']/100)*($v['ratio']/100)*(1-$v["fax_ratio"]/100),2,'.','');; + + $statement_info[$k]['other_amount'] = number_format($v["sum_money"] - $real_statement_amount,2,'.',''); + + $sum[$ckey]["ratio"] += $v["ratio"]; + $sum[$ckey]["promote_ratio"] += $v["promote_ratio"]; + $sum[$ckey]["fax_ratio"] += $v["fax_ratio"]; + + $statement_info[$k]['ratio'] = $v["ratio"]."%"; + $statement_info[$k]['promote_ratio'] = $v["promote_ratio"]."%"; + $statement_info[$k]['fax_ratio'] = $v["fax_ratio"]."%"; + + $sum[$ckey]["platform_money"] += $v["platform_money"]; + $sum[$ckey]["aggregate_money"] += $v["aggregate_money"]; + $sum[$ckey]["sum_amount"] += $statement_info[$k]["sum_amount"]; + $sum[$ckey]["other_amount"] += $statement_info[$k]["other_amount"]; + + if ($v["statement_type"] == 2) { + $sum[$ckey]["sum_money"] -= $v["sum_money"]; + } else { + $sum[$ckey]["sum_money"] += $v["sum_money"]; + } + + } + + $data[$key]["statement_info"] = $statement_info; + $use_data[$value['time']] = $data[$key]; + } + + $sum[$ckey]["ratio"] = number_format($sum[$ckey]["ratio"]/$row,2,'.','')."%"; + $sum[$ckey]["promote_ratio"] = number_format($sum[$ckey]["promote_ratio"]/$row,2,'.','')."%"; + $sum[$ckey]["fax_ratio"] = number_format($sum[$ckey]["fax_ratio"]/$row,2,'.','')."%"; + + $assign_data[] = array_values($use_data); + + } + + $is_export= false; + if (isset($_REQUEST['is_export']) && $_REQUEST['is_export']==1){ + $is_export = true; + } + + $this->assign("title","联运结算单汇总上游导出"); + $this->assign("is_export",$is_export); + $this->assign("sum",$sum); + $this->assign("time",$time); + $this->assign("data",$assign_data); + $this->display(); + + } + + public function checkCompanyData() { + + $statement_id = $_REQUEST["statement_id"]; + $company_id = $_REQUEST["company_id"]; + $begin_time = strtotime(str_replace(".","-",$_REQUEST["begin_time"])); + $end_time = strtotime(str_replace(".","-",$_REQUEST["end_time"]))+86399; + + if (!$company_id) { + $data = []; + } else { + $data = SM("company_statement","tab_") + ->where("statement_begin_time>={$begin_time} and statement_end_time<={$end_time} and company_id={$company_id} and id not in({$statement_id}) and (verify_status=1 or verify_status=-2)") + ->select(); + } + + $list = []; + $amount_data = json_decode($_REQUEST["amount_data"],true); + + //游戏数据整合 + foreach ($data as $key => $value) { + $promote_data = SM("promote", "tab_")->field("id")->where(['company_id' => $value['company_id']])->select(); + + $promote_ids = array_column($promote_data, "id"); + + $statement_info = json_decode($value['statement_info'], true); + + + if ($value['company_type'] == 1) { + $list = array_merge($list, $statement_info); + foreach ($statement_info as $k => $v) { + + $statement_begin_time = strtotime(str_replace(".", "-", $v['statement_begin_time'])); + $statement_end_time = strtotime(str_replace(".", "-", $v['statement_end_time'])) + 86399; + + $user_data = SM("user", "tab_") + ->field("id") + ->where([ + 'promote_id' => ['in', $promote_ids?$promote_ids:0], + 'fgame_name' => ['like', "%{$v['game_name']}%"], + "register_time" => ['between', [$statement_begin_time, $statement_end_time]] + ])->select(); + if ($v['game_name'] != '罚款' && $v['game_name'] != '奖励') { + $amount_data['pay_amount'] += $v["pay_amount"]; + } + + if ($v['game_name'] == '罚款') { + $amount_data['sum_money'] -= $v["sum_money"]; + } else { + $amount_data['sum_money'] += $v["sum_money"]; + } + + $amount_data['user_newcount'] += count($user_data); + + } + } elseif($value['company_type'] == 2) { + foreach ($statement_info as $k => $v) { + $game_list = $v["game_list"]; + $list = array_merge($list, $game_list); + foreach ($game_list as $gk=>$gv) { + $statement_begin_time = strtotime(str_replace(".", "-", $gv['statement_begin_time'])); + $statement_end_time = strtotime(str_replace(".", "-", $gv['statement_end_time'])) + 86399; + + if (!$amount_data['statement_begin_time'] || $amount_data['statement_begin_time'] > $gv['statement_begin_time']) { + $amount_data['statement_begin_time'] = $gv['statement_begin_time']; + } + + if (!$amount_data['statement_end_time'] || $amount_data['statement_end_time'] < $gv['statement_end_time']) { + $amount_data['statement_end_time'] = $gv['statement_end_time']; + } + + $user_data = SM("user", "tab_") + ->field("id") + ->where([ + 'promote_id' => ['in', $promote_ids?$promote_ids:0], + 'fgame_name' => ['like', "%{$gv['game_name']}%"], + "register_time" => ['between', [$statement_begin_time, $statement_end_time]] + ])->select(); + + if ($gv['game_name'] != '罚款' && $gv['game_name'] != '奖励') { + $amount_data['pay_amount'] += floatval($gv["pay_amount"]); + } + + if ($gv['game_name'] == '罚款') { + $amount_data['sum_money'] -= floatval($gv["sum_money"]); + } else { + $amount_data['sum_money'] += floatval($gv["sum_money"]); + } + + $amount_data['user_newcount'] += count($user_data); + } + } + } + } + if ($list) { + $list = array_repeat($list,"game_name"); + } + + $amount_data['pay_amount'] = number_format($amount_data['pay_amount'],2,'.',''); + $amount_data['sum_money'] = number_format($amount_data['sum_money'],2,'.',''); + + $this->ajaxReturn(['list'=>$list,'amount_data'=>$amount_data,"row"=>count($list),"status"=>1,"other_id"=>implode(",",array_column($data,"id"))]); + + } + + + public function saveCompanyData() { + + $list = array_merge(json_decode($_POST['list'],true),json_decode($_POST['other_list'],true)); + $amount_data = json_decode($_POST['amount_data'],true); + + $company_id = $_POST["company_id"]; + + $company_data = M("company_relation","tab_")->where("(first_company_id={$company_id} and first_company_type=2) or (second_company_id = {$company_id} and second_company_type=2)")->find(); + + $promote_company = []; + $partner = []; + + if ($company_data['first_company_type'] == 2) { + + $promote_company = M("promote_company","tab_")->where(['id'=>$company_data['first_company_id']])->find(); + $partner = M("company_info","tab_")->where(['id'=>$company_data['second_company_id']])->find(); + + }else if($company_data['second_company_type'] == 2) { + + $promote_company = M("promote_company","tab_")->where(['id'=>$company_data['second_company_id']])->find(); + $partner = M("company_info","tab_")->where(['id'=>$company_data['first_company_id']])->find(); + + } + + $company_info['id']=$promote_company['id']; + $company_info['partner']=$promote_company['company_name']; + $company_info['link_man']=$promote_company['settlement_contact']; + $company_info['phone']=$promote_company['contact_phone']; + $company_info['address']=$promote_company['address']; + + $company_info['bank_card']=$promote_company['bank_card']; + $company_info['bank_cardname']=$promote_company['bank_cardname']; + $company_info['bank_name']=$promote_company['bank_name']; + $company_info['bank_address']=$promote_company['bank_address']; + $company_info['ali_user']=$promote_company['ali_user']; + $company_info['ali_account']=$promote_company['ali_account']; + $company_info['is_payment'] = $company_data['is_payment']; + + $partner_info['id'] = $partner['id']; + $partner_info['partner'] = $partner['partner']; + $partner_info['link_man'] = $partner['link_man']; + $partner_info['link_phone'] = $partner['link_phone']; + $partner_info['invoice_type'] = $partner['invoice_type']; + $partner_info['invoice_item'] = $partner['invoice_item']; + $partner_info['address'] = $partner['address']; + + + if ($company_data['first_company_type'] == 2) { + + $first_company_info = $company_info; + $second_company_info = $partner_info; + + }else if($company_data['second_company_type'] == 2) { + + $first_company_info = $partner_info; + $second_company_info = $company_info; + + } + + $save['company_id'] = $company_id; + $save['company_name'] = $promote_company["company_name"]; + $save['statement_info'] = json_encode($list); + $save['first_party_info'] = json_encode($first_company_info); + $save['second_party_info'] = json_encode($second_company_info); + $save['statement_begin_time'] = strtotime(str_replace(".", "-", $amount_data['statement_begin_time'])); + $save['statement_end_time'] = strtotime(str_replace(".", "-", $amount_data['statement_end_time'])) + 86399; + $save['pay_amount'] = $amount_data['pay_amount']; + $save['sum_money'] = $amount_data['sum_money']-($amount_data['sum_money']*$_POST['fax_ratio']/100); + $save['user_newcount'] = $amount_data['user_newcount']; + $save['fax_ratio'] = $_POST['fax_ratio']; + + $is_success = SM("new_company_statement_info","tab_")->add($save); + + $pool['statement_num'] = "PL_".date('Ymd').date('His').sp_random_num(3); + $pool['statement_ids'] = $_POST['id'].','.$_POST['other_id']; + $pool['withdraw_type'] = 1; + $pool['wm_statement_ids'] = $is_success; + $pool['statement_begin_time'] = strtotime(str_replace(".", "-", $amount_data['statement_begin_time'])); + $pool['statement_end_time'] = strtotime(str_replace(".", "-", $amount_data['statement_end_time'])) + 86399; + $pool['statement_money'] = $save['sum_money']; + $pool['pay_amount'] = $save['pay_amount']; + $pool['platform_amount'] = $save['pay_amount']; + $pool['company_type'] = 2; + $pool['verify_log'] = json_encode(["create_user"=>$this->admininfo["username"],"create_time"=>date("Y.m.d H:i:s")]); + SM("company_statement_pool","tab_")->add($pool); + + + if ($_POST['other_id']) { + $statement_id = $_POST['id'].','.$_POST['other_id']; + } else { + $statement_id = $_POST['id']; + } + + + $dbres = $this->DBModel->field("id,verify_status,verify_log")->where("id in ({$statement_id})")->select(); + foreach ($dbres as $k => $v) { + $v['verify_log'] = json_decode($v['verify_log'],true); + $v['verify_log']['pool_user']=$this->admininfo["username"]; + $v['verify_log']['pool_time']=date("Y.m.d H:i:s"); + $v['verify_log']['pool_num']=$pool['statement_num']; + $v['verify_log'] = json_encode($v['verify_log']); + $v['verify_status']=2; + $v['op_time']=time(); + + SM("company_statement","tab_")->save($v); + } + + if ($is_success) { + $this->ajaxReturn(['status'=>1,'msg'=>'操作成功']); + } else { + $this->ajaxReturn(['status'=>0,'msg'=>'操作失败']); + } + + } + //审批通过 public function adminAgree(){ $this->setVerifyStatus(0,1,"admin"); diff --git a/Application/Admin/Controller/CompanyStatementPoolController.class.php b/Application/Admin/Controller/CompanyStatementPoolController.class.php index 1fdfd90d7..ce4d619ea 100644 --- a/Application/Admin/Controller/CompanyStatementPoolController.class.php +++ b/Application/Admin/Controller/CompanyStatementPoolController.class.php @@ -184,7 +184,12 @@ class CompanyStatementPoolController extends ThinkController $v["payment"] = '--'; } - $v['oplist'] = $this->OpAuth($v); +// $v['oplist'] = $this->OpAuth($v); + if (IS_SUBSITE) { + $v['oplist'] = $this->OpWmAuth($v); + } else { + $v['oplist'] = $this->OpAuth($v); + } } // dump($data);die(); $count = $this->DBModel->field("count(id) count,SUM(statement_money) as statement_money,SUM(lack_statement_money) lack_statement_money")->where($map)->find(); @@ -212,6 +217,7 @@ class CompanyStatementPoolController extends ThinkController $this->error('参数错误'); } $id = $_REQUEST['id']; + $is_export= false; if (isset($_REQUEST['export']) && $_REQUEST['export']==1){ $is_export = true; @@ -220,7 +226,7 @@ class CompanyStatementPoolController extends ThinkController $infolist = SM("company_statement_info","tab_")->field("*,'1' as st")->where("pool_id = '{$id}'")->select(); //获取母单 $pool_info = SM("company_statement_pool","tab_") - ->field('statement_num,create_lack_ids,verify_status,is_payment,withdraw_type,statement_begin_time,statement_end_time,verify_log')->where("id={$id}")->find(); + ->field('wm_statement_ids,statement_num,create_lack_ids,verify_status,is_payment,withdraw_type,statement_begin_time,statement_end_time,verify_log')->where("id={$id}")->find(); if(!empty($pool_info['create_lack_ids'])){ $l_ids = $pool_info['create_lack_ids']; $lack_info = SM("company_lack_statement_info","tab_")->field("*,'0' as st")->where("id in ({$l_ids})")->select(); @@ -258,6 +264,12 @@ class CompanyStatementPoolController extends ThinkController $pool_info["verify"] = '--'; } + if(true) { + + $this->viewWmStatement($pool_info['wm_statement_ids'],$is_export); + die(); + + } if(isset($pool_info['verify_log']['payment_user'])){ if($pool_info['verify_status'] == -2){ @@ -296,6 +308,133 @@ class CompanyStatementPoolController extends ThinkController } + public function exportWmStatement($wm_statement_ids = 0) { + + header("Content-type: text/html; charset=utf-8"); + error_reporting(E_ALL); + ini_set('display_errors', TRUE); + ini_set('display_startup_errors', TRUE); + + define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '
'); + + Vendor("PHPExcel.PHPExcel"); + $objPHPExcel = new \PHPExcel(); + $objReader = \PHPExcel_IOFactory::createReader('Excel2007'); + + //设置模板文件 + $objPHPExcel = $objReader->load("Public/Admin/excel/wmStatement.xlsx"); + + $data = SM("new_company_statement_info","tab_")->where(['id'=>$wm_statement_ids])->find(); + + $list = json_decode($data['statement_info'],true); + $statement_begin_time = date("Y-m-d",$data['statement_begin_time']); + $statement_end_time = date("Y-m-d",$data['statement_end_time']); + + $amount_data['pay_amount'] = $data['pay_amount']; + $amount_data['user_newcount'] = $data['user_newcount']; + $amount_data['fax_ratio'] = $data['fax_ratio']; + $amount_data['sum_money'] = $data['sum_money']; + + $first_party_info = json_decode($data['first_party_info'],true); + $second_party_info = json_decode($data['second_party_info'],true); + + + $objPHPExcel->getActiveSheet()->setCellValue('A1', "《 {$data['company_name']} 》结算单\n({$statement_begin_time}-{$statement_end_time})"); + + $line = 3; + foreach ($list as $key => $value) { + $objPHPExcel->getActiveSheet()->insertNewRowBefore($line,1); + $objPHPExcel->getActiveSheet()->removeConditionalStyles(); + + $objPHPExcel->getActiveSheet()->setCellValue('A'.$line, $value['statement_begin_time'].'-'.$value['statement_end_time']); + $objPHPExcel->getActiveSheet()->setCellValue('B'.$line, $value['game_name']); + $line++; + } + $objPHPExcel->getActiveSheet()->setCellValue('C3', $amount_data['pay_amount']); + $objPHPExcel->getActiveSheet()->setCellValue('D3', $amount_data['user_newcount']); + $objPHPExcel->getActiveSheet()->setCellValue('E3', $amount_data['fax_ratio'])."%"; + $objPHPExcel->getActiveSheet()->setCellValue('F3', $amount_data['sum_money']); + + $tline = $line-1; + + $objPHPExcel->getActiveSheet()->mergeCells("C3:C{$tline}")->mergeCells("D3:D{$tline}")->mergeCells("E3:E{$tline}")->mergeCells("F3:F{$tline}"); + + $objPHPExcel->getActiveSheet()->setCellValue('B'.($line), convertAmountToCn($amount_data['sum_money'])); + + //甲方信息 + $objPHPExcel->getActiveSheet()->setCellValue('B'.($tline+3), $first_party_info['partner']);//甲方 + $objPHPExcel->getActiveSheet()->setCellValue('B'.($tline+4), $first_party_info['link_man']);//联系人 + $objPHPExcel->getActiveSheet()->setCellValue('B'.($tline+5), $first_party_info['link_phone']."\t");//联系电话 + $objPHPExcel->getActiveSheet()->setCellValue('B'.($tline+6), $first_party_info['invoice_item']);//开票项目 + $objPHPExcel->getActiveSheet()->setCellValue('B'.($tline+7), $first_party_info['invoice_type']);//发票类型 + $objPHPExcel->getActiveSheet()->setCellValue('B'.($tline+8), $first_party_info['address']);//发票类型 + + //乙方信息 + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+3), $second_party_info['partner']);//乙方 + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+4), $second_party_info['link_man']);//联系人 + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+5), $second_party_info['phone']."\t");//联系电话 + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+6), $second_party_info['address']);//邮寄地址 + if ($second_party_info['is_payment'] != 1) { + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+8), $second_party_info['bank_address']);//户名 + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+9), $second_party_info['bank_card']."\t");//银行账号 + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+10), $second_party_info['bank_name']);//开户行 + } else { + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+8), $second_party_info['ali_user']);//户名 + $objPHPExcel->getActiveSheet()->setCellValue('E'.($tline+9), $second_party_info['ali_account']."\t");//银行账号 + } + + + + $fileName = "{$data['company_name']}&{$data['my_company']}-对账单{$statement_begin_time}-{$statement_end_time}"; +// dd($fileName); + ob_end_clean();//清除缓冲区,避免乱码 + header('pragma:public'); + header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . $fileName .'".xls'); + header("Content-Disposition:attachment;filename={$fileName}.xls");//attachment新窗口打印inline本窗口打印 + $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); + $objWriter->save('php://output'); + exit; + + } + + + public function viewWmStatement($wm_statement_ids = '',$is_export=0) { + + if (!$wm_statement_ids) { + $this->error('参数错误'); + } + + if ($is_export) { + $this->exportWmStatement($wm_statement_ids); + } + + $data = SM("new_company_statement_info","tab_")->where(['id'=>$wm_statement_ids])->find(); + + $list = json_decode($data['statement_info'],true); + $statement_begin_time = date("Y-m-d",$data['statement_begin_time']); + $statement_end_time = date("Y-m-d",$data['statement_end_time']); + + $amount_data['pay_amount'] = $data['pay_amount']; + $amount_data['user_newcount'] = $data['user_newcount']; + $amount_data['fax_ratio'] = $data['fax_ratio']; + $amount_data['sum_money'] = $data['sum_money']; + + $first_party_info = json_decode($data['first_party_info'],true); + $second_party_info = json_decode($data['second_party_info'],true); + + $this->assign("list",$list); + $this->assign("row",count($list)); + $this->assign("company_name",$data['company_name']); + $this->assign("statement_begin_time",$statement_begin_time); + $this->assign("statement_end_time",$statement_end_time); + $this->assign("amount_data",$amount_data); + $this->assign("first_party_info",$first_party_info); + $this->assign("second_party_info",$second_party_info); + + $this->display("poolWmStatement"); + + } + //查看 public function viewUnPaymentPool() { @@ -310,7 +449,7 @@ class CompanyStatementPoolController extends ThinkController //获取基本信息 $infolist = SM("company_statement_info","tab_")->field("*,'1' as st")->where("pool_id = '{$id}' and pay_status!=1")->select(); //获取母单 - $pool_info = SM("company_statement_pool","tab_")->field('statement_num,create_lack_ids,verify_status,is_payment,withdraw_type,statement_begin_time,statement_end_time')->where("id={$id}")->find(); + $pool_info = SM("company_statement_pool","tab_")->field('wm_statement_ids,statement_num,create_lack_ids,verify_status,is_payment,withdraw_type,statement_begin_time,statement_end_time')->where("id={$id}")->find(); // if(!empty($pool_info['create_lack_ids'])){ // $l_ids = $pool_info['create_lack_ids']; // $lack_info = SM("company_lack_statement_info","tab_")->field("*,'0' as st")->where("id in ({$l_ids})")->select(); @@ -323,6 +462,7 @@ class CompanyStatementPoolController extends ThinkController $this->assign("title",$statement_num); $this->assign("pool_status",$pool_info['verify_status']); $this->assign("is_payment",$pool_info['is_payment']); + if($infolist[0]['company_type'] == 3){ //上游 $this->viewCpPool($infolist,$is_export); @@ -335,7 +475,6 @@ class CompanyStatementPoolController extends ThinkController } - public function editPool() { if(!isset($_REQUEST['id'])){ $this->error('参数错误'); @@ -1880,9 +2019,14 @@ class CompanyStatementPoolController extends ThinkController public function cancelPool(){ if(!isset($_REQUEST['id'])) $this->error("参数错误"); $id = $_REQUEST['id']; + //获取基础信息 $db_res = $this->DBModel->where("id='{$id}'")->find(); + if (IS_SUBSITE) { + $this->cancelWmCompanyPool($db_res); + } + $is_qz = (substr($db_res['statement_num'],0,2) == "QZ" ? true :false); //强制汇总的都允许回退 if($is_qz){ //强制汇总回退 @@ -1913,6 +2057,52 @@ class CompanyStatementPoolController extends ThinkController } } + + public function cancelWmCompanyPool($info) + { + if(in_array($info['verify_status'],[3,4])) return;//有打款就不允许回退 + + $sids = $info['statement_ids']; + $wm_statement_ids = $info['wm_statement_ids']; + + SM()->startTrans();//事务 + //删除info + $infores = SM("new_company_statement_info","tab_")->where(['id'=>$wm_statement_ids])->delete(); + if($infores === false){ + SM()->rollback(); + $this->ajaxReturn(array('status' => 0,"info"=>"撤销汇总失败")); + } + //删除自己 + $poolres = $this->DBModel->where("id = {$info['id']}")->delete(); + if($poolres === false){ + SM()->rollback(); + $this->ajaxReturn(array('status' => 0,"info"=>"撤销汇总失败")); + } + //修改结算单信息 + $sids = array_filter(explode(",",$sids)); + + $st_res = SM("company_statement","tab_")->field("id,verify_status,verify_log")->where(["id"=>['in',$sids]])->select(); + + foreach($st_res as $k=>&$v){ + $v['verify_log'] = json_decode($v['verify_log'],true); + $v['verify_log']['pool_user']=$this->admininfo["username"]; + $v['verify_log']['pool_time']=date("Y.m.d H:i:s"); + $v['verify_log'] = json_encode($v['verify_log']); + $v['verify_status']=-2; + $stres = SM("company_statement","tab_")->save($v); + if($stres === false){ + SM()->rollback(); + $this->ajaxReturn(array('status' => 0,"info"=>"撤销汇总失败")); + } + } + + SM()->commit(); + $this->ajaxReturn(array( + 'status' => 1, + "info"=>"撤销汇总成功" + )); + } + /** * 重算 先全删再进行二次生成 */ @@ -2041,7 +2231,103 @@ class CompanyStatementPoolController extends ThinkController )); } + public function OpWmAuth($info) + { + $id = $info['id']; + $img = $info['ext_file']; + $remark = $info['remark']; + $create_lack_ids = $info['create_lack_ids']; + $is_qz = (substr($info['statement_num'],0,2) == "QZ" ? true :false); //强制汇总的都允许回退 + + //原始列表 + $opBtn = [ + "viewPool"=>"查看", + + "editPool"=>"编辑", + "editSpecialPuPool"=>"编辑", + + "addRemark"=>"新增备注", + "editRemark"=>"修改备注", + "viewRemark"=>"查看备注", + + "uploadVoucher"=>"上传凭证", + "viewVoucher"=>"查看凭证", + "editVoucher"=>" 编辑凭证", + + "setUlPayment"=>"线下打款", + + "setPayment"=>"打款信息确认", + "editPayment"=>"打款信息编辑", + "viewPayment"=>"打款详情", + + 'reCount'=>"重算", + 'cancelPool'=>"撤销汇总", + ]; + //操作对应菜单 + $optist = []; + switch ($info['verify_status']) { + case '-2': + case '-1': + case '0': + $optist = ["viewPool","cancelPool"]; + break; + case '1': + $optist = ["viewPool","viewVoucher","editVoucher","uploadVoucher","editPayment","setUlPayment"]; + break; + case '2': + $optist = ["viewPool","viewVoucher","editVoucher","uploadVoucher"]; + break; + case '3': + $optist = ["viewPool","viewVoucher","editVoucher","uploadVoucher","viewPayment"]; + break; + case '4': + $optist = ["viewPool","viewVoucher","editVoucher","uploadVoucher","viewPayment"]; + break; + case '5': + $optist = ["viewPool","cancelPool"]; + break; + case '6': + $optist = ["viewPool","cancelPool"]; + + break; + default: + break; + } + + if(empty($info['ext_file'])){ + //未上传凭证 + $optist = array_diff($optist, ["viewVoucher", "editVoucher"]); + }else{ + $optist = array_diff($optist, ["uploadVoucher"]); + } + + if($info['is_payment'] == 1){ + $optist = array_diff($optist, ["setUlPayment"]); + }else{ + $optist = array_diff($optist, ["setPayment","editPayment","viewPayment"]); + } + + if(empty($info['remark'])){ + //未上传备注 + $optist = array_diff($optist, ["editRemark", "viewRemark"]); + }else{ + $optist = array_diff($optist, ["addRemark"]); + } + + // + $resarr = []; + foreach ($optist as $k => $v) { + if(IS_ROOT){ + $resarr[] = $opBtn[$v]; + }else{ + if(in_array($v,$this->OpAuthList)){ + $resarr[] = $opBtn[$v]; + } + } + } + return $resarr; + } public function OpAuth($info) { diff --git a/Application/Admin/Controller/StatementMangementController.class.php b/Application/Admin/Controller/StatementMangementController.class.php index ed8c47fb4..a7b96b79a 100644 --- a/Application/Admin/Controller/StatementMangementController.class.php +++ b/Application/Admin/Controller/StatementMangementController.class.php @@ -247,9 +247,9 @@ class StatementMangementController extends ThinkController public function rewardManageList($row = 10, $p = 1) { - $companys[1] = array_column(M('partner', 'tab_')->field('id, partner as name')->select(), 'name', 'id'); - $companys[2] = array_column(M('promote_company', 'tab_')->field('id, company_name as name')->select(), 'name', 'id'); - $games = array_column(M('game', 'tab_')->field('relation_game_id, relation_game_name, partner_id')->group('relation_game_id')->select(), null, 'relation_game_id'); + $companys[1] = array_column(SM('partner', 'tab_')->field('id, partner as name')->select(), 'name', 'id'); + $companys[2] = array_column(SM('promote_company', 'tab_')->field('id, company_name as name')->select(), 'name', 'id'); + $games = array_column(SM('game', 'tab_')->field('relation_game_id, relation_game_name, partner_id')->group('relation_game_id')->select(), null, 'relation_game_id'); $map = ' 1=1 '; $params = $_GET; @@ -323,7 +323,7 @@ class StatementMangementController extends ThinkController $map .= " and rd.promote_account like ('%{$params['detail_promote_account_input']}%') "; } - $result = M('reward_record', 'tab_')->alias('r') + $result = SM('reward_record', 'tab_')->alias('r') ->field('r.id') ->join('tab_reward_detail as rd on rd.record_id = r.id', 'LEFT') ->where($map) @@ -344,7 +344,7 @@ class StatementMangementController extends ThinkController $map = '1<>1'; } - $list = M('reward_record', 'tab_')->alias('r') + $list = SM('reward_record', 'tab_')->alias('r') ->field(' r.id, r.relation_game_id, r.settlement_time, r.confirm_time, r.content, r.reward_type, r.creater_id, rd.id as rid, rd.type as detail_type, rd.company_type as detail_company_type, rd.company_id as detail_company_id , rd.company_name as detail_company_name, rd.settlement_type as detail_settlement_type, rd.promote_account as detail_promote_account,rd.amount as detail_amount @@ -400,9 +400,14 @@ class StatementMangementController extends ThinkController if ($page) { $this->assign('_page', $page); } + + if(IS_SUBSITE) { + $this->assign("IS_SUBSITE",true); + } + // ksort($record); $this->assign('list', $record); - $this->assign('promoters', array_column(M('promote', 'tab_')->where(['level'=>1])->field('id, nickname, account')->select(), null, 'id')); + $this->assign('promoters', array_column(SM('promote', 'tab_')->where(['level'=>1])->field('id, nickname, account')->select(), null, 'id')); $this->checkListOrCountAuthRestMap($map,[]); @@ -509,7 +514,7 @@ class StatementMangementController extends ThinkController //dd($settlment_info); // 更新结算信息 if ($id) { - M('reward_detail', 'tab_')->where(['record_id'=>$id])->delete(); + SM('reward_detail', 'tab_')->where(['record_id'=>$id])->delete(); } if (!empty($settlment_info[RewardModel::REWARD_TYPE_REWARD]) && !empty($settlment_info[RewardModel::REWARD_TYPE_PUNISH])) { $data['reward_type'] = RewardModel::REWARD_TYPE_ALL; @@ -529,14 +534,14 @@ class StatementMangementController extends ThinkController return $this->error("奖惩确认时间需在结算时间以后,请重新选择"); } - $upt = M('reward_record', 'tab_')->where(['id'=>$id])->save($data); + $upt = SM('reward_record', 'tab_')->where(['id'=>$id])->save($data); if ($upt === false) { $this->error('保存失败'); } else { foreach ($settlmentSet as $item) { - M('reward_detail', 'tab_')->add($item); + SM('reward_detail', 'tab_')->add($item); } - $companyName = M('partner','tab_')->field('partner')->where(['id'=>$data['company_id']])->find(); + $companyName = SM('partner','tab_')->field('partner')->where(['id'=>$data['company_id']])->find(); addOperationLog(['op_type'=>1,'key'=>$companyName['partner'].'/'.(($data['reward_type']==1)?'奖励':'惩罚').'/'.$data['money'],'op_name'=>'修改奖惩记录','url'=>U('Query/settlement'),'menu'=>'推广员-结算单管理-奖罚记录管理-修改奖惩记录']); $this->success('保存成功', U('StatementMangement/rewardManageList')); @@ -550,38 +555,38 @@ class StatementMangementController extends ThinkController $data['create_time'] = time(); $data['creater_id'] = is_login(); - $ins = M('reward_record', 'tab_')->add($data); + $ins = SM('reward_record', 'tab_')->add($data); - $record_id = M('reward_record', 'tab_')->getLastInsID(); + $record_id = SM('reward_record', 'tab_')->getLastInsID(); foreach ($settlmentSet as $item) { $item['record_id'] = $record_id; - M('reward_detail', 'tab_')->add($item); + SM('reward_detail', 'tab_')->add($item); } - $companyName = M('partner','tab_')->field('partner')->where(['id'=>$data['company_id']])->find(); + $companyName = SM('partner','tab_')->field('partner')->where(['id'=>$data['company_id']])->find(); addOperationLog(['op_type'=>0,'key'=>$companyName['partner'].'/'.(($data['reward_type']==1)?'奖励':'惩罚').'/'.$data['money'],'op_name'=>'新增奖惩记录','url'=>U('Query/settlement'),'menu'=>'推广员-结算单管理-奖罚记录管理-新增奖惩记录']); return $ins ? $this->success('新增成功', U('StatementMangement/rewardManageList')) : $this->error('新增失败'); } } else { - $games = M('game', 'tab_')->field('relation_game_id, relation_game_name')->group('relation_game_id')->select(); + $games = SM('game', 'tab_')->field('relation_game_id, relation_game_name')->group('relation_game_id')->select(); $this->assign('games', $games); if ($id) { if (I('delete')) { - $rewardRecordData = M('reward_record', 'tab_')->where(['id'=>$id])->find(); + $rewardRecordData = SM('reward_record', 'tab_')->where(['id'=>$id])->find(); - $upt = M('reward_record', 'tab_')->where(['id'=>$id])->delete(); + $upt = SM('reward_record', 'tab_')->where(['id'=>$id])->delete(); - M('reward_detail', 'tab_')->where(['record_id'=>$id])->delete(); + SM('reward_detail', 'tab_')->where(['record_id'=>$id])->delete(); - $companyName = M('partner','tab_')->field('partner')->where(['id'=>$rewardRecordData['company_id']])->find(); + $companyName = SM('partner','tab_')->field('partner')->where(['id'=>$rewardRecordData['company_id']])->find(); addOperationLog(['op_type'=>2,'key'=>$companyName['partner'].'/'.(($rewardRecordData['reward_type']==1)?'奖励':'惩罚').'/'.$rewardRecordData['money'],'op_name'=>'删除奖惩记录','url'=>U('StatementMangement/rewardManageList'),'menu'=>'推广员-结算单管理-奖罚记录管理']); return $upt ? $this->success('删除成功') : $this->error('删除失败'); } else { - $data = M('reward_record', 'tab_')->where(['id'=>$id])->find(); + $data = SM('reward_record', 'tab_')->where(['id'=>$id])->find(); if (!$data) return $this->error("未找到该记录"); $data['confirm_time'] = $data['confirm_time'] ? date('Y-m-d', $data['confirm_time']) : ''; $data['accounts'] = json_decode($data['accounts'], true) ?: []; @@ -592,15 +597,15 @@ class StatementMangementController extends ThinkController $data['reward_time'] = strtotime(date('Y-m-01')); } - $details = M('reward_detail', 'tab_')->where(['record_id'=>$id])->select(); + $details = SM('reward_detail', 'tab_')->where(['record_id'=>$id])->select(); // 根据type 来合并 foreach ($details as $item) { $item['info'] = $item; if (empty($item['company_name']) && $item['company_id']) { if ($item['company_type'] == RewardModel::COMPANY_TYPE_PARTNER) { - $item['company_name'] = M('partner', 'tab_')->where(['id'=>$item['company_id']])->getField('partner'); + $item['company_name'] = SM('partner', 'tab_')->where(['id'=>$item['company_id']])->getField('partner'); } else { - $item['company_name'] = M('promote_company', 'tab_')->where(['id'=>$item['company_id']])->getField('company_name'); + $item['company_name'] = SM('promote_company', 'tab_')->where(['id'=>$item['company_id']])->getField('company_name'); } } $tmp[$item['type']][] = $item; @@ -613,7 +618,7 @@ class StatementMangementController extends ThinkController $this->assign('details', $tmp); $this->assign('data', $data); - $this->assign('promoters', M('promote', 'tab_')->where(['level'=>1])->field('id, nickname')->select()); + $this->assign('promoters', SM('promote', 'tab_')->where(['level'=>1])->field('id, nickname')->select()); $this->assign('rewardTypes', RewardModel::$rewardTypes); $this->assign('settlementTypes', RewardModel::$settlementTypes); $this->assign('companyTypes', RewardModel::$companyTypes); @@ -679,24 +684,24 @@ class StatementMangementController extends ThinkController public function rewardManageDetail($id=0) { - $games = M('game', 'tab_')->field('relation_game_id, relation_game_name')->group('relation_game_id')->select(); + $games = SM('game', 'tab_')->field('relation_game_id, relation_game_name')->group('relation_game_id')->select(); $this->assign('games', $games); if ($id) { if (I('delete')) { - $rewardRecordData = M('reward_record', 'tab_')->where(['id'=>$id])->find(); + $rewardRecordData = SM('reward_record', 'tab_')->where(['id'=>$id])->find(); - $upt = M('reward_record', 'tab_')->where(['id'=>$id])->delete(); + $upt = SM('reward_record', 'tab_')->where(['id'=>$id])->delete(); - M('reward_detail', 'tab_')->where(['record_id'=>$id])->delete(); + SM('reward_detail', 'tab_')->where(['record_id'=>$id])->delete(); - $companyName = M('partner','tab_')->field('partner')->where(['id'=>$rewardRecordData['company_id']])->find(); + $companyName = SM('partner','tab_')->field('partner')->where(['id'=>$rewardRecordData['company_id']])->find(); addOperationLog(['op_type'=>2,'key'=>$companyName['partner'].'/'.(($rewardRecordData['reward_type']==1)?'奖励':'惩罚').'/'.$rewardRecordData['money'],'op_name'=>'删除奖惩记录','url'=>U('StatementMangement/rewardManageList'),'menu'=>'推广员-结算单管理-奖罚记录管理']); return $upt ? $this->success('删除成功') : $this->error('删除失败'); } else { - $data = M('reward_record', 'tab_')->where(['id'=>$id])->find(); + $data = SM('reward_record', 'tab_')->where(['id'=>$id])->find(); if (!$data) return $this->error("未找到该记录"); $data['confirm_time'] = $data['confirm_time'] ? date('Y-m-d', $data['confirm_time']) : ''; $data['accounts'] = json_decode($data['accounts'], true) ?: []; @@ -707,15 +712,15 @@ class StatementMangementController extends ThinkController $data['reward_time'] = strtotime(date('Y-m-01')); } - $details = M('reward_detail', 'tab_')->where(['record_id'=>$id])->select(); + $details = SM('reward_detail', 'tab_')->where(['record_id'=>$id])->select(); // 根据type 来合并 foreach ($details as $item) { $item['info'] = $item; if (empty($item['company_name']) && $item['company_id']) { if ($item['company_type'] == RewardModel::COMPANY_TYPE_PARTNER) { - $item['company_name'] = M('partner', 'tab_')->where(['id'=>$item['company_id']])->getField('partner'); + $item['company_name'] = SM('partner', 'tab_')->where(['id'=>$item['company_id']])->getField('partner'); } else { - $item['company_name'] = M('promote_company', 'tab_')->where(['id'=>$item['company_id']])->getField('company_name'); + $item['company_name'] = SM('promote_company', 'tab_')->where(['id'=>$item['company_id']])->getField('company_name'); } } $tmp[$item['type']][] = $item; @@ -728,21 +733,207 @@ class StatementMangementController extends ThinkController $this->assign('details', $tmp); $this->assign('data', $data); - $this->assign('promoters', M('promote', 'tab_')->where(['level'=>1])->field('id, nickname')->select()); + $this->assign('promoters', SM('promote', 'tab_')->where(['level'=>1])->field('id, nickname')->select()); $this->assign('rewardTypes', RewardModel::$rewardTypes); $this->assign('settlementTypes', RewardModel::$settlementTypes); $this->assign('companyTypes', RewardModel::$companyTypes); $this->display('rewardManagerDetail'); } + + public function addreward() { + + $batch = date('Ymd') . date('His') . sp_random_num(3); + $this->assign("batch", $batch); + $this->meta_title = 'EXCEL导入'; + $this->display(); + + } + + public function loopAdd() + { + + Vendor('PHPExcel.PHPExcel'); + $p = $_REQUEST; +// $batch = $p['batch']; + $checkarr = $p['checkarr']; + //循环获取添加 + if (count($checkarr) < 1) { + $this->ajaxReturn(["status" => 0, "msg" => "没有数据"]); + } + + $reward_type = [ + "无"=>0, + "奖励"=>1, + "惩罚"=>2, + "双向"=>3 + ]; + + $company_type = [ + "无"=>0, + "上游公司"=>1, + "下游公司"=>2, + "内部公司"=>3 + ]; + + $type = [ + "无"=>0, + "奖励方"=>1, + "惩罚方"=>2 + ]; + + $settlement_type = [ + "线下结算"=>1, + "线上结算"=>2 + ]; + + $all_record = []; + $all_detail = []; + $record = []; + $detail = []; + $md5 = ''; + foreach ($checkarr as $k => $v) { + + if ($v['game_name']) { + $record = []; + $detail = []; + $game_data = SM("game","tab_")->field("relation_game_id")->where(['relation_game_name'=>$v['game_name']])->find(); + + $record["reward_type"] = $reward_type[$v['reward_type']]; + $record["accounts"] = json_encode([]); + $record["relation_game_id"] = $game_data["relation_game_id"]?$game_data["relation_game_id"]:0; + $record["content"] = $v["content"]; + + $record["reward_time"] = strtotime(gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($v["reward_time"]))); + $record["confirm_time"] = strtotime(gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($v["confirm_time"]))); + $record["settlement_time"] = strtotime(gmdate("Y-m-d", \PHPExcel_Shared_Date::ExcelToPHP($v["settlement_time"]))); + $record["create_time"] = time(); + $record["creater_id"] = $_SESSION['onethink_admin']['user_auth']['uid']; + + $md5 = md5($record["relation_game_id"].$record["content"].$record["create_time"].$record["confirm_time"].$record["reward_time"].$record["settlement_time"]); + + $all_record[$md5] = $record; + if ($v["company_name"]!="无") { + + $company_data = SM("promote_company","tab_")->field("id")->where(['company_name'=>$v["company_name"]])->find(); + $detail["company_type"] = $company_type[$v["company_type"]]?$company_type[$v["company_type"]]:0; + $detail["type"] = $type[$v["type"]]?$type[$v["type"]]:0; + $detail["company_id"] = $company_data["id"]?$company_data["id"]:0; + $detail["company_name"] = $v["company_name"]?$v["company_name"]:''; + $detail["promote_account"] = $v["promote_account"]?$v["promote_account"]:''; + $detail["settlement_type"] = $settlement_type[$v["settlement_type"]]?$settlement_type[$v["settlement_type"]]:0; + $detail["amount"] = abs($v["amount"])?abs($v["amount"]):0; + $detail["confirm_time"] = $record["confirm_time"]; + + $all_detail[$md5][] = $detail; + + } + $detail = []; + if ($v["company_name_1"]!="无") { + + $company_data = SM("promote_company","tab_")->field("id")->where(['company_name'=>$v["company_name_1"]])->find(); + $detail["company_type"] = $company_type[$v["company_type_1"]]?$company_type[$v["company_type_1"]]:0; + $detail["type"] = $type[$v["type_1"]]?$type[$v["type_1"]]:0; + $detail["company_id"] = $company_data["id"]?$company_data["id"]:0; + $detail["company_name"] = $v["company_name_1"]?$v["company_name_1"]:''; + $detail["promote_account"] = $v["promote_account_1"]?$v["promote_account_1"]:''; + $detail["settlement_type"] = $settlement_type[$v["settlement_type_1"]]?$settlement_type[$v["settlement_type_1"]]:0; + $detail["amount"] = abs($v["amount_1"])?abs($v["amount_1"]):0; + $detail["confirm_time"] = $record["confirm_time"]; + + $all_detail[$md5][] = $detail; + + } + + } else { + $detail = []; + if ($v["company_name"]!="无") { + + $company_data = SM("promote_company","tab_")->field("id")->where(['company_name'=>$v["company_name"]])->find(); + $detail["company_type"] = $company_type[$v["company_type"]]?$company_type[$v["company_type"]]:0; + $detail["type"] = $type[$v["type"]]?$type[$v["type"]]:0; + $detail["company_id"] = $company_data["id"]?$company_data["id"]:0; + $detail["company_name"] = $v["company_name"]?$v["company_name"]:''; + $detail["promote_account"] = $v["promote_account"]?$v["promote_account"]:''; + $detail["settlement_type"] = $settlement_type[$v["settlement_type"]]?$settlement_type[$v["settlement_type"]]:0; + $detail["amount"] = abs($v["amount"])?abs($v["amount"]):0; + $detail["confirm_time"] = $record["confirm_time"]; + + $all_detail[$md5][] = $detail; + + } + $detail = []; + if ($v["company_name_1"]!="无") { + + $company_data = SM("promote_company","tab_")->field("id")->where(['company_name'=>$v["company_name_1"]])->find(); + $detail["company_type"] = $company_type[$v["company_type_1"]]; + $detail["type"] = $type[$v["type_1"]]?$type[$v["type_1"]]:0; + $detail["company_id"] = $company_data["id"]?$company_data["id"]:0; + $detail["company_name"] = $v["company_name_1"]?$v["company_name_1"]:''; + $detail["promote_account"] = $v["promote_account_1"]?$v["promote_account_1"]:''; + $detail["settlement_type"] = $settlement_type[$v["settlement_type_1"]]?$settlement_type[$v["settlement_type_1"]]:0; + $detail["amount"] = abs($v["amount_1"])?abs($v["amount_1"]):0; + $detail["confirm_time"] = $record["confirm_time"]; + + $all_detail[$md5][] = $detail; + + } + } + + } +// dump($all_record); + foreach ($all_record as $key => $value) { + + $insert_id = SM("reward_record","tab_")->add($value); + + foreach ($all_detail[$key] as $k => $v) { + $all_detail[$key][$k]['record_id'] = $insert_id; + } + + $is_success = SM("reward_detail","tab_")->addAll($all_detail[$key]); + + } + + $this->ajaxReturn(["status" => 1, "msg" => "导入成功"]); + + } + + //模板导出 + public function download() + { + + + header("Content-type: text/html; charset=utf-8"); + error_reporting(E_ALL); + ini_set('display_errors', TRUE); + ini_set('display_startup_errors', TRUE); + + define('EOL',(PHP_SAPI == 'cli') ? PHP_EOL : '
'); + + Vendor("PHPExcel.PHPExcel"); + $objPHPExcel = new \PHPExcel(); + $objReader = \PHPExcel_IOFactory::createReader('Excel2007'); + + //设置模板文件 + $objPHPExcel = $objReader->load("Public/Admin/excel/rewardOrfina.xlsx"); + + $fileName = "奖惩导入"; + ob_end_clean();//清除缓冲区,避免乱码 + header('pragma:public'); + header('Content-type:application/vnd.ms-excel;charset=utf-8;name="' . $fileName .'".xls'); + header("Content-Disposition:attachment;filename={$fileName}.xls");//attachment新窗口打印inline本窗口打印 + $objWriter = \PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); + $objWriter->save('php://output'); + exit; + } public function getCompanys($type=1) { if ($type == 1) { - $data = M('partner', 'tab_')->field('id, partner as name')->select(); + $data = SM('partner', 'tab_')->field('id, partner as name')->select(); } elseif ($type == 0) { $data = []; } else { - $data = M('promote_company', 'tab_')->field('id, company_name as name')->select(); + $data = SM('promote_company', 'tab_')->field('id, company_name as name')->select(); } return $this->success($data, '', true); } diff --git a/Application/Admin/View/CompanyStatement/lists.html b/Application/Admin/View/CompanyStatement/lists.html index 57ed0de84..a76a10e3f 100644 --- a/Application/Admin/View/CompanyStatement/lists.html +++ b/Application/Admin/View/CompanyStatement/lists.html @@ -475,6 +475,7 @@ }else if(id=="pool"){ var opname = "发起汇总"; var opurl = "{:U('pool_splice')}"; + var opst ="[审批通过,汇总撤销]"; var status = [1,-2]; }else if(id=="updateStatement"){ @@ -516,6 +517,7 @@ return; } text = text.join(","); + // console.log(text); if(flag){ layer.confirm(opname+"仅会对"+opst+"的申请进行处理,选择中包含其他的状态的申请将被忽略,点击取消停止操作",{title:false}, function(index){ @@ -538,6 +540,12 @@ } function _doAgreeApply(){ + var IS_SUBSITE = "{$IS_SUBSITE}"; + if (id=="pool" && IS_SUBSITE) { + _poolWmStatement(); + return; + } + //执行 layer.load(2); $.ajax({ @@ -560,6 +568,41 @@ } }); } + + function _poolWmStatement() { + layer.load(2); + $.ajax({ + type: 'post', + url: "{:U('checkWmStatement')}", + data:{id:text}, + success: function(data) { + if(data.status == 0) { + layer.msg("不同类型的结算单不能放在一起汇总"); + layer.closeAll("loading"); + } else { + var url = "{:U('poolWmStatement')}"+"&id="+text; + layer.open({ + type: 2, + title: "海南万盟天下科技有限公司", + shadeClose: true, + shade: 0.8, + area: ['70%', '80%'], + content: url + }); + layer.closeAll("loading"); + return; + } + + }, + error:function(){ + layer.closeAll("loading"); + layer.alert("网络错误或超时"); + return false; + } + }); + + + } }) $("#launch").on("click",function(){ var text = $("input:checkbox[name='ids[]']:checked").map(function(index,elem) { diff --git a/Application/Admin/View/CompanyStatement/poolWmStatement.html b/Application/Admin/View/CompanyStatement/poolWmStatement.html new file mode 100644 index 000000000..0b7b5752b --- /dev/null +++ b/Application/Admin/View/CompanyStatement/poolWmStatement.html @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ +
+
+
结算单 +
({$amount_data['statement_begin_time']}-{$amount_data['statement_end_time']})
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
结算月份合作产品名称月累计用户充值流水月新增用户数税费费率结算金额(元)
{$data[0]['statement_begin_time']}-{$data[0]['statement_end_time']}{$data[0]['game_name']}{$amount_data['pay_amount']}{$amount_data['user_newcount']}%{$amount_data['sum_money']}
{$it['statement_begin_time']}-{$it['statement_end_time']}{$it['game_name']}
+
+
+ + 返回 + + +
+
+
+
+ + + diff --git a/Application/Admin/View/CompanyStatement/showCpStatementList.html b/Application/Admin/View/CompanyStatement/showCpStatementList.html new file mode 100644 index 000000000..55c4171ed --- /dev/null +++ b/Application/Admin/View/CompanyStatement/showCpStatementList.html @@ -0,0 +1,379 @@ + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ +
+ 搜索 +
+ +
+
+ +
+ +
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
合作公司结算金额操作
aOh! 暂时还没有内容!
{$data.company_name}{$data.statement_money} + 查看 +
+
+ +
+
+ + + + {$_page|default=''} +
+
+ + + + if(C('COLOR_STYLE')=='blue_color') echo ' + + '; + + + + + + + + + + diff --git a/Application/Admin/View/CompanyStatement/showCpStatementView.html b/Application/Admin/View/CompanyStatement/showCpStatementView.html new file mode 100644 index 000000000..32c0701e1 --- /dev/null +++ b/Application/Admin/View/CompanyStatement/showCpStatementView.html @@ -0,0 +1,280 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
结算时间产品联运流水聚合流水流水合计结算比例渠道费率税费费率其他结算金额
aOh! 暂时还没有内容!
{$time}年{$data["time"]}月{$data['statement_info'][0]['game_name']|default="--"}---------------{$data['statement_info'][0]['sum_money']|default="--"}{$data['statement_info'][0]['game_name']|default="--"}{$data['statement_info'][0]['platform_money']|default="--"}{$data['statement_info'][0]['aggregate_money']|default="--"}{$data['statement_info'][0]['sum_amount']|default="--"}{$data['statement_info'][0]['ratio']|default="--"}{$data['statement_info'][0]['promote_ratio']|default="--"}{$data['statement_info'][0]['fax_ratio']|default="--"}{$data['statement_info'][0]['other_amount']|default="--"}{$data['statement_info'][0]['sum_money']|default="--"}
{$statement_info['game_name']|default="--"}---------------{$statement_info['sum_money']|default="--"}
{$statement_info['game_name']|default="--"}{$statement_info['platform_money']|default="--"}{$statement_info['aggregate_money']|default="--"}{$statement_info['sum_amount']|default="--"}{$statement_info['ratio']|default="--"}{$statement_info['promote_ratio']|default="--"}{$statement_info['fax_ratio']|default="--"}{$statement_info['other_amount']|default="--"}{$statement_info['sum_money']|default="--"}
小计--{$sum[$index]['platform_money']}{$sum[$index]['aggregate_money']}{$sum[$index]['sum_amount']}{$sum[$index]['ratio']}{$sum[$index]['promote_ratio']}{$sum[$index]['fax_ratio']}{$sum[$index]['other_amount']}{$sum[$index]['sum_money']}
+
+
+ + + diff --git a/Application/Admin/View/CompanyStatementPool/lists.html b/Application/Admin/View/CompanyStatementPool/lists.html index 2159b014e..9dddb5595 100644 --- a/Application/Admin/View/CompanyStatementPool/lists.html +++ b/Application/Admin/View/CompanyStatementPool/lists.html @@ -542,8 +542,20 @@ layer.close(index); cancelPoolAjax(url,{id:id}); }); - + + }); + + //撤销汇总 + $(".cancelWmPool,.reCount").on("click",function(){ + var id = $(this).data('id'); + var url = "{:U('cancelWmPool')}"; + layer.confirm("撤销汇总/重算都是不可逆操作,请慎重选择",{title:false}, function(index){ + layer.close(index); + cancelPoolAjax(url,{id:id}); + }); + }) + //线下打款 $(".setUlPayment").on("click",function(){ var id = $(this).data('id'); diff --git a/Application/Admin/View/CompanyStatementPool/poolWmStatement.html b/Application/Admin/View/CompanyStatementPool/poolWmStatement.html new file mode 100644 index 000000000..5e0424ff1 --- /dev/null +++ b/Application/Admin/View/CompanyStatementPool/poolWmStatement.html @@ -0,0 +1,396 @@ + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ 《{$company_name}》结算单 +
+
+
+
+
+
+
({$statement_begin_time}-{$statement_end_time})
+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
结算月份合作产品名称月累计用户充值流水月新增用户数税费费率结算金额(元)
{$list[0]['statement_begin_time']}-{$list[0]['statement_end_time']}{$list[0]['game_name']}{$amount_data['pay_amount']}{$amount_data['user_newcount']}{$amount_data['fax_ratio']}%{$amount_data['sum_money']}
{$it['statement_begin_time']}-{$it['statement_end_time']}{$it['game_name']}
支付金额{:convertAmountToCn($amount_data['sum_money'])}
备注结算金额按每月双方实际核定结算指标为准
甲方{$first_party_info['partner']}乙方{$second_party_info['partner']}
联系人{$first_party_info['link_man']}联系人{$second_party_info['link_man']}
联系电话{$first_party_info['link_phone']}联系电话{$second_party_info['phone']}
开票内容{$first_party_info['invoice_item']}邮寄地址{$second_party_info['address']}
发票类型{$first_party_info['invoice_type']}请汇入此账号
邮寄地址{$first_party_info['address']}户名{$second_party_info['ali_user']}{$second_party_info['bank_address']}
账号{$second_party_info['ali_account']}{$second_party_info['bank_card']}
开户行{$second_party_info['bank_name']}
甲方{$first_party_info['partner']}乙方{$second_party_info['partner']}
联系人{$first_party_info['link_man']}联系人{$second_party_info['link_man']}
联系电话{$first_party_info['link_phone']}联系电话{$second_party_info['phone']}
邮寄地址{$first_party_info['address']}开票内容{$second_party_info['invoice_item']}
请汇入此账号发票类型{$second_party_info['invoice_type']}
户名{$first_party_info['ali_user']}{$first_party_info['bank_address']}邮寄地址{$second_party_info['address']}
账号{$first_party_info['ali_account']}{$first_party_info['bank_card']}
开户行{$first_party_info['bank_name']}
+ +
+
+ + + diff --git a/Application/Admin/View/StatementMangement/addreward.html b/Application/Admin/View/StatementMangement/addreward.html new file mode 100644 index 000000000..19c35b751 --- /dev/null +++ b/Application/Admin/View/StatementMangement/addreward.html @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + +
+ +
+ +
+ + + + + + + + + + + + +
本次批次号: +
+
+ 用于检索使用 +
*文件上传: +
+ +
+ 暂只支持.xls .xlsx 格式文件 +
+
+ +
+ + +
+
+
+ 文件格式参考:请严格按此格式,文件的第一行必须是字段名,且字段名不允许修改 +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
序号游戏名游戏合作方奖惩时间结算时间奖惩确认时间时间说明奖惩性质奖惩类型结算公司类型结算方会长账号奖惩金额结算方式奖惩类型结算公司类型结算方会长账号奖惩金额结算方式添加人
1九天仙尘广州乐牛软件科技有限公司2021-01-012021-01-012021-01-01私聊非自己的玩家,并发微信给玩家,存在换端的嫌疑,违反平台规则,罚款1500元双向惩罚方下游公司南昌醉游网络科技有限公司ncsywl-1501线上结算奖励方下游公司万盟天下科技kefuguanlian1500线上结算wmtxhh
+
+ + +
+ + + + + + if(C('COLOR_STYLE')=='blue_color') echo ''; + + + + + + + \ No newline at end of file diff --git a/Application/Admin/View/StatementMangement/rewardManageList.html b/Application/Admin/View/StatementMangement/rewardManageList.html index 827556839..838361b13 100644 --- a/Application/Admin/View/StatementMangement/rewardManageList.html +++ b/Application/Admin/View/StatementMangement/rewardManageList.html @@ -164,6 +164,14 @@ +
+
+ + 奖惩导入 + +
+
+
diff --git a/Data/update.sql b/Data/update.sql index c6a40cc4d..e597752f2 100644 --- a/Data/update.sql +++ b/Data/update.sql @@ -2792,3 +2792,6 @@ ADD COLUMN `leave_time` int(11) NOT NULL DEFAULT 0 COMMENT '离职时间' AFTER ALTER TABLE `tab_company_statement_info` ADD COLUMN `is_reward_fine_split` tinyint(255) NULL DEFAULT 0 COMMENT '是否是奖罚分离生成 0 否 1 是' AFTER `pay_check_time`; + +ALTER TABLE `platform_wm`.`tab_company_statement_pool` +ADD COLUMN `wm_statement_ids` int(11) NOT NULL DEFAULT 0 COMMENT '子系统财务结算单id' AFTER `remark`; \ No newline at end of file diff --git a/Public/Admin/excel/rewardOrfina.xlsx b/Public/Admin/excel/rewardOrfina.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..6a149dc05e104d492df203b9ef636c7d2ae79784 GIT binary patch literal 15679 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