Browse Source

考勤计算

zhaopeiqing 7 months ago
parent
commit
370db9c646
50 changed files with 1281 additions and 41 deletions
  1. 1 0
      yudao-module-personnel/yudao-module-attendance-api/src/main/java/cn/iocoder/yudao/module/attendance/enums/ErrorCodeConstants.java
  2. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/AttendanceBusinessController.java
  3. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/AttendanceEmployeeSettingController.java
  4. 10 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingRespVO.java
  5. 15 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/AttendanceInfoController.java
  6. 57 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoPageReqVO.java
  7. 54 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoRespVO.java
  8. 39 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoPageReqVO.java
  9. 66 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoRespVO.java
  10. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/AttendanceLeaveController.java
  11. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/AttendanceOutController.java
  12. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/AttendanceSchedulingManageController.java
  13. 110 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/AttendanceWorkdaySettingController.java
  14. 36 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingPageReqVO.java
  15. 40 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingRespVO.java
  16. 32 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingSaveReqVO.java
  17. 8 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/info/AttendanceInfoDO.java
  18. 47 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/workdaysetting/AttendanceWorkdaySettingDO.java
  19. 9 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/business/AttendanceBusinessMapper.java
  20. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/employeesetting/AttendanceEmployeeSettingMapper.java
  21. 15 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/info/AttendanceInfoMapper.java
  22. 10 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/leave/AttendanceLeaveMapper.java
  23. 43 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/workdaysetting/AttendanceWorkdaySettingMapper.java
  24. 5 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/business/AttendanceBusinessService.java
  25. 8 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/business/AttendanceBusinessServiceImpl.java
  26. 9 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingService.java
  27. 8 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingServiceImpl.java
  28. 18 4
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoService.java
  29. 296 8
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoServiceImpl.java
  30. 3 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveService.java
  31. 9 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveServiceImpl.java
  32. 72 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/workdaysetting/AttendanceWorkdaySettingService.java
  33. 149 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/workdaysetting/AttendanceWorkdaySettingServiceImpl.java
  34. 17 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/employeesetting/AttendanceEmployeeSettingMapper.xml
  35. 24 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/info/AttendanceInfoMapper.xml
  36. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/workdaysetting/AttendanceWorkdaySettingMapper.xml
  37. 1 1
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/EmployeeInfoController.java
  38. 1 1
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/EmployeeInfoHistoryController.java
  39. 1 1
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/annualleave/HolidayAnnualLeaveController.java
  40. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/RelationsContractController.java
  41. 5 2
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractPageReqVO.java
  42. 7 3
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractRespVO.java
  43. 6 3
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractSaveReqVO.java
  44. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/RelationsConversionController.java
  45. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/RelationsEntryController.java
  46. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/RelationsRenewController.java
  47. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/RelationsTurnoverController.java
  48. 8 4
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/dal/dataobject/contract/RelationsContractDO.java
  49. 3 2
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/dal/mysql/contract/RelationsContractMapper.java
  50. 13 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java

+ 1 - 0
yudao-module-personnel/yudao-module-attendance-api/src/main/java/cn/iocoder/yudao/module/attendance/enums/ErrorCodeConstants.java

@@ -18,4 +18,5 @@ public interface ErrorCodeConstants {
     ErrorCode ATTENDANCE_LEAVE_NOT_EXISTS = new ErrorCode(1_013_000_004, "请假信息不存在");
     ErrorCode ATTENDANCE_BUSINESS_NOT_EXISTS = new ErrorCode(1_013_000_005, "出差信息不存在");
     ErrorCode ATTENDANCE_OUT_NOT_EXISTS = new ErrorCode(1_013_000_006, "公务外出信息不存在");
+    ErrorCode WORKDAY_SETTING_NOT_EXISTS = new ErrorCode(1_013_000_007, "考勤工作日设置不存在");
 }

+ 1 - 1
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/AttendanceBusinessController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 出差信息")
 @RestController
-@RequestMapping("/attendance/business")
+@RequestMapping("/personnel/attendance/business")
 @Validated
 public class AttendanceBusinessController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/AttendanceEmployeeSettingController.java

@@ -34,7 +34,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
 
 @Tag(name = "管理后台 - 考勤员工设置")
 @RestController
-@RequestMapping("/presonnel/attendance/employee-setting")
+@RequestMapping("/personnel/attendance/employee-setting")
 @Validated
 public class AttendanceEmployeeSettingController {
 

+ 10 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingRespVO.java

@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
+
+import java.time.LocalTime;
 import java.util.*;
 import java.util.*;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -53,6 +55,14 @@ public class AttendanceEmployeeSettingRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "考勤设置上班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤设置上班时间")
+    private LocalTime startTime;
+
+    @Schema(description = "考勤设置下班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤设置下班时间")
+    private LocalTime endTime;
+
     @Schema(description = "租户编号", example = "1")
     @ExcelProperty("租户编号")
     private Long tenantId;

+ 15 - 1
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/AttendanceInfoController.java

@@ -33,7 +33,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
 
 @Tag(name = "管理后台 - 考勤信息")
 @RestController
-@RequestMapping("/presonnel/attendance/info")
+@RequestMapping("/personnel/attendance/info")
 @Validated
 public class AttendanceInfoController {
 
@@ -105,4 +105,18 @@ public class AttendanceInfoController {
         return success(infoService.importAttendanceInfoList(list));
     }
 
+    @GetMapping("/dailyPage")
+    @Operation(summary = "获得每日考勤信息分页")
+    @PreAuthorize("@ss.hasPermission('attendance:info:query')")
+    public CommonResult<List<AttendanceDailyInfoRespVO>> getDailyInfoPage(@Valid AttendanceDailyInfoPageReqVO pageReqVO) {
+        return success(infoService.getDailyInfoPage(pageReqVO));
+    }
+
+    @GetMapping("/monthlyPage")
+    @Operation(summary = "获得月度考勤信息分页")
+    @PreAuthorize("@ss.hasPermission('attendance:info:query')")
+    public CommonResult<List<AttendanceMonthlyInfoRespVO>> getMonthlyInfoPage(@Valid AttendanceMonthlyInfoPageReqVO pageReqVO) {
+        return success(infoService.getMonthlyInfoPage(pageReqVO));
+    }
+
 }

