fix: 修复被驳回任务无法重新编辑的问题,添加权限验证

This commit is contained in:
Your Name 2026-01-12 16:09:45 +08:00
parent ed4965f2b9
commit 2f0ec3d622
4 changed files with 67 additions and 13 deletions

View File

@ -97,9 +97,11 @@ public class TaskController {
@Operation(summary = "更新任务", description = "更新任务信息")
@PutMapping("/{id}")
public Result<String> updateTask(@PathVariable Long id, @RequestBody Task task) {
public Result<String> updateTask(@PathVariable Long id, @RequestBody Task task, @RequestHeader("Authorization") String authHeader) {
log.info("更新任务: {}", id);
taskService.updateTask(id, task);
String token = jwtUtil.extractTokenFromHeader(authHeader);
Long userId = jwtUtil.getUserIdFromToken(token);
taskService.updateTask(id, task, userId);
return Result.success("更新成功");
}

View File

@ -36,7 +36,7 @@ public interface TaskMapper extends BaseMapper<Task> {
"LEFT JOIN category c ON t.category_id = c.id " +
"LEFT JOIN platform p ON t.platform_id = p.id " +
"LEFT JOIN sys_user approver ON t.current_approver_id = approver.id " +
"WHERE t.status = 'pending' AND t.release_type = 'recruitment' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" +
"WHERE t.status = 'pending' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" +
"<if test='taskTypeId != null'> AND t.task_type_id = #{taskTypeId}</if>" +
"<if test='demandTypeId != null'> AND t.demand_type_id = #{demandTypeId}</if>" +
"<if test='brandId != null'> AND t.brand_id = #{brandId}</if>" +
@ -94,7 +94,7 @@ public interface TaskMapper extends BaseMapper<Task> {
"LEFT JOIN category c ON t.category_id = c.id " +
"LEFT JOIN platform p ON t.platform_id = p.id " +
"LEFT JOIN sys_user approver ON t.current_approver_id = approver.id " +
"WHERE t.status = 'pending' AND t.release_type = 'recruitment' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" +
"WHERE t.status = 'pending' AND t.approval_status = 'approved' AND t.deleted = 0 AND (t.is_pipeline = 0 OR t.is_pipeline IS NULL)" +
"<if test='allowedTaskTypeIds != null and allowedTaskTypeIds.size() > 0'>" +
" AND t.task_type_id IN " +
" <foreach item='typeId' collection='allowedTaskTypeIds' open='(' separator=',' close=')'>" +

View File

@ -1101,11 +1101,33 @@ public class TaskService {
* 更新任务
*/
@Transactional(rollbackFor = Exception.class)
public void updateTask(Long id, Task task) {
public void updateTask(Long id, Task task, Long userId) {
Task existTask = getTaskById(id);
// TODO: 验证权限
// 验证权限:只有任务发布人才能更新任务
boolean isAdmin = isAdminUser(userId);
if (!isAdmin && !userId.equals(existTask.getPublisherId())) {
throw new BusinessException(ResultCode.FORBIDDEN, "只有任务发布人可以更新任务");
}
// 允许更新被驳回的任务(approvalStatus包含rejected或status为draft)
boolean isRejected = (existTask.getApprovalStatus() != null &&
(existTask.getApprovalStatus().contains("rejected") ||
"draft".equals(existTask.getApprovalStatus()))) ||
"draft".equals(existTask.getStatus());
task.setId(id);
// 如果是被驳回的任务,更新后重置审核状态为draft,以便重新提交审核
if (isRejected) {
task.setApprovalStatus("draft");
task.setStatus("draft");
task.setRejectReason(null); // 清空驳回原因
}
taskMapper.updateById(task);
log.info("任务更新成功: taskId={}, userId={}, isRejected={}", id, userId, isRejected);
}
/**

View File

@ -2984,10 +2984,35 @@ const loadTasks = async () => {
return
}
// 只加载子任务(可接单的任务都是子任务)
const itemResponse = await taskApi.getAvailableTaskItems(params)
// 同时加载普通任务和子任务(流水线任务)
const [taskResponse, itemResponse] = await Promise.all([
taskApi.getTaskHall(params),
taskApi.getAvailableTaskItems(params)
])
if (itemResponse.code === 200) {
// 处理普通任务(非流水线任务)
if (taskResponse.code === 200 && taskResponse.data && taskResponse.data.records) {
const tasks = taskResponse.data.records.map((task: any) => ({
...task,
id: task.id,
taskNo: task.taskNo,
title: task.title,
isSubTask: false, // 普通任务标记为非子任务
taskId: task.id,
taskTypeId: task.taskTypeId,
taskTypeName: task.taskTypeName,
taskSubType: task.taskSubType,
score: task.score,
estimatedHours: task.estimatedHours,
quantity: task.quantity || 1,
previewImage: task.previewImage,
description: task.remark || task.description
}))
allTasks = [...allTasks, ...tasks]
}
// 处理子任务(流水线任务)
if (itemResponse.code === 200 && itemResponse.data && itemResponse.data.records) {
const items = (itemResponse.data.records || []).map((item: any) => ({
...item,
id: item.id,
@ -2995,7 +3020,7 @@ const loadTasks = async () => {
itemNo: item.itemNo,
title: item.mainTaskTitle || item.taskTitle || item.title,
subTaskNo: item.itemNo,
isSubTask: true,
isSubTask: true, // 子任务标记
taskId: item.taskId,
groupNo: item.groupNo,
taskTypeId: item.taskTypeId,
@ -3008,10 +3033,12 @@ const loadTasks = async () => {
prevDownloadUrl: item.prevDownloadUrl,
description: item.description || item.taskDescription
}))
allTasks = items
totalCount = itemResponse.data.total || 0
allTasks = [...allTasks, ...items]
}
// 计算总数(普通任务 + 子任务)
totalCount = (taskResponse.data?.total || 0) + (itemResponse.data?.total || 0)
// 按创建时间排序
allTasks.sort((a, b) => {
const timeA = new Date(a.createTime || 0).getTime()
@ -3019,7 +3046,10 @@ const loadTasks = async () => {
return timeB - timeA // 降序
})
taskList.value = allTasks
// 前端分页(因为合并了两个接口的结果,需要在前端分页)
const start = (pagination.page - 1) * pagination.pageSize
const end = start + pagination.pageSize
taskList.value = allTasks.slice(start, end)
total.value = totalCount
} catch (error) {