CompanyDayUser.php 6.8 KB

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