+ 57 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoPageReqVO.java

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+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.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+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 AttendanceDailyInfoPageReqVO extends PageParam {
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    private String employeeName;
+
+    @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
+    private String employeeMobile;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "考勤开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] attendanceStartDate;
+
+    @Schema(description = "考勤结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] attendanceEndDate;
+
+    @Schema(description = "上班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] workStartTime;
+
+    @Schema(description = "下班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] workEndTime;
+
+    @Schema(description = "迟到时间(min)", example = "2")
+    private String lateMinute;
+
+    @Schema(description = "早退时间(min)", example = "2")
+    private String earlyMinute;
+
+    @Schema(description = "总工作时间(min)", example = "2")
+    private String totalWorkingMinute;
+
+}

+ 54 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoRespVO.java

@@ -0,0 +1,54 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+@Schema(description = "管理后台 - 每日考勤信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AttendanceDailyInfoRespVO {
+
+    @Schema(description = "员工ID", example = "6960")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @ExcelProperty("员工姓名")
+    private String employeeName;
+
+    @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
+    @NotEmpty(message = "员工手机号不能为空")
+    private String employeeMobile;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "考勤日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤日期")
+    private LocalDate attendanceDate;
+
+    @Schema(description = "上班时间")
+    @ExcelProperty("上班时间")
+    private LocalTime workStartTime;
+
+    @Schema(description = "下班时间")
+    @ExcelProperty("下班时间")
+    private LocalTime workEndTime;
+
+    @Schema(description = "迟到时间(min)", example = "2")
+    private String lateMinute;
+
+    @Schema(description = "早退时间(min)", example = "2")
+    private String earlyMinute;
+
+    @Schema(description = "总工作时间(min)", example = "2")
+    private String totalWorkingMinute;
+
+}

+ 39 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoPageReqVO.java

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.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;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+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 AttendanceMonthlyInfoPageReqVO extends PageParam {
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    private String employeeName;
+
+    @Schema(description = "员工编号", example = "6960")
+    private String employeeNumber;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "考勤月份", example = "2024-07")
+    private String attendanceMonth;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+
+}

+ 66 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoRespVO.java

@@ -0,0 +1,66 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+@Schema(description = "管理后台 - 每日考勤信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AttendanceMonthlyInfoRespVO {
+
+    @Schema(description = "员工ID", example = "6960")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @ExcelProperty("员工姓名")
+    private String employeeName;
+
+    @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
+    @NotEmpty(message = "员工手机号不能为空")
+    private String employeeMobile;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "考勤月份", example = "2024-07")
+    private String attendanceMonth;
+
+    @Schema(description = "出勤天数", example = "13463")
+    private int attendanceDays = 0;
+
+    @Schema(description = "正常打卡", example = "13463")
+    private int normalClockCount = 0;
+
+    @Schema(description = "迟到次数", example = "13463")
+    private int lateCount;
+
+    @Schema(description = "旷工次数", example = "13463")
+    private int absenteeismCount;
+
+    @Schema(description = "早退次数", example = "13463")
+    private int earlyCount;
+
+    @Schema(description = "缺卡次数", example = "13463")
+    private int missingClockCount;
+
+    @Schema(description = "请假/出差次数", example = "13463")
+    private int leaveCount;
+
+    @Schema(description = "考勤规则", example = "9:00-18:00")
+    private String attendanceRules;
+
+    @Schema(description = "考勤设置上班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤设置上班时间")
+    private LocalTime startTime;
+
+    @Schema(description = "考勤设置下班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤设置下班时间")
+    private LocalTime endTime;
+
+}

+ 1 - 1
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/AttendanceLeaveController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 请假信息")
 @RestController
-@RequestMapping("/attendance/leave")
+@RequestMapping("/personnel/attendance/leave")
 @Validated
 public class AttendanceLeaveController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/AttendanceOutController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 公务外出信息")
 @RestController
-@RequestMapping("/attendance/out")
+@RequestMapping("/personnel/attendance/out")
 @Validated
 public class AttendanceOutController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/AttendanceSchedulingManageController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 考勤排班管理")
 @RestController
-@RequestMapping("/presonnel/attendance/scheduling-manage")
+@RequestMapping("/personnel/attendance/scheduling-manage")
 @Validated
 public class AttendanceSchedulingManageController {
 

+ 110 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/AttendanceWorkdaySettingController.java

@@ -0,0 +1,110 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting;
+
+import org.springframework.web.bind.annotation.*;
+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 java.util.*;
+import java.io.IOException;
+
+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.apilog.core.annotation.ApiAccessLog;
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting.AttendanceWorkdaySettingDO;
+import cn.iocoder.yudao.module.attendance.service.workdaysetting.AttendanceWorkdaySettingService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 考勤工作日设置")
+@RestController
+@RequestMapping("/personnel/attendance/workday-setting")
+@Validated
+public class AttendanceWorkdaySettingController {
+
+    @Resource
+    private AttendanceWorkdaySettingService workdaySettingService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建考勤工作日设置")
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:create')")
+    public CommonResult<Long> createWorkdaySetting(@Valid @RequestBody AttendanceWorkdaySettingSaveReqVO createReqVO) {
+        return success(workdaySettingService.createWorkdaySetting(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新考勤工作日设置")
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:update')")
+    public CommonResult<Boolean> updateWorkdaySetting(@Valid @RequestBody AttendanceWorkdaySettingSaveReqVO updateReqVO) {
+        workdaySettingService.updateWorkdaySetting(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除考勤工作日设置")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:delete')")
+    public CommonResult<Boolean> deleteWorkdaySetting(@RequestParam("id") Long id) {
+        workdaySettingService.deleteWorkdaySetting(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得考勤工作日设置")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:query')")
+    public CommonResult<AttendanceWorkdaySettingRespVO> getWorkdaySetting(@RequestParam("id") Long id) {
+        AttendanceWorkdaySettingDO workdaySetting = workdaySettingService.getWorkdaySetting(id);
+        return success(BeanUtils.toBean(workdaySetting, AttendanceWorkdaySettingRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得考勤工作日设置分页")
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:query')")
+    public CommonResult<PageResult<AttendanceWorkdaySettingRespVO>> getWorkdaySettingPage(@Valid AttendanceWorkdaySettingPageReqVO pageReqVO) {
+        PageResult<AttendanceWorkdaySettingDO> pageResult = workdaySettingService.getWorkdaySettingPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttendanceWorkdaySettingRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出考勤工作日设置 Excel")
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportWorkdaySettingExcel(@Valid AttendanceWorkdaySettingPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceWorkdaySettingDO> list = workdaySettingService.getWorkdaySettingPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "考勤工作日设置.xls", "数据", AttendanceWorkdaySettingRespVO.class,
+                        BeanUtils.toBean(list, AttendanceWorkdaySettingRespVO.class));
+    }
+
+    @PostMapping("/batch-insert")
+    @Operation(summary = "批量设置考勤工作日")
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:batch-insert')")
+    public CommonResult<Boolean> batchInsert(@RequestParam("dates") String[] dates) {
+        return success(workdaySettingService.batchInsert(dates));
+    }
+
+    @GetMapping("/get-workdays")
+    @Operation(summary = "获得考勤工作日数据")
+    @PreAuthorize("@ss.hasPermission('attendance:workday-setting:get-workdays')")
+    public CommonResult<List<AttendanceWorkdaySettingRespVO>> getWorkdays(@RequestParam("workMonth") String workMonth) {
+        List<AttendanceWorkdaySettingDO> list = workdaySettingService.getWorkdays(workMonth);
+        return success(BeanUtils.toBean(list, AttendanceWorkdaySettingRespVO.class));
+    }
+
+}

+ 36 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingPageReqVO.java

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.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 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 AttendanceWorkdaySettingPageReqVO extends PageParam {
+
+    @Schema(description = "工作月")
+    private String workMonth;
+
+    @Schema(description = "工作日")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] workDate;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+}

+ 40 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingRespVO.java

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.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 AttendanceWorkdaySettingRespVO {
+
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32468")
+    @ExcelProperty("自增主键")
+    private Long id;
+
+    @Schema(description = "工作月")
+    @ExcelProperty("工作月")
+    private String workMonth;
+
+    @Schema(description = "工作日", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("工作日")
+    private String workDate;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+}

+ 32 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingSaveReqVO.java

@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.*;
+
+@Schema(description = "管理后台 - 考勤工作日设置新增/修改 Request VO")
+@Data
+public class AttendanceWorkdaySettingSaveReqVO {
+
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32468")
+    private Long id;
+
+    @Schema(description = "工作月")
+    private String workMonth;
+
+    @Schema(description = "工作日", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotEmpty(message = "工作日不能为空")
+    private String workDate;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+}

+ 8 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/info/AttendanceInfoDO.java

@@ -37,6 +37,10 @@ public class AttendanceInfoDO extends BaseDO {
      * 员工ID
      */
     private Long employeeId;
+    /**
+     * 员工编号
+     */
+    private String employeeNumber;
     /**
      * 员工姓名
      */
@@ -53,6 +57,10 @@ public class AttendanceInfoDO extends BaseDO {
      * 职位名称
      */
     private String position;
+    /**
+     * 考勤月份
+     */
+    private String attendanceMonth;
     /**
      * 考勤日期
      */

+ 47 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/workdaysetting/AttendanceWorkdaySettingDO.java

@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting;
+
+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 zhaopq
+ */
+@TableName("attendance_workday_setting")
+@KeySequence("attendance_workday_setting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceWorkdaySettingDO extends BaseDO {
+
+    /**
+     * 自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 工作月
+     */
+    private String workMonth;
+    /**
+     * 工作日
+     */
+    private String workDate;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
+
+}

+ 9 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/business/AttendanceBusinessMapper.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.dal.mysql.business;
 
+import java.time.LocalDate;
 import java.util.*;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -45,4 +46,12 @@ public interface AttendanceBusinessMapper extends BaseMapperX<AttendanceBusiness
                 .orderByDesc(AttendanceBusinessDO::getId));
     }
 
+    default AttendanceBusinessDO selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return selectOne(new LambdaQueryWrapperX<AttendanceBusinessDO>()
+                .eqIfPresent(AttendanceBusinessDO::getEmployeeId, employeeId)
+                .betweenIfPresent(AttendanceBusinessDO::getStartDate, new LocalDate[]{date})
+                .betweenIfPresent(AttendanceBusinessDO::getEndDate, new LocalDate[]{date})
+                .orderByDesc(AttendanceBusinessDO::getId));
+    }
+
 }

+ 4 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/employeesetting/AttendanceEmployeeSettingMapper.java

@@ -7,8 +7,10 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingPageReqVO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 考勤员工设置 Mapper
@@ -33,4 +35,6 @@ public interface AttendanceEmployeeSettingMapper extends BaseMapperX<AttendanceE
                 .orderByDesc(AttendanceEmployeeSettingDO::getId));
     }
 
+    AttendanceEmployeeSettingRespVO getByEmployeeId(@Param("employeeId") Long employeeId);
+
 }

+ 15 - 1
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/info/AttendanceInfoMapper.java

@@ -5,10 +5,12 @@ import java.util.*;
 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.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.*;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting.AttendanceWorkdaySettingDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 考勤信息 Mapper
@@ -41,4 +43,16 @@ public interface AttendanceInfoMapper extends BaseMapperX<AttendanceInfoDO> {
                 .orderByDesc(AttendanceInfoDO::getId));
     }
 
+    List<AttendanceDailyInfoRespVO> getDailyInfoPage(@Param("reqVO") AttendanceDailyInfoPageReqVO reqVO);
+
+    default PageResult<AttendanceInfoDO> selectPage(AttendanceMonthlyInfoPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceInfoDO>()
+                .likeIfPresent(AttendanceInfoDO::getEmployeeName, reqVO.getEmployeeName())
+                .likeIfPresent(AttendanceInfoDO::getEmployeeNumber, reqVO.getEmployeeNumber())
+                .eqIfPresent(AttendanceInfoDO::getAttendanceMonth, reqVO.getAttendanceMonth())
+                .eqIfPresent(AttendanceInfoDO::getDeptName, reqVO.getDeptName())
+                .eqIfPresent(AttendanceInfoDO::getTenantId, reqVO.getTenantId())
+                .orderByDesc(AttendanceInfoDO::getId));
+    }
+
 }

+ 10 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/leave/AttendanceLeaveMapper.java

@@ -1,10 +1,12 @@
 package cn.iocoder.yudao.module.attendance.dal.mysql.leave;
 
+import java.time.LocalDate;
 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.attendance.dal.dataobject.business.AttendanceBusinessDO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.leave.AttendanceLeaveDO;
 import org.apache.ibatis.annotations.Mapper;
@@ -47,4 +49,12 @@ public interface AttendanceLeaveMapper extends BaseMapperX<AttendanceLeaveDO> {
                 .orderByDesc(AttendanceLeaveDO::getId));
     }
 
+    default List<AttendanceLeaveDO> selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return selectList(new LambdaQueryWrapperX<AttendanceLeaveDO>()
+                .eqIfPresent(AttendanceLeaveDO::getEmployeeId, employeeId)
+                .betweenIfPresent(AttendanceLeaveDO::getStartDate, new LocalDate[]{date})
+                .betweenIfPresent(AttendanceLeaveDO::getEndDate, new LocalDate[]{date})
+                .orderByDesc(AttendanceLeaveDO::getId));
+    }
+
 }

