| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211 |
- <?php
- /**
- * 聚合渠道相关公共业务逻辑类
- *
- */
- namespace app\common\logic;
- use think\Db;
- use app\common\model\Polychannel;
- use app\common\model\PolyChannelGameFrozen;
- use app\common\model\ComplexChannelFrozen;
- use app\common\model\PolyChannelDeposit;
- class Complex
- {
- /**
- * 是否被登录冻结、是否注册冻结
- *
- * @param int $channel_id 聚合渠道ID
- * @param int $game_id 游戏ID
- * @param string $type 冻结项目(register、login、consume)
- *
- * @return boolean true:冻结;false:不冻结
- */
- public function isFrozen($channel_id, $game_id, $type)
- {
- $PolychannelModel = new Polychannel;
- $frozenModel = new PolyChannelGameFrozen;
- $channelFrozenModel = new ComplexChannelFrozen;
- //返回值
- $result = false;
- // 判断聚合渠道是否冻结
- if ($result == false) {
- $polyChannelInfo = $PolychannelModel->field('login,register,consume')->where(['channel_id' => $channel_id])->find();
- if (!empty($polyChannelInfo)) {
- switch ($type) {
- case 'register': //新增
- $result = $polyChannelInfo['register'];
- break;
- case 'login': //登录
- $result = $polyChannelInfo['login'];
- break;
- case 'consume': //充值消费
- $result = $polyChannelInfo['consume'];
- break;
- }
- }
- }
- //聚合渠道判断不冻结时,再判断预警是否冻结
- if ($result == false) {
- //预警冻结记录
- $frozenInfo = $frozenModel->field('depf_login,depf_register,depf_consume,status')->where(['channel_id' => $channel_id, 'game_id' => $game_id])->find();
- if ($frozenInfo) {
- //预付状态开启时
- if ($frozenInfo['status'] == 1) {
- $depositModel = new PolyChannelDeposit;
- //预付款配置信息
- $depositInfo = $depositModel->field('total_advance,over_limit,over_limit_amount')->where(['channel_id' => $channel_id])->find();
- //预付款配置信息为空时
- if (empty($depositInfo)) {
- $result = true;
- } else {
- //实际分成总流水
- $real_total_amount = $this->getChannelGameTotalAmount($channel_id);
- //超过预付款可超额度时
- if ($real_total_amount >= ($depositInfo['total_advance'] + $depositInfo['over_limit_amount'])) {
- switch ($type) {
- case 'register': //新增
- $result = $frozenInfo['depf_register'];
- break;
- case 'login': //登录
- $result = $frozenInfo['depf_login'];
- break;
- case 'consume': //充值消费
- $result = $frozenInfo['depf_consume'];
- break;
- }
- }
- }
- } else {
- switch ($type) {
- case 'register': //新增
- $result = $frozenInfo['depf_register'];
- break;
- case 'login': //登录
- $result = $frozenInfo['depf_login'];
- break;
- case 'consume': //充值消费
- $result = $frozenInfo['depf_consume'];
- break;
- }
- }
- }
- }
- //预警判断不冻结时,再判断渠道冻结表的状态
- if ($result == false) {
- $channelFrozenInfo = $channelFrozenModel->field('member_login,register,consume')->where(['channel_id' => $channel_id, 'game_id' => $game_id])->find();
- if (!empty($channelFrozenInfo)) {
- switch ($type) {
- case 'register': //新增
- $result = $channelFrozenInfo['register'];
- break;
- case 'login': //登录
- $result = $channelFrozenInfo['member_login'];
- break;
- case 'consume': //充值消费
- $result = $channelFrozenInfo['consume'];
- break;
- }
- }
- }
- return $result;
- }
- /**
- * 获取渠道实际总流水(即分成以后的流水)
- *
- * @param int $channel_id 聚合渠道ID
- *
- * @return float
- */
- public function getChannelTotalAmount($channel_id)
- {
- $query = Db::query("SELECT SUM(total_amount*divide_point) as total FROM cy_polychannel_game_frozen WHERE `channel_id`={$channel_id} AND `status`=1");
- $total_amount = isset($query[0]) ? (float)$query[0]['total'] : 0;
- return round($total_amount, 2);
- }
- // 获取渠道游戏实际总流水(即分成以后的流水)
- public function getChannelGameTotalAmount($channel_id)
- {
- // 与 listGameFrozen 页面计算逻辑一致:从 nw_complex_pay 表实时查询流水
- // 1. 获取开启状态的游戏ID
- $openGameIds = Db::table('cy_polychannel_game_frozen')
- ->where('channel_id', '=', $channel_id)
- ->where('status', '=', 1)
- ->column('game_id');
- if (empty($openGameIds)) {
- return 0;
- }
- // 2. 获取游戏配置信息: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', $openGameIds], 'cpgf.channel_id' => $channel_id])
- ->column('cpgf.divide_point, cgpd.proportion', 'cpgf.game_id');
- // 3. 查询每个游戏的流水并计算扣除预付款
- $payList = Db::table('nw_complex_pay')
- ->where(['gameid' => ['in', $openGameIds], 'channel_id' => $channel_id, 'status' => 1])
- ->field("gameid, SUM(amount) as amount")
- ->group("gameid")
- ->select();
- $total = 0;
- foreach ($payList 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'];
- }
- $total += $amount;
- }
- return round($total, 2);
- }
- }
|