1. /system/attendance/group/create 创建考勤组 参数调整 由原来的考勤组管理员id userId 改为 userIds可支持传多个 逗号隔开

2. /system/attendance/group/update 更新考勤组 参数调整 由原来的考勤组管理员id userId 改为 userIds可支持传多个 逗号隔开

3. /system/attendance/group/get 获得考勤组 响应参数调整 新增响应参数 groupSystems 考勤组管理员集合对象 内涵考勤组管理员名称 / 考勤组管理员id / 考勤组id

4. /system/attendance/group/page 获得考勤组分页 请求参数调整考勤组管理员id userId 改为 userIds可支持传多个 逗号隔开  响应参数调整 新增响应参数 systemNames 管理员名称列表逗号隔开
This commit is contained in:
aikai 2024-08-15 14:59:14 +08:00
parent 60ac08439c
commit 3939e029c3
22 changed files with 467 additions and 103 deletions

View File

@ -10,13 +10,13 @@ import java.time.LocalDateTime;
* @author 艾楷
*/
@Data
public class AttendancePunchRecordVO {
public class AttendancePunchRecordVO {
/**
* 编号
*/
private Long id;
/**
* 考勤组管理员id
* 考勤用户id
*/
private Long userId;
/**
@ -135,4 +135,4 @@ public class AttendancePunchRecordVO {
* 请假json对象
*/
private String leaveJson;
}
}

View File

@ -1,33 +1,33 @@
package cn.iocoder.yudao.module.system.controller.admin.group;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import javax.annotation.security.PermitAll;
import javax.validation.*;
import javax.servlet.http.*;
import java.util.*;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.*;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupRespVO;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.groupsystem.vo.AttendanceGroupSystemRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.service.attendance.group.AttendanceGroupService;
import cn.iocoder.yudao.module.system.service.attendance.groupsystem.AttendanceGroupSystemService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@Tag(name = "管理后台 - 考勤组")
@RestController
@ -37,6 +37,8 @@ public class AttendanceGroupController {
@Resource
private AttendanceGroupService groupService;
@Resource
private AttendanceGroupSystemService groupSystemService;
@PostMapping("/create")
@Operation(summary = "创建考勤组")
@ -68,7 +70,10 @@ public class AttendanceGroupController {
@PreAuthorize("@ss.hasPermission('attendance:group:query')")
public CommonResult<AttendanceGroupRespVO> getGroup(@RequestParam("id") Long id) {
AttendanceGroupDO group = groupService.getGroup(id);
return success(BeanUtils.toBean(group, AttendanceGroupRespVO.class));
List<AttendanceGroupSystemRespVO> groupSystems = groupSystemService.getGroupSystemVoByGroupId(id);
AttendanceGroupRespVO vo = BeanUtils.toBean(group, AttendanceGroupRespVO.class);
vo.setGroupSystems(groupSystems);
return success(vo);
}
@ -93,12 +98,12 @@ public class AttendanceGroupController {
@PreAuthorize("@ss.hasPermission('attendance:group:export')")
@OperateLog(type = EXPORT)
public void exportGroupExcel(@Valid AttendanceGroupPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AttendanceGroupDO> list = groupService.getGroupPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "考勤组.xls", "数据", AttendanceGroupRespVO.class,
BeanUtils.toBean(list, AttendanceGroupRespVO.class));
BeanUtils.toBean(list, AttendanceGroupRespVO.class));
}
}
}

View File

@ -1,12 +1,14 @@
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;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@ -16,8 +18,8 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class AttendanceGroupPageReqVO extends PageParam {
@Schema(description = "考勤组管理员id", example = "15633")
private Long userId;
@Schema(description = "考勤组管理员ids", example = "15633")
private List<Long> userIds;
@Schema(description = "群组名称", example = "李四")
private String groupName;
@ -50,4 +52,4 @@ public class AttendanceGroupPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
}

View File

