UserSubscribeBehaviorStatsService.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  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. {
  15. $res = DB::table('orders')
  16. ->join('force_subscribe_users', 'orders.uid', '=', 'force_subscribe_users.uid')
  17. ->where([
  18. ['orders.status', '=', 'PAID'],
  19. ['force_subscribe_users.created_at', '>=', $start_time],
  20. ['force_subscribe_users.created_at', '<=', $end_time]
  21. ]);
  22. if (!empty($is_subscribed)) {
  23. $res->where('force_subscribe_users.is_subscribed', $is_subscribed);
  24. }
  25. $res = $res->select(DB::raw("force_subscribe_users.appid,sum(orders.price) as fee_sum"))
  26. ->groupBy('force_subscribe_users.appid')
  27. ->get();
  28. $ret = array();
  29. \Log::info($res);
  30. foreach ($res as $item) {
  31. $ret[$item->appid] = $item->fee_sum;
  32. }
  33. return $ret;
  34. }
  35. public static function getRechargeSumByAppid($start_time, $end_time, $appid, $is_subscribed = '')
  36. {
  37. $res = DB::table('orders')
  38. ->join('force_subscribe_users', 'orders.uid', '=', 'force_subscribe_users.uid')
  39. ->where([
  40. ['orders.status', '=', 'PAID'],
  41. ['force_subscribe_users.appid', '=', $appid],
  42. ['force_subscribe_users.created_at', '>=', $start_time],
  43. ['force_subscribe_users.created_at', '<=', $end_time]
  44. ]);
  45. if (!empty($is_subscribed)) {
  46. $res->where('force_subscribe_users.is_subscribed', $is_subscribed);
  47. }
  48. $ret = $res->sum('orders.price');
  49. return $ret;
  50. }
  51. public static function getUserSubNum($start_time, $end_time, $is_subscribed = '')
  52. {
  53. $res = DB::table('force_subscribe_users')
  54. ->whereBetween('created_at', [$start_time, $end_time]);
  55. if (!empty($is_subscribed)) {
  56. $res->where('is_subscribed', $is_subscribed);
  57. }
  58. $res = $res->groupBy('appid')
  59. ->select(DB::raw("appid,count(id) as user_sub_count"))
  60. ->get();
  61. $ret = array();
  62. foreach ($res as $item) {
  63. $ret[$item->appid] = $item->user_sub_count;
  64. }
  65. return $ret;
  66. }
  67. public static function getUserSubNumByAppid($start_time, $end_time, $appid, $is_subscribed = '')
  68. {
  69. $res = DB::table('force_subscribe_users')
  70. ->whereBetween('created_at', [$start_time, $end_time])
  71. ->where('appid', $appid);
  72. if (!empty($is_subscribed)) {
  73. $res->where('is_subscribed', $is_subscribed);
  74. }
  75. $ret = $res->count('id');
  76. //$ret = array();
  77. /*foreach ($res as $item) {
  78. $ret[$item->appid] = $item->fee_sum;
  79. }*/
  80. return $ret;
  81. }
  82. public static function getNewSubRechargeUserNum($start_time, $end_time)
  83. {
  84. $res = DB::table('force_subscribe_users')
  85. ->whereBetween('created_at', [$start_time, $end_time])
  86. ->groupBy('appid')
  87. ->select(DB::raw('force_subscribe_users.appid,count(force_subscribe_users.id) as new_sub_recharge_num'))
  88. ->whereExists(function ($query) {
  89. $query->select(DB::raw(1))
  90. ->from('orders')
  91. ->where('orders.status', 'PAID')
  92. ->whereRaw('orders.uid = force_subscribe_users.uid');
  93. })
  94. ->get();
  95. $ret = array();
  96. foreach ($res as $item) {
  97. $ret[$item->appid] = $item->new_sub_recharge_num;
  98. }
  99. return $ret;
  100. }
  101. public static function getNewSubRechargeUserNumByAppid($start_time, $end_time, $appid)
  102. {
  103. $res = DB::table('force_subscribe_users')
  104. ->whereBetween('created_at', [$start_time, $end_time])
  105. ->where('appid', $appid)
  106. ->whereExists(function ($query) {
  107. $query->select(DB::raw(1))
  108. ->from('orders')
  109. ->where('orders.status', 'PAID')
  110. ->whereRaw('orders.uid = force_subscribe_users.uid');
  111. })
  112. ->count('force_subscribe_users.id');
  113. return $res;
  114. }
  115. public static function getSubUserOrdersNum($start_time, $end_time)
  116. {
  117. $res = DB::table('orders')
  118. ->join('force_subscribe_users', 'force_subscribe_users.uid', '=', 'orders.uid')
  119. ->whereBetween('orders.created_at', [$start_time, $end_time])
  120. ->where('orders.status', 'PAID')
  121. ->groupBy('force_subscribe_users.appid')
  122. ->select(DB::raw('force_subscribe_users.appid,count(orders.id) as sub_user_orders_num'))
  123. ->get();
  124. $ret = array();
  125. foreach ($res as $item) {
  126. $ret[$item->appid] = $item->sub_user_orders_num;
  127. }
  128. return $ret;
  129. }
  130. public static function generateData()
  131. {
  132. for ($i = 1; $i <= 60; $i++) {
  133. $date = date('Y-m-d', strtotime(' -' . $i . ' day'));
  134. $start_time = $date . ' 00:00:00';
  135. $end_time = $date . ' 23:59:59';
  136. $param = array();
  137. if ($i == 1) {
  138. $new_subscribe_num = self::getUserSubNum($start_time, $end_time);
  139. foreach ($new_subscribe_num as $k => $v) {
  140. $param[$k]['new_subscribe_num'] = $v;
  141. }
  142. $one_days_recharge = self::getRechargeSum($start_time, $end_time);
  143. foreach ($one_days_recharge as $k1 => $v1) {
  144. $param[$k1]['one_day_recharge'] = $v1;
  145. }
  146. $actual_subscribe_num = self::getUserSubNum($start_time, $end_time, 1);
  147. foreach ($actual_subscribe_num as $k2 => $v2) {
  148. $param[$k2]['actual_subscribe_num'] = $v2;
  149. }
  150. $sub_user_orders_num = self::getSubUserOrdersNum($start_time, $end_time);
  151. foreach ($sub_user_orders_num as $k3 => $v3) {
  152. $param[$k3]['sub_user_orders_num'] = $v3;
  153. }
  154. foreach ($param as $key => $value) {
  155. $sign = array('appid' => $key, 'date' => $date);
  156. $data = $value;
  157. UserSubscribeBehaviorStats::updateOrCreate($sign, $data);
  158. }
  159. }
  160. self::generateChargeData();
  161. break;
  162. }
  163. //更新近两个月每个服务号每天的净关
  164. $temp = 0;
  165. while (true) {
  166. $result = UserSubscribeBehaviorStats::where('date', '>=', date('Y-m-d', strtotime('-2 month -1 day')))
  167. ->orderBy('id')->where('id', '>', $temp)->limit(1000)->get();
  168. if ($result->isEmpty()) break;
  169. foreach ($result as $item) {
  170. $temp = $item->id;
  171. $start_time = ($item->date) . ' 00:00:00';
  172. $end_time = ($item->date) . ' 23:59:59';
  173. $actual_sub_num = self::getUserSubNumByAppid($start_time, $end_time, $item->appid, 1);
  174. $item->actual_subscribe_num = $actual_sub_num;
  175. $item->save();
  176. }
  177. }
  178. }
  179. public static function getChannelStats($channel_id, $param = [])
  180. {
  181. $filter = [
  182. ['official_accounts.distribution_channel_id', '=', $channel_id],
  183. ];
  184. if ($param) {
  185. if (isset($param['start_date']) && $param['start_date']) {
  186. $filter[] = ['user_subscribe_statistics.date', '>=', $param['start_date']];
  187. }
  188. if (isset($param['end_date']) && $param['end_date']) {
  189. $filter[] = ['user_subscribe_statistics.date', '<=', $param['end_date']];
  190. }
  191. if (isset($param['appid']) && $param['appid']) {
  192. $filter[] = ['user_subscribe_statistics.appid', '=', $param['appid']];
  193. }
  194. }
  195. return UserSubscribeBehaviorStats::join('official_accounts', 'official_accounts.appid', '=', 'user_subscribe_statistics.appid')
  196. ->select([
  197. 'official_accounts.nickname', 'user_subscribe_statistics.id', 'user_subscribe_statistics.date', 'user_subscribe_statistics.new_subscribe_num',
  198. 'user_subscribe_statistics.recharge_sum', 'user_subscribe_statistics.one_day_recharge', 'user_subscribe_statistics.three_days_recharge',
  199. 'user_subscribe_statistics.actual_subscribe_num', 'user_subscribe_statistics.seven_days_recharge', 'user_subscribe_statistics.thirty_days_recharge',
  200. 'user_subscribe_statistics.sixty_days_recharge', 'user_subscribe_statistics.new_sub_recharge_num', 'user_subscribe_statistics.sub_user_orders_num'
  201. ])
  202. ->where($filter)
  203. ->orderBy('user_subscribe_statistics.date', 'desc')
  204. ->paginate();
  205. }
  206. public static function getChannelServiceAccount($channel_id)
  207. {
  208. $res = DB::table('official_accounts')
  209. ->select('nickname', 'appid')
  210. ->where('distribution_channel_id', $channel_id)
  211. ->get();
  212. return $res;
  213. }
  214. public static function getList($date = '', $appid = '')
  215. {
  216. return UserSubscribeBehaviorStats::getList($date, $appid);
  217. }
  218. public static function generateChargeData()
  219. {
  220. $start_day = date('Y-m-d', time() - 86400);
  221. $end_day = $start_day . ' 23:59:59';
  222. $sql = "SELECT DISTINCT distribution_channel_id FROM orders WHERE created_at >= '%s' and created_at < '%s' AND `status` = 'PAID'";
  223. $distribution_channel_ids = DB::select(sprintf($sql, $start_day, $end_day));
  224. $datetime1 = date_create($start_day);
  225. $two_month = date('Y-m-d', strtotime('-2 month -1 day'));
  226. foreach ($distribution_channel_ids as $item) {
  227. $recharge_info = DB::table('orders')->where('orders.distribution_channel_id', $item->distribution_channel_id)
  228. ->join('force_subscribe_users', 'force_subscribe_users.uid', '=', 'orders.uid')
  229. ->where('orders.created_at', '>=', $start_day)
  230. ->where('orders.created_at', '<=', $end_day)
  231. ->where('status', 'PAID')
  232. ->groupBy(DB::raw('date(force_subscribe_users.created_at)'))
  233. ->groupBy('force_subscribe_users.appid')
  234. ->select(
  235. DB::raw('force_subscribe_users.appid,date(force_subscribe_users.created_at) as date,SUM(price) as amount,count(*) as sub_user_orders_num,count(case when orders.pay_type =1 then orders.id else null end ) as new_sub_recharge_num')
  236. )
  237. ->get();
  238. foreach ($recharge_info as $item_recharge) {
  239. $datetime2 = date_create($item_recharge->date);
  240. $interval = date_diff($datetime2, $datetime1)->d + 1;
  241. $data = [];
  242. $data[] = 'sub_user_orders_num';
  243. if ($interval <= 1) {
  244. $data[] = 'one_day_recharge';
  245. //self::updateOne($item_recharge->appid,$item_recharge->date,$item_recharge->amount,'one_day_recharge');
  246. }
  247. if ($interval <= 3) {
  248. $data[] = 'three_days_recharge';
  249. //self::updateOne($item_recharge->appid,$item_recharge->date,$item_recharge->amount,'three_days_recharge');
  250. }
  251. if ($interval <= 7) {
  252. $data[] = 'seven_days_recharge';
  253. //self::updateOne($item_recharge->appid,$item_recharge->date,$item_recharge->amount,'seven_days_recharge');
  254. }
  255. if ($interval <= 30) {
  256. $data[] = 'thirty_days_recharge';
  257. //self::updateOne($item_recharge->appid,$item_recharge->date,$item_recharge->amount,'thirty_days_recharge');
  258. }
  259. if ($interval <= 60) {
  260. $data[] = 'sixty_days_recharge';
  261. //self::updateOne($item_recharge->appid,$item_recharge->date,$item_recharge->amount,'sixty_days_recharge');
  262. }
  263. if ($item_recharge->date >= $two_month) {
  264. //recharge_sum
  265. $data[] = 'recharge_sum';
  266. $data[] = 'new_sub_recharge_num';
  267. }
  268. self::updateOne($item_recharge->appid, $item_recharge->date, $item_recharge->amount, $data);
  269. }
  270. }
  271. }
  272. private static function updateOne($appid, $date, $amount, $field)
  273. {
  274. if (!$field) {
  275. return;
  276. }
  277. $sign = array('appid' => $appid, 'date' => $date);
  278. $record = UserSubscribeBehaviorStats::where($sign)->select('id')->first();
  279. if ($record) {
  280. $update_data = [];
  281. foreach ($field as $item) {
  282. if ($item == 'one_day_recharge') {
  283. $update_data[$item] = $amount;
  284. } else {
  285. // three_days_recharge=>DB::raw('three_days_recharge+'.$amount)
  286. $update_data[$item] = DB::raw($item . '+' . $amount);
  287. }
  288. }
  289. UserSubscribeBehaviorStats::where($sign)->update($update_data);
  290. } else {
  291. $insert_data = [];
  292. foreach ($field as $item) {
  293. $insert_data[$item] = $amount;
  294. }
  295. $insert_data['appid'] = $appid;
  296. $insert_data['date'] = $date;
  297. UserSubscribeBehaviorStats::create($insert_data);
  298. }
  299. }
  300. }