加入距离计算工具类 新增考勤组班次子表

This commit is contained in:
aikai 2024-04-18 14:37:37 +08:00
parent 03e7fdad43
commit be4f4278ba
46 changed files with 604 additions and 78 deletions

View File

@ -0,0 +1,52 @@
package cn.iocoder.yudao.framework.common.util.distance;
/**
* 距离计算 工具类
*/
public class GeoUtil {
public static int distance(double lat1, double lon1, double lat2, double lon2) {
final int R = 6371000; // 地球平均半径单位
double latDistance = Math.toRadians(lat2 - lat1);
double lonDistance = Math.toRadians(lon2 - lon1);
double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
+ Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2))
* Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
return (int) (R * c);
}
/**
* 计算两个经纬度的距离是否在范围内
*
* @param lat1 位置1的纬度
* @param lon1 位置1的经度
* @param lat2 位置2的纬度
* @param lon2 位置2的经度
* @param range 范围
* @return 范围内返回 1 范围外返回 0
*/
public static int distance(double lat1, double lon1, double lat2, double lon2, Integer range) {
if (range == null) {
return 0;
}
int distance = distance(lat1, lon1, lat2, lon2);
if (range < distance) {
return 0;
}
return 1;
}
public static void main(String[] args) {
long time = System.currentTimeMillis();
double lat1 = 28.616284;
double lon1 = 118.102703;
double lat2 = 28.629981;
double lon2 = 118.08502;
double distance = distance(lat1, lon1, lat2, lon2);
System.out.println("距离是: " + distance + "");
System.out.println("耗时: " + (System.currentTimeMillis() - time));
}
}

View File

@ -25,7 +25,7 @@ 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.fixed.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.module.system.service.attendance.fixed.AttendanceFixedService;
@Tag(name = "管理后台 - 固定班制考勤设置")

View File

@ -25,7 +25,7 @@ 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.dal.dataobject.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.service.attendance.group.AttendanceGroupService;
@Tag(name = "管理后台 - 考勤组")

View File

@ -25,7 +25,7 @@ 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.groupshift.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.groupshift.AttendanceGroupShiftDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshift.AttendanceGroupShiftDO;
import cn.iocoder.yudao.module.system.service.attendance.groupshift.AttendanceGroupShiftService;
@Tag(name = "管理后台 - 考勤组班次")

View File

@ -21,9 +21,6 @@ public class AttendanceGroupShiftPageReqVO extends PageParam {
@Schema(description = "班次名称", example = "张三")
private String name;
@Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]")
private String attendanceTimeJson;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;

View File

@ -25,10 +25,6 @@ public class AttendanceGroupShiftRespVO {
@ExcelProperty("班次名称")
private String name;
@Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]")
@ExcelProperty("班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]")
private String attendanceTimeJson;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;

View File

@ -19,7 +19,4 @@ public class AttendanceGroupShiftSaveReqVO {
@Schema(description = "班次名称", example = "张三")
private String name;
@Schema(description = "班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]")
private String attendanceTimeJson;
}

View File

