complexChannelModel = new ComplexChannelModel; $this->_gameModel = new Game; $this->_polyChannelDeposit = new PolyChannelDeposit; $this->_polyChannelDepositRecord= new polyChannelDepositRecord; $this->_polyChannelGameFrozen = new PolyChannelGameFrozen; $this->complexLogic = new Complex; } /** * 聚合渠道列表 * @return mixed|string */ public function index() { /**搜索条件**/ $name = input('name'); $status = input('status'); $register = input('register'); $login = input('login'); $consume = input('consume'); $where['a.flag'] = 4; if ($name) { $where['a.name'] = ['like', "%$name%"]; } if ($status!='') { $where['a.status'] = $status; } if ($register!='') { if($register==1){ $where['b.register'] = $register; } else{ $where['b.register'] = [['eq',0],['exp',Db::raw('is null')],'or']; } } if ($login!='') { if($login==1){ $where['b.login'] = $login; } else{ $where['b.login'] = [['eq',0],['exp',Db::raw('is null')],'or']; } } if ($consume!='') { if($consume==1){ $where['b.consume'] = $consume; } else{ $where['b.consume'] = [['eq',0],['exp',Db::raw('is null')],'or']; } } $channles = $this->complexChannelModel ->alias('a') ->join("nw_polychannel b","a.id=b.channel_id","left") ->field('a.id,a.name,a.mark,a.remark,a.create_time,a.status,b.channel_id,b.param_field,b.login,b.register,b.consume') ->where($where) ->order("a.id DESC") ->paginate(30,false, ['query' => input('request.')]); // 获取分页显示 $page = $channles->render(); $this->assign('total', $channles->total()); $this->assign("page", $page); $this->assign("channles", $channles); return $this->fetch(); } /** * 添加渠道 * * @return mixed */ public function add() { return $this->fetch(); } /** * 添加渠道 * */ public function addPost() { $polychannelModel = new Polychannel; $param_field = input('post.param_field','','trim'); $field_client = input('post.field_client','','trim'); $register= input('post.register',0,'intval'); $login= input('post.login',0,'intval'); $consume= input('post.consume',0,'intval'); $data = [ 'name' => input('post.name','','trim'), 'remark' => input('post.remark'), 'mark' => input('post.mark','','trim'), 'status' => input('post.status'), 'register' => input('post.register'), 'login' => input('post.login'), 'consume' => input('post.consume'), 'param_field' => $param_field, 'field_client' => $field_client, ]; $result = $this->validate($data, [ ['name', 'require', '请填写渠道名称'], ['remark', 'max:255', '渠道描述最大不超过255个字符'], ['mark', 'require|alphaNum|max:20', '请填写渠道标识|渠道标识必须为英文和数字|渠道标识最大不超过20个字符'], ['status', 'require|integer', '渠道状态不能为空|渠道状态必须为整数'], ['register', 'require|integer', '渠道新增状态不能为空|渠道新增状态必须为整数'], ['login', 'require|integer', '渠道登录状态不能为空|渠道登录状态必须为整数'], ['consume', 'require|integer', '渠道消费状态不能为空|渠道消费状态必须为整数'], ['param_field', 'max:500', '服务端参数字段名最大不超过500个字符'], ['field_client', 'max:500', '客户端参数字段名最大不超过500个字符'], ]); if (true !== $result) { $this->error($result); } // elseif(!empty($param_field) && count(explode(';',$param_field))!=2){ // $this->error('参数字段超过两个或不足两个,请联系技术员进行特殊处理'); // } else { Db::startTrans(); try { //1. 添加渠道信息 $channelInfo = $this->complexChannelModel->where(['name' => $data['name']])->find(); if ($channelInfo) { throw new Exception("该渠道信息已存在"); } if ( $this->complexChannelModel->where(['mark' => $data['mark']])->find() ) { throw new Exception("渠道标识不能重复"); } unset($data['param_field']); unset($data['field_client']); unset($data['register']); unset($data['login']); unset($data['consume']); $data['flag'] = 4; $data['create_time'] = NOW_TIMESTAMP; //添加渠道信息 $this->complexChannelModel->save($data); if ( !$this->complexChannelModel->id ) { throw new Exception("添加渠道信息失败"); } //2. 添加聚合渠道参数 $polyChannelData = array(); $polyChannelData['channel_id'] = $this->complexChannelModel->id; if(!empty($param_field)){ $polyChannelData['param_field'] = $param_field; } if(!empty($field_client)){ $polyChannelData['field_client'] = $field_client; } $polyChannelData['register'] = $register?1:0; $polyChannelData['login'] = $login?1:0; $polyChannelData['consume'] = $consume?1:0; $polyChannelData['update_time'] = NOW_TIMESTAMP; $polychannelModel->save($polyChannelData); $status = $data['status'] ? '正常' : '冻结'; $register = $register ? '冻结' : '正常'; $login = $login ? '冻结' : '正常'; $consume = $consume ? '冻结' : '正常'; //写入日志 $this->insertLog($this->current_node, "新增聚合渠道:{$data['name']},渠道标识:{$data['mark']},渠道状态:{$status},新增状态:{$register},登录状态:{$login},消费状态:{$consume}", 54); Db::commit(); } catch (\Exception $e) { Db::rollback(); $this->error("添加失败: " . $e->getMessage()); } $this->success("添加成功!", "ComplexChannel/index"); } } /** * 编辑渠道 * * @return mixed */ public function edit() { $polychannelModel = new Polychannel; $id = input('id', 0, 'intval'); $channel = $this->complexChannelModel->where(["id" => $id])->find(); if(empty($channel)){ $this->error('聚合渠道信息不存在'); } $polychannel = $polychannelModel->where(["channel_id" => $id])->find(); if(!empty($channel)){ $param_field = $polychannel['param_field']; $field_client = $polychannel['field_client']; $register = $polychannel['register']; $login = $polychannel['login']; $consume = $polychannel['consume']; } else{ $param_field = ''; $field_client = ''; $register = 0; $login = 0; $consume = 0; } $this->assign('channel', $channel); $this->assign('param_field', $param_field); $this->assign('field_client', $field_client); $this->assign('register', $register); $this->assign('login', $login); $this->assign('consume', $consume); return $this->fetch(); } /** * 编辑渠道接口 * */ public function editPost() { $id = input('post.id',0,'intval'); $param_field= input('post.param_field','','trim'); $field_client= input('post.field_client','','trim'); $register= input('post.register',0,'intval'); $login= input('post.login',0,'intval'); $consume= input('post.consume',0,'intval'); $polychannelModel = new Polychannel; $data = ['name' => input('post.name','','trim'), 'remark' => input('post.remark'), 'status' => input('post.status'), 'register' => input('post.register'), 'login' => input('post.login'), 'consume' => input('post.consume'), 'param_field' => $param_field, 'field_client' => $field_client ]; $result = $this->validate($data, [ ['name', 'require', '请填写渠道名称'], ['remark', 'max:255', '渠道描述最大不超过255个字符'], ['status', 'require|integer', '渠道状态不能为空|渠道状态必须为整数'], ['register', 'require|integer', '渠道新增状态不能为空|渠道新增状态必须为整数'], ['login', 'require|integer', '渠道登录状态不能为空|渠道登录状态必须为整数'], ['consume', 'require|integer', '渠道消费状态不能为空|渠道消费状态必须为整数'], ['param_field', 'max:500', '服务端参数字段名最大不超过500个字符'], ['field_client', 'max:500', '客户端参数字段名最大不超过500个字符'], ]); if (true !== $result) { $this->error($result); } elseif (empty($this->complexChannelModel->where(['id' => $id])->find())) { $this->error('聚合渠道不存在'); } // elseif(!empty($param_field) && count(explode(';',$param_field))!=2){ // $this->error('参数字段超过两个或不足两个,请联系技术员进行特殊处理'); // } else { Db::startTrans(); try { //1. 添加渠道信息 $channelInfo = $this->complexChannelModel->where(['name' => $data['name'], 'id' => ['<>', $id]])->find(); if ($channelInfo) { throw new Exception("渠道名称不能重复"); } unset($data['param_field']); unset($data['field_client']); unset($data['register']); unset($data['login']); unset($data['consume']); //添加渠道信息 $this->complexChannelModel->save($data, ['id' => $id]); //2. 添加聚合渠道参数 $polyChannelData = array(); if (!empty($param_field)) { $polyChannelData['param_field'] = $param_field; } if (!empty($field_client)) { $polyChannelData['field_client'] = $field_client; } $polyChannelData['register'] = $register ? 1 : 0; $polyChannelData['login'] = $login ? 1 : 0; $polyChannelData['consume'] = $consume ? 1 : 0; $polyChannelData['update_time'] = NOW_TIMESTAMP; //更新 if($polychannelModel->where(['channel_id'=>$id])->find()) { $result = $polychannelModel->save($polyChannelData,['channel_id'=>$id]); } //新增 else{ $polyChannelData['channel_id'] = $id; $result = $polychannelModel->save($polyChannelData); } $status = $data['status'] ? '正常' : '冻结'; $mark = $this->complexChannelModel->where(['id' => $id])->value('mark'); $register = $register ? '冻结' : '正常'; $login = $login ? '冻结' : '正常'; $consume = $consume ? '冻结' : '正常'; //写入日志 $this->insertLog($this->current_node, "修改聚合渠道:{$data['name']},渠道标识:{$mark},渠道状态:{$status},新增状态:{$register},登录状态:{$login},消费状态:{$consume}", 55); Db::commit(); } catch (\Exception $e) { Db::rollback(); $this->error("编辑失败: " . $e->getMessage()); } $this->success("编辑成功!", "ComplexChannel/index"); } } //变更渠道状态 public function updateStatus() { $polychannelModel = new Polychannel; //渠道ID $id = input('id', 0, 'intval'); $status = input('status', 0, 'intval'); if (!empty($id)) { $result = $this->complexChannelModel->where(["id" => $id,'flag'=>4])->setField('status', $status); if ($result !== false) { //添加日志 $frozenInfo = $polychannelModel->where(['id' => $id])->find(); $channelInfo = $this->complexChannelModel->where(['id' => $id])->find(); $channel_name = $channelInfo['name']; $mark = $channelInfo['mark']; $register = $frozenInfo['register'] ? '冻结' : '正常'; $login = $frozenInfo['login'] ? '冻结' : '正常'; $consume = $frozenInfo['consume'] ? '冻结' : '正常'; $statusStr = $status ? '正常' : '冻结'; $this->insertLog($this->current_node, "修改聚合渠道:{$channel_name},渠道标识:{$mark},渠道状态:{$statusStr},新增状态:{$register},登录状态:{$login},消费状态:{$consume}", 55); $this->success("更改渠道状态成功!", url("ComplexChannel/index")); } else { $this->error('更改渠道状态失败!'); } } else { $this->error('数据传入失败!'); } } // +---------------------------------------------------------------------- // | 聚合游戏 // +---------------------------------------------------------------------- /** * 聚合游戏列表 */ public function gameList() { $is_down = input('request.download', '0', 'intval'); $channel_id = input('request.channel_id', '0', 'intval'); $gameid = $this->request->param('gameid', 0, 'intval'); $type = input('request.type', ''); $condition = []; if (!empty($channel_id)) { $condition['cg.channel_id'] = $channel_id; } if (!empty($gameid)) { $condition['cg.game_id'] = $gameid; } if (!empty($type)) { $condition['g.type'] = $type; } $polychannelGameModel = new PolychannelGame; if ($is_down) { $list = $polychannelGameModel->alias('cg') ->join('nw_complex_channel c', 'cg.channel_id=c.id', 'left') ->join('cy_game g', 'g.id=cg.game_id', 'left') ->join('cy_game_pay_discount cgpd', 'cgpd.game_id=cg.game_id', 'left') ->field('cg.game_id,cg.id,cg.create_time,cg.remark,cg.param,g.name game_name,g.origin_name,c.name channel_name,c.mark, cg.discount_status, cgpd.proportion') ->where($condition) ->order("cg.id DESC") ->select(); } else { $list = $polychannelGameModel->alias('cg') ->join('nw_complex_channel c', 'cg.channel_id=c.id', 'left') ->join('cy_game g', 'g.id=cg.game_id', 'left') ->join('cy_game_pay_discount cgpd', 'cgpd.game_id=cg.game_id', 'left') ->field('cg.game_id,cg.id,cg.create_time,cg.remark,cg.param,g.name game_name,g.origin_name,c.name channel_name,c.mark, cg.discount_status, cgpd.proportion') ->where($condition) ->order("cg.id DESC") ->paginate(30, false, ['query' => input('get.')]); } if($is_down>0){ $title = "聚合游戏列表-".date('YmdHis'); if(!$list){ $this->error('暂无数据'); } $this->downloadexls($list, $title,'listGame'); exit(); } // 获取分页显示 $page = $list->render(); $channelList = $this->_getChannelList(); $selfChannelList = array(); foreach ($channelList as $channel) { $selfChannelList[ $channel['id']] = $channel; } $this->assign('channel_list', $selfChannelList); $this->assign('total', $list->total()); $this->assign("page", $page); $this->assign('list',$list); $SelfGameList = model('Common/Game')->getAllByCondition('id,name', [],'','self'); $GameList = array(); foreach ($SelfGameList as $game) { $GameList[ $game['id']] = $game; } $this->assign('game_list', $GameList); return $this->fetch('game_list'); } /** * 获得聚合渠道的参数 */ public function ajaxGetChannelGameParam() { if(request()->isAjax()) { $polychannelGameModel = new PolychannelGame; $polychannelModel = new Polychannel; $id = input('post.id'); //渠道游戏ID $info = $polychannelGameModel->field('channel_id,game_id,param,param_client') ->where(['id'=>$id]) ->find(); if(empty($info)){ $this->error('聚合渠道游戏信息不存在'); } $return_html = '服务端参数
'; $return_html_client = '客户端参数
'; $return_html .= $info['param_client'].'
'; $return_html_client .= $info['param'].'
'; $this->result(['return_html'=>$return_html_client.'
'.$return_html],1); } else{ $this->error('非法请求'); } } /** * 聚合渠道游戏新增 */ public function gameAdd() { $complexChannelModel = new ComplexChannelModel; $gameModel = new Game; //表单提交 if (request()->isPost()) { $polychannelGameModel = new PolychannelGame; $polychannelModel = new Polychannel; $input = input(); // $param = input('post.param'); //参数 $param = $input['param']; //参数 $param_client = $input['param_client']??""; //参数 $data = [ 'game_id' => input('post.game_id', 0, 'intval'), 'channel_id' => input('post.channel_id', 0, 'intval'), 'remark' => input('post.remark'), 'discount_status' => input('post.discount_status', 2, 'intval'), // 折扣状态(1=开启、2=关闭) ]; $result = $this->validate($data, [ ['game_id', 'require|positiveInteger', '请选择游戏|游戏ID必须为整型'], ['channel_id', 'require|positiveInteger', '请选择渠道|渠道ID必须为整型'], ['remark', 'max:500', '备注最大不超过500个字符'], ]); if (true !== $result) { $this->error($result); } elseif ($polychannelGameModel->where(['game_id' => $data['game_id'], 'channel_id' => $data['channel_id']])->find()) { $this->error('渠道游戏信息已经存在'); } else { $data['create_time'] = NOW_TIMESTAMP; $paramArr = $polychannelModel->field('param_field,field_client')->where(['channel_id' => $data['channel_id']])->find(); if ($param && !empty($paramArr['param_field'])) { // if(count($param)!=2){ // $this->error('参数字段超过两个或不足两个,请联系技术员进行特殊处理'); // } $paramHandle = explode(';', $paramArr['param_field']); $newParam = []; for ($i = 0; $i < count($paramHandle); $i++) { $newParam[$paramHandle[$i]] = ''; if (!empty($param[$i])) { $newParam[$paramHandle[$i]] = $param[$i]; } } if ($newParam) { $newParam = json_encode($newParam); } $data['param'] = $newParam; } if ($param_client) { $data['param_client'] = $param_client; } // 判断当前游戏是否有折扣配置,没有则不能开启折扣 $proportion = Db::table('cy_game_pay_discount')->where(['game_id' => $data['game_id']])->value('proportion')??0; if($data['discount_status'] == 1 && $proportion == 0){ $this->error('当前游戏未配置折扣,不能开启使用'); } Db::startTrans(); try { $polychannelGameModel->insert($data); //如果聚合渠道预付款配置表没有记录时,新增 if(!$this->_polyChannelDeposit->where(['channel_id'=>$data['channel_id']])->find()) { //聚合渠道预付款配置 $this->_polyChannelDeposit->insert(['channel_id'=>$data['channel_id'],'mobile'=>'','create_time'=>NOW_TIMESTAMP]); } //聚合渠道游戏冻结配置 $this->_polyChannelGameFrozen->insert([ 'game_id'=>$data['game_id'], 'channel_id'=>$data['channel_id'], 'create_time'=>NOW_TIMESTAMP ]); Db::commit(); } catch (\Exception $e) { Db::rollback(); $this->error("渠道游戏添加失败!".$e->getMessage()); } $this->success('渠道游戏添加成功','ComplexChannel/gameList'); } } $channelList= $complexChannelModel->field('id,name')->where(['status'=>1,'flag'=>4])->order('name asc')->select(); $selfChannelList = array(); foreach ($channelList as $channel) { $selfChannelList[ $channel['id']] = $channel; } $gameList = $gameModel->getAllByCondition('id,name',['isdelete'=>0],'name asc','self'); $selfGameList = array(); foreach ($gameList as $game) { $selfGameList[ $game['id']] = $game; } $this->assign('game_list',$selfGameList); $this->assign('channel_list',$selfChannelList); return $this->fetch('game_add'); } /** * 获得聚合渠道的参数字段 */ public function ajaxGetChannelParamField() { if(request()->isAjax()) { $channel_id = input('post.channel_id'); $polychannelModel = new Polychannel; $param_field = $polychannelModel->field('param_field,field_client')->where(['channel_id'=>$channel_id])->find(); $this->result(['param_field'=>$param_field['param_field'],'field_client'=>$param_field['field_client']],1); } else{ $this->error('非法请求'); } } /** * 聚合渠道游戏编辑 */ public function gameEdit() { $polychannelGameModel = new PolychannelGame; $polychannelModel = new Polychannel; $id = input('id',0,'intval'); $info = $polychannelGameModel->table('cy_polychannel_game cg,nw_complex_channel c,cy_game g') ->field('cg.*,g.name game_name,c.name channel_name') ->where('cg.channel_id=c.id and g.id=cg.game_id') ->where(['cg.id'=>$id]) ->find(); if(empty($info)){ $this->error('聚合渠道游戏信息不存在'); } // 参数字段 $param_field_arr = $polychannelModel->field('field_client,param_field')->where(['channel_id'=>$info['channel_id']])->find(); $param_field = $param_field_arr['param_field']; $field_client = $param_field_arr['field_client']; // 折扣信息 $proportion = Db::table('cy_game_pay_discount')->where(['game_id' => $info['game_id']])->value('proportion'); //表单提交 if(request()->isPost()) { $param = input('post.param'); $param_client = input('post.param_client'); // 参数 $discount_status = input('post.discount_status'); // 折扣状态(1=开启、2=关闭) $data = [ 'remark' => input('post.remark'), ]; $result = $this->validate($data, [ ['remark', 'max:500', '备注最大不超过500个字符'], ]); if (true !== $result) { $this->error($result); } else{ if($param){ // if(count($param)!=2){ // $this->error('参数字段超过两个或不足两个,请联系技术员进行特殊处理'); // } if(!is_json($param)){ $this->error('json异常'); } $data['param'] = $param; } if($param_client){ $data['param_client'] = $param_client; } // 折扣状态 if($discount_status){ $data['discount_status'] = $discount_status; } $polychannelGameModel->save($data,['id'=>$id]); $this->success('渠道游戏编辑成功','ComplexChannel/gameList'); } } $discountInfo = [ 'status' => 2, 'proportion' => 0 ]; if($proportion > 0 && $proportion < 1){ $discountInfo = [ 'status' => 1, 'proportion' => $proportion ]; } $this->assign('discountInfo',$discountInfo); $this->assign('info',$info); $this->assign('param_field',$param_field); $this->assign('arrParam',$info['param']); $this->assign('field_client',$field_client); $this->assign('arrParamClient',$info['param_client']); return $this->fetch('game_edit'); } /** * 聚合游戏记录删除 */ public function gameDelete() { $id = $this->request->param('id', 0, 'intval'); $polychannelGameModel = new PolychannelGame; Db::startTrans(); try { // 获取游戏id和渠道id $info = $polychannelGameModel->where(['id'=>$id])->field('game_id,channel_id')->find(); $polychannelGameModel->where(['id'=>$id])->delete(); $this->_polyChannelGameFrozen->where(['game_id'=>$info['game_id'],'channel_id'=>$info['channel_id']])->delete(); Db::commit(); } catch (\Exception $e) { Db::rollback(); $this->error("删除失败!".$e->getMessage()); } $this->success("删除成功!"); } // 聚合游戏冻结配置 public function listGameFrozen(){ $is_down = input('request.download', '0', 'intval'); $channel_id = $this->request->param('channel_id', 0, 'intval'); $condition = []; $condition['channel_id'] = $channel_id; $list = []; $count_total_amount = $count_real_amount = $total_advance = $balance = $last_advance = 0; $param = input(); $whereTime = []; if(!empty($param['start_time'])){ // $whereTime['start_time'] = strtotime($param['start_time'] . " 00:00:00"); $whereTime['start_time'] = strtotime($param['start_time']); } if(!empty($param['end_time'])){ // $whereTime['end_time'] = strtotime($param['end_time'] . " +1 day"); $whereTime['end_time'] = strtotime($param['end_time']); } if (!empty($condition)) { if($is_down>0){ $list = $this->_polyChannelGameFrozen->where($condition)->order('id desc')->select(); // 安全写法 if (is_object($list) && method_exists($list, 'toArray')) { $list = $list->toArray(); } else { $list = collection($list)->toArray(); // TP5 自带 helper 函数 } $gameIds = array_column($list, 'game_id'); } else { $list = $this->_polyChannelGameFrozen->where($condition)->order('status desc, total_amount desc')->paginate(50, false, array('query' => $param)); $gameIds = array_column($list->toArray()['data'], 'game_id'); } // dump($whereTime); // ## 游戏配置信息 : divide_point=祈盟分成, proportion=折扣 $gamePayConfig = Db::table('cy_polychannel_game_frozen')->alias('cpgf') ->join('cy_game_pay_discount cgpd', 'cpgf.game_id = cgpd.game_id', 'LEFT') ->where(['cpgf.game_id' => ['in', $gameIds], 'cpgf.channel_id' => $channel_id]) ->column('cpgf.divide_point, cgpd.proportion', 'cpgf.game_id'); // $gameByProportion = Db::table('cy_game_pay_discount')->where(['game_id' => ['in', $gameIds]])->column('game_id,proportion'); $openGameIds = []; foreach ( $list as &$item ) { // 当前流水 $item['total_amount'] = Db::table('nw_complex_pay') ->where(['gameid' => $item['game_id'], 'channel_id' => $channel_id, 'status' => 1]) ->where(function($q) use ($whereTime) { if (!empty($whereTime['start_time'])) { $q->where('create_time', '>=', $whereTime['start_time']); } if (!empty($whereTime['end_time'])) { $q->where('create_time', '<', $whereTime['end_time']); } }) ->sum('amount'); $item['discount'] = 0; if(!empty($gamePayConfig[$item['game_id']]['proportion'])){ $item['discount'] = $gamePayConfig[$item['game_id']]['proportion']; } $item['game_name'] = $this->_getGameName($item['game_id']); $item['origin_name'] = $this->_getGameOriginName($item['game_id']); $item['divide_point'] = (0 != $item['divide_point']) ? $item['divide_point']: 0; // 折扣后流水 $discount_amount = cleanAmount($item['total_amount']); if($item['discount']){ $discount_amount = cleanAmount(number_format($item['total_amount']*$item['discount'], 2)); } $item['discount_amount'] = $discount_amount; // 扣除预付款 $item['actual_amount'] = round($discount_amount*$item['divide_point'], 2); if($item['status'] == 1){ $openGameIds[] = $item['game_id']; } } // ## 当前流水 // $count_total_amount = $this->_polyChannelGameFrozen->where(['channel_id' => $channel_id, 'status' => 1, 'game_id' => ['in', $gameIds]])->sum('total_amount'); $count_total_amount = Db::table('nw_complex_pay') ->where(['gameid' => ['in', $openGameIds], 'channel_id' => $channel_id, 'status' => 1]) ->where(function($q) use ($whereTime) { if (!empty($whereTime['start_time'])) { $q->where('create_time', '>=', $whereTime['start_time']); } if (!empty($whereTime['end_time'])) { $q->where('create_time', '<', $whereTime['end_time']); } }) ->sum('amount'); $count_total_amount = floatval($count_total_amount); // ## 折扣后流水 // $count_real_amount = $this->complexLogic->getChannelGameTotalAmount($channel_id); $count_real_amount = Db::table('nw_complex_pay')->alias('ncp') ->join('cy_game_pay_discount cgpd', 'ncp.gameid = cgpd.game_id', 'LEFT') ->where(['ncp.gameid' => ['in', $openGameIds], 'ncp.channel_id' => $channel_id, 'ncp.status' => 1]) ->where(function($q) use ($whereTime) { if (!empty($whereTime['start_time'])) { $q->where('ncp.create_time', '>=', $whereTime['start_time']); } if (!empty($whereTime['end_time'])) { $q->where('ncp.create_time', '<', $whereTime['end_time']); } }) ->value("ROUND(SUM(ncp.amount * COALESCE(cgpd.proportion, 1.000)), 2)"); $count_real_amount = floatval($count_real_amount); // ## 扣除预付款累计 $count_deduct_amount = 0; // $count_deduct_amount = Db::table('nw_complex_pay')->alias('ncp') // ->join('cy_polychannel_game_frozen cpgf', 'ncp.gameid = cpgf.game_id', 'LEFT') // ->where(['ncp.gameid' => ['in', $gameIds], 'ncp.channel_id' => $channel_id, 'ncp.create_time' => ['between', [$param['start_time'], $param['end_time']]], 'ncp.status' => 1]) // ->value("ROUND(SUM(ncp.amount * cpgf.divide_point), 2)"); $count_deduct_list = Db::table('nw_complex_pay') ->where(['gameid' => ['in', $openGameIds], 'channel_id' => $channel_id, 'status' => 1]) ->where(function($q) use ($whereTime) { if (!empty($whereTime['start_time'])) { $q->where('create_time', '>=', $whereTime['start_time']); } if (!empty($whereTime['end_time'])) { $q->where('create_time', '<', $whereTime['end_time']); } }) ->field("gameid, SUM(amount) as amount") ->group("gameid") ->select(); foreach ($count_deduct_list as &$item) { $amount = $item['amount']; // 折扣 if(!empty($gamePayConfig[$item['gameid']]) && $gamePayConfig[$item['gameid']]['proportion'] > 0){ $amount = $amount * $gamePayConfig[$item['gameid']]['proportion']; } // 分成 if(!empty($gamePayConfig[$item['gameid']]) && $gamePayConfig[$item['gameid']]['divide_point'] > 0){ $amount = $amount * $gamePayConfig[$item['gameid']]['divide_point']; } $count_deduct_amount += $amount; } $count_deduct_amount = round($count_deduct_amount, 2); // ## 已交预付款 $ChannelDepositInfo = $this->_polyChannelDeposit->where(['channel_id' => $channel_id])->find(); if($ChannelDepositInfo){ $total_advance = floatval($ChannelDepositInfo->total_advance); $last_advance = floatval($ChannelDepositInfo->last_advance); } // 查询时间内清空后交的预付款 // $total_advance = Db::table('cy_polychannel_deposit_record')->where(['channel_id' => $channel_id]) // ->where(function($q) use ($whereTime) { // if (!empty($whereTime['start_time'])) { // $q->where('create_time', '>=', $whereTime['start_time']); // } // if (!empty($whereTime['end_time'])) { // $q->where('create_time', '<', $whereTime['end_time']); // } // })->sum('amount'); // dump($total_advance, $count_real_amount); // ## 剩余预付款 = 累计预付款 - 扣除预付款 $balance = floatval(bcsub($total_advance, $count_deduct_amount, 2)); if($is_down>0){ $title = "聚合游戏冻结配置-".date('YmdHis'); if(!$list){ $this->error('暂无数据'); } $list_more = array(); $list_more['count_total_amount'] = $count_total_amount; $list_more['count_real_amount'] = $count_real_amount; $list_more['total_advance'] = $total_advance; $list_more['last_advance'] = $last_advance; $list_more['balance'] = $balance; $this->downloadexls($list, $title, 'listGameFrozen', $list_more); exit(); } } $this->assign('list', $list); $this->assign('total', $list->total()); $this->assign('page', $list->render()); $this->assign('count', [ $count_total_amount, // 当前流水 $count_real_amount, // 折扣后流水 $count_deduct_amount, // 扣除预付款 $total_advance, // 累计预付款 $balance, // 剩余预付款 $last_advance, // 最近一次充值预付款 ]); $channelList = $this->_getChannelList(); $selfChannelList = array(); foreach ($channelList as $channel) { $selfChannelList[ $channel['id']] = $channel; } $this->assign('channel_list', $selfChannelList); $this->assign('select_channel',$channel_id); return $this->fetch("listGameFrozen"); } public function editGameFrozen() { if (request()->isPost()) { $divide_point = $this->request->param('divide_point', 0, 'floatval'); $status = $this->request->param('status', 0, 'intval'); $depf_register = $this->request->param('depf_register', 0, 'intval'); $depf_login = $this->request->param('depf_login', 0, 'intval'); $depf_consume = $this->request->param('depf_consume', 0, 'intval'); if (0 >= $divide_point || 1 < $divide_point) { $this->error('‘祈盟所得分成’配置,只能在0-1之间!'); } $switch = [0,1]; if ( ! in_array($status, $switch) || ! in_array($depf_register, $switch) || ! in_array($depf_login, $switch) || ! in_array($depf_consume, $switch) ) { $this->error('预付状态|禁止新增|禁止登录|禁止充值等参数只能设定为1或0'); } $id = $this->request->param('id', 0, 'intval'); $data = [ 'divide_point' => $divide_point, 'depf_register' => $depf_register, 'depf_login' => $depf_login, 'depf_consume' => $depf_consume, 'status' => $status, 'update_time' => time() ]; $update = $this->_polyChannelGameFrozen->where(['id' => $id])->update($data); if ( false === $update ) { $this->error('更新失败'); } else { $info = $this->_polyChannelGameFrozen->where(['id' => $id])->column('id,channel_id,game_id'); $content = '编辑了渠道:'.$this->_getChannelName($info[$id]['channel_id']).",游戏:".$this->_getGameName($info[$id]['game_id']); $content .= ",分成配置:".$divide_point; $content .= ",预付状态:".($status ? '开启' : '关闭'); $content .= ",禁止新增:".($depf_register ? '开启' : '关闭'); $content .= ",禁止登录:".($depf_login ? '开启' : '关闭'); $content .= ",禁止充值:".($depf_consume ? '开启' : '关闭'); $this->insertLog($this->current_node, $content, 51); $this->success('更新成功', url('ComplexChannel/listGameFrozen', ['channel_id' => $info[$id]['channel_id'] ] ) ); } } else { $id = $this->request->param('id', 0, 'intval'); if ( empty($id) ) { $this->error('参数出错'); } $info = $this->_polyChannelGameFrozen->field(['id', 'game_id', 'channel_id', 'divide_point', 'depf_register', 'depf_login', 'depf_consume', 'status'])->find($id); if ( empty($info) ) { $this->error('数据不存在'); } $info['game_name'] = $this->_getGameName($info['game_id']); $info['divide_point'] = (0 != $info['divide_point']) ? $info['divide_point']: ''; $this->assign('vo', $info); return $this->fetch("editGameFrozen"); } } // 聚合渠道预付款配置 public function listDeposit() { $channel_id = $this->request->param('channel_id', 0, 'intval'); $condition = []; if (!empty($channel_id) ) { $condition['channel_id'] = $channel_id; } //查询参数 $param = input('get.'); $list = $this->_polyChannelDeposit->where($condition)->order('id desc')->paginate(20, false, array('query' => $param)); // 批量获取渠道总流水 $channel_ids = array_column($list->toArray()['data'], 'channel_id'); // 批量获取渠道名称和描述 $channelInfoMap = []; if (!empty($channel_ids)) { $channelInfoMap = $this->complexChannelModel ->where('id', 'in', $channel_ids) ->column('name,remark', 'id'); } foreach ( $list as &$channel ) { $channelId = $channel['channel_id']; $channel['channel_name'] = $channelInfoMap[$channelId]['name'] ?? ''; $channel['channel_desc'] = $channelInfoMap[$channelId]['remark'] ?? ''; $channel['total_amount'] = $this->complexLogic->getChannelGameTotalAmount($channelId); } $this->assign('total', $list->total()); $this->assign('page', $list->render()); $this->assign('list', $list); $channelList = $this->_getChannelList(); $selfChannelList = array(); foreach ($channelList as $channel) { $selfChannelList[ $channel['id']] = $channel; } $this->assign('channel_list', $selfChannelList); return $this->fetch("listDeposit"); } public function editDeposit() { if (request()->isPost()) { $last_advance = $this->request->param('add2advance', 0); $mobile = $this->request->param('mobile', '', 'trim'); $warn_amount = $this->request->param('warn_amount', 0, 'floatval'); $over_limit_amount = $this->request->param('over_limit_amount', 0, 'floatval'); $remark = $this->request->param('remark', '', 'filterAndTrimInput'); if ( 0 > $warn_amount || 0 > $over_limit_amount ) { $this->error('预警额度和可超额度都不能小于零'); } /* if ($last_advance < 0) { $this->error('新增预付款必须为正整数,不追加请留空'); } */ $mobile = str_replace(PHP_EOL, ',', $mobile); $mobileArray = explode(",",$mobile); while(list($key,$val)=@each($mobileArray)){ if (trim($val)) { if(! preg_match("/^1\d{10}$/", trim($val))){ $this->error('存在手机号码不正确,请确认'); } else{ $mobileArray[$key] = trim($val); } } else{ unset($mobileArray[$key]); } } $mobileArray = array_unique($mobileArray); $mobile = implode(",",$mobileArray); $id = $this->request->param('id', 0, 'intval'); $data = [ 'mobile' => $mobile, 'warn_amount' => $warn_amount, 'over_limit_amount' => $over_limit_amount, 'remark' => $remark, 'update_time' => time() ]; // 启动事务 $result = true; // Db::startTrans(); try { if ( 0 <> $last_advance ) { $data['last_advance'] = $last_advance; $data['total_advance'] = Db::raw("total_advance+{$last_advance}"); // $channel_id = $this->_polyChannelDeposit->where(['id' => $id])->value('channel_id'); $depositInfo = $this->_polyChannelDeposit->where(['id' => $id])->field('channel_id,total_advance')->find(); $total_amount = $this->complexLogic->getChannelGameTotalAmount($depositInfo['channel_id']); $remaining_amount = bcsub($depositInfo['total_advance'], $total_amount, 2); $recordData = [ 'channel_id' => $depositInfo['channel_id'], 'amount' => $last_advance, 'remaining_amount' => $remaining_amount, 'admin_id' => session('ADMIN_ID') ?: 1, 'admin_name' => session('USERNAME') ?: '', 'remark' => $remark, 'create_time' => time(), ]; // dump($recordData); $result = $this->_polyChannelDepositRecord->insert($recordData); } $update = $this->_polyChannelDeposit->where(['id' => $id])->update($data); if ( false === $update || false === $result) { throw new \Exception('更新失败'); } else { $channel_id = $this->_polyChannelDeposit->where(['id' => $id])->value('channel_id'); $content = '编辑了渠道:'.$this->_getChannelName($channel_id); ( 0 <> $last_advance ) && $content .= ",增加预付款:".$last_advance; $content .= ",手机号码:".$mobile; $content .= ",预警额度:{$warn_amount}元"; $content .= ",可超额度:{$over_limit_amount}元"; $content .= ",备注:".$remark; $this->insertLog($this->current_node, $content, 52); } Db::commit(); $this->success('更新成功', url('ComplexChannel/listDeposit') ); } catch (\Exception $e){ Db::rollback(); if ($e instanceof \think\exception\HttpResponseException) { throw $e; } $this->error('操作失败:' . $e->getMessage()); } } else { $id = $this->request->param('id', 0, 'intval'); if ( empty($id) ) { $this->error('参数出错'); } $info = $this->_polyChannelDeposit->field(['id', 'channel_id', 'total_advance', 'mobile', 'warn_amount', 'over_limit_amount', 'remark'])->find($id); if ( empty($info) ) { $this->error('数据不存在'); } $info['channel_name'] = $this->_getChannelName($info['channel_id']); $info['channel_desc'] = $this->_getChannelDesc($info['channel_id']); $info['total_amount'] = $this->complexLogic->getChannelGameTotalAmount($info['channel_id']); $info['mobile'] = str_replace(',',PHP_EOL, $info['mobile']); //多个手机号用逗号分隔 $this->assign('vo', $info); return $this->fetch("editDeposit"); } } // 聚合渠道预付款记录 public function listDepositRecord() { $channel_id = $this->request->param('channel_id', 0, 'intval'); $condition = []; if ( ! empty($channel_id) ) { $condition['channel_id'] = $channel_id; } $list = $this->_polyChannelDepositRecord->where($condition)->order('id desc')->select(); $this->assign('list', $list); return $this->fetch("listDepositRecord"); } /** * 获取聚合渠道列表 * * @return array */ protected function _getChannelList() { $list = $this->complexChannelModel->field(['id', 'name'])->where(['flag' => 4])->order('id desc')->select(); return $list ?: []; } /** * 获取游戏名称 * * @param int $game_id * @return string */ protected function _getGameName($game_id) { $nickname = $this->_gameModel->getName($game_id); return $nickname ?: ''; } /** * 获取游戏原名 * * @param int $game_id * @return string */ protected function _getGameOriginName($game_id) { $nickname = $this->_gameModel->getOriginName($game_id); return $nickname ?: ''; } /** * 获取渠道名称 * * @param int $channel_id * @return string */ protected function _getChannelName($channel_id) { $name = $this->complexChannelModel->where(['id' => $channel_id] )->value('name'); return $name ?: ''; } protected function _getChannelDesc($channel_id) { $desc = $this->complexChannelModel->where(['id' => $channel_id] )->value('remark'); return $desc ?: ''; } }