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

473 lines
24 KiB
PHP

<?php
namespace Admin\Controller;
/**
* 结算单
* @author ylw
*/
class SettlementController extends ThinkController
{
// 汇总结算单列表
public function sheetList($row = 10, $p = 1)
{
$map = [];
if (I('settlement_type')) {
$map['settlement_type'] = I('settlement_type');
}
if (I('settlement_time_type')) {
$map['settlement_time_type'] = I('settlement_time_type');
}
if (I('creater_id')) {
$map['creater_id'] = I('creater_id');
}
if (I('all_status')) {
$map['all_status'] = I('all_status');
}
$map['_string'] = "1 = 1";
if (I('create_time_start')) {
$map['_string'] .= " and create_time >= ".strtotime(I('create_time_start'));
}
if (I('create_time_end')) {
$map['_string'] .= " and create_time <= ".(strtotime(I('create_time_end')) + 86400);
}
$login_uid = is_login();
$list = M('settlement_sheet', 'tab_')->where($map)->page($p, $row)->order("if (audit_user ={$login_uid}, 0,1 ) and status = 3, all_status desc, create_time desc")->select();
$count = M('settlement_sheet', 'tab_')->where($map)->count();
if (!empty($list)) {
foreach ($list as &$item) {
switch ($item['settlement_type']) {
case '1':
$item['settlement_type_name'] = '上游结算单';
break;
case '2':
$item['settlement_type_name'] = '下游-内团结算单';
break;
case '3':
$item['settlement_type_name'] = '下游-外团结算单';
break;
case '4':
$item['settlement_type_name'] = '下游-个人结算单';
break;
}
switch ($item['settlement_time_type']) {
case '1':
$item['settlement_time_type_name'] = '周结';
break;
case '2':
$item['settlement_time_type_name'] = '月结';
break;
}
switch ($item['status']) {
case '1':
$item['status_name'] = '审核通过';
break;
case '2':
$item['status_name'] = '审核未通过';
break;
case '3':
$item['status_name'] = '待审核';
break;
}
$item['audit_users'] = json_decode($item['audit_users'], true);
}
}
$this->assign('admin_users', M('member')->field('uid, nickname')->select());
$page = set_pagination($count, $row);
if ($page) {
$this->assign('_page', $page);
}
$this->assign('list_data', $list);
$this->display();
}
// 生成结算单 月结算补点 周结不算
public function generateSettlementSheet($settlement_type = 0, $settlement_time_type = 0, $time_start=0, $time_end = 0, $delete=0, $id=0, $action='')
{
$msg = '';
$this->assign(I(''));
$this->assign('action', $action);
if ($delete) {
$res = M('settlement_sheet', 'tab_')->where(['id'=>$id])->delete();
$GetData = $_GET;
unset($GetData['id']);
unset($GetData['delete']);
addOperationLog(['op_type'=>2,'key'=>getNowDate(),'op_name'=>'删除汇总结算单管理','url'=>U('settlement/sheetList',$GetData),'menu'=>'推广员-结算单管理-汇总结算单管理']);
return $res ? $this->success('删除成功', '', true) : $this->success('删除失败', '', true);
}
$this->meta_title = '结算单管理';
if (empty($settlement_type)) {
$msg = '请选择汇总结算单类型';
}
if (empty($settlement_time_type)) {
$msg = '请选择结算方式';
}
$settlement_time = I('settlement_time', '');
if ($settlement_time_type == 1) {
$settlement_time = explode(' 至 ', $settlement_time);
if (count($settlement_time) != 2) {
$msg = '请选择正确的时间区间';
} else {
$time_start = strtotime($settlement_time[0]);
$time_end = strtotime($settlement_time[1]) + 3600 * 24 - 1;
}
} else {
$time_start = strtotime($settlement_time);
$time_end = strtotime('+1 month', $time_start) - 1;
}
if ($time_end > time()) {
$msg = "结算结算时间无法大于当前时间";
}
if (empty($time_start) || empty($time_end)) {
$msg = '请选择正确的时间区间';
}
if (IS_GET) {
// 判断结算时间是否冲突
$isExsist = M('settlement_sheet', 'tab_')->where(['settlement_type'=>$settlement_type, 'time_start'=>$time_start, 'time_end'=>$time_end, 'settlement_time_type'=>$settlement_time_type])->find();
if ($isExsist) {
$msg = "已存在此类型结算单";
}
// 生成结算单数据
$generate = false;
if (!$msg) {
$generate = true;
if ($settlement_type == 1) {
if ($settlement_time_type == 1) {
$map = " and p.settlement_type = 1";
} else {
$map = '';
}
$result = M('spend', 'tab_')->query("
SELECT
TRUNCATE(sum(s.pay_amount), 2) as amount, g.relation_game_id, g.relation_game_name, p.partner, p.id as p_id, p.channel_rate, p.invoice_rate, g.id as game_id
FROM
tab_spend as s
INNER JOIN tab_game g on s.game_id = g.id
INNER JOIN tab_partner p on p.id = g.partner_id {$map}
where s.pay_status = 1 and s.pay_time BETWEEN {$time_start} and {$time_end}
GROUP BY relation_game_id, p.id
ORDER BY p_id asc");
$list = [];
foreach ($result as $key => $item) {
if (!isset($list[$item['p_id']])) {
// 奖罚金额
$reward = M('reward_record', 'tab_')
->field('sum(money) as money, reward_type')
->where("company_type = 1 and company_id = {$item['p_id']} and reward_time between {$time_start} and {$time_end}")
->group('reward_type')
->select();
if (!empty($reward)) {
$reward = array_column($reward, 'money', 'reward_type');
}
$list[$item['p_id']] = [
'company_id'=>$item['p_id'],
'company_name'=>$item['partner'],
'bonuses'=>isset($reward[1]) ? $reward[1] : 0,
'fine'=>isset($reward[2]) ? $reward[2] : 0 ,
'channel_rate' => $item['channel_rate'], // 渠道费
'invoice_rate' => $item['invoice_rate'], // 税费
'time_start' => date('Y-m-d', $time_start),
'time_end' => date('Y-m-d', $time_end)
];
}
$data = [];
// 获取分成比例
if ($settlement_time_type == 1) {
$data['game_ratio'] = getGameCpRadio($item['game_id'], $item['amount'], false);
} else {
$data['game_ratio'] = getGameCpRadio($item['game_id'], $item['amount'], true);
}
$data['relation_game_id'] = $item['relation_game_id'];
$data['relation_game_name'] = $item['relation_game_name'];
$data['amount'] = $item['amount'];
$data['self_game_ratio'] = 100 - $data['game_ratio'];
$data['parter_settlement'] = floor(($item['amount'] * ($data['game_ratio']/100) - ($item['amount']*$item['channel_rate'] ) + $list[$item['p_id']]['bonuses'] - $list[$item['p_id']]['fine'])*100)/100;
$list[$item['p_id']]['channels'][] = array_merge($data, [
'company_id'=>$item['p_id'],
'company_name'=>$item['partner'],
'bonuses'=>$list[$item['p_id']]['bonuses'],
'fine'=>$list[$item['p_id']]['fine'],
'channel_rate' => $item['channel_rate'],
'invoice_rate' => $item['invoice_rate']]);
}
} else if (\in_array($settlement_type, [2, 3])) {
$map = "p.account_type = 1 and p.`level` = 1 and p.company_belong " . ($settlement_type == 2 ? " = 0 " : " in (1, 2) ") ;
if ($settlement_time_type == 1) {
$map .= " and p.settlement_type = {$settlement_time_type} ";
}
$result = M()->query("
SELECT
p.id, p.account, pc.company_name, pc.id as p_id, pc.fax_ratio, pc.settlement_contact
FROM
tab_promote p
INNER JOIN tab_promote_company pc on p.company_id = pc.id
where {$map}
order by pc.id asc
");
$list = [];
foreach ($result as $key => $item) {
$res = M()->query("
select
g.relation_game_name, g.relation_game_id, TRUNCATE(sum(s.pay_amount), 2) as amount
from
tab_spend s
inner join tab_promote p on (p.chain like '/{$item['id']}/%' or p.id = {$item['id']}) and s.promote_id = p.id
inner join tab_game g on s.game_id = g.id
where s.pay_status = 1 and s.pay_time BETWEEN {$time_start} and {$time_end}
group by g.relation_game_id
");
if ($res) {
if (!isset($list[$item['p_id']])) {
// 奖罚金额
$reward = M('reward_record', 'tab_')
->field('sum(money) as money, reward_type')
->where("company_type = 2 and company_id = {$item['p_id']} and reward_time between {$time_start} and {$time_end}")
->group('reward_type')
->select();
if (!empty($reward)) {
$reward = array_column($reward, 'money', 'reward_type');
}
$list[$item['p_id']] = [
'company_id'=>$item['p_id'],
'company_name'=>$item['company_name'],
'fax_ratio' => $item['fax_ratio'],
'bonuses'=>isset($reward[1]) ? $reward[1] : 0,
'fine'=>isset($reward[2]) ? $reward[2] : 0 ,
'settlement_contact' => $item['settlement_contact'],
'create_time' => time(),
'time_start' => date('Y-m-d', $time_start),
'time_end' => date('Y-m-d', $time_end)
];
$list[$item['p_id']]['total_amount'] = floor(($list[$item['p_id']]['bonuses'] - $list[$item['p_id']]['fine'])*100)/100;
}
foreach ($res as $k => $val) {
$gameRatio = getPromoteGameRatio($item['id'], $val['relation_game_id'], $val['amount'], $time_start, $time_end, true);
if ($settlement_time_type == 2) {
$gameRatioMax = getPromoteGameRatio($item['id'], $val['relation_game_id'], $val['amount'], $time_start, $time_end, false);
} else {
$gameRatioMax = $gameRatio;
}
$price = $val['amount']*$gameRatioMax/100 - $val['amount']*$item['fax_ratio']/100;
$list[$item['p_id']]['channels'][] = [
'promote_id' => $item['id'],
'account'=>$item['account'],
'relation_game_name'=>$val['relation_game_name'],
'relation_game_id'=>$val['relation_game_id'],
'game_ratio'=>$gameRatio,
'game_ratio_max'=>$gameRatioMax-$gameRatio,
'price'=> $price,
'amount' => $val['amount']
];
$list[$item['p_id']]['total_amount'] += $price;
}
}
}
} else if ($settlement_type == 4) {
$map = "p.account_type = 2 and p.`level` = 1 " ;
if ($settlement_time_type == 1) {
$map .= " and p.settlement_type = {$settlement_time_type} ";
}
$result = M()->query("
SELECT
p.id, p.account, pc.company_name, pc.id as p_id, company_relation, p.admin_id, pc.bank_card, pc.bank_cardname, pc.bank_name, pc.bank_address
FROM
tab_promote p
INNER JOIN tab_promote_company pc on p.company_id = pc.id
where {$map}
order by pc.id asc
");
$list = [];
foreach ($result as $key => $item) {
$res = M()->query("
select
g.relation_game_name, g.relation_game_id, TRUNCATE(sum(s.pay_amount), 2) as amount
from
tab_spend s
inner join tab_promote p on (p.chain like '/{$item['id']}/%' or p.id = {$item['id']}) and s.promote_id = p.id
inner join tab_game g on s.game_id = g.id
where s.pay_status = 1 and s.pay_time BETWEEN {$time_start} and {$time_end}
group by g.relation_game_id
");
if ($res) {
if (!isset($list[$item['p_id']])) {
// 奖罚金额
$reward = M('reward_record', 'tab_')
->field('sum(money) as money, reward_type')
->where("company_type = 2 and company_id = {$item['p_id']} and reward_time between {$time_start} and {$time_end}")
->group('reward_type')
->select();
if (!empty($reward)) {
$reward = array_column($reward, 'money', 'reward_type');
}
$list[$item['p_id']] = [
'company_id'=>$item['p_id'],
'company_name'=>$item['company_name'],
'bonuses'=>isset($reward[1]) ? $reward[1] : 0,
'fine'=>isset($reward[2]) ? $reward[2] : 0 ,
'settlement_contact' => $item['settlement_contact'],
'bank_card' => $item['bank_card'],
'bank_address' => $item['bank_address'],
'create_time' => time(),
'time_start' => date('Y-m-d', $time_start),
'time_end' => date('Y-m-d', $time_end)
];
$list[$item['p_id']]['total_amount'] = floor(($list[$item['p_id']]['bonuses'] - $list[$item['p_id']]['fine'])*100)/100;
}
foreach ($res as $k => $val) {
$gameRatio = getPromoteGameRatio($item['id'], $val['relation_game_id'], $val['amount'], $time_start, $time_end, true);
if ($settlement_time_type == 2) {
$gameRatioMax = getPromoteGameRatio($item['id'], $val['relation_game_id'], $val['amount'], $time_start, $time_end, false);
} else {
$gameRatioMax = $gameRatio;
}
$price = $val['amount']*$gameRatioMax/100;
$list[$item['p_id']]['channels'][] = [
'promote_id' => $item['id'],
'account'=>$item['account'],
'relation_game_name'=>$val['relation_game_name'],
'relation_game_id'=>$val['relation_game_id'],
'game_ratio'=>$gameRatio,
'game_ratio_max'=>$gameRatioMax-$gameRatio,
'price'=> $price,
'amount' => $val['amount'],
'type_name' => '个人',
'company_relation_name' => $item['company_relation'] == 0 ? "自主开发及维护" : ($item['company_relation'] == 1 ? "只维护" : ""),
'admin_name' => get_admin_nickname($item['admin_id']) ?: '无'
];
$list[$item['p_id']]['total_amount'] += $price;
}
}
}
} else {
$generate = false;
$msg = "请选择正确的结算单类型";
}
}
$this->assign("generate", $generate);
$this->assign('admin_users', M('member')->where(['status'=>1])->field('uid, nickname')->select());
$this->assign('listData', array_values($list));
$this->assign('msg', $msg);
$this->assign('settlement_type', $settlement_type);
$this->meta_title = '结算单管理';
$this->display('generatesettlementsheet');
} else {
// 判断结算时间是否冲突
if ($msg) {
return $this->error($msg, true, true);
}
if ($id) {
$info = M('settlement_sheet', 'tab_')->where(['id'=>$id])->find();
if (!$info) {
return $this->error('未找到该记录');
}
} else {
if (\sizeof($_POST['settlement_sheet']) == 0) {
return $this->error('无法生成无记录的结算单', true, true);
}
$isExsist = M('settlement_sheet', 'tab_')->where(['settlement_type'=>$settlement_type, 'time_start'=>$time_start, 'time_end'=>$time_end, 'settlement_time_type'=>$settlement_time_type])->find();
if ($isExsist) {
return $this->error('已存在此类型结算单', true, true);
}
$data['creater_id'] = is_login();
$data['create_time'] = time();
$data['orderid'] = $settlement_type.$settlement_time_type.date('YmdHis').$data['creater_id'].rand(1000, 9999);
$data['settlement_type'] = $settlement_type;
$data['settlement_time_type'] = $settlement_time_type;
$data['time_start'] = $time_start;
$data['time_end'] = $time_end;
$data['audit_users'] = json_encode($_POST['audit_users']);
$data['settlement_sheet'] = json_encode($_POST['settlement_sheet']);
$data['audit_user'] = $_POST['audit_users'][0];
$res = M('settlement_sheet', 'tab_')->add($data);
// 生成消息
$notice['user_id'] = $_POST['audit_users'][0];
$notice['content'] = "结算单汇总审核:有一个结算单待你审核,请尽快处理!";
$notice['type'] = 3;
$notice['status'] = 2;
$notice['create_time'] = time();
$notice['game_id'] = $res;
M('msg', 'tab_')->add($notice);
$GetData = $_POST;
addOperationLog(['op_type'=>0,'key'=>$data['orderid'],'op_name'=>'生成汇总结算单','url'=>U('settlement/generateSettlementSheet',$GetData),'menu'=>'推广员-结算单管理-生成汇总结算单']);
return $res ? $this->success('生成成功', true, true) : $this->error('生成失败', true, true);
}
}
}
public function sheetDetail($id=0)
{
$info = M('settlement_sheet', 'tab_')->where(['id'=>$id])->find();
if (!$info) {
return $this->error('未找到该记录');
}
$info['listData'] = json_decode($info['settlement_sheet'], true);
$info['audit_users'] = json_decode($info['audit_users']);
$login_uid = is_login();
$arr_index = array_search($login_uid, $info['audit_users']);
$audit_auth = true;
if ($arr_index === false) {
$audit_auth = false;
} else if ($arr_index + 1 != $info['step']) {
$audit_auth = false;
} else if ($arr_index + 1 == sizeof($info['audit_users']) && $info['status'] != 3) {
$audit_auth = false;
} else if ($info['status'] != 3) {
$audit_auth = false;
}
$this->assign(['audit_auth'=>$audit_auth]);
$this->assign($info);
$this->meta_title = '结算单管理';
$this->display();
}
public function auditSheet($id=0, $audit_type = 2, $remark = '' )
{
$info = M('settlement_sheet', 'tab_')->where(['id'=>$id])->find();
if (!$info) {
return $this->error('未找到该记录', true, true);
}
$info['audit_users'] = json_decode($info['audit_users']);
$login_uid = is_login();
$arr_index = array_search($login_uid, $info['audit_users']);
if ($arr_index === false) {
return $this->error('无权审核改结算单', true, true);
} else if ($arr_index + 1 != $info['step']) {
return $this->error('您已审核过此结算单', true, true);
} else if ($arr_index + 1 == sizeof($info['audit_users']) && $info['status'] != 3) {
return $this->error('该结算单已经审核完毕', true, true);
}
$is_last = ($info['step'] >= sizeof($info['audit_users']));
$update['remark'] = $remark;
$update['status'] = $audit_type == 1 ? ($is_last ? 1 : 3) : 2;
$update['step'] = ($audit_type == 1 && !$is_last) ? $info['step'] + 1 : $info['step'];
$update['audit_user'] = $login_uid;
if ($audit_type == 1 && $is_last) {
$update['all_status'] = 1;
} else if ($audit_type == 2) {
$update['all_status'] = 2;
}
// 通知审核
if ($update['status'] == 3 && !$is_last) {
$notice['user_id'] = $info['audit_users'][$info['step']];
$notice['content'] = "结算单汇总审核:有一个结算单待你审核,请尽快处理!";
$notice['type'] = 3;
$notice['status'] = 2;
$notice['create_time'] = time();
$notice['game_id'] = $id;
M('msg', 'tab_')->add($notice);
}
$upt = M('settlement_sheet', 'tab_')->where(['id'=>$id])->save($update);
return $upt ? $this->success('审核成功', true, true) : $this->error('审核失败', true, true);
}
}