feat(project): 增加项目执行信息查询功能

- 新增 ProjectQueryDto 类用于项目执行信息查询参数
- 修改 IProjectService 接口,增加 executionInfo 方法
- 实现 ProjectServiceImpl 中的 executionInfo 方法,支持按用户和日期筛选
- 更新 ProjectMapper.xml,移除项目状态的复杂查询逻辑
- 在 WorkLoggerServiceImpl 中为 CalendarVo 添加工作时间字段
dev_1.0.0
chenhao 2024-11-06 11:31:15 +08:00
parent f9b4b3d49d
commit dc09c7f5e0
9 changed files with 50 additions and 23 deletions

View File

@ -137,8 +137,8 @@ public class ProjectController extends BaseController {
*/
// @PreAuthorize("@ss.hasPermi('system:dept:remove')")
@PostMapping("/executionInfo")
public AjaxResult executionInfo(@RequestBody WorkLogger workLogger) {
return success(service.executionInfo(workLogger));
public AjaxResult executionInfo(@RequestBody ProjectQueryDto queryDto) {
return success(service.executionInfo(queryDto));
}
/**

View File

@ -56,7 +56,9 @@ public class Project extends BaseEntity {
private String state;
/**
* 0- 1- 2-
*
*/
@Deprecated
private String dataState;
/**
* 0- 1- 2-

View File

@ -22,4 +22,6 @@ public class ProjectQueryDto {
private Integer projectId;
private Date startDate;
private Date endDate;
private Integer userId;
private String projectState;
}

View File

@ -60,10 +60,9 @@ public interface IProjectService {
List<Project> listProjectByUser(String createBy);
List<TeamStaticsVo> getTeamInfo(Integer projectId);
List<ProjectExecutionVo> executionInfo(WorkLogger workLogger);
List<TeamStaticsVo> getTeamInfo(Integer projectId);
List<ProjectExecutionVo> executionInfo(ProjectQueryDto ProjectQueryDto);
ProjectWorkInfoVo workInfo(ProjectQueryDto project);

View File

@ -1,6 +1,7 @@
package tech.unissense.pms.business.project.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -73,6 +74,7 @@ public class ProjectServiceImpl implements IProjectService {
* @param project
* @return
*/
@Override
public List<Project> permissisonList(Project project) {
dataPermissions(project);
List<Project> list = this.projectMapper.list(project);
@ -243,11 +245,14 @@ public class ProjectServiceImpl implements IProjectService {
}
@Override
public List<ProjectExecutionVo> executionInfo(WorkLogger workLogger) {
public List<ProjectExecutionVo> executionInfo(ProjectQueryDto queryDto) {
Project projectQueryDto = new Project();
if (workLogger.getUserId() != null) {
projectQueryDto.setQueryUserId(Long.valueOf(workLogger.getUserId()));
if (queryDto.getUserId() != null) {
projectQueryDto.setQueryUserId(Long.valueOf(queryDto.getUserId()));
}
if (queryDto.getProjectState() != null) {
projectQueryDto.setProjectState(queryDto.getProjectState());
}
List<Project> projects = this.permissisonList(projectQueryDto);
List<Integer> projectIdList = projects.stream()
@ -259,9 +264,23 @@ public class ProjectServiceImpl implements IProjectService {
.map(item -> item.getProjectId() + "_" + item.getUserId())
.collect(Collectors.toSet());
WorkLogger workLogger = new WorkLogger();
workLogger.setProjectIdList(projectIdList);
List<WorkLogger> allWorkLoggerList = workLoggerService.list(workLogger);
Map<Integer, BigDecimal> workTimeAllMap = allWorkLoggerList.stream().filter(item-> StrUtil.isNotEmpty(item.getWorkTime())).collect(Collectors.groupingBy(WorkLogger::getProjectId, Collectors.reducing(BigDecimal.ZERO
, item -> new BigDecimal(item.getWorkTime()), BigDecimal::add)));
// BeanUtils.copyBeanProp(workLogger,queryDto);
Map<String, BigDecimal> workTimeMap = workLoggerService.list(workLogger).stream()
List<WorkLogger> workLoggerList = allWorkLoggerList.stream()
.filter(item -> {
Date date = item.getLoggerDate();
Integer userId = item.getUserId();
return (date != null && !date.before(queryDto.getStartDate()) && !date.after(queryDto.getEndDate())) &&
(queryDto.getUserId() != null && queryDto.getUserId().equals(userId));
})
.collect(Collectors.toList());
Map<String, BigDecimal> workTimeMap = workLoggerList.stream()
.filter(item -> teamSet.contains(item.getProjectId() + "_" + item.getUserId()))
.collect(Collectors.toMap(
item -> item.getProjectId() + "_"
@ -269,8 +288,8 @@ public class ProjectServiceImpl implements IProjectService {
item -> new BigDecimal(item.getWorkTime()),
BigDecimal::add));
LocalDate startDate = workLogger.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = workLogger.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate startDate = queryDto.getStartDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endDate = queryDto.getEndDate().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
return projects.stream().map(project -> {
List<BigDecimal> tempList = Stream.iterate(startDate, date -> date.plusDays(1))
@ -290,6 +309,7 @@ public class ProjectServiceImpl implements IProjectService {
BeanUtils.copyBeanProp(vo, project);
vo.setDetailList(tempList);
vo.setAllWorkTime(tempList.stream().reduce(BigDecimal.ZERO, BigDecimal::add));
vo.setAllDateWorkTime(workTimeAllMap.getOrDefault(project.getProjectId(), BigDecimal.ZERO));
return vo;
}).collect(Collectors.toList());
}

View File

@ -25,5 +25,6 @@ public class ProjectExecutionVo {
private String projectState;
private Integer budgetDate;
private BigDecimal allWorkTime;
private BigDecimal allDateWorkTime;
private List<BigDecimal> detailList;
}

View File

@ -116,6 +116,7 @@ public class WorkLoggerServiceImpl implements IWorkLoggerService {
WorkLogger temp = calendarMap.get(key);
calendarVo.setDate(DateUtils.toDate(localDate));
calendarVo.setState(temp != null ? temp.getState() : "-1");
calendarVo.setWorkTime(temp != null ? temp.getWorkTime() : "0");
result.add(calendarVo);
}

View File

@ -2,6 +2,7 @@ package tech.unissense.pms.business.work.logger.vo;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
@ -22,4 +23,5 @@ public class CalendarVo {
private Date date;
private String state;
private String workTime;
}

View File

@ -99,18 +99,18 @@
and t1.state = #{state}
</if>
<if test="projectState != null and projectState != ''">
<!-- and t1.project_state = #{projectState} -->
<choose>
<when test="projectState=='0'.toString()">
and t1.start_date <![CDATA[ > ]]> sysdate()
</when>
<when test="projectState=='1'.toString()">
and sysdate() between t1.start_date and t1.end_date
</when>
<when test="projectState=='2'.toString()">
and t1.end_date <![CDATA[ < ]]> sysdate()
</when>
</choose>
and t1.project_state = #{projectState}
<!-- <choose>-->
<!-- <when test="projectState=='0'.toString()">-->
<!-- and t1.start_date <![CDATA[ > ]]> sysdate()-->
<!-- </when>-->
<!-- <when test="projectState=='1'.toString()">-->
<!-- and sysdate() between t1.start_date and t1.end_date-->
<!-- </when>-->
<!-- <when test="projectState=='2'.toString()">-->
<!-- and t1.end_date <![CDATA[ < ]]> sysdate()-->
<!-- </when>-->
<!-- </choose>-->
</if>
<if test="createBy != null">
and t1.create_by = #{createBy}