+ 43 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/workdaysetting/AttendanceWorkdaySettingMapper.java

@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.attendance.dal.mysql.workdaysetting;
+
+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.attendance.dal.dataobject.schedulingmanage.AttendanceSchedulingManageDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting.AttendanceWorkdaySettingDO;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo.*;
+
+/**
+ * 考勤工作日设置 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface AttendanceWorkdaySettingMapper extends BaseMapperX<AttendanceWorkdaySettingDO> {
+
+    default PageResult<AttendanceWorkdaySettingDO> selectPage(AttendanceWorkdaySettingPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceWorkdaySettingDO>()
+                .eqIfPresent(AttendanceWorkdaySettingDO::getWorkMonth, reqVO.getWorkMonth())
+                .betweenIfPresent(AttendanceWorkdaySettingDO::getWorkDate, reqVO.getWorkDate())
+                .eqIfPresent(AttendanceWorkdaySettingDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(AttendanceWorkdaySettingDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(AttendanceWorkdaySettingDO::getTenantId, reqVO.getTenantId())
+                .orderByDesc(AttendanceWorkdaySettingDO::getId));
+    }
+
+    // 自定义的deleteByMonth方法
+    default int deleteByMonth(String workMonth) {
+        return delete(new LambdaQueryWrapperX<AttendanceWorkdaySettingDO>()
+                .eq(AttendanceWorkdaySettingDO::getWorkMonth, workMonth));
+    }
+
+    default List<AttendanceWorkdaySettingDO> getWorkdays(String workMonth) {
+        return selectList(new LambdaQueryWrapperX<AttendanceWorkdaySettingDO>()
+                .eq(AttendanceWorkdaySettingDO::getWorkMonth, workMonth));
+    }
+
+}

+ 5 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/business/AttendanceBusinessService.java

@@ -1,10 +1,12 @@
 package cn.iocoder.yudao.module.attendance.service.business;
 
+import java.time.LocalDate;
 import java.util.*;
 import cn.iocoder.yudao.module.attendance.controller.admin.business.vo.*;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.apache.ibatis.annotations.Param;
 
 import javax.validation.Valid;
 
@@ -53,4 +55,7 @@ public interface AttendanceBusinessService {
      */
     PageResult<AttendanceBusinessDO> getBusinessPage(AttendanceBusinessPageReqVO pageReqVO);
 
+    AttendanceBusinessDO selectByDateAndEmployeeId(LocalDate date, Long employeeId);
+
+
 }

+ 8 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/business/AttendanceBusinessServiceImpl.java

@@ -12,6 +12,8 @@ import cn.iocoder.yudao.module.attendance.dal.mysql.business.AttendanceBusinessM
 
 import javax.annotation.Resource;
 
+import java.time.LocalDate;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
 
@@ -69,4 +71,10 @@ public class AttendanceBusinessServiceImpl implements AttendanceBusinessService
         return businessMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public AttendanceBusinessDO selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return businessMapper.selectByDateAndEmployeeId(date, employeeId);
