import request from '@/utils/request' import type { Result, PageResult } from '@/api/types' // 竞赛活动接口类型 export interface Contest { id: number name: string description: string contestType: 'monthly' | 'weekly' | 'special' startTime: string endTime: string participantScope: 'all' | 'department' | 'user' departmentIds?: number[] userIds?: number[] rules: Record rewards: Array<{ rank: number; score: number; badge?: string }> participationReward?: { minTasks: number; score: number } status: 'draft' | 'scheduled' | 'active' | 'ended' | 'cancelled' participantCount: number creatorId: number createTime: string updateTime: string } export interface ContestParticipant { id: number contestId: number userId: number userName: string deptId: number deptName: string taskCompleted: number fiveStarCount: number earlyCompletionCount: number praiseCount: number noDelayDays: number totalScore: number currentRank: number rewardClaimed: number rewardScore: number rewardClaimTime?: string createTime: string updateTime: string } export interface ContestCreateRequest { name: string description?: string contestType: string startTime: string endTime: string participantScope: string departmentIds?: number[] userIds?: number[] rules: string rewards: string participationReward?: string } // ==================== 竞赛活动 API ==================== /** * 创建竞赛 */ export function createContest(data: ContestCreateRequest): Promise { return request.post>('/contests', data) .then(res => res.data) } /** * 更新竞赛 */ export function updateContest(id: number, data: Partial): Promise { return request.put>(`/contests/${id}`, data) .then(res => res.data) } /** * 发布竞赛 */ export function publishContest(id: number): Promise { return request.post>(`/contests/${id}/publish`) .then(res => res.data) } /** * 结束竞赛 */ export function endContest(id: number): Promise { return request.post>(`/contests/${id}/end`) .then(res => res.data) } /** * 取消竞赛 */ export function cancelContest(id: number): Promise { return request.post>(`/contests/${id}/cancel`) .then(res => res.data) } /** * 删除竞赛 */ export function deleteContest(id: number): Promise { return request.delete>(`/contests/${id}`) .then(res => res.data) } /** * 获取竞赛列表 */ export function getContestList(params: { page?: number pageSize?: number status?: string }): Promise> { return request.get>>('/contests', { params }) .then(res => res.data) } /** * 获取竞赛详情 */ export function getContestById(id: number): Promise { return request.get>(`/contests/${id}`) .then(res => res.data) } /** * 获取竞赛排行榜 */ export function getContestLeaderboard(id: number, limit?: number): Promise { return request.get>(`/contests/${id}/leaderboard`, { params: { limit } }).then(res => res.data) } /** * 获取我的竞赛数据 */ export function getMyContestData(contestId: number): Promise { return request.get>(`/contests/${contestId}/my`) .then(res => res.data) } /** * 领取竞赛奖励 */ export function claimContestReward(contestId: number): Promise { return request.post>(`/contests/${contestId}/claim-reward`) .then(res => res.data) }