处理排班跨月且覆盖当月最后一天的情况,如排班从当月开始,下个月结束

This commit is contained in:
dy 2025-08-20 22:08:01 +08:00
parent f7d1f81940
commit f23b02fe51
2 changed files with 45 additions and 5 deletions

View File

@ -22,6 +22,13 @@ public interface AttendanceArrangementMapper extends BaseMapperPlus<AttendanceAr
List<AttendanceArrangement> selectArrangementList(LocalDate calendarStartDate, LocalDate calendarEndTimeDate); List<AttendanceArrangement> selectArrangementList(LocalDate calendarStartDate, LocalDate calendarEndTimeDate);
@Select("SELECT id, schedule_name, group_id, schedule_type, date_type, start_date, end_date, status, tenant_id, create_dept, create_by, create_time, update_by, update_time FROM attendance_arrangement WHERE (SELECT DATE_FORMAT(CURDATE(), '%Y-%m-01') BETWEEN start_date AND end_date) AND tenant_id = '000000';")
List<AttendanceArrangementVo> selectCalendarStartList();
@Select("SELECT id, schedule_name, group_id, schedule_type, date_type, start_date, end_date, status, tenant_id, create_dept, create_by, create_time, update_by, update_time FROM attendance_arrangement WHERE (SELECT LAST_DAY(CURDATE()) BETWEEN start_date AND end_date) AND tenant_id = '000000';")
List<AttendanceArrangementVo> selectCalendarEndDateList();
// List<AttendanceArrangement> selectArrangementList(AttendanceArrangementBo bo); // List<AttendanceArrangement> selectArrangementList(AttendanceArrangementBo bo);

View File

