feat:优化问题
parent
6504c57330
commit
30e865334a
|
@ -12,7 +12,6 @@ import tech.unissense.pms.common.core.domain.AjaxResult;
|
||||||
import tech.unissense.pms.common.core.page.TableDataInfo;
|
import tech.unissense.pms.common.core.page.TableDataInfo;
|
||||||
import tech.unissense.pms.common.enums.BusinessType;
|
import tech.unissense.pms.common.enums.BusinessType;
|
||||||
import tech.unissense.pms.common.utils.uuid.IdUtils;
|
import tech.unissense.pms.common.utils.uuid.IdUtils;
|
||||||
import tech.unissense.pms.common.utils.uuid.UUID;
|
|
||||||
import tech.unissense.pms.business.project.domain.Project;
|
import tech.unissense.pms.business.project.domain.Project;
|
||||||
import tech.unissense.pms.business.project.service.IProjectService;
|
import tech.unissense.pms.business.project.service.IProjectService;
|
||||||
|
|
||||||
|
@ -59,6 +58,16 @@ public class ProjectController extends BaseController
|
||||||
* 新增数据
|
* 新增数据
|
||||||
*/
|
*/
|
||||||
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
|
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
|
||||||
|
@PostMapping("/updateCheck")
|
||||||
|
public AjaxResult updateCheck(@RequestBody Project project)
|
||||||
|
{
|
||||||
|
|
||||||
|
return AjaxResult.success(service.updateCheck(project));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* 新增数据
|
||||||
|
*/
|
||||||
|
// @PreAuthorize("@ss.hasPermi('system:dept:list')")
|
||||||
@PutMapping("/update")
|
@PutMapping("/update")
|
||||||
@Log(title = "项目管理", businessType = BusinessType.UPDATE)
|
@Log(title = "项目管理", businessType = BusinessType.UPDATE)
|
||||||
public AjaxResult updateDate(@RequestBody Project project)
|
public AjaxResult updateDate(@RequestBody Project project)
|
||||||
|
@ -114,6 +123,7 @@ public class ProjectController extends BaseController
|
||||||
@GetMapping("/{projectId}")
|
@GetMapping("/{projectId}")
|
||||||
public AjaxResult getTeamInfo(@PathVariable Integer projectId)
|
public AjaxResult getTeamInfo(@PathVariable Integer projectId)
|
||||||
{
|
{
|
||||||
|
|
||||||
return success(service.getTeamInfo(projectId));
|
return success(service.getTeamInfo(projectId));
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -66,4 +66,6 @@ public interface IProjectService {
|
||||||
|
|
||||||
|
|
||||||
ProjectWorkInfoVo workInfo(ProjectQueryDto project);
|
ProjectWorkInfoVo workInfo(ProjectQueryDto project);
|
||||||
|
|
||||||
|
Boolean updateCheck(Project project);
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import tech.unissense.pms.business.project.vo.ProjectExecutionVo;
|
||||||
import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo;
|
import tech.unissense.pms.business.project.vo.ProjectWorkInfoVo;
|
||||||
import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
|
import tech.unissense.pms.business.projectteam.domain.ProjectTeam;
|
||||||
import tech.unissense.pms.business.projectteam.service.IProjectTeamService;
|
import tech.unissense.pms.business.projectteam.service.IProjectTeamService;
|
||||||
|
|
||||||
import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo;
|
import tech.unissense.pms.business.projectteam.vo.TeamStaticsVo;
|
||||||
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
|
import tech.unissense.pms.business.work.logger.domain.WorkLogger;
|
||||||
import tech.unissense.pms.business.work.logger.service.IWorkLoggerService;
|
import tech.unissense.pms.business.work.logger.service.IWorkLoggerService;
|
||||||
|
@ -55,6 +56,8 @@ public class ProjectServiceImpl implements IProjectService {
|
||||||
private static final ConcurrentHashMap<String, AtomicInteger> DAILY_SEQUENCE_MAP = new ConcurrentHashMap<>();
|
private static final ConcurrentHashMap<String, AtomicInteger> DAILY_SEQUENCE_MAP = new ConcurrentHashMap<>();
|
||||||
@Autowired
|
@Autowired
|
||||||
private RedisCache redisCache;
|
private RedisCache redisCache;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过ID查询单条数据
|
* 通过ID查询单条数据
|
||||||
*
|
*
|
||||||
|
@ -214,9 +217,9 @@ public class ProjectServiceImpl implements IProjectService {
|
||||||
ProjectTeam projectTeam = new ProjectTeam();
|
ProjectTeam projectTeam = new ProjectTeam();
|
||||||
projectTeam.setProjectId(projectId);
|
projectTeam.setProjectId(projectId);
|
||||||
List<ProjectTeam> projectTeamList = teamService.list(projectTeam);
|
List<ProjectTeam> projectTeamList = teamService.list(projectTeam);
|
||||||
|
Project project = projectMapper.queryById(projectId);
|
||||||
// 获取每个成员的工时统计并转换为Map
|
// 获取每个成员的工时统计并转换为Map
|
||||||
Map<String, BigDecimal> workHourVo = workLoggerService.personStatics(projectId).stream()
|
Map<String, BigDecimal> workHourVo = workLoggerService.personStatics(project).stream()
|
||||||
.collect(Collectors.toMap(StaticsHourVo::getName, StaticsHourVo::getWorkTime, (v1, v2) -> v1));
|
.collect(Collectors.toMap(StaticsHourVo::getName, StaticsHourVo::getWorkTime, (v1, v2) -> v1));
|
||||||
|
|
||||||
// 返回每个成员的工时信息
|
// 返回每个成员的工时信息
|
||||||
|
@ -242,12 +245,19 @@ public class ProjectServiceImpl implements IProjectService {
|
||||||
projectQueryDto.setQueryUserId(Long.valueOf(workLogger.getUserId()));
|
projectQueryDto.setQueryUserId(Long.valueOf(workLogger.getUserId()));
|
||||||
}
|
}
|
||||||
List<Project> projects = this.permissisonList(projectQueryDto);
|
List<Project> projects = this.permissisonList(projectQueryDto);
|
||||||
workLogger.setProjectIdList(projects.stream()
|
List<Integer> projectIdList = projects.stream()
|
||||||
.map(Project::getProjectId)
|
.map(Project::getProjectId)
|
||||||
.collect(Collectors.toList()));
|
.collect(Collectors.toList());
|
||||||
|
ProjectTeam projectTeam = new ProjectTeam();
|
||||||
|
projectTeam.setProjectIdList(projectIdList);
|
||||||
|
Set<String> teamSet = teamService.list(projectTeam).stream()
|
||||||
|
.map(item -> item.getProjectId() + "_" + item.getUserId())
|
||||||
|
.collect(Collectors.toSet());
|
||||||
|
|
||||||
List<WorkLogger> workLoggers = workLoggerService.list(workLogger);
|
workLogger.setProjectIdList(projectIdList);
|
||||||
Map<String, BigDecimal> workTimeMap = workLoggers.stream()
|
|
||||||
|
Map<String, BigDecimal> workTimeMap = workLoggerService.list(workLogger).stream()
|
||||||
|
.filter(item -> teamSet.contains(item.getProjectId() + "_" + item.getUserId()))
|
||||||
.collect(Collectors.toMap(
|
.collect(Collectors.toMap(
|
||||||
item -> item.getProjectId() + "_" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()),
|
item -> item.getProjectId() + "_" + DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, item.getLoggerDate()),
|
||||||
item -> new BigDecimal(item.getWorkTime()),
|
item -> new BigDecimal(item.getWorkTime()),
|
||||||
|
@ -259,7 +269,13 @@ public class ProjectServiceImpl implements IProjectService {
|
||||||
return projects.stream().map(project -> {
|
return projects.stream().map(project -> {
|
||||||
List<BigDecimal> tempList = Stream.iterate(startDate, date -> date.plusDays(1))
|
List<BigDecimal> tempList = Stream.iterate(startDate, date -> date.plusDays(1))
|
||||||
.limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
|
.limit(ChronoUnit.DAYS.between(startDate, endDate) + 1)
|
||||||
.map(localDate -> workTimeMap.getOrDefault(project.getProjectId() + "_" + localDate, BigDecimal.ZERO))
|
.map(localDate -> {
|
||||||
|
if (localDate.isAfter(project.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate()) ||
|
||||||
|
localDate.isBefore(project.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate())) {
|
||||||
|
return BigDecimal.ZERO;
|
||||||
|
}
|
||||||
|
return workTimeMap.getOrDefault(project.getProjectId() + "_" + localDate, BigDecimal.ZERO);
|
||||||
|
})
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
ProjectExecutionVo vo = new ProjectExecutionVo();
|
ProjectExecutionVo vo = new ProjectExecutionVo();
|
||||||
|
@ -276,12 +292,14 @@ public class ProjectServiceImpl implements IProjectService {
|
||||||
|
|
||||||
WorkLogger workLogger = new WorkLogger();
|
WorkLogger workLogger = new WorkLogger();
|
||||||
workLogger.setProjectId(projectQueryDto.getProjectId());
|
workLogger.setProjectId(projectQueryDto.getProjectId());
|
||||||
workLogger.setStartDate(projectQueryDto.getStartDate());
|
workLogger.setStartDate(project.getStartDate());
|
||||||
workLogger.setEndDate(projectQueryDto.getEndDate());
|
workLogger.setEndDate(project.getEndDate());
|
||||||
List<WorkLogger> workLoggerList = workLoggerService.listUser(workLogger);
|
List<WorkLogger> workLoggerList = workLoggerService.listUser(workLogger);
|
||||||
|
ProjectTeam projectTeam = new ProjectTeam();
|
||||||
|
projectTeam.setProjectId(projectQueryDto.getProjectId());
|
||||||
|
Set<Integer> projectTeamSet = teamService.list(projectTeam).stream().map(ProjectTeam::getUserId).collect(Collectors.toSet());
|
||||||
// 使用流按日期分组,并对每个日期的工人按用户ID去重,保留最后一次记录
|
// 使用流按日期分组,并对每个日期的工人按用户ID去重,保留最后一次记录
|
||||||
Map<String, List<WorkLogger>> workersByDateMap = workLoggerList.stream()
|
Map<String, List<WorkLogger>> workersByDateMap = workLoggerList.stream().filter(item->projectTeamSet.contains(item.getUserId()))
|
||||||
.collect(Collectors.groupingBy(
|
.collect(Collectors.groupingBy(
|
||||||
logger -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, logger.getLoggerDate()),
|
logger -> DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, logger.getLoggerDate()),
|
||||||
Collectors.collectingAndThen(
|
Collectors.collectingAndThen(
|
||||||
|
@ -294,8 +312,8 @@ public class ProjectServiceImpl implements IProjectService {
|
||||||
)
|
)
|
||||||
));
|
));
|
||||||
|
|
||||||
LocalDate startDate = workLogger.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
LocalDate startDate = projectQueryDto.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
||||||
LocalDate endDate = workLogger.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
LocalDate endDate = projectQueryDto.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
||||||
|
|
||||||
// 生成从开始日期到结束日期的工人列表
|
// 生成从开始日期到结束日期的工人列表
|
||||||
List<List<WorkLogger>> detailList = Stream.iterate(startDate, date -> date.plusDays(1))
|
List<List<WorkLogger>> detailList = Stream.iterate(startDate, date -> date.plusDays(1))
|
||||||
|
@ -308,4 +326,15 @@ public class ProjectServiceImpl implements IProjectService {
|
||||||
vo.setDetailList(detailList);
|
vo.setDetailList(detailList);
|
||||||
return vo;
|
return vo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Boolean updateCheck(Project project) {
|
||||||
|
WorkLogger workLogger = new WorkLogger();
|
||||||
|
workLogger.setProjectId(project.getProjectId());
|
||||||
|
List<WorkLogger> list = workLoggerService.list(workLogger);
|
||||||
|
if (list.stream().anyMatch(item -> item.getLoggerDate().before(project.getStartDate()) || item.getLoggerDate().after(project.getEndDate()))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import lombok.Data;
|
||||||
import tech.unissense.pms.common.core.domain.BaseEntity;
|
import tech.unissense.pms.common.core.domain.BaseEntity;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* (ProjectTeam)实体类
|
* (ProjectTeam)实体类
|
||||||
|
@ -18,6 +19,7 @@ public class ProjectTeam extends BaseEntity {
|
||||||
* 项目id
|
* 项目id
|
||||||
*/
|
*/
|
||||||
private Integer projectId;
|
private Integer projectId;
|
||||||
|
private List<Integer> projectIdList;
|
||||||
/**
|
/**
|
||||||
* 组成员id
|
* 组成员id
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -61,7 +61,7 @@ public interface IWorkLoggerService {
|
||||||
List<CalendarVo> calendar(WorkLogger workLogger);
|
List<CalendarVo> calendar(WorkLogger workLogger);
|
||||||
|
|
||||||
List<StaticsHourVo> projectStatics(List<Project> projects, String workHour);
|
List<StaticsHourVo> projectStatics(List<Project> projects, String workHour);
|
||||||
List<StaticsHourVo> personStatics(Integer projectId);
|
List<StaticsHourVo> personStatics(Project project);
|
||||||
|
|
||||||
List<WorkLogger> listUser(WorkLogger workLogger);
|
List<WorkLogger> listUser(WorkLogger workLogger);
|
||||||
|
|
||||||
|
|
|
@ -126,17 +126,24 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService {
|
||||||
List<Integer> projectIds = projects.stream()
|
List<Integer> projectIds = projects.stream()
|
||||||
.map(Project::getProjectId)
|
.map(Project::getProjectId)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
|
// 创建一个Map用于快速查找项目的开始和结束日期
|
||||||
|
Map<Integer, Project> projectMap = projects.stream()
|
||||||
|
.collect(Collectors.toMap(Project::getProjectId, project -> project));
|
||||||
// 创建WorkHour对象并设置查询条件
|
// 创建WorkHour对象并设置查询条件
|
||||||
WorkLogger workLogger = new WorkLogger();
|
WorkLogger workLogger = new WorkLogger();
|
||||||
workLogger.setProjectIdList(projectIds);
|
workLogger.setProjectIdList(projectIds);
|
||||||
workLogger.setCreateBy(userId);
|
workLogger.setCreateBy(userId);
|
||||||
|
|
||||||
// 查询与项目ID和用户ID相关的工时记录
|
// 查询与项目ID和用户ID相关的工时记录
|
||||||
List<WorkLogger> list = workLoggerMapper.list(workLogger);
|
List<WorkLogger> list = workLoggerMapper.list(workLogger);
|
||||||
|
|
||||||
// 按项目ID汇总工时
|
// 按项目ID汇总工时
|
||||||
Map<Integer, BigDecimal> workHourMap = list.stream()
|
Map<Integer, BigDecimal> workHourMap = list.stream().filter(item -> {
|
||||||
|
Project project = projectMap.get(item.getProjectId());
|
||||||
|
if (project == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return !item.getLoggerDate().before(project.getStartDate()) && !item.getLoggerDate().after(project.getEndDate());
|
||||||
|
})
|
||||||
.collect(Collectors.toMap(
|
.collect(Collectors.toMap(
|
||||||
WorkLogger::getProjectId,
|
WorkLogger::getProjectId,
|
||||||
item->new BigDecimal(item.getWorkTime()),
|
item->new BigDecimal(item.getWorkTime()),
|
||||||
|
@ -148,11 +155,13 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<StaticsHourVo> personStatics(Integer projectId) {
|
public List<StaticsHourVo> personStatics(Project project) {
|
||||||
// 创建WorkHour对象并设置查询条件
|
// 创建WorkHour对象并设置查询条件
|
||||||
WorkLogger workLogger = new WorkLogger();
|
|
||||||
workLogger.setProjectId(projectId);
|
|
||||||
|
|
||||||
|
WorkLogger workLogger = new WorkLogger();
|
||||||
|
workLogger.setProjectId(project.getProjectId());
|
||||||
|
workLogger.setStartDate(project.getStartDate());
|
||||||
|
workLogger.setEndDate(project.getEndDate());
|
||||||
// 查询与项目ID相关的工时记录
|
// 查询与项目ID相关的工时记录
|
||||||
List<WorkLogger> workLoggers = workLoggerMapper.list(workLogger);
|
List<WorkLogger> workLoggers = workLoggerMapper.list(workLogger);
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,13 @@
|
||||||
<if test="projectId != null">
|
<if test="projectId != null">
|
||||||
and project_id = #{projectId}
|
and project_id = #{projectId}
|
||||||
</if>
|
</if>
|
||||||
|
<if test="projectIdList != null and projectIdList.size>0">
|
||||||
|
and project_id in
|
||||||
|
<foreach collection="projectIdList" item="item" open="(" close=")" separator=",">
|
||||||
|
#{item}
|
||||||
|
</foreach>
|
||||||
|
|
||||||
|
</if>
|
||||||
<if test="teamId != null">
|
<if test="teamId != null">
|
||||||
and team_id = #{teamId}
|
and team_id = #{teamId}
|
||||||
</if>
|
</if>
|
||||||
|
|
Loading…
Reference in New Issue