Commit 58170ac7 authored by nie'hong's avatar nie'hong

完善项目工时统计

parent 1898c2b4
......@@ -55,4 +55,11 @@ public interface WorkProjectMapper extends BaseMapper<WorkProject> {
List<Integer> getProjectIdByManager(Integer userId);
List<WorkProject> getListByCentreIdAndIsConclusion(@Param("centreId") Integer centreId,@Param("isConclusion") Integer isConclusion);
/**
* 如果项目为已结项,返回最后一次统计时间的年月。为未结项,返回当前年月
* @param projectId
* @return
*/
String getLastDate(Integer projectId);
}
......@@ -191,7 +191,18 @@
from
<include refid="table"/>
<where>
<include refid="criteria"/>
<if test="isConclusion != null">
AND is_conclusion = #{isConclusion}
</if>
<if test="deptId != null and managerId == null">
AND dept_id = #{deptId}
</if>
<if test="deptId != null and managerId != null">
AND (dept_id = #{deptId} OR manager_id = #{managerId})
</if>
<if test="managerId != null and deptId == null">
AND manager_id = #{managerId}
</if>
</where>
</select>
......@@ -212,5 +223,19 @@
</if>
</select>
<select id="getLastDate" resultType="java.lang.String">
SELECT
CONCAT(YEAR (IF (is_conclusion = 0,max(work_day),now())),
'年',
MONTH (IF (is_conclusion = 0,max(work_day),now())),
'月'
)
FROM
work_project p
JOIN work_time_order t ON p.id = t.project_id
WHERE
p.id = #{projectId}
</select>
</mapper>
......@@ -26,6 +26,8 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
......@@ -565,9 +567,34 @@ public class StatisticsServiceImpl implements StatisticsService {
map.put("managerId", user.getId());
}
// 查询项目
List<WorkProject> projects = workProjectMapper.getListByCriteria(map);
// 所有项目的统计
map.put("isAll", false);
userProjectWorkTimeStatistics = workTimeOrderMapper.getUserProjectWorkTimeStatistics(map);
// 给返回前端的数据补全所有项目
if (CollectionUtil.isNotEmpty(projects)) {
// 如果查询所有项目的统计为空,给集合里添加个元素
if (CollectionUtil.isEmpty(userProjectWorkTimeStatistics)) {
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject = new UserWorkTimeStatisticsByProject();
List<ProjectWorkTimeAndType> projectWorkTimeAndTypes = new ArrayList<>();
userWorkTimeStatisticsByProject.setProjectWorkTimeAndType(projectWorkTimeAndTypes);
userProjectWorkTimeStatistics.add(userWorkTimeStatisticsByProject);
}
// 补全项目
List<Integer> projectIds = userProjectWorkTimeStatistics.get(0).getProjectWorkTimeAndType().stream().map(ProjectWorkTimeAndType::getProjectId).collect(Collectors.toList());
for (WorkProject project : projects) {
if (!projectIds.contains(project.getId())) {
ProjectWorkTimeAndType projectWorkTimeAndType = new ProjectWorkTimeAndType();
projectWorkTimeAndType.setProjectName(project.getProjectName());
projectWorkTimeAndType.setProjectId(project.getId());
projectWorkTimeAndType.setProjectType(project.getType());
projectWorkTimeAndType.setNormalTime(0);
projectWorkTimeAndType.setOverTime(0);
userProjectWorkTimeStatistics.get(0).getProjectWorkTimeAndType().add(projectWorkTimeAndType);
}
}
}
// 所有项目下所有人员的统计
map.replace("isAll", true);
......@@ -592,7 +619,6 @@ public class StatisticsServiceImpl implements StatisticsService {
}
// 部门级别以上的用户可以查询所管理项目的成员所填的其他类型的工单
List<Integer> userIds = workUserProjectMapper.selectUserIdByProjectIds(map);
if (rank.contains(LevelRankEnum.DEPARTMENT_LEVEL.getRank()) || rank.contains(LevelRankEnum.CENTRAL_LEVEL.getRank())) {
// 获取其他类型统计信息
map.replace("isAll", false);
......@@ -603,9 +629,16 @@ public class StatisticsServiceImpl implements StatisticsService {
if (CollectionUtil.isNotEmpty(userWorkTimeStatisticsByProjectList)) {
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject1 = userWorkTimeStatisticsByProjectList.get(0);
List<ProjectWorkTimeAndType> projectWorkTimeAndType1 = userWorkTimeStatisticsByProject1.getProjectWorkTimeAndType();
for (ProjectWorkTimeAndType projectWorkTimeAndType : projectWorkTimeAndType1) {
projectWorkTimeAndType.setProjectName(types.get(projectWorkTimeAndType.getProjectType()-1).getName());
}
collect = projectWorkTimeAndType1.stream().map(ProjectWorkTimeAndType::getProjectType).collect(Collectors.toList());
}
// 缺少类型,造对象传前端
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject1 = new UserWorkTimeStatisticsByProject();
List<ProjectWorkTimeAndType> projectWorkTimeAndTypes = new ArrayList<>();
......@@ -628,6 +661,7 @@ public class StatisticsServiceImpl implements StatisticsService {
// 查询各个项目下所有人的其他除了项目、商机、请假、调休类型的加班工时和平常工时
map.replace("isAll", true);
List<UserWorkTimeStatisticsByProject> userWorkTimeStatisticsByProjects = workTimeOrderMapper.selectListByType(map);
for (UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject : userWorkTimeStatisticsByProjects) {
if (!userProjectWorkTimeStatistics1.contains(userWorkTimeStatisticsByProject)) {
UserWorkTimeStatisticsByProject userWorkTimeStatisticsByProject2 = new UserWorkTimeStatisticsByProject();
......@@ -643,15 +677,17 @@ public class StatisticsServiceImpl implements StatisticsService {
}
}
}
}
userProjectWorkTimeStatistics.addAll(0, userProjectWorkTimeStatistics1);
// 赋值类型名称
for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userProjectWorkTimeStatistics) {
for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userWorkTimeStatisticsByProjects) {
List<ProjectWorkTimeAndType> projectWorkTimeAndType = userProjectWorkTimeStatistic.getProjectWorkTimeAndType();
for (ProjectWorkTimeAndType workTimeAndType : projectWorkTimeAndType) {
workTimeAndType.setProjectName(types.get(workTimeAndType.getProjectType() - 1).getName());
}
}
}
userProjectWorkTimeStatistics.addAll(0, userProjectWorkTimeStatistics1);
// 取出单人的项目工时统计
for (UserWorkTimeStatisticsByProject userProjectWorkTimeStatistic : userProjectWorkTimeStatistics) {
......@@ -773,9 +809,16 @@ public class StatisticsServiceImpl implements StatisticsService {
} else {
projectStatisticsByMonths.addAll(0, projectStatisticsByMonths1);
}
List<String> yearMonthList = new ArrayList<>();
if (projectId != null) {
// 整个项目所占时间,未结项目截止时间为当月,已结项目截止时间为最后一次统计的时间
String startDate = projectStatisticsByMonths.get(0).getStatisticsDateAndWorkTimes().get(0).getDate();
String endDate = workProjectMapper.getLastDate(projectId);
yearMonthList = this.getYearMonthList(startDate,endDate);
}
// 部门主键不为空时,日期格式只有某月。为空时,日期格式为某年统计的第一个月为某年某月,其余为某月
this.conversionDateFormat(projectStatisticsByMonths, deptId);
this.conversionDateFormat(projectStatisticsByMonths,yearMonthList, deptId);
// 计算项目工时和成本合计
for (ProjectStatisticsByMonth projectStatisticsByMonth : projectStatisticsByMonths) {
......@@ -887,7 +930,7 @@ public class StatisticsServiceImpl implements StatisticsService {
// 部门主键不为空时,日期格式只有某月。为空时,日期格式为某年统计的第一个月为某年某月,其余为某月
public void conversionDateFormat(List<ProjectStatisticsByMonth> projectStatisticsByMonths, Integer deptId) {
public void conversionDateFormat(List<ProjectStatisticsByMonth> projectStatisticsByMonths,List<String> yearMonthList, Integer deptId) {
for (ProjectStatisticsByMonth projectStatisticsByMonth : projectStatisticsByMonths) {
List<ProjectStatisticsByMonth.StatisticsDateAndWorkTime> statisticsDateAndWorkTimes = projectStatisticsByMonth.getStatisticsDateAndWorkTimes();
// 部门主键不为空时,日期格式只有某月
......@@ -900,17 +943,43 @@ public class StatisticsServiceImpl implements StatisticsService {
statisticsDateAndWorkTime.setDate(stringBuilder.toString());
}
} else {
for (int i = statisticsDateAndWorkTimes.size() - 1; i > 0; i--) {
String date1 = statisticsDateAndWorkTimes.get(i).getDate();
String date2 = statisticsDateAndWorkTimes.get(i - 1).getDate();
// 如果不为当年统计数据的第一个月,则删除年份
if (date1.charAt(2) == date2.charAt(2) && date1.charAt(3) == date2.charAt(3)) {
StringBuilder dateBuilder1 = new StringBuilder(date1);
// 删除年份
dateBuilder1.delete(0, 5);
statisticsDateAndWorkTimes.get(i).setDate(dateBuilder1.toString());
for (int i = 0; i < yearMonthList.size(); i++) {
String s = yearMonthList.get(i);
String date = statisticsDateAndWorkTimes.get(i).getDate();
if (!s.equals(date)) {
ProjectStatisticsByMonth.StatisticsDateAndWorkTime statisticsDateAndWorkTime = new ProjectStatisticsByMonth.StatisticsDateAndWorkTime();
statisticsDateAndWorkTime.setDate(s);
statisticsDateAndWorkTime.setTotalTime(new BigDecimal("0"));
statisticsDateAndWorkTime.setCost(new BigDecimal("0"));
statisticsDateAndWorkTimes.add(i,statisticsDateAndWorkTime);
}
SimpleDateFormat format = new SimpleDateFormat("yyyy年M月");
Date parse = null;
try {
parse = format.parse(s);
if (DateUtil.getMonth(parse) != 1 && i != 0) {
String s1 = yearMonthList.get(i);
String substring = s1.substring(5);
statisticsDateAndWorkTimes.get(i).setDate(substring);
}
} catch (ParseException e) {
log.info(e.toString());
}
}
// for (int i = statisticsDateAndWorkTimes.size() - 1; i > 0; i--) {
// String date1 = statisticsDateAndWorkTimes.get(i).getDate();
// String date2 = statisticsDateAndWorkTimes.get(i - 1).getDate();
//
// // 如果不为当年统计数据的第一个月,则删除年份
// if (date1.charAt(2) == date2.charAt(2) && date1.charAt(3) == date2.charAt(3)) {
// StringBuilder dateBuilder1 = new StringBuilder(date1);
// // 删除年份
// dateBuilder1.delete(0, 5);
// statisticsDateAndWorkTimes.get(i).setDate(dateBuilder1.toString());
// }
// }
}
}
}
......@@ -942,4 +1011,20 @@ public class StatisticsServiceImpl implements StatisticsService {
return rank;
}
List<String> getYearMonthList(String startDate, String endDate) {
String pattern = "yyyy年M月";
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
List<String> list = new ArrayList<>();
Calendar calendar = DateUtil.convertStrToCalendar(startDate, pattern);
Calendar calendar2 = DateUtil.convertStrToCalendar(endDate, pattern);
list.add(startDate);
for (;!calendar.equals(calendar2); ) {
calendar.add(Calendar.MONTH,1);
String format = sdf.format(calendar.getTime());
list.add(format);
}
return list;
}
}
......@@ -26,7 +26,7 @@ public class AutoStatistics {
private WorkProjectTimeCostMapper workProjectTimeCostMapper;
@Transactional
@Scheduled(cron = "0 0 0 * * ?")
@Scheduled(cron = "0 5 0 * * ?")
public void autoStatistics(){
log.info("AutoStatistics[]autoStatistics[]自动统计任务");
Date date = DateUtil.add(new Date(), Calendar.MONTH, -3);
......
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