= ".strtotime(I('create_time_start')); } if (I('create_time_end')) { $map['_string'] = "create_time <= ".strtotime(I('create_time_end')); } $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(); 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 sum(s.pay_amount) 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'] = $item['amount'] * $data['game_ratio']/100 - ($item['amount']*$item['channel_rate'] ) + $list[$item['p_id']]['bonuses'] - $list[$item['p_id']]['fine']; $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, sum(s.pay_amount) as amount from tab_spend s inner join tab_promote p on p.chain like '/{$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'] = $list[$item['p_id']]['bonuses'] - $list[$item['p_id']]['fine']; } 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, sum(s.pay_amount) as amount from tab_spend s inner join tab_promote p on p.chain like '/{$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'] = $list[$item['p_id']]['bonuses'] - $list[$item['p_id']]['fine']; } 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); 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'] + 1 >= 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); } }