@ -0,0 +1,93 @@
package cn.iocoder.yudao.module.system.controller.admin.groupshiftitem;
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.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
import cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo.AttendanceGroupShiftItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo.AttendanceGroupShiftItemRespVO;
import cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo.AttendanceGroupShiftItemSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO;
import cn.iocoder.yudao.module.system.service.attendance.groupshiftitem.AttendanceGroupShiftItemService;
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
@RequestMapping("/system.attendance/attendance-group-shift-item")
@Validated
public class AttendanceGroupShiftItemController {
@Resource
private AttendanceGroupShiftItemService attendanceGroupShiftItemService;
@PostMapping("/create")
@Operation(summary = "创建考勤组班次子表")
@PreAuthorize("@ss.hasPermission('system.attendance:attendance-group-shift-item:create')")
public CommonResult<Long> createAttendanceGroupShiftItem(@Valid @RequestBody AttendanceGroupShiftItemSaveReqVO createReqVO) {
return success(attendanceGroupShiftItemService.createAttendanceGroupShiftItem(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新考勤组班次子表")
@PreAuthorize("@ss.hasPermission('system.attendance:attendance-group-shift-item:update')")
public CommonResult<Boolean> updateAttendanceGroupShiftItem(@Valid @RequestBody AttendanceGroupShiftItemSaveReqVO updateReqVO) {
attendanceGroupShiftItemService.updateAttendanceGroupShiftItem(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除考勤组班次子表")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('system.attendance:attendance-group-shift-item:delete')")
public CommonResult<Boolean> deleteAttendanceGroupShiftItem(@RequestParam("id") Long id) {
attendanceGroupShiftItemService.deleteAttendanceGroupShiftItem(id);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得考勤组班次子表")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('system.attendance:attendance-group-shift-item:query')")
public CommonResult<AttendanceGroupShiftItemRespVO> getAttendanceGroupShiftItem(@RequestParam("id") Long id) {
AttendanceGroupShiftItemDO attendanceGroupShiftItem = attendanceGroupShiftItemService.getAttendanceGroupShiftItem(id);
return success(BeanUtils.toBean(attendanceGroupShiftItem, AttendanceGroupShiftItemRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得考勤组班次子表分页")
@PreAuthorize("@ss.hasPermission('system.attendance:attendance-group-shift-item:query')")
public CommonResult<PageResult<AttendanceGroupShiftItemRespVO>> getAttendanceGroupShiftItemPage(@Valid AttendanceGroupShiftItemPageReqVO pageReqVO) {
PageResult<AttendanceGroupShiftItemDO> pageResult = attendanceGroupShiftItemService.getAttendanceGroupShiftItemPage(pageReqVO);
return success(BeanUtils.toBean(pageResult, AttendanceGroupShiftItemRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出考勤组班次子表 Excel")
@PreAuthorize("@ss.hasPermission('system.attendance:attendance-group-shift-item:export')")
@OperateLog(type = EXPORT)
public void exportAttendanceGroupShiftItemExcel(@Valid AttendanceGroupShiftItemPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<AttendanceGroupShiftItemDO> list = attendanceGroupShiftItemService.getAttendanceGroupShiftItemPage(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "考勤组班次子表.xls", "数据", AttendanceGroupShiftItemRespVO.class,
BeanUtils.toBean(list, AttendanceGroupShiftItemRespVO.class));
}
}

View File

@ -0,0 +1,54 @@
package cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 考勤组班次子表分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AttendanceGroupShiftItemPageReqVO extends PageParam {
@Schema(description = "考勤组id", example = "26060")
private Long attendanceGroupId;
@Schema(description = "班次id", example = "22909")
private Long kqAttendanceGroupShiftId;
@Schema(description = "级别 从1到 排序用")
private Integer level;
@Schema(description = "开始打卡时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private String[] beginTime;
@Schema(description = "结束打卡时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private String[] endTime;
@Schema(description = "是否必须 0否 1是 (如果不是必须系统会自动打卡)")
private Integer mustFlag;
@Schema(description = "上班前打卡时间(分钟) 默认 120分钟")
private Integer beforePunchTimeUpWork;
@Schema(description = "上班后打卡时间(分钟) 默认 120分钟")
private Integer afterPunchTimeUpWork;
@Schema(description = "下班前打卡时间(分钟) 默认 120分钟")
private Integer beforePunchTimeDownWork;
@Schema(description = "下班后打卡时间(分钟) 默认 120分钟")
private Integer afterPunchTimeDownWork;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@ -0,0 +1,64 @@
package cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import java.util.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 考勤组班次子表 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AttendanceGroupShiftItemRespVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "957")
@ExcelProperty("编号")
private Long id;
@Schema(description = "考勤组id", example = "26060")
@ExcelProperty("考勤组id")
private Long attendanceGroupId;
@Schema(description = "班次id", example = "22909")
@ExcelProperty("班次id")
private Long kqAttendanceGroupShiftId;
@Schema(description = "级别 从1到 排序用")
@ExcelProperty("级别 从1到 排序用")
private Integer level;
@Schema(description = "开始打卡时间")
@ExcelProperty("开始打卡时间")
private String beginTime;
@Schema(description = "结束打卡时间")
@ExcelProperty("结束打卡时间")
private String endTime;
@Schema(description = "是否必须 0否 1是 (如果不是必须系统会自动打卡)")
@ExcelProperty("是否必须 0否 1是 (如果不是必须系统会自动打卡)")
private Integer mustFlag;
@Schema(description = "上班前打卡时间(分钟) 默认 120分钟")
@ExcelProperty("上班前打卡时间(分钟) 默认 120分钟")
private Integer beforePunchTimeUpWork;
@Schema(description = "上班后打卡时间(分钟) 默认 120分钟")
@ExcelProperty("上班后打卡时间(分钟) 默认 120分钟")
private Integer afterPunchTimeUpWork;
@Schema(description = "下班前打卡时间(分钟) 默认 120分钟")
@ExcelProperty("下班前打卡时间(分钟) 默认 120分钟")
private Integer beforePunchTimeDownWork;
@Schema(description = "下班后打卡时间(分钟) 默认 120分钟")
@ExcelProperty("下班后打卡时间(分钟) 默认 120分钟")
private Integer afterPunchTimeDownWork;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@ -0,0 +1,46 @@
package cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import javax.validation.constraints.*;
import java.util.*;
@Schema(description = "管理后台 - 考勤组班次子表新增/修改 Request VO")
@Data
public class AttendanceGroupShiftItemSaveReqVO {
@Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "957")
private Long id;
@Schema(description = "考勤组id", example = "26060")
private Long attendanceGroupId;
@Schema(description = "班次id", example = "22909")
private Long kqAttendanceGroupShiftId;
@Schema(description = "级别 从1到 排序用")
private Integer level;
@Schema(description = "开始打卡时间")
private String beginTime;
@Schema(description = "结束打卡时间")
private String endTime;
@Schema(description = "是否必须 0否 1是 (如果不是必须系统会自动打卡)")
private Integer mustFlag;
@Schema(description = "上班前打卡时间(分钟) 默认 120分钟")
private Integer beforePunchTimeUpWork;
@Schema(description = "上班后打卡时间(分钟) 默认 120分钟")
private Integer afterPunchTimeUpWork;
@Schema(description = "下班前打卡时间(分钟) 默认 120分钟")
private Integer beforePunchTimeDownWork;
@Schema(description = "下班后打卡时间(分钟) 默认 120分钟")
private Integer afterPunchTimeDownWork;
}

View File

@ -25,7 +25,7 @@ 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.groupuser.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.module.system.service.attendance.groupuser.AttendanceGroupUserService;
@Tag(name = "管理后台 - 考勤组人员")

View File

@ -25,7 +25,7 @@ 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.punchrecord.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.module.system.service.attendance.punchrecord.AttendancePunchRecordService;
@Tag(name = "管理后台 - 用户打卡记录")

View File

@ -25,7 +25,7 @@ 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.scheduling.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.scheduling.AttendanceSchedulingDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.scheduling.AttendanceSchedulingDO;
import cn.iocoder.yudao.module.system.service.attendance.scheduling.AttendanceSchedulingService;
@Tag(name = "管理后台 - 排班制考勤设置")

View File

@ -1,6 +1,6 @@
package cn.iocoder.yudao.module.system.controller.app.attendance.dto;
import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.system.dal.dataobject.fixed;
package cn.iocoder.yudao.module.system.dal.dataobject.attendance.fixed;
import lombok.*;
import java.util.*;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.system.dal.dataobject.group;
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;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.system.dal.dataobject.groupshift;
package cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshift;
import lombok.*;
import java.util.*;
@ -35,9 +35,4 @@ public class AttendanceGroupShiftDO extends BaseDO {
* 班次名称
*/
private String name;
/**
* 班次考勤时间json[{start_tiem:HH:mm,start_check_flag:true,end_time:HH:mm,end_check_flah: true}]
*/
private String attendanceTimeJson;
}

View File

@ -0,0 +1,71 @@
package cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem;
import lombok.*;
import java.util.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
/**
* 考勤组班次子表 DO
*
* @author 艾楷
*/
@TableName("kq_attendance_group_shift_item")
@KeySequence("kq_attendance_group_shift_item_seq") // 用于 OraclePostgreSQLKingbaseDB2H2 数据库的主键自增如果是 MySQL 等数据库可不写
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AttendanceGroupShiftItemDO extends BaseDO {
/**
* 编号
*/
@TableId
private Long id;
/**
* 考勤组id
*/
private Long attendanceGroupId;
/**
* 班次id
*/
private Long kqAttendanceGroupShiftId;
/**
* 级别 从1到 排序用
*/
private Integer level;
/**
* 开始打卡时间
*/
private String beginTime;
/**
* 结束打卡时间
*/
private String endTime;
/**
* 是否必须 0否 1是 (如果不是必须系统会自动打卡)
*/
private Integer mustFlag;
/**
* 上班前打卡时间分钟 默认 120分钟
*/
private Integer beforePunchTimeUpWork;
/**
* 上班后打卡时间分钟 默认 120分钟
*/
private Integer afterPunchTimeUpWork;
/**
* 下班前打卡时间分钟 默认 120分钟
*/
private Integer beforePunchTimeDownWork;
/**
* 下班后打卡时间分钟 默认 120分钟
*/
private Integer afterPunchTimeDownWork;
}

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.system.dal.dataobject.groupuser;
package cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser;
import lombok.*;
import java.util.*;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.system.dal.dataobject.punchrecord;
package cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord;
import lombok.*;
import java.util.*;

View File

@ -1,4 +1,4 @@
package cn.iocoder.yudao.module.system.dal.dataobject.scheduling;
package cn.iocoder.yudao.module.system.dal.dataobject.attendance.scheduling;
import lombok.*;
import java.util.*;

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.dal.mysql.attendance.fixed;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.fixed.AttendanceFixedDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.*;

View File

@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
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.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

View File

@ -1,13 +1,11 @@
package cn.iocoder.yudao.module.system.dal.mysql.attendance.groupshift;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.groupshift.AttendanceGroupShiftDO;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.AttendanceGroupShiftPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshift.AttendanceGroupShiftDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.*;
/**
* 考勤组班次 Mapper
@ -21,7 +19,6 @@ public interface AttendanceGroupShiftMapper extends BaseMapperX<AttendanceGroupS
return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceGroupShiftDO>()
.eqIfPresent(AttendanceGroupShiftDO::getAttendanceGroupId, reqVO.getAttendanceGroupId())
.likeIfPresent(AttendanceGroupShiftDO::getName, reqVO.getName())
.eqIfPresent(AttendanceGroupShiftDO::getAttendanceTimeJson, reqVO.getAttendanceTimeJson())
.betweenIfPresent(AttendanceGroupShiftDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(AttendanceGroupShiftDO::getId));
}

View File

@ -0,0 +1,36 @@
package cn.iocoder.yudao.module.system.dal.mysql.attendance.groupshiftitem;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo.AttendanceGroupShiftItemPageReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 考勤组班次子表 Mapper
*
* @author 艾楷
*/
@Mapper
public interface AttendanceGroupShiftItemMapper extends BaseMapperX<AttendanceGroupShiftItemDO> {
default PageResult<AttendanceGroupShiftItemDO> selectPage(AttendanceGroupShiftItemPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceGroupShiftItemDO>()
.eqIfPresent(AttendanceGroupShiftItemDO::getAttendanceGroupId, reqVO.getAttendanceGroupId())
.eqIfPresent(AttendanceGroupShiftItemDO::getKqAttendanceGroupShiftId, reqVO.getKqAttendanceGroupShiftId())
.eqIfPresent(AttendanceGroupShiftItemDO::getLevel, reqVO.getLevel())
.betweenIfPresent(AttendanceGroupShiftItemDO::getBeginTime, reqVO.getBeginTime())
.betweenIfPresent(AttendanceGroupShiftItemDO::getEndTime, reqVO.getEndTime())
.eqIfPresent(AttendanceGroupShiftItemDO::getMustFlag, reqVO.getMustFlag())
.eqIfPresent(AttendanceGroupShiftItemDO::getBeforePunchTimeUpWork, reqVO.getBeforePunchTimeUpWork())
.eqIfPresent(AttendanceGroupShiftItemDO::getAfterPunchTimeUpWork, reqVO.getAfterPunchTimeUpWork())
.eqIfPresent(AttendanceGroupShiftItemDO::getBeforePunchTimeDownWork, reqVO.getBeforePunchTimeDownWork())
.eqIfPresent(AttendanceGroupShiftItemDO::getAfterPunchTimeDownWork, reqVO.getAfterPunchTimeDownWork())
.betweenIfPresent(AttendanceGroupShiftItemDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(AttendanceGroupShiftItemDO::getId));
}
}

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.dal.mysql.attendance.groupuser;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.*;

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.dal.mysql.attendance.punchrecord;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.*;

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.dal.mysql.attendance.scheduling;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.system.dal.dataobject.scheduling.AttendanceSchedulingDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.scheduling.AttendanceSchedulingDO;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.*;

View File

@ -7,7 +7,7 @@ import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.module.system.controller.app.attendance.dto.AttendancePunchPageDTO;
import cn.iocoder.yudao.module.system.controller.app.attendance.vo.AttendancePunchPageVO;
import cn.iocoder.yudao.module.system.controller.app.attendance.vo.HolidayVO;
import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
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.punch.PunchService;
@ -31,7 +31,7 @@ public class AttendanceServiceImpl implements AttendanceService {
@Resource
private AttendanceGroupService attendanceGroupService;
@Resource
private StringRedisTemplate redisTemplate;
private StringRedisTemplate stringRedisTemplate;
@Override
public AttendancePunchPageVO getPunchPage(AttendancePunchPageDTO dto) {
@ -53,19 +53,19 @@ public class AttendanceServiceImpl implements AttendanceService {
String dateStr = DateUtils.dateFormat(date, "yyyy-MM-dd");
String year = dateStr.substring(0, 4);
String key = "holiday_" + year;
Boolean flag = redisTemplate.hasKey(key);
Boolean flag = stringRedisTemplate.hasKey(key);
// 缓存不存在
if (Boolean.FALSE.equals(flag)) {
String url = "https://cdn.jsdelivr.net/gh/NateScarlet/holiday-cn@master/" + year + ".json";
String json = HttpUtil.get(url, 0);
JSONObject jsonObject = JSONUtil.parseObj(json);
Map<String, Boolean> map = jsonObject.getBeanList("days", HolidayVO.class).stream().collect(Collectors.toMap(HolidayVO::getDate, HolidayVO::getIsOffDay));
redisTemplate.opsForHash().putAll(key, map);
stringRedisTemplate.opsForHash().putAll(key, map);
// -- 删除去年的
String lastKey = "holiday_" + (Integer.parseInt(year) - 1);
redisTemplate.delete(lastKey);
stringRedisTemplate.delete(lastKey);
}
return (Boolean) redisTemplate.opsForHash().get(key, date);
return (Boolean) stringRedisTemplate.opsForHash().get(key, date);
}
}

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.service.attendance.fixed;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 固定班制考勤设置 Service 接口

View File

@ -2,17 +2,20 @@ package cn.iocoder.yudao.module.system.service.attendance.fixed;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.date.DateUtils;
import cn.iocoder.yudao.framework.common.util.distance.GeoUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.fixed.vo.AttendanceFixedSaveReqVO;
import cn.iocoder.yudao.module.system.controller.app.attendance.dto.AttendancePunchPageDTO;
import cn.iocoder.yudao.module.system.controller.app.attendance.vo.AttendancePunchPageVO;
import cn.iocoder.yudao.module.system.dal.dataobject.fixed.AttendanceFixedDO;
import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO;
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.mysql.attendance.fixed.AttendanceFixedMapper;
import cn.iocoder.yudao.module.system.service.attendance.AttendanceService;
import cn.iocoder.yudao.module.system.service.attendance.punch.PunchService;
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;
@ -34,7 +37,10 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch
@Resource
private AttendanceFixedMapper fixedMapper;
@Resource
@Lazy // 避免依赖循环
private AttendanceService attendanceService;
@Resource
private StringRedisTemplate stringRedisTemplate;
@Override
public Long createFixed(AttendanceFixedSaveReqVO createReqVO) {
@ -108,10 +114,24 @@ public class AttendanceFixedServiceImpl implements AttendanceFixedService, Punch
if (attendanceFixedDO == null || attendanceFixedDO.getAttendanceGroupShiftId() == null) {
return vo.setTodayNeedAttendance(AttendanceGroupDO.FALSE);
}
vo.setFieldworkFlag(activationGroup.getFieldworkFlag());
// - 根据经纬度判断是否在对应班组的打卡点上
vo.setCheckInPoint(GeoUtil.distance(Double.parseDouble(dto.getLatitude()), Double.parseDouble(dto.getLongitude())
, Double.parseDouble(activationGroup.getLatitude()), Double.parseDouble(activationGroup.getLongitude()), activationGroup.getScope()));
// TODO: 2024/4/17 明天在努力
String key = "attendance" + "_" + activationGroup.getId();
// -- 这里的key 有个情况 - 就是上班时间和下班时间夸天了 - 所以 这里要判断下上下班时间 -
// 是否夸天 - 如果是的话 判断当前是上班卡还是下班卡 - 如果是下班卡的话 当前时间需要减去一天
String mapKey = dto.getUserId() + "_" + DateUtils.dateFormat(thisDate, DateUtils.FORMAT_YEAR_MONTH_DAY);
Object value = stringRedisTemplate.opsForHash().get(key, mapKey);
if (value != null) {
}
return null;
}
}

View File

@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.system.service.attendance.group;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
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.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import javax.validation.Valid;

View File

@ -4,7 +4,7 @@ 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.group.vo.AttendanceGroupPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.group.vo.AttendanceGroupSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO;
import cn.iocoder.yudao.module.system.dal.mysql.attendance.group.AttendanceGroupMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.service.attendance.groupshift;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.groupshift.AttendanceGroupShiftDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshift.AttendanceGroupShiftDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 考勤组班次 Service 接口

View File

@ -5,7 +5,7 @@ import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.system.controller.admin.groupshift.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.groupshift.AttendanceGroupShiftDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshift.AttendanceGroupShiftDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

View File

@ -0,0 +1,55 @@
package cn.iocoder.yudao.module.system.service.attendance.groupshiftitem;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo.AttendanceGroupShiftItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo.AttendanceGroupShiftItemSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO;
import javax.validation.Valid;
/**
* 考勤组班次子表 Service 接口
*
* @author 艾楷
*/
public interface AttendanceGroupShiftItemService {
/**
* 创建考勤组班次子表
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createAttendanceGroupShiftItem(@Valid AttendanceGroupShiftItemSaveReqVO createReqVO);
/**
* 更新考勤组班次子表
*
* @param updateReqVO 更新信息
*/
void updateAttendanceGroupShiftItem(@Valid AttendanceGroupShiftItemSaveReqVO updateReqVO);
/**
* 删除考勤组班次子表
*
* @param id 编号
*/
void deleteAttendanceGroupShiftItem(Long id);
/**
* 获得考勤组班次子表
*
* @param id 编号
* @return 考勤组班次子表
*/
AttendanceGroupShiftItemDO getAttendanceGroupShiftItem(Long id);
/**
* 获得考勤组班次子表分页
*
* @param pageReqVO 分页查询
* @return 考勤组班次子表分页
*/
PageResult<AttendanceGroupShiftItemDO> getAttendanceGroupShiftItemPage(AttendanceGroupShiftItemPageReqVO pageReqVO);
}

View File

@ -0,0 +1,59 @@
package cn.iocoder.yudao.module.system.service.attendance.groupshiftitem;
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.groupshiftitem.vo.AttendanceGroupShiftItemPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.groupshiftitem.vo.AttendanceGroupShiftItemSaveReqVO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupshiftitem.AttendanceGroupShiftItemDO;
import cn.iocoder.yudao.module.system.dal.mysql.attendance.groupshiftitem.AttendanceGroupShiftItemMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
/**
* 考勤组班次子表 Service 实现类
*
* @author 艾楷
*/
@Service
@Validated
public class AttendanceGroupShiftItemServiceImpl implements AttendanceGroupShiftItemService {
@Resource
private AttendanceGroupShiftItemMapper attendanceGroupShiftItemMapper;
@Override
public Long createAttendanceGroupShiftItem(AttendanceGroupShiftItemSaveReqVO createReqVO) {
// 插入
AttendanceGroupShiftItemDO attendanceGroupShiftItem = BeanUtils.toBean(createReqVO, AttendanceGroupShiftItemDO.class);
attendanceGroupShiftItemMapper.insert(attendanceGroupShiftItem);
// 返回
return attendanceGroupShiftItem.getId();
}
@Override
public void updateAttendanceGroupShiftItem(AttendanceGroupShiftItemSaveReqVO updateReqVO) {
// 更新
AttendanceGroupShiftItemDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceGroupShiftItemDO.class);
attendanceGroupShiftItemMapper.updateById(updateObj);
}
@Override
public void deleteAttendanceGroupShiftItem(Long id) {
// 删除
attendanceGroupShiftItemMapper.deleteById(id);
}
@Override
public AttendanceGroupShiftItemDO getAttendanceGroupShiftItem(Long id) {
return attendanceGroupShiftItemMapper.selectById(id);
}
@Override
public PageResult<AttendanceGroupShiftItemDO> getAttendanceGroupShiftItemPage(AttendanceGroupShiftItemPageReqVO pageReqVO) {
return attendanceGroupShiftItemMapper.selectPage(pageReqVO);
}
}

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.service.attendance.groupuser;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 考勤组人员 Service 接口

View File

@ -5,7 +5,7 @@ import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.system.controller.admin.groupuser.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.groupuser.AttendanceGroupUserDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.service.attendance.punchrecord;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 用户打卡记录 Service 接口

View File

@ -5,7 +5,7 @@ import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import cn.iocoder.yudao.module.system.controller.admin.punchrecord.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.punchrecord.AttendancePunchRecordDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;

View File

@ -1,11 +1,9 @@
package cn.iocoder.yudao.module.system.service.attendance.scheduling;
import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.scheduling.AttendanceSchedulingDO;
import cn.iocoder.yudao.module.system.dal.dataobject.attendance.scheduling.AttendanceSchedulingDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
/**
* 排班制考勤设置 Service 接口

View File

@ -6,7 +6,7 @@ import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.AttendanceS
import cn.iocoder.yudao.module.system.controller.admin.scheduling.vo.AttendanceSchedulingSaveReqVO;
import cn.iocoder.yudao.module.system.controller.app.attendance.dto.AttendancePunchPageDTO;
import cn.iocoder.yudao.module.system.controller.app.attendance.vo.AttendancePunchPageVO;
import cn.iocoder.yudao.module.system.dal.dataobject.scheduling.AttendanceSchedulingDO;
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.punch.PunchService;
import org.springframework.stereotype.Service;

View File

@ -10,7 +10,7 @@
-->
<select id="getByUserId"
resultType="cn.iocoder.yudao.module.system.dal.dataobject.group.AttendanceGroupDO">
resultType="cn.iocoder.yudao.module.system.dal.dataobject.attendance.group.AttendanceGroupDO">
select a.*
from kq_attendance_group as a
left join kq_attendance_group_user as b on a.id = b.attendance_group_id

View File

@ -0,0 +1,12 @@
<?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.groupshiftitem.AttendanceGroupShiftItemMapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>