fix: 修复被驳回任务无法重新编辑的问题,添加权限验证
This commit is contained in:
parent
ed4965f2b9
commit
2f0ec3d622
@ -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("更新成功");
|
||||
}
|
||||
|
||||
|
||||
@ -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=')'>" +
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user