From d5c62318a8d52ed2d9d767c674760d9943188cee Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 30 Mar 2026 19:25:43 +0800 Subject: [PATCH] fix: repair stale publisher dept resolution --- .../designhub/service/TaskItemService.java | 10 ++ .../com/designhub/service/TaskService.java | 149 ++++++++++++++++-- 2 files changed, 142 insertions(+), 17 deletions(-) diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index c850d04..de65dbb 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -2074,6 +2074,16 @@ public class TaskItemService { return null; } + if (brandId != null) { + Long brandDeptId = deptBrandRelationMapper.getDeptIdByBrandId(brandId); + if (brandDeptId != null) { + com.designhub.entity.Department brandDepartment = departmentMapper.selectById(brandDeptId); + if (isActiveDemandDepartment(brandDepartment)) { + return brandDepartment; + } + } + } + List userDepartments = userDepartmentMapper.selectList( new LambdaQueryWrapper() .eq(com.designhub.entity.UserDepartment::getUserId, userId) diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 48fc146..5aca1ff 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -1733,6 +1733,18 @@ public class TaskService { * 填充任务关联信息(品牌、类目、平台、发布人等) */ private void fillTaskRelatedInfo(Task task) { + Department effectivePublisherDept = resolveDisplayPublisherDept(task); + if (effectivePublisherDept != null) { + task.setPublisherDeptId(effectivePublisherDept.getId()); + task.setPublisherDeptName(effectivePublisherDept.getDeptName()); + } + + Department effectivePrimaryPublisherDept = resolveDisplayPrimaryPublisherDept(task); + if (effectivePrimaryPublisherDept != null) { + task.setPrimaryPublisherDeptId(effectivePrimaryPublisherDept.getId()); + task.setPrimaryPublisherDeptName(effectivePrimaryPublisherDept.getDeptName()); + } + // 填充品牌名称 if (task.getBrandId() != null) { Brand brand = brandMapper.selectById(task.getBrandId()); @@ -1765,14 +1777,6 @@ public class TaskService { } } - // 填充发布人部门名称 - if (task.getPublisherDeptId() != null) { - Department dept = departmentService.getDepartmentById(task.getPublisherDeptId()); - if (dept != null) { - task.setPublisherDeptName(dept.getDeptName()); - } - } - // 填充接收人名称 if (task.getReceiverId() != null) { User receiver = userService.getUserById(task.getReceiverId()); @@ -1797,14 +1801,6 @@ public class TaskService { } } - // 填充一级需求发起人部门名称 - if (task.getPrimaryPublisherDeptId() != null) { - Department primaryDept = departmentService.getDepartmentById(task.getPrimaryPublisherDeptId()); - if (primaryDept != null) { - task.setPrimaryPublisherDeptName(primaryDept.getDeptName()); - } - } - // 填充明细完善人名称(需求部门成员) if (task.getDetailCompleterId() != null) { User detailCompleter = userService.getUserById(task.getDetailCompleterId()); @@ -1849,6 +1845,10 @@ public class TaskService { if (!canUpdate) { throw new BusinessException(ResultCode.PARAM_ERROR, "任务已在进行中或已完成,无法编辑"); } + + User editor = userService.getUserById(userId); + Department publisherDept = resolvePublisherDeptForTaskUpdate(existTask, task.getPublisherDeptId(), editor, isAdmin); + task.setPublisherDeptId(publisherDept.getId()); task.setId(id); @@ -1975,7 +1975,8 @@ public class TaskService { // 检查部门积分是否充足(管理员跳过积分检查,一级需求部门无明细提交场景跳过) User user = userService.getUserById(userId); - Department publisherDept = resolvePublishingDepartment(user, existTask.getPublisherDeptId(), isAdmin); + Department publisherDept = resolvePublisherDeptForTaskUpdate(existTask, dto.getPublisherDeptId(), user, isAdmin); + existTask.setPublisherDeptId(publisherDept.getId()); if (!isAdmin && !allowPrimaryTaskWithoutItems && publisherDept.getId() != null) { if (!teamScorePoolService.checkBalance(publisherDept.getId(), totalScoreInt)) { throw new BusinessException(ResultCode.INSUFFICIENT_SCORE, "部门积分余额不足"); @@ -2095,6 +2096,120 @@ public class TaskService { log.info("流水线任务更新成功: taskId={}, userId={}", id, userId); } + + private Department resolvePublisherDeptForTaskUpdate(Task existTask, Long requestedDeptId, User editor, boolean isAdmin) { + if (editor != null && requestedDeptId != null) { + return resolvePublishingDepartment(editor, requestedDeptId, isAdmin); + } + + if (editor != null && (isAdmin || editor.getId().equals(existTask.getPublisherId()))) { + try { + return resolvePublishingDepartment(editor, existTask.getPublisherDeptId(), isAdmin); + } catch (BusinessException ex) { + log.info("任务 {} 原发起部门已失效,尝试按任务信息自动修复: {}", existTask.getId(), ex.getMessage()); + } + } + + Department fallbackDept = resolveDisplayPublisherDept(existTask); + if (fallbackDept != null) { + return fallbackDept; + } + + throw new BusinessException(ResultCode.PARAM_ERROR, "任务发起部门已失效,请联系管理员处理后再提交"); + } + + private Department resolveDisplayPublisherDept(Task task) { + if (task == null) { + return null; + } + + Department storedDept = departmentService.getDepartmentById(task.getPublisherDeptId()); + if (isUsablePublishingDepartment(storedDept)) { + return storedDept; + } + + Department brandDept = resolveBrandMappedPublishingDept(task.getBrandId()); + if (brandDept != null) { + return brandDept; + } + + return resolveUserPublishingDepartment(task.getPublisherId(), task.getPublisherDeptId()); + } + + private Department resolveDisplayPrimaryPublisherDept(Task task) { + if (task == null || task.getPrimaryPublisherDeptId() == null) { + return null; + } + + Department storedDept = departmentService.getDepartmentById(task.getPrimaryPublisherDeptId()); + if (isUsablePublishingDepartment(storedDept)) { + return storedDept; + } + + return resolveUserPublishingDepartment(task.getPrimaryPublisherId(), task.getPrimaryPublisherDeptId()); + } + + private Department resolveBrandMappedPublishingDept(Long brandId) { + if (brandId == null) { + return null; + } + + Department brandDept = departmentService.getDemandDeptByBrandId(brandId); + return isUsablePublishingDepartment(brandDept) ? brandDept : null; + } + + private Department resolveUserPublishingDepartment(Long userId, Long preferredDeptId) { + if (userId == null) { + return null; + } + + List validDepartments = userService.getUserDepartments(userId).stream() + .filter(java.util.Objects::nonNull) + .filter(this::isUsablePublishingDepartment) + .collect(Collectors.collectingAndThen( + Collectors.toMap(Department::getId, dept -> dept, (left, right) -> left, java.util.LinkedHashMap::new), + map -> map.values().stream().toList() + )); + + if (validDepartments.isEmpty()) { + return null; + } + + if (preferredDeptId != null) { + for (Department department : validDepartments) { + if (preferredDeptId.equals(department.getId())) { + return department; + } + } + } + + User user = userService.getUserById(userId); + if (user != null && user.getDeptId() != null) { + for (Department department : validDepartments) { + if (user.getDeptId().equals(department.getId())) { + return department; + } + } + } + + return validDepartments.get(0); + } + + private boolean isUsablePublishingDepartment(Department department) { + if (department == null || department.getId() == null) { + return false; + } + if (!"demand".equals(department.getDeptType()) && !"primary_demand".equals(department.getDeptType())) { + return false; + } + if (department.getStatus() == null || department.getStatus() != 1) { + return false; + } + if (department.getDeleted() != null && department.getDeleted() == 1) { + return false; + } + return departmentService.isDepartmentActiveWithAncestors(department.getId()); + } /** * 为更新操作创建流水线子任务(复用createPipelineTask的子任务创建逻辑)