This commit is contained in:
Your Name
2026-04-30 09:27:42 +08:00
parent dc899e4af4
commit eb782305e6
460 changed files with 10785 additions and 928 deletions
@@ -0,0 +1,48 @@
<?php
declare(strict_types=1);
namespace app\adminapi\controller\finance;
use app\adminapi\controller\BaseAdminController;
use app\adminapi\logic\finance\DeptPerformanceTargetLogic;
use app\adminapi\validate\finance\DeptPerformanceTargetValidate;
/**
* 制定业绩:按部门、按自然月维护目标金额(元)
*
* - GET finance.dept_performance_target/monthMatrix
* - POST finance.dept_performance_target/batchSave
*/
class DeptPerformanceTargetController extends BaseAdminController
{
public function monthMatrix()
{
$params = (new DeptPerformanceTargetValidate())->goCheck('monthMatrix');
$ym = (string) $params['year_month'];
return $this->data(DeptPerformanceTargetLogic::monthMatrix($ym));
}
public function batchSave()
{
$params = (new DeptPerformanceTargetValidate())->post()->goCheck('batchSave');
$ym = (string) $params['year_month'];
$items = $params['items'] ?? [];
if (!is_array($items)) {
return $this->fail('目标数据格式错误');
}
$result = DeptPerformanceTargetLogic::batchSave(
$ym,
$items,
$this->adminId,
(string) ($this->adminInfo['name'] ?? '')
);
if ($result === false) {
return $this->fail(DeptPerformanceTargetLogic::getError());
}
return $this->success('保存成功', DeptPerformanceTargetLogic::monthMatrix($ym), 1, 1);
}
}
@@ -45,6 +45,14 @@ class CustomerController extends BaseAdminController
return $this->data($stats);
}
/**
* @notes 获取标签维度统计(按 group 分组、按客户数倒序,供前端筛选下拉 + 标签面板共用)
*/
public function tagStats()
{
return $this->data(CustomerLogic::getTagStats());
}
/**
* @notes 今日进入分布(用于页面"今日新增"卡片的迷你柱/最近进入时间/渠道 Top5)
*/
@@ -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));
}
}
@@ -183,6 +183,7 @@ class PrescriptionOrderController extends BaseAdminController
(int) $params['id'],
(string) ($params['express_company'] ?? 'auto'),
(string) ($params['tracking_number'] ?? ''),
(string) ($params['ship_mode'] ?? 'gancao'),
$this->adminId,
$this->adminInfo
);