|
@@ -16108,15 +16108,73 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
return msg;
|
|
return msg;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ private static final int MAX_DASHBOARD_RANGE_DAYS = 366;
|
|
|
|
|
+
|
|
|
|
|
+ private static class DashboardDateFilter {
|
|
|
|
|
+ private final String month;
|
|
|
|
|
+ private final LocalDate startDate;
|
|
|
|
|
+ private final LocalDate endDate;
|
|
|
|
|
+ private final boolean rangeMode;
|
|
|
|
|
+
|
|
|
|
|
+ private DashboardDateFilter(String month, LocalDate startDate, LocalDate endDate, boolean rangeMode) {
|
|
|
|
|
+ this.month = month;
|
|
|
|
|
+ this.startDate = startDate;
|
|
|
|
|
+ this.endDate = endDate;
|
|
|
|
|
+ this.rangeMode = rangeMode;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void applyDateFilter(QueryWrapper<Report> wrapper) {
|
|
|
|
|
+ if (rangeMode) {
|
|
|
|
|
+ wrapper.apply("date(create_date) >= {0} and date(create_date) <= {1}",
|
|
|
|
|
+ startDate.toString(), endDate.toString());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ wrapper.apply("date_format(create_date, '%Y-%m') = {0}", month);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private DashboardDateFilter resolveDashboardDateFilter(String ymonth, String startDate, String endDate, HttpRespMsg msg) {
|
|
|
|
|
+ boolean hasStart = !StringUtils.isEmpty(startDate);
|
|
|
|
|
+ boolean hasEnd = !StringUtils.isEmpty(endDate);
|
|
|
|
|
+ if (hasStart && hasEnd) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ LocalDate start = LocalDate.parse(startDate);
|
|
|
|
|
+ LocalDate end = LocalDate.parse(endDate);
|
|
|
|
|
+ if (end.isBefore(start)) {
|
|
|
|
|
+ msg.setError("结束日期不能早于开始日期");
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ long days = ChronoUnit.DAYS.between(start, end) + 1;
|
|
|
|
|
+ if (days > MAX_DASHBOARD_RANGE_DAYS) {
|
|
|
|
|
+ msg.setError("查询时间区间最多不能超过一年");
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ return new DashboardDateFilter(null, start, end, true);
|
|
|
|
|
+ } catch (DateTimeParseException e) {
|
|
|
|
|
+ msg.setError("日期格式错误,请使用yyyy-MM-dd");
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ if (hasStart || hasEnd) {
|
|
|
|
|
+ msg.setError("请同时选择开始日期和结束日期");
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ return new DashboardDateFilter(normalizeYearMonth(ymonth), null, null, false);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getTop10ProjectReport(Integer companyId, String ymonth) {
|
|
|
|
|
|
|
+ public HttpRespMsg getTop10ProjectReport(Integer companyId, String ymonth, String startDate, String endDate) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
- String month = normalizeYearMonth(ymonth);
|
|
|
|
|
- List<Map<String, Object>> reportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ DashboardDateFilter dateFilter = resolveDashboardDateFilter(ymonth, startDate, endDate, msg);
|
|
|
|
|
+ if (dateFilter == null) {
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
|
|
+ QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>()
|
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(queryWrapper);
|
|
|
|
|
+ List<Map<String, Object>> reportList = reportMapper.selectMaps(queryWrapper
|
|
|
.groupBy("project_id")
|
|
.groupBy("project_id")
|
|
|
.orderByDesc("sum(working_time)")
|
|
.orderByDesc("sum(working_time)")
|
|
|
.last("limit 10"));
|
|
.last("limit 10"));
|
|
@@ -16152,14 +16210,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getUserProjectTop10(Integer companyId, String ymonth) {
|
|
|
|
|
|
|
+ public HttpRespMsg getUserProjectTop10(Integer companyId, String ymonth, String startDate, String endDate) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
- String month = normalizeYearMonth(ymonth);
|
|
|
|
|
- List<Map<String, Object>> userProjectList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ DashboardDateFilter dateFilter = resolveDashboardDateFilter(ymonth, startDate, endDate, msg);
|
|
|
|
|
+ if (dateFilter == null) {
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
|
|
+ QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>()
|
|
|
.select("creator_id as userId", "count(distinct project_id) as projectCount")
|
|
.select("creator_id as userId", "count(distinct project_id) as projectCount")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(queryWrapper);
|
|
|
|
|
+ List<Map<String, Object>> userProjectList = reportMapper.selectMaps(queryWrapper
|
|
|
.groupBy("creator_id")
|
|
.groupBy("creator_id")
|
|
|
.orderByDesc("count(distinct project_id)")
|
|
.orderByDesc("count(distinct project_id)")
|
|
|
.last("limit 10"));
|
|
.last("limit 10"));
|
|
@@ -16188,42 +16250,57 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth) {
|
|
|
|
|
- return getTop3ProjectReportGroupByDept(companyId, ymonth, null);
|
|
|
|
|
|
|
+ public HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth, String startDate, String endDate) {
|
|
|
|
|
+ return getTop3ProjectReportGroupByDept(companyId, ymonth, startDate, endDate, null);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- public HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth, String deptMode) {
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public HttpRespMsg getTop3ProjectReportGroupByDept(Integer companyId, String ymonth, String startDate, String endDate, String deptMode) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
- String month = normalizeYearMonth(ymonth);
|
|
|
|
|
|
|
+ DashboardDateFilter dateFilter = resolveDashboardDateFilter(ymonth, startDate, endDate, msg);
|
|
|
|
|
+ if (dateFilter == null) {
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
|
|
+ msg.data = buildTop3ProjectReportGroupByDept(companyId, dateFilter, deptMode, false);
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private List<HashMap> buildTop3ProjectReportGroupByDept(Integer companyId, DashboardDateFilter dateFilter, String deptMode, boolean orderByOvertime) {
|
|
|
boolean useTopLevel = "top".equals(deptMode);
|
|
boolean useTopLevel = "top".equals(deptMode);
|
|
|
-
|
|
|
|
|
- List<Map<String, Object>> topProjectList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+
|
|
|
|
|
+ QueryWrapper<Report> topProjectQuery = new QueryWrapper<Report>()
|
|
|
.select("project_id as projectId", "sum(working_time) as workingTime")
|
|
.select("project_id as projectId", "sum(working_time) as workingTime")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
- .groupBy("project_id")
|
|
|
|
|
- .orderByDesc("sum(working_time)")
|
|
|
|
|
- .last("limit 3"));
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(topProjectQuery);
|
|
|
|
|
+ topProjectQuery.groupBy("project_id");
|
|
|
|
|
+ if (orderByOvertime) {
|
|
|
|
|
+ topProjectQuery.having("sum(ifnull(overtime_hours, 0)) > 0")
|
|
|
|
|
+ .orderByDesc("sum(ifnull(overtime_hours, 0))");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ topProjectQuery.orderByDesc("sum(working_time)");
|
|
|
|
|
+ }
|
|
|
|
|
+ topProjectQuery.last("limit 3");
|
|
|
|
|
+ List<Map<String, Object>> topProjectList = reportMapper.selectMaps(topProjectQuery);
|
|
|
List<Integer> projectIds = topProjectList.stream()
|
|
List<Integer> projectIds = topProjectList.stream()
|
|
|
.map(row -> toInteger(row.get("projectId")))
|
|
.map(row -> toInteger(row.get("projectId")))
|
|
|
.filter(Objects::nonNull)
|
|
.filter(Objects::nonNull)
|
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
|
if (projectIds.isEmpty()) {
|
|
if (projectIds.isEmpty()) {
|
|
|
- msg.data = new ArrayList<>();
|
|
|
|
|
- return msg;
|
|
|
|
|
|
|
+ return new ArrayList<>();
|
|
|
}
|
|
}
|
|
|
Map<Integer, Integer> projectRankMap = new HashMap<>();
|
|
Map<Integer, Integer> projectRankMap = new HashMap<>();
|
|
|
for (int i = 0; i < projectIds.size(); i++) {
|
|
for (int i = 0; i < projectIds.size(); i++) {
|
|
|
projectRankMap.put(projectIds.get(i), i);
|
|
projectRankMap.put(projectIds.get(i), i);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- List<Map<String, Object>> projectDeptReportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ QueryWrapper<Report> projectDeptQuery = new QueryWrapper<Report>()
|
|
|
.select("dept_id as deptId", "project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("dept_id as deptId", "project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
.eq("state", 1)
|
|
.eq("state", 1)
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
- .in("project_id", projectIds)
|
|
|
|
|
|
|
+ .in("project_id", projectIds);
|
|
|
|
|
+ dateFilter.applyDateFilter(projectDeptQuery);
|
|
|
|
|
+ List<Map<String, Object>> projectDeptReportList = reportMapper.selectMaps(projectDeptQuery
|
|
|
.groupBy("dept_id", "project_id"));
|
|
.groupBy("dept_id", "project_id"));
|
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
|
Map<String, HashMap<String, Object>> projectDeptMap = new LinkedHashMap<>();
|
|
Map<String, HashMap<String, Object>> projectDeptMap = new LinkedHashMap<>();
|
|
@@ -16288,26 +16365,29 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
deptMap.put("overtimeHours", roundHours(toDouble(deptMap.get("overtimeHours")) + toDouble(item.get("overtimeHours"))));
|
|
deptMap.put("overtimeHours", roundHours(toDouble(deptMap.get("overtimeHours")) + toDouble(item.get("overtimeHours"))));
|
|
|
((List<HashMap>) deptMap.get("items")).add(item);
|
|
((List<HashMap>) deptMap.get("items")).add(item);
|
|
|
});
|
|
});
|
|
|
- List<HashMap> resultList = new ArrayList<>(deptGroupMap.values());
|
|
|
|
|
- msg.data = resultList;
|
|
|
|
|
- return msg;
|
|
|
|
|
|
|
+ return new ArrayList<>(deptGroupMap.values());
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getProjectReportGroupByDept(Integer companyId, String ymonth) {
|
|
|
|
|
- return getProjectReportGroupByDept(companyId, ymonth, null);
|
|
|
|
|
|
|
+ public HttpRespMsg getProjectReportGroupByDept(Integer companyId, String ymonth, String startDate, String endDate) {
|
|
|
|
|
+ return getProjectReportGroupByDept(companyId, ymonth, startDate, endDate, null);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getProjectReportGroupByDept(Integer companyId, String ymonth, String deptMode) {
|
|
|
|
|
|
|
+ public HttpRespMsg getProjectReportGroupByDept(Integer companyId, String ymonth, String startDate, String endDate, String deptMode) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
- String month = normalizeYearMonth(ymonth);
|
|
|
|
|
|
|
+ DashboardDateFilter dateFilter = resolveDashboardDateFilter(ymonth, startDate, endDate, msg);
|
|
|
|
|
+ if (dateFilter == null) {
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
boolean useTopLevel = "top".equals(deptMode);
|
|
boolean useTopLevel = "top".equals(deptMode);
|
|
|
-
|
|
|
|
|
- List<Map<String, Object>> deptReportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+
|
|
|
|
|
+ QueryWrapper<Report> deptReportQuery = new QueryWrapper<Report>()
|
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(deptReportQuery);
|
|
|
|
|
+ List<Map<String, Object>> deptReportList = reportMapper.selectMaps(deptReportQuery
|
|
|
.groupBy("dept_id", "creator_id")
|
|
.groupBy("dept_id", "creator_id")
|
|
|
.orderByDesc("sum(working_time)"));
|
|
.orderByDesc("sum(working_time)"));
|
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
@@ -16347,14 +16427,18 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getDeptProjectCount(Integer companyId, String ymonth) {
|
|
|
|
|
|
|
+ public HttpRespMsg getDeptProjectCount(Integer companyId, String ymonth, String startDate, String endDate) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
- String month = normalizeYearMonth(ymonth);
|
|
|
|
|
- List<Map<String, Object>> deptReportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ DashboardDateFilter dateFilter = resolveDashboardDateFilter(ymonth, startDate, endDate, msg);
|
|
|
|
|
+ if (dateFilter == null) {
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
|
|
+ QueryWrapper<Report> deptReportQuery = new QueryWrapper<Report>()
|
|
|
.select("dept_id as deptId", "project_id as projectId", "creator_id as userId", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("dept_id as deptId", "project_id as projectId", "creator_id as userId", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(deptReportQuery);
|
|
|
|
|
+ List<Map<String, Object>> deptReportList = reportMapper.selectMaps(deptReportQuery
|
|
|
.groupBy("dept_id", "project_id", "creator_id"));
|
|
.groupBy("dept_id", "project_id", "creator_id"));
|
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
|
List<HashMap> resultList = new ArrayList<>();
|
|
List<HashMap> resultList = new ArrayList<>();
|
|
@@ -16375,50 +16459,59 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getDashboardAnalysisReport(Integer companyId, String ymonth) {
|
|
|
|
|
|
|
+ public HttpRespMsg getDashboardAnalysisReport(Integer companyId, String ymonth, String startDate, String endDate) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
- String month = normalizeYearMonth(ymonth);
|
|
|
|
|
|
|
+ DashboardDateFilter dateFilter = resolveDashboardDateFilter(ymonth, startDate, endDate, msg);
|
|
|
|
|
+ if (dateFilter == null) {
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
- result.put("projectSituation", getProjectSituation(companyId, month));
|
|
|
|
|
- result.put("projectOvertimeTop5", getProjectRank(companyId, month, "sum(ifnull(overtime_hours, 0))", 5, true));
|
|
|
|
|
- result.put("top3OvertimeProjectDept", getTopProjectDeptReport(companyId, month, "sum(working_time)", false));
|
|
|
|
|
- List<Map<String, Object>> deptOvertimeSummaryList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ result.put("projectSituation", getProjectSituation(companyId, dateFilter));
|
|
|
|
|
+ result.put("projectOvertimeTop5", getProjectRank(companyId, dateFilter, "sum(ifnull(overtime_hours, 0))", 5, true));
|
|
|
|
|
+ result.put("top3OvertimeProjectDept", buildTop3ProjectReportGroupByDept(companyId, dateFilter, "top", true));
|
|
|
|
|
+ QueryWrapper<Report> deptOvertimeQuery = new QueryWrapper<Report>()
|
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours", "max(ifnull(overtime_hours, 0)) as maxOvertimeHours")
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours", "max(ifnull(overtime_hours, 0)) as maxOvertimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(deptOvertimeQuery);
|
|
|
|
|
+ List<Map<String, Object>> deptOvertimeSummaryList = reportMapper.selectMaps(deptOvertimeQuery
|
|
|
.groupBy("dept_id", "creator_id")
|
|
.groupBy("dept_id", "creator_id")
|
|
|
.orderByDesc("sum(ifnull(overtime_hours, 0))"));
|
|
.orderByDesc("sum(ifnull(overtime_hours, 0))"));
|
|
|
result.put("deptOvertimeSummary", buildDeptReportResult(rollupDeptReportRows(deptOvertimeSummaryList, departmentMap), departmentMap, true));
|
|
result.put("deptOvertimeSummary", buildDeptReportResult(rollupDeptReportRows(deptOvertimeSummaryList, departmentMap), departmentMap, true));
|
|
|
- result.put("deptProjectTop3", getDeptProjectTopN(companyId, month, departmentMap, false));
|
|
|
|
|
- result.put("deptOvertimeProjectTop3", getDeptProjectTopN(companyId, month, departmentMap, true));
|
|
|
|
|
- result.put("deptUserOvertimeTop3", getDeptUserOvertimeTopN(companyId, month, departmentMap));
|
|
|
|
|
- result.put("userOvertimeTop10", getUserOvertimeTopN(companyId, month, departmentMap));
|
|
|
|
|
|
|
+ result.put("deptProjectTop3", getDeptProjectTopN(companyId, dateFilter, departmentMap, false));
|
|
|
|
|
+ result.put("deptOvertimeProjectTop3", getDeptProjectTopN(companyId, dateFilter, departmentMap, true));
|
|
|
|
|
+ result.put("deptUserOvertimeTop3", getDeptUserOvertimeTopN(companyId, dateFilter, departmentMap));
|
|
|
|
|
+ result.put("userOvertimeTop10", getUserOvertimeTopN(companyId, dateFilter, departmentMap));
|
|
|
msg.data = result;
|
|
msg.data = result;
|
|
|
return msg;
|
|
return msg;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
@Override
|
|
|
- public HttpRespMsg getWorkedProjectList(Integer companyId, String ymonth, Integer pageIndex, Integer pageSize) {
|
|
|
|
|
|
|
+ public HttpRespMsg getWorkedProjectList(Integer companyId, String ymonth, String startDate, String endDate, Integer pageIndex, Integer pageSize) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
- String month = normalizeYearMonth(ymonth);
|
|
|
|
|
|
|
+ DashboardDateFilter dateFilter = resolveDashboardDateFilter(ymonth, startDate, endDate, msg);
|
|
|
|
|
+ if (dateFilter == null) {
|
|
|
|
|
+ return msg;
|
|
|
|
|
+ }
|
|
|
int currentPage = pageIndex == null || pageIndex < 1 ? 1 : pageIndex;
|
|
int currentPage = pageIndex == null || pageIndex < 1 ? 1 : pageIndex;
|
|
|
int size = pageSize == null || pageSize < 1 ? 30 : Math.min(pageSize, 100);
|
|
int size = pageSize == null || pageSize < 1 ? 30 : Math.min(pageSize, 100);
|
|
|
int offset = (currentPage - 1) * size;
|
|
int offset = (currentPage - 1) * size;
|
|
|
|
|
|
|
|
- List<Map<String, Object>> countList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ QueryWrapper<Report> countQuery = new QueryWrapper<Report>()
|
|
|
.select("count(distinct project_id) as total")
|
|
.select("count(distinct project_id) as total")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month));
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(countQuery);
|
|
|
|
|
+ List<Map<String, Object>> countList = reportMapper.selectMaps(countQuery);
|
|
|
int total = countList.isEmpty() ? 0 : toInteger(countList.get(0).get("total"));
|
|
int total = countList.isEmpty() ? 0 : toInteger(countList.get(0).get("total"));
|
|
|
|
|
|
|
|
- List<Map<String, Object>> reportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ QueryWrapper<Report> reportQuery = new QueryWrapper<Report>()
|
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(reportQuery);
|
|
|
|
|
+ List<Map<String, Object>> reportList = reportMapper.selectMaps(reportQuery
|
|
|
.groupBy("project_id")
|
|
.groupBy("project_id")
|
|
|
.orderByDesc("sum(working_time)")
|
|
.orderByDesc("sum(working_time)")
|
|
|
.last("limit " + offset + "," + size));
|
|
.last("limit " + offset + "," + size));
|
|
@@ -16557,15 +16650,15 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private HashMap<String, Object> getProjectSituation(Integer companyId, String month) {
|
|
|
|
|
|
|
+ private HashMap<String, Object> getProjectSituation(Integer companyId, DashboardDateFilter dateFilter) {
|
|
|
long projectCount = projectMapper.selectCount(new QueryWrapper<Project>().eq("company_id", companyId));
|
|
long projectCount = projectMapper.selectCount(new QueryWrapper<Project>().eq("company_id", companyId));
|
|
|
long executingProjectCount = projectMapper.selectCount(new QueryWrapper<Project>().eq("company_id", companyId).eq("status", 1));
|
|
long executingProjectCount = projectMapper.selectCount(new QueryWrapper<Project>().eq("company_id", companyId).eq("status", 1));
|
|
|
- List<Map<String, Object>> workedProjectList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ QueryWrapper<Report> workedProjectQuery = new QueryWrapper<Report>()
|
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
- .groupBy("project_id"));
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(workedProjectQuery);
|
|
|
|
|
+ List<Map<String, Object>> workedProjectList = reportMapper.selectMaps(workedProjectQuery.groupBy("project_id"));
|
|
|
double totalWorkingTime = workedProjectList.stream().mapToDouble(row -> toDouble(row.get("workingTime"))).sum();
|
|
double totalWorkingTime = workedProjectList.stream().mapToDouble(row -> toDouble(row.get("workingTime"))).sum();
|
|
|
double totalOvertimeHours = workedProjectList.stream().mapToDouble(row -> toDouble(row.get("overtimeHours"))).sum();
|
|
double totalOvertimeHours = workedProjectList.stream().mapToDouble(row -> toDouble(row.get("overtimeHours"))).sum();
|
|
|
HashMap<String, Object> map = new HashMap<>();
|
|
HashMap<String, Object> map = new HashMap<>();
|
|
@@ -16578,13 +16671,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
return map;
|
|
return map;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private List<HashMap> getProjectRank(Integer companyId, String month, String orderExpression, int limit, boolean overtimeOnly) {
|
|
|
|
|
|
|
+ private List<HashMap> getProjectRank(Integer companyId, DashboardDateFilter dateFilter, String orderExpression, int limit, boolean overtimeOnly) {
|
|
|
QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>()
|
|
QueryWrapper<Report> queryWrapper = new QueryWrapper<Report>()
|
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
- .groupBy("project_id")
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(queryWrapper);
|
|
|
|
|
+ queryWrapper.groupBy("project_id")
|
|
|
.having(overtimeOnly, "sum(ifnull(overtime_hours, 0)) > 0")
|
|
.having(overtimeOnly, "sum(ifnull(overtime_hours, 0)) > 0")
|
|
|
.orderByDesc(orderExpression);
|
|
.orderByDesc(orderExpression);
|
|
|
if (limit > 0 && limit < Integer.MAX_VALUE) {
|
|
if (limit > 0 && limit < Integer.MAX_VALUE) {
|
|
@@ -16594,12 +16687,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
return fillProjectInfo(companyId, reportList);
|
|
return fillProjectInfo(companyId, reportList);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private List<HashMap> getTopProjectDeptReport(Integer companyId, String month, String orderExpression, boolean orderByOvertime) {
|
|
|
|
|
- List<Map<String, Object>> topProjectList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ private List<HashMap> getTopProjectDeptReport(Integer companyId, DashboardDateFilter dateFilter, String orderExpression, boolean orderByOvertime) {
|
|
|
|
|
+ QueryWrapper<Report> topProjectQuery = new QueryWrapper<Report>()
|
|
|
.select("project_id as projectId")
|
|
.select("project_id as projectId")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(topProjectQuery);
|
|
|
|
|
+ List<Map<String, Object>> topProjectList = reportMapper.selectMaps(topProjectQuery
|
|
|
.groupBy("project_id")
|
|
.groupBy("project_id")
|
|
|
.having(orderByOvertime, "sum(ifnull(overtime_hours, 0)) > 0")
|
|
.having(orderByOvertime, "sum(ifnull(overtime_hours, 0)) > 0")
|
|
|
.orderByDesc(orderExpression)
|
|
.orderByDesc(orderExpression)
|
|
@@ -16611,23 +16705,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
if (projectIds.isEmpty()) {
|
|
if (projectIds.isEmpty()) {
|
|
|
return new ArrayList<>();
|
|
return new ArrayList<>();
|
|
|
}
|
|
}
|
|
|
- List<Map<String, Object>> deptReportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ QueryWrapper<Report> deptReportQuery = new QueryWrapper<Report>()
|
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
.eq("state", 1)
|
|
.eq("state", 1)
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
- .in("project_id", projectIds)
|
|
|
|
|
|
|
+ .in("project_id", projectIds);
|
|
|
|
|
+ dateFilter.applyDateFilter(deptReportQuery);
|
|
|
|
|
+ List<Map<String, Object>> deptReportList = reportMapper.selectMaps(deptReportQuery
|
|
|
.groupBy("dept_id", "creator_id")
|
|
.groupBy("dept_id", "creator_id")
|
|
|
.orderByDesc(orderByOvertime ? "sum(ifnull(overtime_hours, 0))" : "sum(working_time)"));
|
|
.orderByDesc(orderByOvertime ? "sum(ifnull(overtime_hours, 0))" : "sum(working_time)"));
|
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
Map<Integer, Department> departmentMap = getDepartmentMap(companyId);
|
|
|
return buildDeptReportResult(rollupDeptReportRows(deptReportList, departmentMap), departmentMap, false);
|
|
return buildDeptReportResult(rollupDeptReportRows(deptReportList, departmentMap), departmentMap, false);
|
|
|
}
|
|
}
|
|
|
- private List<HashMap> getDeptProjectTopN(Integer companyId, String month, Map<Integer, Department> departmentMap, boolean overtimeOnly) {
|
|
|
|
|
- List<Map<String, Object>> reportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ private List<HashMap> getDeptProjectTopN(Integer companyId, DashboardDateFilter dateFilter, Map<Integer, Department> departmentMap, boolean overtimeOnly) {
|
|
|
|
|
+ QueryWrapper<Report> reportQuery = new QueryWrapper<Report>()
|
|
|
.select("dept_id as deptId", "project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("dept_id as deptId", "project_id as projectId", "sum(working_time) as workingTime", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(reportQuery);
|
|
|
|
|
+ List<Map<String, Object>> reportList = reportMapper.selectMaps(reportQuery
|
|
|
.groupBy("dept_id", "project_id")
|
|
.groupBy("dept_id", "project_id")
|
|
|
.having(overtimeOnly, "sum(ifnull(overtime_hours, 0)) > 0"));
|
|
.having(overtimeOnly, "sum(ifnull(overtime_hours, 0)) > 0"));
|
|
|
Map<String, HashMap<String, Object>> projectGroupMap = new LinkedHashMap<>();
|
|
Map<String, HashMap<String, Object>> projectGroupMap = new LinkedHashMap<>();
|
|
@@ -16667,12 +16763,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
return resultList;
|
|
return resultList;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private List<HashMap> getDeptUserOvertimeTopN(Integer companyId, String month, Map<Integer, Department> departmentMap) {
|
|
|
|
|
- List<Map<String, Object>> reportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ private List<HashMap> getDeptUserOvertimeTopN(Integer companyId, DashboardDateFilter dateFilter, Map<Integer, Department> departmentMap) {
|
|
|
|
|
+ QueryWrapper<Report> reportQuery = new QueryWrapper<Report>()
|
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("dept_id as deptId", "creator_id as userId", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(reportQuery);
|
|
|
|
|
+ List<Map<String, Object>> reportList = reportMapper.selectMaps(reportQuery
|
|
|
.groupBy("dept_id", "creator_id")
|
|
.groupBy("dept_id", "creator_id")
|
|
|
.having("sum(ifnull(overtime_hours, 0)) > 0"));
|
|
.having("sum(ifnull(overtime_hours, 0)) > 0"));
|
|
|
List<String> userIds = reportList.stream().map(row -> String.valueOf(row.get("userId"))).filter(id -> !StringUtils.isEmpty(id)).collect(Collectors.toList());
|
|
List<String> userIds = reportList.stream().map(row -> String.valueOf(row.get("userId"))).filter(id -> !StringUtils.isEmpty(id)).collect(Collectors.toList());
|
|
@@ -16716,12 +16813,13 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
return resultList;
|
|
return resultList;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- private List<HashMap> getUserOvertimeTopN(Integer companyId, String month, Map<Integer, Department> departmentMap) {
|
|
|
|
|
- List<Map<String, Object>> reportList = reportMapper.selectMaps(new QueryWrapper<Report>()
|
|
|
|
|
|
|
+ private List<HashMap> getUserOvertimeTopN(Integer companyId, DashboardDateFilter dateFilter, Map<Integer, Department> departmentMap) {
|
|
|
|
|
+ QueryWrapper<Report> reportQuery = new QueryWrapper<Report>()
|
|
|
.select("creator_id as userId", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
.select("creator_id as userId", "sum(ifnull(overtime_hours, 0)) as overtimeHours")
|
|
|
.eq("company_id", companyId)
|
|
.eq("company_id", companyId)
|
|
|
- .eq("state", 1)
|
|
|
|
|
- .apply("date_format(create_date, '%Y-%m') = {0}", month)
|
|
|
|
|
|
|
+ .eq("state", 1);
|
|
|
|
|
+ dateFilter.applyDateFilter(reportQuery);
|
|
|
|
|
+ List<Map<String, Object>> reportList = reportMapper.selectMaps(reportQuery
|
|
|
.groupBy("creator_id")
|
|
.groupBy("creator_id")
|
|
|
.having("sum(ifnull(overtime_hours, 0)) > 0"));
|
|
.having("sum(ifnull(overtime_hours, 0)) > 0"));
|
|
|
List<String> userIds = reportList.stream()
|
|
List<String> userIds = reportList.stream()
|