@ -1,12 +1,13 @@
package cn.iocoder.yudao.module.system.controller.admin.group.vo;
import cn.iocoder.yudao.module.system.controller.admin.groupsystem.vo.AttendanceGroupSystemRespVO;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import lombok.Data;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
import java.util.List;
@Schema(description = "管理后台 - 考勤组 Response VO")
@Data
@ -17,9 +18,13 @@ public class AttendanceGroupRespVO {
@ExcelProperty("编号")
private Long id;
@Schema(description = "考勤组管理员id", example = "15633")
@ExcelProperty("考勤组管理员id")
private Long userId;
@Schema(description = "考勤组管理员列表", example = "15633")
@ExcelProperty("考勤组管理员列表")
private List<AttendanceGroupSystemRespVO> groupSystems;
@Schema(description = "管理员名称列表逗号隔开", example = "李四")
@ExcelProperty("管理员名称列表逗号隔开")
private String systemNames;
@Schema(description = "群组名称", example = "李四")
@ExcelProperty("群组名称")
@ -62,4 +67,4 @@ public class AttendanceGroupRespVO {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}
}

View File

@ -1,11 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.group.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
import lombok.Data;
@Schema(description = "管理后台 - 考勤组新增/修改 Request VO")
@Data
@ -14,8 +10,8 @@ public class AttendanceGroupSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "22881")
private Long id;
@Schema(description = "考勤组管理员id", example = "15633")
private Long userId;
@Schema(description = "考勤组管理员ids", example = "15633")
private String userIds;
@Schema(description = "群组名称", example = "李四")
private String groupName;
@ -44,4 +40,4 @@ public class AttendanceGroupSaveReqVO {
@Schema(description = "节假日自动排休 0否 1是")
private Integer autoHolidaysFlag;
}
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.system.controller.admin.groupsystem.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class AttendanceGroupSystemRespVO {
@Schema(description = "id")
private Long id;
@Schema(description = "考勤组管理员id")
private Long userId;
@Schema(description = "考勤组管理员名称")
private String nickname;
@Schema(description = "考勤组id")
private Long attendanceGroupId;
}

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ -17,7 +18,7 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@ToString(callSuper = true)
public class AttendancePunchRecordPageReqVO extends PageParam {
@Schema(description = "考勤组管理员id", example = "11409")
@Schema(description = "考勤用户id", example = "11409")
private Long userId;
@Schema(description = "考勤组id", example = "22293")
@ -77,4 +78,4 @@ public class AttendancePunchRecordPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}
}

View File

@ -17,8 +17,8 @@ public class AttendancePunchRecordRespVO {
@ExcelProperty("编号")
private Long id;
@Schema(description = "考勤组管理员id", example = "11409")
@ExcelProperty("考勤组管理员id")
@Schema(description = "考勤用户id", example = "11409")
@ExcelProperty("考勤用户id")
private Long userId;
@Schema(description = "考勤组id", example = "22293")
@ -103,4 +103,4 @@ public class AttendancePunchRecordRespVO {
@Schema(description = "班次名称")
@ExcelProperty("班次名称")
private String attendanceGroupShiftName;
}
}

View File

@ -1,12 +1,9 @@
package cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo;
import cn.hutool.core.date.LocalDateTimeUtil;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
@Schema(description = "管理后台 - 用户打卡记录新增/修改 Request VO")
@Data
@ -14,7 +11,7 @@ public class AttendancePunchRecordSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "65")
private Long id;
@Schema(description = "考勤组管理员id", example = "11409")
@Schema(description = "考勤用户id", example = "11409")
private Long userId;
@Schema(description = "部门id", example = "11409")
@ -102,4 +99,4 @@ public class AttendancePunchRecordSaveReqVO {
return null;
}
}
}

View File

