517 lines
12 KiB
TypeScript

import request from '@/utils/request'
export interface Task {
id?: number
taskNo?: string
title: string
taskTypeId: number
taskSubType?: string
quantity?: number
score?: number
estimatedHours?: number
brandId?: number
categoryId?: number
spuInfo?: string
platformId?: number
attachmentUrl?: string
deliveryPath?: string
publisherId?: number
publisherDeptId?: number
receiverId?: number
receiverDeptId?: number
receiverName?: string
receiverDeptName?: string
releaseType: string
status?: string
auditStatus?: string
auditorId?: number
auditorName?: string
auditTime?: string
auditComment?: string
progress?: number
startTime?: string
deadline?: string
completeTime?: string
rating?: number
reviewComment?: string
rejectReason?: string
isUrgent?: number
isDelayed?: number
createTime?: string
updateTime?: string
remark?: string
// 流水线任务字段
isPipeline?: number
pipelineMode?: 'sequential' | 'parallel'
// 两级审核字段
approvalStatus?: string // pending_demand_approval/pending_receiving_approval/approved/rejected_by_demand/rejected_by_receiving
currentApproverId?: number
currentApproverRole?: string // demand_leader/receiving_leader
currentApproverName?: string // 当前审核人姓名
demandApprovalTime?: string
receivingApprovalTime?: string
// 关联字段(从后端查询返回)
brandName?: string
categoryName?: string
platformName?: string
publisherName?: string
publisherDeptName?: string
}
// 任务子项(流水线任务)
export interface TaskItem {
id?: number
taskId: number
itemNo?: string
taskTypeId: number
taskTypeName?: string
quantity: number
unitScore: number
totalScore: number
estimatedHours?: number
receiverId?: number
receiverName?: string
status: string // locked/pending/in_progress/completed/rejected
progress?: number
isLocked?: number
prevItemId?: number
deliveryPath?: string
submitTime?: string
completeTime?: string
sortOrder: number
createTime?: string
updateTime?: string
// 主任务信息
mainTaskTitle?: string
pipelineMode?: 'sequential' | 'parallel'
totalItems?: number
// 其他关联字段
brandName?: string
categoryName?: string
platformName?: string
publisherName?: string
spuInfo?: string
taskSubType?: string
attachmentUrl?: string
}
// 创建流水线任务请求
export interface PipelineTaskRequest {
title: string
isPipeline: boolean
pipelineMode: 'sequential' | 'parallel'
items: Array<{
taskTypeId: number
quantity: number
sortOrder: number
}>
brandId?: number
categoryId?: number
platformId?: number
spuInfo?: string
taskSubType?: string
attachmentUrl?: string
remark?: string
priority?: string
}
export interface TaskAuditRequest {
taskId: number
result: 'pass' | 'reject'
comment?: string
}
export interface TaskListParams {
status?: string
taskTypeId?: number
page?: number
pageSize?: number
}
export interface TaskHallParams {
taskTypeId?: number
demandTypeId?: number
brandId?: number
categoryId?: number
platformId?: number
taskSubType?: string
minScore?: number
maxScore?: number
keyword?: string
publisherName?: string
timeRange?: 'today' | 'week' | 'month'
sortBy?: 'latest' | 'score' | 'deadline' | 'hot'
page?: number
pageSize?: number
}
export interface MyTasksParams {
role?: 'publisher' | 'receiver'
status?: string
page?: number
pageSize?: number
}
/**
* 创建任务
*/
export const createTask = (data: Task) => {
return request.post<any>('/tasks', data)
}
/**
* 获取任务列表
*/
export const getTaskList = (params: TaskListParams) => {
return request.get<any>('/tasks', { params })
}
/**
* 获取任务详情
*/
export const getTaskById = (id: number) => {
return request.get<any>(`/tasks/${id}`)
}
/**
* 更新任务
*/
export const updateTask = (id: number, data: Partial<Task>) => {
return request.put<any>(`/tasks/${id}`, data)
}
/**
* 抢单
*/
export const grabTask = (id: number) => {
return request.post<any>(`/tasks/${id}/grab`)
}
/**
* 提交任务
*/
export const submitTask = (id: number, deliveryPath: string) => {
return request.post<any>(`/tasks/${id}/submit`, null, {
params: { deliveryPath }
})
}
/**
* 审核任务
*/
export const reviewTask = (
id: number,
approved: boolean,
comment?: string,
rating?: number
) => {
return request.post<any>(`/tasks/${id}/review`, null, {
params: { approved, comment, rating }
})
}
/**
* 取消任务
*/
export const cancelTask = (id: number, reason: string) => {
return request.post<any>(`/tasks/${id}/cancel`, null, {
params: { reason }
})
}
/**
* 获取任务大厅
*/
export const getTaskHall = (params: TaskHallParams) => {
return request.get<any>('/tasks/hall', { params })
}
/**
* 获取已完成任务列表(根据角色权限)
*/
export const getCompletedTasks = (params: any) => {
return request.get<any>('/tasks/completed', { params })
}
/**
* 获取我的进行中任务列表
*/
export const getMyInProgressTasks = () => {
return request.get<any>('/tasks/my-in-progress')
}
/**
* 批量更新任务进度
*/
export const batchUpdateProgress = (updates: Array<{taskId: number, progress: number, remark?: string}>) => {
return request.post<any>('/tasks/batch-update-progress', { updates })
}
/**
* 获取我的任务
*/
export const getMyTasks = (params: MyTasksParams) => {
return request.get<any>('/tasks/my', { params })
}
/**
* 提交任务审核
*/
export const submitTaskAudit = (id: number) => {
return request.post<any>(`/tasks/${id}/submit-audit`)
}
/**
* 审核任务(部门负责人)
*/
export const auditTask = (data: TaskAuditRequest) => {
return request.post<any>('/tasks/audit', data)
}
/**
* 强制指派任务
*/
export const assignTask = (taskId: number, assigneeId: number, comment?: string) => {
return request.post<any>('/tasks/assign', {
taskId,
assigneeId,
assignType: 'force',
comment
})
}
/**
* 获取负责人任务列表(需求部门负责人)
*/
export const getLeaderTaskList = (params: { auditStatus?: string; page?: number; pageSize?: number }) => {
return request.get<any>('/tasks/leader/demand', { params })
}
/**
* 获取接单部门负责人视图
*/
export const getLeaderReceivingTaskList = (params: { status?: string; page?: number; pageSize?: number }) => {
return request.get<any>('/tasks/leader/receiving', { params })
}
/**
* 工作台统计数据接口
*/
export interface DashboardStats {
availableCount?: number
publishedCount?: number // 发布的任务数(当前用户当月发布的任务总数)
inProgressCount: number
completedCount: number
reviewCount: number
totalScore: number
todayStartedCount: number
todayCompletedCount: number
weekCompletedCount: number
lastWeekCompletedCount: number
}
/**
* 获取工作台统计数据
*/
export const getDashboardStats = (params?: { month?: string }) => {
return request.get<DashboardStats>('/tasks/dashboard/stats', { params })
}
/**
* 通用获取任务列表(支持状态筛选)
*/
export const getTasks = (params: any) => {
return request.get<any>('/tasks', { params })
}
/**
* 更新任务进度
*/
export const updateTaskProgress = (taskId: number, progress: number) => {
return request.post<any>(`/tasks/${taskId}/progress`, { progress })
}
/**
* 完结任务(提交审核)
*/
export const completeTask = (taskId: number, data: { deliveryPath: string }) => {
return request.post<any>(`/tasks/${taskId}/complete`, data)
}
/**
* 审核通过任务
*/
export const approveTask = (taskId: number) => {
return request.post<any>(`/tasks/${taskId}/approve`)
}
/**
* 驳回任务
*/
export const rejectTask = (taskId: number, data: { reason: string }) => {
return request.post<any>(`/tasks/${taskId}/reject`, data)
}
// ==================== 流水线任务相关 API ====================
/**
* 创建流水线任务
*/
export const createPipelineTask = (data: PipelineTaskRequest) => {
return request.post<any>('/tasks/pipeline', data)
}
/**
* 获取可接单的子任务列表
*/
export const getAvailableTaskItems = (params: {
page?: number
pageSize?: number
taskTypeId?: number
keyword?: string
}) => {
return request.get<any>('/tasks/items/available', { params })
}
/**
* 获取进行中的子任务列表
*/
export const getInProgressTaskItems = (params: {
page?: number
pageSize?: number
}) => {
return request.get<any>('/tasks/items/in-progress', { params })
}
/**
* 获取已完成的子任务列表
*/
export const getCompletedTaskItems = (params: {
page?: number
pageSize?: number
}) => {
return request.get<any>('/tasks/items/completed', { params })
}
/**
* 根据主任务ID获取所有子任务
*/
export const getTaskItemsByTaskId = (taskId: number) => {
return request.get<any>(`/tasks/items/task/${taskId}`)
}
/**
* 获取子任务详情
*/
export const getTaskItemById = (itemId: number) => {
return request.get<any>(`/tasks/items/${itemId}`)
}
/**
* 抢单子任务
*/
export const grabTaskItem = (itemId: number) => {
return request.post<any>(`/tasks/items/${itemId}/grab`)
}
/**
* 更新子任务进度
*/
export const updateTaskItemProgress = (itemId: number, progress: number) => {
return request.post<any>(`/tasks/items/${itemId}/progress`, null, {
params: { progress }
})
}
/**
* 完结子任务
*/
export const completeTaskItem = (itemId: number, data: { deliveryPath: string }) => {
return request.post<any>(`/tasks/items/${itemId}/complete`, data)
}
/**
* 驳回子任务
*/
export const rejectTaskItem = (itemId: number, data: { reason: string }) => {
return request.post<any>(`/tasks/items/${itemId}/reject`, data)
}
/**
* 获取主任务进度统计
*/
export const getTaskItemsProgress = (taskId: number) => {
return request.get<any>(`/tasks/items/task/${taskId}/progress`)
}
// ==================== 两级审核API ====================
/**
* 任务审核DTO
*/
export interface TaskApprovalDTO {
comment?: string // 审核意见
taskUpdates?: TaskUpdateDTO // 任务修改(可选)
}
/**
* 任务更新DTO
*/
export interface TaskUpdateDTO {
title?: string
taskSubType?: string
brandId?: number
platformId?: number
categoryId?: number
spuInfo?: string
remark?: string
attachmentUrl?: string
taskTypes?: Array<{
taskTypeId: number
quantity: number
}>
}
/**
* 获取待审核任务列表
*/
export const getPendingApprovalTasks = () => {
return request.get<Task[]>('/tasks/pending-approval')
}
/**
* 获取所有待审核任务(处于审批流程中的任务)
*/
export const getAllPendingApprovalTasks = (params?: { taskTypeId?: number; page?: number; pageSize?: number }) => {
return request.get<any>('/tasks/pending-approval-all', { params })
}
/**
* 需求部门负责人审核通过
*/
export const approveDemandLevel = (taskId: number, data: TaskApprovalDTO) => {
return request.post<any>(`/tasks/${taskId}/approve-demand`, data)
}
/**
* 需求部门负责人驳回
*/
export const rejectByDemandLeader = (taskId: number, reason: string) => {
return request.post<any>(`/tasks/${taskId}/reject-demand`, { reason })
}
/**
* 接单部门负责人审核通过
*/
export const approveReceivingLevel = (taskId: number, data: TaskApprovalDTO) => {
return request.post<any>(`/tasks/${taskId}/approve-receiving`, data)
}
/**
* 接单部门负责人驳回
*/
export const rejectByReceivingLeader = (taskId: number, reason: string) => {
return request.post<any>(`/tasks/${taskId}/reject-receiving`, { reason })
}