获取考勤规则

This commit is contained in:
aikai 2024-06-12 20:13:10 +08:00
parent 18ab3c1693
commit 272875ea64
15 changed files with 204 additions and 0 deletions

View File

@ -354,4 +354,30 @@ public class DateUtils {
JSONObject jsonObject = JSONUtil.parseObj(json);
return jsonObject.getJSONArray("days");
}
/**
* 将1-7的数字转换为对应的中文星期表示
* @param dayOfWeek 数字形式的星期几1-7分别代表星期一到星期日
* @return 中文表示的星期几
*/
public static String convertToChineseWeekday(int dayOfWeek) {
switch (dayOfWeek) {
case 1:
return "星期一";
case 2:
return "星期二";
case 3:
return "星期三";
case 4:
return "星期四";
case 5:
return "星期五";
case 6:
return "星期六";
case 7:
return "星期日";
default:
throw new IllegalArgumentException("输入的数字必须在1-7之间代表星期一到星期日");
}
}
}

View File

@ -38,6 +38,15 @@ public class AttendanceController {
return success(vo);
}
@GetMapping("/getRules/{groupId}")
@Operation(summary = "获取考勤规则")
public CommonResult<AttendanceRulesVO> getRules(@PathVariable Long groupId) {
AttendanceRulesVO vo = attendanceService.getRules(groupId);
return success(vo);
}
@GetMapping("/statisticsByDay")
@Operation(summary = "统计按天")
public CommonResult<Map<String, AttendanceStatusByDayVO>> statisticsByDay(@ModelAttribute AttendanceStatisticsByDayDTO dto) {

View File

@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.system.controller.admin.attendance.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
public class AttendanceRulesVO {
@Schema(description = "上班规则 - 一条数据一行 前端记得换行")
private List<WorkRules> workRules;
@Schema(description = "办公地点")
private String officeLocation;
@Schema(description = "是否允许外勤打卡 0否 1是")
private Integer fieldworkFlag;
@Data
public static class WorkRules {
@Schema(description = "星期几/第几天")
private String indexStr;
@Schema(description = "规则")
private String rule;
@Schema(description = "是否当天")
private boolean flag;
}
}

View File

@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.system.controller.admin.group.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
@ -33,6 +34,9 @@ public class AttendanceGroupPageReqVO extends PageParam {
@Schema(description = "纬度")
private String latitude;
@Schema(description = "地址")
private String address;
@Schema(description = "范围(米)")
private Integer scope;

View File

@ -41,6 +41,11 @@ public class AttendanceGroupRespVO {
@ExcelProperty("纬度")
private String latitude;
@Schema(description = "地址")
@ExcelProperty("地址")
private String address;
@Schema(description = "范围(米)")
@ExcelProperty("范围(米)")
private Integer scope;

View File

@ -32,6 +32,9 @@ public class AttendanceGroupSaveReqVO {
@Schema(description = "纬度")
private String latitude;
@Schema(description = "地址")
private String address;
@Schema(description = "范围(米)")
private Integer scope;

View File

@ -55,6 +55,10 @@ public class AttendanceGroupDO extends BaseDO {
* 纬度
*/
private String latitude;
/**
* 地址
*/
private String address;
/**
* 范围
*/

View File

@ -85,7 +85,16 @@ public interface AttendanceService {
/**
* 获取当前登录用户所属的考勤组以及是否具有管理员权限
*
* @return
*/
List<AttendanceGroupSystemVO> getTheAttendanceGroupToWhichTheCurrentlyLoggedInUserBelongsAndWhetherTheyHaveAdministratorRights();
/**
* 获取考勤规则
*
* @param groupId
* @return
*/
AttendanceRulesVO getRules(Long groupId);
}

View File

@ -737,6 +737,18 @@ public class AttendanceServiceImpl implements AttendanceService {
return attendanceGroupSystemVOS;
}
@Override
public AttendanceRulesVO getRules(Long groupId) {
AttendanceRulesVO vo = new AttendanceRulesVO();
AttendanceGroupDO group = attendanceGroupService.getGroup(groupId);
PunchService punchService = punchHandler.getResource(AttendanceGroupDO.getCodeByType(group.getType()));
List<AttendanceRulesVO.WorkRules> workRules = punchService.getRule(groupId);
vo.setFieldworkFlag(group.getFieldworkFlag());
vo.setWorkRules(workRules);
vo.setOfficeLocation(group.getAddress());
return vo;
}
/**
* 外勤计算
*

View File

@ -67,6 +67,8 @@ public interface AttendanceFixedService {
*/
AttendanceFixedDO getByGroupIdAndWeek(Long attendanceGroupId, Integer week);
List<AttendanceFixedDO> getByGroupId(Long attendanceGroupId);
List<AttendanceFixedDO> getByGroupIdAndWeek(List<Long> attendanceGroupIds, Integer week);
/**

View File

@ -2,17 +2,21 @@ package cn.iocoder.yudao.module.system.service.attendance.fixed;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.Constants;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.AttendancePunchPageDTO;
import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendancePunchPageVO;
import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendanceRulesVO;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedRespVO;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.AttendanceGroupShiftVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO;
import cn.iocoder.yudao.module.system.dal.mysql.attendance.fixed.AttendanceFixedMapper;
import cn.iocoder.yudao.module.system.service.attendance.AttendanceService;
import cn.iocoder.yudao.module.system.service.attendance.groupshift.AttendanceGroupShiftService;
@ -20,6 +24,7 @@ import cn.iocoder.yudao.module.system.service.attendance.punch.PunchService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@ -48,6 +53,8 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch
private AttendanceService attendanceService;
@Resource
private AttendanceGroupShiftService attendanceGroupShiftService;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
@Transactional(rollbackFor = Exception.class)
@ -141,6 +148,12 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch
return null;
}
@Override
public List<AttendanceFixedDO> getByGroupId(Long attendanceGroupId) {
return attendanceFixedMapper.selectList(new LambdaQueryWrapper<AttendanceFixedDO>()
.eq(attendanceGroupId != null, AttendanceFixedDO::getAttendanceGroupId, attendanceGroupId));
}
@Override
public List<AttendanceFixedDO> getByGroupIdAndWeek(List<Long> attendanceGroupIds, Integer week) {
return attendanceFixedMapper.selectList(new LambdaQueryWrapper<AttendanceFixedDO>()
@ -224,5 +237,36 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch
return vo;
}
@Override
public List<AttendanceRulesVO.WorkRules> getRule(Long attendanceGroupId) {
List<AttendanceRulesVO.WorkRules> rules = new ArrayList<>();
List<AttendanceFixedDO> list = this.getByGroupId(attendanceGroupId);
List<Long> attendanceGroupShiftIds = list.stream().map(AttendanceFixedDO::getAttendanceGroupShiftId).filter(Objects::nonNull).collect(Collectors.toList());
List<AttendanceGroupShiftVO> vos = attendanceGroupShiftService.listByShiftIds(attendanceGroupShiftIds);
Map<Long, AttendanceGroupShiftVO> map = vos.stream().collect(Collectors.toMap(AttendanceGroupShiftVO::getId, a -> a));
LocalDateTime now = LocalDateTime.now();
for (AttendanceFixedDO attendanceFixedDO : list) {
AttendanceRulesVO.WorkRules workRules = new AttendanceRulesVO.WorkRules();
String weekday = DateUtils.convertToChineseWeekday(attendanceFixedDO.getWeekTime());
workRules.setIndexStr(weekday);
workRules.setFlag(false);
if (now.getDayOfWeek().getValue() == attendanceFixedDO.getWeekTime()) {
workRules.setFlag(true);
}
if (attendanceFixedDO.getAttendanceGroupShiftId() == null) {
workRules.setRule("休息");
} else {
AttendanceGroupShiftVO attendanceGroupShiftVOS = map.get(attendanceFixedDO.getAttendanceGroupShiftId());
List<String> itemRule = new ArrayList<>();
for (AttendanceGroupShiftItemDO attendanceGroupShiftItemDO : attendanceGroupShiftVOS.getAttendanceGroupShiftItemDOList()) {
itemRule.add(attendanceGroupShiftItemDO.getBeginTime() + "-" + attendanceGroupShiftItemDO.getEndTime());
}
String rule = String.join(",", itemRule);
workRules.setRule(rule);
}
rules.add(workRules);
}
return rules;
}
}

View File

@ -267,6 +267,7 @@ public class AttendanceGroupShiftServiceImpl implements AttendanceGroupShiftServ
AttendanceGroupShiftVO attendanceGroupShiftVO = BeanUtils.toBean(item, AttendanceGroupShiftVO.class);
List<AttendanceGroupShiftItemDO> attendanceGroupShiftItemDOS = map.get(item.getId());
if (CollectionUtil.isNotEmpty(attendanceGroupShiftItemDOS)) {
attendanceGroupShiftItemDOS = attendanceGroupShiftItemDOS.stream().sorted(Comparator.comparing(AttendanceGroupShiftItemDO::getLevel)).collect(Collectors.toList());
attendanceGroupShiftVO.setAttendanceGroupShiftItemDOList(attendanceGroupShiftItemDOS);
}
vos.add(attendanceGroupShiftVO);

View File

@ -2,6 +2,9 @@ package cn.iocoder.yudao.module.system.service.attendance.punch;
import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.AttendancePunchPageDTO;
import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendancePunchPageVO;
import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendanceRulesVO;
import java.util.List;
/**
* 打卡 Service 接口
@ -17,4 +20,12 @@ public interface PunchService {
* @return
*/
AttendancePunchPageVO getPunchPage(AttendancePunchPageDTO dto);
/**
* 获取规则
*
* @param attendanceGroupId
* @return
*/
List<AttendanceRulesVO.WorkRules> getRule(Long attendanceGroupId);
}

View File

@ -67,6 +67,8 @@ public interface AttendanceSchedulingService {
*/
AttendanceSchedulingDO getSchedulingByIndexDay(Long attendanceGroupId, Integer indexDay);
List<AttendanceSchedulingDO> getSchedulingByGroupId(Long attendanceGroupId);
Integer getCycleDay(Long attendanceGroupId);
/**

View File

@ -8,11 +8,13 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.attendance.dto.AttendancePunchPageDTO;
import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendancePunchPageVO;
import cn.iocoder.yudao.module.system.controller.admin.attendance.vo.AttendanceRulesVO;
import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.AttendanceGroupShiftVO;
import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.AttendanceSchedulingPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.AttendanceSchedulingRespVO;
import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.AttendanceSchedulingSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.scheduling.AttendanceSchedulingDO;
import cn.iocoder.yudao.module.system.dal.mysql.attendance.scheduling.AttendanceSchedulingMapper;
import cn.iocoder.yudao.module.system.service.attendance.AttendanceService;
@ -143,6 +145,12 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ
return null;
}
@Override
public List<AttendanceSchedulingDO> getSchedulingByGroupId(Long attendanceGroupId) {
return schedulingMapper.selectList(new LambdaQueryWrapper<AttendanceSchedulingDO>()
.eq(AttendanceSchedulingDO::getAttendanceGroupId, attendanceGroupId));
}
@Override
public Integer getCycleDay(Long attendanceGroupId) {
return Math.toIntExact(schedulingMapper.selectCount(new LambdaQueryWrapper<AttendanceSchedulingDO>()
@ -224,5 +232,40 @@ public class AttendanceSchedulingServiceImpl implements AttendanceSchedulingServ
return vo;
}
@Override
public List<AttendanceRulesVO.WorkRules> getRule(Long attendanceGroupId) {
List<AttendanceSchedulingDO> list = this.getSchedulingByGroupId(attendanceGroupId);
List<AttendanceRulesVO.WorkRules> rules = new ArrayList<>();
List<Long> attendanceGroupShiftIds = list.stream().map(AttendanceSchedulingDO::getAttendanceGroupShiftId).filter(Objects::nonNull).collect(Collectors.toList());
List<AttendanceGroupShiftVO> vos = attendanceGroupShiftService.listByShiftIds(attendanceGroupShiftIds);
Map<Long, AttendanceGroupShiftVO> map = vos.stream().collect(Collectors.toMap(AttendanceGroupShiftVO::getId, a -> a));
//获取到当天是第几天
String schedulingKey = Constants.SCHEDULING + Constants.UNDERLINE + attendanceGroupId;
String indexDayObj = stringRedisTemplate.opsForValue().get(schedulingKey);
for (AttendanceSchedulingDO attendanceSchedulingDO : list) {
AttendanceRulesVO.WorkRules workRules = new AttendanceRulesVO.WorkRules();
String indexDay = "" + attendanceSchedulingDO.getIndexDay() + "";
workRules.setIndexStr(indexDay);
workRules.setFlag(false);
if (StrUtil.isNotEmpty(indexDayObj) && Integer.parseInt(indexDayObj) == attendanceSchedulingDO.getIndexDay()) {
workRules.setFlag(true);
}
if (attendanceSchedulingDO.getAttendanceGroupShiftId() == null) {
workRules.setRule("休息");
} else {
AttendanceGroupShiftVO attendanceGroupShiftVOS = map.get(attendanceSchedulingDO.getAttendanceGroupShiftId());
List<String> itemRule = new ArrayList<>();
for (AttendanceGroupShiftItemDO attendanceGroupShiftItemDO : attendanceGroupShiftVOS.getAttendanceGroupShiftItemDOList()) {
itemRule.add(attendanceGroupShiftItemDO.getBeginTime() + "-" + attendanceGroupShiftItemDO.getEndTime());
}
String rule = String.join(",", itemRule);
workRules.setRule(rule);
}
rules.add(workRules);
}
return rules;
}
}