UserStatisticsService.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. <?php
  2. /**
  3. *
  4. * @file:UserStatisticsService.php
  5. * @Date: 2023/6/20
  6. * @Time: 09:31
  7. */
  8. namespace Modules\Statistic\Services;
  9. use Illuminate\Support\Facades\DB;
  10. use Illuminate\Support\Facades\Redis;
  11. use Modules\Common\Services\BaseService;
  12. use Modules\User\Http\Controllers\UserTrait;
  13. class UserStatisticsService extends BaseService
  14. {
  15. // 日期:小程序id
  16. protected const PROMOTION_STATISTIC_RECORD_REDIS_KEY = 'statistic:miniprogram:users_recode:%s:%s';
  17. protected const NEW_USER_NUM = 'new_user_num_%s'; // 当日新增用户数
  18. protected const NEW_USER_RECHARGE_NUM = "new_user_recharge_num_%s"; // 当日新增户充值人数
  19. protected const NEW_USER_RECHARGE_TOTAL = "new_user_recharge_total_%s"; // 当日新增户充值金额
  20. /**
  21. *
  22. * name: getTodayData
  23. * @param int $accountId 账号id
  24. * @param int $miniProgramId 小程序id
  25. * @param int $type 账号类型 1 其他 2 投放公司 3 优化师
  26. * date 2023/06/20 10:20
  27. */
  28. public static function getTodayData($accountId, $miniProgramId, $type = 1)
  29. {
  30. $date = date("Y-m-d");
  31. // $date = '2023-05-31';
  32. $key = sprintf(self::PROMOTION_STATISTIC_RECORD_REDIS_KEY, $date, $miniProgramId);
  33. $new_user_recharge_total = self::getValue($key, sprintf(self::NEW_USER_RECHARGE_TOTAL, $accountId)); // 当日新增用户充值总额
  34. $new_user_recharge_num = self::getValue($key, sprintf(self::NEW_USER_RECHARGE_NUM, $accountId)); // 当日新增用户充值人数
  35. $new_user_num = self::getValue($key, sprintf(self::NEW_USER_NUM, $accountId)); // 当日新增用户人数
  36. [$recharge_coin_num, $recharge_vip_num] = self::getRechargeUserNum($accountId, $miniProgramId, $type);
  37. $data = [
  38. 'key' => $key,
  39. 'account_id' => $accountId,
  40. 'date' => $date,
  41. 'new_user_recharge_total' => $new_user_recharge_total ?: 0,
  42. 'new_user_recharge_num' => $new_user_recharge_num ?: 0,
  43. 'new_user_num' => $new_user_num ?: 0,
  44. 'recharge_coin_num' => $recharge_coin_num ?: 0,
  45. 'recharge_vip_num' => $recharge_vip_num ?: 0,
  46. ];
  47. if ($new_user_num > 0 && $new_user_recharge_num > 0) {
  48. $data['recharge_rate'] = sprintf('%.2f%', ($new_user_recharge_num / $new_user_num) * 100);
  49. } else {
  50. $data['recharge_rate'] = 0;
  51. $data['recharge_mean'] = 0;
  52. }
  53. if ($new_user_recharge_total > 0 || $new_user_recharge_num > 0) {
  54. $data['recharge_mean'] = sprintf('%.2f', ($new_user_recharge_total / $new_user_recharge_num));
  55. } else {
  56. $data['recharge_mean'] = 0;
  57. }
  58. return $data;
  59. }
  60. // 获取redis值
  61. protected static function getValue($key, $field)
  62. {
  63. return Redis::hget($key, $field);
  64. }
  65. // 保存redis的值
  66. protected static function setValue($key, $field, $value)
  67. {
  68. Redis::hset($key, $field, $value);
  69. }
  70. /**
  71. * 充值人数查询
  72. * name: getRechargeUserNum
  73. * @param $accountId 账号id
  74. * @param $miniProgramId 小程序id
  75. * @param mixed $type 账号类型 2 投放公司 3 优化师
  76. * date 2023/06/20 10:18
  77. */
  78. private static function getRechargeUserNum($accountId, $miniProgramId, mixed $type): array
  79. {
  80. $start = date("Y-m-d") . " 00:00:00";
  81. $end = date("Y-m-d") . " 23:59:59";
  82. // $start = "2023-05-31 00:00:00";
  83. // $end = "2023-05-31 23:59:59";
  84. if ($type == 2) {
  85. // 投放公司
  86. $recharge_coin_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  87. ->where('miniprogram_id', $miniProgramId)
  88. ->where('puser_id', $accountId)->whereBetween("created_at", [$start, $end])
  89. ->whereBetween('ranse_created_at', [$start, $end])
  90. ->where('order_type', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  91. $recharge_vip_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  92. ->where('miniprogram_id', $miniProgramId)
  93. ->where('puser_id', $accountId)->whereBetween("created_at",[ $start, $end])
  94. ->whereBetween('ranse_created_at', [$start, $end])
  95. ->where('order_type', '<>', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  96. } elseif ($type == 3) {
  97. // 优化师
  98. $recharge_coin_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  99. ->where('miniprogram_id', $miniProgramId)
  100. ->where('user_id', $accountId)->whereBetween("created_at", [$start, $end])
  101. ->whereBetween('ranse_created_at', [$start, $end])
  102. ->where('order_type', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  103. $recharge_vip_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  104. ->where('miniprogram_id', $miniProgramId)
  105. ->where('user_id', $accountId)->whereBetween("created_at",[$start, $end])
  106. ->whereBetween('ranse_created_at',[ $start, $end])
  107. ->where('order_type', '<>', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  108. } else {
  109. // 其他暂不统计
  110. $recharge_coin_num = 0;
  111. $recharge_vip_num = 0;
  112. }
  113. return [$recharge_coin_num, $recharge_vip_num];
  114. }
  115. }