diff --git a/backend/src/main/java/com/designhub/entity/TaskItem.java b/backend/src/main/java/com/designhub/entity/TaskItem.java index 1689ca6..ec1365c 100644 --- a/backend/src/main/java/com/designhub/entity/TaskItem.java +++ b/backend/src/main/java/com/designhub/entity/TaskItem.java @@ -76,6 +76,11 @@ public class TaskItem implements Serializable { */ private String receiverName; + /** + * 接单部门ID + */ + private Long receiverDeptId; + /** * 状态:locked/pending/in_progress/completed/rejected */ diff --git a/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java b/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java index 37693b4..0470441 100644 --- a/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java +++ b/backend/src/main/java/com/designhub/mapper/TaskItemMapper.java @@ -163,6 +163,7 @@ public interface TaskItemMapper extends BaseMapper { @Update("UPDATE task_item SET " + "receiver_id = #{receiverId}, " + "receiver_name = #{receiverName}, " + + "receiver_dept_id = #{receiverDeptId}, " + "status = 'in_progress', " + "update_time = NOW() " + "WHERE id = #{itemId} " + @@ -171,7 +172,8 @@ public interface TaskItemMapper extends BaseMapper { "AND receiver_id IS NULL") int grabItem(@Param("itemId") Long itemId, @Param("receiverId") Long receiverId, - @Param("receiverName") String receiverName); + @Param("receiverName") String receiverName, + @Param("receiverDeptId") Long receiverDeptId); /** * 解锁子任务 diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index b02f2b5..59094a1 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -209,8 +209,8 @@ public class TaskItemService { throw new BusinessException(ResultCode.TASK_ALREADY_TAKEN, "该子任务已被接单"); } - // 乐观锁抢单 - int result = taskItemMapper.grabItem(itemId, userId, user.getRealName()); + // 乐观锁抢单(同时设置接单部门ID) + int result = taskItemMapper.grabItem(itemId, userId, user.getRealName(), user.getDeptId()); if (result == 0) { throw new BusinessException(ResultCode.TASK_ALREADY_TAKEN, "抢单失败,该子任务可能已被他人接单"); } @@ -619,6 +619,7 @@ public class TaskItemService { for (TaskItem item : groupItems) { item.setStatus("in_progress"); item.setReceiverId(assignedReceiverId); + item.setReceiverDeptId(receiver.getDeptId()); // 设置接单部门ID item.setUpdateTime(LocalDateTime.now()); taskItemMapper.updateById(item); } diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index b4054b6..3cc5361 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -1968,18 +1968,26 @@ 编辑任务类型
-
-
- {{ getTaskTypeName(item.typeId) }} +
+
+
+ {{ getTaskTypeFullPath(item.typeId)?.name || getTaskTypeName(item.typeId) }} + {{ getTaskTypeFullPath(item.typeId)?.fullPath || '' }} +
-
- 数量 - +
+
+ {{ getTaskTypeUnitScore(item.typeId) }} 分/个 +
+
+ 数量 + +
添加 @@ -2492,6 +2500,25 @@ const findTaskTypeById = (id: number, items: any[] = hierarchicalTaskTypes.value return null } +// 获取任务类型的完整路径信息(包含父级名称和积分) +const getTaskTypeFullPath = (id: number, items: any[] = hierarchicalTaskTypes.value, path: string[] = []): { name: string, fullPath: string, unitScore: number } | null => { + for (const item of items) { + const currentPath = [...path, item.name] + if (item.id === id) { + return { + name: item.name, + fullPath: currentPath.join(' > '), + unitScore: item.unitScore || 0 + } + } + if (item.children) { + const found = getTaskTypeFullPath(id, item.children, currentPath) + if (found) return found + } + } + return null +} + // 构建级联选择器选项 const taskTypeCascaderOptions = computed(() => { const buildOptions = (items: any[]): any[] => { @@ -5838,5 +5865,79 @@ onUnmounted(() => { :deep(.approve-modal) .ant-btn-text.ant-btn-danger:hover { background-color: rgba(255, 77, 79, 0.1); } + +/* 级联选择器深色主题 - 组件内部 */ +:deep(.approve-modal) .ant-cascader { + .ant-select-selector { + background-color: #141414 !important; + border-color: #303030 !important; + color: #fff !important; + } + + &:hover .ant-select-selector { + border-color: #31f08b !important; + } + + .ant-select-selection-placeholder { + color: #666 !important; + } + + .ant-select-selection-item { + color: #fff !important; + } +} + + + +