+    }
+
+
 }

+ 9 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingService.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.attendance.service.employeesetting;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingSaveReqVO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 
@@ -53,4 +54,12 @@ public interface AttendanceEmployeeSettingService {
      */
     PageResult<AttendanceEmployeeSettingDO> getEmployeeSettingPage(AttendanceEmployeeSettingPageReqVO pageReqVO);
 
+    /**
+     * 通过员工ID获得考勤员工设置
+     *
+     * @param employeeId 员工ID
+     * @return 考勤员工设置
+     */
+    AttendanceEmployeeSettingRespVO getByEmployeeId(Long employeeId);
+
 }

+ 8 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingServiceImpl.java

@@ -3,7 +3,9 @@ package cn.iocoder.yudao.module.attendance.service.employeesetting;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingSaveReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceDailyInfoRespVO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 import cn.iocoder.yudao.module.attendance.dal.mysql.employeesetting.AttendanceEmployeeSettingMapper;
 import org.springframework.stereotype.Service;
@@ -78,4 +80,10 @@ public class AttendanceEmployeeSettingServiceImpl implements AttendanceEmployeeS
         return employeeSettingMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    @TenantIgnore
+    public AttendanceEmployeeSettingRespVO getByEmployeeId(Long employeeId) {
+        return employeeSettingMapper.getByEmployeeId(employeeId);
+    }
+
 }

+ 18 - 4
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoService.java

@@ -1,12 +1,11 @@
 package cn.iocoder.yudao.module.attendance.service.info;
 
+import java.time.LocalDate;
 import java.util.*;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportExcelVO;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportRespVO;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoSaveReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
 
 import javax.validation.Valid;
@@ -64,5 +63,20 @@ public interface AttendanceInfoService {
      */
     AttendanceInfoImportRespVO importAttendanceInfoList(List<AttendanceInfoImportExcelVO> importAttendanceInfos);
 
+    /**
+     * 获得考勤信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 考勤信息分页
+     */
+    List<AttendanceDailyInfoRespVO> getDailyInfoPage(AttendanceDailyInfoPageReqVO pageReqVO);
+
+    /**
+     * 获得考勤信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 考勤信息分页
+     */
+    List<AttendanceMonthlyInfoRespVO> getMonthlyInfoPage(AttendanceMonthlyInfoPageReqVO pageReqVO);
 
 }

+ 296 - 8
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoServiceImpl.java

@@ -1,31 +1,43 @@
 package cn.iocoder.yudao.module.attendance.service.info;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.date.DateUtil;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
-import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
 import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
 import cn.iocoder.yudao.framework.security.core.LoginUser;
 import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
 import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportExcelVO;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportRespVO;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoSaveReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.leave.AttendanceLeaveDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting.AttendanceWorkdaySettingDO;
 import cn.iocoder.yudao.module.attendance.dal.mysql.info.AttendanceInfoMapper;
+import cn.iocoder.yudao.module.attendance.service.business.AttendanceBusinessService;
+import cn.iocoder.yudao.module.attendance.service.employeesetting.AttendanceEmployeeSettingService;
+import cn.iocoder.yudao.module.attendance.service.leave.AttendanceLeaveService;
+import cn.iocoder.yudao.module.attendance.service.out.AttendanceOutService;
+import cn.iocoder.yudao.module.attendance.service.workdaysetting.AttendanceWorkdaySettingService;
 import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoPageReqVO;
 import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
 import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoService;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalTime;
 import java.util.*;
 import java.util.stream.Collectors;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 
 import javax.annotation.Resource;
@@ -33,7 +45,6 @@ import javax.annotation.Resource;
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
 import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
