125 lines
4.7 KiB
PHP
125 lines
4.7 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
namespace app\adminapi\controller\stats;
|
||
|
||
use app\adminapi\controller\BaseAdminController;
|
||
use app\adminapi\logic\stats\YejiStatsLogic;
|
||
|
||
/**
|
||
* 业绩看板(部门 × 时间区间)控制器
|
||
*
|
||
* - GET stats.yejiStats/overview 单区间
|
||
* - GET stats.yejiStats/multi 多区间一次返回(默认 月/周/今日/昨日 四张表)
|
||
* - GET stats.yejiStats/deptOptions 部门下拉
|
||
* - GET stats.yejiStats/leaderboard 医助排行榜(按展示部门分表)
|
||
* - GET stats.yejiStats/leadLines 进线数据明细(add_external_contact 逐条)
|
||
*/
|
||
class YejiStatsController extends BaseAdminController
|
||
{
|
||
public function overview()
|
||
{
|
||
// 业绩看板涉及多张大表 + 标签穿透计算,单 30s 上限不够;放宽到 120s 兜底
|
||
@set_time_limit(120);
|
||
$params = $this->request->get();
|
||
|
||
return $this->data(YejiStatsLogic::overview($params, $this->adminId, $this->adminInfo));
|
||
}
|
||
|
||
/**
|
||
* 一次返回 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, $this->adminId, $this->adminInfo),
|
||
]);
|
||
}
|
||
|
||
public function deptOptions()
|
||
{
|
||
return $this->data(YejiStatsLogic::deptOptions($this->adminId, $this->adminInfo));
|
||
}
|
||
|
||
/** 渠道(标签)下拉,按 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, $this->adminId, $this->adminInfo));
|
||
}
|
||
|
||
/** 「未归属中心」行:按订单创建人拆解业绩(与「合计业绩」未归属部分同口径) */
|
||
public function unassignedBreakdown()
|
||
{
|
||
@set_time_limit(120);
|
||
$params = $this->request->get();
|
||
|
||
return $this->data(YejiStatsLogic::unassignedCenterBreakdown($params, $this->adminId, $this->adminInfo));
|
||
}
|
||
|
||
/** 进线数据明细:与看板「进线数据」同口径 */
|
||
public function leadLines()
|
||
{
|
||
@set_time_limit(120);
|
||
$params = $this->request->get();
|
||
|
||
return $this->data(YejiStatsLogic::leadLineList($params, $this->adminId, $this->adminInfo));
|
||
}
|
||
}
|