ZJY 4 месяцев назад
Родитель
Сommit
869a831121

+ 127 - 49
service-iot/service-iot-biz/src/main/java/com/usky/iot/service/impl/PmWorkContentServiceImpl.java

@@ -697,19 +697,25 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      * @description: 项目查询-工具
      * @author: fu
      * @date: 2024/8/8 19:22
-     * @param: [startDate, endDate]
      * @return: java.util.List<java.lang.Integer>
      **/
     private List<PmProject> projects(Integer projectId) {
-        Integer tenantId = SecurityUtils.getTenantId();
-        Long deptId = SecurityUtils.getLoginUser().getSysUser().getDeptId();
+        Long userId = SecurityUtils.getUserId();
         LambdaQueryWrapper<PmProject> projectsQuery = Wrappers.lambdaQuery();
         projectsQuery.select(PmProject::getId, PmProject::getProjectName);
         if (projectId != null && projectId >= 0) {
             projectsQuery.eq(PmProject::getId, projectId);
             return pmProjectMapper.selectList(projectsQuery);
+        } else {
+            projectsQuery.and(qw -> qw
+                    .or().apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql())
+                    .or().eq(PmProject::getProjectHead, userId)
+                    .or().eq(PmProject::getCreateBy, SecurityUtils.getUsername())
+                    .or().apply("FIND_IN_SET('" + SecurityUtils.getUserId() + "', project_member) > 0")
+            );
+            // projectsQuery.apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql());
         }
-        projectsQuery.eq(PmProject::getTenantId, tenantId).eq(PmProject::getDeptId, deptId).eq(PmProject::getDelFlag, 0);
+        projectsQuery.eq(PmProject::getDelFlag, 0);
         return pmProjectMapper.selectList(projectsQuery);
     }
 
@@ -720,13 +726,15 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
      * @param: [userId]
      * @return: java.util.List<com.usky.iot.domain.SysUser>
      **/
-    private List<SysUser> userNameList(List<Long> userId) {
+    private List<SysUser> userNameList(List<Long> userId, Integer workerOrProject) {
         LambdaQueryWrapper<SysUser> userNameQuery = Wrappers.lambdaQuery();
         userNameQuery.select(SysUser::getUserId, SysUser::getNickName, SysUser::getUserName, SysUser::getPhonenumber, SysUser::getAvatar,
                 SysUser::getSex, SysUser::getDeptId, SysUser::getAddress);
         if (!userId.isEmpty()) {
             userNameQuery.eq(SysUser::getDelFlag, 0).eq(SysUser::getStatus, 0).in(SysUser::getUserId, userId);
             return sysUserMapper.selectList(userNameQuery);
+        } else if (workerOrProject == 2) {
+            userNameQuery.apply(Objects.nonNull(DataScopeContextHolder.getDataScopeSql()), DataScopeContextHolder.getDataScopeSql());
         } else {
             userNameQuery.eq(SysUser::getUserId, SecurityUtils.getUserId());
         }
@@ -800,13 +808,13 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             userId = requestVO.getUserIds();
         }
         Integer projectId = requestVO.getProjectId();
-        Integer filter = 1;
+        int filter = 1;
         if (requestVO.getFilter() != null) {
             filter = requestVO.getFilter();
         }
         String startDate = requestVO.getStartDate();
         String endDate = requestVO.getEndDate();
-        Integer workerOrProject = 1;
+        int workerOrProject = 1;
         if (requestVO.getWorkerOrProject() != null) {
             workerOrProject = requestVO.getWorkerOrProject();
         }
@@ -823,6 +831,14 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             throw new BusinessException("请设置查询时间范围!");
         }
 
+        List<SysUser> users = userNameList(userId, workerOrProject);
+        List<Long> userIds = new ArrayList<>();
+        List<String> nickName = new ArrayList<>();
+        for (SysUser user : users) {
+            userIds.add(user.getUserId());
+            nickName.add(user.getNickName());
+        }
+
         List<PmProject> pmProjects = projects(projectId);
         List<String> pmProjectName = new ArrayList<>();
         List<Integer> pmProjectId = new ArrayList<>();
@@ -831,14 +847,6 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             pmProjectId.add(project.getId());
         }
 
-        List<SysUser> users = userNameList(userId);
-        List<Long> userIds = new ArrayList<>();
-        List<String> nickName = new ArrayList<>();
-        for (SysUser user : users) {
-            userIds.add(user.getUserId());
-            nickName.add(user.getNickName());
-        }
-
         // 统计userId每个项目所需工时
         List<WorkHoursStatisticsVO> userAndProject = new ArrayList<>();
         List<PmWorkContent> pmWorkContentList = workTimeCount(userIds, pmProjectId, startDate, endDate);
