fix: allow leaders to publish for managed demand departments

This commit is contained in:
Your Name 2026-03-30 16:20:45 +08:00
parent 68e17b0a83
commit 821c3bf22c
3 changed files with 75 additions and 0 deletions

View File

@ -840,4 +840,57 @@ public class DepartmentService {
return count != null && count > 0;
}
/**
* 获取用户可管理的需求侧发起部门
* - 直接负责的 demand / primary_demand 部门
* - 如果负责的是一级需求部门,则其子需求部门也视为可发起部门
*/
public List<Department> getUserManagedPublishingDepartments(Long userId) {
if (userId == null) {
return Collections.emptyList();
}
List<Department> leadingDepts = departmentMapper.selectList(
new LambdaQueryWrapper<Department>()
.eq(Department::getLeaderId, userId)
.eq(Department::getStatus, 1)
.eq(Department::getDeleted, 0)
);
if (CollectionUtils.isEmpty(leadingDepts)) {
return Collections.emptyList();
}
List<Department> result = new ArrayList<>();
for (Department dept : leadingDepts) {
if (dept == null) {
continue;
}
if ("demand".equals(dept.getDeptType()) || "primary_demand".equals(dept.getDeptType())) {
result.add(dept);
}
if ("primary_demand".equals(dept.getDeptType())) {
List<Department> childDepts = departmentMapper.selectList(
new LambdaQueryWrapper<Department>()
.eq(Department::getParentId, dept.getId())
.eq(Department::getStatus, 1)
.eq(Department::getDeleted, 0)
);
childDepts.stream()
.filter(child -> "demand".equals(child.getDeptType()) || "primary_demand".equals(child.getDeptType()))
.forEach(result::add);
}
}
return result.stream()
.filter(Objects::nonNull)
.collect(Collectors.collectingAndThen(
Collectors.toMap(Department::getId, dept -> dept, (left, right) -> left, java.util.LinkedHashMap::new),
map -> new ArrayList<>(map.values())
));
}
}

View File

@ -1336,6 +1336,15 @@ public class TaskService {
.distinct()
.collect(Collectors.toList());
// 需求部门负责人可以按其管理的需求部门发起任务,不要求必须挂在 sys_user_department
List<Department> managedPublishingDepartments = departmentService.getUserManagedPublishingDepartments(user.getId());
if (!managedPublishingDepartments.isEmpty()) {
java.util.LinkedHashMap<Long, Department> publishingDeptMap = new java.util.LinkedHashMap<>();
publishingDepartments.forEach(dept -> publishingDeptMap.put(dept.getId(), dept));
managedPublishingDepartments.forEach(dept -> publishingDeptMap.put(dept.getId(), dept));
publishingDepartments = new java.util.ArrayList<>(publishingDeptMap.values());
}
if (requestedDeptId != null) {
Department requestedDept = departmentService.getDepartmentById(requestedDeptId);
if (requestedDept == null) {

View File

@ -706,6 +706,19 @@ const availablePublishingDepartments = computed<PublishingDepartmentOption[]>(()
seen.add(dept.deptId)
})
const managedDepartments = Array.isArray(userInfo.managedDepartments) ? userInfo.managedDepartments : []
managedDepartments.forEach((dept) => {
if (!dept?.deptId || seen.has(dept.deptId)) return
if (dept.deptType !== 'demand' && dept.deptType !== 'primary_demand') return
result.push({
deptId: dept.deptId,
deptName: dept.deptName,
deptType: dept.deptType,
isPrimary: 0
})
seen.add(dept.deptId)
})
if (
userInfo.deptId &&
!seen.has(userInfo.deptId) &&