GenerateCpBookStatService.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. namespace App\Modules\CP\Services;
  3. use App\Modules\CpSub\Models\CpSub;
  4. use App\Modules\CpSub\Models\CpCalculate;
  5. use App\Modules\Book\Models\BookConfig;
  6. use App\Modules\CpUser\Services\CpUserService;
  7. class GenerateCpBookStatService
  8. {
  9. /**
  10. * 生成每日统计
  11. */
  12. public static function generateCpBookDailyStat($date) {
  13. if(empty($date)) $data = date('Y-m-d');
  14. $result = array();
  15. $all_cp_list = BookConfig::getAllCps();
  16. \Log::info($all_cp_list);
  17. $special_cps = array('17k','wangyi');
  18. $today = date('Y-m-d');
  19. // $today = date('Y-m-01');
  20. $start_date = date('Y-m-01');
  21. $end_date = $date;
  22. $month = date('Y-m');
  23. $calculate_date = date('Y-m-d');
  24. // 每个月1号算上个月的
  25. if($today == $start_date){
  26. $start_date = date('Y-m-01',strtotime(' -1 month'));
  27. $month = date('Y-m',strtotime(' -1 month'));
  28. }
  29. \Log::info('generateCpBookDailyStat,start_date:'.$start_date.' end_date:'.$end_date.' month:'.$month.' calculate_date:'.$calculate_date);
  30. $all_data_list = BookConfig::getAllCpBookConsume($start_date,$end_date,$all_cp_list);
  31. self::insert_daily_stat($all_data_list,$month,$calculate_date);
  32. return $result;
  33. }
  34. /**
  35. * 生成指定月份数据
  36. */
  37. public static function generateCpBookBetweenStat($start_date,$end_date,$month,$calculate_date) {
  38. \Log::info('generateCpBookBetweenStat_start,start_date:'.$start_date.' end_date:'.$end_date.' month:'.$month.' calculate_date:'.$calculate_date);
  39. if(empty($start_date) || empty($end_date) || empty($month) || empty($calculate_date)) {
  40. \Log::info('generateCpBookBetweenStat isnull,start_date:'.$start_date.' end_date:'.$end_date.' month:'.$month.' calculate_date:'.$calculate_date);
  41. return false;
  42. }
  43. $result = array();
  44. $all_cp_list = BookConfig::getAllCps();
  45. \Log::info($all_cp_list);
  46. $all_data_list = BookConfig::getAllCpBookConsume($start_date,$end_date,$all_cp_list);
  47. self::insert_daily_stat($all_data_list,$month,$calculate_date);
  48. return $result;
  49. }
  50. /**
  51. * 生成汇总数据
  52. */
  53. public static function insert_daily_stat($item_list,$month,$calculate_date) {
  54. \Log::info('insert_daily_stat_start');
  55. foreach($item_list as $key=>$item){
  56. try{
  57. // 算当天
  58. // 单本书指定date的充值数据
  59. $insert_data = array();
  60. $insert_data['month'] = empty($month)?date('Y-m'):$month;
  61. $insert_data['calculate_date'] = empty($calculate_date)?date('Y-m-d'):$calculate_date;
  62. $cp_user = CpUserService::getCpUser($item['cp_source']);
  63. $insert_data['cp_user_id'] = isset($cp_user->id)?$cp_user->id:'0';
  64. $insert_data['cp_source'] = $item['cp_source'];
  65. $insert_data['bid'] = $item['bid'];
  66. $insert_data['book_name'] = $item['book_name'];
  67. \Log::info('insert_daily_stat_cp_source:'.$insert_data['cp_source'].' cp_user_id:'.$insert_data['cp_user_id'].' calculate_date:'.$insert_data['calculate_date'].' bid:'.$insert_data['bid']);
  68. // 计算方式
  69. // 中文:可分成金额=((充值币*(1-0.806))-(充值币*(1-0.806))*0.1)/100
  70. // 最终可分成金额=(((充值币*(1-0.806))-(充值币*(1-0.806))*0.1)/100)/2
  71. // 总订阅数据=充值币*(1-0.806)
  72. // 网易:可分成金额=((充值币*(1-0.556))-(充值币*(1-0.556))*0.35)/100
  73. // 最终分成金额=(((充值币*(1-0.556))-(充值币*(1-0.556))*0.35)/100)/2
  74. // 总订阅金额=充值币*(1-0.556)
  75. // 其余CP:可分成金额=(充值币-(充值币*0.906))/100
  76. // 最终分成金额=(充值币-(充值币*0.906))/100/2
  77. // 第二版
  78. // CP 具体限制 具体公式
  79. // 中文在线 35W保底+分成 (可显示)总订阅量=充值币*(1-0.806)=充值币*0.194
  80. // (可显示CP)可分成金额=(充值币*0.194-充值币*0.1)/100
  81. // (可显示CP)最终可分成金额=(充值币*0.194-充值币*0.1)/100/2
  82. // 网易云阅读 30W保底+分成 (可显示CP)总订阅量=充值币*(1-0.556)=充值币*0.444
  83. // (可显示CP)可分成金额=(充值币*0.444-充值币*0.35)/100
  84. // (可显示CP)最终可分成金额=(充值币*0.444-充值币*0.35)/100/2
  85. // 塔读 32W保底+分成 此CP默认与其他CP的结算公式一致
  86. // 其他小CP 去除渠道成本后,5:5分成
  87. // 其余CP:(CP后台显示的)本月订阅量=充值币*(1-0.906)
  88. // (CP后台显示的)可分成金额=本月订阅量/100=充值币*0.094/100
  89. // (CP后台显示的)最终分成金额=充值币*0.094/100/2
  90. // 计算公式从数据库拿
  91. $cp_calculate = CpCalculate::getCpCalculate($item['cp_source']);
  92. \Log::info('cp_calculate:'.$item['cp_source'].' val:'.json_encode($cp_calculate));
  93. $insert_data['available_amount'] = $item['charge_balance']*$cp_calculate['available_amount_ratio'];
  94. $insert_data['last_amount'] = $item['charge_balance']*$cp_calculate['last_amount_ratio'];
  95. $insert_data['total_amount'] = $item['charge_balance']*$cp_calculate['total_amount_ratio'];
  96. $insert_data['current_month_book_num'] = $item['charge_balance'];// 书币数量
  97. // if($item['cp_source'] == '17k'){
  98. // $insert_data['available_amount'] = $item['charge_balance']*(0.194-0.1)/100;
  99. // $insert_data['last_amount'] = $item['charge_balance']*(0.194-0.1)/100/2;
  100. // $insert_data['total_amount'] = $item['charge_balance']*0.194;
  101. // $insert_data['current_month_book_num'] = $item['charge_balance'];// 书币数量
  102. // }elseif($item['cp_source'] == 'wangyi'){
  103. // $insert_data['available_amount'] = $item['charge_balance']*(0.444-0.35)/100;
  104. // $insert_data['last_amount'] = $item['charge_balance']*(0.444-0.35)/100/2;
  105. // $insert_data['total_amount'] = $item['charge_balance']*0.444;
  106. // $insert_data['current_month_book_num'] = $item['charge_balance'];
  107. // }else{
  108. // $insert_data['available_amount'] = $item['charge_balance']*(1-0.906)/100;
  109. // $insert_data['last_amount'] = $item['charge_balance']*(1-0.906)/100/2;
  110. // $insert_data['total_amount'] = $item['charge_balance']*(1-0.906);
  111. // $insert_data['current_month_book_num'] = $item['charge_balance'];
  112. // }
  113. $current_cp_sub = CpSub::getCpSub($insert_data['cp_source'],$insert_data['calculate_date'],$insert_data['bid']);
  114. \Log::info($current_cp_sub);
  115. if(empty($current_cp_sub)){
  116. \Log::info('insert');
  117. CpSub::firstOrcreate($insert_data);
  118. }else{
  119. \Log::info('not_insert');
  120. }
  121. }catch(\Exception $e){
  122. \Log::info($e->getMessage());
  123. }
  124. }
  125. }
  126. /**
  127. * 生成每日统计
  128. */
  129. public static function generateCpBookDailyStat2($date) {
  130. if(empty($date)) return '';
  131. //$result = array();
  132. $all_cp_list = BookConfig::getAllCps();
  133. $start_date = date('Y-m-01');
  134. $end_date = date('Y-m-d',time()-86400);
  135. $month = date('Y-m');
  136. //$calculate_date = date('Y-m-d');
  137. //\Log::info('generateCpBookDailyStat,start_date:'.$start_date.' end_date:'.$end_date.' month:'.$month.' calculate_date:'.$calculate_date);
  138. $all_data_list = BookConfig::getAllCpBookConsume($start_date,$end_date,$all_cp_list);
  139. self::insert_daily_stat($all_data_list,$month,$date);
  140. //return $result;
  141. }
  142. }