更新
This commit is contained in:
@@ -0,0 +1,105 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace app\adminapi\controller\stats;
|
||||
|
||||
use app\adminapi\controller\BaseAdminController;
|
||||
use app\adminapi\logic\stats\YejiStatsLogic;
|
||||
|
||||
/**
|
||||
* 业绩看板(部门 × 时间区间)控制器
|
||||
*
|
||||
* - GET stats.yeji-stats/overview 单区间
|
||||
* - GET stats.yeji-stats/multi 多区间一次返回(默认 月/周/今日/昨日 四张表)
|
||||
* - GET stats.yeji-stats/dept-options 部门下拉
|
||||
* - GET stats.yeji-stats/leaderboard 医助排行榜(按展示部门分表)
|
||||
*/
|
||||
class YejiStatsController extends BaseAdminController
|
||||
{
|
||||
public function overview()
|
||||
{
|
||||
// 业绩看板涉及多张大表 + 标签穿透计算,单 30s 上限不够;放宽到 120s 兜底
|
||||
@set_time_limit(120);
|
||||
$params = $this->request->get();
|
||||
|
||||
return $this->data(YejiStatsLogic::overview($params));
|
||||
}
|
||||
|
||||
/**
|
||||
* 一次返回 4 个时间区间的数据,对应前端 4 张表。
|
||||
* 默认区间(不传 ranges 时):当月、当周(周一→今天)、今日、昨日。
|
||||
* ranges 也可由前端自定义传入:[{label:..., start_date:..., end_date:...}]
|
||||
*/
|
||||
public function multi()
|
||||
{
|
||||
// 4 个区间叠加,30s 上限对部分线上数据量来说过紧,放宽到 120s
|
||||
@set_time_limit(120);
|
||||
$params = $this->request->get();
|
||||
$rangesRaw = $params['ranges'] ?? null;
|
||||
|
||||
$today = date('Y-m-d');
|
||||
$monthStart = date('Y-m-01');
|
||||
// 周一为起点(PHP date('N') 1=周一)
|
||||
$weekStart = date('Y-m-d', strtotime('monday this week'));
|
||||
$yesterday = date('Y-m-d', strtotime('-1 day'));
|
||||
|
||||
$ranges = [];
|
||||
if (is_array($rangesRaw) && $rangesRaw !== []) {
|
||||
foreach ($rangesRaw as $r) {
|
||||
if (!is_array($r)) {
|
||||
continue;
|
||||
}
|
||||
$ranges[] = [
|
||||
'label' => (string) ($r['label'] ?? ''),
|
||||
'start_date' => (string) ($r['start_date'] ?? $today),
|
||||
'end_date' => (string) ($r['end_date'] ?? ($r['start_date'] ?? $today)),
|
||||
];
|
||||
}
|
||||
}
|
||||
if ($ranges === []) {
|
||||
$ranges = [
|
||||
['label' => '本月(' . date('n') . '月)', 'start_date' => $monthStart, 'end_date' => $today],
|
||||
['label' => '本周(' . substr($weekStart, 5) . '~' . substr($today, 5) . ')', 'start_date' => $weekStart, 'end_date' => $today],
|
||||
['label' => '今日(' . substr($today, 5) . ')', 'start_date' => $today, 'end_date' => $today],
|
||||
['label' => '昨日(' . substr($yesterday, 5) . ')', 'start_date' => $yesterday, 'end_date' => $yesterday],
|
||||
];
|
||||
}
|
||||
|
||||
$base = [];
|
||||
if (isset($params['dept_ids'])) {
|
||||
$base['dept_ids'] = $params['dept_ids'];
|
||||
}
|
||||
if (isset($params['tag_id'])) {
|
||||
$base['tag_id'] = $params['tag_id'];
|
||||
}
|
||||
if (isset($params['channel_code'])) {
|
||||
$base['channel_code'] = $params['channel_code'];
|
||||
}
|
||||
|
||||
return $this->data([
|
||||
'ranges' => $ranges,
|
||||
'tables' => YejiStatsLogic::overviewBatch($ranges, $base),
|
||||
]);
|
||||
}
|
||||
|
||||
public function deptOptions()
|
||||
{
|
||||
return $this->data(YejiStatsLogic::deptOptions());
|
||||
}
|
||||
|
||||
/** 渠道(标签)下拉,按 source_group_name 分组 */
|
||||
public function channelOptions()
|
||||
{
|
||||
return $this->data(YejiStatsLogic::channelOptions());
|
||||
}
|
||||
|
||||
/** 医助排行榜:与 overview 同筛选;日期由前端传入(多表模式下前端传「今日」单区间) */
|
||||
public function leaderboard()
|
||||
{
|
||||
@set_time_limit(120);
|
||||
$params = $this->request->get();
|
||||
|
||||
return $this->data(YejiStatsLogic::assistantLeaderboards($params));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user