redis = \think\Cache::store('default')->handler(); } /** * 渠道结算单列表 */ public function index() { $settle_type = input('settle_type',0,'intval'); $first_audit_status = input('first_audit_status',0,'intval'); $second_audit_status = input('second_audit_status',0,'intval'); $begin_time = input('start','','trim'); $end_time = input('end','','trim'); $channelModel = new Channel; $where = []; //渠道名 if(input('request.channel_id')!='') { $where['a.channel_id'] = input('request.channel_id',0,'intval'); } //区服类型 if(input('request.settle_type')!=''){ $where['a.settle_type'] = $settle_type; } //一级审核状态 if(input('request.first_audit_status')!=''){ $where['a.first_audit_status'] = $first_audit_status; } //二级审核状态 if(input('request.second_audit_status')!=''){ $where['a.second_audit_status'] = $second_audit_status; } //申请开始时间和结束时间不为空时 if ($begin_time != '' && $end_time != '') { $where['a.create_time'] = [ ['>=', strtotime($begin_time)], ['<=', strtotime($end_time . ' 23:59:59')], ]; } //开始时间不为空时 elseif ($begin_time != '') { $where['a.create_time'] = ['>=', strtotime($begin_time)]; } //结束时间不为空时 elseif ($end_time != '') { $where['a.create_time'] = ['<=', strtotime($end_time . ' 23:59:59')]; } $channelList = $channelModel->getAllByCondition('id,name',['level'=>1,'flag'=>3],'name asc'); if (request()->isAjax() && input('download')) { $sql = model('ChannelDivideSettle')->alias('a') ->join('nw_channel c','a.channel_id=c.id','left') ->field('a.*,c.name as channel_name') ->where($where) ->order('a.create_time desc') ->fetchSql(true)->select(); if((new MakeReportGo())->addTask('admin.settleIndex',$sql,session_id())){ $this->success('报表生成的任务已经提交, 报表生成完成后,会及时通知您,请耐心稍等'); } else{ $this->error('报表生成任务不可重复提交,如遇到无法导出情况,建议修改查询条件解除当前状态,提交重新生成报表任务!'); } } $param = input('request.'); //分页带条件 $list = model('ChannelDivideSettle')->alias('a') ->join('nw_channel c','a.channel_id=c.id','left') ->field('a.*,c.name as channel_name') ->where($where) ->order('a.create_time desc') ->paginate(10,false,array('query' => $param)); // 获取分页显示的HTML $page = $list->render(); $this->assign('channel_list',$channelList); $this->assign('list', $list); $this->assign('page', $page); $this->assign('start', $begin_time); $this->assign('end', $end_time); return $this->fetch(); } /** * 二级结算单审核列表 */ public function checklist() { $settle_type = input('settle_type',0,'intval'); $settle_period = input('settle_period',0,'intval'); $second_audit_status = input('second_audit_status',0,'intval'); $begin_time = input('start','','trim'); $end_time = input('end','','trim'); $channelModel = new Channel; $where = []; $where['a.first_audit_status'] = 1; //渠道名 if(input('request.channel_id')!='') { $where['a.channel_id'] = input('request.channel_id',0,'intval'); } //区服类型 if(input('request.settle_type')!=''){ $where['a.settle_type'] = $settle_type; } //结算方式 if(input('request.settle_period')!=''){ $where['a.settle_period'] = $settle_period; } //二级审核状态 if(input('request.second_audit_status') != ''){ $where['a.second_audit_status'] = $second_audit_status; } //申请开始时间和结束时间不为空时 if ($begin_time != '' && $end_time != '') { $where['a.create_time'] = [ ['>=', strtotime($begin_time)], ['<=', strtotime($end_time . ' 23:59:59')], ]; } //开始时间不为空时 elseif ($begin_time != '') { $where['a.create_time'] = ['>=', strtotime($begin_time)]; } //结束时间不为空时 elseif ($end_time != '') { $where['a.create_time'] = ['<=', strtotime($end_time . ' 23:59:59')]; } $channelList = $channelModel->getAllByCondition('id,name',['level'=>1,'flag'=>3],'name asc'); if (request()->isAjax() && input('download')) { $sql = model('ChannelDivideSettle')->alias('a') ->join('nw_channel c','a.channel_id=c.id','left') ->field('a.*,c.name as channel_name') ->where($where) ->order('a.create_time desc') ->fetchSql(true)->select(); if((new MakeReportGo())->addTask('admin.settleCheckList',$sql,session_id())){ $this->success('报表生成的任务已经提交, 报表生成完成后,会及时通知您,请耐心稍等'); } else{ $this->error('报表生成任务不可重复提交,如遇到无法导出情况,建议修改查询条件解除当前状态,提交重新生成报表任务!'); } } $param = input('request.'); //分页带条件 $list = model('ChannelDivideSettle')->alias('a') ->join('nw_channel c','a.channel_id=c.id','left') ->field('a.*,c.name as channel_name') ->where($where) ->order('a.create_time desc') ->paginate(10,false,array('query' => $param)); // 获取分页显示的HTML $page = $list->render(); $this->assign('channel_list',$channelList); $this->assign('list', $list); $this->assign('page', $page); $this->assign('start', $begin_time); $this->assign('end', $end_time); return $this->fetch(); } //一级审核 public function audit() { if (request()->isAjax()) { $id = input('id',0,'intval'); $beizhu = input('beizhu','','trim'); $status = input('status','0','intval'); if(empty($id)){ $this->error('ID不能为空'); } if($status<>1 && $status<>2){ $this->error('非法审核状态'); } $settleInfo = model('ChannelDivideSettle')->where(['id' => $id])->find(); if(empty($settleInfo)){ $this->error('结算单不存在'); } else if($settleInfo['first_audit_status']<>0){ $this->error('该结算单已经一级审核过,不能再进行审核'); } if($status == $settleInfo['first_audit_status']){ $this->error('您未更改订单状态,请选择要更改的状态'); } //检查账号 if(!$settleInfo['channel_id']){ $this->error('结算单异常:无归属渠道'); } $channelInfo = model('Channel')->where(['id'=>$settleInfo['channel_id']])->find(); if (empty($channelInfo)){ $this->error('结算单异常:结算单归属渠道不存在'); } else if($channelInfo['level'] <> 1){ $this->error('结算单异常:结算单归属渠道层级有误'); } $auditData = array(); $auditData['id'] = $id; $auditData['first_audit_status'] = $status; $auditData['first_audit_time'] = NOW_TIMESTAMP; $auditData['first_audit_remark'] = $beizhu; $auditData['first_audit_admin_name'] = session('USERNAME'); Db::startTrans(); try { if($status==2){ //审核不通过,退回 $result = model('ChannelDivideSettle')->where(['id'=>$id,'first_audit_status'=>array('in',[0])])->update($auditData); if (!$result) { throw new Exception("更改结算单状态失败"); } //恢复订单为未结算 $updPayData = array(); $updPayData['settle_channel_id'] = 0; $updPayData['settle_id'] = 0; $updPayData['settle_update_time'] = 0; $updResult = model('Pay')->where(['settle_id'=>$settleInfo['id'],'settle_channel_id'=>$settleInfo['channel_id']])->update($updPayData); if ( !$updResult) { throw new Exception("更新订单为未结算失败"); } $this->insertLog($this->current_node, "渠道结算单一级审核,结算单ID:".$settleInfo['id'].",审核状态:审核不通过",172); } else if($status==1){ //一级审核通过 $result = model('ChannelDivideSettle')->where(['id'=>$id,'first_audit_status'=>array('in',[0])])->update($auditData); if (!$result) { throw new Exception("更改结算单状态失败"); } $this->insertLog($this->current_node, "渠道结算单一级审核,结算单ID:".$settleInfo['id'].",审核状态:审核通过",172); } Db::commit(); } catch (\Exception $e) { Db::rollback(); $this->error("添加失败: " . $e->getMessage()); } $this->success('审核成功'); } else{ $this->error('非法请求'); } } //二级审核 public function secondAudit() { if (request()->isAjax()) { $id = input('id',0,'intval'); $beizhu = input('beizhu','','trim'); $status = input('status','0','intval'); if(empty($id)){ $this->error('ID不能为空'); } if($status<>1 && $status<>2){ $this->error('非法审核状态'); } $settleInfo = model('ChannelDivideSettle')->where(['id' => $id])->find(); if(empty($settleInfo)){ $this->error('结算单不存在'); } else if($settleInfo['first_audit_status'] <> 1){ $this->error('结算单一级审核未通过,不能进行审核'); } else if($settleInfo['second_audit_status'] <> 0){ $this->error('结算单审核已审核过,不能再进行审核'); } if($status == $settleInfo['second_audit_status']){ $this->error('您未更改订单状态,请选择要更改的状态'); } //检查账号 if(!$settleInfo['channel_id']){ $this->error('结算单异常:无归属渠道'); } $channelInfo = model('Channel')->where(['id'=>$settleInfo['channel_id']])->find(); if (empty($channelInfo)){ $this->error('结算单异常:结算单归属公会不存在'); } else if($channelInfo['level'] <> 1){ $this->error('结算单异常:结算单归属公会层级有误'); } if($status==1){ if($settleInfo['settle_method'] == 2){ //审核外放渠道结算单 if(!$channelInfo['parent_id']){ $this->error('结算单异常:结算单公会账号无所属商务!'); } $parentChannelInfo = model("Channel")->field("id,name,level,parent_id,status,channel_tg_type")->where(['id'=>$channelInfo['parent_id']])->find(); if(empty($parentChannelInfo)){ $this->error('结算单公会账号所属商务不存在,请确认结算审核单是否有误'); } else if($parentChannelInfo['channel_tg_type'] <> 1){ $this->error('结算单公会账号所属商务为非外部投放渠道,请确认结算申请是否有误!'); } $relChannelInfo = model("ChannelInfo")->where(['channel_id'=>$channelInfo['parent_id']])->find(); if(!$relChannelInfo){ $this->error('外部投放渠道结算审核,请先通知所属商务补充完身份认证相关信息后再进行操作'); } $channelInfoApply = model("ChannelInfo")->field("id,channel_id,real_name,apply_status,type,person_id,zfb_account,bank_ban_mobile,bank_number,bank_province_city,bank_name,bank_open_name,bank_open_number")->where(['channel_id'=>$channelInfo['parent_id'],'apply_status'=>1])->find(); if(empty($channelInfoApply)){ $this->error('外部投放渠道结算审核,所属商务的身份认证尚未认证通过,不能进行操作'); } } } $auditData = array(); $auditData['id'] = $id; $auditData['second_audit_status'] = $status; $auditData['second_audit_time'] = NOW_TIMESTAMP; $auditData['second_audit_remark'] = $beizhu; $auditData['second_audit_admin_name'] = session('USERNAME'); Db::startTrans(); try { if($status==1){ //审核通过 //添加账户金额变动信息 $detData = array(); $detData['channel_id'] = $channelInfo['id']; $detData['channel_name'] = $channelInfo['name']; $detData['change_amount'] = $settleInfo['total_divide_amt']; $detData['account_type'] = 2; //结算账户 $detData['type'] = 8; //结算收入 $detData['out_orderid'] = $settleInfo['orderid']; $detData['create_time'] = NOW_TIMESTAMP; $insertDetId = model('ChannelAccountDet')->insertGetId($detData); if ( !$insertDetId) { throw new Exception("添加账户变动明细失败"); } $updData = array(); $updData['js_amount'] = Db::raw("js_amount+".$settleInfo['total_divide_amt']); $updData['update_time'] = time(); $updResult = model('Channel')->where(['id'=>$channelInfo['id']])->update($updData); if (!$updResult) { throw new Exception("账户金额变动失败"); } $result = model('ChannelDivideSettle')->where(['id'=>$id,'first_audit_status'=>array('in',[1]),'second_audit_status'=>array('in',[0])])->update($auditData); if ($result === false) { throw new Exception("更改结算单状态失败"); } if($settleInfo['settle_method'] == 2){ //审核外放渠道结算单 //指定时间内,禁止重复下单 if(!requestDuplicateCheck('channel_withdraw_duplicate_'.$settleInfo['channel_id'],10)){ throw new Exception("结算审核通过完成自动提现时请求过多,请于10s以后,再次进行提现操作"); } $orderid = 'W'.makeOrderid(); $withdrawData = array(); $withdrawData['orderid'] = $orderid; $withdrawData['channel_id'] = $channelInfo['id']; $withdrawData['channel_name'] = $channelInfo['name']; $withdrawData['withdraw_amt'] = $settleInfo['total_divide_amt']; $withdrawData['remark'] = '外部投放公会提现'; $withdrawData['status'] = 1; $withdrawData['create_time'] = time(); $withdrawData['audit_time'] = time(); $withdrawData['audit_remark'] = '外部投放公会提现自动审核通过'; $withdrawData['audit_admin_name'] = session('USERNAME'); $withdrawData['real_name'] = $channelInfoApply['real_name']; $withdrawData['person_id'] = $channelInfoApply['person_id']; $withdrawData['zfb_account'] = $channelInfoApply['zfb_account']; $withdrawData['bank_ban_mobile']= $channelInfoApply['bank_ban_mobile']; $withdrawData['bank_number'] = $channelInfoApply['bank_number']; $withdrawData['bank_province_city'] = $channelInfoApply['bank_province_city']; $withdrawData['bank_name'] = $channelInfoApply['bank_name']; $withdrawData['bank_open_name'] = $channelInfoApply['bank_open_name']; $withdrawData['bank_open_number'] = $channelInfoApply['bank_open_number']; $insertWithdrawId = model("ChannelWithdraw")->insert($withdrawData); if(!$insertWithdrawId){ throw new Exception("创建提现订单失败! "); } $detData = array(); $detData['channel_id'] = $channelInfo['id']; $detData['channel_name'] = $channelInfo['name']; $detData['change_amount'] = -$settleInfo['total_divide_amt']; $detData['account_type'] = 2; //结算账户 $detData['type'] = 9; //提现 $detData['out_orderid'] = $orderid; $detData['create_time'] = NOW_TIMESTAMP; $insertDetId = model('ChannelAccountDet')->insertGetId($detData); if ( !$insertDetId) { throw new Exception("添加账户变动明细失败"); } $updData = array(); $updData['js_amount'] = Db::raw("js_amount-".$settleInfo['total_divide_amt']); $updData['update_time'] = time(); $updResult = model('Channel')->where(['id'=>$channelInfo['id'],'js_amount'=>array('egt',$settleInfo['total_divide_amt'])])->update($updData); if (!$updResult) { throw new Exception("账户金额变动失败"); } $this->redis->del('channel_withdraw_duplicate_'.$settleInfo['channel_id']); } $this->insertLog($this->current_node, "外部投放渠道结算单审核,结算单ID:".$settleInfo['id'].",审核状态:审核通过",172); } else if($status==2){ //接单已刷单改状态 $result = model('ChannelDivideSettle')->where(['id'=>$id,'first_audit_status'=>array('in',[1]),'second_audit_status'=>array('in',[0])])->update($auditData); if ($result === false) { throw new Exception("更改结算单状态失败"); } //恢复订单为未结算 $updPayData = array(); $updPayData['settle_channel_id'] = 0; $updPayData['settle_id'] = 0; $updPayData['settle_update_time'] = 0; $updResult = model('Pay')->where(['settle_id'=>$settleInfo['id'],'settle_channel_id'=>$settleInfo['channel_id']])->update($updPayData); if ( !$updResult) { throw new Exception("更新订单为未结算失败"); } $this->insertLog($this->current_node, "渠道结算单审核,结算单ID:".$settleInfo['id'].",审核状态:审核不通过",172); } Db::commit(); } catch (\Exception $e) { Db::rollback(); $this->error("添加失败: " . $e->getMessage()); } $adminInfo = model('ChannelAdmin')->where(['channel_id'=>$settleInfo['channel_id'],'mobile'=>['neq','']])->find(); if (!empty($adminInfo) && $adminInfo['mobile']){ $result = (new \app\common\library\Sms)->sendSettleAuditInfo($channelInfo['name'], $adminInfo['mobile'], $settleInfo['orderid'], $status); } $this->success('审核成功'); } else{ $this->error('非法请求'); } } /** * 渠道结算单列表 */ public function detail() { $settleId = input('settleId',0,'intval'); if(!$settleId){ $this->error('请选择结算单ID'); } $where = array(); $where['id'] = $settleId; $settleInfo = model("ChannelDivideSettle")->where($where)->field("id,orderid,total_amount,total_divide_amt,remark")->find(); if(!$settleInfo){ $this->error('该结算单不存在或您不能查看'); } $where = array(); $where['p.settle_id'] = $settleId; // var_dump($where); $settleDetInfo = model("ChannelDivideSettleDet")->alias('p') ->join('cy_game g', 'p.game_id = g.id','left') ->field("p.game_id AS game_id,g.name as game_name,p.pay_amt,p.ratio,p.divide_amt,p.coupon_amount_amt,p.actual_amount") ->where($where) ->select(); $param = input('request.'); //分页带条件 $where = array(); $where['p.settle_id'] = $settleId; $detPaylist = model("ChannelDivideSettleDetPay")->alias('p') ->join('cy_game g', 'p.game_id = g.id','left') ->field("p.orderid,p.username,p.create_time,p.game_id AS game_id,g.name as game_name,p.amount AS amount,p.divide_amt,p.ratio,p.serverid,p.servername,p.rolename,p.coupon_amount,p.actual_amount") ->where($where) ->order('p.create_time desc') ->paginate(10,false,array('query' => $param)); // 获取分页显示的HTML $page = $detPaylist->render(); $this->assign('settleInfo',$settleInfo); $this->assign('settleDetInfo',$settleDetInfo); $this->assign('detPaylist',$detPaylist); $this->assign('page', $page); return $this->fetch('detail'); } /** * 二级审核详情 */ public function secondDetail() { $this->detail(); return $this->fetch('detail'); } /** * 未结算数据 */ public function unsettle() { $settle_type = input('settle_type',0,'intval'); $begin_time = input('start','','trim'); $end_time = input('end','','trim'); $channel_id = input('channel_id',0,'intval'); //渠道名 if($channel_id){ $ShowDataList = 1; $where = []; $where['p.status'] = 1; $where['p.settle_id'] = array('eq',0); $channelIds = get_child_channel_arr($channel_id); array_push($channelIds,$channel_id); $where['p.channel_id'] = ['in',$channelIds]; //区服类型 if(input('request.settle_type')!=''){ $where['g.game_kind'] = $settle_type; } //申请开始时间和结束时间不为空时 if ($begin_time != '' && $end_time != '') { $where['p.create_time'] = [ ['>=', strtotime($begin_time)], ['<=', strtotime($end_time . ' 23:59:59')], ]; } //开始时间不为空时 elseif ($begin_time != '') { $where['p.create_time'] = ['>=', strtotime($begin_time)]; } //结束时间不为空时 elseif ($end_time != '') { $where['p.create_time'] = ['<=', strtotime($end_time . ' 23:59:59')]; } $where['g.id'] = ['in', model('game')->getTakingGame($channel_id)]; $GameChannelData = Db::table('cy_pay')->alias('p') ->join('cy_game g', 'p.gameid = g.id','inner') ->join('nw_game_channel_divide d','p.gameid = d.game_id and d.channel_id='.$channel_id,'left') ->field("p.gameid AS game_id,g.name as game_name,g.channel_split_ratio,count(*) as pay_cnt,SUM(p.amount) AS pay_amt,d.id as ratio_id,d.ratio,SUM(p.real_amount) AS pay_real_amt,SUM(p.real_ptb) AS pay_real_ptb,SUM(p.coupon_amount) as coupon_amount_amt") ->where($where) ->group('p.gameid') ->select(); $retData = array(); $total_amt = $divide_amt = $total_cnt = $total_coupon_amount_amt = 0; foreach ( $GameChannelData as &$det ) { if(intval($det['ratio_id'])){ $ratio_id = $det['ratio_id']; $ratio = floatval($det['ratio']); } else{ $ratio_id = 0; $ratio = floatval($det['channel_split_ratio']); } if(!$ratio){ $this->jsonResult('', 0, '您尚有游戏未配置分成比例,请先联系平台设置'); } else{ $det['ratio_id'] = $ratio_id; $det['ratio'] = $ratio; $total_cnt += floatval($det['pay_cnt']); $total_amt += floatval($det['pay_amt']); $total_coupon_amount_amt += floatval($det['coupon_amount_amt']); $divide_amt += floatval(intval(($det['pay_amt']-$det['coupon_amount_amt']) * $det['ratio']) / 100); $det['divide_amt'] = floatval(intval(($det['pay_amt']-$det['coupon_amount_amt']) * $det['ratio']) / 100); } } $settle = array(); $settle['total_amount'] = $total_amt; $settle['divide_amount'] = $divide_amt; $settle['total_cnt'] = $total_cnt; $settle['total_coupon_amount_amt'] = $total_coupon_amount_amt; $param = input('request.'); //分页带条件 $detPaylist = Db::table('cy_pay')->alias('p') ->join('cy_game g', 'p.gameid = g.id','inner') ->join('nw_game_channel_divide d','p.gameid = d.game_id and d.channel_id='.$channel_id,'left') ->field("p.orderid AS orderid,p.gameid AS game_id,g.name as game_name,p.amount AS amount,round((p.amount-p.coupon_amount)*(case when d.id then d.ratio else g.channel_split_ratio end)/100,2) AS divide_amt,case when d.id then d.id else '0' end as ratio_id,case when d.id then d.ratio else g.channel_split_ratio end as ratio,p.real_amount AS real_amount,p.real_ptb AS real_ptb,p.serverid,p.servername,p.rolename,p.userid,p.username,p.create_time,p.coupon_amount") ->where($where) ->order("p.id desc") ->paginate(10,false,array('query' => $param)); // var_dump($detPaylist); // 获取分页显示的HTML $page = $detPaylist->render(); $this->assign('settle', $settle); $this->assign('settleDet', $GameChannelData); $this->assign('detPaylist', $detPaylist); $this->assign('page', $page); } else{ $ShowDataList = 0; } $channelModel = new Channel; $channelList = $channelModel->getAllByCondition('id,name',['level'=>1,'flag'=>3],'name asc'); $this->assign('channel_list',$channelList); $this->assign('start', $begin_time); $this->assign('end', $end_time); $this->assign('ShowDataList', $ShowDataList); return $this->fetch(); } public function downSettleMonthData(){ if(input('download')==2){ $month = date('Y-m',mktime(0,0,0,date('m'),01)-1); $where = array(); $where['a.month'] = $month; $list = Db::table('nw_channel_month_data')->alias('a') ->join('nw_channel c','a.channel_id=c.id','left') ->field('a.id,a.month,a.channel_id,a.unsettle_amt,a.settle_apply_amt,a.unwithdraw_amt,a.withdraw_apply_amt,(a.unsettle_amt+a.settle_apply_amt+a.unwithdraw_amt+a.withdraw_apply_amt) as total_amt,c.name as channel_name,a.create_time,a.update_time') ->where($where) ->order('a.create_time desc') ->select(); $title = "会长上月末数据-".date('YmdHis'); if(!$list){ $this->error('暂无数据'); } $this->downloadexls($list,$title,'settleMonthData'); exit(); } else{ $this->error('参数错误!'); } } /** * 外放推广结算处理 */ public function doSettle() { if ($this->request->isPost()) { $channel_id = input('channel_id',0,'intval'); //流水 $total_amount = input('total_amount',0,'floatval'); //流水 $divide_amount = input('divide_amount',0,'floatval'); //分成金额 $total_cnt = input('total_cnt',0,'intval'); //结算订单笔数 $begin_date = input('begin_date','','trim'); //开始时间 $end_date = input('end_date','','trim'); //开始时间 $settle_type = input('settle_type','','intval'); //区服类型 $remark = '外放推广手动结算处理'; //备注 if(!$channel_id){ $this->jsonResult('', 0, '请选择要结算的公会账号'); } if(!in_array($settle_type,[1,2])){ $this->jsonResult('', 0, '请选择区服类型'); } if(!$begin_date || !$end_date){ $this->jsonResult('', 0, '请选择结算周期'); } if(!$total_amount || !$divide_amount || !$total_cnt){ $this->jsonResult('', 0, '没有可结算单的订单'); } if($settle_type==1){ $orderid = 'ZFS'.makeOrderid(); } else if($settle_type==2){ $orderid = 'HFS'.makeOrderid(); } else{ $this->jsonResult('', 0, '区服类型异常,请选择正确的区服类型!!'); } $channelInfo = model("Channel")->field("id,name,parent_id,level,cps_settle_period,mcps_settle_period,status")->where(['id'=>$channel_id,'level'=>1])->find(); if(empty($channelInfo)){ $this->jsonResult('', 0, '公会账号异常,请选择正确的公会账号'); } //只能结算外放的公会 $parentChannelInfo = model("Channel")->field("id,name,level,cps_settle_period,mcps_settle_period,status,channel_tg_type")->where(['id'=>$channelInfo['parent_id'],'level'=>0])->find(); if(empty($parentChannelInfo)){ $this->jsonResult('', 0, '公会所属商务账号异常'); } else if($parentChannelInfo['channel_tg_type']<>1){ $this->jsonResult('', 0, '非外放商务下公会不能使用该功能'); } /* $channelInfoApply = model("ChannelInfo")->field("id,channel_id,real_name,apply_status,type")->where(['channel_id'=>$parentChannelInfo['id'],'apply_status'=>1])->find(); if(empty($channelInfoApply)){ $this->jsonResult('', 0, '该公会所属商务的身份尚未认证通过,不能进行结算'); } */ $fromTime = strtotime($begin_date); $toTime = strtotime($end_date)+60*60*24-1; $where = array(); $where['p.status'] = 1; $where['p.create_time'] = [ ['>=', $fromTime], ['<=', $toTime], ]; //所有下级渠道(包括自己) $channelIds = get_child_channel_arr($channel_id); array_push($channelIds,$channel_id); $where['p.channel_id'] = ['in',$channelIds]; $where['p.settle_id'] = array('eq',0); // var_dump($where); $GameChannelData = Db::table('cy_pay')->alias('p') ->join('cy_game g', 'p.gameid = g.id and g.game_kind='.$settle_type,'inner') ->join('nw_game_channel_divide d','p.gameid = d.game_id and d.channel_id='.$channel_id,'left') ->field("p.gameid AS game_id,g.name as game_name,g.channel_split_ratio,min(p.create_time) as begin_time,max(p.create_time) as end_time,count(*) as pay_cnt,SUM(p.amount) AS pay_amt,d.id as ratio_id,d.ratio,SUM(p.real_amount) AS pay_real_amt,SUM(p.real_ptb) AS pay_real_ptb") ->where($where) ->group('p.gameid') ->select(); $retData = array(); // echo Db::table('cy_pay')->getLastSql()."----sql-----------
"; $totalAmount = $divideAmount = $totalCnt = 0; $beginTime = time(); $endTime = 0; foreach ( $GameChannelData as &$det ) { if(intval($det['ratio_id'])){ $ratio_id = $det['ratio_id']; $ratio = floatval($det['ratio']); } else{ $ratio_id = 0; $ratio = floatval($det['channel_split_ratio']); } if(!$ratio){ $this->jsonResult('', 0, '您尚有游戏未配置分成比例,请先联系平台设置'); } else{ $det['ratio_id'] = $ratio_id; $det['ratio'] = $ratio; $totalCnt += floatval($det['pay_cnt']); $totalAmount += floatval($det['pay_amt']); $divideAmount += floatval(intval($det['pay_amt'] * $det['ratio']) / 100); $det['divide_amt'] = floatval(intval($det['pay_amt'] * $det['ratio']) / 100); if($beginTime > $det['begin_time']){ $beginTime = $det['begin_time']; } if($endTime < $det['end_time']){ $endTime = $det['end_time']; } } } reset($GameChannelData); if(!$totalAmount || !$divideAmount || !$totalCnt){ $this->jsonResult('', 0, '您已没有可结算的订单'); } if(abs($totalAmount-$total_amount)>0.01 || $totalCnt<>$total_cnt || abs($divideAmount-$divide_amount)>0.01){ $this->jsonResult('', 0, '结算数据与后台计算数据不一致,请重新核对后再提交'); } //指定时间内,禁止重复下单 if(!requestDuplicateCheck('channel_settle_duplicate_'.$channel_id,10)){ $this->jsonResult('', 0, '结算请求过多,请于10s以后,再次进行结算操作'); } $detPaylist = Db::table('cy_pay')->alias('p') ->join('cy_game g', 'p.gameid = g.id and g.game_kind='.$settle_type,'inner') ->join('nw_game_channel_divide d','p.gameid = d.game_id and d.channel_id='.$channel_id,'left') ->field("p.id as payid,p.orderid AS orderid,p.gameid AS game_id,p.userid,p.username,g.name as game_name,g.channel_split_ratio,p.channel_id,p.amount AS amount,(p.amount*(case when d.id then d.ratio else g.channel_split_ratio end)/100) AS divide_amt,case when d.id then d.id else '0' end as ratio_id,case when d.id then d.ratio else g.channel_split_ratio end as ratio,p.real_amount AS real_amount,p.real_ptb AS real_ptb,p.create_time,p.serverid,p.servername,p.rolename") ->where($where) ->select(); // 启动事务 Db::startTrans(); try{ $settleData = array(); $settleData['orderid'] = $orderid; $settleData['settle_type'] = $settle_type; $settleData['channel_id'] = $channel_id; $settleData['channel_name'] = $channelInfo['name']; $settleData['total_amount'] = $totalAmount; $settleData['total_divide_amt'] = $divideAmount; $settleData['begin_time'] = $beginTime; $settleData['end_time'] = $endTime; $settleData['remark'] = $remark; $settleData['create_time'] = time(); $settleData['first_audit_status'] = 1; $settleData['first_audit_time'] = time(); $settleData['settle_period'] = 1; $insertSettleId = model('ChannelDivideSettle')->insertGetId($settleData); if ( !$insertSettleId) { throw new Exception("添加结算单失败"); } while(list($key,$val)=@each($GameChannelData)){ $detData = array(); $detData['settle_id'] = $insertSettleId; $detData['divide_id'] = $val['ratio_id']; $detData['begin_time'] = $val['begin_time']; $detData['end_time'] = $val['end_time']; $detData['game_id'] = $val['game_id']; $detData['channel_id'] = $channel_id; $detData['ratio'] = $val['ratio']; $detData['pay_cnt'] = $val['pay_cnt']; $detData['pay_amt'] = floatval($val['pay_amt']); $detData['pay_real_amt'] = floatval($val['pay_real_amt']); $detData['pay_real_ptb'] = floatval($val['pay_real_ptb']); $detData['divide_amt'] = floatval($val['divide_amt']); $detData['create_time'] = time(); ${'insertDet'.$val['game_id'].'ID'} = model('ChannelDivideSettleDet')->insertGetId($detData); if ( !${'insertDet'.$val['game_id'].'ID'}) { throw new Exception("添加结算单明细失败"); } } $orderIds = array(); while(list($key,$val)=@each($detPaylist)){ $orderIds[] = $val['payid']; // echo ${'insertDet'.$val['game_id'].'ID'}."---insertDet".$val['game_id']."ID'--------
"; $detPayData['settle_id'] = $insertSettleId; $detPayData['settle_det_id'] = ${'insertDet'.$val['game_id'].'ID'}; $detPayData['orderid'] = $val['orderid']; $detPayData['game_id'] = $val['game_id']; $detPayData['channel_id'] = $val['channel_id']; $detPayData['ratio'] = $val['ratio']; $detPayData['userid'] = $val['userid']; $detPayData['username'] = $val['username']; $detPayData['amount'] = floatval($val['amount']); $detPayData['real_amount'] = floatval($val['real_amount']); $detPayData['real_ptb'] = floatval($val['real_ptb']); $detPayData['divide_amt'] = floatval($val['divide_amt']); $detPayData['serverid'] = trim($val['serverid']); $detPayData['servername'] = trim($val['servername']); $detPayData['rolename'] = trim($val['rolename']); $detPayData['create_time'] = $val['create_time']; $detPayData['add_time'] = time(); // var_dump($detPayData); $insertDetPayId = model('ChannelDivideSettleDetPay')->insertGetId($detPayData); if ( !$insertDetPayId) { throw new Exception("添加结算订单明细失败"); } } $updPayData = array(); $updPayData['settle_channel_id'] = $channel_id; $updPayData['settle_id'] = $insertSettleId; $updPayData['settle_update_time'] = time(); /* $gameids = model('Game')->where(['game_kind'=>2])->column('id'); $where['p.gameid']= array('IN',$gameids); */ $where['p.id']= array('IN',$orderIds); $updResult = model('Pay')->alias('p')->where($where)->update($updPayData); if ( !$updResult) { throw new Exception("更新订单为已结算失败"); } $this->redis->del('channel_settle_duplicate_'.$channel_id); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); $this->jsonResult('', 0, '结算申请生成失败'.$e->getMessage()); } $result['orderid'] = $orderid; $this->jsonResult($result, 20000, '结算申请生成成功'); exit; } else{ $this->jsonResult('', 0, '非法请求'); exit; } } }