feat(holiday): 新增员工加入考勤组时自动发放假期余额功能
- 在 AttendanceGroupUserServiceImpl 中添加新逻辑,为新加入考勤组的员工发放假期余额 - 修改 HolidayUserRecordService接口,增加 recordZero 参数控制是否记录零值假期 - 实现 HolidayUserRecordServiceImpl 中的 grant 方法,支持 recordZero 参数 - 优化 HolidaySettingService 接口,增加按 ID 列表获取假期设置的方法 - 实现 HolidaySettingServiceImpl 中的 getHolidaySettingByIds 方法 - 扩展 HolidaySettingRangeService 接口,增加按考勤组 ID 获取假期设置的方法 - 实现 HolidaySettingRangeServiceImpl 中的 getByGroupId 和 getHolidaySettingIdsByGroupId 方法
This commit is contained in:
parent
b29d9a490d
commit
425576ecd3
@ -80,7 +80,8 @@ public class HolidayGrantJob {
|
||||
editList.add(holidayBalanceSettingDO);
|
||||
Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId();
|
||||
// 发放假期
|
||||
holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId));
|
||||
holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId),
|
||||
holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId), false);
|
||||
}
|
||||
}
|
||||
// -- // 按照员工入职日 每年员工入职日
|
||||
@ -91,7 +92,8 @@ public class HolidayGrantJob {
|
||||
for (HolidayBalanceSettingDO holidayBalanceSettingDO : employmentGrantList) {
|
||||
Long holidaySettingId = holidayBalanceSettingDO.getHolidaySettingId();
|
||||
// 发放假期
|
||||
holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId), holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId));
|
||||
holidayUserRecordService.grant(holidaySettingMap.get(holidaySettingId), holidaySettingRangeMap.get(holidaySettingId),
|
||||
holidayBalanceSettingDO, holidayWorkingAgeDOMap.get(holidaySettingId), false);
|
||||
}
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(editList)) {
|
||||
|
@ -1,6 +1,8 @@
|
||||
package cn.iocoder.yudao.module.system.service.attendance.groupuser;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.collection.CollectionUtil;
|
||||
import cn.hutool.core.collection.ListUtil;
|
||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||
import cn.iocoder.yudao.framework.common.Constants;
|
||||
import cn.iocoder.yudao.framework.common.pojo.PageResult;
|
||||
@ -10,11 +12,17 @@ import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.AttendanceGr
|
||||
import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.AttendanceGroupUserSaveReqVO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysetting.HolidaySettingDO;
|
||||
import cn.iocoder.yudao.module.system.dal.dataobject.holiday.holidaysettingrange.HolidaySettingRangeDO;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupuser.AttendanceGroupUserMapper;
|
||||
import cn.iocoder.yudao.module.system.dal.mysql.attendance.punchrecord.AttendancePunchRecordMapper;
|
||||
import cn.iocoder.yudao.module.system.service.attendance.punch.dto.AttendanceOnTheDayDTO;
|
||||
import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService;
|
||||
import cn.iocoder.yudao.module.system.service.holiday.holidaysetting.HolidaySettingService;
|
||||
import cn.iocoder.yudao.module.system.service.holiday.holidaysettingrange.HolidaySettingRangeService;
|
||||
import cn.iocoder.yudao.module.system.service.holiday.holidayuserrecord.HolidayUserRecordService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import org.springframework.context.annotation.Lazy;
|
||||
import org.springframework.data.redis.core.StringRedisTemplate;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
@ -25,6 +33,7 @@ import java.time.temporal.ChronoUnit;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||
@ -47,6 +56,13 @@ public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserServic
|
||||
private AttendancePunchRecordMapper attendancePunchRecordMapper;
|
||||
@Resource
|
||||
private AttendancePunchRecordService attendancePunchRecordService;
|
||||
@Resource
|
||||
private HolidayUserRecordService holidayUserRecordService;
|
||||
@Resource
|
||||
private HolidaySettingRangeService holidaySettingRangeService;
|
||||
@Resource
|
||||
@Lazy
|
||||
private HolidaySettingService holidaySettingService;
|
||||
|
||||
@Override
|
||||
public AttendanceGroupUserCreateOrDelVO createOrDel(Long attendanceGroupId, List<Long> userIds) {
|
||||
@ -66,10 +82,28 @@ public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserServic
|
||||
.in(AttendanceGroupUserDO::getUserId, delIds));
|
||||
}
|
||||
if (CollectionUtil.isNotEmpty(saveIds)) {
|
||||
List<HolidaySettingRangeDO> items = new ArrayList<>();
|
||||
for (Long userId : saveIds) {
|
||||
list.add(new AttendanceGroupUserDO().setUserId(userId).setAttendanceGroupId(attendanceGroupId));
|
||||
|
||||
HolidaySettingRangeDO item = new HolidaySettingRangeDO();
|
||||
item.setType(3);
|
||||
item.setObjectId(userId);
|
||||
items.add(item);
|
||||
}
|
||||
groupUserMapper.insertBatch(list);
|
||||
// -- 新添加到考勤组的 需要同步更新员工假期余额
|
||||
// -- 获取当前用户所在的考勤组 - 再根据考勤组 查询对应的加班规则
|
||||
List<Long> holidaySettingIds = holidaySettingRangeService.getHolidaySettingIdsByGroupId(attendanceGroupId);
|
||||
|
||||
if (CollUtil.isNotEmpty(holidaySettingIds)) {
|
||||
List<HolidaySettingDO> holidaySettings = holidaySettingService.getHolidaySettingByIds(holidaySettingIds);
|
||||
Map<Long, HolidaySettingDO> holidaySettingMap = holidaySettings.stream().collect(Collectors.toMap(HolidaySettingDO::getId, holidaySettingDO -> holidaySettingDO));
|
||||
for (HolidaySettingDO holidaySetting : holidaySettings) {
|
||||
holidayUserRecordService.grant(holidaySetting,
|
||||
items, holidaySettingMap.get(holidaySetting.getId()).getHolidayBalanceSettingDO(), ListUtil.empty(), true);
|
||||
}
|
||||
}
|
||||
}
|
||||
vo.setAttendanceGroupId(attendanceGroupId);
|
||||
vo.setDelUserIds(delIds);
|
||||
@ -151,4 +185,4 @@ public class AttendanceGroupUserServiceImpl implements AttendanceGroupUserServic
|
||||
.stream().map(AttendanceGroupUserDO::getUserId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -102,4 +102,12 @@ public interface HolidaySettingService {
|
||||
* @return
|
||||
*/
|
||||
List<HolidaySettingDO> getLimitBalanceHolidayList();
|
||||
|
||||
/**
|
||||
* 根据ids获取
|
||||
*
|
||||
* @param holidaySettingIds
|
||||
* @return
|
||||
*/
|
||||
List<HolidaySettingDO> getHolidaySettingByIds(List<Long> holidaySettingIds);
|
||||
}
|
||||
|
@ -289,6 +289,16 @@ public class HolidaySettingServiceImpl implements HolidaySettingService {
|
||||
return holidaySettingMapper.getLimitBalanceHolidayList();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<HolidaySettingDO> getHolidaySettingByIds(List<Long> holidaySettingIds) {
|
||||
List<HolidaySettingDO> holidaySettingDOS = holidaySettingMapper.selectBatchIds(holidaySettingIds);
|
||||
Map<Long, HolidayBalanceSettingDO> map = holidayBalanceSettingService.selectBySettingIds(holidaySettingIds);
|
||||
for (HolidaySettingDO holidaySettingDO : holidaySettingDOS) {
|
||||
holidaySettingDO.setHolidayBalanceSettingDO(map.get(holidaySettingDO.getId()));
|
||||
}
|
||||
return holidaySettingDOS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 编辑假期设置
|
||||
|
@ -84,4 +84,20 @@ public interface HolidaySettingRangeService {
|
||||
* @return
|
||||
*/
|
||||
List<HolidaySettingRangeDO> getListByHolidaySettingIds(List<Long> holidaySettingIds);
|
||||
|
||||
/**
|
||||
* 根据考勤组id获取当前考勤组所在的假期
|
||||
*
|
||||
* @param groupId
|
||||
* @return
|
||||
*/
|
||||
List<HolidaySettingRangeDO> getByGroupId(Long groupId);
|
||||
|
||||
/**
|
||||
* 根据考勤组id 获取和考勤组关联的假期ids
|
||||
*
|
||||
* @param groupId
|
||||
* @return
|
||||
*/
|
||||
List<Long> getHolidaySettingIdsByGroupId(Long groupId);
|
||||
}
|
||||
|
@ -101,11 +101,23 @@ public class HolidaySettingRangeServiceImpl implements HolidaySettingRangeServic
|
||||
|
||||
@Override
|
||||
public List<HolidaySettingRangeDO> getListByHolidaySettingIds(List<Long> holidaySettingIds) {
|
||||
if (CollUtil.isEmpty(holidaySettingIds)){
|
||||
if (CollUtil.isEmpty(holidaySettingIds)) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return holidaySettingRangeMapper.selectList(new LambdaQueryWrapper<HolidaySettingRangeDO>()
|
||||
.in(HolidaySettingRangeDO::getHolidaySettingId, holidaySettingIds));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<HolidaySettingRangeDO> getByGroupId(Long groupId) {
|
||||
return holidaySettingRangeMapper.selectList(new LambdaQueryWrapper<HolidaySettingRangeDO>()
|
||||
.eq(HolidaySettingRangeDO::getType, 1)
|
||||
.eq(HolidaySettingRangeDO::getObjectId, groupId));
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Long> getHolidaySettingIdsByGroupId(Long groupId) {
|
||||
return this.getByGroupId(groupId).stream().map(HolidaySettingRangeDO::getHolidaySettingId).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ public interface HolidayUserRecordService {
|
||||
* @param holidayBalanceSettingDO
|
||||
* @param holidayWorkingAgeDOS
|
||||
*/
|
||||
void grant(HolidaySettingDO holidaySetting, List<HolidaySettingRangeDO> holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List<HolidayWorkingAgeDO> holidayWorkingAgeDOS);
|
||||
void grant(HolidaySettingDO holidaySetting, List<HolidaySettingRangeDO> holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List<HolidayWorkingAgeDO> holidayWorkingAgeDOS, Boolean recordZero);
|
||||
|
||||
/**
|
||||
* 清空假期余额
|
||||
|
@ -94,7 +94,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService {
|
||||
List<HolidayUserRecordDO> newHolidayUserRecordDOList = new ArrayList<>();
|
||||
List<HolidayUserDO> newHolidayUserDOList = new ArrayList<>();
|
||||
String remark = myself.getNickname() + " 为" + targetUser.getNickname() + (createReqVO.getDirection() == 0 ? "增加" : "减去");
|
||||
this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, createReqVO.getDirection(), createReqVO.getReason());
|
||||
this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList,
|
||||
newHolidayUserDOList, now, remark, createReqVO.getDirection(), createReqVO.getReason(), false);
|
||||
|
||||
if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) {
|
||||
holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList);
|
||||
@ -184,7 +185,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService {
|
||||
List<HolidayUserRecordDO> newHolidayUserRecordDOList = new ArrayList<>();
|
||||
List<HolidayUserDO> newHolidayUserDOList = new ArrayList<>();
|
||||
String remark = targetUser.getNickname() + "使用了 ";
|
||||
this.calculateUserHolidays(userQuotaMap, dto.getUserId(), holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason());
|
||||
this.calculateUserHolidays(userQuotaMap, dto.getUserId(), holidayUserDOMap, holidaySetting, holidayBalanceSettingDO,
|
||||
newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason(), false);
|
||||
|
||||
List<HolidayUserRecordDO> editList = new ArrayList<>();
|
||||
if (dto.getDirection() == 1) {
|
||||
@ -292,7 +294,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService {
|
||||
|
||||
|
||||
@Override
|
||||
public void grant(HolidaySettingDO holidaySetting, List<HolidaySettingRangeDO> holidaySettingRangeDOS, HolidayBalanceSettingDO holidayBalanceSettingDO, List<HolidayWorkingAgeDO> holidayWorkingAgeDOS) {
|
||||
public void grant(HolidaySettingDO holidaySetting, List<HolidaySettingRangeDO> holidaySettingRangeDOS,
|
||||
HolidayBalanceSettingDO holidayBalanceSettingDO, List<HolidayWorkingAgeDO> holidayWorkingAgeDOS, Boolean recordZero) {
|
||||
// -- 先查询出所有用户
|
||||
List<AdminUserDO> users = this.getUsersByRange(holidaySetting, holidaySettingRangeDOS);
|
||||
// -- 计算获取每个人的假期额度
|
||||
@ -334,7 +337,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService {
|
||||
}
|
||||
for (Long userId : userIds) {
|
||||
String remark = "系统按照规则自动 增加";
|
||||
this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, 0, null);
|
||||
this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO,
|
||||
newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, 0, null, recordZero);
|
||||
}
|
||||
// TODO: 2024/10/23 这里可能还会慢
|
||||
if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) {
|
||||
@ -427,10 +431,10 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService {
|
||||
private void calculateUserHolidays(Map<Long, BigDecimal> userQuotaMap, Long userId, Map<Long, HolidayUserDO> holidayUserDOMap,
|
||||
HolidaySettingDO holidaySetting, HolidayBalanceSettingDO holidayBalanceSettingDO,
|
||||
List<HolidayUserRecordDO> newHolidayUserRecordDOList, List<HolidayUserDO> newHolidayUserDOList,
|
||||
LocalDateTime now, String remark, Integer direction, String reason) {
|
||||
LocalDateTime now, String remark, Integer direction, String reason, Boolean recordZero) {
|
||||
BigDecimal quota = userQuotaMap.get(userId);
|
||||
// -- 如果是0的话就不记录了
|
||||
if (quota == null || BigDecimal.ZERO.compareTo(quota) == 0) {
|
||||
// -- 如果是0的话就不记录了 -- 如果不记录0 并且是0 直接return
|
||||
if (quota == null || (BigDecimal.ZERO.compareTo(quota) == 0 && !recordZero)) {
|
||||
return;
|
||||
}
|
||||
HolidayUserDO holidayUserDO = holidayUserDOMap.get(userId);
|
||||
@ -783,7 +787,8 @@ public class HolidayUserRecordServiceImpl implements HolidayUserRecordService {
|
||||
List<HolidayUserRecordDO> newHolidayUserRecordDOList = new ArrayList<>();
|
||||
List<HolidayUserDO> newHolidayUserDOList = new ArrayList<>();
|
||||
String remark = "加班" + (dto.getDirection() == 0 ? "增加" : "减去");
|
||||
this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO, newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason());
|
||||
this.calculateUserHolidays(userQuotaMap, userId, holidayUserDOMap, holidaySetting, holidayBalanceSettingDO,
|
||||
newHolidayUserRecordDOList, newHolidayUserDOList, now, remark, dto.getDirection(), dto.getReason(), false);
|
||||
if (CollUtil.isNotEmpty(newHolidayUserRecordDOList)) {
|
||||
holidayUserRecordMapper.insertBatch(newHolidayUserRecordDOList);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user