-import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 
 /**
  * 考勤信息 Service 实现类
@@ -44,10 +55,21 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
 @Validated
 public class AttendanceInfoServiceImpl implements AttendanceInfoService {
 
+    private static final Logger log = LoggerFactory.getLogger(AttendanceInfoServiceImpl.class);
     @Resource
     private AttendanceInfoMapper infoMapper;
     @Resource
     private EmployeeInfoService employeeInfoService;
+    @Resource
+    private AttendanceEmployeeSettingService attendanceEmployeeSettingService;
+    @Resource
+    private AttendanceLeaveService attendanceLeaveService;
+    @Resource
+    private AttendanceBusinessService attendanceBusinessService;
+    @Resource
+    private AttendanceOutService attendanceOutService;
+    @Resource
+    private AttendanceWorkdaySettingService workdaySettingService;
 
     @Override
     @TenantIgnore
@@ -156,6 +178,95 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
         return respVO;
     }
 
+    @Override
+    @TenantIgnore
+    public List<AttendanceDailyInfoRespVO> getDailyInfoPage(AttendanceDailyInfoPageReqVO pageReqVO) {
+        List<AttendanceDailyInfoRespVO> list = infoMapper.getDailyInfoPage(pageReqVO);
+        if (list != null && list.size() > 0) {
+            for (AttendanceDailyInfoRespVO info : list) {
+                // 查询该员工考勤规则
+                AttendanceEmployeeSettingRespVO respVO = attendanceEmployeeSettingService.getByEmployeeId(info.getEmployeeId());
+                if (respVO != null && respVO.getStartTime() != null && respVO.getEndTime() != null
+                        && info.getWorkStartTime() != null && info.getWorkEndTime() != null) {
+
+                    LocalTime startTime = respVO.getStartTime();
+                    LocalTime endTime = respVO.getEndTime();
+                    LocalTime workStartTime = info.getWorkStartTime();
+                    LocalTime workEndTime = info.getWorkEndTime();
+
+                    // 计算迟到分钟数
+                    long lateMinute = Duration.between(startTime, workStartTime).toMinutes();
+                    if (lateMinute < 0) { // 如果上班时间早于开始时间,则视为不迟到
+                        lateMinute = 0;
+                    }
+
+                    // 计算早退分钟数
+                    long leaveEarlyMinute = Duration.between(workEndTime, endTime).toMinutes();
+                    if (leaveEarlyMinute < 0) { // 如果下班时间晚于结束时间,则视为不早退
+                        leaveEarlyMinute = 0;
+                    }
+
+                    // 计算总工作分钟数
+                    long totalWorkingMinute = Duration.between(workStartTime, workEndTime).toMinutes();
+
+                    // 设置结果
+                    info.setLateMinute(String.format("%d", lateMinute));
+                    info.setEarlyMinute(String.format("%d", leaveEarlyMinute));
+                    info.setTotalWorkingMinute(String.format("%d", totalWorkingMinute));
+                }
+            }
+        }
+        return list;
+    }
+
+    @Override
+    @TenantIgnore
+    public List<AttendanceMonthlyInfoRespVO> getMonthlyInfoPage(AttendanceMonthlyInfoPageReqVO pageReqVO) {
+        // 获取每日考勤信息
+        List<AttendanceInfoDO> dos = infoMapper.selectPage(pageReqVO).getList();
+        List<AttendanceDailyInfoRespVO> dailyInfoList = BeanUtils.toBean(dos, AttendanceDailyInfoRespVO.class);
+        // 创建一个空的月度考勤信息列表
+        List<AttendanceMonthlyInfoRespVO> monthlyInfoList = new ArrayList<>();
+
+        // 查询指定月份的工作日
+        List<AttendanceWorkdaySettingDO> workDays = workdaySettingService.getWorkdays(pageReqVO.getAttendanceMonth());
+
+        // 按员工ID和月份分组每日考勤信息
+        Map<String, List<AttendanceDailyInfoRespVO>> groupedDailyInfo = new HashMap<>();
+        for (AttendanceDailyInfoRespVO dailyInfo : dailyInfoList) {
+            String key = dailyInfo.getEmployeeId() + "-" + pageReqVO.getAttendanceMonth();
+            groupedDailyInfo.computeIfAbsent(key, k -> new ArrayList<>()).add(dailyInfo);
+        }
+
+        // 遍历每个员工的每日考勤信息
+        for (Map.Entry<String, List<AttendanceDailyInfoRespVO>> entry : groupedDailyInfo.entrySet()) {
+            List<AttendanceDailyInfoRespVO> employeeDailyInfoList = entry.getValue();
+            if (employeeDailyInfoList.isEmpty()) continue;
+
+            // 创建一个新的月度考勤信息对象
+            AttendanceMonthlyInfoRespVO monthlyInfo = new AttendanceMonthlyInfoRespVO();
+            monthlyInfo.setEmployeeId(employeeDailyInfoList.get(0).getEmployeeId());
+            monthlyInfo.setAttendanceMonth(pageReqVO.getAttendanceMonth());
+
+            // 计算月度数据
+            Map<String, Object> monthlyDataMap = getMonthlyData(employeeDailyInfoList, workDays);
+
+            // 设置月度考勤统计数据
+            monthlyInfo.setAttendanceDays(((BigDecimal) monthlyDataMap.get("cq")).intValue());
+            monthlyInfo.setNormalClockCount(((BigDecimal) monthlyDataMap.get("zc")).intValue());
+            monthlyInfo.setLateCount(((BigDecimal) monthlyDataMap.get("cd")).intValue());
+            monthlyInfo.setAbsenteeismCount(((BigDecimal) monthlyDataMap.get("kg")).intValue());
+            monthlyInfo.setEarlyCount(((BigDecimal) monthlyDataMap.get("zt")).intValue());
+            monthlyInfo.setMissingClockCount(((BigDecimal) monthlyDataMap.get("qk")).intValue());
+            monthlyInfo.setLeaveCount(((BigDecimal) monthlyDataMap.get("qj")).intValue());
+
+            // 添加到月度考勤信息列表
+            monthlyInfoList.add(monthlyInfo);
+        }
+
+        return monthlyInfoList;
+    }
+
     private boolean validateEmployeeExists(String employeeName, String employeeMobile, Long tenantId) {
         // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确
         return DataPermissionUtils.executeIgnore(() -> {
@@ -168,4 +279,181 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
     }
 
 
+    // 计算月度数据的方法
+    private Map<String, Object> getMonthlyData(List<AttendanceDailyInfoRespVO> dailyInfoList,
+                                               List<AttendanceWorkdaySettingDO> workDays) {
+        Map<String, Object> map = new HashMap<>();
+        map.put("cq", BigDecimal.ZERO); // 出勤天数
+        map.put("zc", BigDecimal.ZERO); // 正常打卡
+        map.put("cd", BigDecimal.ZERO); // 迟到次数
+        map.put("kg", BigDecimal.ZERO); // 矿工次数
+        map.put("zt", BigDecimal.ZERO); // 早退次数
+        map.put("qk", BigDecimal.ZERO); // 缺卡次数
+        map.put("qj", BigDecimal.ZERO); // 请假次数
+
+        // 查询该员工考勤规则
+        AttendanceEmployeeSettingRespVO respVO = attendanceEmployeeSettingService.getByEmployeeId(dailyInfoList.get(0).getEmployeeId());
+        if (respVO == null) {
+            throw exception(ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS);
+        }
+        LocalTime ruleStartTime = respVO.getStartTime();
+        LocalTime ruleEndTime = respVO.getEndTime();
+        if (ruleStartTime == null || ruleEndTime == null) {
+            throw exception(ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS);
+        }
+        for (AttendanceDailyInfoRespVO dailyInfo : dailyInfoList) {
+            LocalDate date = dailyInfo.getAttendanceDate();
+            LocalTime start = dailyInfo.getWorkStartTime();
+            LocalTime end = dailyInfo.getWorkEndTime();
+
+            boolean isWorkDay = workDays.stream().anyMatch(wd -> wd.getWorkDate().equals(date));
+
+            if (isWorkDay) {
+                AttendanceBusinessDO businessDO = attendanceBusinessService
+                        .selectByDateAndEmployeeId(date, dailyInfo.getEmployeeId());
+                List<AttendanceLeaveDO> leaveDOs = attendanceLeaveService
+                        .selectByDateAndEmployeeId(date, dailyInfo.getEmployeeId());
+
+                if (start == null && end == null) {
+                    handleNoClock(map, businessDO, leaveDOs);
+                } else if (start == null || end == null) {
+                    handleSingleClock(map, start, end, ruleStartTime, ruleEndTime, businessDO, leaveDOs, date);
+                } else {
+                    handleBothClocks(map, start, end, ruleStartTime, ruleEndTime, businessDO, leaveDOs, date);
+                }
+            }
+        }
+
+        return map;
+    }
+
+    // 处理未打卡情况的方法 工作日
+    private void handleNoClock(Map<String, Object> map, AttendanceBusinessDO businessDO, List<AttendanceLeaveDO> leaveDOs) {
+        if (businessDO != null) {
+            map.put("qj", ((BigDecimal) map.get("qj")).add(BigDecimal.ONE));
+        } else if (!leaveDOs.isEmpty()) {
+            double day = calculateLeaveDays(leaveDOs);
+            map.put("qj", ((BigDecimal) map.get("qj")).add(BigDecimal.valueOf(day)));
+            if (day == 0.5) {
+                map.put("qk", ((BigDecimal) map.get("qk")).add(BigDecimal.ONE));
+            }
+        } else {
+            map.put("qk", ((BigDecimal) map.get("qk")).add(new BigDecimal(2)));
+            map.put("kg", ((BigDecimal) map.get("kg")).add(BigDecimal.ONE));
+        }
+    }
+
+    // 处理一次打卡情况的方法
+    private void handleSingleClock(Map<String, Object> map, LocalTime start, LocalTime end,
+                                   LocalTime ruleStartTime, LocalTime ruleEndTime,
+                                   AttendanceBusinessDO businessDO, List<AttendanceLeaveDO> leaveDOs, LocalDate date) {
+        double day = 0.0;
+        if (businessDO != null) {
+            map.put("qj", ((BigDecimal) map.get("qj")).add(new BigDecimal(0.5)));
+        } else if (!leaveDOs.isEmpty()) {
+            day = calculateLeaveDays(leaveDOs);
+            map.put("qj", ((BigDecimal) map.get("qj")).add(BigDecimal.valueOf(day)));
+        } else {
+            map.put("qk", ((BigDecimal) map.get("qk")).add(BigDecimal.ONE));
+        }
+        if (day != 1.0) {
+            if (start != null) {
+                boolean isLate = start.isAfter(ruleStartTime);
+                updateAttendanceCounts(map, isLate, true);
+            } else if (end != null) {
+                boolean isEarly = end.isBefore(ruleEndTime);
+                updateAttendanceCounts(map, isEarly, false);
+            }
+        }
+    }
+
+    // 处理两次打卡情况的方法
+    private void handleBothClocks(Map<String, Object> map, LocalTime start, LocalTime end,
+                                  LocalTime ruleStartTime, LocalTime ruleEndTime,
+                                  AttendanceBusinessDO businessDO, List<AttendanceLeaveDO> leaveDOs, LocalDate date) {
+        boolean isLate = start.isAfter(ruleStartTime);
+        boolean isEarly = end.isBefore(ruleEndTime);
+        updateAttendanceCounts(map, isLate, isEarly);
+        if (businessDO != null) {
+            map.put("qj", ((BigDecimal) map.get("qj")).add(BigDecimal.ONE));
+        } else if (!leaveDOs.isEmpty()) {
+            double day = calculateLeaveDays(leaveDOs);
+            map.put("qj", ((BigDecimal) map.get("qj")).add(BigDecimal.valueOf(day)));
+        }
+    }
+
+    // 计算请假天数的方法
+    private double calculateLeaveDays(List<AttendanceLeaveDO> leaveDOs) {
+        double totalDays = 0.0;
+        for (AttendanceLeaveDO leaveDO : leaveDOs) {
+            totalDays += getLeaveDays(leaveDO.getStartDate(), leaveDO.getEndDate(), leaveDO.getStartTime(), leaveDO.getEndTime());
+        }
+        return totalDays;
+    }
+
+    // 更新考勤计数的方法
+    private void updateAttendanceCounts(Map<String, Object> map, boolean isLate, boolean isEarly) {
+        if (isLate) {
+            map.put("cd", ((BigDecimal) map.get("cd")).add(BigDecimal.ONE));
+            map.put("cq", ((BigDecimal) map.get("cq")).add(BigDecimal.valueOf(0.5)));
+        } else {
+            map.put("zc", ((BigDecimal) map.get("zc")).add(BigDecimal.ONE));
+            map.put("cq", ((BigDecimal) map.get("cq")).add(BigDecimal.valueOf(0.5)));
+        }
+        if (isEarly) {
+            map.put("zt", ((BigDecimal) map.get("zt")).add(BigDecimal.ONE));
+            map.put("cq", ((BigDecimal) map.get("cq")).add(BigDecimal.valueOf(0.5)));
+        } else {
+            map.put("zc", ((BigDecimal) map.get("zc")).add(BigDecimal.ONE));
+            map.put("cq", ((BigDecimal) map.get("cq")).add(BigDecimal.valueOf(0.5)));
+        }
+    }
+
+    // 获取请假天数的方法
+    private Double getLeaveDays(String startDateStr, String endDateStr, String startTime, String endTime) {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date startDate = null;
+        Date endDate = null;
+        try {
+            startDate = sdf.parse(startDateStr);
+            endDate = sdf.parse(endDateStr);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(startDate);
+        Double day = 0.0;
+//        String[] remarks = remark.split(":");
+        Boolean isSameDay = DateUtil.isSameDay(endDate, startDate);
+        long size = ((endDate.getTime() - startDate.getTime()) / 1000 / 24 / 60 / 60) + 1;
+        for (int j = 0; j < size; j++) {
+//            String time =sdf.format(cal.getTime());
+            if (isSameDay) {//请假开始时间和结束时间是同一天
+                if (startTime.equals(endTime)) {
+                    day += 0.5;
+                } else {
+                    day += 1;
+                }
+            } else {
+                if (j == 0) {
+                    if (startTime.equals(endTime)) {
+                        day += 1;
+                    } else {
+                        day += 0.5;
+                    }
+                } else if (j == size - 1) {
+                    if (startTime.equals(endTime)) {
+                        day += 0.5;
+                    } else {
+                        day += 1;
+                    }
+                } else {
+                    day += 1;
+                }
+            }
+            cal.add(Calendar.DATE, 1);
+        }
+        return day;
+    }
+
 }

+ 3 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveService.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.service.leave;
 
+import java.time.LocalDate;
 import java.util.*;
 import cn.iocoder.yudao.module.attendance.controller.admin.leave.vo.*;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.leave.AttendanceLeaveDO;
@@ -53,4 +54,6 @@ public interface AttendanceLeaveService {
      */
     PageResult<AttendanceLeaveDO> getLeavePage(AttendanceLeavePageReqVO pageReqVO);
 
