Przeglądaj źródła

员工考勤部分

zhaopeiqing 7 miesięcy temu
rodzic
commit
d1f3eaa28f
52 zmienionych plików z 2458 dodań i 2 usunięć
  1. 4 0
      yudao-module-personnel/pom.xml
  2. 34 0
      yudao-module-personnel/yudao-module-attendance-api/pom.xml
  3. 11 0
      yudao-module-personnel/yudao-module-attendance-api/src/main/java/cn/iocoder/yudao/module/attendance/api/AttendanceApi.java
  4. 17 0
      yudao-module-personnel/yudao-module-attendance-api/src/main/java/cn/iocoder/yudao/module/attendance/enums/ErrorCodeConstants.java
  5. 96 0
      yudao-module-personnel/yudao-module-attendance-biz/pom.xml
  6. 15 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/api/schedulingmanage/AttendanceApiImpl.java
  7. 98 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/AttendanceEmployeeSettingController.java
  8. 46 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingPageReqVO.java
  9. 56 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingRespVO.java
  10. 45 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingSaveReqVO.java
  11. 97 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/AttendanceInfoController.java
  12. 73 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoPageReqVO.java
  13. 84 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoRespVO.java
  14. 67 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoSaveReqVO.java
  15. 95 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/AttendanceSchedulingManageController.java
  16. 41 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManagePageReqVO.java
  17. 46 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageRespVO.java
  18. 38 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageSaveReqVO.java
  19. 63 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/employeesetting/AttendanceEmployeeSettingDO.java
  20. 92 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/info/AttendanceInfoDO.java
  21. 50 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/schedulingmanage/AttendanceSchedulingManageDO.java
  22. 34 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/employeesetting/AttendanceEmployeeSettingMapper.java
  23. 40 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/info/AttendanceInfoMapper.java
  24. 31 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/schedulingmanage/AttendanceSchedulingManageMapper.java
  25. 7 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/package-info.java
  26. 56 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingService.java
  27. 74 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingServiceImpl.java
  28. 57 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoService.java
  29. 75 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoServiceImpl.java
  30. 55 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/schedulingmanage/AttendanceSchedulingManageService.java
  31. 75 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/schedulingmanage/AttendanceSchedulingManageServiceImpl.java
  32. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/employeesetting/AttendanceEmployeeSettingMapper.xml
  33. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/info/AttendanceInfoMapper.xml
  34. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/schedulingmanage/AttendanceSchedulingManageMapper.xml
  35. 0 1
      yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/enums/ErrorCodeConstants.java
  36. 1 1
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoSaveReqVO.java
  37. 34 0
      yudao-module-personnel/yudao-module-holiday-api/pom.xml
  38. 11 0
      yudao-module-personnel/yudao-module-holiday-api/src/main/java/cn/iocoder/yudao/module/holiday/api/HolidayApi.java
  39. 16 0
      yudao-module-personnel/yudao-module-holiday-api/src/main/java/cn/iocoder/yudao/module/holiday/enums/ErrorCodeConstants.java
  40. 96 0
      yudao-module-personnel/yudao-module-holiday-biz/pom.xml
  41. 15 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/api/contractinfo/RelationsApiImpl.java
  42. 98 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/RelationsContractInfoController.java
  43. 64 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/vo/RelationsContractInfoPageReqVO.java
  44. 78 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/vo/RelationsContractInfoRespVO.java
  45. 62 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/vo/RelationsContractInfoSaveReqVO.java
  46. 85 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/dal/dataobject/contractinfo/RelationsContractInfoDO.java
  47. 37 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/dal/mysql/contractinfo/RelationsContractInfoMapper.java
  48. 7 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/package-info.java
  49. 56 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/service/contractinfo/RelationsContractInfoService.java
  50. 71 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/service/contractinfo/RelationsContractInfoServiceImpl.java
  51. 12 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/resources/mapper/contractinfo/RelationsContractInfoMapper.xml
  52. 7 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/package-info.java

+ 4 - 0
yudao-module-personnel/pom.xml

@@ -22,6 +22,10 @@
         <module>yudao-module-employee-biz</module>
         <module>yudao-module-relations-api</module>
         <module>yudao-module-relations-biz</module>
+        <module>yudao-module-holiday-api</module>
+        <module>yudao-module-holiday-biz</module>
+        <module>yudao-module-attendance-api</module>
+        <module>yudao-module-attendance-biz</module>
     </modules>
 
 </project>

+ 34 - 0
yudao-module-personnel/yudao-module-attendance-api/pom.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.iocoder.boot</groupId>
+        <artifactId>yudao-module-personnel</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yudao-module-attendance-api</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        attendance 模块 API,暴露给其它模块调用
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-common</artifactId>
+        </dependency>
+
+        <!-- 参数校验 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+</project>

+ 11 - 0
yudao-module-personnel/yudao-module-attendance-api/src/main/java/cn/iocoder/yudao/module/attendance/api/AttendanceApi.java

@@ -0,0 +1,11 @@
+package cn.iocoder.yudao.module.attendance.api;
+
+
+/**
+ * 员工考勤 API 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceApi {
+
+}

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

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.attendance.enums;
+
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * Attendance 错误码枚举类
+ *
+ * attendance 系统,使用 1-013-000-000 段
+ */
+public interface ErrorCodeConstants {
+
+    // ========== 员工考勤模块 1-013-000-000 ==========
+    ErrorCode ATTENDANCE_SCHEDULING_MANAGE_NOT_EXISTS = new ErrorCode(1_013_000_000, "考勤排班管理不存在");
+    ErrorCode ATTENDANCE_INFO_NOT_EXISTS = new ErrorCode(1_013_000_001, "考勤信息不存在");
+    ErrorCode ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS = new ErrorCode(1_013_000_002, "考勤员工设置不存在");
+}

+ 96 - 0
yudao-module-personnel/yudao-module-attendance-biz/pom.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>cn.iocoder.boot</groupId>
+        <artifactId>yudao-module-personnel</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>yudao-module-attendance-biz</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        attendance 模块,主要实现员工考勤相关功能
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-attendance-api</artifactId>
+            <version>${revision}</version>
+        </dependency>
+
+        <!-- 业务组件 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-biz-ip</artifactId>
+        </dependency>
+
+        <!-- Web 相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <!-- DB 相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-redis</artifactId>
+        </dependency>
+
+        <!-- Job 定时任务相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-job</artifactId>
+        </dependency>
+
+        <!-- 消息队列相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-mq</artifactId>
+        </dependency>
+
+        <!-- Test 测试相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- 工具类相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-excel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+
+        <!-- 三方云服务相关 -->
+
+    </dependencies>
+
+</project>

