OptimizerDayUser.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?php
  2. /**
  3. *
  4. * @file:PromotionDayUser.php
  5. * @Date: 2023/6/25
  6. * @Time: 16:58
  7. */
  8. namespace Modules\Common\Services\Statistic;
  9. use Illuminate\Support\Facades\DB;
  10. use Modules\Common\Models\TjOptimizerDayNewUser;
  11. use Modules\Common\Services\BaseService;
  12. class OptimizerDayUser extends BaseService
  13. {
  14. protected static $miniPrograms; // 小程序
  15. protected static $newUserStatisc; // 优化师
  16. protected static $orderStatisc; // 充值统计
  17. protected static $orderVipStatisc; // 充值会员统计
  18. protected static $orderCoinStatisc; // 充值会员统计
  19. /**
  20. * 优化师用户统计
  21. * name:optimizerDayUserStatistic
  22. * @param $date
  23. * date 2023/06/25 17:01
  24. */
  25. public static function optimizerDayUserStatistic($date)
  26. {
  27. self::getMiniProgram(); // 获取小程序
  28. self::getStatisticOrders($date); // 进行订单统计
  29. self::getStatisticNewUser($date);
  30. // 从优化师维度出发统计
  31. DB::table('users', 'u')
  32. ->leftJoin('user_has_roles as ur', 'ur.user_id', '=', 'u.id')
  33. ->leftJoin('roles as r', 'r.id', '=', 'ur.role_id')
  34. ->where('r.identify', 'optimizer')
  35. ->select("u.id as user_id", 'u.pid as puser_id')->orderBy('u.id')
  36. ->chunk(10, function ($items) use ($date) {
  37. foreach ($items as $v) {
  38. self::getOptimizerDayData($v, $date);
  39. }
  40. });
  41. }
  42. /**
  43. * 优化师统计
  44. * name: getOptimizerDayData
  45. * @param $date 日期
  46. * @param $data 账号
  47. * $data = [
  48. * 'user_id' => 10, // 优化师id
  49. * 'puser_id' => 2, // 公司账号id
  50. * ]
  51. *
  52. * @return array|int[]
  53. * date 2023/06/26 17:24
  54. */
  55. private static function getOptimizerDayData($data, $date)
  56. {
  57. $userId = getProp($data, 'user_id');
  58. $puserId = getProp($data, 'puser_id');
  59. $userHasMin = DB::table('user_has_miniprograms')->where('uid', $userId)->get();
  60. $userHasMin = $userHasMin->pluck('miniprogram_id')->unique()->toArray();
  61. if ($userHasMin) {
  62. foreach ($userHasMin as $value) {
  63. $userData = self::$newUserStatisc->where('user_id', $userId)->where('miniprogram_id', $value)->first();
  64. $order = self::$orderStatisc->where('user_id', $userId)->where('miniprogram_id', $value)->first();
  65. $vip = self::$orderVipStatisc->where('user_id', $userId)->where('miniprogram_id', $value)->first();
  66. $coin = self::$orderCoinStatisc->where('user_id', $userId)->where('miniprogram_id', $value)->first();
  67. $min = self::$miniPrograms->where('id', $value)->first();
  68. $data = [
  69. "user_id" => $userId,
  70. 'puser_id' => $puserId,
  71. 'miniprogram_id' => $value,
  72. 'date' => $date,
  73. 'new_user_num' => getProp($userData, 'new_user_num', 0),
  74. 'new_user_recharge_num' => getProp($order, 'new_user_recharge_num', 0),
  75. 'new_user_recharge_total' => getProp($order, 'new_user_recharge_total', 0),
  76. 'new_user_recharge_vip_num' => getProp($vip, 'new_user_recharge_vip_num', 0),
  77. 'new_user_recharge_coin_num' => getProp($coin, 'new_user_recharge_coin_num', 0),
  78. 'miniprogram_name' => getProp($min, 'name', ''),
  79. 'miniprogram_play_name' => getProp($min, 'play_name', ''),
  80. 'miniprogram_type' => getProp($min, 'type', ''),
  81. ];
  82. $last = TjOptimizerDayNewUser::where('user_id', $userId)->where('miniprogram_id',$value)->where('puser_id', $puserId)->where('date', "<", $date)->orderBy('date', "desc")->first();
  83. if (!is_empty($last)) {
  84. $data['recharge_user_total'] = $last->recharge_user_total + $data['new_user_recharge_num'];
  85. $data['recharge_amount_total'] = $last->recharge_amount_total + $data['new_user_recharge_total'];
  86. $data['new_user_total'] = $last->new_user_total + $data['new_user_num'];
  87. } else {
  88. $data['recharge_user_total'] = $data['new_user_recharge_num'];
  89. $data['new_user_total'] = $data['new_user_num'];
  90. $data['recharge_amount_total'] = $data['new_user_recharge_total'];
  91. }
  92. TjOptimizerDayNewUser::updateOrCreate(['user_id' => $data['user_id'], 'puser_id' => $data['puser_id'], 'date' => $data['date'],'miniprogram_id' => $data['miniprogram_id']], $data);
  93. }
  94. }
  95. }
  96. /**
  97. * 获取系统所有小程序
  98. * name: getMiniProgram
  99. * date 2023/06/26 17:21
  100. */
  101. private static function getMiniProgram()
  102. {
  103. self::$miniPrograms = DB::table('miniprogram')->get();
  104. }
  105. /**
  106. * 统计当日订单
  107. * name: getStatisticOrders
  108. * @param $date
  109. * date 2023/06/26 17:21
  110. */
  111. private static function getStatisticOrders($date)
  112. {
  113. $start = $date . " 00:00:00";
  114. $end = $date . " 23:59:59";
  115. self::$orderStatisc = DB::table('orders')->where('status', "<>", 'UNPAID')
  116. ->whereBetween("created_at", [$start, $end])
  117. ->whereBetween('ranse_created_at', [$start, $end])
  118. ->select(
  119. "user_id",
  120. 'puser_id',
  121. "miniprogram_id",
  122. DB::raw("sum(if(status = 'unpaid', 0, price)) as new_user_recharge_total"), // 单日新增用户充值金额
  123. DB::raw("count(DISTINCT ranse_created_at,uid) as new_user_recharge_num") // 当日新增用户充值人数
  124. )->groupBy('user_id', 'miniprogram_id')->get();
  125. self::$orderVipStatisc = DB::table('orders')->where('status', "<>", 'UNPAID')
  126. ->whereBetween("created_at", [$start, $end])
  127. ->whereBetween('ranse_created_at', [$start, $end])->whereNotIn("order_type", ["COIN", "FIRST_COIN"])
  128. ->select(
  129. "user_id",
  130. 'puser_id',
  131. "miniprogram_id",
  132. DB::raw("COUNT(DISTINCT ranse_end_at,uid) as new_user_recharge_vip_num") // 会员充值人数
  133. )->groupBy('user_id', 'miniprogram_id')->get();
  134. self::$orderCoinStatisc = DB::table('orders')->where('status', "<>", 'UNPAID')
  135. ->whereBetween("created_at", [$start, $end])
  136. ->whereBetween('ranse_created_at', [$start, $end])->whereIn("order_type", ["COIN", "FIRST_COIN"])
  137. ->select(
  138. "user_id",
  139. 'puser_id',
  140. "miniprogram_id",
  141. DB::raw("COUNT(DISTINCT ranse_end_at,uid) as new_user_recharge_coin_num") // 普通充值人数
  142. )->groupBy('user_id', 'miniprogram_id')->get();
  143. }
  144. /**
  145. * 当日新用户统计
  146. * name: getStatisticNewUser
  147. * @param $date
  148. * date 2023/06/26 17:21
  149. */
  150. private static function getStatisticNewUser($date)
  151. {
  152. self::$newUserStatisc = DB::table('user_ranse_record_all')->where('date', "=", $date)
  153. ->select(
  154. "user_id", 'puser_id', 'miniprogram_id', 'miniprogram_type', 'date',
  155. DB::raw('count(user_id) as new_user_num')
  156. )->orderBy('user_id')
  157. ->groupBy('user_id', 'miniprogram_id')->get();
  158. }
  159. }