154 lines
3.7 KiB
TypeScript
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)
|
|
}
|