diff --git a/admin/src/api/stats.ts b/admin/src/api/stats.ts index d4819327..b6fb4eb5 100644 --- a/admin/src/api/stats.ts +++ b/admin/src/api/stats.ts @@ -179,3 +179,12 @@ export function commissionSettlementConfirmFinalize(params: Record) export function commissionSettlementConfirmRevoke(params: Record) { return request.post({ url: '/stats.commissionSettlement/confirmRevoke', params }) } + +/** 医助个人业绩概览 */ +export function assistantPerformanceOverview(params: { + time_type?: string + start_date?: string + end_date?: string +}) { + return request.get({ url: '/stats.assistantPerformance/overview', params }) +} diff --git a/admin/src/views/stats/assistant-performance/index.vue b/admin/src/views/stats/assistant-performance/index.vue new file mode 100644 index 00000000..2ace7eee --- /dev/null +++ b/admin/src/views/stats/assistant-performance/index.vue @@ -0,0 +1,273 @@ + + + + + diff --git a/server/app/adminapi/controller/stats/AssistantPerformanceController.php b/server/app/adminapi/controller/stats/AssistantPerformanceController.php new file mode 100644 index 00000000..348fe729 --- /dev/null +++ b/server/app/adminapi/controller/stats/AssistantPerformanceController.php @@ -0,0 +1,21 @@ +request->get(); + return $this->data(AssistantPerformanceLogic::overview($params, $this->adminId, $this->adminInfo)); + } +} diff --git a/server/app/adminapi/logic/stats/AssistantPerformanceLogic.php b/server/app/adminapi/logic/stats/AssistantPerformanceLogic.php new file mode 100644 index 00000000..8333910e --- /dev/null +++ b/server/app/adminapi/logic/stats/AssistantPerformanceLogic.php @@ -0,0 +1,106 @@ +where('delete_time IS NULL') + ->where('diagnosis_id', '>', 0) + ->where('creator_id', $adminId) + ->where('fulfillment_status', self::FULFILLMENT_COMPLETED) + ->where('create_time', '>=', $startTs) + ->where('create_time', '<=', $endTs); + + // 业绩总额 + $totalAmount = (clone $baseQuery)->sum('amount'); + + // 有效订单数 + $totalCount = (clone $baseQuery)->count(); + + // 按日期分组的折线图数据 + $dailyData = (clone $baseQuery) + ->field("FROM_UNIXTIME(create_time, '%Y-%m-%d') as date_label, SUM(amount) as daily_amount, COUNT(*) as daily_count") + ->group('date_label') + ->order('date_label', 'asc') + ->select() + ->toArray(); + + // 补全日期范围内的空日期 + $dateMap = []; + foreach ($dailyData as $row) { + $dateMap[$row['date_label']] = [ + 'amount' => round((float)$row['daily_amount'], 2), + 'count' => (int)$row['daily_count'], + ]; + } + + $dates = []; + $amounts = []; + $counts = []; + $cursor = strtotime($startDate); + $endCursor = strtotime($endDate); + while ($cursor <= $endCursor) { + $d = date('Y-m-d', $cursor); + $dates[] = substr($d, 5); // MM-DD + $amounts[] = $dateMap[$d]['amount'] ?? 0; + $counts[] = $dateMap[$d]['count'] ?? 0; + $cursor = strtotime('+1 day', $cursor); + } + + return [ + 'date_range' => [$startDate, $endDate], + 'summary' => [ + 'total_amount' => round((float)$totalAmount, 2), + 'total_count' => (int)$totalCount, + ], + 'chart' => [ + 'dates' => $dates, + 'amounts' => $amounts, + 'counts' => $counts, + ], + ]; + } +} diff --git a/server/sql/1.9.20260519/add_assistant_performance_menu.sql b/server/sql/1.9.20260519/add_assistant_performance_menu.sql new file mode 100644 index 00000000..1fda4c2e --- /dev/null +++ b/server/sql/1.9.20260519/add_assistant_performance_menu.sql @@ -0,0 +1,12 @@ +-- 医助个人业绩菜单 +-- 页面路径: /stats/assistant_performance +-- 前端组件: /stats/assistant-performance/index +-- 查询权限: stats.assistantPerformance/overview + +-- 获取「数据统计」目录的 id(假设已经存在) +SET @stats_root_id = (SELECT id FROM zyt_system_menu WHERE name = '数据统计' AND type = 'M' LIMIT 1); + +INSERT INTO `zyt_system_menu` + (`pid`, `type`, `name`, `icon`, `sort`, `perms`, `paths`, `component`, `selected`, `params`, `is_show`, `is_disable`, `create_time`, `update_time`) +VALUES + (@stats_root_id, 'C', '个人业绩', '', 10, 'stats.assistantPerformance/overview', '/stats/assistant_performance', '/stats/assistant-performance/index', '', '', 1, 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP());