diff --git a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java index 53b3958..0f8ea27 100644 --- a/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java +++ b/src/main/java/cn/edu/hfut/rmdjzz/projectmanagement/service/impl/TaskServiceImpl.java @@ -136,12 +136,12 @@ public class TaskServiceImpl extends ServiceImpl implements IT @NotNull private void addResultProjectProcess(List resList, String projectType) { Boolean typeExist = false; - for(StaffProcessDTO staffProcessDTO: resList) { - if(Objects.equals(staffProcessDTO.getTaskType(), projectType)) { + for (StaffProcessDTO staffProcessDTO : resList) { + if (Objects.equals(staffProcessDTO.getTaskType(), projectType)) { typeExist = true; } } - if(!typeExist) { + if (!typeExist) { StaffProcessDTO staffProcessDTO = new StaffProcessDTO(); staffProcessDTO.setTaskType(projectType); staffProcessDTO.setCompleteNum(0L); @@ -186,16 +186,56 @@ public class TaskServiceImpl extends ServiceImpl implements IT return getHolderLevel(staffId, staffGlobalLevel, taskId); } + private int lowerBound(List data, long x) { + int l = 0, r = data.size() - 1; + while (l < r) { + int mid = (l + r) / 2; + if (data.get(mid).getTaskFatherId() >= x) r = mid; + else l = mid + 1; + } + return l; + } + + private int upperBound(List data, long x) { + int l = 0, r = data.size() - 1; + while (l < r) { + int mid = (l + r) / 2; + if (data.get(mid).getTaskFatherId() <= x) l = mid + 1; + else r = mid; + } + return l - 1; + } + + @Override public List listMyTasks(String token, Integer projectId) throws BadRequestException { - if (projectGroupService.getProjectAccessLevel(token, projectId) == 0) { - throw new BadRequestException(IProjectGroupService.UNABLE_TO_ACCESS_PROJECT); - } Integer staffId = TokenUtils.getStaffId(token); - return baseMapper.selectList(Wrappers.lambdaQuery() - .eq(Task::getTaskHolderId, staffId) - .eq(Task::getTaskProjectId, projectId) - ); + List resList = baseMapper.selectList(Wrappers.lambdaQuery().select(Task::getTaskId, Task::getTaskFatherId, Task::getTaskHolderId) + .eq(Task::getTaskProjectId, projectId).orderByAsc(Task::getTaskFatherId)); + List results = new ArrayList<>(); + ArrayList vec = new ArrayList<>(); + ArrayList isTarget = new ArrayList<>(); + vec.add(0L); + isTarget.add(false); + int id = 0; + while (id != vec.size()) { + Long pos = vec.get(id); + Boolean flag = isTarget.get(id); + id++; + if (flag) { + results.add(pos); + continue; + } + int l = lowerBound(resList, pos); + int r = upperBound(resList, pos); + if (l > r) + continue; + for (int i = l; i <= r; i++) { + vec.add(resList.get(i).getTaskId()); + isTarget.add(resList.get(i).getTaskHolderId().equals(staffId)); + } + } + return baseMapper.selectList(Wrappers.lambdaQuery().in(Task::getTaskId, results)); } @Override