154 lines
3.7 KiB
TypeScript

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<string, { score: number; weight: number }>
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<Contest> {
return request.post<Result<Contest>>('/contests', data)
.then(res => res.data)
}
/**
* 更新竞赛
*/
export function updateContest(id: number, data: Partial<ContestCreateRequest>): Promise<Contest> {
return request.put<Result<Contest>>(`/contests/${id}`, data)
.then(res => res.data)
}
/**
* 发布竞赛
*/
export function publishContest(id: number): Promise<Contest> {
return request.post<Result<Contest>>(`/contests/${id}/publish`)
.then(res => res.data)
}
/**
* 结束竞赛
*/
export function endContest(id: number): Promise<void> {
return request.post<Result<void>>(`/contests/${id}/end`)
.then(res => res.data)
}
/**
* 取消竞赛
*/
export function cancelContest(id: number): Promise<void> {
return request.post<Result<void>>(`/contests/${id}/cancel`)
.then(res => res.data)
}
/**
* 删除竞赛
*/
export function deleteContest(id: number): Promise<void> {
return request.delete<Result<void>>(`/contests/${id}`)
.then(res => res.data)
}
/**
* 获取竞赛列表
*/
export function getContestList(params: {
page?: number
pageSize?: number
status?: string
}): Promise<PageResult<Contest>> {
return request.get<Result<PageResult<Contest>>>('/contests', { params })
.then(res => res.data)
}
/**
* 获取竞赛详情
*/
export function getContestById(id: number): Promise<Contest> {
return request.get<Result<Contest>>(`/contests/${id}`)
.then(res => res.data)
}
/**
* 获取竞赛排行榜
*/
export function getContestLeaderboard(id: number, limit?: number): Promise<ContestParticipant[]> {
return request.get<Result<ContestParticipant[]>>(`/contests/${id}/leaderboard`, {
params: { limit }
}).then(res => res.data)
}
/**
* 获取我的竞赛数据
*/
export function getMyContestData(contestId: number): Promise<ContestParticipant> {
return request.get<Result<ContestParticipant>>(`/contests/${contestId}/my`)
.then(res => res.data)
}
/**
* 领取竞赛奖励
*/
export function claimContestReward(contestId: number): Promise<boolean> {
return request.post<Result<boolean>>(`/contests/${contestId}/claim-reward`)
.then(res => res.data)
}