|
|
@@ -15954,32 +15954,73 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public List<HashMap> getExtraWorkHoursList(String year, Integer departmentId, String userId, HttpServletRequest request) {
|
|
|
+ public HashMap getExtraWorkHoursList(String year, Integer departmentId, String userId, Integer range, Integer pageIndex, Integer pageSize, HttpServletRequest request) {
|
|
|
List<HashMap> list = new ArrayList<>();
|
|
|
Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
|
|
|
-
|
|
|
+ Integer pageStart = pageIndex == null ? null : (pageIndex - 1) * pageSize;
|
|
|
List<Department> allDeptList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
|
|
|
+ List<Integer> deptIds = null;
|
|
|
List<Department> firstLineDepartments = allDeptList.stream().filter(Department::getFlag).collect(Collectors.toList());
|
|
|
- List<Department> allFirstLineDepartments = new ArrayList<>(firstLineDepartments);
|
|
|
+ List<Department> allNonFirstLineDepartments = new ArrayList<>(firstLineDepartments);
|
|
|
for (Department dept: firstLineDepartments) {
|
|
|
- allFirstLineDepartments.addAll(getSubDepts(dept, allDeptList));
|
|
|
- }
|
|
|
- if (departmentId != null) {
|
|
|
- allFirstLineDepartments = allFirstLineDepartments.stream().filter(dept -> dept.getDepartmentId().equals(departmentId)).collect(Collectors.toList());
|
|
|
- //要取子部门的所有集合
|
|
|
- if (allFirstLineDepartments.size() > 0) {
|
|
|
- allFirstLineDepartments.addAll(getSubDepts(allFirstLineDepartments.get(0), allDeptList));
|
|
|
+ allNonFirstLineDepartments.addAll(getSubDepts(dept, allDeptList));
|
|
|
+ }
|
|
|
+ //提取非一线的部门
|
|
|
+ List<Integer> nonFirstLineDeptIds = allNonFirstLineDepartments.stream().map(Department::getDepartmentId).collect(Collectors.toList());
|
|
|
+ if (range != null) {
|
|
|
+ //取一线或者非一线的部门
|
|
|
+ if (range == 1) {
|
|
|
+ //一线, 排除所有非一线的
|
|
|
+ List<Integer> allDeptIds = allDeptList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
|
|
|
+ if (allNonFirstLineDepartments.size() > 0) {
|
|
|
+ List<Integer> allNonFirstLineDeptIds = allNonFirstLineDepartments.stream().map(Department::getDepartmentId).collect(Collectors.toList());
|
|
|
+ deptIds = allDeptIds.stream().filter(all->!allNonFirstLineDeptIds.contains(all)).collect(Collectors.toList());
|
|
|
+ if (departmentId != null) {
|
|
|
+ Integer findDeptId = deptIds.stream().filter(dept -> dept.equals(departmentId)).findAny().orElse(null);
|
|
|
+ if (findDeptId == null) {
|
|
|
+ HashMap map = new HashMap();
|
|
|
+ map.put("list", list);
|
|
|
+ map.put("total", 0);
|
|
|
+ return map;
|
|
|
+ } else {
|
|
|
+ Department department = allDeptList.stream().filter(dept -> dept.getDepartmentId().equals(findDeptId)).findAny().orElse(null);
|
|
|
+
|
|
|
+ //要取子部门的所有集合
|
|
|
+ if (department != null) {
|
|
|
+ List<Department> allList = getSubDepts(department, allDeptList);
|
|
|
+ deptIds = allList.stream().map(Department::getDepartmentId).collect(Collectors.toList());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (departmentId != null) {
|
|
|
+ allNonFirstLineDepartments = allNonFirstLineDepartments.stream().filter(dept -> dept.getDepartmentId().equals(departmentId)).collect(Collectors.toList());
|
|
|
+ //要取子部门的所有集合
|
|
|
+ if (allNonFirstLineDepartments.size() > 0) {
|
|
|
+ allNonFirstLineDepartments.addAll(getSubDepts(allNonFirstLineDepartments.get(0), allDeptList));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //非一线
|
|
|
+ if (allNonFirstLineDepartments.size() == 0) {
|
|
|
+ HashMap map = new HashMap();
|
|
|
+ map.put("list", list);
|
|
|
+ map.put("total", 0);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+ deptIds = allNonFirstLineDepartments.stream().map(Department::getDepartmentId).collect(Collectors.toList());
|
|
|
}
|
|
|
}
|
|
|
- if (allFirstLineDepartments.size() == 0) {
|
|
|
- return list;
|
|
|
- }
|
|
|
- List<Integer> deptIds = allFirstLineDepartments.stream().map(Department::getDepartmentId).collect(Collectors.toList());
|
|
|
|
|
|
- // 1. 查询用户基础信息(只查一次)
|
|
|
- List<HashMap> userList = userCorpwxTimeMapper.getExtraWorkHoursList(year, companyId, deptIds, userId);
|
|
|
+
|
|
|
+ // 1. 查询用户基础信息(只查一次),支持分页
|
|
|
+ List<HashMap> userList = userCorpwxTimeMapper.getExtraWorkHoursList(year, companyId, deptIds, userId, range, pageStart, pageSize);
|
|
|
+ Integer total = userCorpwxTimeMapper.getExtraWorkHoursCount(year, companyId, deptIds, userId, range);
|
|
|
if (userList.isEmpty()) {
|
|
|
- return list;
|
|
|
+ HashMap map = new HashMap();
|
|
|
+ map.put("list", list);
|
|
|
+ map.put("total", total);
|
|
|
+ return map;
|
|
|
}
|
|
|
|
|
|
// 2. 收集所有用户ID和企微ID
|
|
|
@@ -15991,16 +16032,73 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
|
|
|
// 3. 批量查询全年月度加班数据(只查一次user_corpwx_time表,使用otTime字段)
|
|
|
Map<String, Map<String, Double>> overtimeMap = new HashMap<>();
|
|
|
- if (!corpwxUserIds.isEmpty()) {
|
|
|
- List<Map<String, Object>> overtimeList = userCorpwxTimeMapper.getMonthlyOvertimeByYear(year, companyId, corpwxUserIds);
|
|
|
- for (Map<String, Object> row : overtimeList) {
|
|
|
- String corpwxId = String.valueOf(row.get("corpwxUserid"));
|
|
|
- String month = String.valueOf(row.get("month"));
|
|
|
- double overtime = row.get("overtime") != null ? ((Number) row.get("overtime")).doubleValue() : 0.0;
|
|
|
- overtimeMap.computeIfAbsent(corpwxId, k -> new HashMap<>()).put(month, overtime);
|
|
|
+ if (range == null) {
|
|
|
+ //区分员工是一线还是非一线的
|
|
|
+ if (!corpwxUserIds.isEmpty()) {
|
|
|
+ List<String> nonFirstLineUserCorpwxUserIds = new ArrayList<>();
|
|
|
+ List<String> firstLineUserIds = new ArrayList<>();
|
|
|
+ for (HashMap user : userList) {
|
|
|
+ // 先转为Long,再转int
|
|
|
+ Long deptIdLong = (Long) user.get("departmentId");
|
|
|
+ int deptId = deptIdLong.intValue();
|
|
|
+ if (nonFirstLineDeptIds.contains(deptId)) {
|
|
|
+ //非一线
|
|
|
+ user.put("flag", true);
|
|
|
+ nonFirstLineUserCorpwxUserIds.add((String)user.get("corpwxUserid"));
|
|
|
+ } else {
|
|
|
+ user.put("flag", false);//一线的
|
|
|
+ firstLineUserIds.add((String)user.get("id"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!firstLineUserIds.isEmpty()) {
|
|
|
+ List<Report> overtimeList = reportMapper.selectList(new QueryWrapper<Report>().select("creator_id, date_format(create_date, '%m') as content, sum(overtime_hours) as overtime_hours").in("creator_id", firstLineUserIds).eq("state", 1).eq("DATE_FORMAT(create_date,'%Y')", year + "").groupBy("creator_id, date_format(create_date, '%Y-%m')"));
|
|
|
+ for (Report row : overtimeList) {
|
|
|
+ String corpwxId = (String)userList.stream().filter(u->String.valueOf(u.get("id")).equals(row.getCreatorId())).findFirst().orElse(null).get("corpwxUserid");
|
|
|
+ String month = row.getContent();
|
|
|
+ double overtime = row.getOvertimeHours();
|
|
|
+ overtimeMap.computeIfAbsent(corpwxId, k -> new HashMap<>()).put(month, overtime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!nonFirstLineUserCorpwxUserIds.isEmpty()) {
|
|
|
+ List<Map<String, Object>> overtimeList = userCorpwxTimeMapper.getMonthlyOvertimeByYear(year, companyId, nonFirstLineUserCorpwxUserIds);
|
|
|
+ for (Map<String, Object> row : overtimeList) {
|
|
|
+ String corpwxId = String.valueOf(row.get("corpwxUserid"));
|
|
|
+ String month = String.valueOf(row.get("month"));
|
|
|
+ double overtime = row.get("overtime") != null ? ((Number) row.get("overtime")).doubleValue() : 0.0;
|
|
|
+ overtimeMap.computeIfAbsent(corpwxId, k -> new HashMap<>()).put(month, overtime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (range == 1) {
|
|
|
+ for (HashMap user : userList) {
|
|
|
+ user.put("flag", false);//一线的
|
|
|
+ }
|
|
|
+ //一线的员工,加班时长从日报获取
|
|
|
+ if (!corpwxUserIds.isEmpty()) {
|
|
|
+ List<Report> overtimeList = reportMapper.selectList(new QueryWrapper<Report>().select("creator_id, date_format(create_date, '%m') as content, sum(overtime_hours) as overtime_hours").in("creator_id", userIds).eq("state", 1).eq("DATE_FORMAT(create_date,'%Y')", year + "").groupBy("creator_id, date_format(create_date, '%m')"));
|
|
|
+ for (Report row : overtimeList) {
|
|
|
+ String corpwxId = (String)userList.stream().filter(u->String.valueOf(u.get("id")).equals(row.getCreatorId())).findFirst().orElse(null).get("corpwxUserid");
|
|
|
+ String month = row.getContent();
|
|
|
+ double overtime = row.getOvertimeHours();
|
|
|
+ overtimeMap.computeIfAbsent(corpwxId, k -> new HashMap<>()).put(month, overtime);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ for (HashMap user : userList) {
|
|
|
+ user.put("flag", true);//非一线的
|
|
|
+ }
|
|
|
+ if (!corpwxUserIds.isEmpty()) {
|
|
|
+ List<Map<String, Object>> overtimeList = userCorpwxTimeMapper.getMonthlyOvertimeByYear(year, companyId, corpwxUserIds);
|
|
|
+ for (Map<String, Object> row : overtimeList) {
|
|
|
+ String corpwxId = String.valueOf(row.get("corpwxUserid"));
|
|
|
+ String month = String.valueOf(row.get("month"));
|
|
|
+ double overtime = row.get("overtime") != null ? ((Number) row.get("overtime")).doubleValue() : 0.0;
|
|
|
+ overtimeMap.computeIfAbsent(corpwxId, k -> new HashMap<>()).put(month, overtime);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// 4. 批量查询全年月度调休数据(只查一次user_corpwx_time表)
|
|
|
Map<String, Map<String, Double>> leaveMap = new HashMap<>();
|
|
|
if (!corpwxUserIds.isEmpty()) {
|
|
|
@@ -16042,23 +16140,28 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
userMap.remove("corpwxUserid");
|
|
|
list.add(userMap);
|
|
|
}
|
|
|
- return list;
|
|
|
+ HashMap map = new HashMap();
|
|
|
+ map.put("list", list);
|
|
|
+ map.put("total", total);
|
|
|
+ return map;
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public HttpRespMsg exportExtraWorkHoursList(String year, Integer departmentId, String userId, HttpServletRequest request) {
|
|
|
+ public HttpRespMsg exportExtraWorkHoursList(String year, Integer departmentId, String userId, Integer range, HttpServletRequest request) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
try {
|
|
|
Integer companyId = userMapper.selectById(request.getHeader("token")).getCompanyId();
|
|
|
WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
|
|
|
CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
|
|
|
|
|
|
- List<HashMap> list = getExtraWorkHoursList(year, departmentId, userId, request);
|
|
|
+ HashMap ret = getExtraWorkHoursList(year, departmentId, userId,range, null, null, request);
|
|
|
+ List<HashMap> list = (List<HashMap>) ret.get("list");
|
|
|
|
|
|
List<List<String>> dataList = new ArrayList<>();
|
|
|
List<String> titleList = new ArrayList<>();
|
|
|
titleList.add("姓名");
|
|
|
titleList.add("部门");
|
|
|
+ titleList.add("一线/非一线");
|
|
|
// 动态生成1-12月的标题
|
|
|
for (int m = 1; m <= 12; m++) {
|
|
|
titleList.add(m + "月加班(h)");
|
|
|
@@ -16073,6 +16176,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
List<String> item = new ArrayList<>();
|
|
|
String name = String.valueOf(map.get("name"));
|
|
|
String departmentName = String.valueOf(map.get("departmentName"));
|
|
|
+ boolean flag = (boolean)(map.get("flag"));
|
|
|
if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact() == 1) {
|
|
|
item.add("$userName=" + name + "$");
|
|
|
item.add("$departmentName=" + departmentName + "$");
|
|
|
@@ -16083,6 +16187,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
item.add(name);
|
|
|
item.add(departmentName);
|
|
|
}
|
|
|
+ item.add(flag?"非一线":"一线");
|
|
|
// 动态填充1-12月的加班和调休数据
|
|
|
for (int m = 1; m <= 12; m++) {
|
|
|
Object monthOvertime = map.get("month" + m + "Overtime");
|
|
|
@@ -16591,7 +16696,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
return msg;
|
|
|
}
|
|
|
|
|
|
- List<HashMap> userList = userCorpwxTimeMapper.getExtraWorkHoursList(null, companyId, scope.scopedDeptIds, null);
|
|
|
+ List<HashMap> userList = userCorpwxTimeMapper.getExtraWorkHoursList(null, companyId, scope.scopedDeptIds, null, 2, null, null);
|
|
|
if (userList.isEmpty()) {
|
|
|
msg.data = new ArrayList<>();
|
|
|
return msg;
|