@@ -859,7 +867,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                 for (PmProject project : pmProjects) {
                     Integer projectId2 = project.getId();
                     String projectName = project.getProjectName();
-                    if (projectId2 == projectId1) {
+                    if (Objects.equals(projectId2, projectId1)) {
                         workHoursStatisticsVO.setProjectName(projectName);
                     }
                 }
@@ -868,6 +876,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         }
         List<WorkHoursStatisticsVO> userAndProjectD = userAndProject;
 
+        //判断是否为项目维度
         if (workerOrProject != 1) {
             returnList.add(nickName);
             // 重组返回数据结构
@@ -910,45 +919,81 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             returnList.add(projectWorkTime);
 
 
-            returnList.add(pmProjectName);
+            // 先过滤掉总工时为0的项目
+            Set<Integer> nonZeroProjectIndices = new HashSet<>();
+            for (int i = 0; i < pmProjectName.size(); i++) {
+                BigDecimal totalWorkTime = BigDecimal.ZERO;
+                for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProjectD) {
+                    if (workHoursStatisticsVO.getProjectName().equals(pmProjectName.get(i))) {
+                        totalWorkTime = totalWorkTime.add(workHoursStatisticsVO.getWorkTime());
+                    }
+                }
+                if (totalWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                    nonZeroProjectIndices.add(i);
+                }
+            }
+
             // 重组返回数据结构
             for (String uName : nickName) {
                 String name1 = uName;
                 UserWorkTimeVO userWorkTimeVO2 = new UserWorkTimeVO();
                 userWorkTimeVO2.setProjectOrPerson(name1);
                 List<BigDecimal> workTime1 = new ArrayList<>();
-                boolean hasNonZeroWorkTime1 = false;
-                if (userAndProjectD.isEmpty()) {
-                    for (String currentNickName : pmProjectName) {
-                        workTime1.add(BigDecimal.ZERO);
-                    }
-                } else {
-                    for (String currentNickName : pmProjectName) {
-                        boolean foundWorkTime = false;
-                        for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProjectD) {
-                            String userNickName = workHoursStatisticsVO.getNickName();
-                            String projectName = workHoursStatisticsVO.getProjectName();
-                            BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
-                            if (userNickName == name1 && projectName == currentNickName) {
-                                workTime1.add(userProjectWorkTime);
-                                if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
-                                    hasNonZeroWorkTime1 = true;
-                                }
-                                foundWorkTime = true;
-                                break;
-                            }
-                        }
-                        if (!foundWorkTime) {
-                            workTime1.add(BigDecimal.ZERO);
+
+                for (int i = 0; i < pmProjectName.size(); i++) {
+                    BigDecimal userProjectWorkTime = BigDecimal.ZERO;
+                    boolean foundWorkTime = false;
+                    for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProjectD) {
+                        String userNickName = workHoursStatisticsVO.getNickName();
+                        String projectName = workHoursStatisticsVO.getProjectName();
+                        if (userNickName.equals(name1) && projectName.equals(pmProjectName.get(i))) {
+                            userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
+                            foundWorkTime = true;
+                            break;
                         }
                     }
+                    if (foundWorkTime && nonZeroProjectIndices.contains(i)) {
+                        workTime1.add(userProjectWorkTime);
+                    } else {
+                        workTime1.add(BigDecimal.ZERO);
+                    }
                 }
+
                 // 过滤0工时
+                boolean hasNonZeroWorkTime1 = false;
+                for (BigDecimal time : workTime1) {
+                    if (time.compareTo(BigDecimal.ZERO) != 0) {
+                        hasNonZeroWorkTime1 = true;
+                        break;
+                    }
+                }
+
                 if (filter != 2 || hasNonZeroWorkTime1) {
                     userWorkTimeVO2.setWorkTime(workTime1);
                     userWorkTimeVO.add(userWorkTimeVO2);
                 }
             }
