fix: 修复指定任务模式下被指定的设计师无法抢单的问题
This commit is contained in:
parent
09e830a45e
commit
9163424020
@ -331,6 +331,22 @@ public interface TaskItemMapper extends BaseMapper<TaskItem> {
|
|||||||
@Param("receiverDeptId") Long receiverDeptId,
|
@Param("receiverDeptId") Long receiverDeptId,
|
||||||
@Param("deadline") LocalDateTime deadline);
|
@Param("deadline") LocalDateTime deadline);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 指定任务接单(用于已预先指定设计师的任务)
|
||||||
|
* 只有被指定的设计师才能接单
|
||||||
|
*/
|
||||||
|
@Update("UPDATE task_item SET " +
|
||||||
|
"status = 'in_progress', " +
|
||||||
|
"deadline = CASE WHEN #{deadline} IS NOT NULL THEN #{deadline} ELSE deadline END, " +
|
||||||
|
"update_time = NOW() " +
|
||||||
|
"WHERE id = #{itemId} " +
|
||||||
|
"AND status = 'pending' " +
|
||||||
|
"AND is_locked = 0 " +
|
||||||
|
"AND receiver_id = #{receiverId}")
|
||||||
|
int grabAssignedItem(@Param("itemId") Long itemId,
|
||||||
|
@Param("receiverId") Long receiverId,
|
||||||
|
@Param("deadline") LocalDateTime deadline);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 解锁子任务
|
* 解锁子任务
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -358,8 +358,25 @@ public class TaskItemService {
|
|||||||
throw new BusinessException(ResultCode.TASK_STATUS_ERROR, "该子任务已被锁定,请等待前序任务完成");
|
throw new BusinessException(ResultCode.TASK_STATUS_ERROR, "该子任务已被锁定,请等待前序任务完成");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 🔥 检查是否是指定任务:如果子任务已预先指定了接收人
|
||||||
|
boolean isAssignedItem = false;
|
||||||
if (item.getReceiverId() != null) {
|
if (item.getReceiverId() != null) {
|
||||||
throw new BusinessException(ResultCode.TASK_ALREADY_TAKEN, "该子任务已被接单");
|
// 检查主任务是否是指定模式
|
||||||
|
Task mainTaskForCheck = taskMapper.selectById(item.getTaskId());
|
||||||
|
boolean isAssignedMode = mainTaskForCheck != null && "assigned".equals(mainTaskForCheck.getReleaseType());
|
||||||
|
|
||||||
|
if (isAssignedMode) {
|
||||||
|
// 指定任务模式:只有被指定的设计师才能接单
|
||||||
|
if (!item.getReceiverId().equals(userId)) {
|
||||||
|
throw new BusinessException(ResultCode.FORBIDDEN, "该子任务已指定给其他设计师");
|
||||||
|
}
|
||||||
|
// 被指定的设计师可以接单,继续执行
|
||||||
|
isAssignedItem = true;
|
||||||
|
log.info("指定任务模式:设计师 {} 是被指定的接收人,允许接单", userId);
|
||||||
|
} else {
|
||||||
|
// 非指定任务模式:已有接收人则不能再接单
|
||||||
|
throw new BusinessException(ResultCode.TASK_ALREADY_TAKEN, "该子任务已被接单");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算deadline
|
// 计算deadline
|
||||||
@ -371,13 +388,21 @@ public class TaskItemService {
|
|||||||
now, item.getEstimatedHours(), deadline);
|
now, item.getEstimatedHours(), deadline);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 乐观锁抢单(同时设置接单部门ID和deadline)
|
// 🔥 根据是否是指定任务使用不同的抢单方法
|
||||||
int result = taskItemMapper.grabItem(itemId, userId, user.getRealName(), user.getDeptId(), deadline);
|
int result;
|
||||||
|
if (isAssignedItem) {
|
||||||
|
// 指定任务:使用专用方法,只更新状态和deadline
|
||||||
|
result = taskItemMapper.grabAssignedItem(itemId, userId, deadline);
|
||||||
|
} else {
|
||||||
|
// 普通任务:乐观锁抢单(同时设置接单部门ID和deadline)
|
||||||
|
result = taskItemMapper.grabItem(itemId, userId, user.getRealName(), user.getDeptId(), deadline);
|
||||||
|
}
|
||||||
|
|
||||||
if (result == 0) {
|
if (result == 0) {
|
||||||
throw new BusinessException(ResultCode.TASK_ALREADY_TAKEN, "抢单失败,该子任务可能已被他人接单");
|
throw new BusinessException(ResultCode.TASK_ALREADY_TAKEN, "抢单失败,该子任务可能已被他人接单");
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info("设计师 {} 成功抢单子任务 {}", userId, itemId);
|
log.info("设计师 {} 成功抢单子任务 {} (指定任务: {})", userId, itemId, isAssignedItem);
|
||||||
|
|
||||||
// 更新主任务状态
|
// 更新主任务状态
|
||||||
Task mainTask = taskMapper.selectById(item.getTaskId());
|
Task mainTask = taskMapper.selectById(item.getTaskId());
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user