+ 15 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/api/schedulingmanage/AttendanceApiImpl.java

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.attendance.api.schedulingmanage;
+
+import cn.iocoder.yudao.module.attendance.api.AttendanceApi;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 员工考勤 API 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+public class AttendanceApiImpl implements AttendanceApi {
+
+}

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

@@ -0,0 +1,98 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting;
+
+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;
+import cn.iocoder.yudao.module.attendance.service.employeesetting.AttendanceEmployeeSettingService;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+
+@Tag(name = "管理后台 - 考勤员工设置")
+@RestController
+@RequestMapping("/attendance/employee-setting")
+@Validated
+public class AttendanceEmployeeSettingController {
+
+    @Resource
+    private AttendanceEmployeeSettingService employeeSettingService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建考勤员工设置")
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:create')")
+    public CommonResult<Long> createEmployeeSetting(@Valid @RequestBody AttendanceEmployeeSettingSaveReqVO createReqVO) {
+        return success(employeeSettingService.createEmployeeSetting(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新考勤员工设置")
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:update')")
+    public CommonResult<Boolean> updateEmployeeSetting(@Valid @RequestBody AttendanceEmployeeSettingSaveReqVO updateReqVO) {
+        employeeSettingService.updateEmployeeSetting(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除考勤员工设置")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:delete')")
+    public CommonResult<Boolean> deleteEmployeeSetting(@RequestParam("id") Long id) {
+        employeeSettingService.deleteEmployeeSetting(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得考勤员工设置")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:query')")
+    public CommonResult<AttendanceEmployeeSettingRespVO> getEmployeeSetting(@RequestParam("id") Long id) {
+        AttendanceEmployeeSettingDO employeeSetting = employeeSettingService.getEmployeeSetting(id);
+        return success(BeanUtils.toBean(employeeSetting, AttendanceEmployeeSettingRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得考勤员工设置分页")
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:query')")
+    public CommonResult<PageResult<AttendanceEmployeeSettingRespVO>> getEmployeeSettingPage(@Valid AttendanceEmployeeSettingPageReqVO pageReqVO) {
+        PageResult<AttendanceEmployeeSettingDO> pageResult = employeeSettingService.getEmployeeSettingPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttendanceEmployeeSettingRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出考勤员工设置 Excel")
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportEmployeeSettingExcel(@Valid AttendanceEmployeeSettingPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceEmployeeSettingDO> list = employeeSettingService.getEmployeeSettingPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "考勤员工设置.xls", "数据", AttendanceEmployeeSettingRespVO.class,
+                        BeanUtils.toBean(list, AttendanceEmployeeSettingRespVO.class));
+    }
+
+}

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

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.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 AttendanceEmployeeSettingPageReqVO extends PageParam {
+
+    @Schema(description = "员工ID", example = "9532")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", example = "芋艿")
+    private String name;
+
+    @Schema(description = "部门ID", example = "2777")
+    private Long deptId;
+
+    @Schema(description = "排班ID", example = "23897")
+    private Long schedulingId;
+
+    @Schema(description = "考勤地点")
+    private String attendanceLocation;
+
+    @Schema(description = "手机号")
+    private String phoneNumber;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

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

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.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 AttendanceEmployeeSettingRespVO {
+
+    @Schema(description = "管理ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7218")
+    @ExcelProperty("管理ID")
+    private Long id;
+
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9532")
+    @ExcelProperty("员工ID")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("员工姓名")
+    private String name;
+
+    @Schema(description = "部门ID", example = "2777")
+    @ExcelProperty("部门ID")
+    private Long deptId;
+
+    @Schema(description = "排班ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23897")
+    @ExcelProperty("排班ID")
+    private Long schedulingId;
+
+    @Schema(description = "考勤地点")
+    @ExcelProperty("考勤地点")
+    private String attendanceLocation;
+
+    @Schema(description = "手机号")
+    @ExcelProperty("手机号")
+    private String phoneNumber;
+
+    @Schema(description = "电子邮箱")
+    @ExcelProperty("电子邮箱")
+    private String email;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

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

@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 考勤员工设置新增/修改 Request VO")
+@Data
+public class AttendanceEmployeeSettingSaveReqVO {
+
+    @Schema(description = "管理ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "7218")
+    private Long id;
+
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "9532")
+    @NotNull(message = "员工ID不能为空")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "员工姓名不能为空")
+    private String name;
+
+    @Schema(description = "部门ID", example = "2777")
+    private Long deptId;
+
+    @Schema(description = "排班ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23897")
+    @NotNull(message = "排班ID不能为空")
+    private Long schedulingId;
+
+    @Schema(description = "考勤地点")
+    private String attendanceLocation;
+
+    @Schema(description = "手机号")
+    private String phoneNumber;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+}

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

@@ -0,0 +1,97 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info;
+
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoRespVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoSaveReqVO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.service.info.AttendanceInfoService;
+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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+@Tag(name = "管理后台 - 考勤信息")
+@RestController
+@RequestMapping("/attendance/info")
+@Validated
+public class AttendanceInfoController {
+
+    @Resource
+    private AttendanceInfoService infoService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建考勤信息")
+    @PreAuthorize("@ss.hasPermission('attendance:info:create')")
+    public CommonResult<Long> createInfo(@Valid @RequestBody AttendanceInfoSaveReqVO createReqVO) {
+        return success(infoService.createInfo(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新考勤信息")
+    @PreAuthorize("@ss.hasPermission('attendance:info:update')")
+    public CommonResult<Boolean> updateInfo(@Valid @RequestBody AttendanceInfoSaveReqVO updateReqVO) {
+        infoService.updateInfo(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除考勤信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('attendance:info:delete')")
+    public CommonResult<Boolean> deleteInfo(@RequestParam("id") Long id) {
+        infoService.deleteInfo(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得考勤信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('attendance:info:query')")
+    public CommonResult<AttendanceInfoRespVO> getInfo(@RequestParam("id") Long id) {
+        AttendanceInfoDO info = infoService.getInfo(id);
+        return success(BeanUtils.toBean(info, AttendanceInfoRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得考勤信息分页")
+    @PreAuthorize("@ss.hasPermission('attendance:info:query')")
+    public CommonResult<PageResult<AttendanceInfoRespVO>> getInfoPage(@Valid AttendanceInfoPageReqVO pageReqVO) {
+        PageResult<AttendanceInfoDO> pageResult = infoService.getInfoPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttendanceInfoRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出考勤信息 Excel")
+    @PreAuthorize("@ss.hasPermission('attendance:info:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportInfoExcel(@Valid AttendanceInfoPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceInfoDO> list = infoService.getInfoPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "考勤信息.xls", "数据", AttendanceInfoRespVO.class,
+                        BeanUtils.toBean(list, AttendanceInfoRespVO.class));
+    }
+
+}

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

@@ -0,0 +1,73 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import lombok.*;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+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 AttendanceInfoPageReqVO extends PageParam {
+
+    @Schema(description = "员工ID", example = "6960")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", example = "王五")
+    private String name;
+
+    @Schema(description = "部门ID", example = "13463")
+    private Long deptId;
+
+    @Schema(description = "考勤日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] attendanceDate;
+
+    @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 = "迟到时间(如有)")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] lateTime;
+
+    @Schema(description = "早退时间(如有)")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] leaveEarlyTime;
+
+    @Schema(description = "加班时长(小时)")
+    private BigDecimal overtimeDuration;
+
+    @Schema(description = "请假类型", example = "2")
+    private String leaveType;
+
+    @Schema(description = "请假时长(小时或天数)")
+    private BigDecimal leaveDuration;
+
+    @Schema(description = "考勤状态", example = "1")
+    private String attendanceStatus;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

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

@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 考勤信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AttendanceInfoRespVO {
+
+    @Schema(description = "考勤ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14247")
+    @ExcelProperty("考勤ID")
+    private Long id;
+
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6960")
+    @ExcelProperty("员工ID")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @ExcelProperty("员工姓名")
+    private String name;
+
+    @Schema(description = "部门ID", example = "13463")
+    @ExcelProperty("部门ID")
+    private Long deptId;
+
+    @Schema(description = "考勤日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤日期")
+    private LocalDate attendanceDate;
+
+    @Schema(description = "上班时间")
+    @ExcelProperty("上班时间")
+    private LocalTime workStartTime;
+
+    @Schema(description = "下班时间")
+    @ExcelProperty("下班时间")
+    private LocalTime workEndTime;
+
+    @Schema(description = "迟到时间(如有)")
+    @ExcelProperty("迟到时间(如有)")
+    private LocalTime lateTime;
+
+    @Schema(description = "早退时间(如有)")
+    @ExcelProperty("早退时间(如有)")
+    private LocalTime leaveEarlyTime;
+
+    @Schema(description = "加班时长(小时)")
+    @ExcelProperty("加班时长(小时)")
+    private BigDecimal overtimeDuration;
+
+    @Schema(description = "请假类型", example = "2")
+    @ExcelProperty("请假类型")
+    private String leaveType;
+
+    @Schema(description = "请假时长(小时或天数)")
+    @ExcelProperty("请假时长(小时或天数)")
+    private BigDecimal leaveDuration;
+
+    @Schema(description = "考勤状态", example = "1")
+    @ExcelProperty("考勤状态")
+    private String attendanceStatus;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

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

@@ -0,0 +1,67 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.*;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 考勤信息新增/修改 Request VO")
+@Data
+public class AttendanceInfoSaveReqVO {
+
+    @Schema(description = "考勤ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14247")
+    private Long id;
+
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6960")
+    @NotNull(message = "员工ID不能为空")
+    private Long employeeId;
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    @NotEmpty(message = "员工姓名不能为空")
+    private String name;
+
+    @Schema(description = "部门ID", example = "13463")
+    private Long deptId;
+
+    @Schema(description = "考勤日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "考勤日期不能为空")
+    private LocalDate attendanceDate;
+
+    @Schema(description = "上班时间")
+    private LocalTime workStartTime;
+
+    @Schema(description = "下班时间")
+    private LocalTime workEndTime;
+
+    @Schema(description = "迟到时间(如有)")
+    private LocalTime lateTime;
+
+    @Schema(description = "早退时间(如有)")
+    private LocalTime leaveEarlyTime;
+
+    @Schema(description = "加班时长(小时)")
+    private BigDecimal overtimeDuration;
+
+    @Schema(description = "请假类型", example = "2")
+    private String leaveType;
+
+    @Schema(description = "请假时长(小时或天数)")
+    private BigDecimal leaveDuration;
+
+    @Schema(description = "考勤状态", example = "1")
+    private String attendanceStatus;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+}

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

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage;
+
+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.schedulingmanage.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.schedulingmanage.AttendanceSchedulingManageDO;
+import cn.iocoder.yudao.module.attendance.service.schedulingmanage.AttendanceSchedulingManageService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 考勤排班管理")
+@RestController
+@RequestMapping("/attendance/scheduling-manage")
+@Validated
+public class AttendanceSchedulingManageController {
+
+    @Resource
+    private AttendanceSchedulingManageService schedulingManageService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建考勤排班管理")
+    @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:create')")
+    public CommonResult<Long> createSchedulingManage(@Valid @RequestBody AttendanceSchedulingManageSaveReqVO createReqVO) {
+        return success(schedulingManageService.createSchedulingManage(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新考勤排班管理")
+    @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:update')")
+    public CommonResult<Boolean> updateSchedulingManage(@Valid @RequestBody AttendanceSchedulingManageSaveReqVO updateReqVO) {
+        schedulingManageService.updateSchedulingManage(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除考勤排班管理")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:delete')")
+    public CommonResult<Boolean> deleteSchedulingManage(@RequestParam("id") Long id) {
+        schedulingManageService.deleteSchedulingManage(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得考勤排班管理")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:query')")
+    public CommonResult<AttendanceSchedulingManageRespVO> getSchedulingManage(@RequestParam("id") Long id) {
+        AttendanceSchedulingManageDO schedulingManage = schedulingManageService.getSchedulingManage(id);
+        return success(BeanUtils.toBean(schedulingManage, AttendanceSchedulingManageRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得考勤排班管理分页")
+    @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:query')")
+    public CommonResult<PageResult<AttendanceSchedulingManageRespVO>> getSchedulingManagePage(@Valid AttendanceSchedulingManagePageReqVO pageReqVO) {
+        PageResult<AttendanceSchedulingManageDO> pageResult = schedulingManageService.getSchedulingManagePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttendanceSchedulingManageRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出考勤排班管理 Excel")
+    @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportSchedulingManageExcel(@Valid AttendanceSchedulingManagePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceSchedulingManageDO> list = schedulingManageService.getSchedulingManagePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "考勤排班管理.xls", "数据", AttendanceSchedulingManageRespVO.class,
+                        BeanUtils.toBean(list, AttendanceSchedulingManageRespVO.class));
+    }
+
+}

+ 41 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManagePageReqVO.java

@@ -0,0 +1,41 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo;
+
+import lombok.*;
+
+import java.time.LocalTime;
+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 AttendanceSchedulingManagePageReqVO extends PageParam {
+
+    @Schema(description = "班次名称,如早班、中班、晚班等", example = "张三")
+    private String shiftName;
+
+    @Schema(description = "上班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] startTime;
+
+    @Schema(description = "下班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] endTime;
+
+    @Schema(description = "备注信息")
+    private String remarks;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+}

+ 46 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageRespVO.java

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.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;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 考勤排班管理 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AttendanceSchedulingManageRespVO {
+
+    @Schema(description = "排班ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21430")
+    @ExcelProperty("排班ID")
+    private Long id;
+
+    @Schema(description = "班次名称,如早班、中班、晚班等", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+    @ExcelProperty("班次名称,如早班、中班、晚班等")
+    private String shiftName;
+
+    @Schema(description = "上班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("上班时间")
+    private LocalTime startTime;
+
+    @Schema(description = "下班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("下班时间")
+    private LocalTime endTime;
+
+    @Schema(description = "备注信息")
+    @ExcelProperty("备注信息")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+}

+ 38 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageSaveReqVO.java

@@ -0,0 +1,38 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalTime;
+import java.util.*;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 考勤排班管理新增/修改 Request VO")
+@Data
+public class AttendanceSchedulingManageSaveReqVO {
+
+    @Schema(description = "排班ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21430")
+    private Long id;
+
+    @Schema(description = "班次名称,如早班、中班、晚班等", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
+    @NotEmpty(message = "班次名称,如早班、中班、晚班等不能为空")
+    private String shiftName;
+
+    @Schema(description = "上班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "上班时间不能为空")
+    private LocalTime startTime;
+
+    @Schema(description = "下班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "下班时间不能为空")
+    private LocalTime endTime;
+
+    @Schema(description = "备注信息")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+}

+ 63 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/employeesetting/AttendanceEmployeeSettingDO.java

@@ -0,0 +1,63 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting;
+
+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_employee_setting")
+@KeySequence("attendance_employee_setting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceEmployeeSettingDO extends BaseDO {
+
+    /**
+     * 管理ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 员工ID
+     */
+    private Long employeeId;
+    /**
+     * 员工姓名
+     */
+    private String name;
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+    /**
+     * 排班ID
+     */
+    private Long schedulingId;
+    /**
+     * 考勤地点
+     */
+    private String attendanceLocation;
+    /**
+     * 手机号
+     */
+    private String phoneNumber;
+    /**
+     * 电子邮箱
+     */
+    private String email;
+    /**
+     * 状态
+     */
+    private Integer status;
+
+}

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

@@ -0,0 +1,92 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.info;
+
+import lombok.*;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+import java.util.*;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+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_info")
+@KeySequence("attendance_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceInfoDO extends BaseDO {
+
+    /**
+     * 考勤ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 员工ID
+     */
+    private Long employeeId;
+    /**
+     * 员工姓名
+     */
+    private String name;
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+    /**
+     * 考勤日期
+     */
+    private LocalDate attendanceDate;
+    /**
+     * 上班时间
+     */
+    private LocalTime workStartTime;
+    /**
+     * 下班时间
+     */
+    private LocalTime workEndTime;
+    /**
+     * 迟到时间(如有)
+     */
+    private LocalTime lateTime;
+    /**
+     * 早退时间(如有)
+     */
+    private LocalTime leaveEarlyTime;
+    /**
+     * 加班时长(小时)
+     */
+    private BigDecimal overtimeDuration;
+    /**
+     * 请假类型
+     */
+    private String leaveType;
+    /**
+     * 请假时长(小时或天数)
+     */
+    private BigDecimal leaveDuration;
+    /**
+     * 考勤状态
+     */
+    private String attendanceStatus;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 状态
+     */
+    private Integer status;
+
+}

+ 50 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/schedulingmanage/AttendanceSchedulingManageDO.java

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.schedulingmanage;
+
+import lombok.*;
+
+import java.time.LocalTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 考勤排班管理 DO
+ *
+ * @author zhaopq
+ */
+@TableName("attendance_scheduling_manage")
+@KeySequence("attendance_scheduling_manage_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceSchedulingManageDO extends BaseDO {
+
+    /**
+     * 排班ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 班次名称,如早班、中班、晚班等
+     */
+    private String shiftName;
+    /**
+     * 上班时间
+     */
+    private LocalTime startTime;
+    /**
+     * 下班时间
+     */
+    private LocalTime endTime;
+    /**
+     * 备注信息
+     */
+    private String remarks;
+    /**
+     * 状态
+     */
+    private Integer status;
+
+}

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

@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.attendance.dal.mysql.employeesetting;
+
+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.employeesetting.vo.AttendanceEmployeeSettingPageReqVO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 考勤员工设置 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface AttendanceEmployeeSettingMapper extends BaseMapperX<AttendanceEmployeeSettingDO> {
+
+    default PageResult<AttendanceEmployeeSettingDO> selectPage(AttendanceEmployeeSettingPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceEmployeeSettingDO>()
+                .eqIfPresent(AttendanceEmployeeSettingDO::getEmployeeId, reqVO.getEmployeeId())
+                .likeIfPresent(AttendanceEmployeeSettingDO::getName, reqVO.getName())
+                .eqIfPresent(AttendanceEmployeeSettingDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(AttendanceEmployeeSettingDO::getSchedulingId, reqVO.getSchedulingId())
+                .eqIfPresent(AttendanceEmployeeSettingDO::getAttendanceLocation, reqVO.getAttendanceLocation())
+                .eqIfPresent(AttendanceEmployeeSettingDO::getPhoneNumber, reqVO.getPhoneNumber())
+                .eqIfPresent(AttendanceEmployeeSettingDO::getEmail, reqVO.getEmail())
+                .eqIfPresent(AttendanceEmployeeSettingDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(AttendanceEmployeeSettingDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(AttendanceEmployeeSettingDO::getId));
+    }
+
+}

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

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.attendance.dal.mysql.info;
+
+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.dal.dataobject.info.AttendanceInfoDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 考勤信息 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface AttendanceInfoMapper extends BaseMapperX<AttendanceInfoDO> {
+
+    default PageResult<AttendanceInfoDO> selectPage(AttendanceInfoPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceInfoDO>()
+                .eqIfPresent(AttendanceInfoDO::getEmployeeId, reqVO.getEmployeeId())
+                .likeIfPresent(AttendanceInfoDO::getName, reqVO.getName())
+                .eqIfPresent(AttendanceInfoDO::getDeptId, reqVO.getDeptId())
+                .betweenIfPresent(AttendanceInfoDO::getAttendanceDate, reqVO.getAttendanceDate())
+                .betweenIfPresent(AttendanceInfoDO::getWorkStartTime, reqVO.getWorkStartTime())
+                .betweenIfPresent(AttendanceInfoDO::getWorkEndTime, reqVO.getWorkEndTime())
+                .betweenIfPresent(AttendanceInfoDO::getLateTime, reqVO.getLateTime())
+                .betweenIfPresent(AttendanceInfoDO::getLeaveEarlyTime, reqVO.getLeaveEarlyTime())
+                .eqIfPresent(AttendanceInfoDO::getOvertimeDuration, reqVO.getOvertimeDuration())
+                .eqIfPresent(AttendanceInfoDO::getLeaveType, reqVO.getLeaveType())
+                .eqIfPresent(AttendanceInfoDO::getLeaveDuration, reqVO.getLeaveDuration())
+                .eqIfPresent(AttendanceInfoDO::getAttendanceStatus, reqVO.getAttendanceStatus())
+                .eqIfPresent(AttendanceInfoDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(AttendanceInfoDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(AttendanceInfoDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(AttendanceInfoDO::getId));
+    }
+
+}

+ 31 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/schedulingmanage/AttendanceSchedulingManageMapper.java

@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.attendance.dal.mysql.schedulingmanage;
+
+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 org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo.*;
+
+/**
+ * 考勤排班管理 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface AttendanceSchedulingManageMapper extends BaseMapperX<AttendanceSchedulingManageDO> {
+
+    default PageResult<AttendanceSchedulingManageDO> selectPage(AttendanceSchedulingManagePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceSchedulingManageDO>()
+                .likeIfPresent(AttendanceSchedulingManageDO::getShiftName, reqVO.getShiftName())
+                .betweenIfPresent(AttendanceSchedulingManageDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(AttendanceSchedulingManageDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(AttendanceSchedulingManageDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(AttendanceSchedulingManageDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(AttendanceSchedulingManageDO::getCreateTime, reqVO.getCreateTime())
+                .orderByDesc(AttendanceSchedulingManageDO::getId));
+    }
+
+}

+ 7 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/package-info.java

@@ -0,0 +1,7 @@
+/**
+ * attendance 模块下,我们放考勤业务,提供员工考勤的相关功能。
+ *
+ * 1. Controller URL:以 /attendance/ 开头,避免和其它 Module 冲突
+ * 2. DataObject 表名:以 attendance_ 开头,方便在数据库中区分
+ */
+package cn.iocoder.yudao.module.attendance;

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

@@ -0,0 +1,56 @@
+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.AttendanceEmployeeSettingSaveReqVO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
+
+import javax.validation.Valid;
+import java.util.*;
+
+/**
+ * 考勤员工设置 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceEmployeeSettingService {
+
+    /**
+     * 创建考勤员工设置
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createEmployeeSetting(@Valid AttendanceEmployeeSettingSaveReqVO createReqVO);
+
+    /**
+     * 更新考勤员工设置
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateEmployeeSetting(@Valid AttendanceEmployeeSettingSaveReqVO updateReqVO);
+
+    /**
+     * 删除考勤员工设置
+     *
+     * @param id 编号
+     */
+    void deleteEmployeeSetting(Long id);
+
+    /**
+     * 获得考勤员工设置
+     *
+     * @param id 编号
+     * @return 考勤员工设置
+     */
+    AttendanceEmployeeSettingDO getEmployeeSetting(Long id);
+
+    /**
+     * 获得考勤员工设置分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 考勤员工设置分页
+     */
+    PageResult<AttendanceEmployeeSettingDO> getEmployeeSettingPage(AttendanceEmployeeSettingPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,74 @@
+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.AttendanceEmployeeSettingSaveReqVO;
+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;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS;
+
+/**
+ * 考勤员工设置 Service 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+@Validated
+public class AttendanceEmployeeSettingServiceImpl implements AttendanceEmployeeSettingService {
+
+    @Resource
+    private AttendanceEmployeeSettingMapper employeeSettingMapper;
+
+    @Override
+    public Long createEmployeeSetting(AttendanceEmployeeSettingSaveReqVO createReqVO) {
+        // 插入
+        AttendanceEmployeeSettingDO employeeSetting = BeanUtils.toBean(createReqVO, AttendanceEmployeeSettingDO.class);
+        employeeSettingMapper.insert(employeeSetting);
+        // 返回
+        return employeeSetting.getId();
+    }
+
+    @Override
+    public void updateEmployeeSetting(AttendanceEmployeeSettingSaveReqVO updateReqVO) {
+        // 校验存在
+        validateEmployeeSettingExists(updateReqVO.getId());
+        // 更新
+        AttendanceEmployeeSettingDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceEmployeeSettingDO.class);
+        employeeSettingMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteEmployeeSetting(Long id) {
+        // 校验存在
+        validateEmployeeSettingExists(id);
+        // 删除
+        employeeSettingMapper.deleteById(id);
+    }
+
+    private void validateEmployeeSettingExists(Long id) {
+        if (employeeSettingMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttendanceEmployeeSettingDO getEmployeeSetting(Long id) {
+        return employeeSettingMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttendanceEmployeeSettingDO> getEmployeeSettingPage(AttendanceEmployeeSettingPageReqVO pageReqVO) {
+        return employeeSettingMapper.selectPage(pageReqVO);
+    }
+
+}

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

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.attendance.service.info;
+
+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.AttendanceInfoPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoSaveReqVO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+
+import javax.validation.Valid;
+
+/**
+ * 考勤信息 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceInfoService {
+
+    /**
+     * 创建考勤信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createInfo(@Valid AttendanceInfoSaveReqVO createReqVO);
+
+    /**
+     * 更新考勤信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateInfo(@Valid AttendanceInfoSaveReqVO updateReqVO);
+
+    /**
+     * 删除考勤信息
+     *
+     * @param id 编号
+     */
+    void deleteInfo(Long id);
+
+    /**
+     * 获得考勤信息
+     *
+     * @param id 编号
+     * @return 考勤信息
+     */
+    AttendanceInfoDO getInfo(Long id);
+
+    /**
+     * 获得考勤信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 考勤信息分页
+     */
+    PageResult<AttendanceInfoDO> getInfoPage(AttendanceInfoPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.attendance.service.info;
+
+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.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.dal.mysql.info.AttendanceInfoMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+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;
+
+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 AttendanceInfoServiceImpl implements AttendanceInfoService {
+
+    @Resource
+    private AttendanceInfoMapper infoMapper;
+
+    @Override
+    public Long createInfo(AttendanceInfoSaveReqVO createReqVO) {
+        // 插入
+        AttendanceInfoDO info = BeanUtils.toBean(createReqVO, AttendanceInfoDO.class);
+        infoMapper.insert(info);
+        // 返回
+        return info.getId();
+    }
+
+    @Override
+    public void updateInfo(AttendanceInfoSaveReqVO updateReqVO) {
+        // 校验存在
+        validateInfoExists(updateReqVO.getId());
+        // 更新
+        AttendanceInfoDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceInfoDO.class);
+        infoMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteInfo(Long id) {
+        // 校验存在
+        validateInfoExists(id);
+        // 删除
+        infoMapper.deleteById(id);
+    }
+
+    private void validateInfoExists(Long id) {
+        if (infoMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_INFO_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttendanceInfoDO getInfo(Long id) {
+        return infoMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttendanceInfoDO> getInfoPage(AttendanceInfoPageReqVO pageReqVO) {
+        return infoMapper.selectPage(pageReqVO);
+    }
+
+}

+ 55 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/schedulingmanage/AttendanceSchedulingManageService.java

@@ -0,0 +1,55 @@
+package cn.iocoder.yudao.module.attendance.service.schedulingmanage;
+
+import java.util.*;
+import cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.schedulingmanage.AttendanceSchedulingManageDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+
+import javax.validation.Valid;
+
+/**
+ * 考勤排班管理 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceSchedulingManageService {
+
+    /**
+     * 创建考勤排班管理
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createSchedulingManage(@Valid AttendanceSchedulingManageSaveReqVO createReqVO);
+
+    /**
+     * 更新考勤排班管理
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateSchedulingManage(@Valid AttendanceSchedulingManageSaveReqVO updateReqVO);
+
+    /**
+     * 删除考勤排班管理
+     *
+     * @param id 编号
+     */
+    void deleteSchedulingManage(Long id);
+
+    /**
+     * 获得考勤排班管理
+     *
+     * @param id 编号
+     * @return 考勤排班管理
+     */
+    AttendanceSchedulingManageDO getSchedulingManage(Long id);
+
+    /**
+     * 获得考勤排班管理分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 考勤排班管理分页
+     */
+    PageResult<AttendanceSchedulingManageDO> getSchedulingManagePage(AttendanceSchedulingManagePageReqVO pageReqVO);
+
+}

+ 75 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/schedulingmanage/AttendanceSchedulingManageServiceImpl.java

@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.attendance.service.schedulingmanage;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.schedulingmanage.AttendanceSchedulingManageDO;
+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.schedulingmanage.AttendanceSchedulingManageMapper;
+
+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 AttendanceSchedulingManageServiceImpl implements AttendanceSchedulingManageService {
+
+    @Resource
+    private AttendanceSchedulingManageMapper schedulingManageMapper;
+
+    @Override
+    public Long createSchedulingManage(AttendanceSchedulingManageSaveReqVO createReqVO) {
+        // 插入
+        AttendanceSchedulingManageDO schedulingManage = BeanUtils.toBean(createReqVO, AttendanceSchedulingManageDO.class);
+        schedulingManageMapper.insert(schedulingManage);
+        // 返回
+        return schedulingManage.getId();
+    }
+
+    @Override
+    public void updateSchedulingManage(AttendanceSchedulingManageSaveReqVO updateReqVO) {
+        // 校验存在
+        validateSchedulingManageExists(updateReqVO.getId());
+        // 更新
+        AttendanceSchedulingManageDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceSchedulingManageDO.class);
+        schedulingManageMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteSchedulingManage(Long id) {
+        // 校验存在
+        validateSchedulingManageExists(id);
+        // 删除
+        schedulingManageMapper.deleteById(id);
+    }
+
+    private void validateSchedulingManageExists(Long id) {
+        if (schedulingManageMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_SCHEDULING_MANAGE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttendanceSchedulingManageDO getSchedulingManage(Long id) {
+        return schedulingManageMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttendanceSchedulingManageDO> getSchedulingManagePage(AttendanceSchedulingManagePageReqVO pageReqVO) {
+        return schedulingManageMapper.selectPage(pageReqVO);
+    }
+
+}

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

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

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

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

@@ -13,6 +13,5 @@ public interface ErrorCodeConstants {
     ErrorCode EMPLOYEE_INFO_NOT_EXISTS = new ErrorCode(1_010_000_000, "员工信息不存在");
     ErrorCode EMPLOYEE_INFO_EXISTS = new ErrorCode(1_010_000_001, "员工信息已存在");
     ErrorCode EMPLOYEE_INFO_HISTORY_NOT_EXISTS = new ErrorCode(1_010_000_002, "员工信息历史不存在");
-    ErrorCode EMPLOYEE_CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1_010_000_003, "员工合同信息不存在");
 
 }

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

@@ -16,7 +16,7 @@ public class EmployeeInfoSaveReqVO {
     private Long id;
 
     @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1987")
-    @NotEmpty(message = "业务UUID不能为空")
+//    @NotEmpty(message = "业务UUID不能为空")
     private String infoId;
 
     @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")

+ 34 - 0
yudao-module-personnel/yudao-module-holiday-api/pom.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>cn.iocoder.boot</groupId>
+        <artifactId>yudao-module-personnel</artifactId>
+        <version>${revision}</version>
+    </parent>
+
+    <artifactId>yudao-module-holiday-api</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        holiday 模块 API,暴露给其它模块调用
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-common</artifactId>
+        </dependency>
+
+        <!-- 参数校验 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+            <optional>true</optional>
+        </dependency>
+    </dependencies>
+
+</project>

+ 11 - 0
yudao-module-personnel/yudao-module-holiday-api/src/main/java/cn/iocoder/yudao/module/holiday/api/HolidayApi.java

@@ -0,0 +1,11 @@
+package cn.iocoder.yudao.module.holiday.api;
+
+
+/**
+ * 员工假务 API 接口
+ *
+ * @author zhaopq
+ */
+public interface HolidayApi {
+
+}

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

@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.holiday.enums;
+
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * Holiday 错误码枚举类
+ *
+ * holiday 系统,使用 1-012-000-000 段
+ */
+public interface ErrorCodeConstants {
+
+    // ========== 员工假务模块 1-012-000-000 ==========
+    ErrorCode RELATIONS_CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1_012_000_000, "员工合同信息不存在");
+
+}

+ 96 - 0
yudao-module-personnel/yudao-module-holiday-biz/pom.xml

@@ -0,0 +1,96 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <groupId>cn.iocoder.boot</groupId>
+        <artifactId>yudao-module-personnel</artifactId>
+        <version>${revision}</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>yudao-module-holiday-biz</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        holiday 模块,主要实现员工假务相关功能
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-holiday-api</artifactId>
+            <version>${revision}</version>
+        </dependency>
+
+        <!-- 业务组件 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-biz-data-permission</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-biz-tenant</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-biz-ip</artifactId>
+        </dependency>
+
+        <!-- Web 相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-security</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+        <!-- DB 相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-mybatis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-redis</artifactId>
+        </dependency>
+
+        <!-- Job 定时任务相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-job</artifactId>
+        </dependency>
+
+        <!-- 消息队列相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-mq</artifactId>
+        </dependency>
+
+        <!-- Test 测试相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- 工具类相关 -->
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-spring-boot-starter-excel</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-mail</artifactId>
+        </dependency>
+
+        <!-- 三方云服务相关 -->
+
+    </dependencies>
+
+</project>

+ 15 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/api/contractinfo/RelationsApiImpl.java

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.holiday.api.contractinfo;
+
+import cn.iocoder.yudao.module.relations.api.RelationsApi;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 员工关系 API 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+public class RelationsApiImpl implements RelationsApi {
+
+}

+ 98 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/RelationsContractInfoController.java

@@ -0,0 +1,98 @@
+package cn.iocoder.yudao.module.holiday.controller.admin.contractinfo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.holiday.dal.dataobject.contractinfo.RelationsContractInfoDO;
+import cn.iocoder.yudao.module.holiday.service.contractinfo.RelationsContractInfoService;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoPageReqVO;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoRespVO;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoSaveReqVO;
+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.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 javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
+
+
+@Tag(name = "管理后台 - 员工合同信息")
+@RestController
+@RequestMapping("/relations/contract-info")
+@Validated
+public class RelationsContractInfoController {
+
+    @Resource
+    private RelationsContractInfoService contractInfoService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建员工合同信息")
+    @PreAuthorize("@ss.hasPermission('relations:contract-info:create')")
+    public CommonResult<Long> createContractInfo(@Valid @RequestBody RelationsContractInfoSaveReqVO createReqVO) {
+        return success(contractInfoService.createContractInfo(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新员工合同信息")
+    @PreAuthorize("@ss.hasPermission('relations:contract-info:update')")
+    public CommonResult<Boolean> updateContractInfo(@Valid @RequestBody RelationsContractInfoSaveReqVO updateReqVO) {
+        contractInfoService.updateContractInfo(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除员工合同信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('relations:contract-info:delete')")
+    public CommonResult<Boolean> deleteContractInfo(@RequestParam("id") Long id) {
+        contractInfoService.deleteContractInfo(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得员工合同信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('relations:contract-info:query')")
+    public CommonResult<RelationsContractInfoRespVO> getContractInfo(@RequestParam("id") Long id) {
+        RelationsContractInfoDO contractInfo = contractInfoService.getContractInfo(id);
+        return success(BeanUtils.toBean(contractInfo, RelationsContractInfoRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得员工合同信息分页")
+    @PreAuthorize("@ss.hasPermission('relations:contract-info:query')")
+    public CommonResult<PageResult<RelationsContractInfoRespVO>> getContractInfoPage(@Valid RelationsContractInfoPageReqVO pageReqVO) {
+        PageResult<RelationsContractInfoDO> pageResult = contractInfoService.getContractInfoPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, RelationsContractInfoRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出员工合同信息 Excel")
+    @PreAuthorize("@ss.hasPermission('relations:contract-info:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportContractInfoExcel(@Valid RelationsContractInfoPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<RelationsContractInfoDO> list = contractInfoService.getContractInfoPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "员工合同信息.xls", "数据", RelationsContractInfoRespVO.class,
+                        BeanUtils.toBean(list, RelationsContractInfoRespVO.class));
+    }
+
+}

+ 64 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/vo/RelationsContractInfoPageReqVO.java

@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo;
+
+import lombok.*;
+
+import java.time.LocalDate;
+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 RelationsContractInfoPageReqVO extends PageParam {
+
+    @Schema(description = "业务UUID", example = "17794")
+    private String infoId;
+
+    @Schema(description = "姓名", example = "芋艿")
+    private String name;
+
+    @Schema(description = "部门ID", example = "20570")
+    private Long deptId;
+
+    @Schema(description = "部门名称", example = "张三")
+    private String deptName;
+
+    @Schema(description = "职位编号", example = "13164")
+    private Long postId;
+
+    @Schema(description = "职位名称")
+    private String position;
+
+    @Schema(description = "员工编号")
+    private String employeeNumber;
+
+    @Schema(description = "合同开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] contractStartDate;
+
+    @Schema(description = "合同结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] contractEndDate;
+
+    @Schema(description = "合同期限")
+    private String contractDeadline;
+
+    @Schema(description = "备注信息")
+    private String remarks;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "员工ID", example = "31256")
+    private Long employeeId;
+
+}

+ 78 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/vo/RelationsContractInfoRespVO.java

@@ -0,0 +1,78 @@
+package cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDate;
+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 RelationsContractInfoRespVO {
+
+    @Schema(description = "自增ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28961")
+    @ExcelProperty("自增ID")
+    private Long id;
+
+    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17794")
+    @ExcelProperty("业务UUID")
+    private String infoId;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @ExcelProperty("姓名")
+    private String name;
+
+    @Schema(description = "部门ID", example = "20570")
+    @ExcelProperty("部门ID")
+    private Long deptId;
+
+    @Schema(description = "部门名称", example = "张三")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+    @Schema(description = "职位编号", example = "13164")
+    @ExcelProperty("职位编号")
+    private Long postId;
+
+    @Schema(description = "职位名称")
+    @ExcelProperty("职位名称")
+    private String position;
+
+    @Schema(description = "员工编号")
+    @ExcelProperty("员工编号")
+    private String employeeNumber;
+
+    @Schema(description = "合同开始日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("合同开始日期")
+    private LocalDate contractStartDate;
+
+    @Schema(description = "合同结束日期")
+    @ExcelProperty("合同结束日期")
+    private LocalDate contractEndDate;
+
+    @Schema(description = "合同期限")
+    @ExcelProperty("合同期限")
+    private String contractDeadline;
+
+    @Schema(description = "备注信息")
+    @ExcelProperty("备注信息")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31256")
+    @ExcelProperty("员工ID")
+    private Long employeeId;
+
+}

+ 62 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/contractinfo/vo/RelationsContractInfoSaveReqVO.java

@@ -0,0 +1,62 @@
+package cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDate;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 员工合同信息新增/修改 Request VO")
+@Data
+public class RelationsContractInfoSaveReqVO {
+
+    @Schema(description = "自增ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28961")
+    private Long id;
+
+    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17794")
+    @NotEmpty(message = "业务UUID不能为空")
+    private String infoId;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "姓名不能为空")
+    private String name;
+
+    @Schema(description = "部门ID", example = "20570")
+    private Long deptId;
+
+    @Schema(description = "部门名称", example = "张三")
+    private String deptName;
+
+    @Schema(description = "职位编号", example = "13164")
+    private Long postId;
+
+    @Schema(description = "职位名称")
+    private String position;
+
+    @Schema(description = "员工编号")
+    private String employeeNumber;
+
+    @Schema(description = "合同开始日期", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "合同开始日期不能为空")
+    private LocalDate contractStartDate;
+
+    @Schema(description = "合同结束日期")
+    private LocalDate contractEndDate;
+
+    @Schema(description = "合同期限")
+    private String contractDeadline;
+
+    @Schema(description = "备注信息")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31256")
+    @NotNull(message = "员工ID不能为空")
+    private Long employeeId;
+
+}

+ 85 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/dal/dataobject/contractinfo/RelationsContractInfoDO.java

@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.holiday.dal.dataobject.contractinfo;
+
+import lombok.*;
+
+import java.time.LocalDate;
+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("relations_contract_info")
+@KeySequence("relations_contract_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class RelationsContractInfoDO extends BaseDO {
+
+    /**
+     * 自增ID
+     */
+    @TableId
+    private Long id;
+    /**
+     * 业务UUID
+     */
+    private String infoId;
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+    /**
+     * 部门名称
+     */
+    private String deptName;
+    /**
+     * 职位编号
+     */
+    private Long postId;
+    /**
+     * 职位名称
+     */
+    private String position;
+    /**
+     * 员工编号
+     */
+    private String employeeNumber;
+    /**
+     * 合同开始日期
+     */
+    private LocalDate contractStartDate;
+    /**
+     * 合同结束日期
+     */
+    private LocalDate contractEndDate;
+    /**
+     * 合同期限
+     */
+    private String contractDeadline;
+    /**
+     * 备注信息
+     */
+    private String remarks;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 员工ID
+     */
+    private Long employeeId;
+
+}

+ 37 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/dal/mysql/contractinfo/RelationsContractInfoMapper.java

@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.holiday.dal.mysql.contractinfo;
+
+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.holiday.dal.dataobject.contractinfo.RelationsContractInfoDO;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoPageReqVO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 员工合同信息 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface RelationsContractInfoMapper extends BaseMapperX<RelationsContractInfoDO> {
+
+    default PageResult<RelationsContractInfoDO> selectPage(RelationsContractInfoPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<RelationsContractInfoDO>()
+                .eqIfPresent(RelationsContractInfoDO::getInfoId, reqVO.getInfoId())
+                .likeIfPresent(RelationsContractInfoDO::getName, reqVO.getName())
+                .eqIfPresent(RelationsContractInfoDO::getDeptId, reqVO.getDeptId())
+                .likeIfPresent(RelationsContractInfoDO::getDeptName, reqVO.getDeptName())
+                .eqIfPresent(RelationsContractInfoDO::getPostId, reqVO.getPostId())
+                .eqIfPresent(RelationsContractInfoDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(RelationsContractInfoDO::getEmployeeNumber, reqVO.getEmployeeNumber())
+                .betweenIfPresent(RelationsContractInfoDO::getContractStartDate, reqVO.getContractStartDate())
+                .betweenIfPresent(RelationsContractInfoDO::getContractEndDate, reqVO.getContractEndDate())
+                .eqIfPresent(RelationsContractInfoDO::getContractDeadline, reqVO.getContractDeadline())
+                .eqIfPresent(RelationsContractInfoDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(RelationsContractInfoDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(RelationsContractInfoDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(RelationsContractInfoDO::getEmployeeId, reqVO.getEmployeeId())
+                .orderByDesc(RelationsContractInfoDO::getId));
+    }
+
+}

+ 7 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/package-info.java

@@ -0,0 +1,7 @@
+/**
+ * holiday 模块下,我们放假务业务,提供员工假务的相关功能。
+ *
+ * 1. Controller URL:以 /holiday/ 开头,避免和其它 Module 冲突
+ * 2. DataObject 表名:以 holiday_ 开头,方便在数据库中区分
+ */
+package cn.iocoder.yudao.module.holiday;

+ 56 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/service/contractinfo/RelationsContractInfoService.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.holiday.service.contractinfo;
+
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoPageReqVO;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoSaveReqVO;
+import cn.iocoder.yudao.module.holiday.dal.dataobject.contractinfo.RelationsContractInfoDO;
+
+import javax.validation.Valid;
+
+/**
+ * 员工合同信息 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface RelationsContractInfoService {
+
+    /**
+     * 创建员工合同信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createContractInfo(@Valid RelationsContractInfoSaveReqVO createReqVO);
+
+    /**
+     * 更新员工合同信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateContractInfo(@Valid RelationsContractInfoSaveReqVO updateReqVO);
+
+    /**
+     * 删除员工合同信息
+     *
+     * @param id 编号
+     */
+    void deleteContractInfo(Long id);
+
+    /**
+     * 获得员工合同信息
+     *
+     * @param id 编号
+     * @return 员工合同信息
+     */
+    RelationsContractInfoDO getContractInfo(Long id);
+
+    /**
+     * 获得员工合同信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 员工合同信息分页
+     */
+    PageResult<RelationsContractInfoDO> getContractInfoPage(RelationsContractInfoPageReqVO pageReqVO);
+
+}

+ 71 - 0
yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/service/contractinfo/RelationsContractInfoServiceImpl.java

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.holiday.service.contractinfo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoPageReqVO;
+import cn.iocoder.yudao.module.holiday.controller.admin.contractinfo.vo.RelationsContractInfoSaveReqVO;
+import cn.iocoder.yudao.module.holiday.dal.dataobject.contractinfo.RelationsContractInfoDO;
+import cn.iocoder.yudao.module.holiday.dal.mysql.contractinfo.RelationsContractInfoMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.relations.enums.ErrorCodeConstants.RELATIONS_CONTRACT_INFO_NOT_EXISTS;
+
+/**
+ * 员工合同信息 Service 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+@Validated
+public class RelationsContractInfoServiceImpl implements RelationsContractInfoService {
+
+    @Resource
+    private RelationsContractInfoMapper contractInfoMapper;
+
+    @Override
+    public Long createContractInfo(RelationsContractInfoSaveReqVO createReqVO) {
+        // 插入
+        RelationsContractInfoDO contractInfo = BeanUtils.toBean(createReqVO, RelationsContractInfoDO.class);
+        contractInfoMapper.insert(contractInfo);
+        // 返回
+        return contractInfo.getId();
+    }
+
+    @Override
+    public void updateContractInfo(RelationsContractInfoSaveReqVO updateReqVO) {
+        // 校验存在
+        validateContractInfoExists(updateReqVO.getId());
+        // 更新
+        RelationsContractInfoDO updateObj = BeanUtils.toBean(updateReqVO, RelationsContractInfoDO.class);
+        contractInfoMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteContractInfo(Long id) {
+        // 校验存在
+        validateContractInfoExists(id);
+        // 删除
+        contractInfoMapper.deleteById(id);
+    }
+
+    private void validateContractInfoExists(Long id) {
+        if (contractInfoMapper.selectById(id) == null) {
+            throw exception(RELATIONS_CONTRACT_INFO_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public RelationsContractInfoDO getContractInfo(Long id) {
+        return contractInfoMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<RelationsContractInfoDO> getContractInfoPage(RelationsContractInfoPageReqVO pageReqVO) {
+        return contractInfoMapper.selectPage(pageReqVO);
+    }
+
+}

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

+ 7 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/package-info.java

@@ -0,0 +1,7 @@
+/**
+ * relations 模块下,我们放员工关系业务,提供员工关系的相关功能。
+ *
+ * 1. Controller URL:以 /relations/ 开头,避免和其它 Module 冲突
+ * 2. DataObject 表名:以 relations_ 开头,方便在数据库中区分
+ */
+package cn.iocoder.yudao.module.relations;