From 6ccabe57b46a9007f9e96e414b76ae305a078c18 Mon Sep 17 00:00:00 2001 From: fl <3098731433@qq.com> Date: Wed, 19 Feb 2025 20:02:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=8E=A8=E9=80=81=E7=AE=80?= =?UTF-8?q?=E5=8C=96=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../att/controller/AttHisPullController.java | 43 ++++--- .../system/att/dao/AttSourceDataDao.java | 30 +++++ .../bonus/system/att/entity/AttGroupBean.java | 10 ++ .../system/att/service/AttCalService.java | 46 +++++++- .../system/att/service/AttCalServiceImpl.java | 62 +++++++++- .../att/service/AttGroupServiceImpl.java | 106 +++++++++++++----- .../service/AttendanceDetailsServiceImpl.java | 7 +- .../system/att/utils/WorkdayCalculator.java | 49 ++++++++ .../mapper/att/AttSourceDataMapper.xml | 38 +++++++ .../mapper/att/AttendanceDetailsMapper.xml | 13 ++- 10 files changed, 347 insertions(+), 57 deletions(-) diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttHisPullController.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttHisPullController.java index c0caa28..b12ebc1 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttHisPullController.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/controller/AttHisPullController.java @@ -20,11 +20,10 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; /** @@ -170,12 +169,19 @@ public class AttHisPullController extends BaseController { public AjaxResult insertMonthReportTempData( AttDataDetailsBean bean) { try{ List dateList = AttTimeUtil.getStrDateListBetween(bean.getStartDate(), bean.getEndDate()); - List monthList = dateList.stream() - .map(LocalDate::parse) - .map(localDate -> localDate.format(DateTimeFormatter.ofPattern("yyyy-MM"))) - .distinct() - .collect(Collectors.toList()); - for (String date : monthList) { + //每月只保留一条数据 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Map monthMap = new HashMap<>(); + for (String dateStr : dateList) { + Date date = sdf.parse(dateStr); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + String monthKey = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1); + if (!monthMap.containsKey(monthKey)) { + monthMap.put(monthKey, dateStr); + } + } + for (String date : monthMap.values()) { attTask.insertMonthReportTempData(date); } return toAjax(true); @@ -194,12 +200,19 @@ public class AttHisPullController extends BaseController { public AjaxResult updateMonthReportData( AttDataDetailsBean bean) { try{ List dateList = AttTimeUtil.getStrDateListBetween(bean.getStartDate(), bean.getEndDate()); - List monthList = dateList.stream() - .map(LocalDate::parse) - .map(localDate -> localDate.format(DateTimeFormatter.ofPattern("yyyy-MM"))) - .distinct() - .collect(Collectors.toList()); - for (String date : monthList) { + //每月只保留一条数据 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Map monthMap = new HashMap<>(); + for (String dateStr : dateList) { + Date date = sdf.parse(dateStr); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + String monthKey = cal.get(Calendar.YEAR) + "-" + (cal.get(Calendar.MONTH) + 1); + if (!monthMap.containsKey(monthKey)) { + monthMap.put(monthKey, dateStr); + } + } + for (String date : monthMap.values()) { attTask.updateMonthReportData(date); } return toAjax(true); diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java index 0ffa811..a8306ad 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/dao/AttSourceDataDao.java @@ -257,4 +257,34 @@ public interface AttSourceDataDao { * @return */ List getAttMonthReportPerson(String pushDate); + + /** + * 查询当月某人是否已生成月报表 + * @param userId 人员编号 + * @param nowDate 时间 + */ + int getMonthReportTempDataIsExist(@Param("userId") String userId, @Param("pushDate")String nowDate); + + /** + * 查询当月某人生成的考勤规则记录 + * @param userId + * @param nowDate + * @return + */ + List getAttSettingHistoryByUserAndDate(@Param("userId") String userId,@Param("nowDate") String nowDate); + + /** + * 修改月的应考勤天数 + * @param userId + * @param nowDate + * @param i + */ + void updateMonthReportRequiredDay(@Param("userId") String userId, @Param("nowDate") String nowDate, @Param("requiredDays") Long requiredDays); + + /** + * 查询考勤人员基础数据 + * @param userId + * @return + */ + List getOrgDataByUserId(String userId); } diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java index 40453e0..afbcb78 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/entity/AttGroupBean.java @@ -162,4 +162,14 @@ public class AttGroupBean { this.entryAbnormalMinute = entryAbnormalMinute; this.attType = attType; } + + + + public AttGroupBean(Long userId, Long groupId,String currentDay) { + this.userId = userId; + this.groupId = groupId; + this.currentDay = currentDay; + } + + } 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 3220abe..456acda 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 @@ -1,7 +1,7 @@ package com.bonus.system.att.service; -import com.bonus.system.api.domain.MapVo; -import com.bonus.system.att.entity.OrgChangeBean; +import com.bonus.system.att.entity.AttGroupBean; +import com.bonus.system.att.entity.AttMonthReportBean; import java.util.List; @@ -74,4 +74,46 @@ public interface AttCalService { * @param pushDate 时间 */ void updateMonthReportData(String pushDate); + + /** + * 查询当月某人是否已生成月报表 + * @param userId 时间 + * @param nowDate 时间 + */ + int getMonthReportTempData(String userId, String nowDate); + + /** + * 查询当月某人生成的考勤规则记录 + * @param userId + * @param nowDate + * @return + */ + List getAttSettingHistoryByUserAndDate(String userId, String nowDate); + + /** + * 简单版考勤组查询 + * @return + */ + List getSimplyGroupData(); + + /** + * 修改月的应考勤天数 + * @param userId + * @param nowDate + * @param i + */ + void updateMonthReportRequiredDay(String userId, String nowDate, Long i); + + /** + * 月半才第一次加入考勤组 + * @param list + */ + void insertMonthHalfReportTempData(List list); + + /** + * 查询考勤人员基础数据 + * @param userId + * @return + */ + List getOrgDataByUserId(String 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 a205068..f7bcdac 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 @@ -69,7 +69,7 @@ public class AttCalServiceImpl implements AttCalService { LocalDate newDate = date.minusDays(n); // 如果需要将结果格式化为特定格式的字符串,可以使用以下代码 String formattedNewDate = newDate.format(DateTimeFormatter.ISO_LOCAL_DATE); - //向前推1个月的时间检索,缺少哪一天推送哪一天 + //向前推n天的时间检索,缺少哪一天推送哪一天 List dateListOne = attSourceDataDao.getAttSettingDate(startDate, n); dateList = AttTimeUtil.getStrDateListBetween(formattedNewDate, startDate); // 从 dateList 中移除所有在 dateListOne 中存在的元素 @@ -98,7 +98,7 @@ public class AttCalServiceImpl implements AttCalService { //查出人员考勤记录 AtomicReference> sourceDataList = new AtomicReference<>(attSourceDataDao.getSourceAttData(pushDate, pushType)); //查出考勤组 - List groupList = getGroupData(pushDate); + List groupList = getSimplyGroupData(); // groupList.forEach(c -> { List list = Collections.emptyList(); @@ -289,6 +289,64 @@ public class AttCalServiceImpl implements AttCalService { attSourceDataDao.updateAttMonthReport(monthReportList); } + /** + * 查询当月某人是否已生成月报表 + * @param userId 时间 + * @param nowDate 时间 + */ + @Override + public int getMonthReportTempData(String userId, String nowDate) { + return attSourceDataDao.getMonthReportTempDataIsExist( userId, nowDate); + } + + /** + * 查询当月某人生成的考勤规则记录 + * @param userId + * @param nowDate + * @return + */ + @Override + public List getAttSettingHistoryByUserAndDate(String userId, String nowDate) { + return attSourceDataDao.getAttSettingHistoryByUserAndDate( userId, nowDate); + } + + @Override + public List getSimplyGroupData() { + //查出考勤组的数据 + List groupList = Optional.ofNullable(attGroupDao.selectAttGroupList(new AttGroupBean())). + orElseGet(ArrayList::new); + if (groupList.isEmpty()) { + return new ArrayList<>(); + } + return groupList; + } + + /** + * 修改月的应考勤天数 + * @param userId + * @param nowDate + * @param i + */ + @Override + public void updateMonthReportRequiredDay(String userId, String nowDate, Long i) { + attSourceDataDao.updateMonthReportRequiredDay(userId, nowDate, i); + } + + @Override + public void insertMonthHalfReportTempData(List list) { + attSourceDataDao.insertAttMonthReportTemp(list); + } + + /** + * 查询考勤人员基础数据 + * @param userId + * @return + */ + @Override + public List getOrgDataByUserId(String userId) { + return attSourceDataDao.getOrgDataByUserId(userId); + } + /** * 人员考勤模版数据(默认是未打卡) * 每天早上0点30执行一次 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 a9aeb8e..5ec3f09 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 @@ -1,22 +1,28 @@ package com.bonus.system.att.service; -import com.bonus.common.core.constant.Constants; -import com.bonus.common.core.utils.DateTimeHelper; -import com.bonus.common.core.utils.bean.BeanUtils; +import cn.hutool.core.date.DateUtil; import com.bonus.common.security.utils.SecurityUtils; import com.bonus.system.att.dao.AttGroupDao; import com.bonus.system.att.dao.AttSourceDataDao; -import com.bonus.system.att.entity.AttDataBean; import com.bonus.system.att.entity.AttGroupBean; import com.bonus.system.att.entity.AttGroupCheckOrgBean; +import com.bonus.system.att.entity.AttMonthReportBean; +import com.bonus.system.att.entity.Holiday; import com.bonus.system.att.utils.TreeUtils; +import com.bonus.system.att.utils.WorkdayCalculator; import com.bonus.system.basic.domain.SysTree; import com.bonus.system.dept.dao.ProDeptRoleDao; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; import java.util.stream.Collectors; /** @@ -80,7 +86,7 @@ public class AttGroupServiceImpl implements AttGroupService { checkOrgAllList.get(k).setGroupId(bean.getGroupId()); } int x = attGroupDao.insertAttGroupPerson(checkOrgAllList); - addAttData(bean, checkOrgAllList); + addAttData(checkOrgAllList); if (j > 0 && (x == checkOrgAllList.size())) { result = 1; } @@ -140,7 +146,7 @@ public class AttGroupServiceImpl implements AttGroupService { if (!addList.isEmpty()) { //添加考勤组绑定人员 attGroupDao.insertAttGroupPerson(addList); - addAttData(bean, addList); + addAttData(addList); } return 1; } @@ -148,32 +154,80 @@ public class AttGroupServiceImpl implements AttGroupService { } /** - * 新增的人员 生成当天的考勤模板/与考勤规则进行绑定 + * 新增的人员 + * 考勤人员列表 + * 基模版数据生成 + * 月报表模板生成或月考勤天数修改 * - * @param bean * @param addList * @return void * @author cwchen * @date 2025/2/18 13:56 */ - public void addAttData(AttGroupBean bean, List addList) { - // 新增的人员 生成当天的考勤模板/与考勤规则进行绑定 - List list = new ArrayList<>(); - List listPerson = new ArrayList<>(); - for (AttGroupCheckOrgBean attGroupCheckOrgBean : addList) { - AttGroupBean groupBean = new AttGroupBean(); - groupBean.setGroupId(attGroupCheckOrgBean.getGroupId()); - groupBean.setUserId(Long.parseLong(attGroupCheckOrgBean.getUserId())); - groupBean.setCurrentDay(DateTimeHelper.getNowDate()); - list.add(groupBean); - } - attCalService.insertAttTempData(DateTimeHelper.getNowDate(),2); - /*// 新增考勤人员列表 - attSourceDataDao.insertAttSettingHistoryData(list); - // 查询人员组织机构ID - listPerson = attGroupDao.getUserInfo(bean, addList); - // 新增人员考勤模板数据 - attSourceDataDao.insertAttDataList(listPerson);*/ + public void addAttData(List addList) { + String nowDate = DateUtil.today(); + // 考勤人员列表添加,基模版数据生成 + attCalService.insertAttDateHistory(nowDate); + attCalService.insertAttTempData(nowDate,2); + addList.forEach(m -> { + int i = attCalService.getMonthReportTempData(m.getUserId(),nowDate); + AtomicLong requiredDays = new AtomicLong(); + //查询历史考勤规则,方便分组计算 + List dataList = attCalService.getAttSettingHistoryByUserAndDate(m.getUserId(),nowDate); + //以最后一个考勤规则补全剩下当月日期所有考勤规则数据 + // 获取最后一个数据的日期 + 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<>(); + 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()); + } + }); + } + + if(i>0){ + //存在,属于修改考勤组需要修改月报表考勤天数 + attCalService.updateMonthReportRequiredDay(m.getUserId(),nowDate,requiredDays.get()); + }else{ + //查询人当前组织 + List list = attCalService.getOrgDataByUserId(m.getUserId()); + if(!list.isEmpty()){ + list.get(0).setRequiredDays(requiredDays.intValue()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + String currentYearMonth = sdf.format(new Date()); + list.get(0).setAttCurrentMonth(currentYearMonth); + attCalService.insertMonthHalfReportTempData(list); + } + + } + }); } public Map> compareByUserId( 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 344be14..10e40d2 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 @@ -184,12 +184,7 @@ public class AttendanceDetailsServiceImpl implements AttendanceDetailsService { public List selectAttDayReportList(AttDayReportBean bean) { List list = attendanceDetailsDao.getAttDayReportList(bean); - if (bean.getOrgId() != null) { - return list.stream().filter(c -> Objects.equals(c.getOrgId(), bean.getOrgId())) - .collect(Collectors.toList()); - } else { - return getAttDayReportListAll(list); - } + return getAttDayReportListAll(list); } @Override diff --git a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/WorkdayCalculator.java b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/WorkdayCalculator.java index 16c5005..6ddd9da 100644 --- a/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/WorkdayCalculator.java +++ b/bonus-modules/bonus-system/src/main/java/com/bonus/system/att/utils/WorkdayCalculator.java @@ -65,6 +65,55 @@ public class WorkdayCalculator { return new ArrayList<>(); } + /** + * + * @param attDays 周打卡日期 + * @param type 是否有节假日 + * @param holidays 月法假 + * @param startDate 开始日期 + * @param startDate 结束日期 + * @return + */ + public static List getWorkDay(String attDays, int type, List holidays, String startDate, String endDate) { + List dueWorkDates = getDueWorkDates(attDays); + // 定义日期格式 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + try { + // 解析日期字符串为 LocalDate 对象 + LocalDate date = LocalDate.parse(startDate, formatter); + // 获取年份和月份 + int year = date.getYear(); + int month = date.getMonthValue(); // 获取月份(1-12) + // 获取工作日集合(排除周末) + List workDays = getWorkDays(year, month, dueWorkDates); + // 获取工作日字符串集合 + List dateString = getDateString(workDays); + // 获取法定节假日集合 + if (type == 1) { + holidays.forEach(c -> { + if (c.getType().equals("1")) { + dateString.remove(c.getDate()); + } else if (c.getType().equals("2")) { + dateString.add(c.getDate()); + } + }); + //只获取规定时间的考勤天数 + List strDateListBetween = AttTimeUtil.getStrDateListBetween(startDate, endDate); + // 移除不在 strDateListBetween 中的元素 + dateString.retainAll(strDateListBetween); + }else{ + //只获取规定时间的考勤天数 + List strDateListBetween = AttTimeUtil.getStrDateListBetween(startDate, endDate); + // 移除不在 strDateListBetween 中的元素 + dateString.retainAll(strDateListBetween); + } + return dateString; + } catch (Exception e) { + e.printStackTrace(); + } + return new ArrayList<>(); + } + private static List getDueWorkDates(String s) { List week = new ArrayList<>(); List list = new ArrayList<>(Arrays.asList(s.split(","))); 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 5b14a86..8044270 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 @@ -199,6 +199,12 @@ + + update att_month_report + set required_days = #{requiredDays} + where user_id = #{userId} + and att_current_month = DATE_FORMAT(#{nowDate}, '%Y-%m') + delete @@ -555,5 +561,37 @@ WHERE att_current_month = DATE_FORMAT( #{pushDate}, '%Y-%m' ) + + + \ No newline at end of file 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 eaf61dd..89068f4 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 @@ -246,13 +246,14 @@