1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-22 11:41:27 +08:00
koogua a7f197c01b !6 develop->master 1.1.0
* 更新版本号
* 完善后台今日统计,增加权限白名单,增加后台首页菜单,调整后台登录页样式
* Merge branch 'koogua/I1XFCF' of https://gitee.com/koogua/course-tencen…
* 前台学习资料部分完成
* !2 后台运营统计合并
* 后台学习资料部分完成
* Merge branch 'master' into develop
* Merge branch 'master' of https://github.com/xiaochong0302/course-tencent-cloud
* 1.增加changelog.md
* 1.简化部分路由地址
* Merge pull request #2 from xiaochong0302/dependabot/composer/symfony/h…
* Bump symfony/http-foundation from 4.3.4 to 5.1.6
2020-10-08 18:44:06 +08:00

406 lines
11 KiB
PHP

<?php
namespace App\Http\Admin\Services;
use App\Models\Order as OrderModel;
use App\Repos\Stat as StatRepo;
class Stat extends Service
{
public function hotSales()
{
$type = $this->request->getQuery('type', 'int', OrderModel::ITEM_COURSE);
$year = $this->request->getQuery('year', 'int', date('Y'));
$month = $this->request->getQuery('month', 'int', date('m'));
$prev = $this->getPrevMonth($year, $month);
return [
[
'title' => "{$year}-{$month}",
'sales' => $this->handleHotSales($type, $year, $month),
],
[
'title' => "{$prev['year']}-{$prev['month']}",
'sales' => $this->handleHotSales($type, $prev['year'], $prev['month']),
],
];
}
public function sales()
{
$year = $this->request->getQuery('year', 'int', date('Y'));
$month = $this->request->getQuery('month', 'int', date('m'));
$prev = $this->getPrevMonth($year, $month);
$currSales = $this->handleSales($year, $month);
$prevSales = $this->handleSales($prev['year'], $prev['month']);
$items = [];
foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [
'date' => $date,
$currMonth => $currSales[$date] ?? 0,
$prevMonth => $prevSales[$date] ?? 0,
];
}
return $items;
}
public function refunds()
{
$year = $this->request->getQuery('year', 'int', date('Y'));
$month = $this->request->getQuery('month', 'int', date('m'));
$prev = $this->getPrevMonth($year, $month);
$currRefunds = $this->handleRefunds($year, $month);
$prevRefunds = $this->handleRefunds($prev['year'], $prev['month']);
$items = [];
foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [
'date' => $date,
$currMonth => $currRefunds[$date] ?? 0,
$prevMonth => $prevRefunds[$date] ?? 0,
];
}
return $items;
}
public function registeredUsers()
{
$year = $this->request->getQuery('year', 'int', date('Y'));
$month = $this->request->getQuery('month', 'int', date('m'));
$prev = $this->getPrevMonth($year, $month);
$currUsers = $this->handleRegisteredUsers($year, $month);
$prevUsers = $this->handleRegisteredUsers($prev['year'], $prev['month']);
$items = [];
foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [
'date' => $date,
$currMonth => $currUsers[$date] ?? 0,
$prevMonth => $prevUsers[$date] ?? 0,
];
}
return $items;
}
public function onlineUsers()
{
$year = $this->request->getQuery('year', 'int', date('Y'));
$month = $this->request->getQuery('month', 'int', date('m'));
$prev = $this->getPrevMonth($year, $month);
$currUsers = $this->handleOnlineUsers($year, $month);
$prevUsers = $this->handleOnlineUsers($prev['year'], $prev['month']);
$items = [];
foreach (range(1, 31) as $day) {
$date = sprintf('%02d', $day);
$prevMonth = "{$prev['year']}-{$prev['month']}";
$currMonth = "{$year}-{$month}";
$items[] = [
'date' => $date,
$currMonth => $currUsers[$date] ?? 0,
$prevMonth => $prevUsers[$date] ?? 0,
];
}
return $items;
}
public function getYearOptions()
{
$end = date('Y');
$start = $end - 3;
return range($start, $end);
}
public function getMonthOptions()
{
$options = [];
foreach (range(1, 12) as $value) {
$options[] = sprintf('%02d', $value);
}
return $options;
}
protected function isCurrMonth($year, $month)
{
return date('Y-m') == "{$year}-{$month}";
}
protected function getPrevMonth($year, $month)
{
$currentMonthTime = strtotime("{$year}-{$month}");
$prevMonthTime = strtotime('-1 month', $currentMonthTime);
return [
'year' => date('Y', $prevMonthTime),
'month' => date('m', $prevMonthTime),
];
}
protected function getMonthDates($year, $month)
{
$startTime = strtotime("{$year}-{$month}-01");
$days = date('t', $startTime);
$result = [];
foreach (range(1, $days) as $day) {
$result[] = sprintf('%04d-%02d-%02d', $year, $month, $day);
}
return $result;
}
protected function handleHotSales($type, $year, $month)
{
$keyName = "stat_hot_sales:{$type}_{$year}_{$month}";
$cache = $this->getCache();
$items = $cache->get($keyName);
if (!$items) {
$statRepo = new StatRepo();
$orders = $statRepo->findMonthlyOrders($type, $year, $month);
$items = [];
if ($orders->count() > 0) {
foreach ($orders as $order) {
$key = $order->item_id;
if (!isset($items[$key])) {
$items[$key] = [
'title' => $order->subject,
'total_count' => 1,
'total_amount' => $order->amount,
];
} else {
$items[$key]['total_count'] += 1;
$items[$key]['total_amount'] += $order->amount;
}
}
$totalCount = array_column($items, 'total_count');
array_multisort($totalCount, SORT_DESC, $items);
}
$queryMonth = "{$year}-{$month}";
$currMonth = date('Y-m');
if ($queryMonth < $currMonth) {
$cache->save($keyName, $items, 7 * 86400);
} else {
$cache->save($keyName, $items, 2 * 3600);
}
}
return $items;
}
protected function handleSales($year, $month)
{
$keyName = "stat_sales:{$year}_{$month}";
$redis = $this->getRedis();
$list = $redis->hGetAll($keyName);
$statRepo = new StatRepo();
$currDate = date('Y-m-d');
$currDay = date('d');
if (!$list) {
$dates = $this->getMonthDates($year, $month);
foreach ($dates as $date) {
$key = substr($date, -2);
if ($date < $currDate) {
$list[$key] = $statRepo->sumDailySales($date);
} elseif ($date == $currDate) {
$list[$key] = -999;
} else {
$list[$key] = 0;
}
}
$redis->hMSet($keyName, $list);
$redis->expire($keyName, 7 * 86400);
}
foreach ($list as $key => $value) {
if ($value < 0) {
$list[$key] = $statRepo->sumDailySales("{$year}-{$month}-{$key}");
$redis->hSet($keyName, $key, $list[$key]);
}
}
if ($this->isCurrMonth($year, $month)) {
$list[$currDay] = $statRepo->sumDailySales($currDate);
}
return $list;
}
protected function handleRefunds($year, $month)
{
$keyName = "stat_refunds:{$year}_{$month}";
$redis = $this->getRedis();
$list = $redis->hGetAll($keyName);
$statRepo = new StatRepo();
$currDate = date('Y-m-d');
$currDay = date('d');
if (!$list) {
$dates = $this->getMonthDates($year, $month);
foreach ($dates as $date) {
$key = substr($date, -2);
if ($date < $currDate) {
$list[$key] = $statRepo->sumDailyRefunds($date);
} elseif ($date == $currDate) {
$list[$key] = -999;
} else {
$list[$key] = 0;
}
}
$redis->hMSet($keyName, $list);
$redis->expire($keyName, 7 * 86400);
}
foreach ($list as $key => $value) {
if ($value < 0) {
$list[$key] = $statRepo->sumDailyRefunds("{$year}-{$month}-{$key}");
$redis->hSet($keyName, $key, $list[$key]);
}
}
if ($this->isCurrMonth($year, $month)) {
$list[$currDay] = $statRepo->sumDailyRefunds($currDate);
}
return $list;
}
protected function handleRegisteredUsers($year, $month)
{
$keyName = "stat_reg_users:{$year}_{$month}";
$redis = $this->getRedis();
$list = $redis->hGetAll($keyName);
$statRepo = new StatRepo();
$currDate = date('Y-m-d');
$currDay = date('d');
if (!$list) {
$dates = $this->getMonthDates($year, $month);
foreach ($dates as $date) {
$key = substr($date, -2);
if ($date < $currDate) {
$list[$key] = $statRepo->countDailyRegisteredUser($date);
} elseif ($date == $currDate) {
$list[$key] = -999;
} else {
$list[$key] = 0;
}
}
$redis->hMSet($keyName, $list);
$redis->expire($keyName, 7 * 86400);
}
foreach ($list as $key => $value) {
if ($value < 0) {
$list[$key] = $statRepo->countDailyRegisteredUser("{$year}-{$month}-{$key}");
$redis->hSet($keyName, $key, $list[$key]);
}
}
if ($this->isCurrMonth($year, $month)) {
$list[$currDay] = $statRepo->countDailyRegisteredUser($currDate);
}
return $list;
}
protected function handleOnlineUsers($year, $month)
{
$keyName = "stat_online_users:{$year}_{$month}";
$redis = $this->getRedis();
$list = $redis->hGetAll($keyName);
$statRepo = new StatRepo();
$currDate = date('Y-m-d');
$currDay = date('d');
if (!$list) {
$dates = $this->getMonthDates($year, $month);
foreach ($dates as $date) {
$key = substr($date, -2);
if ($date < $currDate) {
$list[$key] = $statRepo->countDailyOnlineUser($date);
} elseif ($date == $currDate) {
$list[$key] = -999;
} else {
$list[$key] = 0;
}
}
$redis->hMSet($keyName, $list);
$redis->expire($keyName, 7 * 86400);
}
foreach ($list as $key => $value) {
if ($value < 0) {
$list[$key] = $statRepo->countDailyOnlineUser("{$year}-{$month}-{$key}");
$redis->hSet($keyName, $key, $list[$key]);
}
}
if ($this->isCurrMonth($year, $month)) {
$list[$currDay] = $statRepo->countDailyOnlineUser($currDate);
}
return $list;
}
}