diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index 98a5e59..1fc05fd 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -1256,6 +1256,23 @@ public class UserService { } } + // 获取最早预计完成时间(查询该设计师进行中任务的最早deadline) + if (taskMapper != null && inProgressCount > 0) { + // 查询普通任务的最早deadline + LambdaQueryWrapper taskQuery = new LambdaQueryWrapper<>(); + taskQuery.eq(com.designhub.entity.Task::getReceiverId, user.getId()) + .eq(com.designhub.entity.Task::getStatus, "in_progress") + .eq(com.designhub.entity.Task::getDeleted, 0) + .isNotNull(com.designhub.entity.Task::getDeadline) + .orderByAsc(com.designhub.entity.Task::getDeadline) + .last("LIMIT 1"); + + com.designhub.entity.Task earliestTask = taskMapper.selectOne(taskQuery); + if (earliestTask != null && earliestTask.getDeadline() != null) { + designerInfo.put("earliestDeadline", earliestTask.getDeadline()); + } + } + result.add(designerInfo); } diff --git a/frontend/src/api/user.ts b/frontend/src/api/user.ts index 0fd4334..da60e78 100644 --- a/frontend/src/api/user.ts +++ b/frontend/src/api/user.ts @@ -150,6 +150,7 @@ export interface DesignerWithWorkload { deptId?: number; deptName?: string; inProgressCount: number; // 进行中的任务数量 + earliestDeadline?: string; // 最早预计完成时间 } /** diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index dd2b550..b57b4d2 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -2753,33 +2753,67 @@ const showAssignDesignerModal = async (task: Task) => { color: '#262626' } }, '选择设计师'), - h(RadioGroup, { + h(Select, { value: selectedDesignerId, - onChange: (e: any) => { - selectedDesignerId = e.target.value + placeholder: '请选择要指派的设计师', + style: { width: '100%' }, + size: 'large', + onChange: (val: number) => { + selectedDesignerId = val }, - style: { width: '100%' } - }, designers.map(designer => - h(Radio, { - value: designer.id, - style: { - display: 'flex', - alignItems: 'center', - marginBottom: '10px', - padding: '12px', - border: '1px solid #e8e8e8', - borderRadius: '6px', - background: selectedDesignerId === designer.id ? '#e6f7ff' : 'white', - transition: 'all 0.3s' - } - }, [ - h('span', { style: { flex: 1, fontSize: '14px', fontWeight: 500 } }, designer.realName), - h(Tag, { - color: designer.inProgressCount > 5 ? 'error' : - designer.inProgressCount > 3 ? 'warning' : 'success' - }, `进行中: ${designer.inProgressCount}`) - ]) - )) + options: designers.map(designer => { + const formatDeadline = (deadline: string) => { + if (!deadline) return '' + try { + const date = new Date(deadline) + const now = new Date() + const diff = date.getTime() - now.getTime() + const days = Math.floor(diff / (1000 * 60 * 60 * 24)) + const hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)) + + if (diff < 0) return '已逾期' + if (days === 0) return `${hours}小时后` + return `${days}天${hours}小时后` + } catch { + return '' + } + } + + const workloadColor = designer.inProgressCount > 5 ? '#ff4d4f' : + designer.inProgressCount > 3 ? '#faad14' : '#52c41a' + const workloadText = designer.inProgressCount === 0 ? '空闲' : + `进行中: ${designer.inProgressCount}个` + const deadlineText = designer.earliestDeadline ? + ` | 最早完成: ${formatDeadline(designer.earliestDeadline)}` : '' + + return { + value: designer.id, + label: h('div', { + style: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + padding: '4px 0' + } + }, [ + h('span', { + style: { + fontSize: '14px', + fontWeight: 500, + flex: 1 + } + }, designer.realName), + h('span', { + style: { + fontSize: '12px', + color: workloadColor, + marginLeft: '12px' + } + }, `${workloadText}${deadlineText}`) + ]) + } + }) + }) ]) ])