Revert "fix: respect switched dept when grabbing tasks"
This reverts commit 2a222c8290268b23fe6c65cf7bb89d4ac1a88640.
This commit is contained in:
parent
2a222c8290
commit
ecda3cd4b0
@ -7,7 +7,6 @@ import com.designhub.dto.TaskAuditRequest;
|
||||
import com.designhub.entity.Task;
|
||||
import com.designhub.service.TaskApprovalService;
|
||||
import com.designhub.service.TaskService;
|
||||
import com.designhub.service.UserService;
|
||||
import com.designhub.util.JwtUtil;
|
||||
import com.designhub.vo.DashboardStatsVO;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
@ -34,7 +33,6 @@ public class TaskController {
|
||||
|
||||
private final TaskService taskService;
|
||||
private final TaskApprovalService taskApprovalService;
|
||||
private final UserService userService;
|
||||
private final JwtUtil jwtUtil;
|
||||
|
||||
@Operation(summary = "创建任务", description = "发起新的设计任务")
|
||||
@ -215,13 +213,11 @@ public class TaskController {
|
||||
|
||||
@Operation(summary = "抢单", description = "设计师抢单")
|
||||
@PostMapping("/{id}/grab")
|
||||
public Result<String> grabTask(@PathVariable Long id,
|
||||
@RequestHeader("Authorization") String authHeader,
|
||||
@RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) {
|
||||
public Result<String> grabTask(@PathVariable Long id, @RequestHeader("Authorization") String authHeader) {
|
||||
log.info("抢单: {}", id);
|
||||
String token = jwtUtil.extractTokenFromHeader(authHeader);
|
||||
Long userId = jwtUtil.getUserIdFromToken(token);
|
||||
taskService.grabTask(id, userId, actingDeptId);
|
||||
taskService.grabTask(id, userId);
|
||||
return Result.success("抢单成功");
|
||||
}
|
||||
|
||||
@ -322,22 +318,18 @@ public class TaskController {
|
||||
@Parameter(description = "筛选可接单部门ID") @RequestParam(required = false) Long filterDeptId,
|
||||
@Parameter(description = "页码") @RequestParam(defaultValue = "1") Integer page,
|
||||
@Parameter(description = "每页数量") @RequestParam(defaultValue = "20") Integer pageSize,
|
||||
@RequestHeader("Authorization") String authHeader,
|
||||
@RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) {
|
||||
@RequestHeader("Authorization") String authHeader) {
|
||||
|
||||
// 获取当前用户的部门ID
|
||||
String token = jwtUtil.extractTokenFromHeader(authHeader);
|
||||
Long userId = jwtUtil.getUserIdFromToken(token);
|
||||
Long userDeptId = taskService.getUserDeptId(userId);
|
||||
if (actingDeptId != null) {
|
||||
userDeptId = userService.resolveAccessibleDepartmentForView(userId, actingDeptId).getId();
|
||||
}
|
||||
|
||||
log.info("查询任务大厅: taskTypeId={}, demandTypeId={}, brandId={}, categoryId={}, platformId={}, " +
|
||||
"taskSubType={}, minScore={}, maxScore={}, keyword={}, publisherName={}, timeRange={}, " +
|
||||
"sortBy={}, filterDeptId={}, page={}, pageSize={}, userDeptId={}, actingDeptId={}",
|
||||
"sortBy={}, filterDeptId={}, page={}, pageSize={}, userDeptId={}",
|
||||
taskTypeId, demandTypeId, brandId, categoryId, platformId, taskSubType,
|
||||
minScore, maxScore, keyword, publisherName, timeRange, sortBy, filterDeptId, page, pageSize, userDeptId, actingDeptId);
|
||||
minScore, maxScore, keyword, publisherName, timeRange, sortBy, filterDeptId, page, pageSize, userDeptId);
|
||||
|
||||
IPage<Task> taskPage = taskService.getTaskHall(page, pageSize, taskTypeId, demandTypeId,
|
||||
brandId, categoryId, platformId, taskSubType, minScore, maxScore, keyword,
|
||||
|
||||
@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
|
||||
import com.designhub.common.Result;
|
||||
import com.designhub.entity.TaskItem;
|
||||
import com.designhub.service.TaskItemService;
|
||||
import com.designhub.service.UserService;
|
||||
import com.designhub.mapper.UserMapper;
|
||||
import com.designhub.mapper.DepartmentMapper;
|
||||
import com.designhub.util.JwtUtil;
|
||||
@ -44,7 +43,6 @@ public class TaskItemController {
|
||||
private final TaskItemMapper taskItemMapper;
|
||||
private final JwtUtil jwtUtil;
|
||||
private final WorkHoursCalculator workHoursCalculator;
|
||||
private final UserService userService;
|
||||
|
||||
/**
|
||||
* 获取可接单的子任务列表
|
||||
@ -64,20 +62,19 @@ public class TaskItemController {
|
||||
@Parameter(description = "类目ID") @RequestParam(required = false) Long categoryId,
|
||||
@Parameter(description = "平台ID") @RequestParam(required = false) Long platformId,
|
||||
@Parameter(description = "需求类型") @RequestParam(required = false) String taskSubType,
|
||||
@RequestHeader(value = "Authorization", required = false) String token,
|
||||
@RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) {
|
||||
@RequestHeader(value = "Authorization", required = false) String token) {
|
||||
|
||||
Long viewerDeptId = null;
|
||||
if (token != null && !token.trim().isEmpty()) {
|
||||
String actualToken = jwtUtil.extractTokenFromHeader(token);
|
||||
Long userId = jwtUtil.getUserIdFromToken(actualToken);
|
||||
com.designhub.entity.User user = userMapper.selectById(userId);
|
||||
if (user != null) {
|
||||
if (actingDeptId != null) {
|
||||
viewerDeptId = userService.resolveAccessibleDepartmentForView(userId, actingDeptId).getId();
|
||||
} else {
|
||||
try {
|
||||
String actualToken = jwtUtil.extractTokenFromHeader(token);
|
||||
Long userId = jwtUtil.getUserIdFromToken(actualToken);
|
||||
com.designhub.entity.User user = userMapper.selectById(userId);
|
||||
if (user != null) {
|
||||
viewerDeptId = user.getDeptId();
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.debug("解析任务大厅用户部门失败,继续使用默认口径: {}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -350,12 +347,11 @@ public class TaskItemController {
|
||||
@PostMapping("/{itemId}/grab")
|
||||
public Result<String> grabItem(
|
||||
@Parameter(description = "子任务ID") @PathVariable Long itemId,
|
||||
@RequestHeader("Authorization") String token,
|
||||
@RequestHeader(value = "X-Dept-Id", required = false) Long actingDeptId) {
|
||||
@RequestHeader("Authorization") String token) {
|
||||
|
||||
String actualToken = token.replace("Bearer ", "");
|
||||
Long userId = jwtUtil.getUserIdFromToken(actualToken);
|
||||
taskItemService.grabItem(itemId, userId, actingDeptId);
|
||||
taskItemService.grabItem(itemId, userId);
|
||||
return Result.success("抢单成功");
|
||||
}
|
||||
|
||||
|
||||
@ -203,12 +203,6 @@ public interface TaskItemMapper extends BaseMapper<TaskItem> {
|
||||
" #{typeId}" +
|
||||
" </foreach> " +
|
||||
"</if> " +
|
||||
"<if test='visibleReceiverDeptIds != null and visibleReceiverDeptIds.size() > 0'> " +
|
||||
" AND (ti.receiver_dept_id IS NULL OR ti.receiver_dept_id IN " +
|
||||
" <foreach collection='visibleReceiverDeptIds' item='deptId' open='(' separator=',' close=')'>" +
|
||||
" #{deptId}" +
|
||||
" </foreach>) " +
|
||||
"</if> " +
|
||||
"ORDER BY ti.create_time DESC" +
|
||||
"</script>")
|
||||
IPage<TaskItem> selectAvailableItemsWithFilters(Page<TaskItem> page,
|
||||
@ -218,8 +212,7 @@ public interface TaskItemMapper extends BaseMapper<TaskItem> {
|
||||
@Param("categoryId") Long categoryId,
|
||||
@Param("platformId") Long platformId,
|
||||
@Param("taskSubType") String taskSubType,
|
||||
@Param("allowedTaskTypeIds") List<Long> allowedTaskTypeIds,
|
||||
@Param("visibleReceiverDeptIds") List<Long> visibleReceiverDeptIds);
|
||||
@Param("allowedTaskTypeIds") List<Long> allowedTaskTypeIds);
|
||||
|
||||
/**
|
||||
* 查询进行中的子任务列表
|
||||
|
||||
@ -106,17 +106,21 @@ public class TaskItemService {
|
||||
Long brandId, Long categoryId, Long platformId, String taskSubType,
|
||||
Long viewerDeptId) {
|
||||
Page<TaskItem> pageParam = new Page<>(page, pageSize);
|
||||
List<com.designhub.entity.DemandType> allDemandTypes = demandTypeMapper.selectList(null);
|
||||
Map<Long, com.designhub.entity.DemandType> demandTypeMap = allDemandTypes.stream()
|
||||
.collect(java.util.stream.Collectors.toMap(com.designhub.entity.DemandType::getId, dt -> dt));
|
||||
IPage<TaskItem> result;
|
||||
|
||||
List<Long> viewerAllowedTaskTypeIds = resolveViewerAllowedTaskTypeIds(viewerDeptId, allDemandTypes, demandTypeMap);
|
||||
List<Long> effectiveTaskTypeIds = viewerAllowedTaskTypeIds;
|
||||
|
||||
if (filterDeptId != null) {
|
||||
// 如果没有指定筛选部门,直接查询
|
||||
if (filterDeptId == null) {
|
||||
result = taskItemMapper.selectAvailableItemsWithFilters(pageParam, taskTypeId, keyword, brandId, categoryId, platformId, taskSubType, null);
|
||||
} else {
|
||||
// 🔥 获取筛选部门及其所有子部门的ID列表
|
||||
Set<Long> filterDeptAndChildIds = getDeptAndChildIds(filterDeptId);
|
||||
log.debug("筛选部门ID: {}, 包含子部门: {}", filterDeptId, filterDeptAndChildIds);
|
||||
|
||||
// 获取该部门可接单的任务类型ID列表
|
||||
List<com.designhub.entity.DemandType> allDemandTypes = demandTypeMapper.selectList(null);
|
||||
Map<Long, com.designhub.entity.DemandType> demandTypeMap = allDemandTypes.stream()
|
||||
.collect(java.util.stream.Collectors.toMap(com.designhub.entity.DemandType::getId, dt -> dt));
|
||||
|
||||
List<Long> filterDeptAllowedTypeIds = allDemandTypes.stream()
|
||||
.filter(dt -> {
|
||||
String allowedDepts = dt.getAllowedDeptIds();
|
||||
@ -126,6 +130,7 @@ public class TaskItemService {
|
||||
allowedDepts = parentType.getAllowedDeptIds();
|
||||
}
|
||||
}
|
||||
// 只筛选明确指定了该部门(或其子部门)的任务类型
|
||||
if (allowedDepts == null || allowedDepts.isEmpty()) {
|
||||
return false;
|
||||
}
|
||||
@ -136,39 +141,15 @@ public class TaskItemService {
|
||||
|
||||
log.debug("匹配的任务类型ID: {}", filterDeptAllowedTypeIds);
|
||||
|
||||
// 如果没有找到匹配的任务类型,返回空结果
|
||||
if (filterDeptAllowedTypeIds.isEmpty()) {
|
||||
return new Page<>(page, pageSize);
|
||||
}
|
||||
|
||||
if (effectiveTaskTypeIds != null) {
|
||||
effectiveTaskTypeIds = effectiveTaskTypeIds.stream()
|
||||
.filter(filterDeptAllowedTypeIds::contains)
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
} else {
|
||||
effectiveTaskTypeIds = filterDeptAllowedTypeIds;
|
||||
}
|
||||
// 查询并筛选
|
||||
result = taskItemMapper.selectAvailableItemsWithFilters(pageParam, taskTypeId, keyword, brandId, categoryId, platformId, taskSubType, filterDeptAllowedTypeIds);
|
||||
}
|
||||
|
||||
if (effectiveTaskTypeIds != null && effectiveTaskTypeIds.isEmpty()) {
|
||||
return new Page<>(page, pageSize);
|
||||
}
|
||||
|
||||
List<Long> visibleReceiverDeptIds = viewerDeptId != null
|
||||
? getVisibleReceiverDeptIds(viewerDeptId)
|
||||
: (filterDeptId != null ? getVisibleReceiverDeptIds(filterDeptId) : null);
|
||||
|
||||
IPage<TaskItem> result = taskItemMapper.selectAvailableItemsWithFilters(
|
||||
pageParam,
|
||||
taskTypeId,
|
||||
keyword,
|
||||
brandId,
|
||||
categoryId,
|
||||
platformId,
|
||||
taskSubType,
|
||||
effectiveTaskTypeIds,
|
||||
visibleReceiverDeptIds
|
||||
);
|
||||
|
||||
// 🔥 填充排队状态信息
|
||||
if (result.getRecords() != null && !result.getRecords().isEmpty()) {
|
||||
Long statusDeptId = viewerDeptId != null ? viewerDeptId : filterDeptId;
|
||||
@ -275,57 +256,6 @@ public class TaskItemService {
|
||||
}
|
||||
}
|
||||
|
||||
private List<Long> resolveViewerAllowedTaskTypeIds(Long viewerDeptId,
|
||||
List<com.designhub.entity.DemandType> allDemandTypes,
|
||||
Map<Long, com.designhub.entity.DemandType> demandTypeMap) {
|
||||
if (viewerDeptId == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return allDemandTypes.stream()
|
||||
.filter(dt -> {
|
||||
String allowedDepts = dt.getAllowedDeptIds();
|
||||
if ((allowedDepts == null || allowedDepts.isEmpty()) && dt.getParentId() != null) {
|
||||
com.designhub.entity.DemandType parentType = demandTypeMap.get(dt.getParentId());
|
||||
if (parentType != null) {
|
||||
allowedDepts = parentType.getAllowedDeptIds();
|
||||
}
|
||||
}
|
||||
|
||||
if (allowedDepts == null || allowedDepts.isEmpty()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return expandAllowedDeptIds(allowedDepts).contains(viewerDeptId);
|
||||
})
|
||||
.map(com.designhub.entity.DemandType::getId)
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
}
|
||||
|
||||
private List<Long> getVisibleReceiverDeptIds(Long viewerDeptId) {
|
||||
if (viewerDeptId == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
java.util.LinkedHashSet<Long> visibleDeptIds = new java.util.LinkedHashSet<>();
|
||||
Long currentDeptId = viewerDeptId;
|
||||
while (currentDeptId != null) {
|
||||
visibleDeptIds.add(currentDeptId);
|
||||
com.designhub.entity.Department currentDept = departmentMapper.selectById(currentDeptId);
|
||||
if (currentDept == null || currentDept.getParentId() == null
|
||||
|| currentDeptId.equals(currentDept.getParentId())) {
|
||||
break;
|
||||
}
|
||||
currentDeptId = currentDept.getParentId();
|
||||
}
|
||||
|
||||
if (isSharedGrabDept(viewerDeptId, GRAPHIC_VISUAL_DEPT_ID)) {
|
||||
visibleDeptIds.add(GRAPHIC_VISUAL_DEPT_ID);
|
||||
}
|
||||
|
||||
return new java.util.ArrayList<>(visibleDeptIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 判断用户部门是否属于目标部门(含目标部门的子部门)
|
||||
*/
|
||||
@ -585,8 +515,8 @@ public class TaskItemService {
|
||||
* 抢单子任务
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void grabItem(Long itemId, Long userId, Long actingDeptId) {
|
||||
log.info("设计师 {} 抢单子任务 {},当前切换部门: {}", userId, itemId, actingDeptId);
|
||||
public void grabItem(Long itemId, Long userId) {
|
||||
log.info("设计师 {} 抢单子任务 {}", userId, itemId);
|
||||
|
||||
// 获取用户信息
|
||||
var user = userService.getUserById(userId);
|
||||
@ -602,20 +532,15 @@ public class TaskItemService {
|
||||
|
||||
// 检查是否是管理员(管理员可以抢单,绕过所有限制)
|
||||
boolean isAdmin = user.getIsAdmin() != null && user.getIsAdmin() == 1;
|
||||
Long deptId = user.getDeptId();
|
||||
if (actingDeptId != null && !isAdmin) {
|
||||
com.designhub.entity.Department actingDepartment = userService.resolveReceivingDepartmentForAction(userId, actingDeptId);
|
||||
deptId = actingDepartment.getId();
|
||||
}
|
||||
|
||||
// 非管理员需要进行权限验证
|
||||
if (!isAdmin) {
|
||||
// 验证用户部门权限
|
||||
if (deptId == null) {
|
||||
if (user.getDeptId() == null) {
|
||||
throw new BusinessException(ResultCode.FORBIDDEN, "您未分配部门,无法接单");
|
||||
}
|
||||
|
||||
com.designhub.entity.Department department = departmentMapper.selectById(deptId);
|
||||
com.designhub.entity.Department department = departmentMapper.selectById(user.getDeptId());
|
||||
if (department == null) {
|
||||
throw new BusinessException(ResultCode.FORBIDDEN, "未找到用户所属部门,请联系管理员");
|
||||
}
|
||||
@ -632,7 +557,7 @@ public class TaskItemService {
|
||||
|
||||
// 检查3:如果子任务已指定接单部门,则仅允许该部门(含子部门)成员接单
|
||||
if (item.getReceiverDeptId() != null
|
||||
&& !isDeptMatchedOrInherited(deptId, item.getReceiverDeptId())) {
|
||||
&& !isDeptMatchedOrInherited(user.getDeptId(), item.getReceiverDeptId())) {
|
||||
throw new BusinessException(ResultCode.FORBIDDEN, "该任务仅允许指定接单部门成员接单");
|
||||
}
|
||||
|
||||
@ -654,7 +579,7 @@ public class TaskItemService {
|
||||
// 检查用户部门或其父部门是否在允许列表中(子部门继承父部门权限)
|
||||
String[] allowedIds = allowedDeptIds.split(",");
|
||||
Set<Long> allowedDeptIdSet = new HashSet<>();
|
||||
for (String allowedId : allowedIds) {
|
||||
for (String allowedId : allowedIds) {
|
||||
try {
|
||||
allowedDeptIdSet.add(Long.parseLong(allowedId.trim()));
|
||||
} catch (NumberFormatException e) {
|
||||
@ -664,12 +589,12 @@ public class TaskItemService {
|
||||
|
||||
// 获取用户部门及其所有父部门ID
|
||||
boolean isAllowed = false;
|
||||
Long currentDeptId = deptId;
|
||||
Long currentDeptId = user.getDeptId();
|
||||
while (currentDeptId != null) {
|
||||
if (allowedDeptIdSet.contains(currentDeptId)) {
|
||||
isAllowed = true;
|
||||
break;
|
||||
}
|
||||
isAllowed = true;
|
||||
break;
|
||||
}
|
||||
// 向上查找父部门
|
||||
com.designhub.entity.Department currentDept = departmentMapper.selectById(currentDeptId);
|
||||
if (currentDept != null && currentDept.getParentId() != null) {
|
||||
@ -679,8 +604,8 @@ public class TaskItemService {
|
||||
}
|
||||
}
|
||||
|
||||
if (!isAllowed) {
|
||||
throw new BusinessException(ResultCode.FORBIDDEN, "您的部门无权接收此类型的任务");
|
||||
if (!isAllowed) {
|
||||
throw new BusinessException(ResultCode.FORBIDDEN, "您的部门无权接收此类型的任务");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -704,9 +629,9 @@ public class TaskItemService {
|
||||
|
||||
if (!"assigned".equals(releaseType)) {
|
||||
// 非指定任务,检查是否可抢单
|
||||
Long targetDeptId = resolveApplicableQueueDeptId(item, deptId);
|
||||
Long targetDeptId = resolveApplicableQueueDeptId(item, user.getDeptId());
|
||||
if (targetDeptId == null) {
|
||||
targetDeptId = item.getReceiverDeptId() != null ? item.getReceiverDeptId() : deptId;
|
||||
targetDeptId = item.getReceiverDeptId() != null ? item.getReceiverDeptId() : user.getDeptId();
|
||||
}
|
||||
if (!taskUnlockService.canGrab(itemId, targetDeptId, releaseType)) {
|
||||
throw new BusinessException(ResultCode.TASK_STATUS_ERROR, "该任务正在排队中,暂不可接单");
|
||||
@ -750,7 +675,7 @@ public class TaskItemService {
|
||||
result = taskItemMapper.grabAssignedItem(itemId, userId, user.getRealName(), deadline);
|
||||
} else {
|
||||
// 普通任务:乐观锁抢单(同时设置接单部门ID和deadline)
|
||||
result = taskItemMapper.grabItem(itemId, userId, user.getRealName(), deptId, deadline);
|
||||
result = taskItemMapper.grabItem(itemId, userId, user.getRealName(), user.getDeptId(), deadline);
|
||||
}
|
||||
|
||||
if (result == 0) {
|
||||
@ -803,9 +728,9 @@ public class TaskItemService {
|
||||
}
|
||||
|
||||
// 🔥 任务被抢单后,检查并补充解锁下一批任务
|
||||
Long grabberDeptId = deptId;
|
||||
Long grabberDeptId = user.getDeptId();
|
||||
if (!isAssignedItem && !"assigned".equals(releaseType)) {
|
||||
Long queueDeptId = resolveApplicableQueueDeptId(item, deptId);
|
||||
Long queueDeptId = resolveApplicableQueueDeptId(item, user.getDeptId());
|
||||
if (queueDeptId != null) {
|
||||
grabberDeptId = queueDeptId;
|
||||
}
|
||||
|
||||
@ -2437,8 +2437,8 @@ public class TaskService {
|
||||
* 抢单
|
||||
*/
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void grabTask(Long taskId, Long userId, Long actingDeptId) {
|
||||
log.info("用户 {} 抢单任务 {},当前切换部门: {}", userId, taskId, actingDeptId);
|
||||
public void grabTask(Long taskId, Long userId) {
|
||||
log.info("用户 {} 抢单任务 {}", userId, taskId);
|
||||
|
||||
Task task = getTaskById(taskId);
|
||||
|
||||
@ -2462,10 +2462,6 @@ public class TaskService {
|
||||
boolean isAdmin = isAdminUser(userId);
|
||||
|
||||
Long deptId = user.getDeptId();
|
||||
if (actingDeptId != null && !isAdmin) {
|
||||
Department actingDepartment = userService.resolveReceivingDepartmentForAction(userId, actingDeptId);
|
||||
deptId = actingDepartment.getId();
|
||||
}
|
||||
|
||||
// 非管理员需要进行权限验证
|
||||
if (!isAdmin) {
|
||||
|
||||
@ -1352,108 +1352,6 @@ public class UserService {
|
||||
return departmentMapper.selectBatchIds(deptIds);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取用户当前可切换的部门视角
|
||||
* - 用户挂载的全部部门
|
||||
* - 用户主部门
|
||||
* - 负责人管理的部门
|
||||
* - 一级需求负责人可切换其子需求部门
|
||||
*/
|
||||
public List<Department> getUserAccessibleDepartments(Long userId) {
|
||||
if (userId == null) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
java.util.LinkedHashMap<Long, Department> departmentMap = new java.util.LinkedHashMap<>();
|
||||
|
||||
User user = getUserById(userId);
|
||||
if (user != null && user.getDeptId() != null) {
|
||||
Department primaryDept = departmentMapper.selectById(user.getDeptId());
|
||||
if (isActiveDepartment(primaryDept)) {
|
||||
departmentMap.put(primaryDept.getId(), primaryDept);
|
||||
}
|
||||
}
|
||||
|
||||
for (Department department : getUserDepartments(userId)) {
|
||||
if (isActiveDepartment(department)) {
|
||||
departmentMap.put(department.getId(), department);
|
||||
}
|
||||
}
|
||||
|
||||
List<Department> leadingDepts = departmentMapper.selectList(
|
||||
new LambdaQueryWrapper<Department>()
|
||||
.eq(Department::getLeaderId, userId)
|
||||
.eq(Department::getStatus, 1)
|
||||
.eq(Department::getDeleted, 0)
|
||||
);
|
||||
|
||||
for (Department department : leadingDepts) {
|
||||
if (!isActiveDepartment(department)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
departmentMap.put(department.getId(), department);
|
||||
|
||||
if ("primary_demand".equals(department.getDeptType())) {
|
||||
List<Department> childDepartments = departmentMapper.selectList(
|
||||
new LambdaQueryWrapper<Department>()
|
||||
.eq(Department::getParentId, department.getId())
|
||||
.eq(Department::getStatus, 1)
|
||||
.eq(Department::getDeleted, 0)
|
||||
);
|
||||
|
||||
for (Department childDepartment : childDepartments) {
|
||||
if (!isActiveDepartment(childDepartment)) {
|
||||
continue;
|
||||
}
|
||||
if (!"demand".equals(childDepartment.getDeptType())
|
||||
&& !"primary_demand".equals(childDepartment.getDeptType())) {
|
||||
continue;
|
||||
}
|
||||
departmentMap.put(childDepartment.getId(), childDepartment);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new ArrayList<>(departmentMap.values());
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验当前切换的部门是否属于用户可访问范围
|
||||
*/
|
||||
public Department resolveAccessibleDepartmentForView(Long userId, Long requestedDeptId) {
|
||||
if (requestedDeptId == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return getUserAccessibleDepartments(userId).stream()
|
||||
.filter(department -> requestedDeptId.equals(department.getId()))
|
||||
.findFirst()
|
||||
.orElseThrow(() -> new BusinessException(ResultCode.FORBIDDEN, "当前切换的部门不属于您,无法执行该操作"));
|
||||
}
|
||||
|
||||
/**
|
||||
* 校验当前切换的部门是否可用于接单
|
||||
*/
|
||||
public Department resolveReceivingDepartmentForAction(Long userId, Long requestedDeptId) {
|
||||
if (requestedDeptId == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
Department department = resolveAccessibleDepartmentForView(userId, requestedDeptId);
|
||||
if (!"receiving".equals(department.getDeptType())) {
|
||||
throw new BusinessException(ResultCode.FORBIDDEN, "当前切换的部门不是接单部门,无法执行该操作");
|
||||
}
|
||||
return department;
|
||||
}
|
||||
|
||||
private boolean isActiveDepartment(Department department) {
|
||||
return department != null
|
||||
&& (department.getStatus() == null || department.getStatus() == 1)
|
||||
&& (department.getDeleted() == null || department.getDeleted() == 0)
|
||||
&& departmentService.isDepartmentActiveWithAncestors(department.getId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 添加用户到部门(如果不存在则添加)
|
||||
*/
|
||||
|
||||
@ -194,16 +194,6 @@ export interface MyTasksParams {
|
||||
sortBy?: string
|
||||
}
|
||||
|
||||
const buildActingDeptHeaders = (actingDeptId?: number) => {
|
||||
if (actingDeptId === undefined) {
|
||||
return undefined
|
||||
}
|
||||
|
||||
return {
|
||||
'X-Dept-Id': String(actingDeptId)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建任务
|
||||
*/
|
||||
@ -235,10 +225,8 @@ export const updateTask = (id: number, data: Partial<Task>) => {
|
||||
/**
|
||||
* 抢单
|
||||
*/
|
||||
export const grabTask = (id: number, actingDeptId?: number) => {
|
||||
return request.post<any>(`/tasks/${id}/grab`, null, {
|
||||
headers: buildActingDeptHeaders(actingDeptId)
|
||||
})
|
||||
export const grabTask = (id: number) => {
|
||||
return request.post<any>(`/tasks/${id}/grab`)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -285,11 +273,8 @@ export const rateTask = (id: number, rating: number, comment?: string) => {
|
||||
/**
|
||||
* 获取任务大厅
|
||||
*/
|
||||
export const getTaskHall = (params: TaskHallParams, actingDeptId?: number) => {
|
||||
return request.get<any>('/tasks/hall', {
|
||||
params,
|
||||
headers: buildActingDeptHeaders(actingDeptId)
|
||||
})
|
||||
export const getTaskHall = (params: TaskHallParams) => {
|
||||
return request.get<any>('/tasks/hall', { params })
|
||||
}
|
||||
|
||||
/**
|
||||
@ -441,11 +426,8 @@ export const getAvailableTaskItems = (params: {
|
||||
taskSubType?: string
|
||||
filterDeptId?: number
|
||||
sortBy?: string
|
||||
}, actingDeptId?: number) => {
|
||||
return request.get<any>('/tasks/items/available', {
|
||||
params,
|
||||
headers: buildActingDeptHeaders(actingDeptId)
|
||||
})
|
||||
}) => {
|
||||
return request.get<any>('/tasks/items/available', { params })
|
||||
}
|
||||
|
||||
/**
|
||||
@ -489,10 +471,8 @@ export const getTaskItemById = (itemId: number) => {
|
||||
/**
|
||||
* 抢单子任务
|
||||
*/
|
||||
export const grabTaskItem = (itemId: number, actingDeptId?: number) => {
|
||||
return request.post<any>(`/tasks/items/${itemId}/grab`, null, {
|
||||
headers: buildActingDeptHeaders(actingDeptId)
|
||||
})
|
||||
export const grabTaskItem = (itemId: number) => {
|
||||
return request.post<any>(`/tasks/items/${itemId}/grab`)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -3747,14 +3747,8 @@ const loadTasks = async (forceReload = false) => {
|
||||
|
||||
// 同时加载普通任务和子任务(流水线任务)
|
||||
const [taskResponse, itemResponse] = await Promise.all([
|
||||
taskApi.getTaskHall(
|
||||
params,
|
||||
currentDeptView.value !== undefined ? currentDeptView.value : undefined
|
||||
),
|
||||
taskApi.getAvailableTaskItems(
|
||||
params,
|
||||
currentDeptView.value !== undefined ? currentDeptView.value : undefined
|
||||
)
|
||||
taskApi.getTaskHall(params),
|
||||
taskApi.getAvailableTaskItems(params)
|
||||
])
|
||||
|
||||
// 处理普通任务(非流水线任务)
|
||||
@ -6271,7 +6265,7 @@ const canGrabTask = (task: TaskOrSubTask) => {
|
||||
}
|
||||
|
||||
// 检查2:需求部门不能抢单
|
||||
if (currentDeptType === 'demand' || currentDeptType === 'primary_demand') {
|
||||
if (currentDeptType === 'demand') {
|
||||
return { canGrab: false, reason: '需求部门成员不能接单' }
|
||||
}
|
||||
|
||||
@ -6321,16 +6315,10 @@ const handleGrab = async (task: TaskOrSubTask) => {
|
||||
let response
|
||||
if (isSubTask) {
|
||||
// 抢子任务
|
||||
response = await taskApi.grabTaskItem(
|
||||
task.itemId || task.id!,
|
||||
currentDeptView.value !== undefined ? currentDeptView.value : undefined
|
||||
)
|
||||
response = await taskApi.grabTaskItem(task.itemId || task.id!)
|
||||
} else {
|
||||
// 抢普通任务
|
||||
response = await taskApi.grabTask(
|
||||
task.id!,
|
||||
currentDeptView.value !== undefined ? currentDeptView.value : undefined
|
||||
)
|
||||
response = await taskApi.grabTask(task.id!)
|
||||
}
|
||||
|
||||
if (response.code === 200) {
|
||||
@ -6379,15 +6367,9 @@ const handleGrabTask = async (task: TaskOrSubTask) => {
|
||||
try {
|
||||
let response
|
||||
if (isSubTask) {
|
||||
response = await taskApi.grabTaskItem(
|
||||
task.itemId || task.id!,
|
||||
currentDeptView.value !== undefined ? currentDeptView.value : undefined
|
||||
)
|
||||
response = await taskApi.grabTaskItem(task.itemId || task.id!)
|
||||
} else {
|
||||
response = await taskApi.grabTask(
|
||||
task.id!,
|
||||
currentDeptView.value !== undefined ? currentDeptView.value : undefined
|
||||
)
|
||||
response = await taskApi.grabTask(task.id!)
|
||||
}
|
||||
|
||||
if (response.code === 200) {
|
||||
@ -6668,10 +6650,7 @@ const loadAllTabCounts = async () => {
|
||||
|
||||
// 1. 可接任务数量
|
||||
promises.push(
|
||||
taskApi.getTaskHall(
|
||||
{ page: 1, pageSize: 1 },
|
||||
currentDeptView.value !== undefined ? currentDeptView.value : undefined
|
||||
).then(res => {
|
||||
taskApi.getTaskHall({ page: 1, pageSize: 1 }).then(res => {
|
||||
if (res.data && res.data.total !== undefined) {
|
||||
total.value = res.data.total
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user