+    List<AttendanceLeaveDO> selectByDateAndEmployeeId(LocalDate date, Long employeeId);
+
 }

+ 9 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveServiceImpl.java

@@ -12,6 +12,10 @@ import cn.iocoder.yudao.module.attendance.dal.mysql.leave.AttendanceLeaveMapper;
 
 import javax.annotation.Resource;
 
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
 
@@ -69,4 +73,9 @@ public class AttendanceLeaveServiceImpl implements AttendanceLeaveService {
         return leaveMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public List<AttendanceLeaveDO> selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return leaveMapper.selectByDateAndEmployeeId(date, employeeId);
+    }
+
 }

+ 72 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/workdaysetting/AttendanceWorkdaySettingService.java

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.attendance.service.workdaysetting;
+
+import java.util.*;
+import cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting.AttendanceWorkdaySettingDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 考勤工作日设置 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceWorkdaySettingService {
+
+    /**
+     * 创建考勤工作日设置
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createWorkdaySetting(@Valid AttendanceWorkdaySettingSaveReqVO createReqVO);
+
+    /**
+     * 更新考勤工作日设置
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateWorkdaySetting(@Valid AttendanceWorkdaySettingSaveReqVO updateReqVO);
+
+    /**
+     * 删除考勤工作日设置
+     *
+     * @param id 编号
+     */
+    void deleteWorkdaySetting(Long id);
+
+    /**
+     * 获得考勤工作日设置
+     *
+     * @param id 编号
+     * @return 考勤工作日设置
+     */
+    AttendanceWorkdaySettingDO getWorkdaySetting(Long id);
+
+    /**
+     * 获得考勤工作日设置分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 考勤工作日设置分页
+     */
+    PageResult<AttendanceWorkdaySettingDO> getWorkdaySettingPage(AttendanceWorkdaySettingPageReqVO pageReqVO);
+
+    /**
+     * 批量设置考勤工作日
+     *
+     * @param dates
+     * @return
+     */
+    Boolean batchInsert(String[] dates);
+
+    /**
+     * 获得考勤工作日数据
+     *
+     * @param month
+     * @return
+     */
+    List<AttendanceWorkdaySettingDO> getWorkdays(String month);
+
+}

+ 149 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/workdaysetting/AttendanceWorkdaySettingServiceImpl.java

