Commit fb43d1c4 authored by nie'hong's avatar nie'hong

完成项目统计报表

parent 871f62ba
......@@ -34,6 +34,9 @@ public interface WorkProjectTimeCostMapper {
*/
List<ProjectStatisticsByMonth> selectListByMonth(@Param("year") Integer year,@Param("deptId") Integer deptId,@Param("projectId") Integer projectId);
List<ProjectStatisticsByMonth> selectListStatistics(@Param("year") Integer year,@Param("deptId") Integer deptId,@Param("projectId") Integer projectId);
/**
* 删除月份大于参数的统计数据
* @return
......
......@@ -107,6 +107,20 @@
<select id="selectListByMonth" resultMap="projectStatisticsByMonth">
select '合计' AS project_name, group_CONCAT(DISTINCT YEAR (statistics_start),'年',MONTH (statistics_start),'月') AS date,sum(total_time) AS total_time, sum(cost) AS cost
from work_project_time_cost ptc join work_project p on ptc.project_id = p.id join work_dept d on ptc.dept_id = d.id
<where>
<if test="projectId != null ">
ptc.project_id = #{projectId}
</if>
<if test="deptId != null">
AND p.dept_id = #{deptId} AND year(statistics_start) = #{year}
</if>
</where>
group by year(statistics_start),MONTH(statistics_start)
</select>
<select id="selectListStatistics" resultMap="projectStatisticsByMonth">
select ptc.project_id AS project_id, project_name,
group_CONCAT(DISTINCT YEAR (statistics_start),'年',MONTH (statistics_start),'月') AS date,
sum(total_time) AS total_time, sum(cost) AS cost <if test="projectId != null "> ,d.dept_name AS dept_name</if>
......@@ -119,6 +133,7 @@
AND p.dept_id = #{deptId} AND year(statistics_start) = #{year}
</if>
</where>
group by ptc.project_id,project_name,year(statistics_start),MONTH(statistics_start) <if test="projectId != null "> ,ptc.dept_id</if>
group by ptc.project_id,project_name,year(statistics_start),MONTH(statistics_start) <if test="projectId != null "> ,d.dept_name</if>
</select>
</mapper>
\ No newline at end of file
......@@ -297,9 +297,7 @@
<select id="getUserProjectWorkTimeStatistics" resultMap="userWorkTimeStatisticsByProject">
SELECT u.id AS user_id ,u.`name` AS user_name, t.project_id AS project_id
,case t.type when 1 then '项目' when 2 then '商机' when 5 then '外部商务、技术交流' when 6 then '内部培训、技术准备、管理' when 7 then '其他非项目/商机工作' end AS project_type
,p.project_name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,SUM(t.work_time) AS work_time
SELECT u.id AS user_id, u.`name` AS user_name, t.project_id AS project_id, t.type AS project_type, p.project_name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,SUM(t.work_time) AS work_time
from work_time_order t left join work_project p on t.project_id = p.id join work_user u on t.user_id = u.id
where
t.status in (2,5) AND
......@@ -319,8 +317,7 @@
GROUP BY u.id,u.`name`,t.project_id,t.type,p.project_name, t.is_overtime
<if test="userIds != null">
UNION
SELECT u.id AS user_id ,u.`name` AS user_name, t.project_id AS project_id
,case t.type when 1 then '项目' when 2 then '商机' when 5 then '外部商务、技术交流' when 6 then '内部培训、技术准备、管理' when 7 then '其他非项目/商机工作' end AS project_type
SELECT u.id AS user_id ,u.`name` AS user_name, t.project_id AS project_id,t.type AS project_type
,p.project_name AS project_name, case t.is_overtime when 1 then '加班' ELSE '正常' end AS is_overtime,SUM(t.work_time) AS work_time
from work_time_order t left join work_project p on t.project_id = p.id join work_user u on t.user_id = u.id
where
......
......@@ -23,7 +23,13 @@ public class ProjectWorkTimeAndType{
* 项目类型
*/
@ApiModelProperty(name = "projectType", value = "项目类型")
private String projectType;
private Integer projectType;
/**
* 项目类型
*/
@ApiModelProperty(name = "projectTypeName", value = "项目类型名称")
private String projectTypeName;
/**
* 是否加班
......
......@@ -476,7 +476,9 @@ public class StatisticsServiceImpl implements StatisticsService {
}
// 默认统计截至时间为前一天
if (StringUtil.isEmpty(endDate)) {
endDate = DateUtil.convertDateToYMDStr(new Date());
Date date = new Date();
Date yesterday = DateUtil.add(date, Calendar.DAY_OF_MONTH, -1);
endDate = DateUtil.convertDateToYMDStr(yesterday);
}
// 获取用户负责项目主键集合
List<WorkProject> userManageProjects = workProjectService.getUserManageProjects(userId);
......@@ -502,7 +504,7 @@ public class StatisticsServiceImpl implements StatisticsService {
projectWorkTimeAndTypes.add(projectWorkTimeAndType);
}
// 添加表头:外部商务/技术交流、内部培训/技术准备/管理、其他非项目/商机工作
List<ProjectWorkTimeAndType> projectWorkTimeAndTypeListByType = createProjectWorkTimeAndTypeListByType();
List<ProjectWorkTimeAndType> projectWorkTimeAndTypeListByType = this.createProjectWorkTimeAndTypeListByType();
projectWorkTimeAndTypes.addAll(projectWorkTimeAndTypeListByType);
// 管理项目组成人员主键,如果用户仅为项目级别管理人员,则为空
......@@ -514,19 +516,23 @@ public class StatisticsServiceImpl implements StatisticsService {
// 查询人员项目工时统计
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, status, projectIds, userIds);
// 工单类型
List<WorkType> types = workTypeMapper.getAll();
// 取出单人的项目工时统计
for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userProjectWorkTimeStatistics) {
int totalTime = 0;
List<ProjectWorkTimeAndType> projectWorkTimeAndType1 = userProjectWorkTimeStatistic.getProjectWorkTimeAndType();
// 遍历一个人所有项目统计,计算所有项目所有工时总和
for (ProjectWorkTimeAndType projectWorkTimeAndType : projectWorkTimeAndType1) {
projectWorkTimeAndType.setProjectTypeName(types.get(projectWorkTimeAndType.getProjectType()).getName());
totalTime += projectWorkTimeAndType.getWorkTime();
// 计算项目的所有人员工时总和
for (ProjectWorkTimeAndType workTimeAndType : projectWorkTimeAndTypes) {
// 项目统计数据
if (workTimeAndType.getProjectName() != null && workTimeAndType.getProjectName().equals(projectWorkTimeAndType.getProjectName()) && workTimeAndType.getIsOvertime().equals(projectWorkTimeAndType.getIsOvertime())) {
workTimeAndType.setWorkTime(workTimeAndType.getWorkTime() + projectWorkTimeAndType.getWorkTime());
} else if (workTimeAndType.getProjectType() != null && workTimeAndType.getProjectType().equals(projectWorkTimeAndType.getProjectType()) && workTimeAndType.getIsOvertime().equals(projectWorkTimeAndType.getIsOvertime())) {
} else if (workTimeAndType.getProjectTypeName() != null && workTimeAndType.getProjectTypeName().equals(projectWorkTimeAndType.getProjectTypeName()) && workTimeAndType.getIsOvertime().equals(projectWorkTimeAndType.getIsOvertime())) {
workTimeAndType.setWorkTime(workTimeAndType.getWorkTime() + projectWorkTimeAndType.getWorkTime());
}
}
......@@ -538,6 +544,13 @@ public class StatisticsServiceImpl implements StatisticsService {
userWorkTimeStatisticsByProjects.add(userWorkTimeStatisticsByProject);
// 将项目名称集合与人员工时统计封装在一起
userWorkTimeStatisticsByProjects.addAll(userProjectWorkTimeStatistics);
// 合计所有项目合计中的总工时
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject1 = userWorkTimeStatisticsByProjects.get(0);
Integer workTime = 0;
for (ProjectWorkTimeAndType projectWorkTimeAndType : userWorkTimeStatisticsByProject1.getProjectWorkTimeAndType()) {
workTime += projectWorkTimeAndType.getWorkTime();
}
userWorkTimeStatisticsByProject1.setTotalTime(workTime);
return userWorkTimeStatisticsByProjects;
}
......@@ -558,61 +571,35 @@ public class StatisticsServiceImpl implements StatisticsService {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
}
// 部门主键参数不为空,查询部门下所有项目统计信息。部门主键为空时,查询项目编号参数为主键的项目统计信息
// 部门为空,查询某个项目的全周期统计,不为空,查询部门在某年的全部项目按月总计信息
List<ProjectStatisticsByMonth> projectStatisticsByMonths = workProjectTimeCostMapper.selectListByMonth(year, deptId, projectId);
if (CollectionUtil.isEmpty(projectStatisticsByMonths)) {
return null;
}
// 部门主键不为空时,日期格式只有某月。为空时,日期格式为某年统计的第一个月为某年某月,其余为某月
this.conversionDateFormat(projectStatisticsByMonths, deptId);
List<ProjectStatisticsByMonth> projectStatisticsByMonths1 = workProjectTimeCostMapper.selectListStatistics(year, deptId, projectId);
// 将查询结果封装在一起
projectStatisticsByMonths.addAll(projectStatisticsByMonths1);
// 计算合计,存放所有项目所有月份合计
ProjectStatisticsByMonth projectStatisticsByMonthTotal = new ProjectStatisticsByMonth();
List<ProjectStatisticsByMonth.StatisticsDateAndWorkTime> statisticsDateAndWorkTimeList = new ArrayList<>(13);
// 设置合计时间1到12月和项目合计
for (int i = 1; i <= 12; i++) {
ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime = this.createStatisticsDateAndWorkTime(i + "月");
statisticsDateAndWorkTimeList.add(statisticsDateAndWorkTime);
}
ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime1 = this.createStatisticsDateAndWorkTime("项目合计");
statisticsDateAndWorkTimeList.add(statisticsDateAndWorkTime1);
// 遍历所有项目的统计
// 计算项目工时和成本合计
for (ProjectStatisticsByMonth projectStatisticsByMonth : projectStatisticsByMonths) {
// 一个项目统计中的所有月份工时和成本信息
// 一条统计的
List<ProjectStatisticsByMonth.StatisticsDateAndWorkTime> statisticsDateAndWorkTimes = projectStatisticsByMonth.getStatisticsDateAndWorkTimes();
// 项目合计对象
ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime1 = new ProjectStatisticsByMonth.StatisticsDateAndWorkTime();
statisticsDateAndWorkTime1.setDate("项目合计");
BigDecimal totalTime = new BigDecimal("0.00");
BigDecimal cost = new BigDecimal("0.00");
for (ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTimes : projectStatisticsByMonth.getStatisticsDateAndWorkTimes()) {
// 某月的所有项目的工时统计,查询某个项目全声明周期数据时不统计
if (deptId != null) {
for (ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime : statisticsDateAndWorkTimeList) {
if (statisticsDateAndWorkTime.getDate().equals(statisticsDateAndWorkTimes.getDate())) {
statisticsDateAndWorkTime.setCost(statisticsDateAndWorkTime.getCost().add(statisticsDateAndWorkTimes.getCost()));
statisticsDateAndWorkTime.setTotalTime(statisticsDateAndWorkTime.getTotalTime().add(statisticsDateAndWorkTimes.getTotalTime()));
}
}
}
cost = cost.add(statisticsDateAndWorkTimes.getCost());
totalTime = totalTime.add(statisticsDateAndWorkTimes.getTotalTime());
}
// 所有项目的所有月的合计,
for (ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime : statisticsDateAndWorkTimeList) {
ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime2 = statisticsDateAndWorkTimeList.get(statisticsDateAndWorkTimeList.size() - 1);
statisticsDateAndWorkTime2.setTotalTime(statisticsDateAndWorkTime2.getTotalTime().add(statisticsDateAndWorkTime.getTotalTime()));
statisticsDateAndWorkTime2.setCost(statisticsDateAndWorkTime2.getCost().add(statisticsDateAndWorkTime.getCost()));
}
ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime = new ProjectStatisticsByMonth.StatisticsDateAndWorkTime();
statisticsDateAndWorkTime.setDate("项目合计");
statisticsDateAndWorkTime.setCost(cost);
statisticsDateAndWorkTime.setTotalTime(totalTime);
// 将统计的结果放在一个项目统计集合的末尾
projectStatisticsByMonth.getStatisticsDateAndWorkTimes().add(statisticsDateAndWorkTime);
// 统计项目工时和成本
for (ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime : statisticsDateAndWorkTimes) {
totalTime = totalTime.add(statisticsDateAndWorkTime.getTotalTime());
cost = cost.add(statisticsDateAndWorkTime.getCost());
}
if (deptId != null) {
projectStatisticsByMonthTotal.setStatisticsDateAndWorkTimes(statisticsDateAndWorkTimeList);
projectStatisticsByMonthTotal.setProjectName("合计");
projectStatisticsByMonths.add(projectStatisticsByMonthTotal);
// 项目合计对象赋值
statisticsDateAndWorkTime1.setTotalTime(totalTime);
statisticsDateAndWorkTime1.setCost(cost);
statisticsDateAndWorkTimes.add(statisticsDateAndWorkTime1);
}
return projectStatisticsByMonths;
......@@ -712,19 +699,19 @@ public class StatisticsServiceImpl implements StatisticsService {
ProjectWorkTimeAndType timeAndType;
List<WorkType> workTypes = workTypeMapper.getAll();
// 外部商务、技术交流
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "正常");
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(4).getName(), "正常");
list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "加班");
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(4).getName(), "加班");
list.add(timeAndType);
// 内部培训、技术准备、管理
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "正常");
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "正常");
list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "加班");
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "加班");
list.add(timeAndType);
// 其他非项目/商机工作
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(7).getName(), "正常");
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "正常");
list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(7).getName(), "加班");
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "加班");
list.add(timeAndType);
return list;
}
......@@ -732,7 +719,7 @@ public class StatisticsServiceImpl implements StatisticsService {
// 根据类型生成ProjectWorkTimeAndType对象
public ProjectWorkTimeAndType createProjectWorkTimeAndTypeByType(String type, String isOvertime) {
ProjectWorkTimeAndType projectWorkTimeAndType = new ProjectWorkTimeAndType();
projectWorkTimeAndType.setProjectType(type);
projectWorkTimeAndType.setProjectTypeName(type);
projectWorkTimeAndType.setIsOvertime(isOvertime);
projectWorkTimeAndType.setWorkTime(0);
return projectWorkTimeAndType;
......@@ -775,16 +762,4 @@ public class StatisticsServiceImpl implements StatisticsService {
}
}
}
// public void adjust(List<MonthlyWorkingHoursStatistics> monthlyWorkingHoursStatistics, List<WorkType> workTypes) {
// for (Integer integer : TYPE_ORDER) {
// int i = 0;
// MonthlyWorkingHoursStatistics workingHoursStatistics = monthlyWorkingHoursStatistics.get(i);
// if (!workingHoursStatistics.getProjectType().equals(workTypes.get(integer))) {
// monthlyWorkingHoursStatistics.
// }
// i++;
// }
//
// }
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment