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)); } /** 医助排行榜「预约诊单」:挂号记录逐条列表(与计数同口径) */ public function appointmentLines() { @set_time_limit(120); $params = $this->request->get(); return $this->data(YejiStatsLogic::leaderboardAppointmentLines($params, $this->adminId, $this->adminInfo)); } /** 二中心复诊:按部门行 + 复诊分项拆解医助与业务订单笔数 */ public function revisitBreakdown() { @set_time_limit(120); $params = $this->request->get(); return $this->data(YejiStatsLogic::revisitDeptAssistantBreakdown($params, $this->adminId, $this->adminInfo)); } /** 被指派数明细:与看板「被指派数」同口径(区间内非继承指派,医助×诊单去重) */ public function assignLines() { @set_time_limit(120); $params = $this->request->get(); return $this->data(YejiStatsLogic::assignLines($params, $this->adminId, $this->adminInfo)); } }