UserStatisticsService.php 5.1 KB

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