|
@@ -1,23 +1,30 @@
|
|
|
package com.usky.iot.service.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.usky.common.security.utils.SecurityUtils;
|
|
|
+import com.usky.iot.domain.PmProject;
|
|
|
import com.usky.iot.domain.PmWorkContent;
|
|
|
import com.usky.iot.domain.PmWorkReport;
|
|
|
+import com.usky.iot.mapper.PmProjectMapper;
|
|
|
import com.usky.iot.mapper.PmWorkContentMapper;
|
|
|
import com.usky.iot.mapper.PmWorkReportMapper;
|
|
|
import com.usky.iot.mapper.SysUserMapper;
|
|
|
import com.usky.iot.service.PmWorkContentService;
|
|
|
import com.usky.common.mybatis.core.AbstractCrudService;
|
|
|
+import com.usky.iot.service.vo.ProjectWorkTimeVO;
|
|
|
+import com.usky.iot.service.vo.UserWorkTimeVO;
|
|
|
+import com.usky.iot.service.vo.WorkHoursStatisticsVO;
|
|
|
import com.usky.system.domain.SysUser;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.time.LocalDate;
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.List;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -36,6 +43,9 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
|
|
|
@Autowired
|
|
|
private SysUserMapper sysUserMapper;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private PmProjectMapper pmProjectMapper;
|
|
|
+
|
|
|
@Override
|
|
|
public void deleteContent(Integer reportId) {
|
|
|
LambdaQueryWrapper<PmWorkContent> deleteWrapper = Wrappers.lambdaQuery();
|
|
@@ -124,4 +134,102 @@ public class PmWorkContentServiceImpl extends AbstractCrudService<PmWorkContentM
|
|
|
}
|
|
|
return reportList;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Object> workHourStatistic(Long userId, Integer filter, String startDate, String endDate, Integer workerOrProject) {
|
|
|
+ List<ProjectWorkTimeVO> projectWorkTime = new ArrayList<>();
|
|
|
+ List<UserWorkTimeVO> userWorkTimeVO = new ArrayList<>();
|
|
|
+ Integer tenantId = SecurityUtils.getTenantId();
|
|
|
+ List<Object> returnList = new ArrayList<>();
|
|
|
+ LocalDate start = LocalDate.parse(startDate);
|
|
|
+ LocalDate end = LocalDate.parse(endDate);
|
|
|
+ //找出租户下所有项目
|
|
|
+ LambdaQueryWrapper<PmProject> projectQuery = Wrappers.lambdaQuery();
|
|
|
+ projectQuery.select(PmProject::getProjectName)
|
|
|
+ .eq(PmProject::getTenantId, SecurityUtils.getTenantId())
|
|
|
+ .orderByAsc(PmProject::getProjectName);
|
|
|
+ List<PmProject> projects = pmProjectMapper.selectList(projectQuery);
|
|
|
+ List<String> pmProjectName = projects.stream()
|
|
|
+ .map(PmProject::getProjectName)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ //统计userId每个项目所需工时
|
|
|
+ List<WorkHoursStatisticsVO> userAndProject = baseMapper.workHoursStatistics(start, end, userId, tenantId);
|
|
|
+ List<String> nickName = userAndProject.stream()
|
|
|
+ .map(WorkHoursStatisticsVO::getNickName)
|
|
|
+ .distinct()
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ if (workerOrProject != 2) {
|
|
|
+ returnList.add(nickName);
|
|
|
+ //重组返回数据结构
|
|
|
+ for (PmProject project : projects) {
|
|
|
+ String name = project.getProjectName();
|
|
|
+ ProjectWorkTimeVO projectWorkTimeVO = new ProjectWorkTimeVO();
|
|
|
+ projectWorkTimeVO.setProjectName(name);
|
|
|
+ List<BigDecimal> workTime = new ArrayList<>();
|
|
|
+ boolean hasNonZeroWorkTime = false;
|
|
|
+ for (String currentNickName : nickName) {
|
|
|
+ boolean foundWorkTime = false;
|
|
|
+ for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProject) {
|
|
|
+ String userNickName = workHoursStatisticsVO.getNickName();
|
|
|
+ String projectName = workHoursStatisticsVO.getProjectName();
|
|
|
+ BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
|
|
|
+ if (projectName.equals(name) && userNickName.equals(currentNickName)) {
|
|
|
+ workTime.add(userProjectWorkTime);
|
|
|
+ if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
+ hasNonZeroWorkTime = true;
|
|
|
+ }
|
|
|
+ foundWorkTime = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!foundWorkTime) {
|
|
|
+ workTime.add(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (filter != 2 || hasNonZeroWorkTime) {
|
|
|
+ projectWorkTimeVO.setWorkTime(workTime);
|
|
|
+ projectWorkTime.add(projectWorkTimeVO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ returnList.add(projectWorkTime);
|
|
|
+ } else {
|
|
|
+ returnList.add(pmProjectName);
|
|
|
+ //重组返回数据结构
|
|
|
+ for (String uName : nickName) {
|
|
|
+ String name = uName;
|
|
|
+ UserWorkTimeVO userWorkTimeVO2 = new UserWorkTimeVO();
|
|
|
+ userWorkTimeVO2.setUserNickName(name);
|
|
|
+ List<BigDecimal> workTime = new ArrayList<>();
|
|
|
+ boolean hasNonZeroWorkTime = false;
|
|
|
+ for (String currentNickName : pmProjectName) {
|
|
|
+ boolean foundWorkTime = false;
|
|
|
+ for (WorkHoursStatisticsVO workHoursStatisticsVO : userAndProject) {
|
|
|
+ String userNickName = workHoursStatisticsVO.getNickName();
|
|
|
+ String projectName = workHoursStatisticsVO.getProjectName();
|
|
|
+ BigDecimal userProjectWorkTime = workHoursStatisticsVO.getWorkTime();
|
|
|
+ if (userNickName.equals(name) && projectName.equals(currentNickName)) {
|
|
|
+ workTime.add(userProjectWorkTime);
|
|
|
+ if (userProjectWorkTime.compareTo(BigDecimal.ZERO) != 0) {
|
|
|
+ hasNonZeroWorkTime = true;
|
|
|
+ }
|
|
|
+ foundWorkTime = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!foundWorkTime) {
|
|
|
+ workTime.add(BigDecimal.ZERO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (filter != 2 || hasNonZeroWorkTime) {
|
|
|
+ userWorkTimeVO2.setWorkTime(workTime);
|
|
|
+ userWorkTimeVO.add(userWorkTimeVO2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ returnList.add(userWorkTimeVO);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return returnList;
|
|
|
+ }
|
|
|
+
|
|
|
}
|