@ -1,6 +1,7 @@
package org.dromara.property.service.impl; package org.dromara.property.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@ -23,6 +24,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.Month;
import java.time.ZoneId; import java.time.ZoneId;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -331,7 +333,8 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
LocalDate calendarStartDate = month.withDayOfMonth(1); LocalDate calendarStartDate = month.withDayOfMonth(1);
LocalDate calendarEndDate = month.withDayOfMonth(calendarStartDate.lengthOfMonth()); LocalDate calendarEndDate = month.withDayOfMonth(calendarStartDate.lengthOfMonth());
//使用mybatisplus的between查询在calendarStartDate和calendarEndDate之间的排班信息 //判断
//查询开始时间在calendarStartDate和calendarEndDate之间的排班信息
List<AttendanceArrangementVo> startResult = baseMapper.selectVoList(Wrappers.<AttendanceArrangement>lambdaQuery() List<AttendanceArrangementVo> startResult = baseMapper.selectVoList(Wrappers.<AttendanceArrangement>lambdaQuery()
.between(AttendanceArrangement::getStartDate, calendarStartDate.atStartOfDay(ZoneId.systemDefault()).toInstant(), .between(AttendanceArrangement::getStartDate, calendarStartDate.atStartOfDay(ZoneId.systemDefault()).toInstant(),
calendarEndDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant().minusSeconds(1))); calendarEndDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant().minusSeconds(1)));
@ -341,7 +344,13 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
.between(AttendanceArrangement::getEndDate, calendarStartDate.atStartOfDay(ZoneId.systemDefault()).toInstant(), .between(AttendanceArrangement::getEndDate, calendarStartDate.atStartOfDay(ZoneId.systemDefault()).toInstant(),
calendarEndDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant().minusSeconds(1))); calendarEndDate.atStartOfDay(ZoneId.systemDefault()).plusDays(1).toInstant().minusSeconds(1)));
//合并两个list并去重 //查询日历开始时间calendarStartDate在排班开始时间和结束时间之间的信息处理排班跨月且覆盖当月最后一天的情况如排班从当月开始下个月结束
List<AttendanceArrangementVo> attendanceCalendarStartVos = baseMapper.selectCalendarStartList();
//查询日历结束时间calendarStartDate在排班开始时间和结束时间之间的信息处理排班跨月且覆盖当月最后一天的情况如排班从当月开始下个月结束
List<AttendanceArrangementVo> attendanceCalendarEndDateVos = baseMapper.selectCalendarEndDateList();
//合并四个list并去重
List<AttendanceArrangementVo> result = new ArrayList<>(startResult.stream().distinct().toList()); List<AttendanceArrangementVo> result = new ArrayList<>(startResult.stream().distinct().toList());
result.addAll(endResult.stream().map(vo -> { result.addAll(endResult.stream().map(vo -> {
AttendanceArrangementVo newVo = MapstructUtils.convert(vo, AttendanceArrangementVo.class); AttendanceArrangementVo newVo = MapstructUtils.convert(vo, AttendanceArrangementVo.class);
@ -349,6 +358,17 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
newVo.setEndDate(vo.getEndDate()); newVo.setEndDate(vo.getEndDate());
return newVo; return newVo;
}).toList()); }).toList());
result.addAll(attendanceCalendarStartVos.stream().distinct().toList());
result.addAll(attendanceCalendarEndDateVos.stream().distinct().toList());
// //合并两个list并去重
// List<AttendanceArrangementVo> result = new ArrayList<>(startResult.stream().distinct().toList());
// result.addAll(endResult.stream().map(vo -> {
// AttendanceArrangementVo newVo = MapstructUtils.convert(vo, AttendanceArrangementVo.class);
// newVo.setStartDate(vo.getStartDate());
// newVo.setEndDate(vo.getEndDate());
// return newVo;
// }).toList());
//去掉result中id重复的排班信息 //去掉result中id重复的排班信息
result = result.stream().distinct().toList(); result = result.stream().distinct().toList();
@ -493,13 +513,13 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
public Boolean insertByBo(AttendanceArrangementBo bo) { public Boolean insertByBo(AttendanceArrangementBo bo) {
//新增排班 //新增排班
AttendanceArrangement add = MapstructUtils.convert(bo, AttendanceArrangement.class); AttendanceArrangement add = MapstructUtils.convert(bo, AttendanceArrangement.class);
judgeDate(bo, add);
validEntityBeforeSave(add); validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0; boolean flag = baseMapper.insert(add) > 0;
if (flag) { if (flag) {
bo.setId(add.getId()); bo.setId(add.getId());
} }
judgeDate(bo, add);
//取出当前新增的排班的id //取出当前新增的排班的id
Long ArrangementId = add.getId(); Long ArrangementId = add.getId();
List<Long> areaId = bo.getAreaId(); List<Long> areaId = bo.getAreaId();
@ -518,7 +538,20 @@ public class AttendanceArrangementServiceImpl implements IAttendanceArrangementS
for (AttendanceUserGroup userGroup : userGroupList) { for (AttendanceUserGroup userGroup : userGroupList) {
userGroup.setScheduleId(ArrangementId); userGroup.setScheduleId(ArrangementId);
userGroup.setStartDate(bo.getStartDate()); userGroup.setStartDate(bo.getStartDate());
userGroup.setEndDate(bo.getEndDate()); //判断排班日期是单个日期还是从此日期开始循环有效还是从此日期开始有效
//1.单个日期
if (bo.getDateType().equals(StatusConstant.SINGLE)) {
userGroup.setEndDate(null);
}
//2.从此日期开始长期有效
if (bo.getDateType().equals(StatusConstant.LONGTIME)) {
//设置长期时间为2099年12月31日
LocalDate longTimeEndDate = LocalDate.of(2099, 12, 31);
userGroup.setEndDate(longTimeEndDate);
}
if (bo.getDateType().equals(StatusConstant.SHORTTIME)) {
userGroup.setEndDate(bo.getEndDate());
}
userGroupMapper.insert(userGroup); userGroupMapper.insert(userGroup);
} }