library-picturebook-activity/frontend/src/api/analytics.ts
aid 9215465bd5 Day5: 租户端全面优化 + 数据统计看板 + 成果发布完善
租户端基础设施:
- 新增工作台首页(欢迎信息/统计/待办/快捷操作/新手引导)
- 新增机构信息管理页(自助查看编辑机构信息)
- 修复403报错(fetchTenants加超管守卫)
- 修复权限(log:read/notice:update/notice:delete/contest:work:read)
- 修复评审规则组件映射

活动管理全模块优化(机构端视角):
- 活动列表:加统计概览+精简列+筛选自动查询+发布弹窗修复+操作逻辑优化
- 创建/编辑活动:重构布局(去card嵌套+栅格响应式+分区卡片)
- 评委管理:统一主色调+冻结确认+导入导出disabled
- 报名管理:去Tab+统计+审核状态列+批量审核接口
- 报名记录:统计概览+去机构列+撤销审核+返回按钮+去参与方式列
- 作品管理:去Tab+统计+递交进度彩色+筛选修复(assignStatus/submitTime)
- 评审进度:去Tab+统计+实际完成率状态+筛选修复
- 评审规则:表格加评委数/计算方式+描述列修复+删除保护
- 成果发布:去Tab+统计+操作文案优化
- 通知公告:统一主色调+发布确认+操作逻辑+状态筛选+时间范围

成果发布详情功能补全:
- 计算得分/排名/设置奖项三步操作流程
- 排名列(金银铜徽章)+奖项列+奖项筛选
- 自定义奖项(动态添加行替代硬编码一二三等奖)
- 后端AutoSetAwardsDto改为awards数组格式

数据统计看板(新模块):
- 后端analytics module(overview+review两个接口)
- 运营概览:6指标卡片+报名转化漏斗+ECharts月度趋势+活动对比表
- 评审分析:4效率卡片+评委工作量表+ECharts奖项分布饼图
- 菜单注册:数据统计→运营概览+评审分析

Bug修复:
- 超管重置其他租户用户密码报"用户不存在"
- gdlib登录快捷标签密码不一致
- 分配评委去掉评审时间限制

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-31 20:02:24 +08:00

63 lines
1.4 KiB
TypeScript

import request from '@/utils/request'
export interface OverviewData {
summary: {
totalContests: number
totalRegistrations: number
passedRegistrations: number
totalWorks: number
reviewedWorks: number
awardedWorks: number
}
funnel: {
registered: number
passed: number
submitted: number
reviewed: number
awarded: number
}
monthlyTrend: Array<{ month: string; registrations: number; works: number }>
contestComparison: Array<{
contestId: number
contestName: string
registrations: number
passRate: number
submitRate: number
reviewRate: number
awardRate: number
avgScore: number | null
}>
}
export interface ReviewData {
efficiency: {
avgReviewDays: number
dailyReviewCount: number
pendingAssignments: number
avgScoreStddev: number
}
judgeWorkload: Array<{
judgeId: number
judgeName: string
contestCount: number
assignedCount: number
scoredCount: number
completionRate: number
avgScore: number | null
scoreStddev: number
}>
awardDistribution: Array<{
awardName: string
count: number
percentage: number
}>
}
export const analyticsApi = {
getOverview: (params?: { timeRange?: string; contestId?: number }): Promise<OverviewData> =>
request.get('/analytics/overview', { params }),
getReview: (params?: { contestId?: number }): Promise<ReviewData> =>
request.get('/analytics/review', { params }),
}