+
+            if (filter == 2){
+                for (int i = pmProjectName.size() - 1; i >= 0; i--) {
+                    if (!nonZeroProjectIndices.contains(i)) {
+                        pmProjectName.remove(i);
+                    }
+                }
+                for (int i = userWorkTimeVO.size() - 1; i >= 0; i--) {
+                    List<BigDecimal> workTime = userWorkTimeVO.get(i).getWorkTime();
+                    for (int j = workTime.size() - 1; j >= 0; j--) {
+                        if (!nonZeroProjectIndices.contains(j)) {
+                            workTime.remove(j);
+                        }
+                    }
+                    if (workTime.isEmpty()) {
+                        userWorkTimeVO.remove(i);
+                    }
+                }
+            }
+
+            returnList.add(pmProjectName);
             returnList.add(userWorkTimeVO);
 
         } else {
@@ -971,7 +1016,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                             String userNickName = workHoursStatisticsVO.getNickName();
                             String projectName = workHoursStatisticsVO.getProjectName();
                             BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
-                            if (userNickName == name && projectName == currentNickName) {
+                            if (Objects.equals(userNickName, name) && Objects.equals(projectName, currentNickName)) {
                                 workTime.add(userProjectWorkTime);
                                 if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
                                     hasNonZeroWorkTime = true;
@@ -994,13 +1039,15 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
             returnList.add(userWorkTimeVO);
 
 
-            returnList.add(nickName);
-            // 重组返回数据结构
+            List<String> filteredNickName = new ArrayList<>();
+            List<ProjectWorkTimeVO> filteredProjectWorkTime = new ArrayList<>();
+
             for (String name : pmProjectName) {
                 ProjectWorkTimeVO projectWorkTimeVO = new ProjectWorkTimeVO();
                 projectWorkTimeVO.setProjectOrPerson(name);
                 List<BigDecimal> workTime = new ArrayList<>();
                 boolean hasNonZeroWorkTime = false;
+
                 if (userAndProject.isEmpty()) {
                     for (String currentNickName : nickName) {
                         workTime.add(BigDecimal.ZERO);
@@ -1012,7 +1059,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                             String userNickName = workHoursStatisticsVO.getNickName();
                             String projectName = workHoursStatisticsVO.getProjectName();
                             BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
-                            if (projectName == name && userNickName == currentNickName) {
+                            if (projectName.equals(name) && userNickName.equals(currentNickName)) {
                                 workTime.add(userProjectWorkTime);
                                 if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
                                     hasNonZeroWorkTime = true;
@@ -1026,18 +1073,49 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
                         }
                     }
                 }
+
                 // 过滤0工时
                 if (filter != 2 || hasNonZeroWorkTime) {
                     projectWorkTimeVO.setWorkTime(workTime);
-                    projectWorkTime.add(projectWorkTimeVO);
+                    filteredProjectWorkTime.add(projectWorkTimeVO);
                 }
             }
-            returnList.add(projectWorkTime);
+
+            // 过滤 nickName 和 projectWorkTime
+            if (filter == 2) {
+                Set<Integer> nonZeroIndices = new HashSet<>();
+                for (int i = 0; i < nickName.size(); i++) {
+                    BigDecimal totalWorkTime = BigDecimal.ZERO;
+                    for (int j = 0; j < filteredProjectWorkTime.size(); j++) {
+                        totalWorkTime = totalWorkTime.add(filteredProjectWorkTime.get(j).getWorkTime().get(i));
+                    }
+                    if (totalWorkTime.compareTo(BigDecimal.ZERO) != 0) {
+                        filteredNickName.add(nickName.get(i));
+                        nonZeroIndices.add(i);
+                    }
+                }
+                for (int i = filteredProjectWorkTime.size() - 1; i >= 0; i--) {
+                    List<BigDecimal> workTime = filteredProjectWorkTime.get(i).getWorkTime();
+                    for (int j = workTime.size() - 1; j >= 0; j--) {
+                        if (!nonZeroIndices.contains(j)) {
+                            workTime.remove(j);
+                        }
+                    }
+                    if (workTime.isEmpty()) {
+                        filteredProjectWorkTime.remove(i);
+                    }
+                }
+            } else {
+                filteredNickName.addAll(nickName);
+            }
+
+            returnList.add(filteredNickName);
+            returnList.add(filteredProjectWorkTime);
         }
         return returnList;
     }
 
-    //回退代码
+    // 回退代码
     @DataScope
     @Override
     public List<Object> workHourStatistic(Long userId, Integer projectId, Integer filter, String startDate, String endDate, Integer workerOrProject) {
@@ -1062,7 +1140,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
         if (userId != null) {
             userIdS.add(userId);
         }
-        List<SysUser> users = userNameList(userIdS);
+        List<SysUser> users = userNameList(userIdS, workerOrProject);
         List<Long> userIds = new ArrayList<>();
         List<String> nickName = new ArrayList<>();
         for (SysUser user : users) {
@@ -1276,7 +1354,7 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
     @Override
     public List<WorkTimeExportVO> workHourStatisticExport(PmWorkHourStatisticRequestVO requestVO) {
         List<Long> userIds = new ArrayList<>();
-        if (Objects.isNull(requestVO.getUserIds()) || requestVO.getUserIds().isEmpty()){
+        if (Objects.isNull(requestVO.getUserIds()) || requestVO.getUserIds().isEmpty()) {
             userIds.add(SecurityUtils.getUserId());
             requestVO.setUserIds(userIds);
         }