@@ -0,0 +1,149 @@
+package cn.iocoder.yudao.module.attendance.service.workdaysetting;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting.AttendanceWorkdaySettingDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.attendance.dal.mysql.workdaysetting.AttendanceWorkdaySettingMapper;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
+
+/**
+ * 考勤工作日设置 Service 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+@Validated
+public class AttendanceWorkdaySettingServiceImpl implements AttendanceWorkdaySettingService {
+
+    @Resource
+    private AttendanceWorkdaySettingMapper workdaySettingMapper;
+
+    @Override
+    public Long createWorkdaySetting(AttendanceWorkdaySettingSaveReqVO createReqVO) {
+        // 插入
+        AttendanceWorkdaySettingDO workdaySetting = BeanUtils.toBean(createReqVO, AttendanceWorkdaySettingDO.class);
+        workdaySettingMapper.insert(workdaySetting);
+        // 返回
+        return workdaySetting.getId();
+    }
+
+    @Override
+    public void updateWorkdaySetting(AttendanceWorkdaySettingSaveReqVO updateReqVO) {
+        // 校验存在
+        validateWorkdaySettingExists(updateReqVO.getId());
+        // 更新
+        AttendanceWorkdaySettingDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceWorkdaySettingDO.class);
+        workdaySettingMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteWorkdaySetting(Long id) {
+        // 校验存在
+        validateWorkdaySettingExists(id);
+        // 删除
+        workdaySettingMapper.deleteById(id);
+    }
+
+    private void validateWorkdaySettingExists(Long id) {
+        if (workdaySettingMapper.selectById(id) == null) {
+            throw exception(WORKDAY_SETTING_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttendanceWorkdaySettingDO getWorkdaySetting(Long id) {
+        return workdaySettingMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttendanceWorkdaySettingDO> getWorkdaySettingPage(AttendanceWorkdaySettingPageReqVO pageReqVO) {
+        return workdaySettingMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public Boolean batchInsert(String[] dates) {
+        if (dates == null || dates.length == 0) {
+            return false; // 如果输入为空,直接返回false
+        }
+
+        List<AttendanceWorkdaySettingDO> workingDaysList = new ArrayList<>();
+        String workMonth = dates[0].substring(0, 7); // 假设日期格式是YYYY-MM-DD,这里只取前7位作为月份
+
+        // 清理操作,先删除该月份的所有工作日设置
+        workdaySettingMapper.deleteByMonth(workMonth);
+
+        // 遍历日期数组,为每个日期创建设置对象并添加到列表中
+        for (String str : dates) {
+            AttendanceWorkdaySettingDO settingDO = new AttendanceWorkdaySettingDO();
+            settingDO.setWorkMonth(workMonth);
+            settingDO.setWorkDate(str);
+            workingDaysList.add(settingDO);
+        }
+
+        // 批量插入到数据库
+        return workdaySettingMapper.insertBatch(workingDaysList);
+    }
+
+    @Override
+    public List<AttendanceWorkdaySettingDO> getWorkdays(String workMonth) {
+        List<AttendanceWorkdaySettingDO> workingDaysList = workdaySettingMapper.getWorkdays(workMonth);
+        if (workingDaysList.size() == 0) {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            Date date = null;
+            try {
+                date = sdf.parse(workMonth + "-01");
+            } catch (ParseException e) {
+                throw new RuntimeException(e);
+            }
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(date);
+            Integer month = cal.get(Calendar.MONTH) + 1;
+            while (month == cal.get(Calendar.MONTH) + 1) {
+                if(this.isWorkingDay(sdf.format(cal.getTime()))==0){
+                    AttendanceWorkdaySettingDO settingDO = new AttendanceWorkdaySettingDO();
+                    settingDO.setWorkMonth(workMonth);
+                    settingDO.setWorkDate(sdf.format(cal.getTime()));
+                    workingDaysList.add(settingDO);
+
+                }
+                cal.add(Calendar.DATE, 1);
+            }
+            workdaySettingMapper.insertBatch(workingDaysList);
+        }
+        return workingDaysList;
+    }
+
+    private int isWorkingDay(String day) {
+        try {
+            DateFormat format1 = new SimpleDateFormat("yyyy-MM-dd");
+            Date bdate = format1.parse(day);
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(bdate);
+            if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
+                return 1;
+            } else {
+                return 0;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return 0;
+    }
+
+
+}

+ 17 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/employeesetting/AttendanceEmployeeSettingMapper.xml

@@ -8,5 +8,22 @@
         代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
         文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
      -->
+    <!-- 通过员工ID获得考勤员工设置 -->
+    <select id="getByEmployeeId" resultType="cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO">
+        SELECT
+            aes.employee_id,
+            aes.name,
+            asm.shift_name,
+            asm.start_time,
+            asm.end_time
+        FROM
+            attendance_employee_setting aes
+            LEFT JOIN attendance_scheduling_manage asm ON asm.id = aes.scheduling_id
+        WHERE
+            aes.deleted = 0 AND aes.status = 0
+            AND asm.deleted = 0 AND asm.status = 0
+            AND aes.employee_id = #{employeeId}
+        LIMIT 1
+    </select>
 
 </mapper>

+ 24 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/info/AttendanceInfoMapper.xml

@@ -8,5 +8,29 @@
         代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
         文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
      -->
+    <!-- 分页查询每日考勤信息 -->
+    <select id="getDailyInfoPage" resultType="cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceDailyInfoRespVO">
+        SELECT
+            ai.employee_id,
+            ai.employee_name,
+            ai.employee_phone,
+            ai.dept_name,
+            ai.attendance_date,
+            ai.work_start_time,
+            ai.work_end_time,
+            ai.late_time,
+            ai.leave_early_time
+        FROM
+        attendance_info ai
+        WHERE
+            ai.attendance_date BETWEEN #{reqVO.attendanceStartDate} AND #{reqVO.attendanceEndDate}
+        GROUP BY
+            ai.employee_id
+        ORDER BY
+            ai.attendance_date,ai.dept_name
+        <if test="reqVO.pageSize != null and reqVO.pageNo != null">
+            LIMIT #{reqVO.pageSize} OFFSET #{reqVO.pageNo * reqVO.pageSize - reqVO.pageSize}
+        </if>
+    </select>
 
 </mapper>

+ 12 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/workdaysetting/AttendanceWorkdaySettingMapper.xml

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

+ 1 - 1
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/EmployeeInfoController.java

@@ -35,7 +35,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
 
 @Tag(name = "管理后台 - 员工信息")
 @RestController
-@RequestMapping("/presonnel/employee")
+@RequestMapping("/personnel/employee")
 @Validated
 public class EmployeeInfoController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/EmployeeInfoHistoryController.java

@@ -34,7 +34,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
 
 @Tag(name = "管理后台 - 员工信息历史")
 @RestController
-@RequestMapping("/presonnel/employee/history")
+@RequestMapping("/personnel/employee/history")
 @Validated
 public class EmployeeInfoHistoryController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/annualleave/HolidayAnnualLeaveController.java

@@ -21,7 +21,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 员工假务信息")
 @RestController
-@RequestMapping("/presonnel/holiday/annual-leave")
+@RequestMapping("/personnel/holiday/annual-leave")
 @Validated
 public class HolidayAnnualLeaveController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/RelationsContractController.java

@@ -34,7 +34,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
 
 @Tag(name = "管理后台 - 员工合同信息")
 @RestController
-@RequestMapping("/presonnel/relations/contract")
+@RequestMapping("/personnel/relations/contract")
 @Validated
 public class RelationsContractController {
 

+ 5 - 2
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractPageReqVO.java

@@ -19,8 +19,8 @@ public class RelationsContractPageReqVO extends PageParam {
     @Schema(description = "业务UUID", example = "17794")
     private String contractId;
 
-    @Schema(description = "姓名", example = "芋艿")
-    private String name;
+    @Schema(description = "员工姓名", example = "芋艿")
+    private String employeeName;
 
     @Schema(description = "部门ID", example = "20570")
     private Long deptId;
@@ -37,6 +37,9 @@ public class RelationsContractPageReqVO extends PageParam {
     @Schema(description = "员工编号")
     private String employeeNumber;
 
+    @Schema(description = "员工手机号")
+    private String employeePhone;
+
     @Schema(description = "合同开始日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDate[] contractStartDate;

+ 7 - 3
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractRespVO.java

@@ -23,9 +23,9 @@ public class RelationsContractRespVO {
     @ExcelProperty("业务UUID")
     private String contractId;
 
-    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
-    @ExcelProperty("姓名")
-    private String name;
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("员工姓名")
+    private String employeeName;
 
     @Schema(description = "部门ID", example = "20570")
     @ExcelProperty("部门ID")
@@ -47,6 +47,10 @@ public class RelationsContractRespVO {
     @ExcelProperty("员工编号")
     private String employeeNumber;
 
+    @Schema(description = "员工手机号")
+    @ExcelProperty("员工手机号")
+    private String employeePhone;
+
     @Schema(description = "合同开始日期", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("合同开始日期")
     private LocalDate contractStartDate;

+ 6 - 3
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractSaveReqVO.java

@@ -19,9 +19,9 @@ public class RelationsContractSaveReqVO {
     @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17794")
     private String contractId;
 
-    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
-    @NotEmpty(message = "姓名不能为空")
-    private String name;
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "员工姓名不能为空")
+    private String employeeName;
 
     @Schema(description = "部门ID", example = "20570")
     private Long deptId;
@@ -38,6 +38,9 @@ public class RelationsContractSaveReqVO {
     @Schema(description = "员工编号")
     private String employeeNumber;
 
+    @Schema(description = "员工手机号")
+    private String employeePhone;
+
     @Schema(description = "合同开始日期", requiredMode = Schema.RequiredMode.REQUIRED)
     @NotNull(message = "合同开始日期不能为空")
     private LocalDate contractStartDate;

+ 1 - 1
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/RelationsConversionController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 转正信息")
 @RestController
-@RequestMapping("/presonnel/relations/conversion")
+@RequestMapping("/personnel/relations/conversion")
 @Validated
 public class RelationsConversionController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/RelationsEntryController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 入职信息")
 @RestController
-@RequestMapping("/presonnel/relations/entry")
+@RequestMapping("/personnel/relations/entry")
 @Validated
 public class RelationsEntryController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/RelationsRenewController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 续签信息")
 @RestController
-@RequestMapping("/presonnel/relations/renew")
+@RequestMapping("/personnel/relations/renew")
 @Validated
 public class RelationsRenewController {
 

+ 1 - 1
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/RelationsTurnoverController.java

@@ -31,7 +31,7 @@ import javax.validation.Valid;
 
 @Tag(name = "管理后台 - 离职信息")
 @RestController
-@RequestMapping("/presonnel/relations/turnover")
+@RequestMapping("/personnel/relations/turnover")
 @Validated
 public class RelationsTurnoverController {
 

+ 8 - 4
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/dal/dataobject/contract/RelationsContractDO.java

@@ -15,8 +15,8 @@ import javax.validation.constraints.NotNull;
  *
  * @author zhaopq
  */
