From d5364ed8146a600912617d4761c1eec551c954e9 Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 7 Jan 2026 11:19:47 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=8E=A5=E5=8D=95=E9=83=A8=E9=97=A8=20-=20?= =?UTF-8?q?=E5=BD=93=E4=BB=BB=E5=8A=A1=E7=B1=BB=E5=9E=8B=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E5=A4=9A=E4=B8=AA=E9=83=A8=E9=97=A8=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/designhub/dto/PipelineTaskDTO.java | 5 ++ .../com/designhub/service/TaskService.java | 40 +++++++----- frontend/src/views/CreateTask.vue | 65 +++++++++++++++++-- 3 files changed, 89 insertions(+), 21 deletions(-) diff --git a/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java b/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java index d482b69..e1f5002 100644 --- a/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java +++ b/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java @@ -81,5 +81,10 @@ public class PipelineTaskDTO { * 指定接收人ID */ private Long receiverId; + + /** + * 用户选择的接单部门ID(当任务类型配置多个部门时使用) + */ + private Long selectedDeptId; } } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index d55d5d1..2fbfa49 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -350,34 +350,42 @@ public class TaskService { // **步骤1:按接单部门自动分组** // 遍历任务类型列表,根据接单部门分组 int currentGroupNo = 1; - String lastAllowedDeptIds = null; + String lastDeptKey = null; for (int i = 0; i < dto.getItems().size(); i++) { com.designhub.dto.PipelineTaskDTO.TaskItemDTO itemDto = dto.getItems().get(i); var demandType = configService.getDemandTypeById(itemDto.getTaskTypeId()); - // 获取当前任务类型的接单部门配置(支持三级分类继承二级分类的配置) - String currentAllowedDeptIds = demandType.getAllowedDeptIds(); - if (currentAllowedDeptIds == null && demandType.getParentId() != null) { - // 如果当前类型没有配置,尝试获取父级的配置 - var parentType = configService.getDemandTypeById(demandType.getParentId()); - if (parentType != null) { - currentAllowedDeptIds = parentType.getAllowedDeptIds(); - log.info("三级分类 {} 继承父级 {} 的接单部门配置: {}", - demandType.getName(), parentType.getName(), currentAllowedDeptIds); + // 获取当前任务类型的接单部门配置 + String currentDeptKey; + + // 🔥 优先使用用户选择的接单部门 + if (itemDto.getSelectedDeptId() != null) { + currentDeptKey = String.valueOf(itemDto.getSelectedDeptId()); + log.info("任务类型 {} 使用用户选择的接单部门: {}", demandType.getName(), currentDeptKey); + } else { + // 否则使用任务类型配置的 allowedDeptIds(支持三级分类继承二级分类的配置) + currentDeptKey = demandType.getAllowedDeptIds(); + if (currentDeptKey == null && demandType.getParentId() != null) { + // 如果当前类型没有配置,尝试获取父级的配置 + var parentType = configService.getDemandTypeById(demandType.getParentId()); + if (parentType != null) { + currentDeptKey = parentType.getAllowedDeptIds(); + log.info("三级分类 {} 继承父级 {} 的接单部门配置: {}", + demandType.getName(), parentType.getName(), currentDeptKey); + } } } // 判断是否需要创建新分组 boolean needNewGroup = false; if (i > 0) { - // 如果当前或上一个的 allowed_dept_ids 为 null,则必须分组 - // 因为 null 表示所有部门可接单,无法确定具体接单部门 - if (currentAllowedDeptIds == null || lastAllowedDeptIds == null) { + // 如果当前或上一个的部门配置为 null,则必须分组 + if (currentDeptKey == null || lastDeptKey == null) { needNewGroup = true; } // 如果两者都不为 null,则比较是否相同 - else if (!currentAllowedDeptIds.equals(lastAllowedDeptIds)) { + else if (!currentDeptKey.equals(lastDeptKey)) { needNewGroup = true; } } @@ -385,12 +393,12 @@ public class TaskService { if (needNewGroup) { currentGroupNo++; log.info("检测到接单部门变化,创建新分组: groupNo={}, 前一部门={}, 当前部门={}", - currentGroupNo, lastAllowedDeptIds, currentAllowedDeptIds); + currentGroupNo, lastDeptKey, currentDeptKey); } // 记录当前分组号(临时存储在sortOrder字段,稍后会恢复) itemDto.setSortOrder(currentGroupNo * 1000 + i); // 高位存group_no,低位存原始顺序 - lastAllowedDeptIds = currentAllowedDeptIds; + lastDeptKey = currentDeptKey; } log.info("分组完成,共 {} 个子任务组", currentGroupNo); diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index 0c6d89c..0131291 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -106,6 +106,25 @@ /> + +
+ + + {{ dept.deptName }} + + +
+
{ taskTypeId: undefined, taskTypePath: undefined, quantity: 1, - receiverId: undefined + receiverId: undefined, + selectedDeptId: undefined }) } @@ -1073,8 +1094,17 @@ const pipelineGroups = computed(() => { if (!typeInfo) continue // 获取接单部门配置(三级分类从二级父类继承) - const deptIds = getTypeAllowedDeptIds(typeInfo) - const deptName = getDeptNameFromIds(deptIds) + let deptIds = getTypeAllowedDeptIds(typeInfo) + let deptName = '' + + // 如果用户选择了具体部门,使用用户选择的部门 + if (taskType.selectedDeptId) { + deptIds = String(taskType.selectedDeptId) + const selectedDept = departmentList.value.find(d => d.id === taskType.selectedDeptId) + deptName = selectedDept?.deptName || '未知部门' + } else { + deptName = getDeptNameFromIds(deptIds) + } // 判断是否需要创建新分组 if (!currentGroup || currentGroup.deptIds !== deptIds) { @@ -1117,6 +1147,26 @@ const pipelineGroups = computed(() => { return groups }) +// 获取任务类型可选的部门列表 +const getTaskTypeDeptOptions = (item: TaskTypeItem): Array<{ id: number, deptName: string }> => { + if (!item.taskTypeId) return [] + + const typeInfo = getTaskTypeInfo(item.taskTypeId) + if (!typeInfo) return [] + + const deptIds = getTypeAllowedDeptIds(typeInfo) + if (!deptIds) return [] + + const ids = deptIds.split(',').map(id => parseInt(id.trim())).filter(id => !isNaN(id)) + if (ids.length <= 1) return [] // 只有一个部门时不需要选择 + + // 返回部门列表 + return ids.map(id => { + const dept = departmentList.value.find(d => d.id === id) + return dept ? { id: dept.id!, deptName: dept.deptName } : null + }).filter(d => d !== null) as Array<{ id: number, deptName: string }> +} + // 根据部门ID获取部门名称 const getDeptNameFromIds = (deptIds: string): string => { if (!deptIds) return '所有部门' @@ -1304,7 +1354,8 @@ const handleSubmit = async () => { taskTypeId: item.taskTypeId!, quantity: item.quantity, sortOrder: index + 1, - receiverId: formData.releaseType === 'assigned' ? item.receiverId : undefined + receiverId: formData.releaseType === 'assigned' ? item.receiverId : undefined, + selectedDeptId: item.selectedDeptId // 用户选择的接单部门 })), brandId: formData.brandId, platformId: formData.platformId, @@ -2057,6 +2108,10 @@ onUnmounted(() => { min-width: 150px; max-width: 200px; } + + .task-type-dept { + flex-shrink: 0; + } .task-type-actions { min-width: 90px;