获取考勤规则
This commit is contained in:
parent
18ab3c1693
commit
272875ea64
@ -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之间,代表星期一到星期日");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -41,6 +41,11 @@ public class AttendanceGroupRespVO {
|
||||
@ExcelProperty("纬度")
|
||||
private String latitude;
|
||||
|
||||
@Schema(description = "地址")
|
||||
@ExcelProperty("地址")
|
||||
private String address;
|
||||
|
||||
|
||||
@Schema(description = "范围(米)")
|
||||
@ExcelProperty("范围(米)")
|
||||
private Integer scope;
|
||||
|
@ -32,6 +32,9 @@ public class AttendanceGroupSaveReqVO {
|
||||
@Schema(description = "纬度")
|
||||
private String latitude;
|
||||
|
||||
@Schema(description = "地址")
|
||||
private String address;
|
||||
|
||||
@Schema(description = "范围(米)")
|
||||
private Integer scope;
|
||||
|
||||
|
@ -55,6 +55,10 @@ public class AttendanceGroupDO extends BaseDO {
|
||||
* 纬度
|
||||
*/
|
||||
private String latitude;
|
||||
/**
|
||||
* 地址
|
||||
*/
|
||||
private String address;
|
||||
/**
|
||||
* 范围(米)
|
||||
*/
|
||||
|
@ -85,7 +85,16 @@ public interface AttendanceService {
|
||||
|
||||
/**
|
||||
* 获取当前登录用户所属的考勤组以及是否具有管理员权限
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
List<AttendanceGroupSystemVO> getTheAttendanceGroupToWhichTheCurrentlyLoggedInUserBelongsAndWhetherTheyHaveAdministratorRights();
|
||||
|
||||
/**
|
||||
* 获取考勤规则
|
||||
*
|
||||
* @param groupId
|
||||
* @return
|
||||
*/
|
||||
AttendanceRulesVO getRules(Long groupId);
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
* 外勤计算
|
||||
*
|
||||
|
@ -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);
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
@ -67,6 +67,8 @@ public interface AttendanceSchedulingService {
|
||||
*/
|
||||
AttendanceSchedulingDO getSchedulingByIndexDay(Long attendanceGroupId, Integer indexDay);
|
||||
|
||||
List<AttendanceSchedulingDO> getSchedulingByGroupId(Long attendanceGroupId);
|
||||
|
||||
Integer getCycleDay(Long attendanceGroupId);
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user