Complex.php 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <?php
  2. /**
  3. * 聚合渠道相关公共业务逻辑类
  4. *
  5. */
  6. namespace app\common\logic;
  7. use think\Db;
  8. use app\common\model\Polychannel;
  9. use app\common\model\PolyChannelGameFrozen;
  10. use app\common\model\ComplexChannelFrozen;
  11. use app\common\model\PolyChannelDeposit;
  12. class Complex
  13. {
  14. /**
  15. * 是否被登录冻结、是否注册冻结
  16. *
  17. * @param int $channel_id 聚合渠道ID
  18. * @param int $game_id 游戏ID
  19. * @param string $type 冻结项目(register、login、consume)
  20. *
  21. * @return boolean true:冻结;false:不冻结
  22. */
  23. public function isFrozen($channel_id, $game_id, $type)
  24. {
  25. $PolychannelModel = new Polychannel;
  26. $frozenModel = new PolyChannelGameFrozen;
  27. $channelFrozenModel = new ComplexChannelFrozen;
  28. //返回值
  29. $result = false;
  30. // 判断聚合渠道是否冻结
  31. if ($result == false) {
  32. $polyChannelInfo = $PolychannelModel->field('login,register,consume')->where(['channel_id' => $channel_id])->find();
  33. if (!empty($polyChannelInfo)) {
  34. switch ($type) {
  35. case 'register': //新增
  36. $result = $polyChannelInfo['register'];
  37. break;
  38. case 'login': //登录
  39. $result = $polyChannelInfo['login'];
  40. break;
  41. case 'consume': //充值消费
  42. $result = $polyChannelInfo['consume'];
  43. break;
  44. }
  45. }
  46. }
  47. //聚合渠道判断不冻结时,再判断预警是否冻结
  48. if ($result == false) {
  49. //预警冻结记录
  50. $frozenInfo = $frozenModel->field('depf_login,depf_register,depf_consume,status')->where(['channel_id' => $channel_id, 'game_id' => $game_id])->find();
  51. if ($frozenInfo) {
  52. //预付状态开启时
  53. if ($frozenInfo['status'] == 1) {
  54. $depositModel = new PolyChannelDeposit;
  55. //预付款配置信息
  56. $depositInfo = $depositModel->field('total_advance,over_limit,over_limit_amount')->where(['channel_id' => $channel_id])->find();
  57. //预付款配置信息为空时
  58. if (empty($depositInfo)) {
  59. $result = true;
  60. } else {
  61. //实际分成总流水
  62. $real_total_amount = $this->getChannelGameTotalAmount($channel_id);
  63. //超过预付款可超额度时
  64. if ($real_total_amount >= ($depositInfo['total_advance'] + $depositInfo['over_limit_amount'])) {
  65. switch ($type) {
  66. case 'register': //新增
  67. $result = $frozenInfo['depf_register'];
  68. break;
  69. case 'login': //登录
  70. $result = $frozenInfo['depf_login'];
  71. break;
  72. case 'consume': //充值消费
  73. $result = $frozenInfo['depf_consume'];
  74. break;
  75. }
  76. }
  77. }
  78. } else {
  79. switch ($type) {
  80. case 'register': //新增
  81. $result = $frozenInfo['depf_register'];
  82. break;
  83. case 'login': //登录
  84. $result = $frozenInfo['depf_login'];
  85. break;
  86. case 'consume': //充值消费
  87. $result = $frozenInfo['depf_consume'];
  88. break;
  89. }
  90. }
  91. }
  92. }
  93. //预警判断不冻结时,再判断渠道冻结表的状态
  94. if ($result == false) {
  95. $channelFrozenInfo = $channelFrozenModel->field('member_login,register,consume')->where(['channel_id' => $channel_id, 'game_id' => $game_id])->find();
  96. if (!empty($channelFrozenInfo)) {
  97. switch ($type) {
  98. case 'register': //新增
  99. $result = $channelFrozenInfo['register'];
  100. break;
  101. case 'login': //登录
  102. $result = $channelFrozenInfo['member_login'];
  103. break;
  104. case 'consume': //充值消费
  105. $result = $channelFrozenInfo['consume'];
  106. break;
  107. }
  108. }
  109. }
  110. return $result;
  111. }
  112. /**
  113. * 获取渠道实际总流水(即分成以后的流水)
  114. *
  115. * @param int $channel_id 聚合渠道ID
  116. *
  117. * @return float
  118. */
  119. public function getChannelTotalAmount($channel_id)
  120. {
  121. $query = Db::query("SELECT SUM(total_amount*divide_point) as total FROM cy_polychannel_game_frozen WHERE `channel_id`={$channel_id} AND `status`=1");
  122. $total_amount = isset($query[0]) ? (float)$query[0]['total'] : 0;
  123. return round($total_amount, 2);
  124. }
  125. // 获取渠道游戏实际总流水(即分成以后的流水)
  126. public function getChannelGameTotalAmount($channel_id)
  127. {
  128. // 与 listGameFrozen 页面计算逻辑一致:从 nw_complex_pay 表实时查询流水
  129. // 1. 获取开启状态的游戏ID
  130. $openGameIds = Db::table('cy_polychannel_game_frozen')
  131. ->where('channel_id', '=', $channel_id)
  132. ->where('status', '=', 1)
  133. ->column('game_id');
  134. if (empty($openGameIds)) {
  135. return 0;
  136. }
  137. // 2. 获取游戏配置信息:divide_point=分成, proportion=折扣
  138. $gamePayConfig = Db::table('cy_polychannel_game_frozen')->alias('cpgf')
  139. ->join('cy_game_pay_discount cgpd', 'cpgf.game_id = cgpd.game_id', 'LEFT')
  140. ->where(['cpgf.game_id' => ['in', $openGameIds], 'cpgf.channel_id' => $channel_id])
  141. ->column('cpgf.divide_point, cgpd.proportion', 'cpgf.game_id');
  142. // 3. 查询每个游戏的流水并计算扣除预付款
  143. $payList = Db::table('nw_complex_pay')
  144. ->where(['gameid' => ['in', $openGameIds], 'channel_id' => $channel_id, 'status' => 1])
  145. ->field("gameid, SUM(amount) as amount")
  146. ->group("gameid")
  147. ->select();
  148. $total = 0;
  149. foreach ($payList as $item) {
  150. $amount = $item['amount'];
  151. // 折扣
  152. if (!empty($gamePayConfig[$item['gameid']]) && $gamePayConfig[$item['gameid']]['proportion'] > 0) {
  153. $amount = $amount * $gamePayConfig[$item['gameid']]['proportion'];
  154. }
  155. // 分成
  156. if (!empty($gamePayConfig[$item['gameid']]) && $gamePayConfig[$item['gameid']]['divide_point'] > 0) {
  157. $amount = $amount * $gamePayConfig[$item['gameid']]['divide_point'];
  158. }
  159. $total += $amount;
  160. }
  161. return round($total, 2);
  162. }
  163. }