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

完成项目统计报表

parent 871f62ba
...@@ -34,6 +34,9 @@ public interface WorkProjectTimeCostMapper { ...@@ -34,6 +34,9 @@ public interface WorkProjectTimeCostMapper {
*/ */
List<ProjectStatisticsByMonth> selectListByMonth(@Param("year") Integer year,@Param("deptId") Integer deptId,@Param("projectId") Integer projectId); 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 * @return
......
...@@ -107,6 +107,20 @@ ...@@ -107,6 +107,20 @@
<select id="selectListByMonth" resultMap="projectStatisticsByMonth"> <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, select ptc.project_id AS project_id, project_name,
group_CONCAT(DISTINCT YEAR (statistics_start),'年',MONTH (statistics_start),'月') AS date, 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> 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 @@ ...@@ -119,6 +133,7 @@
AND p.dept_id = #{deptId} AND year(statistics_start) = #{year} AND p.dept_id = #{deptId} AND year(statistics_start) = #{year}
</if> </if>
</where> </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> </select>
</mapper> </mapper>
\ No newline at end of file
...@@ -297,9 +297,7 @@ ...@@ -297,9 +297,7 @@
<select id="getUserProjectWorkTimeStatistics" resultMap="userWorkTimeStatisticsByProject"> <select id="getUserProjectWorkTimeStatistics" resultMap="userWorkTimeStatisticsByProject">
SELECT u.id AS user_id ,u.`name` AS user_name, t.project_id AS project_id 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
,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
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 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 where
t.status in (2,5) AND t.status in (2,5) AND
...@@ -319,8 +317,7 @@ ...@@ -319,8 +317,7 @@
GROUP BY u.id,u.`name`,t.project_id,t.type,p.project_name, t.is_overtime GROUP BY u.id,u.`name`,t.project_id,t.type,p.project_name, t.is_overtime
<if test="userIds != null"> <if test="userIds != null">
UNION UNION
SELECT u.id AS user_id ,u.`name` AS user_name, t.project_id AS project_id SELECT u.id AS user_id ,u.`name` AS user_name, t.project_id AS project_id,t.type AS project_type
,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 ,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 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 where
......
...@@ -23,7 +23,13 @@ public class ProjectWorkTimeAndType{ ...@@ -23,7 +23,13 @@ public class ProjectWorkTimeAndType{
* 项目类型 * 项目类型
*/ */
@ApiModelProperty(name = "projectType", value = "项目类型") @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 { ...@@ -476,7 +476,9 @@ public class StatisticsServiceImpl implements StatisticsService {
} }
// 默认统计截至时间为前一天 // 默认统计截至时间为前一天
if (StringUtil.isEmpty(endDate)) { 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); List<WorkProject> userManageProjects = workProjectService.getUserManageProjects(userId);
...@@ -502,7 +504,7 @@ public class StatisticsServiceImpl implements StatisticsService { ...@@ -502,7 +504,7 @@ public class StatisticsServiceImpl implements StatisticsService {
projectWorkTimeAndTypes.add(projectWorkTimeAndType); projectWorkTimeAndTypes.add(projectWorkTimeAndType);
} }
// 添加表头:外部商务/技术交流、内部培训/技术准备/管理、其他非项目/商机工作 // 添加表头:外部商务/技术交流、内部培训/技术准备/管理、其他非项目/商机工作
List<ProjectWorkTimeAndType> projectWorkTimeAndTypeListByType = createProjectWorkTimeAndTypeListByType(); List<ProjectWorkTimeAndType> projectWorkTimeAndTypeListByType = this.createProjectWorkTimeAndTypeListByType();
projectWorkTimeAndTypes.addAll(projectWorkTimeAndTypeListByType); projectWorkTimeAndTypes.addAll(projectWorkTimeAndTypeListByType);
// 管理项目组成人员主键,如果用户仅为项目级别管理人员,则为空 // 管理项目组成人员主键,如果用户仅为项目级别管理人员,则为空
...@@ -514,19 +516,23 @@ public class StatisticsServiceImpl implements StatisticsService { ...@@ -514,19 +516,23 @@ public class StatisticsServiceImpl implements StatisticsService {
// 查询人员项目工时统计 // 查询人员项目工时统计
List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, status, projectIds, userIds); List<UserWorkTimeStatisticsByProject> userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(startDate, endDate, status, projectIds, userIds);
// 工单类型
List<WorkType> types = workTypeMapper.getAll();
// 取出单人的项目工时统计 // 取出单人的项目工时统计
for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userProjectWorkTimeStatistics) { for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userProjectWorkTimeStatistics) {
int totalTime = 0; int totalTime = 0;
List<ProjectWorkTimeAndType> projectWorkTimeAndType1 = userProjectWorkTimeStatistic.getProjectWorkTimeAndType(); List<ProjectWorkTimeAndType> projectWorkTimeAndType1 = userProjectWorkTimeStatistic.getProjectWorkTimeAndType();
// 遍历一个人所有项目统计,计算所有项目所有工时总和 // 遍历一个人所有项目统计,计算所有项目所有工时总和
for (ProjectWorkTimeAndType projectWorkTimeAndType : projectWorkTimeAndType1) { for (ProjectWorkTimeAndType projectWorkTimeAndType : projectWorkTimeAndType1) {
projectWorkTimeAndType.setProjectTypeName(types.get(projectWorkTimeAndType.getProjectType()).getName());
totalTime += projectWorkTimeAndType.getWorkTime(); totalTime += projectWorkTimeAndType.getWorkTime();
// 计算项目的所有人员工时总和 // 计算项目的所有人员工时总和
for (ProjectWorkTimeAndType workTimeAndType : projectWorkTimeAndTypes) { for (ProjectWorkTimeAndType workTimeAndType : projectWorkTimeAndTypes) {
// 项目统计数据 // 项目统计数据
if (workTimeAndType.getProjectName() != null && workTimeAndType.getProjectName().equals(projectWorkTimeAndType.getProjectName()) && workTimeAndType.getIsOvertime().equals(projectWorkTimeAndType.getIsOvertime())) { if (workTimeAndType.getProjectName() != null && workTimeAndType.getProjectName().equals(projectWorkTimeAndType.getProjectName()) && workTimeAndType.getIsOvertime().equals(projectWorkTimeAndType.getIsOvertime())) {
workTimeAndType.setWorkTime(workTimeAndType.getWorkTime() + projectWorkTimeAndType.getWorkTime()); 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()); workTimeAndType.setWorkTime(workTimeAndType.getWorkTime() + projectWorkTimeAndType.getWorkTime());
} }
} }
...@@ -538,6 +544,13 @@ public class StatisticsServiceImpl implements StatisticsService { ...@@ -538,6 +544,13 @@ public class StatisticsServiceImpl implements StatisticsService {
userWorkTimeStatisticsByProjects.add(userWorkTimeStatisticsByProject); userWorkTimeStatisticsByProjects.add(userWorkTimeStatisticsByProject);
// 将项目名称集合与人员工时统计封装在一起 // 将项目名称集合与人员工时统计封装在一起
userWorkTimeStatisticsByProjects.addAll(userProjectWorkTimeStatistics); userWorkTimeStatisticsByProjects.addAll(userProjectWorkTimeStatistics);
// 合计所有项目合计中的总工时
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject1 = userWorkTimeStatisticsByProjects.get(0);
Integer workTime = 0;
for (ProjectWorkTimeAndType projectWorkTimeAndType : userWorkTimeStatisticsByProject1.getProjectWorkTimeAndType()) {
workTime += projectWorkTimeAndType.getWorkTime();
}
userWorkTimeStatisticsByProject1.setTotalTime(workTime);
return userWorkTimeStatisticsByProjects; return userWorkTimeStatisticsByProjects;
} }
...@@ -558,61 +571,35 @@ public class StatisticsServiceImpl implements StatisticsService { ...@@ -558,61 +571,35 @@ public class StatisticsServiceImpl implements StatisticsService {
throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL); throw new BaseCustomException(BASE_RESP_CODE_ENUM.INPUT_PARAM_IS_NULL);
} }
// 部门主键参数不为空,查询部门下所有项目统计信息。部门主键为空时,查询项目编号参数为主键的项目统计信息 // 部门为空,查询某个项目的全周期统计,不为空,查询部门在某年的全部项目按月总计信息
List<ProjectStatisticsByMonth> projectStatisticsByMonths = workProjectTimeCostMapper.selectListByMonth(year, deptId, projectId); List<ProjectStatisticsByMonth> projectStatisticsByMonths = workProjectTimeCostMapper.selectListByMonth(year, deptId, projectId);
if (CollectionUtil.isEmpty(projectStatisticsByMonths)) { if (CollectionUtil.isEmpty(projectStatisticsByMonths)) {
return null; return null;
} }
// 部门主键不为空时,日期格式只有某月。为空时,日期格式为某年统计的第一个月为某年某月,其余为某月 // 部门主键不为空时,日期格式只有某月。为空时,日期格式为某年统计的第一个月为某年某月,其余为某月
this.conversionDateFormat(projectStatisticsByMonths, deptId); 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) { 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 totalTime = new BigDecimal("0.00");
BigDecimal cost = new BigDecimal("0.00"); BigDecimal cost = new BigDecimal("0.00");
for (ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTimes : projectStatisticsByMonth.getStatisticsDateAndWorkTimes()) { // 统计项目工时和成本
// 某月的所有项目的工时统计,查询某个项目全声明周期数据时不统计 for (ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime : statisticsDateAndWorkTimes) {
if (deptId != null) { totalTime = totalTime.add(statisticsDateAndWorkTime.getTotalTime());
for (ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime : statisticsDateAndWorkTimeList) { cost = cost.add(statisticsDateAndWorkTime.getCost());
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(); statisticsDateAndWorkTime1.setTotalTime(totalTime);
statisticsDateAndWorkTime.setDate("项目合计"); statisticsDateAndWorkTime1.setCost(cost);
statisticsDateAndWorkTime.setCost(cost); statisticsDateAndWorkTimes.add(statisticsDateAndWorkTime1);
statisticsDateAndWorkTime.setTotalTime(totalTime);
// 将统计的结果放在一个项目统计集合的末尾
projectStatisticsByMonth.getStatisticsDateAndWorkTimes().add(statisticsDateAndWorkTime);
}
if (deptId != null) {
projectStatisticsByMonthTotal.setStatisticsDateAndWorkTimes(statisticsDateAndWorkTimeList);
projectStatisticsByMonthTotal.setProjectName("合计");
projectStatisticsByMonths.add(projectStatisticsByMonthTotal);
} }
return projectStatisticsByMonths; return projectStatisticsByMonths;
...@@ -712,19 +699,19 @@ public class StatisticsServiceImpl implements StatisticsService { ...@@ -712,19 +699,19 @@ public class StatisticsServiceImpl implements StatisticsService {
ProjectWorkTimeAndType timeAndType; ProjectWorkTimeAndType timeAndType;
List<WorkType> workTypes = workTypeMapper.getAll(); List<WorkType> workTypes = workTypeMapper.getAll();
// 外部商务、技术交流 // 外部商务、技术交流
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "正常"); timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(4).getName(), "正常");
list.add(timeAndType); list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "加班"); timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(4).getName(), "加班");
list.add(timeAndType); list.add(timeAndType);
// 内部培训、技术准备、管理 // 内部培训、技术准备、管理
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "正常"); timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "正常");
list.add(timeAndType); list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "加班"); timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(5).getName(), "加班");
list.add(timeAndType); list.add(timeAndType);
// 其他非项目/商机工作 // 其他非项目/商机工作
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(7).getName(), "正常"); timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "正常");
list.add(timeAndType); list.add(timeAndType);
timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(7).getName(), "加班"); timeAndType = createProjectWorkTimeAndTypeByType(workTypes.get(6).getName(), "加班");
list.add(timeAndType); list.add(timeAndType);
return list; return list;
} }
...@@ -732,7 +719,7 @@ public class StatisticsServiceImpl implements StatisticsService { ...@@ -732,7 +719,7 @@ public class StatisticsServiceImpl implements StatisticsService {
// 根据类型生成ProjectWorkTimeAndType对象 // 根据类型生成ProjectWorkTimeAndType对象
public ProjectWorkTimeAndType createProjectWorkTimeAndTypeByType(String type, String isOvertime) { public ProjectWorkTimeAndType createProjectWorkTimeAndTypeByType(String type, String isOvertime) {
ProjectWorkTimeAndType projectWorkTimeAndType = new ProjectWorkTimeAndType(); ProjectWorkTimeAndType projectWorkTimeAndType = new ProjectWorkTimeAndType();
projectWorkTimeAndType.setProjectType(type); projectWorkTimeAndType.setProjectTypeName(type);
projectWorkTimeAndType.setIsOvertime(isOvertime); projectWorkTimeAndType.setIsOvertime(isOvertime);
projectWorkTimeAndType.setWorkTime(0); projectWorkTimeAndType.setWorkTime(0);
return projectWorkTimeAndType; return projectWorkTimeAndType;
...@@ -775,16 +762,4 @@ public class StatisticsServiceImpl implements StatisticsService { ...@@ -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