diff --git a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/MultiSheetExcelExporter.java b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/MultiSheetExcelExporter.java index e4130c9..e873931 100644 --- a/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/MultiSheetExcelExporter.java +++ b/bonus-common/bonus-common-core/src/main/java/com/bonus/common/core/utils/poi/MultiSheetExcelExporter.java @@ -102,6 +102,70 @@ public class MultiSheetExcelExporter { } } + /** + * 转为异常排名导出重载的方法,设置列合并 + * @param sheet + * @param dataList + * @param headers + * @param orgCounts + * @param userCounts + */ + public void addDataRows(Sheet sheet, List> dataList, List headers,List orgCounts, List userCounts) { + + // 创建一个样式对象 + //设置这两列为上下居中 + CellStyle cellStyle = workbook.createCellStyle(); + // 设置上下居中 + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cellStyle.setAlignment(HorizontalAlignment.CENTER); // 可选:设置水平居中 + + for (Map rowData : dataList) { + Row row = sheet.createRow(currentRowNum++); + for (int i = 0; i < headers.size(); i++) { + String header = headers.get(i); + Cell cell = row.createCell(i); + Object value = rowData.get(header); + if (value != null) { + if (value instanceof Date) { + cell.setCellValue(dateFormat.format((Date) value)); + } else if (value instanceof String) { + cell.setCellValue((String) value); + } else if (value instanceof Number) { + cell.setCellValue(((Number) value).doubleValue()); + } else if (value instanceof Boolean) { + cell.setCellValue((Boolean) value); + } else { + cell.setCellValue(value.toString()); + } + } + cell.setCellStyle(cellStyle); + } + } + //设置数据合并 + + int startRow = 2; + for (int i = 0; i < orgCounts.size(); i++) { + int orgCount = orgCounts.get(i); + int endRow = startRow + orgCount - 1; + if(endRow-startRow>0){ + sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 1, 1)); + } + startRow = endRow + 1; + } + + startRow = 2; + for (int i = 0; i < userCounts.size(); i++) { + int userCount = userCounts.get(i); + int endRow = startRow + userCount - 1; + if(endRow-startRow>0){ + sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 2, 2)); + } + startRow = endRow + 1; + } + + + } + public void exportToResponse(HttpServletResponse response, String fileName) throws IOException { response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("UTF-8"); diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttDetailByMonthController.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttDetailByMonthController.java index 8675e3d..8a0f9a0 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttDetailByMonthController.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttDetailByMonthController.java @@ -33,6 +33,7 @@ import java.time.YearMonth; import java.time.format.DateTimeFormatter; import java.time.format.DateTimeParseException; import java.util.*; +import java.util.stream.Collectors; /** * 月异常报表 @@ -204,16 +205,15 @@ public class AttDetailByMonthController extends BaseController { headers.put("8", "出入异常"); headers.put("9", "打卡地异常"); headers.put("99", "工作外出"); - Map attStatus = getStringStringMap(); + Map attStatus = getStringStringMap(); if (StringHelper.isNotEmpty(bean.getStartMonth()) && StringHelper.isNotEmpty(bean.getEndMonth())) { -// List monthFirstAndLast = getMonthFirstAndLast(bean.getAttCurrentMonth()); List monthFirstAndLast = DateTimeHelper.getMonthStartAndEndDay(bean.getStartMonth(),bean.getEndMonth()); AttDetailBean dayTable = new AttDetailBean(); dayTable.setStartDate(monthFirstAndLast.get(0)); dayTable.setEndDate(monthFirstAndLast.get(1)); dayTable.setName(bean.getName()); if (bean.getOrgId() != null) { - dayTable.setOrgId(String.valueOf(bean.getOrgId())); + dayTable.setOrgId(Long.valueOf(bean.getOrgId())); } else { //受限于当前登录人 if (bean.getOrgList() != null && !bean.getOrgList().isEmpty()) { @@ -321,29 +321,10 @@ public class AttDetailByMonthController extends BaseController { return months; } - private Map getStringStringMap() { - Map attStatus = new HashMap<>(); - attStatus.put("1", "正常"); - attStatus.put("2", "迟到"); - attStatus.put("3", "旷工"); - attStatus.put("4", "早退"); - attStatus.put("5", "轮休"); - attStatus.put("6", "请假"); - attStatus.put("7", "外出"); - attStatus.put("8", "出入异常"); - attStatus.put("9", "打卡地异常"); - attStatus.put("10", "出差"); - attStatus.put("11", "法定节假日"); - attStatus.put("12", "年休假"); - attStatus.put("13", "探亲假"); - attStatus.put("14", "事假"); - attStatus.put("15", "病假"); - attStatus.put("16", "产假"); - attStatus.put("17", "婚假"); - attStatus.put("18", "丧假"); - attStatus.put("19", "育儿假"); - attStatus.put("20", "陪护假"); - return attStatus; + private Map getStringStringMap() { + List arrayList = attendanceDetailsService.getAttStatusList(); + return arrayList.stream() + .collect(Collectors.toMap(MapVo::getId, MapVo::getName, (existing, replacement) -> existing)); } } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttDetailBean.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttDetailBean.java index 2124b63..47b4631 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttDetailBean.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttDetailBean.java @@ -37,7 +37,7 @@ public class AttDetailBean { /** * 部门编号 */ - private String orgId; + private Long orgId; /** @@ -123,4 +123,15 @@ public class AttDetailBean { * 自己项目部所在分公司下的所有项目部id */ private List orgIdList; + + /** + * 部门排名 + */ + private Integer orgRanking; + + /** + * 用户排名 + */ + private Integer userRanking; + } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalServiceImpl.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalServiceImpl.java index dff8e4b..d6b8cbf 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalServiceImpl.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalServiceImpl.java @@ -139,10 +139,14 @@ public class AttCalServiceImpl implements AttCalService { } }); // 插入剩余的元素 - attSourceDataDao.updateAttStatusData(list); + if(!list.isEmpty()){ + attSourceDataDao.updateAttStatusData(list); + } } else if ("2".equals(c.getAttType())) { //自由打卡 - attSourceDataDao.updateAttStatusData(list); + if(!list.isEmpty()){ + attSourceDataDao.updateAttStatusData(list); + } } } }); @@ -289,7 +293,9 @@ public class AttCalServiceImpl implements AttCalService { public void updateMonthReportData(String pushDate) { List monthReportList = attSourceDataDao.selectAttMonthReport(pushDate); //月报表修改 - attSourceDataDao.updateAttMonthReport(monthReportList); + if(!monthReportList.isEmpty()){ + attSourceDataDao.updateAttMonthReport(monthReportList); + } } /** @@ -299,7 +305,7 @@ public class AttCalServiceImpl implements AttCalService { */ @Override public int getMonthReportTempData(String userId, String nowDate) { - return attSourceDataDao.getMonthReportTempDataIsExist( userId, nowDate); + return attSourceDataDao.getMonthReportTempDataIsExist(userId, nowDate); } /** @@ -310,7 +316,7 @@ public class AttCalServiceImpl implements AttCalService { */ @Override public List getAttSettingHistoryByUserAndDate(String userId, String nowDate) { - return attSourceDataDao.getAttSettingHistoryByUserAndDate( userId, nowDate); + return attSourceDataDao.getAttSettingHistoryByUserAndDate(userId, nowDate); } @Override @@ -337,7 +343,10 @@ public class AttCalServiceImpl implements AttCalService { @Override public void insertMonthHalfReportTempData(List list) { - attSourceDataDao.insertAttMonthReportTemp(list); + if(!list.isEmpty()){ + attSourceDataDao.insertAttMonthReportTemp(list); + } + } /** @@ -362,7 +371,9 @@ public class AttCalServiceImpl implements AttCalService { List listPerson = attSourceDataDao.getAttPerson(pushDate); if (pushType == 1) { //只会在凌晨执行一次 - attSourceDataDao.insertAttDataList(listPerson); + if(!listPerson.isEmpty()) { + attSourceDataDao.insertAttDataList(listPerson); + } } else if (pushType == 2) { //1.查询出历史当天已插入模版 //2.查询出历史当天考勤列表 diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/WechatTasks.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/WechatTasks.java index cac22e0..1b825e0 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/WechatTasks.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/WechatTasks.java @@ -55,8 +55,7 @@ public class WechatTasks { /** * 人员基础数据同步定时器 */ -// @Scheduled(cron = "0 0/10 * * * ?") - @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 30) + @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 10) @Async public void pushPersonTask() { log.info("--------人员基础数据同步定时器开启------"); @@ -84,7 +83,7 @@ public class WechatTasks { /** * 休假出差数据同步定时器 */ -// @Scheduled(initialDelay = 600 * 2, fixedDelay = 60000 * 30) + @Scheduled(initialDelay = 60000 * 6, fixedDelay = 60000 * 10) @Async public void leaveTask() { log.info("--------休假出差数据定时器开启------"); @@ -169,7 +168,7 @@ public class WechatTasks { /** * 考勤数据同步定时器 */ - @Scheduled(initialDelay = 6000 * 3, fixedDelay = 60000 * 30) + @Scheduled(initialDelay = 60000 * 12, fixedDelay = 60000 * 10) @Async public void wechatAttTask() { log.info("--------考勤数据定时器开启------"); @@ -405,8 +404,8 @@ public class WechatTasks { MediaType mediaType = MediaType.parse("application/x-www-form-urlencoded"); RequestBody body = null; try { - body = RequestBody.create(mediaType, "username=15240004260wechat&password=GZkq@123456!"); -// body = RequestBody.create(mediaType, "username=" + AESCBCUtil.encrypt("15240004260wechat") + "&password=" + AESCBCUtil.encrypt("GZkq@123456!")); +// body = RequestBody.create(mediaType, "username=15240004260wechat&password=GZkq@123456!"); + body = RequestBody.create(mediaType, "username=" + AESCBCUtil.encrypt("15240004260wechat") + "&password=" + AESCBCUtil.encrypt("GZkq@123456!")); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/basic/controller/SysUserController.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/basic/controller/SysUserController.java index 8b475b8..111c4fb 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/basic/controller/SysUserController.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/basic/controller/SysUserController.java @@ -369,8 +369,10 @@ public class SysUserController extends BaseController { if(!"1".equals(bean.getIsCheck())){ //没通过重新授权一下 bean.setIsFace("1"); - wechatTasks.updateWechatIsFace(bean); + }else { + bean.setIsFace("0"); } + wechatTasks.updateWechatIsFace(bean); return toAjax(userService.checkPersonAssignment(bean)); }catch (Exception e){ logger.error(e.toString(),e); diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/download/ExportFileController.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/download/ExportFileController.java index d80bd6b..211844d 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/download/ExportFileController.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/download/ExportFileController.java @@ -623,28 +623,6 @@ public class ExportFileController { } private Map getStringStringMap() { -// Map attStatus = new HashMap<>(); -// -// attStatus.put("1", "正常"); -// attStatus.put("2", "迟到"); -// attStatus.put("3", "旷工"); -// attStatus.put("4", "早退"); -// attStatus.put("5", "轮休"); -// attStatus.put("6", "请假"); -// attStatus.put("7", "外出"); -// attStatus.put("8", "出入异常"); -// attStatus.put("9", "打卡地异常"); -// attStatus.put("10", "出差"); -// attStatus.put("11", "法定节假日"); -// attStatus.put("12", "年休假"); -// attStatus.put("13", "探亲假"); -// attStatus.put("14", "事假"); -// attStatus.put("15", "病假"); -// attStatus.put("16", "产假"); -// attStatus.put("17", "婚假"); -// attStatus.put("18", "丧假"); -// attStatus.put("19", "育儿假"); -// attStatus.put("20", "陪护假"); List arrayList = attendanceDetailsService.getAttStatusList(); return arrayList.stream() .collect(Collectors.toMap(MapVo::getId, MapVo::getName, (existing, replacement) -> existing)); @@ -739,7 +717,7 @@ public class ExportFileController { dayTable.setEndDate(monthFirstAndLast.get(1)); dayTable.setName(bean.getUserName()); if (bean.getOrgId() != null) { - dayTable.setOrgId(String.valueOf(bean.getOrgId())); + dayTable.setOrgId(bean.getOrgId()); }else{ //受限于当前登录人 if(bean.getOrgList() != null && !bean.getOrgList().isEmpty()){ @@ -1316,5 +1294,271 @@ public class ExportFileController { } } + /** + * 异常排名导出 + * + * @param response + * @param bean + * @return void + * @author:fly + * @date:2025-02-25 + */ + @GetMapping("/exportAbnormalRanking") + public void exportAbnormalRanking(HttpServletResponse response, AttDataDetailsBean bean) { + try { + SysUser sysUser = SecurityUtils.getLoginUser().getSysUser(); + List roleId = sysUser.getRoleList(); + //管理员与人资角色可以看到所有 + if (roleId != null && !roleId.isEmpty()) { + if (Collections.frequency(roleId, "1") == 0 && Collections.frequency(roleId, "16") == 0) { + // 根据用户id查询是否是管理员或帮忙负责人 + Long userId = SecurityUtils.getUserId(); + List orgList = sysOrgDao.getOrgIdList(userId); + if (!orgList.isEmpty()) { + // 使用 LinkedHashSet 来保证顺序并自动去重 + Set idsSet = new LinkedHashSet<>(); + for (MapVo mapVo : orgList) { + String id = proDeptRoleDao.getOrgChildById(mapVo.getId()); + if (id != null && !id.trim().isEmpty()) { // 防止空或仅含空白字符的字符串 + // 将分割后的数组添加到 Set 中,自动去重 + Collections.addAll(idsSet, id.split(",")); + } + } + // 如果需要转换回 List 类型 + List uniqueIds = new ArrayList<>(idsSet); + bean.setOrgList(uniqueIds); + }else{ + bean.setUserId(userId); + } + } + } + MultiSheetExcelExporter exporter = new MultiSheetExcelExporter(); + //将表格时间区间取出来做标题 + String title = bean.getStartDate() + " ~ " + bean.getEndDate(); + //详情的数据导出 + Map headers = new HashMap<>(); + headers.put("2", "迟到详情"); + headers.put("3", "旷工详情"); + headers.put("4", "早退详情"); + headers.put("5", "轮休详情"); + headers.put("6", "请假详情"); + headers.put("9", "打卡地异常"); + headers.put("99", "工作外出"); + Map attStatus = getStringStringMap(); + if (StringHelper.isNotEmpty(bean.getStartDate()) && StringHelper.isNotEmpty(bean.getEndDate())) { + AttDetailBean dayTable = new AttDetailBean(); + dayTable.setStartDate(bean.getStartDate()); + dayTable.setEndDate(bean.getEndDate()); + dayTable.setName(bean.getUserName()); + if (bean.getOrgId() != null) { + dayTable.setOrgId(bean.getOrgId()); + }else{ + //受限于当前登录人 + if(bean.getOrgList() != null && !bean.getOrgList().isEmpty()){ + dayTable.setOrgList(bean.getOrgList()); + } + } + headers.entrySet() + .forEach(entry -> { + if ("99".equals(entry.getKey())) { + AttDataDetailsBean att = new AttDataDetailsBean(); + att.setStartDate(bean.getStartDate()); + att.setEndDate(bean.getEndDate()); + if (bean.getOrgId() != null) { + att.setOrgId(bean.getOrgId()); + }else{ + //受限于当前登录人 + if(bean.getOrgList() != null && !bean.getOrgList().isEmpty()){ + att.setOrgList(bean.getOrgList()); + } + } + att.setUserName(bean.getUserName()); + //存在人员换组织情况,先查人再去查工作外出 + List listOut = attendanceDetailsService.getOrgUserOutCountList(att); + //为了方便,将数据转换一下 + List list = listOut.stream() + .map(data -> { + AttDetailBean detail = new AttDetailBean(); + detail.setOrgId(data.getOrgId()); + detail.setUserId(data.getUserId()); + detail.setOrgName(data.getOrgName()); + detail.setName(data.getUserName()); + detail.setAttCurrent(data.getAttCurrentDay()); + detail.setGoWorkTime(data.getAttCurrentTime()); + detail.setGoWorkAddress(data.getAttAddress()); + // 其他字段可以根据需要设置 + return detail; + }) + .collect(Collectors.toList()); + Sheet departmentSheet2 = exporter.createSheet(entry.getValue()); + List departmentHeaders2 = Arrays.asList("序号", "部门排名", "部门内人员排名", "考勤日期", "姓名", "所属部门", "打卡时间", "打卡地址"); + exporter.addHeaderRowAndTitle(departmentSheet2, departmentHeaders2, title); + List> departmentData2 = new ArrayList<>(); + //计算排名 + List orgCounts = new ArrayList<>(); + List userCounts = new ArrayList<>(); + processAttendance(list,orgCounts,userCounts); + for (int i = 0; i < list.size(); i++) { + Map map = new LinkedHashMap<>(); + map.put("序号", i + 1); + map.put("部门排名", list.get(i).getOrgRanking()); + map.put("部门内人员排名", list.get(i).getUserRanking()); + map.put("考勤日期", list.get(i).getAttCurrent()); + map.put("姓名", list.get(i).getName()); + map.put("所属部门", list.get(i).getOrgName()); + map.put("打卡时间", list.get(i).getGoWorkTime()); + map.put("打卡地址", list.get(i).getGoWorkAddress()); + departmentData2.add(map); + } + exporter.addDataRows(departmentSheet2, departmentData2, departmentHeaders2,orgCounts,userCounts); + } else { + dayTable.setAttStatis(Integer.parseInt(entry.getKey())); + List list = attDetailByMonthService.getDetailList(dayTable); + Sheet departmentSheet2 = exporter.createSheet(entry.getValue()); + List departmentHeaders2 = Arrays.asList("序号", "部门排名", "部门内人员排名", "考勤日期", "姓名", "所属部门", "上班打卡时间", "上班状态", "上班打卡地址", "下班打卡时间", "下班状态", "下班打卡地址"); + exporter.addHeaderRowAndTitle(departmentSheet2, departmentHeaders2, title); + List> departmentData2 = new ArrayList<>(); + //对数据进行排名处理 + List orgCounts = new ArrayList<>(); + List userCounts = new ArrayList<>(); + processAttendance(list,orgCounts,userCounts); + for (int i = 0; i < list.size(); i++) { + Map map = new LinkedHashMap<>(); + map.put("序号", i + 1); + map.put("部门排名", list.get(i).getOrgRanking()); + map.put("部门内人员排名", list.get(i).getUserRanking()); + map.put("考勤日期", list.get(i).getAttCurrent()); + map.put("姓名", list.get(i).getName()); + map.put("所属部门", list.get(i).getOrgName()); + map.put("上班打卡时间", list.get(i).getGoWorkTime()); + map.put("上班状态", attStatus.get(Long.parseLong(String.valueOf(list.get(i).getGoWorkStatus())))); + map.put("上班打卡地址", list.get(i).getGoWorkAddress()); + map.put("下班打卡时间", list.get(i).getOffWorkTime()); + map.put("下班状态", attStatus.get(Long.parseLong(String.valueOf(list.get(i).getOffWorkStatus())))); + map.put("下班打卡地址", list.get(i).getOffWorkAddress()); + departmentData2.add(map); + } + exporter.addDataRows(departmentSheet2, departmentData2, departmentHeaders2,orgCounts,userCounts); + } + }); + // 导出Excel文件 + exporter.exportToResponse(response, "月报表导出"); + } + + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 计算出部门排名和人员排名 + * @param list + */ + public void processAttendance(List list, List orgCounts, List userCounts) { + // 过滤掉考勤日期、部门编号和人编号为null的记录 + List validList = list.stream() + .filter(bean -> bean.getAttCurrent() != null && bean.getOrgId() != null && bean.getUserId() != null) + .collect(Collectors.toList()); + + // 统计部门出现次数 + Map orgCount = validList.stream() + .collect(Collectors.groupingBy(AttDetailBean::getOrgId, Collectors.counting())); + + // 统计用户在部门内出现次数 + Map> userCount = validList.stream() + .collect(Collectors.groupingBy(AttDetailBean::getOrgId, + Collectors.groupingBy(AttDetailBean::getUserId, Collectors.counting()))); + + // 为部门排名 + Map orgRanking = new HashMap<>(); + List> sortedOrgs = orgCount.entrySet().stream() + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .collect(Collectors.toList()); + + for (int i = 0; i < sortedOrgs.size(); i++) { + orgRanking.put(sortedOrgs.get(i).getKey(), i + 1); + } + + // 为用户排名 + for (Map.Entry> entry : userCount.entrySet()) { + List> sortedUsers = entry.getValue().entrySet().stream() + .sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) + .collect(Collectors.toList()); + + for (int i = 0; i < sortedUsers.size(); i++) { + Long orgId = entry.getKey(); + Long userId = sortedUsers.get(i).getKey(); + int finalI = i; + validList.stream() + .filter(bean -> bean.getOrgId().equals(orgId) && bean.getUserId().equals(userId)) + .forEach(bean -> bean.setUserRanking(finalI + 1)); + } + } + + // 设置部门排名 + validList.forEach(bean -> bean.setOrgRanking(orgRanking.get(bean.getOrgId()))); + + // 将有效记录和无效记录合并 + List invalidList = list.stream() + .filter(bean -> bean.getAttCurrent() == null || bean.getOrgId() == null || bean.getUserId() == null) + .collect(Collectors.toList()); + + // 排序有效记录 + validList.sort(Comparator.comparingInt(AttDetailBean::getOrgRanking) + .thenComparingInt(AttDetailBean::getUserRanking) + .thenComparing(AttDetailBean::getAttCurrent, Comparator.reverseOrder())); + + // 合并有效和无效记录 + validList.addAll(invalidList); + // 更新原始列表 + list.clear(); + list.addAll(validList); + + //为了后续合并单元格,需要记录每个排名的数量 + int currentOrgRanking = -1; + int currentUserRanking = -1; + int orgCountNum = 0; + int userCountNum = 0; + + Long currentOrgId = null; // 跟踪当前部门ID + Long currentUserId = null; // 跟踪当前用户ID + + for (AttDetailBean bean : list) { + // 处理 orgRanking + if (bean.getOrgRanking() != currentOrgRanking) { + if (currentOrgRanking != -1) { + orgCounts.add(orgCountNum); // 记录上一个排名的数量 + } + currentOrgRanking = bean.getOrgRanking(); + orgCountNum = 1; // 重置计数 + currentOrgId = bean.getOrgId(); // 更新当前部门ID + } else { + orgCountNum++; // 增加计数 + } + // 处理 userRanking + if (bean.getUserRanking() != currentUserRanking || !bean.getOrgId().equals(currentOrgId) || !bean.getUserId().equals(currentUserId)) { + if (currentUserRanking != -1) { + userCounts.add(userCountNum); // 记录上一个排名的数量 + } + currentUserRanking = bean.getUserRanking(); + userCountNum = 1; // 重置计数 + currentOrgId = bean.getOrgId(); // 更新当前部门ID + currentUserId = bean.getUserId(); // 更新当前用户ID + } else { + userCountNum++; // 增加计数 + } + } + // 记录最后一个排名的数量 + if (orgCountNum > 0) { + orgCounts.add(orgCountNum); + } + if (userCountNum > 0) { + userCounts.add(userCountNum); + } + // 输出结果 + System.out.println("Org Ranking Counts: " + orgCounts); + System.out.println("User Ranking Counts: " + userCounts); + } + } diff --git a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttendanceDetailsMapper.xml b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttendanceDetailsMapper.xml index d77db2f..9d972a5 100644 --- a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttendanceDetailsMapper.xml +++ b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttendanceDetailsMapper.xml @@ -486,7 +486,9 @@