diff --git a/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java b/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java index 5e51e87..d482b69 100644 --- a/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java +++ b/backend/src/main/java/com/designhub/dto/PipelineTaskDTO.java @@ -45,6 +45,7 @@ public class PipelineTaskDTO { private String releaseType; // 发布类型:default/recruitment/assigned private Long receiverId; // 指定接收人ID(assigned模式使用) private List productBarcodes; // 商品条码列表(已验证库存) + private String previewImage; // 预览图URL /** * 子任务项DTO diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index 6bd5bae..39e8d4b 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -629,7 +629,7 @@ public class TaskApprovalService { } /** - * 确定接单部门负责人 + * 确定接单部门负责人(支持三级分类继承二级分类的配置) */ private Long determineReceivingLeader(Task task) { // 根据任务类型的allowedDeptIds确定接单部门 @@ -644,13 +644,25 @@ public class TaskApprovalService { try { Long typeId = Long.parseLong(typeIdStr.trim()); DemandType demandType = configService.getDemandTypeById(typeId); - if (demandType != null && demandType.getAllowedDeptIds() != null) { - String[] deptIds = demandType.getAllowedDeptIds().split(","); - if (deptIds.length > 0) { - Long deptId = Long.parseLong(deptIds[0].trim()); - Department dept = departmentMapper.selectById(deptId); - if (dept != null && dept.getLeaderId() != null) { - return dept.getLeaderId(); + if (demandType != null) { + // 获取允许的部门ID(支持继承) + String allowedDeptIds = demandType.getAllowedDeptIds(); + if ((allowedDeptIds == null || allowedDeptIds.isEmpty()) && demandType.getParentId() != null) { + // 三级分类没有配置,尝试获取父级(二级分类)的配置 + DemandType parentType = configService.getDemandTypeById(demandType.getParentId()); + if (parentType != null) { + allowedDeptIds = parentType.getAllowedDeptIds(); + } + } + + if (allowedDeptIds != null && !allowedDeptIds.isEmpty()) { + String[] deptIds = allowedDeptIds.split(","); + if (deptIds.length > 0) { + Long deptId = Long.parseLong(deptIds[0].trim()); + Department dept = departmentMapper.selectById(deptId); + if (dept != null && dept.getLeaderId() != null) { + return dept.getLeaderId(); + } } } } diff --git a/backend/src/main/java/com/designhub/service/TaskItemService.java b/backend/src/main/java/com/designhub/service/TaskItemService.java index d0eb888..3531806 100644 --- a/backend/src/main/java/com/designhub/service/TaskItemService.java +++ b/backend/src/main/java/com/designhub/service/TaskItemService.java @@ -142,21 +142,33 @@ public class TaskItemService { throw new BusinessException(ResultCode.FORBIDDEN, "部门负责人不能接单,请分配给设计师"); } - // 检查4:验证部门是否允许接该任务类型 + // 检查4:验证部门是否允许接该任务类型(支持三级分类继承二级分类的配置) if (item.getTaskTypeId() != null) { com.designhub.entity.DemandType demandType = configService.getDemandTypeById(item.getTaskTypeId()); - if (demandType != null && demandType.getAllowedDeptIds() != null && !demandType.getAllowedDeptIds().isEmpty()) { - // 检查用户部门是否在允许列表中 - String[] allowedIds = demandType.getAllowedDeptIds().split(","); - boolean isAllowed = false; - for (String allowedId : allowedIds) { - if (allowedId.trim().equals(String.valueOf(user.getDeptId()))) { - isAllowed = true; - break; + if (demandType != null) { + // 获取允许的部门ID(支持继承) + String allowedDeptIds = demandType.getAllowedDeptIds(); + if ((allowedDeptIds == null || allowedDeptIds.isEmpty()) && demandType.getParentId() != null) { + // 三级分类没有配置,尝试获取父级(二级分类)的配置 + var parentType = configService.getDemandTypeById(demandType.getParentId()); + if (parentType != null) { + allowedDeptIds = parentType.getAllowedDeptIds(); } } - if (!isAllowed) { - throw new BusinessException(ResultCode.FORBIDDEN, "您的部门无权接收此类型的任务"); + + if (allowedDeptIds != null && !allowedDeptIds.isEmpty()) { + // 检查用户部门是否在允许列表中 + String[] allowedIds = allowedDeptIds.split(","); + boolean isAllowed = false; + for (String allowedId : allowedIds) { + if (allowedId.trim().equals(String.valueOf(user.getDeptId()))) { + isAllowed = true; + break; + } + } + if (!isAllowed) { + throw new BusinessException(ResultCode.FORBIDDEN, "您的部门无权接收此类型的任务"); + } } } } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index de5c4a3..c3c4c76 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -28,6 +28,7 @@ import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.Random; import java.util.Set; import java.util.stream.Collectors; @@ -295,6 +296,7 @@ public class TaskService { task.setSpuInfo(dto.getSpuInfo()); task.setTaskSubType(dto.getTaskSubType()); task.setAttachmentUrl(dto.getAttachmentUrl()); + task.setPreviewImage(dto.getPreviewImage()); task.setRemark(dto.getRemark()); task.setPriority(dto.getPriority() != null ? dto.getPriority() : 1); // 默认优先级:1-普通 @@ -354,8 +356,17 @@ public class TaskService { 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.getTypeName(), parentType.getTypeName(), currentAllowedDeptIds); + } + } // 判断是否需要创建新分组 boolean needNewGroup = false; @@ -651,12 +662,26 @@ public class TaskService { String timeRange, String sortBy, Long userDeptId) { Page pageParam = new Page<>(page, pageSize); - // 获取当前用户部门可以接单的任务类型ID列表 + // 获取当前用户部门可以接单的任务类型ID列表(支持三级分类继承二级分类的配置) List allowedTaskTypeIds = null; if (userDeptId != null) { - allowedTaskTypeIds = demandTypeMapper.selectList(null).stream() + List allDemandTypes = demandTypeMapper.selectList(null); + // 构建ID到DemandType的映射,用于快速查找父级 + Map demandTypeMap = allDemandTypes.stream() + .collect(Collectors.toMap(DemandType::getId, dt -> dt)); + + allowedTaskTypeIds = allDemandTypes.stream() .filter(dt -> { + // 获取允许的部门ID(支持继承) String allowedDepts = dt.getAllowedDeptIds(); + if ((allowedDepts == null || allowedDepts.isEmpty()) && dt.getParentId() != null) { + // 三级分类没有配置,尝试获取父级(二级分类)的配置 + DemandType parentType = demandTypeMap.get(dt.getParentId()); + if (parentType != null) { + allowedDepts = parentType.getAllowedDeptIds(); + } + } + // 如果allowedDeptIds为空,表示所有部门都可接单 if (allowedDepts == null || allowedDepts.isEmpty()) { return true;