This commit is contained in:
dy 2025-07-18 10:03:20 +08:00
parent f16a9e0897
commit d8dfde621e
6 changed files with 111 additions and 21 deletions

View File

@ -65,8 +65,8 @@ public class AttendanceGroupController extends BaseController {
@SaCheckPermission("Property:group:query")
@GetMapping("/{id}")
public R<AttendanceGroupVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("id") Long id) {
return R.ok(attendanceGroupService.queryById(id));
@PathVariable("id") Long id,Integer attendanceType) {
return R.ok(attendanceGroupService.queryById(id,attendanceType));
}
/**
@ -88,6 +88,7 @@ public class AttendanceGroupController extends BaseController {
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody AttendanceGroupBo bo) {
//todo:考勤组的修改待确定
return toAjax(attendanceGroupService.updateByBo(bo));
}
@ -100,7 +101,7 @@ public class AttendanceGroupController extends BaseController {
@Log(title = "考勤组基本信息", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable("ids") Long[] ids) {
return toAjax(attendanceGroupService.deleteWithValidByIds(List.of(ids), true));
@PathVariable("ids") Long[] ids,Integer attendanceType) {
return toAjax(attendanceGroupService.deleteWithValidByIds(List.of(ids), true,attendanceType));
}
}

View File

@ -30,7 +30,7 @@ public class AttendanceScheduleCycle extends TenantEntity {
/**
* 周期中的第几天(1开始)
*/
private Long dayNumber;
private Integer dayNumber;
/**
* 关联排班组id

View File

@ -9,7 +9,11 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.dromara.system.domain.SysDept;
import org.dromara.system.domain.SysRole;
/**
* 排班业务对象 attendance_arrangement
@ -63,5 +67,9 @@ public class AttendanceArrangementBo extends BaseEntity {
*/
private Long status;
private List<SysRole> roleList;
private List<SysDept> deptList;
}

View File

@ -7,7 +7,9 @@ import org.dromara.common.excel.annotation.ExcelDictFormat;
import org.dromara.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import org.dromara.property.domain.AttendanceShift;
import org.dromara.property.domain.AttendanceWeekSet;
import org.dromara.property.domain.AttendanceWeeksetShift;
import java.io.Serial;
import java.io.Serializable;
@ -56,5 +58,9 @@ public class AttendanceGroupVo implements Serializable {
List<AttendanceWeekSet> weekList;
List<AttendanceWeeksetShift> shiftList;
List<AttendanceShift> attendanceList;
}

View File

