UserSubscribeBehaviorStatsService.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: hp
  5. * Date: 2017/11/21
  6. * Time: 10:42
  7. */
  8. namespace App\Modules\User\Services;
  9. use App\Modules\User\Models\UserSubscribeBehaviorStats;
  10. use DB;
  11. class UserSubscribeBehaviorStatsService
  12. {
  13. public static function getRechargeSum($start_time,$end_time,$is_subscribed='') {
  14. $res = DB::table('orders')
  15. ->join('force_subscribe_users','orders.uid','=','force_subscribe_users.uid')
  16. ->where([
  17. ['orders.status','=','PAID'],
  18. ['force_subscribe_users.created_at','>=',$start_time],
  19. ['force_subscribe_users.created_at','<=',$end_time]
  20. ]);
  21. if(!empty($is_subscribed)){
  22. $res->where('force_subscribe_users.is_subscribed',$is_subscribed);
  23. }
  24. $res = $res->select(DB::raw("force_subscribe_users.appid,sum(orders.price) as fee_sum"))
  25. ->groupBy('force_subscribe_users.appid')
  26. ->get();
  27. $ret = array();
  28. \Log::info($res);
  29. foreach ($res as $item) {
  30. $ret[$item->appid] = $item->fee_sum;
  31. }
  32. return $ret;
  33. }
  34. public static function getRechargeSumByAppid($start_time,$end_time,$appid,$is_subscribed='') {
  35. $res = DB::table('orders')
  36. ->join('force_subscribe_users','orders.uid','=','force_subscribe_users.uid')
  37. ->where([
  38. ['orders.status','=','PAID'],
  39. ['force_subscribe_users.appid','=',$appid],
  40. ['force_subscribe_users.created_at','>=',$start_time],
  41. ['force_subscribe_users.created_at','<=',$end_time]
  42. ]);
  43. if(!empty($is_subscribed)){
  44. $res->where('force_subscribe_users.is_subscribed',$is_subscribed);
  45. }
  46. $ret = $res->sum('orders.price');
  47. return $ret;
  48. }
  49. public static function getUserSubNum($start_time,$end_time,$is_subscribed=''){
  50. $res = DB::table('force_subscribe_users')
  51. ->whereBetween('created_at',[$start_time,$end_time]);
  52. if(!empty($is_subscribed)){
  53. $res->where('is_subscribed',$is_subscribed);
  54. }
  55. $res = $res->groupBy('appid')
  56. ->select(DB::raw("appid,count(id) as user_sub_count"))
  57. ->get();
  58. $ret = array();
  59. foreach ($res as $item) {
  60. $ret[$item->appid] = $item->user_sub_count;
  61. }
  62. return $ret;
  63. }
  64. public static function getUserSubNumByAppid($start_time,$end_time,$appid,$is_subscribed=''){
  65. $res = DB::table('force_subscribe_users')
  66. ->whereBetween('created_at',[$start_time,$end_time])
  67. ->where('appid',$appid);
  68. if(!empty($is_subscribed)){
  69. $res->where('is_subscribed',$is_subscribed);
  70. }
  71. $ret = $res->count('id');
  72. //$ret = array();
  73. /*foreach ($res as $item) {
  74. $ret[$item->appid] = $item->fee_sum;
  75. }*/
  76. return $ret;
  77. }
  78. public static function getNewSubRechargeUserNum($start_time,$end_time) {
  79. $res = DB::table('force_subscribe_users')
  80. ->whereBetween('created_at',[$start_time,$end_time])
  81. ->groupBy('appid')
  82. ->select(DB::raw('force_subscribe_users.appid,count(force_subscribe_users.id) as new_sub_recharge_num'))
  83. ->whereExists(function($query){
  84. $query->select(DB::raw(1))
  85. ->from('orders')
  86. ->where('orders.status','PAID')
  87. ->whereRaw('orders.uid = force_subscribe_users.uid');
  88. })
  89. ->get();
  90. $ret = array();
  91. foreach ($res as $item) {
  92. $ret[$item->appid] = $item->new_sub_recharge_num;
  93. }
  94. return $ret;
  95. }
  96. public static function getNewSubRechargeUserNumByAppid($start_time,$end_time,$appid) {
  97. $res = DB::table('force_subscribe_users')
  98. ->whereBetween('created_at',[$start_time,$end_time])
  99. ->where('appid',$appid)
  100. //->select(DB::raw('force_subscribe_users.appid,count(force_subscribe_users.id) as new_sub_recharge_num'))
  101. ->whereExists(function($query){
  102. $query->select(DB::raw(1))
  103. ->from('orders')
  104. ->where('orders.status','PAID')
  105. ->whereRaw('orders.uid = force_subscribe_users.uid');
  106. })
  107. ->count('force_subscribe_users.id');
  108. return $res;
  109. }
  110. public static function getSubUserOrdersNum($start_time,$end_time) {
  111. $res = DB::table('orders')
  112. ->join('force_subscribe_users','force_subscribe_users.uid','=','orders.uid')
  113. ->whereBetween('orders.created_at',[$start_time,$end_time])
  114. ->where('orders.status','PAID')
  115. ->groupBy('force_subscribe_users.appid')
  116. ->select(DB::raw('force_subscribe_users.appid,count(orders.id) as sub_user_orders_num'))
  117. ->get();
  118. $ret = array();
  119. foreach ($res as $item) {
  120. $ret[$item->appid] = $item->sub_user_orders_num;
  121. }
  122. return $ret;
  123. }
  124. public static function generateData()
  125. {
  126. for($i=1;$i<=60;$i++) {
  127. $date = date('Y-m-d',strtotime(' -'.$i.' day'));
  128. $start_time = $date.' 00:00:00';
  129. $end_time = $date.' 23:59:59';
  130. $param = array();
  131. $recharge_sum = self::getRechargeSum($start_time,$end_time);
  132. foreach ($recharge_sum as $key => $value) {
  133. $param[$key]['recharge_sum'] = $value;
  134. $param[$key]['date'] = $date;
  135. }
  136. if($i==1){
  137. $new_subscribe_num = self::getUserSubNum($start_time,$end_time);
  138. foreach($new_subscribe_num as $k=>$v) {
  139. $param[$k]['new_subscribe_num'] = $v;
  140. }
  141. $one_days_recharge = self::getRechargeSum($start_time,$end_time);
  142. foreach ($one_days_recharge as $k1=>$v1) {
  143. $param[$k1]['one_day_recharge'] =$v1;
  144. }
  145. $actual_subscribe_num = self::getUserSubNum($start_time,$end_time,1);
  146. foreach ($actual_subscribe_num as $k2=>$v2) {
  147. $param[$k2]['actual_subscribe_num'] = $v2;
  148. }
  149. $sub_user_orders_num = self::getSubUserOrdersNum($start_time,$end_time);
  150. foreach ($sub_user_orders_num as $k3=>$v3) {
  151. $param[$k3]['sub_user_orders_num'] = $v3;
  152. }
  153. }
  154. if($i<=3) {
  155. $three_days_recharge = self::getRechargeSum($start_time,$end_time);
  156. foreach ($three_days_recharge as $k3=>$v3) {
  157. $param[$k3]['three_days_recharge'] = $v3;
  158. }
  159. }
  160. if($i<=7) {
  161. $seven_days_recharge = self::getRechargeSum($start_time,$end_time);
  162. foreach ($seven_days_recharge as $k4=>$v4) {
  163. $param[$k4]['seven_days_recharge'] = $v4;
  164. }
  165. }
  166. if($i<=30) {
  167. $thirty_days_recharge = self::getRechargeSum($start_time,$end_time);
  168. foreach ($thirty_days_recharge as $k5=>$v5) {
  169. $param[$k5]['thirty_days_recharge'] = $v5;
  170. }
  171. }
  172. if($i<=60) {
  173. $sixty_days_recharge = self::getRechargeSum($start_time,$end_time);
  174. foreach ($sixty_days_recharge as $k6=>$v6) {
  175. $param[$k6]['sixty_days_recharge'] = $v6;
  176. }
  177. }
  178. foreach ($param as $key=>$value) {
  179. $sign = array('appid'=>$key,'date'=>$date);
  180. $data = $value;
  181. UserSubscribeBehaviorStats::updateOrCreate($sign,$data);
  182. }
  183. }
  184. UserSubscribeBehaviorStats::chunk(1000,function($res) {
  185. foreach ($res as $item) {
  186. $start_time = ($item->date).' 00:00:00';
  187. $end_time = ($item->date).' 23:59:59';
  188. $actual_sub_num = self::getUserSubNumByAppid($start_time,$end_time,$item->appid,1);
  189. $recharge_sum = self::getRechargeSumByAppid($start_time,$end_time,$item->appid);
  190. $new_sub_recharge_num = self::getNewSubRechargeUserNumByAppid($start_time,$end_time,$item->appid);
  191. $item->actual_subscribe_num = $actual_sub_num;
  192. $item->recharge_sum = $recharge_sum;
  193. $item->new_sub_recharge_num = $new_sub_recharge_num;
  194. $item->save();
  195. }
  196. });
  197. }
  198. public static function getChannelStats($channel_id,$param=[]) {
  199. $filter = [
  200. ['official_accounts.distribution_channel_id','=',$channel_id],
  201. ];
  202. if($param) {
  203. if(isset($param['start_date']) && $param['start_date']) {
  204. $filter[] = ['user_subscribe_statistics.date','>=',$param['start_date']];
  205. }
  206. if(isset($param['end_date']) && $param['end_date']) {
  207. $filter[] = ['user_subscribe_statistics.date','<=',$param['end_date']];
  208. }
  209. if(isset($param['appid']) && $param['appid']) {
  210. $filter[] = ['user_subscribe_statistics.appid','=',$param['appid']];
  211. }
  212. }
  213. return UserSubscribeBehaviorStats::join('official_accounts','official_accounts.appid','=','user_subscribe_statistics.appid')
  214. ->select(['official_accounts.nickname','user_subscribe_statistics.id','user_subscribe_statistics.date','user_subscribe_statistics.new_subscribe_num',
  215. 'user_subscribe_statistics.recharge_sum','user_subscribe_statistics.one_day_recharge','user_subscribe_statistics.three_days_recharge',
  216. 'user_subscribe_statistics.actual_subscribe_num','user_subscribe_statistics.seven_days_recharge','user_subscribe_statistics.thirty_days_recharge',
  217. 'user_subscribe_statistics.sixty_days_recharge','user_subscribe_statistics.new_sub_recharge_num','user_subscribe_statistics.sub_user_orders_num'])
  218. ->where($filter)
  219. ->orderBy('user_subscribe_statistics.date','desc')
  220. ->paginate();
  221. }
  222. public static function getChannelServiceAccount($channel_id) {
  223. $res = DB::table('official_accounts')
  224. ->select('nickname','appid')
  225. ->where('distribution_channel_id',$channel_id)
  226. ->get();
  227. return $res;
  228. }
  229. }