ReconciliationLogic.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <?php
  2. namespace app\v1\logic\customer;
  3. use plugin\saiadmin\basic\BaseLogic;
  4. use support\think\Db;
  5. class ReconciliationLogic extends BaseLogic
  6. {
  7. // 充值渠道收入
  8. public function getChannelIncome($where)
  9. {
  10. $params = $this->searchByAuth($where);
  11. $where = $this->getCommonWhereRaw($params);
  12. if (!empty($params['pay_channel_id'])) {
  13. $where .= " AND pay_channel_id IN (" . implode(',', $params['pay_channel_id']) . ")";
  14. }
  15. $channelIncomeQuery = Db::connect('db_game_log')->table('sdk_order_success');
  16. $channelIncomeQuery->whereRaw($where);
  17. $channelIncomeQuery->field('game_id,auth_id,pay_channel_id,sum(money) as money');
  18. $channelIncomeQuery->group('pay_channel_id');
  19. $columns = [
  20. [
  21. 'title' => '游戏ID',
  22. 'dataIndex' => 'game_id',
  23. 'width' => 80,
  24. 'align' => 'center',
  25. ],
  26. [
  27. 'title' => '游戏名称',
  28. 'dataIndex' => 'game_name',
  29. 'width' => 150,
  30. 'align' => 'center',
  31. ],
  32. [
  33. 'title' => '负责人',
  34. 'dataIndex' => 'auth_name',
  35. 'width' => 100,
  36. 'align' => 'center',
  37. ],
  38. [
  39. 'title' => '合计',
  40. 'dataIndex' => 'money',
  41. 'width' => 100,
  42. 'align' => 'center',
  43. ],
  44. ];
  45. $payChannelList = Db::connect('db_center')->table('pay_channel')
  46. ->where('status', 1);
  47. if (!empty($params['pay_channel_id'])) {
  48. $payChannelList = $payChannelList->where('id', 'in', $params['pay_channel_id']);
  49. }
  50. $payChannelList = $payChannelList->select()->toArray();
  51. foreach ($payChannelList as $payChannel) {
  52. $title = $payChannel['name'];
  53. $payChannelId = $payChannel['id'];
  54. $columns[] = [
  55. 'title' => $title,
  56. 'dataIndex' => 'pay_channel_id_' . $payChannelId,
  57. 'width' => 140,
  58. 'align' => 'center',
  59. ];
  60. }
  61. $data = $channelIncomeQuery->select()->toArray();
  62. $data = $this->trandformListColumn($data, ['game', 'pay_channel', 'auth']);
  63. foreach ($data as $key => $value) {
  64. $data[$key]['pay_channel_id_' . $value['pay_channel_id']] = $value['money'];
  65. }
  66. // 按game_id分组合并数据
  67. $mergedData = [];
  68. foreach ($data as $item) {
  69. $gameId = $item['game_id'];
  70. if (!isset($mergedData[$gameId])) {
  71. $mergedData[$gameId] = [
  72. 'game_id' => $gameId,
  73. 'game_name' => $item['game_name'],
  74. 'auth_id' => $item['auth_id'],
  75. 'auth_name' => $item['auth_name'],
  76. 'money' => 0
  77. ];
  78. // 初始化所有pay_channel_id金额为0
  79. foreach ($payChannelList as $channel) {
  80. $mergedData[$gameId]['pay_channel_id_' . $channel['id']] = 0;
  81. }
  82. }
  83. // 累加合计金额
  84. $mergedData[$gameId]['money'] += floatval($item['money']);
  85. // 设置对应渠道金额
  86. $channelKey = 'pay_channel_id_' . $item['pay_channel_id'];
  87. $mergedData[$gameId][$channelKey] = $item[$channelKey];
  88. }
  89. // 添加合计行
  90. $totalRow = [
  91. 'game_id' => '合计',
  92. 'game_name' => '',
  93. 'money' => 0
  94. ];
  95. // 初始化所有渠道金额为0
  96. foreach ($payChannelList as $channel) {
  97. $totalRow['pay_channel_id_' . $channel['id']] = 0;
  98. }
  99. // 计算合计数据
  100. foreach ($mergedData as $row) {
  101. $totalRow['money'] += floatval($row['money']);
  102. foreach ($payChannelList as $channel) {
  103. $channelKey = 'pay_channel_id_' . $channel['id'];
  104. $totalRow[$channelKey] += floatval($row[$channelKey]);
  105. }
  106. }
  107. return [
  108. 'columns' => $columns,
  109. 'data' => array_values($mergedData),
  110. 'totalRow' => $totalRow
  111. ];
  112. }
  113. /**
  114. * 广告账号对账
  115. */
  116. public function getAdCost($params)
  117. {
  118. $bmIds = $params['bm_id'];
  119. $advertiserId = $params['advertiser_id'];
  120. $advertiserName = $params['advertiser_name'];
  121. $date = $params['date'];
  122. $advertiserIds = [];
  123. if(!empty($bmIds)){
  124. $advertiserIds = Db::connect('db_advert')
  125. ->table('ad_advertiser_list')
  126. ->where('bmid', 'in', implode(',', $bmIds))
  127. ->where('status', 1)
  128. ->select()->toArray();
  129. $advertiserIds = array_column($advertiserIds, 'advertiser_id');
  130. $advertiserId = implode(',', $advertiserIds);
  131. }
  132. echo Db::connect('db_advert')
  133. ->table('media_cost')
  134. ->field('media_cost.advertiser_id as advertiser_id, SUM(money) as money, SUM(ori_money) as ori_money, ad_advertiser_list.advertiser_name as advertiser_name')
  135. ->where('media_cost.advertiser_id', 'in', $advertiserId)
  136. ->whereTime('tdate', 'between', $date)
  137. ->leftJoin('ad_advertiser_list', 'media_cost.advertiser_id = ad_advertiser_list.advertiser_id')
  138. ->group('advertiser_name, advertiser_id')->buildSql();
  139. $query = Db::connect('db_advert')
  140. ->table('media_cost')
  141. ->field('media_cost.advertiser_id as advertiser_id, SUM(money) as money, SUM(ori_money) as ori_money, ad_advertiser_list.advertiser_name as advertiser_name')
  142. ->whereTime('tdate', 'between', $date)
  143. ->leftJoin('ad_advertiser_list', 'media_cost.advertiser_id = ad_advertiser_list.advertiser_id');
  144. if(!empty($advertiserId)){
  145. $query->where('media_cost.advertiser_id', 'in', $advertiserId);
  146. }
  147. // 根据账号ID查询消耗
  148. $adCost = $query->group('advertiser_name, advertiser_id')->select()->toArray();
  149. $ori_money = 0;
  150. $money = 0;
  151. foreach($adCost as &$item){
  152. $item['fandain'] = getRound($item['ori_money'], $item['money'], 2);
  153. $ori_money += $item['ori_money'];
  154. $money += $item['money'];
  155. }
  156. $totalRow = [
  157. 'advertiser_name' => '合计',
  158. 'ori_money' => $ori_money,
  159. 'money' => $money,
  160. ];
  161. return [
  162. 'data' => $adCost,
  163. 'totalRow' => $totalRow
  164. ];
  165. }
  166. }