UserStatisticsService.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  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\Models\TjOptimizerDayNewUser;
  12. use Modules\Common\Services\BaseService;
  13. use Modules\Common\Services\Statistic\CompanyDayUser;
  14. use Modules\Common\Services\Statistic\OptimizerDayUser;
  15. class UserStatisticsService extends BaseService
  16. {
  17. // key 日期:
  18. protected const PROMOTION_STATISTIC_RECORD_REDIS_KEY = 'statistic:miniprogram:users_recode:%s';
  19. protected const NEW_USER_NUM = 'new_user_num_%s'; // 当日新增用户数
  20. protected const NEW_USER_RECHARGE_NUM = "new_user_recharge_num_%s"; // 当日新增户充值人数
  21. protected const NEW_USER_RECHARGE_TOTAL = "new_user_recharge_total_%s"; // 当日新增户充值金额
  22. protected const RANSE_NEW_USER_COUNT = "promotion:newUserCount:%s"; // 推广链接新用户统计
  23. /**
  24. *
  25. * name: getTodayData
  26. * @param int $accountId 账号id
  27. * @param int $type 账号类型 1 其他 2 投放公司 3 优化师
  28. * date 2023/06/20 10:20
  29. * @return array
  30. */
  31. public static function getTodayData($accountId, $type = 1)
  32. {
  33. $date = date("Y-m-d");
  34. $key = sprintf(self::PROMOTION_STATISTIC_RECORD_REDIS_KEY, $date);
  35. $new_user_recharge_total = self::getValue($key, sprintf(self::NEW_USER_RECHARGE_TOTAL, $accountId)); // 当日新增用户充值总额
  36. $new_user_recharge_num = self::getValue($key, sprintf(self::NEW_USER_RECHARGE_NUM, $accountId)); // 当日新增用户充值人数
  37. $new_user_num = self::getValue($key, sprintf(self::NEW_USER_NUM, $accountId)); // 当日新增用户人数
  38. [$recharge_coin_num, $recharge_vip_num] = self::getRechargeUserNum($accountId, $type);
  39. $data = [
  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%s", ($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%s', ($new_user_recharge_total / $new_user_recharge_num), "%");
  55. } else {
  56. $data['recharge_mean'] = 0;
  57. }
  58. return $data;
  59. }
  60. /**
  61. * 获取redis值
  62. * name: getValue
  63. * @param $key
  64. * @param $field
  65. * @return mixed
  66. * date 2023/06/25 15:57
  67. */
  68. protected static function getValue($key, $field)
  69. {
  70. return Redis::hget($key, $field);
  71. }
  72. /**
  73. * 保存redis的值
  74. * name: setValue
  75. * @param $key
  76. * @param $field
  77. * @param $value
  78. * date 2023/06/25 15:57
  79. */
  80. protected static function setValue($key, $field, $value)
  81. {
  82. Redis::hset($key, $field, $value);
  83. }
  84. /**
  85. * 充值人数查询
  86. * name: getRechargeUserNum
  87. * @param $accountId 账号id
  88. * @param $miniProgramId 小程序id
  89. * @param mixed $type 账号类型 2 投放公司 3 优化师
  90. * date 2023/06/20 10:18
  91. */
  92. private static function getRechargeUserNum($accountId, mixed $type): array
  93. {
  94. $start = date("Y-m-d") . " 00:00:00";
  95. $end = date("Y-m-d") . " 23:59:59";
  96. if ($type == 2) {
  97. // 投放公司
  98. $recharge_coin_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  99. ->where('puser_id', $accountId)->whereBetween("created_at", [$start, $end])
  100. ->whereBetween('ranse_created_at', [$start, $end])
  101. ->where('order_type', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  102. $recharge_vip_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  103. ->where('puser_id', $accountId)->whereBetween("created_at", [$start, $end])
  104. ->whereBetween('ranse_created_at', [$start, $end])
  105. ->where('order_type', '<>', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  106. } elseif ($type == 3) {
  107. // 优化师
  108. $recharge_coin_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  109. ->where('user_id', $accountId)->whereBetween("created_at", [$start, $end])
  110. ->whereBetween('ranse_created_at', [$start, $end])
  111. ->where('order_type', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  112. $recharge_vip_num = DB::table('orders')->where('status', "<>", 'UNPAID')
  113. ->where('user_id', $accountId)->whereBetween("created_at", [$start, $end])
  114. ->whereBetween('ranse_created_at', [$start, $end])
  115. ->where('order_type', '<>', 'COIN')->groupBy('uid', 'ranse_created_at')->count();
  116. } else {
  117. // 其他暂不统计
  118. $recharge_coin_num = 0;
  119. $recharge_vip_num = 0;
  120. }
  121. return [$recharge_coin_num, $recharge_vip_num];
  122. }
  123. /**
  124. *
  125. * name: getTodayData
  126. * @param int $accountId 账号id
  127. * @param mixed $type 账号类型 1 其他 2 投放公司 3 优化师
  128. */
  129. public static function historyStats(int $accountId, $type)
  130. {
  131. print_sql();
  132. $month = self::getStaticsData($accountId,date('Y-m-01'), date('Y-m-d', strtotime('yesterday')), $type);
  133. $lastMonth = self::getStaticsData($accountId,date('Y-m-01',strtotime(date('Y-m-01'))-10), date('Y-m-d',strtotime(date('Y-m-01'))-10), $type);
  134. $history = self::getHistoryData($accountId,$type);
  135. return ['month' => $month,'lastMonth' => $lastMonth,'history' => $history];
  136. }
  137. /**
  138. * 历史汇总
  139. * name: getMonthData
  140. * @param int $accountId 账号
  141. * @param mixed $type 角色类型 账号类型 1 其他 2 投放公司 3 优化师
  142. * @param mixed $minId 小程序id
  143. * date 2023/06/27 11:19
  144. */
  145. protected static function getHistoryData($accountId, $type, $minId = 0)
  146. {
  147. $date = date('Y-m-d', strtotime('yesterday'));
  148. $sql = TjOptimizerDayNewUser::where('date',$date);
  149. if ($type == 2) {
  150. $sql->where('puser_id', $accountId);
  151. } elseif ($type == 3) {
  152. $sql->where('puser_id', $accountId);
  153. }
  154. if ($minId){
  155. $sql->where('miniprogram_id',$minId);
  156. }
  157. $info = $sql->select(
  158. DB::raw("sum(recharge_amount_total) as recharge_amount_total"), // 总充金额
  159. DB::raw("sum(recharge_user_total) as recharge_user_total"), // 累计充值人数
  160. )->first();
  161. return [
  162. 'recharge_amount_total' => $info->recharge_amount_total?:0,
  163. 'recharge_user_total' => $info->recharge_user_total?: 0,
  164. ];
  165. }
  166. /**
  167. * 日期范围的统计
  168. * name: getMonthData
  169. * @param int $accountId 账号
  170. * @param mixed $type 角色类型 账号类型 1 其他 2 投放公司 3 优化师
  171. * @param mixed $minId 小程序id
  172. * date 2023/06/27 11:19
  173. */
  174. private static function getStaticsData($accountId, $start, $end,$type,$minId = 0)
  175. {
  176. $sql = TjOptimizerDayNewUser::where('date', '>=', $start)->where("date", "<=", $end);
  177. if ($type == 2) {
  178. $sql->where('puser_id', $accountId);
  179. } elseif ($type == 3) {
  180. $sql->where('puser_id', $accountId);
  181. }
  182. if ($minId){
  183. $sql->where('miniprogram_id',$minId);
  184. }
  185. $info = $sql->select(
  186. DB::raw("sum(new_user_recharge_total) as new_user_recharge_total"), // 充值人数
  187. DB::raw("sum(new_user_num) as new_user_num"), // 新增用户人数
  188. DB::raw("sum(new_user_recharge_num) as new_user_recharge_num"), // 充值人数
  189. DB::raw("sum(new_user_recharge_vip_num) as new_user_recharge_vip_num"), // VIP充值人数
  190. DB::raw("sum(new_user_recharge_coin_num) as new_user_recharge_coin_num") // 普通充值人数
  191. )->first();
  192. return [
  193. 'new_user_recharge_total' => $info->new_user_recharge_total?:0,
  194. 'new_user_num' => $info->new_user_num?: 0,
  195. 'new_user_recharge_num' => $info->new_user_recharge_num?:0,
  196. 'new_user_recharge_vip_num' => $info->new_user_recharge_vip_num?: 0,
  197. 'new_user_recharge_coin_num' => $info->new_user_recharge_coin_num ?:0,
  198. ];
  199. }
  200. /**
  201. * 统计列表
  202. */
  203. public static function list(array $param)
  204. {
  205. $sql = self::getQuerySql($param)->select("tj_day_new_users.*", 'users.username')->orderBy('date', 'desc')->orderBy('id', 'desc');
  206. $isAll = getProp($param, 'is_all');
  207. if ($isAll) {
  208. $list = $sql->get();
  209. } else {
  210. $list = $sql->paginate(getProp($param, 'limit', 15));
  211. }
  212. if ($list->isEmpty()) {
  213. return $list;
  214. }
  215. $companyIds = $list->pluck('puser_id')->unique()->toArray();
  216. $companys = DB::table('users')->whereIn('id', $companyIds)->get();
  217. foreach ($list as $value) {
  218. // 充值率
  219. $value->recharge_rate = $value->new_user_recharge_num > 0 && $value->new_user_num > 0 ? sprintf("%.2f%s", $value->new_user_recharge_num / $value->new_user_num, "%") : 0;
  220. // 人均充值
  221. $value->recharge_mean = $value->new_user_recharge_num > 0 && $value->new_user_recharge_total > 0 ? sprintf("%.2f%s", $value->new_user_recharge_total / $value->new_user_recharge_num, "%") : 0;
  222. $value->company_name = $companys->where('id', $value->puser_id)->value('username');
  223. }
  224. return $list;
  225. }
  226. private static function getQuerySql(array $param)
  227. {
  228. $sql = TjOptimizerDayNewUser::query()->leftJoin('users', 'users.id', "=", 'tj_day_new_users.user_id');
  229. if (getProp($param, 'start_at')) {
  230. $sql->where('tj_day_new_users.date', ">=", $param['start_at']);
  231. }
  232. if (getProp($param, 'end_at')) {
  233. $sql->where('tj_day_new_users.date', "<=", $param['end_at']);
  234. }
  235. if (getProp($param, 'user_id')) {
  236. $sql->where('tj_day_new_users.user_id', $param['user_id']);
  237. }
  238. if (getProp($param, 'puser_id')) {
  239. $sql->where('tj_day_new_users.puser_id', $param['puser_id']);
  240. }
  241. if (getProp($param, 'miniprogram_id')) {
  242. $sql->where('tj_day_new_users.miniprogram_id', $param['miniprogram_id']);
  243. }
  244. return $sql;
  245. }
  246. }