@ -65,6 +65,17 @@ public class LogStatisticsController {
return success(logStatisticsService.getStatisticsGroupByUser(dto));
}
@GetMapping("/export-excel-group-by-user")
@Operation(summary = "导出日志统计 Excel")
@OperateLog(type = EXPORT)
public void exportLogGroupByUserExcel(@ModelAttribute LogStatisticsDetailsListGroupByUserDTO dto,
HttpServletResponse response) throws IOException {
List<LogStatisticsDetailsListGroupByUserVO> list = logStatisticsService.getStatisticsGroupByUser(dto);
// 导出 Excel
ExcelUtils.write(response, "日志统计.xls", "日志统计", LogStatisticsDetailsListGroupByUserVO.class,
BeanUtils.toBean(list, LogStatisticsDetailsListGroupByUserVO.class));
}
@GetMapping("/getNeedWrite")
@Operation(summary = "获取需要填写的")
public CommonResult<List<LogStatisticsModelVO>> getNeedWrite() {

View File

@ -1,29 +1,42 @@
package cn.iocoder.yudao.module.system.controller.admin.worklog.vo.statisticsrecord;
import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@ExcelIgnoreUnannotated
public class LogStatisticsDetailsListGroupByUserVO {
@Schema(description = "姓名")
@ExcelProperty("姓名")
private String nickName;
@Schema(description = "部门名称")
@ExcelProperty("部门名称")
private String deptName;
@Schema(description = "日志类型")
@ExcelProperty(value = "日志类型", converter = DictConvert.class)
@DictFormat("work_log_type")
private Integer type;
@Schema(description = "应提交")
@ExcelProperty("应提交")
private Integer should;
@Schema(description = "按时交")
@ExcelProperty("按时交")
private Integer onTime;
@Schema(description = "迟交")
@ExcelProperty("迟交")
private Integer late;
@Schema(description = "未提交")
@ExcelProperty("未提交")
private Integer notYet;
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.attendance.group;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
@ -31,10 +32,6 @@ public class AttendanceGroupDO extends BaseDO {
*/
@TableId
private Long id;
/**
* 考勤组管理员id
*/
private Long userId;
/**
* 群组名称
*/
@ -72,6 +69,11 @@ public class AttendanceGroupDO extends BaseDO {
*/
private Integer autoHolidaysFlag;
/**
* 管理员名称列表逗号隔开
*/
@TableField(exist = false)
private String systemNames;
public static String getCodeByType(Integer type) {
if (type == 1) {
@ -81,4 +83,4 @@ public class AttendanceGroupDO extends BaseDO {
}
}
}
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupsystem;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 考勤组 DO
*
* @author 艾楷
*/
@TableName("kq_attendance_group_system")
@KeySequence("kq_attendance_group_system_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AttendanceGroupSystemDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 考勤组管理员id
*/
private Long userId;
/**
* 考勤组id
*/
private Long attendanceGroupId;
}

View File

@ -30,7 +30,7 @@ public class AttendancePunchRecordDO extends BaseDO {
@TableId
private Long id;
/**
* 考勤组管理员id
* 考勤用户id
*/
private Long userId;
/**

View File

@ -5,6 +5,8 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -20,7 +22,6 @@ public interface AttendanceGroupMapper extends BaseMapperX<AttendanceGroupDO> {
default PageResult<AttendanceGroupDO> selectPage(AttendanceGroupPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceGroupDO>()
.eqIfPresent(AttendanceGroupDO::getUserId, reqVO.getUserId())
.likeIfPresent(AttendanceGroupDO::getGroupName, reqVO.getGroupName())
.eqIfPresent(AttendanceGroupDO::getType, reqVO.getType())
.eqIfPresent(AttendanceGroupDO::getPunchType, reqVO.getPunchType())
@ -39,4 +40,13 @@ public interface AttendanceGroupMapper extends BaseMapperX<AttendanceGroupDO> {
* @return
*/
List<AttendanceGroupDO> getByUserId(@Param("userId") Long userId);
}
/**
* 分页列表
*
* @param vo
* @param page
* @return
*/
IPage<AttendanceGroupDO> selectPageList(@Param("vo") AttendanceGroupPageReqVO vo, @Param("page") Page page);
}

View File

@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.system.dal.mysql.attendance.groupsystem;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.controller.admin.groupsystem.vo.AttendanceGroupSystemRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupsystem.AttendanceGroupSystemDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* 考勤组 Mapper
*
* @author 艾楷
*/
@Mapper
public interface AttendanceGroupSystemMapper extends BaseMapperX<AttendanceGroupSystemDO> {
/**
* 根据考勤组id查询考勤组管理员
*
* @param groupId
* @return
*/
List<AttendanceGroupSystemRespVO> getGroupSystemVoByGroupId(@Param("groupId") Long groupId);
/**
* 获取用户管理的考勤组
*
* @param userId
* @return
*/
List<AttendanceGroupDO> getGroupSystemByUserId(@Param("userId") Long userId);
}

View File

@ -30,6 +30,7 @@ import cn.iocoder.yudao.module.system.handler.PunchHandler;
import cn.iocoder.yudao.module.system.service.attendance.group.AttendanceGroupService;
import cn.iocoder.yudao.module.system.service.attendance.groupshift.AttendanceGroupShiftService;
import cn.iocoder.yudao.module.system.service.attendance.groupshiftitem.AttendanceGroupShiftItemService;
import cn.iocoder.yudao.module.system.service.attendance.groupsystem.AttendanceGroupSystemService;
import cn.iocoder.yudao.module.system.service.attendance.groupuser.AttendanceGroupUserService;
import cn.iocoder.yudao.module.system.service.attendance.punch.PunchService;
import cn.iocoder.yudao.module.system.service.attendance.punch.dto.AttendanceOnTheDayDTO;
@ -90,6 +91,8 @@ public class AttendanceServiceImpl implements AttendanceService {
@Resource
private AttendanceGroupMapper attendanceGroupMapper;
@Resource
private AttendanceGroupSystemService attendanceGroupSystemService;
@Resource
private AttendanceGroupUserService attendanceGroupUserService;
@Resource
private PostMapper postMapper;
@ -865,8 +868,7 @@ public class AttendanceServiceImpl implements AttendanceService {
public List<AttendanceGroupSystemVO> getTheAttendanceGroupToWhichTheCurrentlyLoggedInUserBelongsAndWhetherTheyHaveAdministratorRights(Boolean allFlag) {
Long userId = getLoginUserId();
List<AttendanceGroupSystemVO> attendanceGroupSystemVOS = new ArrayList<>();
List<AttendanceGroupDO> attendanceGroupDOS = attendanceGroupMapper.selectList(new LambdaQueryWrapper<AttendanceGroupDO>()
.eq(!allFlag, AttendanceGroupDO::getUserId, userId));
List<AttendanceGroupDO> attendanceGroupDOS = attendanceGroupSystemService.getGroupSystemByUserId(userId);
if (CollectionUtil.isEmpty(attendanceGroupDOS)) {
return attendanceGroupSystemVOS;
}

View File

@ -1,42 +1,26 @@
package cn.iocoder.yudao.module.system.service.attendance.group;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
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.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.assets.AssetsDO;
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.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.module.system.dal.mysql.attendance.group.AttendanceGroupMapper;
import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupuser.AttendanceGroupUserMapper;
import cn.iocoder.yudao.module.system.service.attendance.AttendanceService;
import cn.iocoder.yudao.module.system.service.attendance.fixed.AttendanceFixedService;
import cn.iocoder.yudao.module.system.service.attendance.groupshiftitem.AttendanceGroupShiftItemService;
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.attendance.groupsystem.AttendanceGroupSystemService;
import cn.iocoder.yudao.module.system.service.attendance.scheduling.AttendanceSchedulingService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.GROUP_NOT_EXISTS;
@ -54,27 +38,24 @@ public class AttendanceGroupServiceImpl implements AttendanceGroupService {
@Resource
private AttendanceGroupMapper groupMapper;
@Resource
private AttendancePunchRecordService attendancePunchRecordService;
@Resource
private AttendanceGroupMapper attendanceGroupMapper;
@Resource
private AttendanceGroupUserMapper attendanceGroupUserMapper;
@Resource
private AttendanceGroupShiftItemService attendanceGroupShiftItemService;
@Resource
@Lazy // 避免依赖循环
private AttendanceService attendanceService;
@Resource
private AttendanceFixedService attendanceFixedService;
@Resource
private AttendanceSchedulingService attendanceSchedulingService;
@Resource
private AttendanceGroupSystemService attendanceGroupSystemService;
@Override
public Long createGroup(AttendanceGroupSaveReqVO createReqVO) {
// 插入
AttendanceGroupDO group = BeanUtils.toBean(createReqVO, AttendanceGroupDO.class);
groupMapper.insert(group);
//把考勤组用户ids拿出来
// 插入
attendanceGroupSystemService.batchCreateOrUpdate(createReqVO.getUserIds(), group.getId());
// 返回
return group.getId();
}
@ -86,6 +67,8 @@ public class AttendanceGroupServiceImpl implements AttendanceGroupService {
// 更新
AttendanceGroupDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceGroupDO.class);
groupMapper.updateById(updateObj);
// 插入
attendanceGroupSystemService.batchCreateOrUpdate(updateReqVO.getUserIds(), updateReqVO.getId());
}
@Override
@ -99,6 +82,7 @@ public class AttendanceGroupServiceImpl implements AttendanceGroupService {
}
// 删除
groupMapper.deleteById(id);
attendanceGroupSystemService.delByGroupId(id);
}
private void validateGroupExists(Long id) {
@ -114,7 +98,8 @@ public class AttendanceGroupServiceImpl implements AttendanceGroupService {
@Override
public PageResult<AttendanceGroupDO> getGroupPage(AttendanceGroupPageReqVO pageReqVO) {
return groupMapper.selectPage(pageReqVO);
IPage<AttendanceGroupDO> page = groupMapper.selectPageList(pageReqVO, MyBatisUtils.buildPage(pageReqVO));
return new PageResult<>(page.getRecords(), page.getTotal());
}
@Override
@ -141,4 +126,4 @@ public class AttendanceGroupServiceImpl implements AttendanceGroupService {
return ids;
}
}
}

View File

@ -0,0 +1,53 @@
package cn.iocoder.yudao.module.system.service.attendance.groupsystem;
import cn.iocoder.yudao.module.system.controller.admin.groupsystem.vo.AttendanceGroupSystemRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupsystem.AttendanceGroupSystemDO;
import java.util.List;
/**
* 考勤组管理员表 Service 接口
*
* @author 艾楷
*/
public interface AttendanceGroupSystemService {
/**
* 批量新增/修改考勤组管理员
*
* @param userIds
* @param groupId
*/
void batchCreateOrUpdate(String userIds, Long groupId);
/**
* 根据考勤组id获取考勤组管理员
*
* @param groupId
* @return
*/
List<AttendanceGroupSystemDO> getGroupSystemByGroupId(Long groupId);
/**
* 根据考勤组id删除
*
* @param groupId
*/
void delByGroupId(Long groupId);
/**
* 根据考勤组id获取考勤管理员
*
* @param groupId
* @return
*/
List<AttendanceGroupSystemRespVO> getGroupSystemVoByGroupId(Long groupId);
/**
* 获取用户管理的考勤组
*
* @param userId
* @return
*/
List<AttendanceGroupDO> getGroupSystemByUserId(Long userId);
}

View File

@ -0,0 +1,111 @@
package cn.iocoder.yudao.module.system.service.attendance.groupsystem;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.module.system.controller.admin.groupsystem.vo.AttendanceGroupSystemRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupsystem.AttendanceGroupSystemDO;
import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupsystem.AttendanceGroupSystemMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 考勤组管理员 实现类
*/
@Service
@Slf4j
public class AttendanceGroupSystemServiceImpl implements AttendanceGroupSystemService {
@Resource
private AttendanceGroupSystemMapper attendanceGroupSystemMapper;
@Override
public void batchCreateOrUpdate(String userIds, Long groupId) {
if (StrUtil.isEmpty(userIds)) {
attendanceGroupSystemMapper.delete(new LambdaQueryWrapper<AttendanceGroupSystemDO>()
.eq(AttendanceGroupSystemDO::getAttendanceGroupId, groupId));
return;
}
List<Long> ids = Arrays.stream(userIds.split(",")).map(Long::valueOf).collect(Collectors.toList());
List<AttendanceGroupSystemDO> list = this.getGroupSystemByGroupId(groupId);
if (list.isEmpty()) {
this.saveList(ids, groupId);
return;
}
List<Long> oldIds = list.stream().map(AttendanceGroupSystemDO::getUserId).collect(Collectors.toList());
List<Long> newIds = new ArrayList<>(CollectionUtil.subtract(ids, oldIds));
List<Long> delIds = new ArrayList<>(CollectionUtil.subtract(oldIds, ids));
if (!newIds.isEmpty()) {
this.saveList(newIds, groupId);
}
if (!delIds.isEmpty()) {
attendanceGroupSystemMapper.delete(new LambdaQueryWrapper<AttendanceGroupSystemDO>()
.eq(AttendanceGroupSystemDO::getAttendanceGroupId, groupId)
.in(AttendanceGroupSystemDO::getUserId, delIds));
}
}
private void saveList(List<Long> userIds, Long groupId) {
List<AttendanceGroupSystemDO> saveList = new ArrayList<>();
for (Long id : userIds) {
AttendanceGroupSystemDO attendanceGroupSystemDO = new AttendanceGroupSystemDO();
attendanceGroupSystemDO.setAttendanceGroupId(groupId);
attendanceGroupSystemDO.setUserId(id);
saveList.add(attendanceGroupSystemDO);
}
attendanceGroupSystemMapper.insertBatch(saveList);
}
@Override
public List<AttendanceGroupSystemDO> getGroupSystemByGroupId(Long groupId) {
return attendanceGroupSystemMapper.selectList(new LambdaQueryWrapper<AttendanceGroupSystemDO>()
.eq(AttendanceGroupSystemDO::getAttendanceGroupId, groupId));
}
@Override
public void delByGroupId(Long groupId) {
attendanceGroupSystemMapper.delete(new LambdaQueryWrapper<AttendanceGroupSystemDO>()
.eq(AttendanceGroupSystemDO::getAttendanceGroupId, groupId));
}
@Override
public List<AttendanceGroupSystemRespVO> getGroupSystemVoByGroupId(Long groupId) {
return attendanceGroupSystemMapper.getGroupSystemVoByGroupId(groupId);
}
@Override
public List<AttendanceGroupDO> getGroupSystemByUserId(Long userId) {
return attendanceGroupSystemMapper.getGroupSystemByUserId(userId);
}
}

View File

@ -18,4 +18,48 @@
b.deleted = 0
and b.user_id = #{userId}
</select>
</mapper>
<select id="selectPageList"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO">
select
a.*,
GROUP_CONCAT( b.nickname ) AS systemNames
from kq_attendance_group as a
left join (
SELECT
a.*,
b.nickname AS nickname
FROM
kq_attendance_group_system AS a
LEFT JOIN system_users AS b ON a.user_id = b.id
WHERE
a.deleted = 0
) as b on a.id = b.attendance_group_id
<where>
a.deleted = 0
<if test="vo.groupName != null and vo.groupName != ''">
and a.group_name like CONCAT( '%', #{vo.groupName}, '%' )
</if>
<if test="vo.type != null">
and a.type = #{vo.type}
</if>
<if test="vo.punchType != null">
and a.punch_type = #{vo.punchType}
</if>
<if test="vo.createTime != null and vo.createTime.length > 0">
<if test="vo.createTime[0] != null">
and a.create_time &gt;= #{vo.createTime[0]}
</if>
<if test="vo.createTime[1] != null">
and a.create_time &lt;= #{vo.createTime[1]}
</if>
</if>
<if test="vo.userIds != null and vo.userIds.size() > 0">
and b.user_id in
<foreach collection="vo.userIds" item="userId" separator="," open="(" close=")">
#{userId}
</foreach>
</if>
</where>
GROUP BY a.id
</select>
</mapper>

View File

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.system.dal.mysql.attendance.groupsystem.AttendanceGroupSystemMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<select id="getGroupSystemVoByGroupId"
resultType="cn.iocoder.yudao.module.system.controller.admin.groupsystem.vo.AttendanceGroupSystemRespVO">
select
a.*,
b.nickname as nickname
from kq_attendance_group_system as a
left join system_users as b on a.user_id = b.id
<where>
a.deleted = 0
<if test="groupId != null">
and a.attendance_group_id = #{groupId}
</if>
</where>
</select>
<select id="getGroupSystemByUserId"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO">
select
a.*
from kq_attendance_group as a
left join kq_attendance_group_system as b on a.id = b.attendance_group_id
<where>
a.deleted = 0
and b.deleted = 0
and b.user_id = #{userId}
</where>
</select>
</mapper>