fix: 后端全面支持三级分类继承二级分类的接单部门配置

- TaskService: 创建任务分组时支持继承
- TaskService: 获取可接单任务列表时支持继承
- TaskItemService: 接单权限验证时支持继承
- TaskApprovalService: 确定接单部门负责人时支持继承
- PipelineTaskDTO: 添加预览图字段
This commit is contained in:
Your Name 2026-01-06 22:40:35 +08:00
parent 373d1c1ed4
commit 73fd5a9b08
4 changed files with 72 additions and 22 deletions

View File

@ -45,6 +45,7 @@ public class PipelineTaskDTO {
private String releaseType; // 发布类型:default/recruitment/assigned
private Long receiverId; // 指定接收人ID(assigned模式使用)
private List<String> productBarcodes; // 商品条码列表(已验证库存)
private String previewImage; // 预览图URL
/**
* 子任务项DTO

View File

@ -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();
}
}
}
}

View File

@ -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, "您的部门无权接收此类型的任务");
}
}
}
}

View File

@ -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<Task> pageParam = new Page<>(page, pageSize);
// 获取当前用户部门可以接单的任务类型ID列表
// 获取当前用户部门可以接单的任务类型ID列表(支持三级分类继承二级分类的配置)
List<Long> allowedTaskTypeIds = null;
if (userDeptId != null) {
allowedTaskTypeIds = demandTypeMapper.selectList(null).stream()
List<DemandType> allDemandTypes = demandTypeMapper.selectList(null);
// 构建ID到DemandType的映射,用于快速查找父级
Map<Long, DemandType> 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;