@ -23,7 +23,7 @@ public interface IAttendanceGroupService {
* @param id 主键
* @return 考勤组基本信息
*/
AttendanceGroupVo queryById(Long id);
AttendanceGroupVo queryById(Long id,Integer attendanceType);
/**
* 分页查询考勤组基本信息列表
@ -65,5 +65,5 @@ public interface IAttendanceGroupService {
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid,Integer attendanceType);
}

View File

@ -11,14 +11,11 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.property.domain.*;
import org.dromara.property.domain.constant.StatusConstant;
import org.dromara.property.mapper.AttendanceClockDateMapper;
import org.dromara.property.mapper.AttendanceFixedScheduleMapper;
import org.dromara.property.mapper.AttendanceWeekSetMapper;
import org.dromara.property.mapper.*;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.dromara.property.domain.bo.AttendanceGroupBo;
import org.dromara.property.domain.vo.AttendanceGroupVo;
import org.dromara.property.mapper.AttendanceGroupMapper;
import org.dromara.property.service.IAttendanceGroupService;
import org.springframework.transaction.annotation.Transactional;
@ -27,6 +24,9 @@ import java.util.Map;
import java.util.Collection;
import java.util.Objects;
import static org.dromara.property.domain.constant.StatusConstant.FIXEDSCHEDULE;
import static org.dromara.property.domain.constant.StatusConstant.SHIFTSCHEDULE;
/**
* 考勤组基本信息Service业务层处理
*
@ -44,6 +44,11 @@ public class AttendanceGroupServiceImpl implements IAttendanceGroupService {
private final AttendanceClockDateMapper attendanceClockDateMapper;
private final AttendanceScheduleCycleMapper attendanceScheduleCycleMapper;
private final AttendanceWeeksetShiftMapper attendanceWeeksetShiftMapper;
private final AttendanceShiftMapper attendanceShiftMapper;
/**
* 查询考勤组基本信息
*
@ -51,8 +56,42 @@ public class AttendanceGroupServiceImpl implements IAttendanceGroupService {
* @return 考勤组基本信息
*/
@Override
public AttendanceGroupVo queryById(Long id) {
return baseMapper.selectVoById(id);
public AttendanceGroupVo queryById(Long id, Integer attendanceType) {
//根据id参数查询考勤组表
AttendanceGroupVo vo = baseMapper.selectVoById(id);
//判断考勤是固定班制还是排班制
if (Objects.equals(attendanceType, FIXEDSCHEDULE)) {
//1.固定班制
//1.1根据id参数查询考勤周期表
List<AttendanceWeekSet> weekSets = weekSetMapper.selectList(Wrappers.<AttendanceWeekSet>lambdaQuery().eq(AttendanceWeekSet::getGroupId, id));
//1.2根据id参数取出所有考勤周期id
List<Long> weekSetIds = weekSets.stream().map(AttendanceWeekSet::getId).toList();
//1.3根据考勤周期id查询出中间表
List<AttendanceWeeksetShift> weeksetShifts = attendanceWeeksetShiftMapper.selectList(Wrappers.<AttendanceWeeksetShift>lambdaQuery().in(AttendanceWeeksetShift::getWeekSetId, weekSetIds));
//1.4根据中间表的班次id查询出班次表id
List<Long> shiftIds = weeksetShifts.stream().map(AttendanceWeeksetShift::getShiftId).toList();
//1.5根据班次id查询出班次表
List<AttendanceShift> shifts = attendanceShiftMapper.selectList(Wrappers.<AttendanceShift>lambdaQuery().in(AttendanceShift::getId, shiftIds));
//1.6将查询后的数据封装到attendanceGroupVo中
vo.setAttendanceList(shifts);
} else if(Objects.equals(attendanceType, SHIFTSCHEDULE)) {
//2.排班制
//2.1根据id参数查询考勤周期表
List<AttendanceWeekSet> weekSets = weekSetMapper.selectList(Wrappers.<AttendanceWeekSet>lambdaQuery().eq(AttendanceWeekSet::getGroupId, id));
//2.2根据id参数取出所有考勤天数id
List<Long> weekSetIds = weekSets.stream().map(AttendanceWeekSet::getId).toList();
//2.3根据天数id查询出中间表
List<AttendanceScheduleCycle> scheduleCycles = attendanceScheduleCycleMapper.selectList(Wrappers.<AttendanceScheduleCycle>lambdaQuery().in(AttendanceScheduleCycle::getGroupId, weekSetIds));
//2.4根据中间表的班次id查询出班次表id
List<Long> scheduleCycleIds = scheduleCycles.stream().map(AttendanceScheduleCycle::getId).toList();
//2.5根据班次id查询出班次表
List<AttendanceShift> shifts = attendanceShiftMapper.selectList(Wrappers.<AttendanceShift>lambdaQuery().in(AttendanceShift::getId, scheduleCycleIds));
//2.6将查询后的数据封装到attendanceGroupVo中
vo.setAttendanceList(shifts);
}
return vo;
}
/**
@ -111,8 +150,9 @@ public class AttendanceGroupServiceImpl implements IAttendanceGroupService {
bo.setId(add.getId());
}
//2.判断考勤是固定班制还是排班制
if (Objects.equals(add.getAttendanceType(), StatusConstant.FIXEDSCHEDULE)) {
//判断考勤是固定班制还是排班制
//2.固定班制
if (Objects.equals(add.getAttendanceType(), FIXEDSCHEDULE)) {
//2.1固定班制向周期表插入数据
//拿到考勤组的id,遍历weekList
for (Integer week : bo.getWeekList()) {
@ -131,10 +171,8 @@ public class AttendanceGroupServiceImpl implements IAttendanceGroupService {
}
//todo: 法定节假日自动排休
//4.新增打卡日期表
//4.1判断是必须打卡还是无需打卡
//2.3.新增打卡日期表
//2.3.1判断是必须打卡还是无需打卡
//(1)必须打卡向打卡日期表中插入数据
if (Objects.equals(bo.getMustNoCheck(), StatusConstant.MUSTCHECK)) {
judgeDate(bo);
@ -145,9 +183,23 @@ public class AttendanceGroupServiceImpl implements IAttendanceGroupService {
}
}
//3.排班制
if (Objects.equals(add.getAttendanceType(), StatusConstant.SHIFTSCHEDULE)) {
//2.2排班制向天数表中插入数据
AttendanceScheduleCycle attendanceScheduleCycle = new AttendanceScheduleCycle();
//循环向周期表中插入数据
for (Integer week : bo.getWeekList()) {
attendanceScheduleCycle.setGroupId(add.getId());
attendanceScheduleCycle.setDayNumber(week);
}
//通过考勤组id拿到日期表的所有关联id
List<AttendanceScheduleCycle> scheduleCycles = attendanceScheduleCycleMapper.selectList(Wrappers.<AttendanceScheduleCycle>lambdaQuery().eq(AttendanceScheduleCycle::getGroupId, add.getId()));
//2.3遍历日期表向班次和周设置表的中间表插入数据
for (AttendanceScheduleCycle scheduleCycle : scheduleCycles) {
AttendanceWeeksetShift attendanceWeeksetShift = new AttendanceWeeksetShift();
attendanceWeeksetShift.setScheduleId(scheduleCycle.getId());
attendanceWeeksetShift.setShiftId(bo.getShiftId());
}
}
@ -185,6 +237,8 @@ public class AttendanceGroupServiceImpl implements IAttendanceGroupService {
public Boolean updateByBo(AttendanceGroupBo bo) {
AttendanceGroup update = MapstructUtils.convert(bo, AttendanceGroup.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
@ -202,10 +256,31 @@ public class AttendanceGroupServiceImpl implements IAttendanceGroupService {
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Transactional(rollbackFor = Exception.class)
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid,Integer attendanceType) {
//判断删除固定班次还是排班制
if (Objects.equals(attendanceType, FIXEDSCHEDULE)){
//1.固定班制
//根据id删除周期表中的数据
weekSetMapper.delete(Wrappers.<AttendanceWeekSet>lambdaQuery().in(AttendanceWeekSet::getGroupId, ids));
//根据id查询出考勤周期id
List<Long> weekSetIds = weekSetMapper.selectList(Wrappers.<AttendanceWeekSet>lambdaQuery().in(AttendanceWeekSet::getGroupId, ids)).stream().map(AttendanceWeekSet::getId).toList();
//根据考勤周期id删除中间表数据
attendanceWeeksetShiftMapper.delete(Wrappers.<AttendanceWeeksetShift>lambdaQuery().in(AttendanceWeeksetShift::getWeekSetId, weekSetIds));
} else if (Objects.equals(attendanceType, SHIFTSCHEDULE)) {
//2.排班制
//根据id删除考勤天数的数据
attendanceScheduleCycleMapper.delete(Wrappers.<AttendanceScheduleCycle>lambdaQuery().in(AttendanceScheduleCycle::getGroupId, ids));
//根据id查询出考勤天数的所有id
List<Long> scheduleCycleIds = attendanceScheduleCycleMapper.selectList(Wrappers.<AttendanceScheduleCycle>lambdaQuery().in(AttendanceScheduleCycle::getGroupId, ids)).stream().map(AttendanceScheduleCycle::getId).toList();
//根据考勤天数id删除中间表数据
attendanceWeeksetShiftMapper.delete(Wrappers.<AttendanceWeeksetShift>lambdaQuery().in(AttendanceWeeksetShift::getScheduleId, scheduleCycleIds));
}
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
//TODO 做一些业务上的校验,判断是否需要校验判断考勤组下是否有数据有数据则不做删除
}
return baseMapper.deleteByIds(ids) > 0;
}