diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttGroupDao.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttGroupDao.java index 2481054..8c9474e 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttGroupDao.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttGroupDao.java @@ -139,4 +139,10 @@ public interface AttGroupDao { * @date 2025/2/18 13:49 */ List getUserInfo(@Param("params") AttGroupBean bean, @Param("list") List addList); + /** + * 查询用户是否有考勤组 + * @param userId + * @return + */ + int getPersonAttGroup(Long userId); } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalService.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalService.java index 76cbaf1..588585e 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalService.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttCalService.java @@ -127,4 +127,11 @@ public interface AttCalService { * @param attSourceList 考勤数据 */ void insertAttSourceData(List attSourceList); + + /** + * 查询用户是否有考勤组 + * @param userId + * @return + */ + int getPersonAttGroup(Long userId); } 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 991f9cc..8f629ff 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 @@ -476,6 +476,11 @@ public class AttCalServiceImpl implements AttCalService { } } + @Override + public int getPersonAttGroup(Long userId) { + return attGroupDao.getPersonAttGroup(userId); + } + /** * 查出每一个考勤组的应出勤天数以及考勤组的规则 * diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttGroupServiceImpl.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttGroupServiceImpl.java index 3ffc746..8f82296 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttGroupServiceImpl.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttGroupServiceImpl.java @@ -142,6 +142,8 @@ public class AttGroupServiceImpl implements AttGroupService { if (!delList.isEmpty()) { //删除考勤组绑定人员 attGroupDao.deleteAttGroupPersonByUserId(delList); + //删除考勤组修改月考勤天数 + delAttGroup(delList); } if (!addList.isEmpty()) { //添加考勤组绑定人员 @@ -153,6 +155,49 @@ public class AttGroupServiceImpl implements AttGroupService { return result; } + private void delAttGroup(List delList) { + String nowDate = DateUtil.today(); + delList.forEach(m -> { + int i = attCalService.getMonthReportTempData(m.getUserId(),nowDate); + AtomicLong requiredDays = new AtomicLong(); + StringBuilder requiredDaysRemark = new StringBuilder(); + //查询历史考勤规则,方便分组计算 + List dataList = attCalService.getAttSettingHistoryByUserAndDate(m.getUserId(),nowDate); + if (!dataList.isEmpty()) { + List> result = new ArrayList<>(); + List currentList = new ArrayList<>(); + //查出考勤组 + List groupList = attCalService.getSimplyGroupData(); + List holidays = attSourceDataDao.selectHolidayByMonth(nowDate); + Long currentGroupId = dataList.get(0).getGroupId(); + for (AttGroupBean data : dataList) { + if (!Objects.equals(data.getGroupId(), currentGroupId)) { + result.add(currentList); + currentList = new ArrayList<>(); + currentGroupId = data.getGroupId(); + } + currentList.add(data); + } + result.add(currentList); + result.forEach(v -> { + List collect = groupList.stream().filter(g -> Objects.equals(g.getGroupId(), v.get(0).getGroupId())).collect(Collectors.toList()); + if(!collect.isEmpty()){ + //应考勤天数 + List attDayList = WorkdayCalculator.getWorkDay(collect.get(0).getAttDay(), + collect.get(0).getIsHaveHoliday(), holidays, v.get(0).getCurrentDay(),v.get(v.size()-1).getCurrentDay()); + requiredDays.addAndGet(attDayList.size()); + requiredDaysRemark.append(v.get(0).getCurrentDay()).append("-").append(v.get(v.size()-1).getCurrentDay()) + .append("在").append(collect.get(0).getGroupName()).append(",应考勤").append(attDayList.size()).append("天;"); + } + }); + } + if(i>0){ + //存在,属于修改考勤组需要修改月报表考勤天数 + attCalService.updateMonthReportRequiredDay(m.getUserId(),nowDate,requiredDays.get(),requiredDaysRemark.toString()); + } + }); + } + /** * 新增的人员 * 考勤人员列表 diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java index abd4ffb..b4461cb 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/service/AttendanceDetailsServiceImpl.java @@ -362,17 +362,21 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService { String attCurrentMonth = bean.getAttCurrentMonth() + "-01"; //查询历史考勤规则,方便分组计算 List dataList = attCalService.getAttSettingHistoryByUserAndDate(String.valueOf(bean.getUserId()),attCurrentMonth); + //查询那个人是否还在考勤组,如果不再了,就不需要不全当月剩余时间 + int i = attCalService.getPersonAttGroup(bean.getUserId()); AtomicLong requiredDays = new AtomicLong(); - //以最后一个考勤规则补全剩下当月日期所有考勤规则数据 - // 获取最后一个数据的日期 - AttGroupBean lastData = dataList.get(dataList.size() - 1); - LocalDate lastDate = LocalDate.parse(lastData.getCurrentDay(), DateTimeFormatter.ofPattern("yyyy-MM-dd")); - // 获取当月的总天数 - int lastDayOfMonth = lastDate.lengthOfMonth(); - // 从最后一个日期开始补全当月剩下的日期 - for (int day = lastDate.getDayOfMonth() + 1; day <= lastDayOfMonth; day++) { - LocalDate newDate = lastDate.withDayOfMonth(day); - dataList.add(new AttGroupBean(lastData.getUserId(), lastData.getGroupId(), newDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))); + if(i>0){ + //以最后一个考勤规则补全剩下当月日期所有考勤规则数据 + // 获取最后一个数据的日期 + AttGroupBean lastData = dataList.get(dataList.size() - 1); + LocalDate lastDate = LocalDate.parse(lastData.getCurrentDay(), DateTimeFormatter.ofPattern("yyyy-MM-dd")); + // 获取当月的总天数 + int lastDayOfMonth = lastDate.lengthOfMonth(); + // 从最后一个日期开始补全当月剩下的日期 + for (int day = lastDate.getDayOfMonth() + 1; day <= lastDayOfMonth; day++) { + LocalDate newDate = lastDate.withDayOfMonth(day); + dataList.add(new AttGroupBean(lastData.getUserId(), lastData.getGroupId(), newDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")))); + } } if (!dataList.isEmpty()) { List> result = new ArrayList<>(); diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/NewAttTask.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/NewAttTask.java index 233de36..52f96af 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/NewAttTask.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/tasks/NewAttTask.java @@ -29,7 +29,7 @@ public class NewAttTask { /** * 考勤模版数据定时器 凌晨10分启动一次,一天仅仅一次 */ - @Scheduled(cron = "0 10 0 * * ?") +// @Scheduled(cron = "0 10 0 * * ?") @Async public void getAttTempDataTask() { log.info("--------考勤模版数据定时器开启------"); @@ -44,7 +44,7 @@ public class NewAttTask { * 1.数据拉取(考勤)定时器 每隔1个小时获取一次数据(从早上 5 点开始,每小时执行一次) * 2.考勤数据应用(步骤一:考勤数据更新) */ - @Scheduled(cron = "0 0 5-23 * * ?") +// @Scheduled(cron = "0 0 5-23 * * ?") @Async public void getAttDataPullTask() { log.info("--------数据拉取(考勤)定时器开启------"); @@ -59,7 +59,7 @@ public class NewAttTask { * 1.数据拉取(考勤)定时器 * 2.考勤数据应用(步骤一:考勤数据更新) */ - @Scheduled(cron = "0 40 8 * * ?") +// @Scheduled(cron = "0 40 8 * * ?") @Async public void getEightAttDataPullTask() { log.info("--------数据拉取(考勤)定时器开启------"); @@ -75,7 +75,7 @@ public class NewAttTask { * 每天12点将当天未打卡考勤人员上班置为旷工 * 每天晚上22点,将下班未打卡置为旷工 */ - @Scheduled(cron = "0 0 12,22 * * ?") +// @Scheduled(cron = "0 0 12,22 * * ?") @Async public void getAbsenteeismDataTask() { log.info("--------旷工判断定时器开启------"); @@ -89,7 +89,7 @@ public class NewAttTask { * 昨日下班卡更新 * 每天7点将昨天数据更新一下 */ - @Scheduled(cron = "0 0 7 * * ?") +// @Scheduled(cron = "0 0 7 * * ?") @Async public void getYesterdayAttDataTask() { log.info("--------昨日下班卡更新定时器开启------"); @@ -107,7 +107,7 @@ public class NewAttTask { * 请假数据应用--法假 * 每天更新一次,1点更新 */ - @Scheduled(cron = "0 0 1 * * ?") +// @Scheduled(cron = "0 0 1 * * ?") @Async public void getLegalHolidayDataTask() { log.info("--------请假数据应用--法假定时器开启------"); @@ -120,7 +120,7 @@ public class NewAttTask { * 请假数据应用--请假 * 每天更新两次上午8点,下午18点(45天前数据) */ - @Scheduled(cron = "0 0 8,18 * * ?") +// @Scheduled(cron = "0 0 8,18 * * ?") @Async public void getLeaveDataTask() { log.info("--------请假数据应用--请假定时器开启------"); @@ -134,7 +134,7 @@ public class NewAttTask { * 报表数据生成--日报表 * 6点10分开始,一小时更新一次 */ - @Scheduled(cron = "0 10 6-23 * * ?") +// @Scheduled(cron = "0 10 6-23 * * ?") @Async public void getDayReportDataTask() { log.info("--------报表数据生成--日报表定时器开启------"); @@ -148,7 +148,7 @@ public class NewAttTask { * 报表数据生成--月报表 * 月初生成,之后修改 */ - @Scheduled(cron = "0 15 1 1 * ?") +// @Scheduled(cron = "0 15 1 1 * ?") @Async public void getMonthReportDataTempTask() { log.info("--------报表数据生成--月报表定时器开启------"); @@ -161,7 +161,7 @@ public class NewAttTask { * 报表数据生成--月报表 * 每日数据变化修改之后修改 */ - @Scheduled(cron = "0 0 8,10,17,19,23 * * ?") +// @Scheduled(cron = "0 0 8,10,17,19,23 * * ?") @Async public void getMonthReportDataTask() { log.info("--------报表数据生成--月报表定时器开启------"); 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 2a049a1..e164632 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 @@ -56,7 +56,7 @@ public class WechatTasks { /** * 人员基础数据同步定时器 */ - @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 15) +// @Scheduled(initialDelay = 60000, fixedDelay = 60000 * 15) @Async public void pushPersonTask() { log.info("--------人员基础数据同步定时器开启------"); @@ -84,7 +84,7 @@ public class WechatTasks { /** * 休假出差数据同步定时器 */ - @Scheduled(initialDelay = 60000 * 6, fixedDelay = 60000 * 15) +// @Scheduled(initialDelay = 60000 * 6, fixedDelay = 60000 * 15) @Async public void leaveTask() { log.info("--------休假出差数据定时器开启------"); @@ -169,7 +169,7 @@ public class WechatTasks { /** * 考勤数据同步定时器 */ - @Scheduled(initialDelay = 60000 * 12, fixedDelay = 60000 * 15) +// @Scheduled(initialDelay = 60000 * 12, fixedDelay = 60000 * 15) @Async public void wechatAttTask() { log.info("--------考勤数据定时器开启------"); 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 fb67c50..ab78df9 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 @@ -222,6 +222,7 @@ public class ExportFileController { HolidayBean vo = personLists.get(i); vo.setId((i + 1)); vo.setExamineStatus(BusinessConstants.WAIT_CHECK.equals(vo.getExamineStatus()) ? "待审核" : BusinessConstants.PASS_CHECK.equals(vo.getExamineStatus()) ? "已通过" : BusinessConstants.NOT_PASS_CHECK.equals(vo.getExamineStatus()) ? "未通过" : "撤回"); + vo.setIsTrain("1".equals(vo.getIsTrain())?"是" : "否"); //事件处理 if ("1".equals(vo.getLeaveStartInterval())) { vo.setLeaveStartInterval(vo.getLeaveStartDate() + " 上午"); @@ -288,6 +289,13 @@ public class ExportFileController { } List attList; + //结束日期过滤,最新日期不能大于当天 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + LocalDate endDate = LocalDate.parse(bean.getEndDate(), formatter); + LocalDate today = LocalDate.now(); + if (endDate.isAfter(today)) { + bean.setEndDate(today.toString()); + } if ("考勤明细".equals(bean.getExportType())) { attList = attendanceDetailsService.exportAttDetailsList(bean); } else { @@ -362,7 +370,7 @@ public class ExportFileController { .anyMatch(attDay -> dayStr.equals(attDay.getCurrentDay())); // 如果不存在,则添加新的 AttDayBean 记录 if (!dayExists) { - listAttDay.add(new AttDayBean(dayStr, "旷", "")); + listAttDay.add(new AttDayBean(dayStr, "/", "")); } } @@ -412,22 +420,13 @@ public class ExportFileController { // 导出标题 ExcelWriter writer = ExcelUtil.getWriter(true); -// writer.merge(0,0,0,2 + days.size(), -// "考勤表",true); -// -// -// writer.merge(1,1,0,2 + days.size(), -// bean.getStartDate() + "至" + bean.getEndDate() + "考勤",true); -// writer.merge(2,2,0,2 + days.size(), -// "部门:",true); - writer.merge(2 + days.size(), bean.getStartDate() + "至" + bean.getEndDate() + "考勤", true); int rowNum = 2; writer.merge(rowNum + listData.size(), rowNum + listData.size() + 1, 0, 0, "说明", false); writer.merge(rowNum + listData.size(), rowNum + listData.size(), 1, 2 + days.size(), - "1.考勤记录:出勤记“√”,出差记“Δ”,年休假记“年”,探亲假记“探”,事假记“事”,法定假记“法”,病假记“病”,产假记“产”,婚假记“婚”,丧假记“丧”,育儿假记“育”,陪护假记“陪”,补休记“补”,旷工记“旷”,迟到记“迟”,早退记“退”,流产假记“流”,哺乳假记“哺”,节育假记“节”,父母护理假记“护”,其他记“其他”,省内工地记“工”,省外工地记“外”,出差需在备注栏备注清楚出差地点。", false); + "1.考勤记录:出勤记“√”,出差记“Δ”,年休假记“年”,探亲假记“探”,事假记“事”,法定假记“法”,病假记“病”,产假记“产”,婚假记“婚”,丧假记“丧”,育儿假记“育”,陪护假记“陪”,补休记“补”,旷工记“旷”,迟到记“迟”,早退记“退”,流产假记“流”,哺乳假记“哺”,节育假记“节”,父母护理假记“护”,其他记“其他”,省内工地记“工”,省外工地记“外”,未在考勤组记“/”,出差需在备注栏备注清楚出差地点。", false); writer.merge(rowNum + listData.size() + 1, rowNum + listData.size() + 1, 1, 2 + days.size(), "2.员工有关请假凭证,记录清楚准确,与本表于次月3日前一并报人力资源管理部门(专业分公司报送时间为30日前)。", false); writer.autoSizeColumn(3); @@ -526,11 +525,13 @@ public class ExportFileController { try { List orgHistoryList = sysOrgService.getOrgHistoryList(bean); for (int i = 0; i < orgHistoryList.size(); i++) { + SysOrgHistoryBean o = orgHistoryList.get(i); + o.setId(i + 1L); // 创建一个 SimpleDateFormat 对象,用于格式化日期 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 将 Date 转换为 String - String dateString = formatter.format(orgHistoryList.get(i).getChangeTime()); - orgHistoryList.get(i).setUpdateTime(dateString); + String dateString = formatter.format(o.getChangeTime()); + o.setUpdateTime(dateString); } extracted(orgHistoryList, SysOrgHistoryBean.class, "组织变更记录", "组织变更记录", "组织变更记录导出", response); } catch (Exception e) { diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/holiday/entity/HolidayBean.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/holiday/entity/HolidayBean.java index 598a0c7..4cd4721 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/holiday/entity/HolidayBean.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/holiday/entity/HolidayBean.java @@ -146,6 +146,7 @@ public class HolidayBean extends BaseBean { /** * 是否培训 1 是 0 否 */ + @Excel(name = "是否培训", width = 20.0,height = 20.0, orderNum = "8") private String isTrain; /** diff --git a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml index 1326b69..705a141 100644 --- a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml +++ b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttGroupMapper.xml @@ -122,6 +122,12 @@ #{item.userId} + update att_group diff --git a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml index ac3cc03..484893f 100644 --- a/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml +++ b/bonus-modules/bonus-system/src/main/resources/mapper/att/AttSourceDataMapper.xml @@ -200,7 +200,7 @@ lat as attLat, IF(attendance_external = '外勤打卡', 1, 2) as isOutsideAtt, '1' as dataSource - from gz_cloud.fc_sup_attendance sup + from gz_cloud_test.fc_sup_attendance sup where sup.attendance_date = #{pushDate} and is_wechat != 1 @@ -363,7 +363,7 @@ AND la.examine_status = 1 AND sdd.dict_value IS NOT NULL AND - (leave_start_date BETWEEN #{pushDate} - INTERVAL 15 DAY + (leave_start_date BETWEEN #{pushDate} - INTERVAL 1 DAY and #{pushDate} or #{pushDate} between leave_start_date and leave_end_date ) diff --git a/bonus-modules/bonus-system/src/main/resources/mapper/att/WechatPushMapper.xml b/bonus-modules/bonus-system/src/main/resources/mapper/att/WechatPushMapper.xml index d9bd983..79c3516 100644 --- a/bonus-modules/bonus-system/src/main/resources/mapper/att/WechatPushMapper.xml +++ b/bonus-modules/bonus-system/src/main/resources/mapper/att/WechatPushMapper.xml @@ -38,7 +38,7 @@ - replace INTO gz_cloud.fc_sup_attendance ( + replace INTO gz_cloud_test.fc_sup_attendance ( name, id_number, org_id, @@ -203,7 +203,7 @@ If(PROJECT_ID is null,0,PROJECT_ID) AS proId, If(ORG_ID is null,0,ORG_ID) AS orgId FROM - gz_cloud.bm_sup_attend_history + gz_cloud_test.bm_sup_attend_history WHERE ID_NUMBER = #{idNumber} limit 1