-@TableName("relations_contract_info")
-@KeySequence("relations_contract_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@TableName("relations_contract")
+@KeySequence("relations_contract_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
@@ -35,9 +35,9 @@ public class RelationsContractDO extends BaseDO {
      */
     private String contractId;
     /**
-     * 姓名
+     * 员工姓名
      */
-    private String name;
+    private String employeeName;
     /**
      * 部门ID
      */
@@ -58,6 +58,10 @@ public class RelationsContractDO extends BaseDO {
      * 员工编号
      */
     private String employeeNumber;
+    /**
+     * 员工手机号
+     */
+    private String employeePhone;
     /**
      * 合同开始日期
      */

+ 3 - 2
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/dal/mysql/contract/RelationsContractMapper.java

@@ -22,12 +22,13 @@ public interface RelationsContractMapper extends BaseMapperX<RelationsContractDO
     default PageResult<RelationsContractDO> selectPage(RelationsContractPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<RelationsContractDO>()
                 .eqIfPresent(RelationsContractDO::getContractId, reqVO.getContractId())
-                .likeIfPresent(RelationsContractDO::getName, reqVO.getName())
+                .likeIfPresent(RelationsContractDO::getEmployeeName, reqVO.getEmployeeName())
                 .eqIfPresent(RelationsContractDO::getDeptId, reqVO.getDeptId())
                 .likeIfPresent(RelationsContractDO::getDeptName, reqVO.getDeptName())
                 .eqIfPresent(RelationsContractDO::getPostId, reqVO.getPostId())
                 .eqIfPresent(RelationsContractDO::getPosition, reqVO.getPosition())
-                .eqIfPresent(RelationsContractDO::getEmployeeNumber, reqVO.getEmployeeNumber())
+                .likeIfPresent(RelationsContractDO::getEmployeeNumber, reqVO.getEmployeeNumber())
+                .likeIfPresent(RelationsContractDO::getEmployeePhone, reqVO.getEmployeePhone())
                 .betweenIfPresent(RelationsContractDO::getContractStartDate, reqVO.getContractStartDate())
                 .betweenIfPresent(RelationsContractDO::getContractEndDate, reqVO.getContractEndDate())
                 .eqIfPresent(RelationsContractDO::getContractDeadline, reqVO.getContractDeadline())

+ 13 - 0
yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostPageReqVO;
 import cn.iocoder.yudao.module.system.controller.admin.dept.vo.post.PostSaveReqVO;
 import cn.iocoder.yudao.module.system.dal.dataobject.dept.PostDO;
@@ -34,6 +35,7 @@ public class PostServiceImpl implements PostService {
     private PostMapper postMapper;
 
     @Override
+    @TenantIgnore
     public Long createPost(PostSaveReqVO createReqVO) {
         // 校验正确性
         validatePostForCreateOrUpdate(null, createReqVO.getName(), createReqVO.getCode());
@@ -45,6 +47,7 @@ public class PostServiceImpl implements PostService {
     }
 
     @Override
+    @TenantIgnore
     public void updatePost(PostSaveReqVO updateReqVO) {
         // 校验正确性
         validatePostForCreateOrUpdate(updateReqVO.getId(), updateReqVO.getName(), updateReqVO.getCode());
@@ -55,6 +58,7 @@ public class PostServiceImpl implements PostService {
     }
 
     @Override
+    @TenantIgnore
     public void deletePost(Long id) {
         // 校验是否存在
         validatePostExists(id);
@@ -62,6 +66,7 @@ public class PostServiceImpl implements PostService {
         postMapper.deleteById(id);
     }
 
+    @TenantIgnore
     private void validatePostForCreateOrUpdate(Long id, String name, String code) {
         // 校验自己存在
         validatePostExists(id);
@@ -71,6 +76,7 @@ public class PostServiceImpl implements PostService {
         validatePostCodeUnique(id, code);
     }
 
+    @TenantIgnore
     private void validatePostNameUnique(Long id, String name) {
         PostDO post = postMapper.selectByName(name);
         if (post == null) {
@@ -85,6 +91,7 @@ public class PostServiceImpl implements PostService {
         }
     }
 
+    @TenantIgnore
     private void validatePostCodeUnique(Long id, String code) {
         PostDO post = postMapper.selectByCode(code);
         if (post == null) {
@@ -99,6 +106,7 @@ public class PostServiceImpl implements PostService {
         }
     }
 
+    @TenantIgnore
     private void validatePostExists(Long id) {
         if (id == null) {
             return;
@@ -109,6 +117,7 @@ public class PostServiceImpl implements PostService {
     }
 
     @Override
+    @TenantIgnore
     public List<PostDO> getPostList(Collection<Long> ids) {
         if (CollUtil.isEmpty(ids)) {
             return Collections.emptyList();
@@ -117,21 +126,25 @@ public class PostServiceImpl implements PostService {
     }
 
     @Override
+    @TenantIgnore
     public List<PostDO> getPostList(Collection<Long> ids, Collection<Integer> statuses) {
         return postMapper.selectList(ids, statuses);
     }
 
     @Override
+    @TenantIgnore
     public PageResult<PostDO> getPostPage(PostPageReqVO reqVO) {
         return postMapper.selectPage(reqVO);
     }
 
     @Override
+    @TenantIgnore
     public PostDO getPost(Long id) {
         return postMapper.selectById(id);
     }
 
     @Override
+    @TenantIgnore
     public void validatePostList(Collection<Long> ids) {
         if (CollUtil.isEmpty(ids)) {
             return;