Browse Source

Merge branch 'refs/heads/saas_20240723' into master_20240722

# Conflicts:
#	yudao-server/pom.xml
zhaopeiqing 7 months ago
parent
commit
05fbba189e
100 changed files with 5553 additions and 784 deletions
  1. 6 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. 18 0
      yudao-module-personnel/yudao-module-attendance-api/src/main/java/cn/iocoder/yudao/module/attendance/enums/ErrorCodeConstants.java
  5. 102 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/info/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. 108 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/AttendanceInfoController.java
  12. 50 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoImportExcelVO.java
  13. 24 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoImportRespVO.java
  14. 82 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoPageReqVO.java
  15. 92 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoRespVO.java
  16. 74 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoSaveReqVO.java
  17. 95 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/AttendanceSchedulingManageController.java
  18. 41 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManagePageReqVO.java
  19. 46 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageRespVO.java
  20. 38 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageSaveReqVO.java
  21. 63 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/employeesetting/AttendanceEmployeeSettingDO.java
  22. 101 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/info/AttendanceInfoDO.java
  23. 50 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/schedulingmanage/AttendanceSchedulingManageDO.java
  24. 34 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/employeesetting/AttendanceEmployeeSettingMapper.java
  25. 42 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/info/AttendanceInfoMapper.java
  26. 31 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/schedulingmanage/AttendanceSchedulingManageMapper.java
  27. 7 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/package-info.java
  28. 56 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingService.java
  29. 81 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingServiceImpl.java
  30. 68 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoService.java
  31. 171 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoServiceImpl.java
  32. 55 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/schedulingmanage/AttendanceSchedulingManageService.java
  33. 82 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/schedulingmanage/AttendanceSchedulingManageServiceImpl.java
  34. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/employeesetting/AttendanceEmployeeSettingMapper.xml
  35. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/info/AttendanceInfoMapper.xml
  36. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/schedulingmanage/AttendanceSchedulingManageMapper.xml
  37. 10 1
      yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/api/EmployeeApi.java
  38. 44 0
      yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/api/dto/EmployeePageReqDTO.java
  39. 22 129
      yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/api/dto/EmployeeRespDTO.java
  40. 3 3
      yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/enums/ErrorCodeConstants.java
  41. 18 6
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/api/employeeinfo/EmployeeApiImpl.java
  42. 0 59
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeContractInfoRespVO.java
  43. 0 49
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeContractInfoSaveReqVO.java
  44. 5 5
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/EmployeeInfoController.java
  45. 98 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/EmployeeInfoHistoryController.java
  46. 61 41
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoPageReqVO.java
  47. 208 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoHistoryRespVO.java
  48. 164 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoHistorySaveReqVO.java
  49. 166 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoPageReqVO.java
  50. 55 39
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoQueryReqVO.java
  51. 78 58
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoRespVO.java
  52. 61 45
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoSaveReqVO.java
  53. 0 69
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/dataobject/employeeinfo/EmployeeContractInfoDO.java
  54. 57 37
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/dataobject/employeeinfo/EmployeeInfoDO.java
  55. 216 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/dataobject/info/EmployeeInfoHistoryDO.java
  56. 0 33
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/mysql/employeeinfo/EmployeeContractInfoMapper.java
  57. 70 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/mysql/info/EmployeeInfoHistoryMapper.java
  58. 22 15
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/mysql/employeeinfo/EmployeeInfoMapper.java
  59. 0 56
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeContractInfoService.java
  60. 0 71
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeContractInfoServiceImpl.java
  61. 56 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/info/EmployeeInfoHistoryService.java
  62. 83 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/info/EmployeeInfoHistoryServiceImpl.java
  63. 4 4
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeInfoService.java
  64. 24 5
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeInfoServiceImpl.java
  65. 1 1
      yudao-module-personnel/yudao-module-employee-biz/src/main/resources/mapper/employeeinfo/EmployeeInfoMapper.xml
  66. 4 16
      yudao-module-personnel/yudao-module-employee-biz/src/test/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeInfoServiceImplTest.java
  67. 34 0
      yudao-module-personnel/yudao-module-holiday-api/pom.xml
  68. 11 0
      yudao-module-personnel/yudao-module-holiday-api/src/main/java/cn/iocoder/yudao/module/holiday/api/HolidayApi.java
  69. 16 0
      yudao-module-personnel/yudao-module-holiday-api/src/main/java/cn/iocoder/yudao/module/holiday/enums/ErrorCodeConstants.java
  70. 107 0
      yudao-module-personnel/yudao-module-holiday-biz/pom.xml
  71. 15 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/api/info/HolidayApiImpl.java
  72. 48 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/annualleave/HolidayAnnualLeaveController.java
  73. 7 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/package-info.java
  74. 12 0
      yudao-module-personnel/yudao-module-holiday-biz/src/main/resources/mapper/contractinfo/RelationsContractInfoMapper.xml
  75. 34 0
      yudao-module-personnel/yudao-module-relations-api/pom.xml
  76. 11 0
      yudao-module-personnel/yudao-module-relations-api/src/main/java/cn/iocoder/yudao/module/relations/api/RelationsApi.java
  77. 20 0
      yudao-module-personnel/yudao-module-relations-api/src/main/java/cn/iocoder/yudao/module/relations/enums/ErrorCodeConstants.java
  78. 30 0
      yudao-module-personnel/yudao-module-relations-api/src/main/java/cn/iocoder/yudao/module/relations/enums/contractinfo/ContractInfoStatusEnum.java
  79. 96 0
      yudao-module-personnel/yudao-module-relations-biz/pom.xml
  80. 15 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/api/contract/RelationsApiImpl.java
  81. 28 28
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/EmployeeContractInfoController.java
  82. 29 14
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeContractInfoPageReqVO.java
  83. 85 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractRespVO.java
  84. 71 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractSaveReqVO.java
  85. 94 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/RelationsConversionController.java
  86. 88 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/vo/RelationsConversionPageReqVO.java
  87. 110 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/vo/RelationsConversionRespVO.java
  88. 84 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/vo/RelationsConversionSaveReqVO.java
  89. 94 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/RelationsEntryController.java
  90. 77 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/vo/RelationsEntryPageReqVO.java
  91. 98 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/vo/RelationsEntryRespVO.java
  92. 75 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/vo/RelationsEntrySaveReqVO.java
  93. 95 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/RelationsRenewController.java
  94. 94 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/vo/RelationsRenewPageReqVO.java
  95. 120 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/vo/RelationsRenewRespVO.java
  96. 90 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/vo/RelationsRenewSaveReqVO.java
  97. 94 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/RelationsTurnoverController.java
  98. 81 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/vo/RelationsTurnoverPageReqVO.java
  99. 102 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/vo/RelationsTurnoverRespVO.java
  100. 0 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/vo/RelationsTurnoverSaveReqVO.java

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

@@ -20,6 +20,12 @@
     <modules>
         <module>yudao-module-employee-api</module>
         <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 {
+
+}

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

@@ -0,0 +1,18 @@
+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, "考勤员工设置不存在");
+    ErrorCode ATTENDANCE_INFO_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_013_000_003, "导入考勤信息数据不能为空!");
+}

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

@@ -0,0 +1,102 @@
+<?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>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-employee-biz</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- 三方云服务相关 -->
+
+    </dependencies>
+
+</project>

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

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.attendance.api.info;
+
+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("/presonnel/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;
+
+}

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

@@ -0,0 +1,108 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info;
+
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.service.info.AttendanceInfoService;
+import io.swagger.v3.oas.annotations.Parameters;
+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 org.springframework.web.multipart.MultipartFile;
+
+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("/presonnel/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));
+    }
+
+    @PostMapping("/import-excel")
+    @Operation(summary = "导入考勤信息 Excel")
+    @Parameters({
+            @Parameter(name = "file", description = "Excel 文件", required = true)
+    })
+    @PreAuthorize("@ss.hasPermission('attendance:info:import')")
+    public CommonResult<AttendanceInfoImportRespVO> importExcel(@RequestParam("file") MultipartFile file) throws Exception {
+        List<AttendanceInfoImportExcelVO> list = ExcelUtils.read(file, AttendanceInfoImportExcelVO.class);
+        return success(infoService.importAttendanceInfoList(list));
+    }
+
+}

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

@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * 考勤信息 Excel 导入 VO
+ */
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+@Accessors(chain = false) // 设置 chain = false,避免用户导入有问题
+public class AttendanceInfoImportExcelVO {
+
+    @ExcelProperty("员工姓名")
+    private String employeeName;
+
+    @ExcelProperty("员工手机号")
+    private String employeeMobile;
+
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+    @ExcelProperty("职位名称")
+    private String position;
+
+    @ExcelProperty("考勤日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] attendanceDate;
+
+    @ExcelProperty("上班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] workStartTime;
+
+    @ExcelProperty("下班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] workEndTime;
+
+}

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

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Builder;
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Schema(description = "管理后台 - 考勤信息导入 Response VO")
+@Data
+@Builder
+public class AttendanceInfoImportRespVO {
+
+    @Schema(description = "创建成功的员工姓名数组", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> createEmployeeNames;
+
+    @Schema(description = "删除成功的员工姓名数组", requiredMode = Schema.RequiredMode.REQUIRED)
+    private List<String> deleteEmployeeNames;
+
+    @Schema(description = "导入失败的员工集合,key 为员工姓名,value 为失败原因", requiredMode = Schema.RequiredMode.REQUIRED)
+    private Map<String, String> failureEmployeeNames;
+
+}

+ 82 - 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,82 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+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 javax.validation.constraints.NotEmpty;
+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 = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    private String employeeName;
+
+    @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
+    private String employeeMobile;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "职位名称", example = "13463")
+    private String position;
+
+    @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;
+
+}

+ 92 - 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,92 @@
+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.*;
+
+import javax.validation.constraints.NotEmpty;
+
+@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 employeeName;
+
+    @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
+    @NotEmpty(message = "员工手机号不能为空")
+    private String employeeMobile;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "职位名称", example = "13463")
+    private String position;
+
+    @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;
+
+}

+ 74 - 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,74 @@
+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 employeeName;
+
+    @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
+    @NotEmpty(message = "员工手机号不能为空")
+    private String employeeMobile;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "职位名称", example = "13463")
+    private String position;
+
+    @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("/presonnel/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;
+
+}

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

@@ -0,0 +1,101 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.info;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+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 employeeName;
+    /**
+     * 员工手机号
+     */
+    private String employeeMobile;
+    /**
+     * 部门名称
+     */
+     String deptName;
+    /**
+     * 职位名称
+     */
+    private String position;
+    /**
+     * 考勤日期
+     */
+    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));
+    }
+
+}

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

@@ -0,0 +1,42 @@
+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::getEmployeeName, reqVO.getEmployeeName())
+                .likeIfPresent(AttendanceInfoDO::getEmployeeMobile, reqVO.getEmployeeMobile())
+                .likeIfPresent(AttendanceInfoDO::getDeptName, reqVO.getDeptName())
+                .likeIfPresent(AttendanceInfoDO::getPosition, reqVO.getPosition())
+                .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);
+
+}

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

@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.attendance.service.employeesetting;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.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
+    @TenantIgnore
+    public Long createEmployeeSetting(AttendanceEmployeeSettingSaveReqVO createReqVO) {
+        // 插入
+        AttendanceEmployeeSettingDO employeeSetting = BeanUtils.toBean(createReqVO, AttendanceEmployeeSettingDO.class);
+        employeeSettingMapper.insert(employeeSetting);
+        // 返回
+        return employeeSetting.getId();
+    }
+
+    @Override
+    @TenantIgnore
+    public void updateEmployeeSetting(AttendanceEmployeeSettingSaveReqVO updateReqVO) {
+        // 校验存在
+        validateEmployeeSettingExists(updateReqVO.getId());
+        // 更新
+        AttendanceEmployeeSettingDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceEmployeeSettingDO.class);
+        employeeSettingMapper.updateById(updateObj);
+    }
+
+    @Override
+    @TenantIgnore
+    public void deleteEmployeeSetting(Long id) {
+        // 校验存在
+        validateEmployeeSettingExists(id);
+        // 删除
+        employeeSettingMapper.deleteById(id);
+    }
+
+    @TenantIgnore
+    private void validateEmployeeSettingExists(Long id) {
+        if (employeeSettingMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    @TenantIgnore
+    public AttendanceEmployeeSettingDO getEmployeeSetting(Long id) {
+        return employeeSettingMapper.selectById(id);
+    }
+
+    @Override
+    @TenantIgnore
+    public PageResult<AttendanceEmployeeSettingDO> getEmployeeSettingPage(AttendanceEmployeeSettingPageReqVO pageReqVO) {
+        return employeeSettingMapper.selectPage(pageReqVO);
+    }
+
+}

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

@@ -0,0 +1,68 @@
+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.AttendanceInfoImportExcelVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportRespVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoSaveReqVO;
+import cn.iocoder.yudao.module.attendance.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);
+
+    /**
+     * 批量导入考勤信息
+     *
+     * @param importAttendanceInfos 导入考勤信息列表
+     * @return 导入结果
+     */
+    AttendanceInfoImportRespVO importAttendanceInfoList(List<AttendanceInfoImportExcelVO> importAttendanceInfos);
+
+
+}

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

@@ -0,0 +1,171 @@
+package cn.iocoder.yudao.module.attendance.service.info;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.exception.ServiceException;
+import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
+import cn.iocoder.yudao.framework.datapermission.core.util.DataPermissionUtils;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportExcelVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoImportRespVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoSaveReqVO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.dal.mysql.info.AttendanceInfoMapper;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoPageReqVO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoService;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
+import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
+
+/**
+ * 考勤信息 Service 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+@Validated
+public class AttendanceInfoServiceImpl implements AttendanceInfoService {
+
+    @Resource
+    private AttendanceInfoMapper infoMapper;
+    @Resource
+    private EmployeeInfoService employeeInfoService;
+
+    @Override
+    @TenantIgnore
+    public Long createInfo(AttendanceInfoSaveReqVO createReqVO) {
+        // 插入
+        AttendanceInfoDO info = BeanUtils.toBean(createReqVO, AttendanceInfoDO.class);
+        infoMapper.insert(info);
+        // 返回
+        return info.getId();
+    }
+
+    @Override
+    @TenantIgnore
+    public void updateInfo(AttendanceInfoSaveReqVO updateReqVO) {
+        // 校验存在
+        validateInfoExists(updateReqVO.getId());
+        // 更新
+        AttendanceInfoDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceInfoDO.class);
+        infoMapper.updateById(updateObj);
+    }
+
+    @Override
+    @TenantIgnore
+    public void deleteInfo(Long id) {
+        // 校验存在
+        validateInfoExists(id);
+        // 删除
+        infoMapper.deleteById(id);
+    }
+
+    @TenantIgnore
+    private void validateInfoExists(Long id) {
+        if (infoMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_INFO_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    @TenantIgnore
+    public AttendanceInfoDO getInfo(Long id) {
+        return infoMapper.selectById(id);
+    }
+
+    @Override
+    @TenantIgnore
+    public PageResult<AttendanceInfoDO> getInfoPage(AttendanceInfoPageReqVO pageReqVO) {
+        return infoMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    @TenantIgnore
+    @Transactional(rollbackFor = Exception.class) // 添加事务,异常则回滚所有导入
+    public AttendanceInfoImportRespVO importAttendanceInfoList(List<AttendanceInfoImportExcelVO> importAttendanceInfos) {
+        if (CollUtil.isEmpty(importAttendanceInfos)) {
+            throw exception(ATTENDANCE_INFO_IMPORT_LIST_IS_EMPTY);
+        }
+
+        // 获取用户信息和租户ID
+        LoginUser user = SecurityFrameworkUtils.getLoginUser();
+        Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
+
+        // 初始化响应对象
+        AttendanceInfoImportRespVO respVO = AttendanceInfoImportRespVO.builder()
+                .createEmployeeNames(new ArrayList<>())
+                .deleteEmployeeNames(new ArrayList<>())
+                .failureEmployeeNames(new LinkedHashMap<>())
+                .build();
+
+        // 收集要删除和创建的数据
+        List<AttendanceInfoDO> toInsert = new ArrayList<>();
+        List<Long> toDeleteIds = new ArrayList<>();
+        List<String> failedEmployeeNames = new ArrayList<>();
+
+        for (AttendanceInfoImportExcelVO importAttendance : importAttendanceInfos) {
+            try {
+                // 验证员工是否存在
+                validateEmployeeExists(importAttendance.getEmployeeName(), importAttendance.getEmployeeMobile(), tenantId);
+
+                // 查找并收集要删除的数据
+                List<AttendanceInfoDO> existingInfos = infoMapper.selectPage(
+                        new AttendanceInfoPageReqVO().setAttendanceDate(importAttendance.getAttendanceDate()).setEmployeeMobile(importAttendance.getEmployeeMobile())
+                ).getList();
+                toDeleteIds.addAll(existingInfos.stream().map(AttendanceInfoDO::getId).collect(Collectors.toList()));
+
+                // 准备要插入的数据
+                AttendanceInfoDO attendanceInfoDO = BeanUtils.toBean(importAttendance, AttendanceInfoDO.class);
+                toInsert.add(attendanceInfoDO);
+
+            } catch (ServiceException ex) {
+                failedEmployeeNames.add(importAttendance.getEmployeeName());
+                respVO.getFailureEmployeeNames().put(importAttendance.getEmployeeName(), ex.getMessage());
+            }
+        }
+
+        // 批量删除
+        if (!toDeleteIds.isEmpty()) {
+            infoMapper.deleteBatchIds(toDeleteIds);
+            toDeleteIds.forEach(id -> respVO.getDeleteEmployeeNames().add(this.getInfo(id).getEmployeeName())); // 假设有一个findEmployeeNameById方法来获取员工名
+        }
+
+        // 批量插入
+        if (!toInsert.isEmpty()) {
+            infoMapper.insertBatch(toInsert);
+            toInsert.forEach(info -> respVO.getCreateEmployeeNames().add(info.getEmployeeName()));
+        }
+        return respVO;
+    }
+
+    private boolean validateEmployeeExists(String employeeName, String employeeMobile, Long tenantId) {
+        // 关闭数据权限,避免因为没有数据权限,查询不到数据,进而导致唯一校验不正确
+        return DataPermissionUtils.executeIgnore(() -> {
+            List<EmployeeInfoDO> list = employeeInfoService.getInfoPage(new EmployeeInfoPageReqVO().setName(employeeName).setPhone(employeeMobile).setTenantId(tenantId)).getList();
+           if (CollUtil.isEmpty(list)) {
+               throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+           }
+            return true;
+        });
+    }
+
+
+}

+ 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);
+
+}

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

@@ -0,0 +1,82 @@
+package cn.iocoder.yudao.module.attendance.service.schedulingmanage;
+
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+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
+    @TenantIgnore
+    public Long createSchedulingManage(AttendanceSchedulingManageSaveReqVO createReqVO) {
+        // 插入
+        AttendanceSchedulingManageDO schedulingManage = BeanUtils.toBean(createReqVO, AttendanceSchedulingManageDO.class);
+        schedulingManageMapper.insert(schedulingManage);
+        // 返回
+        return schedulingManage.getId();
+    }
+
+    @Override
+    @TenantIgnore
+    public void updateSchedulingManage(AttendanceSchedulingManageSaveReqVO updateReqVO) {
+        // 校验存在
+        validateSchedulingManageExists(updateReqVO.getId());
+        // 更新
+        AttendanceSchedulingManageDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceSchedulingManageDO.class);
+        schedulingManageMapper.updateById(updateObj);
+    }
+
+    @Override
+    @TenantIgnore
+    public void deleteSchedulingManage(Long id) {
+        // 校验存在
+        validateSchedulingManageExists(id);
+        // 删除
+        schedulingManageMapper.deleteById(id);
+    }
+
+    @TenantIgnore
+    private void validateSchedulingManageExists(Long id) {
+        if (schedulingManageMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_SCHEDULING_MANAGE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    @TenantIgnore
+    public AttendanceSchedulingManageDO getSchedulingManage(Long id) {
+        return schedulingManageMapper.selectById(id);
+    }
+
+    @Override
+    @TenantIgnore
+    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>

+ 10 - 1
yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/api/EmployeeApi.java

@@ -1,6 +1,8 @@
 package cn.iocoder.yudao.module.employee.api;
 
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeCreateReqDTO;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeePageReqDTO;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeQueryReqDTO;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 
@@ -9,7 +11,7 @@ import javax.validation.Valid;
 /**
  * 员工 API 接口
  *
- * @author 芋道源码
+ * @author zhaopq
  */
 public interface EmployeeApi {
 
@@ -29,4 +31,11 @@ public interface EmployeeApi {
      */
     EmployeeRespDTO getEmployee(@Valid EmployeeQueryReqDTO reqDTO);
 
+    /**
+     * 查询员工分页
+     *
+     * @param pageReqVO
+     * @return
+     */
+    PageResult<EmployeeRespDTO> getEmployeePage(@Valid EmployeePageReqDTO pageReqVO);
 }

+ 44 - 0
yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/api/dto/EmployeePageReqDTO.java

@@ -0,0 +1,44 @@
+package cn.iocoder.yudao.module.employee.api.dto;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import lombok.Data;
+
+/**
+ * 员工信息分页 Request DTO
+ *
+ * @author zhaopq
+ */
+@Data
+public class EmployeePageReqDTO extends PageParam {
+
+    /**
+     * 姓名
+     */
+    private String name;
+    /**
+     * 用户头像
+     */
+    private String avatar;
+    /**
+     * 员工状态
+     */
+    private Integer employeeStatus;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 租户编目
+     */
+    private Long tenantId;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 手机号
+     */
+    private String phone;
+
+}

+ 22 - 129
yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/api/dto/EmployeeRespDTO.java

@@ -17,165 +17,58 @@ public class EmployeeRespDTO {
      * 员工ID
      */
     private Long id;
+
     /**
      * 业务UUID
      */
     private String infoId;
-    /**
-     * 员工编号
-     */
-    private String employeeNumber;
+
     /**
      * 姓名
      */
     private String name;
+
     /**
      * 部门ID
      */
     private Long deptId;
+
     /**
-     * 手机号
-     */
-    private String phone;
-    /**
-     * 头像地址
+     * 部门名称
      */
-    private String avatar;
+    private String deptName;
+
     /**
-     * 电子邮箱
+     * 职位编号
      */
-    private String email;
+    private Long postId;
+
     /**
-     * 职位
+     * 职位名称
      */
     private String position;
+
     /**
-     * 职位编号
+     * 员工编号
      */
-    private Long postId;
+    private String employeeNumber;
+
     /**
      * 入职时间
      */
     private LocalDate entryDate;
+
     /**
-     * 试用期到期时间
-     */
-    private LocalDate probationEndDate;
-    /**
-     * 工作地点
-     */
-    private String workLocation;
-    /**
-     * 员工状态
-     */
-    private Integer employeeStatus;
-    /**
-     * 性别
-     */
-    private String gender;
-    /**
-     * 出生日期
-     */
-    private LocalDate birthDate;
-    /**
-     * 婚姻状况
-     */
-    private String marriageStatus;
-    /**
-     * 身份证号
-     */
-    private String idCardNumber;
-    /**
-     * 身份证地址
-     */
-    private String idCardAddress;
-    /**
-     * 户口类型
-     */
-    private String householdType;
-    /**
-     * 户口所在地
-     */
-    private String householdLocation;
-    /**
-     * 学历
-     */
-    private String educationLevel;
-    /**
-     * 专业
-     */
-    private String major;
-    /**
-     * 毕业院校
-     */
-    private String graduationSchool;
-    /**
-     * 毕业时间
-     */
-    private LocalDate graduationDate;
-    /**
-     * 参加工作时间
-     */
-    private LocalDate workStartDate;
-    /**
-     * 年假天数
-     */
-    private Integer annualLeaveDays;
-    /**
-     * 工资卡银行
-     */
-    private String salaryBank;
-    /**
-     * 工资卡号
-     */
-    private String salaryCardNumber;
-    /**
-     * 薪酬
-     */
-    private BigDecimal salary;
-    /**
-     * 岗位薪资
-     */
-    private BigDecimal positionSalary;
-    /**
-     * 项目津贴
-     */
-    private BigDecimal projectAllowance;
-    /**
-     * 特殊岗位津贴
-     */
-    private BigDecimal specialPositionAllowance;
-    /**
-     * 外籍津贴
-     */
-    private BigDecimal foreignAllowance;
-    /**
-     * 午餐补助
-     */
-    private BigDecimal lunchSubsidy;
-    /**
-     * 特别津贴
-     */
-    private BigDecimal specialAllowance;
-    /**
-     * 补贴
-     */
-    private BigDecimal subsidy;
-    /**
-     * 年终奖
-     */
-    private BigDecimal yearEndBonus;
-    /**
-     * 状态
+     * 年假基准天数
      */
-    private Integer status;
+    private Integer baseAnnualLeave;
     /**
-     * 租户编目
+     * 已使用年假天数
      */
-    private Long tenantId;
+    private Integer usedAnnualLeave;
     /**
-     * 用户ID
+     * 剩余年假天数
      */
-    private Long userId;
+    private Integer remainingAnnualLeave;
 
 }

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

@@ -3,15 +3,15 @@ package cn.iocoder.yudao.module.employee.enums;
 import cn.iocoder.yudao.framework.common.exception.ErrorCode;
 
 /**
- * System 错误码枚举类
+ * Employee 错误码枚举类
  *
- * system 系统,使用 1-002-000-000 段
+ * employee 系统,使用 1-010-000-000 段
  */
 public interface ErrorCodeConstants {
 
     // ========== 员工模块 1-002-000-000 ==========
     ErrorCode EMPLOYEE_INFO_NOT_EXISTS = new ErrorCode(1_010_000_000, "员工信息不存在");
     ErrorCode EMPLOYEE_INFO_EXISTS = new ErrorCode(1_010_000_001, "员工信息已存在");
-    ErrorCode EMPLOYEE_CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1_010_000_002, "员工合同信息不存在");
+    ErrorCode EMPLOYEE_INFO_HISTORY_NOT_EXISTS = new ErrorCode(1_010_000_002, "员工信息历史不存在");
 
 }

+ 18 - 6
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/api/employeeinfo/EmployeeApiImpl.java

@@ -1,14 +1,17 @@
-package cn.iocoder.yudao.module.employee.api.employeeinfo;
+package cn.iocoder.yudao.module.employee.api.info;
 
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.employee.api.EmployeeApi;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeCreateReqDTO;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeePageReqDTO;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeQueryReqDTO;
 import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.EmployeeInfoQueryReqVO;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.EmployeeInfoSaveReqVO;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeInfoDO;
-import cn.iocoder.yudao.module.employee.service.employeeinfo.EmployeeInfoService;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoPageReqVO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoQueryReqVO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoSaveReqVO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoService;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -16,7 +19,7 @@ import javax.annotation.Resource;
 /**
  * 员工 API 实现类
  *
- * @author 芋道源码
+ * @author zhaopq
  */
 @Service
 public class EmployeeApiImpl implements EmployeeApi {
@@ -38,4 +41,13 @@ public class EmployeeApiImpl implements EmployeeApi {
         return respDTO;
     }
 
+    @Override
+    public PageResult<EmployeeRespDTO> getEmployeePage(EmployeePageReqDTO reqDTO) {
+        EmployeeInfoPageReqVO pageReqVO = BeanUtils.toBean(reqDTO, EmployeeInfoPageReqVO.class);
+        PageResult<EmployeeInfoDO> pageResult = infoService.getInfoPage(pageReqVO);
+        PageResult<EmployeeRespDTO> respDTO = BeanUtils.toBean(pageResult, EmployeeRespDTO.class);
+        return respDTO;
+    }
+
+
 }

+ 0 - 59
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeContractInfoRespVO.java

@@ -1,59 +0,0 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import com.alibaba.excel.annotation.*;
-
-@Schema(description = "管理后台 - 员工合同信息 Response VO")
-@Data
-@ExcelIgnoreUnannotated
-public class EmployeeContractInfoRespVO {
-
-    @Schema(description = "合同ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4905")
-    @ExcelProperty("合同ID")
-    private Long id;
-
-    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8684")
-    @ExcelProperty("业务UUID")
-    private String infoId;
-
-    @Schema(description = "合同编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("合同编号,唯一")
-    private String contractNumber;
-
-    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19556")
-    @ExcelProperty("员工ID")
-    private String employeeId;
-
-    @Schema(description = "合同开始日期", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("合同开始日期")
-    private LocalDate contractStartDate;
-
-    @Schema(description = "合同结束日期")
-    @ExcelProperty("合同结束日期")
-    private LocalDate contractEndDate;
-
-    @Schema(description = "工作内容")
-    @ExcelProperty("工作内容")
-    private String jobContent;
-
-    @Schema(description = "合同状态", example = "1")
-    @ExcelProperty("合同状态")
-    private String contractStatus;
-
-    @Schema(description = "备注信息")
-    @ExcelProperty("备注信息")
-    private String remarks;
-
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    @ExcelProperty("状态")
-    private Integer status;
-
-    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("创建时间")
-    private LocalDateTime createTime;
-
-}

+ 0 - 49
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeContractInfoSaveReqVO.java

@@ -1,49 +0,0 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-
-import javax.validation.constraints.NotEmpty;
-import javax.validation.constraints.NotNull;
-import java.time.LocalDate;
-
-@Schema(description = "管理后台 - 员工合同信息新增/修改 Request VO")
-@Data
-public class EmployeeContractInfoSaveReqVO {
-
-    @Schema(description = "合同ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4905")
-    private Long id;
-
-    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8684")
-    @NotEmpty(message = "业务UUID不能为空")
-    private String infoId;
-
-    @Schema(description = "合同编号,唯一", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotEmpty(message = "合同编号,唯一不能为空")
-    private String contractNumber;
-
-    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19556")
-    @NotEmpty(message = "员工ID不能为空")
-    private String employeeId;
-
-    @Schema(description = "合同开始日期", requiredMode = Schema.RequiredMode.REQUIRED)
-    @NotNull(message = "合同开始日期不能为空")
-    private LocalDate contractStartDate;
-
-    @Schema(description = "合同结束日期")
-    private LocalDate contractEndDate;
-
-    @Schema(description = "工作内容")
-    private String jobContent;
-
-    @Schema(description = "合同状态", example = "1")
-    private String contractStatus;
-
-    @Schema(description = "备注信息")
-    private String remarks;
-
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    @NotNull(message = "状态不能为空")
-    private Integer status;
-
-}

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

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo;
+package cn.iocoder.yudao.module.employee.controller.admin.info;
 
 
 import java.util.*;
@@ -11,9 +11,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.*;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeInfoDO;
-import cn.iocoder.yudao.module.employee.service.employeeinfo.EmployeeInfoService;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -39,7 +39,7 @@ public class EmployeeInfoController {
 
     @PostMapping("/create")
     @Operation(summary = "创建员工信息")
-//    @PreAuthorize("@ss.hasPermission('employee:info:create')")
+    @PreAuthorize("@ss.hasPermission('employee:info:create')")
     public CommonResult<Long> createInfo(@Valid @RequestBody EmployeeInfoSaveReqVO createReqVO) {
         return success(infoService.createInfo(createReqVO));
     }

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

@@ -0,0 +1,98 @@
+package cn.iocoder.yudao.module.employee.controller.admin.info;
+
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoHistoryPageReqVO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoHistoryRespVO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoHistorySaveReqVO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoHistoryDO;
+import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoHistoryService;
+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("/presonnel/employee/history")
+@Validated
+public class EmployeeInfoHistoryController {
+
+    @Resource
+    private EmployeeInfoHistoryService infoHistoryService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建员工信息历史")
+    @PreAuthorize("@ss.hasPermission('employee:info-history:create')")
+    public CommonResult<Long> createInfoHistory(@Valid @RequestBody EmployeeInfoHistorySaveReqVO createReqVO) {
+        return success(infoHistoryService.createInfoHistory(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新员工信息历史")
+    @PreAuthorize("@ss.hasPermission('employee:info-history:update')")
+    public CommonResult<Boolean> updateInfoHistory(@Valid @RequestBody EmployeeInfoHistorySaveReqVO updateReqVO) {
+        infoHistoryService.updateInfoHistory(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除员工信息历史")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('employee:info-history:delete')")
+    public CommonResult<Boolean> deleteInfoHistory(@RequestParam("id") Long id) {
+        infoHistoryService.deleteInfoHistory(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得员工信息历史")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('employee:info:query')")
+    public CommonResult<EmployeeInfoHistoryRespVO> getInfoHistory(@RequestParam("id") Long id) {
+        EmployeeInfoHistoryDO infoHistory = infoHistoryService.getInfoHistory(id);
+        return success(BeanUtils.toBean(infoHistory, EmployeeInfoHistoryRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得员工信息历史分页")
+    @PreAuthorize("@ss.hasPermission('employee:info:query')")
+    public CommonResult<PageResult<EmployeeInfoHistoryRespVO>> getInfoHistoryPage(@Valid EmployeeInfoHistoryPageReqVO pageReqVO) {
+        PageResult<EmployeeInfoHistoryDO> pageResult = infoHistoryService.getInfoHistoryPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, EmployeeInfoHistoryRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出员工信息历史 Excel")
+    @PreAuthorize("@ss.hasPermission('employee:info-history:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportInfoHistoryExcel(@Valid EmployeeInfoHistoryPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<EmployeeInfoHistoryDO> list = infoHistoryService.getInfoHistoryPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "员工信息历史.xls", "数据", EmployeeInfoHistoryRespVO.class,
+                        BeanUtils.toBean(list, EmployeeInfoHistoryRespVO.class));
+    }
+
+}

+ 61 - 41
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoPageReqVO.java

@@ -1,8 +1,9 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo;
+package cn.iocoder.yudao.module.employee.controller.admin.info.vo;
 
 import lombok.*;
 
 import java.time.LocalDate;
+
 import io.swagger.v3.oas.annotations.media.Schema;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import java.math.BigDecimal;
@@ -11,38 +12,32 @@ 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")
+@Schema(description = "管理后台 - 员工信息历史分页 Request VO")
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
-public class EmployeeInfoPageReqVO extends PageParam {
+public class EmployeeInfoHistoryPageReqVO extends PageParam {
 
-    @Schema(description = "业务UUID", example = "19517")
+    @Schema(description = "业务UUID", example = "4007")
     private String infoId;
 
-    @Schema(description = "员工编号")
-    private String employeeNumber;
-
     @Schema(description = "姓名", example = "李四")
     private String name;
 
-    @Schema(description = "部门ID", example = "17351")
+    @Schema(description = "部门ID", example = "18657")
     private Long deptId;
 
-    @Schema(description = "手机号")
-    private String phone;
-
-    @Schema(description = "头像地址")
-    private String avatar;
+    @Schema(description = "部门名称", example = "李四")
+    private String deptName;
 
-    @Schema(description = "电子邮箱")
-    private String email;
+    @Schema(description = "职位编号", example = "1434")
+    private Long postId;
 
-    @Schema(description = "职位")
+    @Schema(description = "职位名称")
     private String position;
 
-    @Schema(description = "职位编号", example = "7080")
-    private Long postId;
+    @Schema(description = "员工编号")
+    private String employeeNumber;
 
     @Schema(description = "入职时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@@ -52,21 +47,24 @@ public class EmployeeInfoPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDate[] probationEndDate;
 
-    @Schema(description = "工作地点")
-    private String workLocation;
+    @Schema(description = "离职时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] departureDate;
+
+    @Schema(description = "离职原因", example = "不喜欢")
+    private String resignationReason;
 
     @Schema(description = "员工状态", example = "2")
-    private Integer employeeStatus;
+    private String employeeStatus;
 
     @Schema(description = "性别")
     private String gender;
 
-    @Schema(description = "出生日期")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDate[] birthDate;
+    @Schema(description = "电子邮箱")
+    private String email;
 
-    @Schema(description = "婚姻状况", example = "1")
-    private String marriageStatus;
+    @Schema(description = "手机号")
+    private String phone;
 
     @Schema(description = "身份证号")
     private String idCardNumber;
@@ -80,12 +78,9 @@ public class EmployeeInfoPageReqVO extends PageParam {
     @Schema(description = "户口所在地")
     private String householdLocation;
 
-    @Schema(description = "学历")
+    @Schema(description = "最高学历")
     private String educationLevel;
 
-    @Schema(description = "专业")
-    private String major;
-
     @Schema(description = "毕业院校")
     private String graduationSchool;
 
@@ -93,18 +88,37 @@ public class EmployeeInfoPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDate[] graduationDate;
 
-    @Schema(description = "参加工作时间")
+    @Schema(description = "银行卡名称", example = "张三")
+    private String bankCardName;
+
+    @Schema(description = "银行卡卡号")
+    private String bankCardNumber;
+
+    @Schema(description = "年假基准天数")
+    private Integer baseAnnualLeave;
+
+    @Schema(description = "已使用年假天数")
+    private Integer usedAnnualLeave;
+
+    @Schema(description = "剩余年假天数")
+    private Integer remainingAnnualLeave;
+
+    @Schema(description = "出生日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDate[] workStartDate;
+    private LocalDate[] birthDate;
 
-    @Schema(description = "年假天数")
-    private Integer annualLeaveDays;
+    @Schema(description = "婚姻状况", example = "1")
+    private String marriageStatus;
 
-    @Schema(description = "工资卡银行")
-    private String salaryBank;
+    @Schema(description = "工作地点")
+    private String workLocation;
 
-    @Schema(description = "工资卡号")
-    private String salaryCardNumber;
+    @Schema(description = "专业")
+    private String major;
+
+    @Schema(description = "参加工作时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] workStartDate;
 
     @Schema(description = "薪酬")
     private BigDecimal salary;
@@ -133,17 +147,23 @@ public class EmployeeInfoPageReqVO extends PageParam {
     @Schema(description = "年终奖")
     private BigDecimal yearEndBonus;
 
-    @Schema(description = "状态", example = "1")
+    @Schema(description = "头像地址")
+    private String avatar;
+
+    @Schema(description = "状态", example = "2")
     private Integer status;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
-    @Schema(description = "租户编码", example = "14244")
+    @Schema(description = "租户编号", example = "10115")
     private Long tenantId;
 
-    @Schema(description = "用户ID", example = "14244")
+    @Schema(description = "用户ID", example = "4877")
     private Long userId;
 
+    @Schema(description = "关联员工ID", example = "4352")
+    private Long employeeId;
+
 }

+ 208 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoHistoryRespVO.java

@@ -0,0 +1,208 @@
+package cn.iocoder.yudao.module.employee.controller.admin.info.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDate;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 员工信息历史 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class EmployeeInfoHistoryRespVO {
+
+    @Schema(description = "自增ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14132")
+    @ExcelProperty("自增ID")
+    private Long id;
+
+    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4007")
+    @ExcelProperty("业务UUID")
+    private String infoId;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @ExcelProperty("姓名")
+    private String name;
+
+    @Schema(description = "部门ID", example = "18657")
+    @ExcelProperty("部门ID")
+    private Long deptId;
+
+    @Schema(description = "部门名称", example = "李四")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
+    @Schema(description = "职位编号", example = "1434")
+    @ExcelProperty("职位编号")
+    private Long postId;
+
+    @Schema(description = "职位名称")
+    @ExcelProperty("职位名称")
+    private String position;
+
+    @Schema(description = "员工编号")
+    @ExcelProperty("员工编号")
+    private String employeeNumber;
+
+    @Schema(description = "入职时间")
+    @ExcelProperty("入职时间")
+    private LocalDate entryDate;
+
+    @Schema(description = "试用期到期时间")
+    @ExcelProperty("试用期到期时间")
+    private LocalDate probationEndDate;
+
+    @Schema(description = "离职时间")
+    @ExcelProperty("离职时间")
+    private LocalDate departureDate;
+
+    @Schema(description = "离职原因", example = "不喜欢")
+    @ExcelProperty("离职原因")
+    private String resignationReason;
+
+    @Schema(description = "员工状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("员工状态")
+    private String employeeStatus;
+
+    @Schema(description = "性别")
+    @ExcelProperty("性别")
+    private String gender;
+
+    @Schema(description = "电子邮箱")
+    @ExcelProperty("电子邮箱")
+    private String email;
+
+    @Schema(description = "手机号")
+    @ExcelProperty("手机号")
+    private String phone;
+
+    @Schema(description = "身份证号")
+    @ExcelProperty("身份证号")
+    private String idCardNumber;
+
+    @Schema(description = "身份证地址")
+    @ExcelProperty("身份证地址")
+    private String idCardAddress;
+
+    @Schema(description = "户口类型", example = "1")
+    @ExcelProperty("户口类型")
+    private String householdType;
+
+    @Schema(description = "户口所在地")
+    @ExcelProperty("户口所在地")
+    private String householdLocation;
+
+    @Schema(description = "最高学历")
+    @ExcelProperty("最高学历")
+    private String educationLevel;
+
+    @Schema(description = "毕业院校")
+    @ExcelProperty("毕业院校")
+    private String graduationSchool;
+
+    @Schema(description = "毕业时间")
+    @ExcelProperty("毕业时间")
+    private LocalDate graduationDate;
+
+    @Schema(description = "银行卡名称", example = "张三")
+    @ExcelProperty("银行卡名称")
+    private String bankCardName;
+
+    @Schema(description = "银行卡卡号")
+    @ExcelProperty("银行卡卡号")
+    private String bankCardNumber;
+
+    @Schema(description = "年假基准天数")
+    @ExcelProperty("年假基准天数")
+    private Integer baseAnnualLeave;
+
+    @Schema(description = "已使用年假天数")
+    @ExcelProperty("已使用年假天数")
+    private Integer usedAnnualLeave;
+
+    @Schema(description = "剩余年假天数")
+    @ExcelProperty("剩余年假天数")
+    private Integer remainingAnnualLeave;
+
+    @Schema(description = "出生日期")
+    @ExcelProperty("出生日期")
+    private LocalDate birthDate;
+
+    @Schema(description = "婚姻状况", example = "1")
+    @ExcelProperty("婚姻状况")
+    private String marriageStatus;
+
+    @Schema(description = "工作地点")
+    @ExcelProperty("工作地点")
+    private String workLocation;
+
+    @Schema(description = "专业")
+    @ExcelProperty("专业")
+    private String major;
+
+    @Schema(description = "参加工作时间")
+    @ExcelProperty("参加工作时间")
+    private LocalDate workStartDate;
+
+    @Schema(description = "薪酬")
+    @ExcelProperty("薪酬")
+    private BigDecimal salary;
+
+    @Schema(description = "岗位薪资")
+    @ExcelProperty("岗位薪资")
+    private BigDecimal positionSalary;
+
+    @Schema(description = "项目津贴")
+    @ExcelProperty("项目津贴")
+    private BigDecimal projectAllowance;
+
+    @Schema(description = "特殊岗位津贴")
+    @ExcelProperty("特殊岗位津贴")
+    private BigDecimal specialPositionAllowance;
+
+    @Schema(description = "外籍津贴")
+    @ExcelProperty("外籍津贴")
+    private BigDecimal foreignAllowance;
+
+    @Schema(description = "午餐补助")
+    @ExcelProperty("午餐补助")
+    private BigDecimal lunchSubsidy;
+
+    @Schema(description = "特别津贴")
+    @ExcelProperty("特别津贴")
+    private BigDecimal specialAllowance;
+
+    @Schema(description = "补贴")
+    @ExcelProperty("补贴")
+    private BigDecimal subsidy;
+
+    @Schema(description = "年终奖")
+    @ExcelProperty("年终奖")
+    private BigDecimal yearEndBonus;
+
+    @Schema(description = "头像地址")
+    @ExcelProperty("头像地址")
+    private String avatar;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10115")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+    @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4877")
+    @ExcelProperty("用户ID")
+    private Long userId;
+
+    @Schema(description = "关联员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4352")
+    @ExcelProperty("关联员工ID")
+    private Long employeeId;
+
+}

+ 164 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoHistorySaveReqVO.java

@@ -0,0 +1,164 @@
+package cn.iocoder.yudao.module.employee.controller.admin.info.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Schema(description = "管理后台 - 员工信息历史新增/修改 Request VO")
+@Data
+public class EmployeeInfoHistorySaveReqVO {
+
+    @Schema(description = "自增ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14132")
+    private Long id;
+
+    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4007")
+    @NotEmpty(message = "业务UUID不能为空")
+    private String infoId;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @NotEmpty(message = "姓名不能为空")
+    private String name;
+
+    @Schema(description = "部门ID", example = "18657")
+    private Long deptId;
+
+    @Schema(description = "部门名称", example = "李四")
+    private String deptName;
+
+    @Schema(description = "职位编号", example = "1434")
+    private Long postId;
+
+    @Schema(description = "职位名称")
+    private String position;
+
+    @Schema(description = "员工编号")
+    private String employeeNumber;
+
+    @Schema(description = "入职时间")
+    private LocalDate entryDate;
+
+    @Schema(description = "试用期到期时间")
+    private LocalDate probationEndDate;
+
+    @Schema(description = "离职时间")
+    private LocalDate departureDate;
+
+    @Schema(description = "离职原因", example = "不喜欢")
+    private String resignationReason;
+
+    @Schema(description = "员工状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotEmpty(message = "员工状态不能为空")
+    private String employeeStatus;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "手机号")
+    private String phone;
+
+    @Schema(description = "身份证号")
+    private String idCardNumber;
+
+    @Schema(description = "身份证地址")
+    private String idCardAddress;
+
+    @Schema(description = "户口类型", example = "1")
+    private String householdType;
+
+    @Schema(description = "户口所在地")
+    private String householdLocation;
+
+    @Schema(description = "最高学历")
+    private String educationLevel;
+
+    @Schema(description = "毕业院校")
+    private String graduationSchool;
+
+    @Schema(description = "毕业时间")
+    private LocalDate graduationDate;
+
+    @Schema(description = "银行卡名称", example = "张三")
+    private String bankCardName;
+
+    @Schema(description = "银行卡卡号")
+    private String bankCardNumber;
+
+    @Schema(description = "年假基准天数")
+    private Integer baseAnnualLeave;
+
+    @Schema(description = "已使用年假天数")
+    private Integer usedAnnualLeave;
+
+    @Schema(description = "剩余年假天数")
+    private Integer remainingAnnualLeave;
+
+    @Schema(description = "出生日期")
+    private LocalDate birthDate;
+
+    @Schema(description = "婚姻状况", example = "1")
+    private String marriageStatus;
+
+    @Schema(description = "工作地点")
+    private String workLocation;
+
+    @Schema(description = "专业")
+    private String major;
+
+    @Schema(description = "参加工作时间")
+    private LocalDate workStartDate;
+
+    @Schema(description = "薪酬")
+    private BigDecimal salary;
+
+    @Schema(description = "岗位薪资")
+    private BigDecimal positionSalary;
+
+    @Schema(description = "项目津贴")
+    private BigDecimal projectAllowance;
+
+    @Schema(description = "特殊岗位津贴")
+    private BigDecimal specialPositionAllowance;
+
+    @Schema(description = "外籍津贴")
+    private BigDecimal foreignAllowance;
+
+    @Schema(description = "午餐补助")
+    private BigDecimal lunchSubsidy;
+
+    @Schema(description = "特别津贴")
+    private BigDecimal specialAllowance;
+
+    @Schema(description = "补贴")
+    private BigDecimal subsidy;
+
+    @Schema(description = "年终奖")
+    private BigDecimal yearEndBonus;
+
+    @Schema(description = "头像地址")
+    private String avatar;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10115")
+    @NotNull(message = "租户编号不能为空")
+    private Long tenantId;
+
+    @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4877")
+    @NotNull(message = "用户ID不能为空")
+    private Long userId;
+
+    @Schema(description = "关联员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4352")
+    @NotNull(message = "关联员工ID不能为空")
+    private Long employeeId;
+
+}

+ 166 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoPageReqVO.java

@@ -0,0 +1,166 @@
+package cn.iocoder.yudao.module.employee.controller.admin.info.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.*;
+
+import java.time.LocalDate;
+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 EmployeeInfoPageReqVO extends PageParam {
+
+    @Schema(description = "业务UUID", example = "1987")
+    private String infoId;
+
+    @Schema(description = "姓名", example = "赵六")
+    private String name;
+
+    @Schema(description = "部门ID", example = "22378")
+    private Long deptId;
+
+    @Schema(description = "部门名称", example = "芋艿")
+    private String deptName;
+
+    @Schema(description = "职位编号", example = "1056")
+    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[] entryDate;
+
+    @Schema(description = "试用期到期时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] probationEndDate;
+
+    @Schema(description = "离职时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] departureDate;
+
+    @Schema(description = "离职原因", example = "不香")
+    private String resignationReason;
+
+    @Schema(description = "员工状态", example = "2")
+    private String employeeStatus;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "手机号")
+    private String phone;
+
+    @Schema(description = "身份证号")
+    private String idCardNumber;
+
+    @Schema(description = "身份证地址")
+    private String idCardAddress;
+
+    @Schema(description = "户口类型", example = "2")
+    private String householdType;
+
+    @Schema(description = "户口所在地")
+    private String householdLocation;
+
+    @Schema(description = "最高学历")
+    private String educationLevel;
+
+    @Schema(description = "毕业院校")
+    private String graduationSchool;
+
+    @Schema(description = "毕业时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] graduationDate;
+
+    @Schema(description = "银行卡名称", example = "张三")
+    private String bankCardName;
+
+    @Schema(description = "银行卡卡号")
+    private String bankCardNumber;
+
+    @Schema(description = "年假基准天数")
+    private Integer baseAnnualLeave;
+
+    @Schema(description = "已使用年假天数")
+    private Integer usedAnnualLeave;
+
+    @Schema(description = "剩余年假天数")
+    private Integer remainingAnnualLeave;
+
+    @Schema(description = "出生日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] birthDate;
+
+    @Schema(description = "婚姻状况", example = "2")
+    private String marriageStatus;
+
+    @Schema(description = "工作地点")
+    private String workLocation;
+
+    @Schema(description = "专业")
+    private String major;
+
+    @Schema(description = "参加工作时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] workStartDate;
+
+    @Schema(description = "薪酬")
+    private BigDecimal salary;
+
+    @Schema(description = "岗位薪资")
+    private BigDecimal positionSalary;
+
+    @Schema(description = "项目津贴")
+    private BigDecimal projectAllowance;
+
+    @Schema(description = "特殊岗位津贴")
+    private BigDecimal specialPositionAllowance;
+
+    @Schema(description = "外籍津贴")
+    private BigDecimal foreignAllowance;
+
+    @Schema(description = "午餐补助")
+    private BigDecimal lunchSubsidy;
+
+    @Schema(description = "特别津贴")
+    private BigDecimal specialAllowance;
+
+    @Schema(description = "补贴")
+    private BigDecimal subsidy;
+
+    @Schema(description = "年终奖")
+    private BigDecimal yearEndBonus;
+
+    @Schema(description = "头像地址")
+    private String avatar;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "27933")
+    private Long tenantId;
+
+    @Schema(description = "用户ID", example = "12259")
+    private Long userId;
+
+}

+ 55 - 39
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoQueryReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo;
+package cn.iocoder.yudao.module.employee.controller.admin.info.vo;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import io.swagger.v3.oas.annotations.media.Schema;
@@ -19,32 +19,26 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @ToString(callSuper = true)
 public class EmployeeInfoQueryReqVO extends PageParam {
 
-    @Schema(description = "业务UUID", example = "19517")
+    @Schema(description = "业务UUID", example = "4007")
     private String infoId;
 
-    @Schema(description = "员工编号")
-    private String employeeNumber;
-
     @Schema(description = "姓名", example = "李四")
     private String name;
 
-    @Schema(description = "部门ID", example = "17351")
+    @Schema(description = "部门ID", example = "18657")
     private Long deptId;
 
-    @Schema(description = "手机号")
-    private String phone;
+    @Schema(description = "部门名称", example = "李四")
+    private String deptName;
 
-    @Schema(description = "头像地址")
-    private String avatar;
-
-    @Schema(description = "电子邮箱")
-    private String email;
+    @Schema(description = "职位编号", example = "1434")
+    private Long postId;
 
-    @Schema(description = "职位")
+    @Schema(description = "职位名称")
     private String position;
 
-    @Schema(description = "职位编号", example = "7080")
-    private Long postId;
+    @Schema(description = "员工编号")
+    private String employeeNumber;
 
     @Schema(description = "入职时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@@ -54,21 +48,24 @@ public class EmployeeInfoQueryReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDate[] probationEndDate;
 
-    @Schema(description = "工作地点")
-    private String workLocation;
+    @Schema(description = "离职时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] departureDate;
+
+    @Schema(description = "离职原因", example = "不喜欢")
+    private String resignationReason;
 
     @Schema(description = "员工状态", example = "2")
-    private Integer employeeStatus;
+    private String employeeStatus;
 
     @Schema(description = "性别")
     private String gender;
 
-    @Schema(description = "出生日期")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDate[] birthDate;
+    @Schema(description = "电子邮箱")
+    private String email;
 
-    @Schema(description = "婚姻状况", example = "1")
-    private String marriageStatus;
+    @Schema(description = "手机号")
+    private String phone;
 
     @Schema(description = "身份证号")
     private String idCardNumber;
@@ -82,12 +79,9 @@ public class EmployeeInfoQueryReqVO extends PageParam {
     @Schema(description = "户口所在地")
     private String householdLocation;
 
-    @Schema(description = "学历")
+    @Schema(description = "最高学历")
     private String educationLevel;
 
-    @Schema(description = "专业")
-    private String major;
-
     @Schema(description = "毕业院校")
     private String graduationSchool;
 
@@ -95,18 +89,37 @@ public class EmployeeInfoQueryReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDate[] graduationDate;
 
-    @Schema(description = "参加工作时间")
+    @Schema(description = "银行卡名称", example = "张三")
+    private String bankCardName;
+
+    @Schema(description = "银行卡卡号")
+    private String bankCardNumber;
+
+    @Schema(description = "年假基准天数")
+    private Integer baseAnnualLeave;
+
+    @Schema(description = "已使用年假天数")
+    private Integer usedAnnualLeave;
+
+    @Schema(description = "剩余年假天数")
+    private Integer remainingAnnualLeave;
+
+    @Schema(description = "出生日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalDate[] workStartDate;
+    private LocalDate[] birthDate;
 
-    @Schema(description = "年假天数")
-    private Integer annualLeaveDays;
+    @Schema(description = "婚姻状况", example = "1")
+    private String marriageStatus;
 
-    @Schema(description = "工资卡银行")
-    private String salaryBank;
+    @Schema(description = "工作地点")
+    private String workLocation;
 
-    @Schema(description = "工资卡号")
-    private String salaryCardNumber;
+    @Schema(description = "专业")
+    private String major;
+
+    @Schema(description = "参加工作时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] workStartDate;
 
     @Schema(description = "薪酬")
     private BigDecimal salary;
@@ -135,17 +148,20 @@ public class EmployeeInfoQueryReqVO extends PageParam {
     @Schema(description = "年终奖")
     private BigDecimal yearEndBonus;
 
-    @Schema(description = "状态", example = "1")
+    @Schema(description = "头像地址")
+    private String avatar;
+
+    @Schema(description = "状态", example = "2")
     private Integer status;
 
     @Schema(description = "创建时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
-    @Schema(description = "租户编码", example = "14244")
+    @Schema(description = "租户编号", example = "10115")
     private Long tenantId;
 
-    @Schema(description = "用户ID", example = "14244")
+    @Schema(description = "用户ID", example = "4877")
     private Long userId;
 
 }

+ 78 - 58
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoRespVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo;
+package cn.iocoder.yudao.module.employee.controller.admin.info.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -12,47 +12,39 @@ import com.alibaba.excel.annotation.*;
 @ExcelIgnoreUnannotated
 public class EmployeeInfoRespVO {
 
-    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20870")
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10984")
     @ExcelProperty("员工ID")
     private Long id;
 
-    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19517")
+    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1987")
     @ExcelProperty("业务UUID")
     private String infoId;
 
-    @Schema(description = "员工编号", requiredMode = Schema.RequiredMode.REQUIRED)
-    @ExcelProperty("员工编号")
-    private String employeeNumber;
-
-    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
     @ExcelProperty("姓名")
     private String name;
 
-    @Schema(description = "部门ID", example = "17351")
+    @Schema(description = "部门ID", example = "22378")
     @ExcelProperty("部门ID")
     private Long deptId;
 
-    @Schema(description = "手机号")
-    @ExcelProperty("手机号")
-    private String phone;
+    @Schema(description = "部门名称", example = "芋艿")
+    @ExcelProperty("部门名称")
+    private String deptName;
 
-    @Schema(description = "头像地址")
-    @ExcelProperty("头像地址")
-    private String avatar;
-
-    @Schema(description = "电子邮箱")
-    @ExcelProperty("电子邮箱")
-    private String email;
+    @Schema(description = "职位编号", example = "1056")
+    @ExcelProperty("职位编号")
+    private Long postId;
 
-    @Schema(description = "职位")
-    @ExcelProperty("职位")
+    @Schema(description = "职位名称")
+    @ExcelProperty("职位名称")
     private String position;
 
-    @Schema(description = "职位编号", example = "7080")
-    @ExcelProperty("职位编号")
-    private Long postId;
+    @Schema(description = "员工编号")
+    @ExcelProperty("员工编号")
+    private String employeeNumber;
 
-    @Schema(description = "入职时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "入职时间")
     @ExcelProperty("入职时间")
     private LocalDate entryDate;
 
@@ -60,25 +52,29 @@ public class EmployeeInfoRespVO {
     @ExcelProperty("试用期到期时间")
     private LocalDate probationEndDate;
 
-    @Schema(description = "工作地点")
-    @ExcelProperty("工作地点")
-    private String workLocation;
+    @Schema(description = "离职时间")
+    @ExcelProperty("离职时间")
+    private LocalDate departureDate;
+
+    @Schema(description = "离职原因", example = "不香")
+    @ExcelProperty("离职原因")
+    private String resignationReason;
 
     @Schema(description = "员工状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @ExcelProperty("员工状态")
-    private Integer employeeStatus;
+    private String employeeStatus;
 
     @Schema(description = "性别")
     @ExcelProperty("性别")
     private String gender;
 
-    @Schema(description = "出生日期")
-    @ExcelProperty("出生日期")
-    private LocalDate birthDate;
+    @Schema(description = "电子邮箱")
+    @ExcelProperty("电子邮箱")
+    private String email;
 
-    @Schema(description = "婚姻状况", example = "1")
-    @ExcelProperty("婚姻状况")
-    private String marriageStatus;
+    @Schema(description = "手机号")
+    @ExcelProperty("手机号")
+    private String phone;
 
     @Schema(description = "身份证号")
     @ExcelProperty("身份证号")
@@ -88,7 +84,7 @@ public class EmployeeInfoRespVO {
     @ExcelProperty("身份证地址")
     private String idCardAddress;
 
-    @Schema(description = "户口类型", example = "1")
+    @Schema(description = "户口类型", example = "2")
     @ExcelProperty("户口类型")
     private String householdType;
 
@@ -96,14 +92,10 @@ public class EmployeeInfoRespVO {
     @ExcelProperty("户口所在地")
     private String householdLocation;
 
-    @Schema(description = "学历")
-    @ExcelProperty("学历")
+    @Schema(description = "最高学历")
+    @ExcelProperty("最高学历")
     private String educationLevel;
 
-    @Schema(description = "专业")
-    @ExcelProperty("专业")
-    private String major;
-
     @Schema(description = "毕业院校")
     @ExcelProperty("毕业院校")
     private String graduationSchool;
@@ -112,21 +104,45 @@ public class EmployeeInfoRespVO {
     @ExcelProperty("毕业时间")
     private LocalDate graduationDate;
 
-    @Schema(description = "参加工作时间")
-    @ExcelProperty("参加工作时间")
-    private LocalDate workStartDate;
+    @Schema(description = "银行卡名称", example = "张三")
+    @ExcelProperty("银行卡名称")
+    private String bankCardName;
+
+    @Schema(description = "银行卡卡号")
+    @ExcelProperty("银行卡卡号")
+    private String bankCardNumber;
+
+    @Schema(description = "年假基准天数")
+    @ExcelProperty("年假基准天数")
+    private Integer baseAnnualLeave;
+
+    @Schema(description = "已使用年假天数")
+    @ExcelProperty("已使用年假天数")
+    private Integer usedAnnualLeave;
+
+    @Schema(description = "剩余年假天数")
+    @ExcelProperty("剩余年假天数")
+    private Integer remainingAnnualLeave;
+
+    @Schema(description = "出生日期")
+    @ExcelProperty("出生日期")
+    private LocalDate birthDate;
 
-    @Schema(description = "年假天数")
-    @ExcelProperty("年假天数")
-    private Integer annualLeaveDays;
+    @Schema(description = "婚姻状况", example = "2")
+    @ExcelProperty("婚姻状况")
+    private String marriageStatus;
+
+    @Schema(description = "工作地点")
+    @ExcelProperty("工作地点")
+    private String workLocation;
 
-    @Schema(description = "工资卡银行")
-    @ExcelProperty("工资卡银行")
-    private String salaryBank;
+    @Schema(description = "专业")
+    @ExcelProperty("专业")
+    private String major;
 
-    @Schema(description = "工资卡号")
-    @ExcelProperty("工资卡号")
-    private String salaryCardNumber;
+    @Schema(description = "参加工作时间")
+    @ExcelProperty("参加工作时间")
+    private LocalDate workStartDate;
 
     @Schema(description = "薪酬")
     @ExcelProperty("薪酬")
@@ -164,7 +180,11 @@ public class EmployeeInfoRespVO {
     @ExcelProperty("年终奖")
     private BigDecimal yearEndBonus;
 
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @Schema(description = "头像地址")
+    @ExcelProperty("头像地址")
+    private String avatar;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @ExcelProperty("状态")
     private Integer status;
 
@@ -172,11 +192,11 @@ public class EmployeeInfoRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
-    @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14244")
-    @ExcelProperty("租户编")
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27933")
+    @ExcelProperty("租户编")
     private Long tenantId;
 
-    @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14244")
+    @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12259")
     @ExcelProperty("用户ID")
     private Long userId;
 

+ 61 - 45
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeInfoSaveReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo;
+package cn.iocoder.yudao.module.employee.controller.admin.info.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
@@ -12,58 +12,56 @@ import java.time.LocalDate;
 @Data
 public class EmployeeInfoSaveReqVO {
 
-    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "20870")
+    @Schema(description = "员工ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10984")
     private Long id;
 
-    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "19517")
+    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1987")
+//    @NotEmpty(message = "业务UUID不能为空")
     private String infoId;
 
-    @Schema(description = "员工编号", requiredMode = Schema.RequiredMode.REQUIRED)
-    private String employeeNumber;
-
-    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "李四")
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
     @NotEmpty(message = "姓名不能为空")
     private String name;
 
-    @Schema(description = "部门ID", example = "17351")
+    @Schema(description = "部门ID", example = "22378")
     private Long deptId;
 
-    @Schema(description = "手机号")
-    private String phone;
-
-    @Schema(description = "头像地址")
-    private String avatar;
+    @Schema(description = "部门名称", example = "芋艿")
+    private String deptName;
 
-    @Schema(description = "电子邮箱")
-    private String email;
+    @Schema(description = "职位编号", example = "1056")
+    private Long postId;
 
-    @Schema(description = "职位")
+    @Schema(description = "职位名称")
     private String position;
 
-    @Schema(description = "职位编号", example = "7080")
-    private Long postId;
+    @Schema(description = "员工编号")
+    private String employeeNumber;
 
-    @Schema(description = "入职时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @Schema(description = "入职时间")
     private LocalDate entryDate;
 
     @Schema(description = "试用期到期时间")
     private LocalDate probationEndDate;
 
-    @Schema(description = "工作地点")
-    private String workLocation;
+    @Schema(description = "离职时间")
+    private LocalDate departureDate;
+
+    @Schema(description = "离职原因", example = "不香")
+    private String resignationReason;
 
     @Schema(description = "员工状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-//    @NotEmpty(message = "员工状态不能为空")
-    private Integer employeeStatus;
+    @NotEmpty(message = "员工状态不能为空")
+    private String employeeStatus;
 
     @Schema(description = "性别")
     private String gender;
 
-    @Schema(description = "出生日期")
-    private LocalDate birthDate;
+    @Schema(description = "电子邮箱")
+    private String email;
 
-    @Schema(description = "婚姻状况", example = "1")
-    private String marriageStatus;
+    @Schema(description = "手机号")
+    private String phone;
 
     @Schema(description = "身份证号")
     private String idCardNumber;
@@ -71,35 +69,50 @@ public class EmployeeInfoSaveReqVO {
     @Schema(description = "身份证地址")
     private String idCardAddress;
 
-    @Schema(description = "户口类型", example = "1")
+    @Schema(description = "户口类型", example = "2")
     private String householdType;
 
     @Schema(description = "户口所在地")
     private String householdLocation;
 
-    @Schema(description = "学历")
+    @Schema(description = "最高学历")
     private String educationLevel;
 
-    @Schema(description = "专业")
-    private String major;
-
     @Schema(description = "毕业院校")
     private String graduationSchool;
 
     @Schema(description = "毕业时间")
     private LocalDate graduationDate;
 
-    @Schema(description = "参加工作时间")
-    private LocalDate workStartDate;
+    @Schema(description = "银行卡名称", example = "张三")
+    private String bankCardName;
+
+    @Schema(description = "银行卡卡号")
+    private String bankCardNumber;
+
+    @Schema(description = "年假基准天数")
+    private Integer baseAnnualLeave;
+
+    @Schema(description = "已使用年假天数")
+    private Integer usedAnnualLeave;
+
+    @Schema(description = "剩余年假天数")
+    private Integer remainingAnnualLeave;
+
+    @Schema(description = "出生日期")
+    private LocalDate birthDate;
 
-    @Schema(description = "年假天数")
-    private Integer annualLeaveDays;
+    @Schema(description = "婚姻状况", example = "2")
+    private String marriageStatus;
 
-    @Schema(description = "工资卡银行")
-    private String salaryBank;
+    @Schema(description = "工作地点")
+    private String workLocation;
 
-    @Schema(description = "工资卡号")
-    private String salaryCardNumber;
+    @Schema(description = "专业")
+    private String major;
+
+    @Schema(description = "参加工作时间")
+    private LocalDate workStartDate;
 
     @Schema(description = "薪酬")
     private BigDecimal salary;
@@ -128,15 +141,18 @@ public class EmployeeInfoSaveReqVO {
     @Schema(description = "年终奖")
     private BigDecimal yearEndBonus;
 
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-//    @NotNull(message = "状态不能为空")
+    @Schema(description = "头像地址")
+    private String avatar;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotNull(message = "状态不能为空")
     private Integer status;
 
-    @Schema(description = "租户编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "14244")
-    @NotNull(message = "租户编不能为空")
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "27933")
+    @NotNull(message = "租户编不能为空")
     private Long tenantId;
 
-    @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14244")
+    @Schema(description = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "12259")
     @NotNull(message = "用户ID不能为空")
     private Long userId;
 

+ 0 - 69
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/dataobject/employeeinfo/EmployeeContractInfoDO.java

@@ -1,69 +0,0 @@
-package cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo;
-
-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 芋道源码
- */
-@TableName("employee_contract_info")
-@KeySequence("employee_contract_info_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-@Builder
-@NoArgsConstructor
-@AllArgsConstructor
-public class EmployeeContractInfoDO extends BaseDO {
-
-    /**
-     * 合同ID
-     */
-    @TableId
-    private Long id;
-    /**
-     * 业务UUID
-     */
-    private String infoId;
-    /**
-     * 合同编号,唯一
-     */
-    private String contractNumber;
-    /**
-     * 员工ID
-     */
-    private String employeeId;
-    /**
-     * 合同开始日期
-     */
-    private LocalDate contractStartDate;
-    /**
-     * 合同结束日期
-     */
-    private LocalDate contractEndDate;
-    /**
-     * 工作内容
-     */
-    private String jobContent;
-    /**
-     * 合同状态
-     */
-    private String contractStatus;
-    /**
-     * 备注信息
-     */
-    private String remarks;
-    /**
-     * 状态
-     */
-    private Integer status;
-
-}

+ 57 - 37
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/dataobject/employeeinfo/EmployeeInfoDO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo;
+package cn.iocoder.yudao.module.employee.dal.dataobject.info;
 
 import lombok.*;
 
@@ -31,10 +31,6 @@ public class EmployeeInfoDO extends BaseDO {
      * 业务UUID
      */
     private String infoId;
-    /**
-     * 员工编号
-     */
-    private String employeeNumber;
     /**
      * 姓名
      */
@@ -44,25 +40,21 @@ public class EmployeeInfoDO extends BaseDO {
      */
     private Long deptId;
     /**
-     * 手机号
-     */
-    private String phone;
-    /**
-     * 头像地址
+     * 部门名称
      */
-    private String avatar;
+    private String deptName;
     /**
-     * 电子邮箱
+     * 职位编号
      */
-    private String email;
+    private Long postId;
     /**
-     * 职位
+     * 职位名称
      */
     private String position;
     /**
-     * 职位编号
+     * 员工编号
      */
-    private Long postId;
+    private String employeeNumber;
     /**
      * 入职时间
      */
@@ -72,25 +64,29 @@ public class EmployeeInfoDO extends BaseDO {
      */
     private LocalDate probationEndDate;
     /**
-     * 工作地点
+     * 离职时间
      */
-    private String workLocation;
+    private LocalDate departureDate;
+    /**
+     * 离职原因
+     */
+    private String resignationReason;
     /**
      * 员工状态
      */
-    private Integer employeeStatus;
+    private String employeeStatus;
     /**
      * 性别
      */
     private String gender;
     /**
-     * 出生日期
+     * 电子邮箱
      */
-    private LocalDate birthDate;
+    private String email;
     /**
-     * 婚姻状况
+     * 手机号
      */
-    private String marriageStatus;
+    private String phone;
     /**
      * 身份证号
      */
@@ -108,13 +104,9 @@ public class EmployeeInfoDO extends BaseDO {
      */
     private String householdLocation;
     /**
-     * 学历
+     * 最高学历
      */
     private String educationLevel;
-    /**
-     * 专业
-     */
-    private String major;
     /**
      * 毕业院校
      */
@@ -124,21 +116,45 @@ public class EmployeeInfoDO extends BaseDO {
      */
     private LocalDate graduationDate;
     /**
-     * 参加工作时间
+     * 银行卡名称
      */
-    private LocalDate workStartDate;
+    private String bankCardName;
+    /**
+     * 银行卡卡号
+     */
+    private String bankCardNumber;
+    /**
+     * 年假基准天数
+     */
+    private Integer baseAnnualLeave;
+    /**
+     * 已使用年假天数
+     */
+    private Integer usedAnnualLeave;
     /**
-     * 年假天数
+     * 剩余年假天数
      */
-    private Integer annualLeaveDays;
+    private Integer remainingAnnualLeave;
     /**
-     * 工资卡银行
+     * 出生日期
      */
-    private String salaryBank;
+    private LocalDate birthDate;
     /**
-     * 工资卡号
+     * 婚姻状况
      */
-    private String salaryCardNumber;
+    private String marriageStatus;
+    /**
+     * 工作地点
+     */
+    private String workLocation;
+    /**
+     * 专业
+     */
+    private String major;
+    /**
+     * 参加工作时间
+     */
+    private LocalDate workStartDate;
     /**
      * 薪酬
      */
@@ -175,12 +191,16 @@ public class EmployeeInfoDO extends BaseDO {
      * 年终奖
      */
     private BigDecimal yearEndBonus;
+    /**
+     * 头像地址
+     */
+    private String avatar;
     /**
      * 状态
      */
     private Integer status;
     /**
-     * 租户编
+     * 租户编
      */
     private Long tenantId;
     /**

+ 216 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/dataobject/info/EmployeeInfoHistoryDO.java

@@ -0,0 +1,216 @@
+package cn.iocoder.yudao.module.employee.dal.dataobject.info;
+
+import lombok.*;
+
+import java.time.LocalDate;
+import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 员工信息历史 DO
+ *
+ * @author zhaopq
+ */
+@TableName("employee_info_history")
+@KeySequence("employee_info_history_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class EmployeeInfoHistoryDO 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 entryDate;
+    /**
+     * 试用期到期时间
+     */
+    private LocalDate probationEndDate;
+    /**
+     * 离职时间
+     */
+    private LocalDate departureDate;
+    /**
+     * 离职原因
+     */
+    private String resignationReason;
+    /**
+     * 员工状态
+     */
+    private String employeeStatus;
+    /**
+     * 性别
+     */
+    private String gender;
+    /**
+     * 电子邮箱
+     */
+    private String email;
+    /**
+     * 手机号
+     */
+    private String phone;
+    /**
+     * 身份证号
+     */
+    private String idCardNumber;
+    /**
+     * 身份证地址
+     */
+    private String idCardAddress;
+    /**
+     * 户口类型
+     */
+    private String householdType;
+    /**
+     * 户口所在地
+     */
+    private String householdLocation;
+    /**
+     * 最高学历
+     */
+    private String educationLevel;
+    /**
+     * 毕业院校
+     */
+    private String graduationSchool;
+    /**
+     * 毕业时间
+     */
+    private LocalDate graduationDate;
+    /**
+     * 银行卡名称
+     */
+    private String bankCardName;
+    /**
+     * 银行卡卡号
+     */
+    private String bankCardNumber;
+    /**
+     * 年假基准天数
+     */
+    private Integer baseAnnualLeave;
+    /**
+     * 已使用年假天数
+     */
+    private Integer usedAnnualLeave;
+    /**
+     * 剩余年假天数
+     */
+    private Integer remainingAnnualLeave;
+    /**
+     * 出生日期
+     */
+    private LocalDate birthDate;
+    /**
+     * 婚姻状况
+     */
+    private String marriageStatus;
+    /**
+     * 工作地点
+     */
+    private String workLocation;
+    /**
+     * 专业
+     */
+    private String major;
+    /**
+     * 参加工作时间
+     */
+    private LocalDate workStartDate;
+    /**
+     * 薪酬
+     */
+    private BigDecimal salary;
+    /**
+     * 岗位薪资
+     */
+    private BigDecimal positionSalary;
+    /**
+     * 项目津贴
+     */
+    private BigDecimal projectAllowance;
+    /**
+     * 特殊岗位津贴
+     */
+    private BigDecimal specialPositionAllowance;
+    /**
+     * 外籍津贴
+     */
+    private BigDecimal foreignAllowance;
+    /**
+     * 午餐补助
+     */
+    private BigDecimal lunchSubsidy;
+    /**
+     * 特别津贴
+     */
+    private BigDecimal specialAllowance;
+    /**
+     * 补贴
+     */
+    private BigDecimal subsidy;
+    /**
+     * 年终奖
+     */
+    private BigDecimal yearEndBonus;
+    /**
+     * 头像地址
+     */
+    private String avatar;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
+    /**
+     * 用户ID
+     */
+    private Long userId;
+    /**
+     * 关联员工ID
+     */
+    private Long employeeId;
+
+}

+ 0 - 33
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/mysql/employeeinfo/EmployeeContractInfoMapper.java

@@ -1,33 +0,0 @@
-package cn.iocoder.yudao.module.employee.dal.mysql.employeeinfo;
-
-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.employee.controller.admin.employeeinfo.vo.EmployeeContractInfoPageReqVO;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeContractInfoDO;
-import org.apache.ibatis.annotations.Mapper;
-
-/**
- * 员工合同信息 Mapper
- *
- * @author 芋道源码
- */
-@Mapper
-public interface EmployeeContractInfoMapper extends BaseMapperX<EmployeeContractInfoDO> {
-
-    default PageResult<EmployeeContractInfoDO> selectPage(EmployeeContractInfoPageReqVO reqVO) {
-        return selectPage(reqVO, new LambdaQueryWrapperX<EmployeeContractInfoDO>()
-                .eqIfPresent(EmployeeContractInfoDO::getInfoId, reqVO.getInfoId())
-                .eqIfPresent(EmployeeContractInfoDO::getContractNumber, reqVO.getContractNumber())
-                .eqIfPresent(EmployeeContractInfoDO::getEmployeeId, reqVO.getEmployeeId())
-                .betweenIfPresent(EmployeeContractInfoDO::getContractStartDate, reqVO.getContractStartDate())
-                .betweenIfPresent(EmployeeContractInfoDO::getContractEndDate, reqVO.getContractEndDate())
-                .eqIfPresent(EmployeeContractInfoDO::getJobContent, reqVO.getJobContent())
-                .eqIfPresent(EmployeeContractInfoDO::getContractStatus, reqVO.getContractStatus())
-                .eqIfPresent(EmployeeContractInfoDO::getRemarks, reqVO.getRemarks())
-                .eqIfPresent(EmployeeContractInfoDO::getStatus, reqVO.getStatus())
-                .betweenIfPresent(EmployeeContractInfoDO::getCreateTime, reqVO.getCreateTime())
-                .orderByDesc(EmployeeContractInfoDO::getId));
-    }
-
-}

+ 70 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/mysql/info/EmployeeInfoHistoryMapper.java

@@ -0,0 +1,70 @@
+package cn.iocoder.yudao.module.employee.dal.mysql.info;
+
+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.employee.controller.admin.info.vo.EmployeeInfoHistoryPageReqVO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoHistoryDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 员工信息历史 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface EmployeeInfoHistoryMapper extends BaseMapperX<EmployeeInfoHistoryDO> {
+
+    default PageResult<EmployeeInfoHistoryDO> selectPage(EmployeeInfoHistoryPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<EmployeeInfoHistoryDO>()
+                .eqIfPresent(EmployeeInfoHistoryDO::getInfoId, reqVO.getInfoId())
+                .likeIfPresent(EmployeeInfoHistoryDO::getName, reqVO.getName())
+                .eqIfPresent(EmployeeInfoHistoryDO::getDeptId, reqVO.getDeptId())
+                .likeIfPresent(EmployeeInfoHistoryDO::getDeptName, reqVO.getDeptName())
+                .eqIfPresent(EmployeeInfoHistoryDO::getPostId, reqVO.getPostId())
+                .eqIfPresent(EmployeeInfoHistoryDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(EmployeeInfoHistoryDO::getEmployeeNumber, reqVO.getEmployeeNumber())
+                .betweenIfPresent(EmployeeInfoHistoryDO::getEntryDate, reqVO.getEntryDate())
+                .betweenIfPresent(EmployeeInfoHistoryDO::getProbationEndDate, reqVO.getProbationEndDate())
+                .betweenIfPresent(EmployeeInfoHistoryDO::getDepartureDate, reqVO.getDepartureDate())
+                .eqIfPresent(EmployeeInfoHistoryDO::getResignationReason, reqVO.getResignationReason())
+                .eqIfPresent(EmployeeInfoHistoryDO::getEmployeeStatus, reqVO.getEmployeeStatus())
+                .eqIfPresent(EmployeeInfoHistoryDO::getGender, reqVO.getGender())
+                .eqIfPresent(EmployeeInfoHistoryDO::getEmail, reqVO.getEmail())
+                .eqIfPresent(EmployeeInfoHistoryDO::getPhone, reqVO.getPhone())
+                .eqIfPresent(EmployeeInfoHistoryDO::getIdCardNumber, reqVO.getIdCardNumber())
+                .eqIfPresent(EmployeeInfoHistoryDO::getIdCardAddress, reqVO.getIdCardAddress())
+                .eqIfPresent(EmployeeInfoHistoryDO::getHouseholdType, reqVO.getHouseholdType())
+                .eqIfPresent(EmployeeInfoHistoryDO::getHouseholdLocation, reqVO.getHouseholdLocation())
+                .eqIfPresent(EmployeeInfoHistoryDO::getEducationLevel, reqVO.getEducationLevel())
+                .eqIfPresent(EmployeeInfoHistoryDO::getGraduationSchool, reqVO.getGraduationSchool())
+                .betweenIfPresent(EmployeeInfoHistoryDO::getGraduationDate, reqVO.getGraduationDate())
+                .likeIfPresent(EmployeeInfoHistoryDO::getBankCardName, reqVO.getBankCardName())
+                .eqIfPresent(EmployeeInfoHistoryDO::getBankCardNumber, reqVO.getBankCardNumber())
+                .eqIfPresent(EmployeeInfoHistoryDO::getBaseAnnualLeave, reqVO.getBaseAnnualLeave())
+                .eqIfPresent(EmployeeInfoHistoryDO::getUsedAnnualLeave, reqVO.getUsedAnnualLeave())
+                .eqIfPresent(EmployeeInfoHistoryDO::getRemainingAnnualLeave, reqVO.getRemainingAnnualLeave())
+                .betweenIfPresent(EmployeeInfoHistoryDO::getBirthDate, reqVO.getBirthDate())
+                .eqIfPresent(EmployeeInfoHistoryDO::getMarriageStatus, reqVO.getMarriageStatus())
+                .eqIfPresent(EmployeeInfoHistoryDO::getWorkLocation, reqVO.getWorkLocation())
+                .eqIfPresent(EmployeeInfoHistoryDO::getMajor, reqVO.getMajor())
+                .betweenIfPresent(EmployeeInfoHistoryDO::getWorkStartDate, reqVO.getWorkStartDate())
+                .eqIfPresent(EmployeeInfoHistoryDO::getSalary, reqVO.getSalary())
+                .eqIfPresent(EmployeeInfoHistoryDO::getPositionSalary, reqVO.getPositionSalary())
+                .eqIfPresent(EmployeeInfoHistoryDO::getProjectAllowance, reqVO.getProjectAllowance())
+                .eqIfPresent(EmployeeInfoHistoryDO::getSpecialPositionAllowance, reqVO.getSpecialPositionAllowance())
+                .eqIfPresent(EmployeeInfoHistoryDO::getForeignAllowance, reqVO.getForeignAllowance())
+                .eqIfPresent(EmployeeInfoHistoryDO::getLunchSubsidy, reqVO.getLunchSubsidy())
+                .eqIfPresent(EmployeeInfoHistoryDO::getSpecialAllowance, reqVO.getSpecialAllowance())
+                .eqIfPresent(EmployeeInfoHistoryDO::getSubsidy, reqVO.getSubsidy())
+                .eqIfPresent(EmployeeInfoHistoryDO::getYearEndBonus, reqVO.getYearEndBonus())
+                .eqIfPresent(EmployeeInfoHistoryDO::getAvatar, reqVO.getAvatar())
+                .eqIfPresent(EmployeeInfoHistoryDO::getStatus, reqVO.getStatus())
+                .betweenIfPresent(EmployeeInfoHistoryDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(EmployeeInfoHistoryDO::getTenantId, reqVO.getTenantId())
+                .eqIfPresent(EmployeeInfoHistoryDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(EmployeeInfoHistoryDO::getEmployeeId, reqVO.getEmployeeId())
+                .orderByDesc(EmployeeInfoHistoryDO::getId));
+    }
+
+}

+ 22 - 15
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/mysql/employeeinfo/EmployeeInfoMapper.java

@@ -1,11 +1,12 @@
-package cn.iocoder.yudao.module.employee.dal.mysql.employeeinfo;
+package cn.iocoder.yudao.module.employee.dal.mysql.info;
 
 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.employee.dal.dataobject.employeeinfo.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoHistoryDO;
 import org.apache.ibatis.annotations.Mapper;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.*;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.*;
 
 /**
  * 员工信息 Mapper
@@ -18,33 +19,37 @@ public interface EmployeeInfoMapper extends BaseMapperX<EmployeeInfoDO> {
     default PageResult<EmployeeInfoDO> selectPage(EmployeeInfoPageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<EmployeeInfoDO>()
                 .eqIfPresent(EmployeeInfoDO::getInfoId, reqVO.getInfoId())
-                .eqIfPresent(EmployeeInfoDO::getEmployeeNumber, reqVO.getEmployeeNumber())
                 .likeIfPresent(EmployeeInfoDO::getName, reqVO.getName())
                 .eqIfPresent(EmployeeInfoDO::getDeptId, reqVO.getDeptId())
-                .eqIfPresent(EmployeeInfoDO::getPhone, reqVO.getPhone())
-                .eqIfPresent(EmployeeInfoDO::getAvatar, reqVO.getAvatar())
-                .eqIfPresent(EmployeeInfoDO::getEmail, reqVO.getEmail())
-                .eqIfPresent(EmployeeInfoDO::getPosition, reqVO.getPosition())
+                .likeIfPresent(EmployeeInfoDO::getDeptName, reqVO.getDeptName())
                 .eqIfPresent(EmployeeInfoDO::getPostId, reqVO.getPostId())
+                .eqIfPresent(EmployeeInfoDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(EmployeeInfoDO::getEmployeeNumber, reqVO.getEmployeeNumber())
                 .betweenIfPresent(EmployeeInfoDO::getEntryDate, reqVO.getEntryDate())
                 .betweenIfPresent(EmployeeInfoDO::getProbationEndDate, reqVO.getProbationEndDate())
-                .eqIfPresent(EmployeeInfoDO::getWorkLocation, reqVO.getWorkLocation())
+                .betweenIfPresent(EmployeeInfoDO::getDepartureDate, reqVO.getDepartureDate())
+                .eqIfPresent(EmployeeInfoDO::getResignationReason, reqVO.getResignationReason())
                 .eqIfPresent(EmployeeInfoDO::getEmployeeStatus, reqVO.getEmployeeStatus())
                 .eqIfPresent(EmployeeInfoDO::getGender, reqVO.getGender())
-                .betweenIfPresent(EmployeeInfoDO::getBirthDate, reqVO.getBirthDate())
-                .eqIfPresent(EmployeeInfoDO::getMarriageStatus, reqVO.getMarriageStatus())
+                .eqIfPresent(EmployeeInfoDO::getEmail, reqVO.getEmail())
+                .eqIfPresent(EmployeeInfoDO::getPhone, reqVO.getPhone())
                 .eqIfPresent(EmployeeInfoDO::getIdCardNumber, reqVO.getIdCardNumber())
                 .eqIfPresent(EmployeeInfoDO::getIdCardAddress, reqVO.getIdCardAddress())
                 .eqIfPresent(EmployeeInfoDO::getHouseholdType, reqVO.getHouseholdType())
                 .eqIfPresent(EmployeeInfoDO::getHouseholdLocation, reqVO.getHouseholdLocation())
                 .eqIfPresent(EmployeeInfoDO::getEducationLevel, reqVO.getEducationLevel())
-                .eqIfPresent(EmployeeInfoDO::getMajor, reqVO.getMajor())
                 .eqIfPresent(EmployeeInfoDO::getGraduationSchool, reqVO.getGraduationSchool())
                 .betweenIfPresent(EmployeeInfoDO::getGraduationDate, reqVO.getGraduationDate())
+                .likeIfPresent(EmployeeInfoDO::getBankCardName, reqVO.getBankCardName())
+                .eqIfPresent(EmployeeInfoDO::getBankCardNumber, reqVO.getBankCardNumber())
+                .eqIfPresent(EmployeeInfoDO::getBaseAnnualLeave, reqVO.getBaseAnnualLeave())
+                .eqIfPresent(EmployeeInfoDO::getUsedAnnualLeave, reqVO.getUsedAnnualLeave())
+                .eqIfPresent(EmployeeInfoDO::getRemainingAnnualLeave, reqVO.getRemainingAnnualLeave())
+                .betweenIfPresent(EmployeeInfoDO::getBirthDate, reqVO.getBirthDate())
+                .eqIfPresent(EmployeeInfoDO::getMarriageStatus, reqVO.getMarriageStatus())
+                .eqIfPresent(EmployeeInfoDO::getWorkLocation, reqVO.getWorkLocation())
+                .eqIfPresent(EmployeeInfoDO::getMajor, reqVO.getMajor())
                 .betweenIfPresent(EmployeeInfoDO::getWorkStartDate, reqVO.getWorkStartDate())
-                .eqIfPresent(EmployeeInfoDO::getAnnualLeaveDays, reqVO.getAnnualLeaveDays())
-                .eqIfPresent(EmployeeInfoDO::getSalaryBank, reqVO.getSalaryBank())
-                .eqIfPresent(EmployeeInfoDO::getSalaryCardNumber, reqVO.getSalaryCardNumber())
                 .eqIfPresent(EmployeeInfoDO::getSalary, reqVO.getSalary())
                 .eqIfPresent(EmployeeInfoDO::getPositionSalary, reqVO.getPositionSalary())
                 .eqIfPresent(EmployeeInfoDO::getProjectAllowance, reqVO.getProjectAllowance())
@@ -54,8 +59,10 @@ public interface EmployeeInfoMapper extends BaseMapperX<EmployeeInfoDO> {
                 .eqIfPresent(EmployeeInfoDO::getSpecialAllowance, reqVO.getSpecialAllowance())
                 .eqIfPresent(EmployeeInfoDO::getSubsidy, reqVO.getSubsidy())
                 .eqIfPresent(EmployeeInfoDO::getYearEndBonus, reqVO.getYearEndBonus())
+                .eqIfPresent(EmployeeInfoDO::getAvatar, reqVO.getAvatar())
                 .eqIfPresent(EmployeeInfoDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(EmployeeInfoDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(EmployeeInfoDO::getTenantId, reqVO.getTenantId())
                 .eqIfPresent(EmployeeInfoDO::getUserId, reqVO.getUserId())
                 .orderByDesc(EmployeeInfoDO::getId));
     }

+ 0 - 56
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeContractInfoService.java

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

+ 0 - 71
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeContractInfoServiceImpl.java

@@ -1,71 +0,0 @@
-package cn.iocoder.yudao.module.employee.service.employeeinfo;
-
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.EmployeeContractInfoPageReqVO;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.EmployeeContractInfoSaveReqVO;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeContractInfoDO;
-import cn.iocoder.yudao.module.employee.dal.mysql.employeeinfo.EmployeeContractInfoMapper;
-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.employee.enums.ErrorCodeConstants.EMPLOYEE_CONTRACT_INFO_NOT_EXISTS;
-
-/**
- * 员工合同信息 Service 实现类
- *
- * @author 芋道源码
- */
-@Service
-@Validated
-public class EmployeeContractInfoServiceImpl implements EmployeeContractInfoService {
-
-    @Resource
-    private EmployeeContractInfoMapper contractInfoMapper;
-
-    @Override
-    public Long createContractInfo(EmployeeContractInfoSaveReqVO createReqVO) {
-        // 插入
-        EmployeeContractInfoDO contractInfo = BeanUtils.toBean(createReqVO, EmployeeContractInfoDO.class);
-        contractInfoMapper.insert(contractInfo);
-        // 返回
-        return contractInfo.getId();
-    }
-
-    @Override
-    public void updateContractInfo(EmployeeContractInfoSaveReqVO updateReqVO) {
-        // 校验存在
-        validateContractInfoExists(updateReqVO.getId());
-        // 更新
-        EmployeeContractInfoDO updateObj = BeanUtils.toBean(updateReqVO, EmployeeContractInfoDO.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(EMPLOYEE_CONTRACT_INFO_NOT_EXISTS);
-        }
-    }
-
-    @Override
-    public EmployeeContractInfoDO getContractInfo(Long id) {
-        return contractInfoMapper.selectById(id);
-    }
-
-    @Override
-    public PageResult<EmployeeContractInfoDO> getContractInfoPage(EmployeeContractInfoPageReqVO pageReqVO) {
-        return contractInfoMapper.selectPage(pageReqVO);
-    }
-
-}

+ 56 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/info/EmployeeInfoHistoryService.java

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.employee.service.info;
+
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoHistoryPageReqVO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoHistorySaveReqVO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoHistoryDO;
+
+import javax.validation.Valid;
+
+/**
+ * 员工信息历史 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface EmployeeInfoHistoryService {
+
+    /**
+     * 创建员工信息历史
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createInfoHistory(@Valid EmployeeInfoHistorySaveReqVO createReqVO);
+
+    /**
+     * 更新员工信息历史
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateInfoHistory(@Valid EmployeeInfoHistorySaveReqVO updateReqVO);
+
+    /**
+     * 删除员工信息历史
+     *
+     * @param id 编号
+     */
+    void deleteInfoHistory(Long id);
+
+    /**
+     * 获得员工信息历史
+     *
+     * @param id 编号
+     * @return 员工信息历史
+     */
+    EmployeeInfoHistoryDO getInfoHistory(Long id);
+
+    /**
+     * 获得员工信息历史分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 员工信息历史分页
+     */
+    PageResult<EmployeeInfoHistoryDO> getInfoHistoryPage(EmployeeInfoHistoryPageReqVO pageReqVO);
+
+}

+ 83 - 0
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/info/EmployeeInfoHistoryServiceImpl.java

@@ -0,0 +1,83 @@
+package cn.iocoder.yudao.module.employee.service.info;
+
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoHistoryPageReqVO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoHistorySaveReqVO;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoHistoryDO;
+import cn.iocoder.yudao.module.employee.dal.mysql.info.EmployeeInfoHistoryMapper;
+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.employee.enums.ErrorCodeConstants.*;
+
+/**
+ * 员工信息历史 Service 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+@Validated
+public class EmployeeInfoHistoryServiceImpl implements EmployeeInfoHistoryService {
+
+    @Resource
+    private EmployeeInfoHistoryMapper infoHistoryMapper;
+
+    @Override
+    @TenantIgnore
+    public Long createInfoHistory(EmployeeInfoHistorySaveReqVO createReqVO) {
+        // 插入
+        // 生成id
+        createReqVO.setInfoId(IdUtil.fastSimpleUUID());
+        EmployeeInfoHistoryDO infoHistory = BeanUtils.toBean(createReqVO, EmployeeInfoHistoryDO.class);
+        infoHistoryMapper.insert(infoHistory);
+        // 返回
+        return infoHistory.getId();
+    }
+
+    @Override
+    @TenantIgnore
+    public void updateInfoHistory(EmployeeInfoHistorySaveReqVO updateReqVO) {
+        // 校验存在
+        validateInfoHistoryExists(updateReqVO.getId());
+        // 更新
+        EmployeeInfoHistoryDO updateObj = BeanUtils.toBean(updateReqVO, EmployeeInfoHistoryDO.class);
+        infoHistoryMapper.updateById(updateObj);
+    }
+
+    @Override
+    @TenantIgnore
+    public void deleteInfoHistory(Long id) {
+        // 校验存在
+        validateInfoHistoryExists(id);
+        // 删除
+        infoHistoryMapper.deleteById(id);
+    }
+
+    @TenantIgnore
+    private void validateInfoHistoryExists(Long id) {
+        if (infoHistoryMapper.selectById(id) == null) {
+            throw exception(EMPLOYEE_INFO_HISTORY_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    @TenantIgnore
+    public EmployeeInfoHistoryDO getInfoHistory(Long id) {
+        return infoHistoryMapper.selectById(id);
+    }
+
+    @Override
+    @TenantIgnore
+    public PageResult<EmployeeInfoHistoryDO> getInfoHistoryPage(EmployeeInfoHistoryPageReqVO pageReqVO) {
+        return infoHistoryMapper.selectPage(pageReqVO);
+    }
+
+}

+ 4 - 4
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeInfoService.java

@@ -1,7 +1,7 @@
-package cn.iocoder.yudao.module.employee.service.employeeinfo;
+package cn.iocoder.yudao.module.employee.service.info;
 
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.*;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 
 import javax.validation.Valid;
@@ -9,7 +9,7 @@ import javax.validation.Valid;
 /**
  * 员工信息 Service 接口
  *
- * @author 芋道源码
+ * @author zhaopq
  */
 public interface EmployeeInfoService {
 

+ 24 - 5
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeInfoServiceImpl.java

@@ -1,16 +1,17 @@
-package cn.iocoder.yudao.module.employee.service.employeeinfo;
+package cn.iocoder.yudao.module.employee.service.info;
 
 import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.*;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 
-import cn.iocoder.yudao.module.employee.dal.mysql.employeeinfo.EmployeeInfoMapper;
+import cn.iocoder.yudao.module.employee.dal.mysql.info.EmployeeInfoMapper;
 
 import javax.annotation.Resource;
 
@@ -20,7 +21,7 @@ import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE
 /**
  * 员工信息 Service 实现类
  *
- * @author 芋道源码
+ * @author zhaopq
  */
 @Service
 @Validated
@@ -28,8 +29,11 @@ public class EmployeeInfoServiceImpl implements EmployeeInfoService {
 
     @Resource
     private EmployeeInfoMapper infoMapper;
+    @Resource
+    private EmployeeInfoHistoryService employeeInfoHistoryService;
 
     @Override
+    @TenantIgnore
     public Long createInfo(EmployeeInfoSaveReqVO createReqVO) {
         // 插入
         // 生成id
@@ -41,15 +45,25 @@ public class EmployeeInfoServiceImpl implements EmployeeInfoService {
     }
 
     @Override
+    @TenantIgnore
     public void updateInfo(EmployeeInfoSaveReqVO updateReqVO) {
         // 校验存在
         validateInfoExists(updateReqVO.getId());
+        EmployeeInfoDO employeeInfoDO = this.getInfo(updateReqVO.getId());
+        if (employeeInfoDO == null) {
+            throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+        }
+        EmployeeInfoHistorySaveReqVO historySaveReqVO = BeanUtils.toBean(employeeInfoDO, EmployeeInfoHistorySaveReqVO.class);
+        historySaveReqVO.setEmployeeId(employeeInfoDO.getId());
+        historySaveReqVO.setId(null);
+        employeeInfoHistoryService.createInfoHistory(historySaveReqVO);// 插入历史数据
         // 更新
         EmployeeInfoDO updateObj = BeanUtils.toBean(updateReqVO, EmployeeInfoDO.class);
         infoMapper.updateById(updateObj);
     }
 
     @Override
+    @TenantIgnore
     public void deleteInfo(Long id) {
         // 校验存在
         validateInfoExists(id);
@@ -57,6 +71,7 @@ public class EmployeeInfoServiceImpl implements EmployeeInfoService {
         infoMapper.deleteById(id);
     }
 
+    @TenantIgnore
     private void validateInfoExists(Long id) {
         if (infoMapper.selectById(id) == null) {
             throw exception(EMPLOYEE_INFO_NOT_EXISTS);
@@ -64,16 +79,19 @@ public class EmployeeInfoServiceImpl implements EmployeeInfoService {
     }
 
     @Override
+    @TenantIgnore
     public EmployeeInfoDO getInfo(Long id) {
         return infoMapper.selectById(id);
     }
 
     @Override
+    @TenantIgnore
     public PageResult<EmployeeInfoDO> getInfoPage(EmployeeInfoPageReqVO pageReqVO) {
         return infoMapper.selectPage(pageReqVO);
     }
 
     @Override
+    @TenantIgnore
     public EmployeeInfoDO getInfoByUserIdAndTenantId(Long userId, Long tenantId) {
         LambdaQueryWrapper<EmployeeInfoDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
         lambdaQueryWrapper.eq(EmployeeInfoDO::getUserId, userId)
@@ -82,6 +100,7 @@ public class EmployeeInfoServiceImpl implements EmployeeInfoService {
     }
 
     @Override
+    @TenantIgnore
     public EmployeeInfoDO getInfo(EmployeeInfoQueryReqVO queryReqVO) {
         return infoMapper.getInfo(queryReqVO);
     }

+ 1 - 1
yudao-module-personnel/yudao-module-employee-biz/src/main/resources/mapper/employeeinfo/EmployeeInfoMapper.xml

@@ -1,6 +1,6 @@
 <?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.employee.dal.mysql.employeeinfo.EmployeeInfoMapper">
+<mapper namespace="cn.iocoder.yudao.module.employee.dal.mysql.info.EmployeeInfoMapper">
 
     <!--
         一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。

+ 4 - 16
yudao-module-personnel/yudao-module-employee-biz/src/test/java/cn/iocoder/yudao/module/employee/service/employeeinfo/EmployeeInfoServiceImplTest.java

@@ -1,13 +1,13 @@
-package cn.iocoder.yudao.module.employee.service.employeeinfo;
+package cn.iocoder.yudao.module.employee.service.info;
 
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
 import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
 
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.*;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeInfoDO;
-import cn.iocoder.yudao.module.employee.dal.mysql.employeeinfo.EmployeeInfoMapper;
+import cn.iocoder.yudao.module.employee.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.dal.mysql.info.EmployeeInfoMapper;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 
 import org.springframework.context.annotation.Import;
@@ -128,9 +128,6 @@ public class EmployeeInfoServiceImplTest extends BaseDbUnitTest {
            o.setGraduationSchool(null);
            o.setGraduationDate(null);
            o.setWorkStartDate(null);
-           o.setAnnualLeaveDays(null);
-           o.setSalaryBank(null);
-           o.setSalaryCardNumber(null);
            o.setSalary(null);
            o.setPositionSalary(null);
            o.setProjectAllowance(null);
@@ -195,12 +192,6 @@ public class EmployeeInfoServiceImplTest extends BaseDbUnitTest {
        infoMapper.insert(cloneIgnoreId(dbInfo, o -> o.setGraduationDate(null)));
        // 测试 workStartDate 不匹配
        infoMapper.insert(cloneIgnoreId(dbInfo, o -> o.setWorkStartDate(null)));
-       // 测试 annualLeaveDays 不匹配
-       infoMapper.insert(cloneIgnoreId(dbInfo, o -> o.setAnnualLeaveDays(null)));
-       // 测试 salaryBank 不匹配
-       infoMapper.insert(cloneIgnoreId(dbInfo, o -> o.setSalaryBank(null)));
-       // 测试 salaryCardNumber 不匹配
-       infoMapper.insert(cloneIgnoreId(dbInfo, o -> o.setSalaryCardNumber(null)));
        // 测试 salary 不匹配
        infoMapper.insert(cloneIgnoreId(dbInfo, o -> o.setSalary(null)));
        // 测试 positionSalary 不匹配
@@ -247,9 +238,6 @@ public class EmployeeInfoServiceImplTest extends BaseDbUnitTest {
        reqVO.setEducationLevel(null);
        reqVO.setMajor(null);
        reqVO.setGraduationSchool(null);
-       reqVO.setAnnualLeaveDays(null);
-       reqVO.setSalaryBank(null);
-       reqVO.setSalaryCardNumber(null);
        reqVO.setSalary(null);
        reqVO.setPositionSalary(null);
        reqVO.setProjectAllowance(null);

+ 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, "员工合同信息不存在");
+
+}

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

@@ -0,0 +1,107 @@
+<?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-module-employee-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>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-employee-api</artifactId>
+            <version>2.1.0-jdk8-snapshot</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <!-- 三方云服务相关 -->
+
+    </dependencies>
+
+</project>

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

@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.holiday.api.info;
+
+import cn.iocoder.yudao.module.holiday.api.HolidayApi;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * 员工假务 API 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+public class HolidayApiImpl implements HolidayApi {
+
+}

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

@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.holiday.controller.admin.annualleave;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeePageReqDTO;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeQueryReqDTO;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+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.Operation;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+
+@Tag(name = "管理后台 - 员工假务信息")
+@RestController
+@RequestMapping("/presonnel/holiday/annual-leave")
+@Validated
+public class HolidayAnnualLeaveController {
+
+    @Resource
+    private EmployeeApi employeeApi;
+
+
+    @GetMapping("/get")
+    @Operation(summary = "获得员工年假信息")
+    @PreAuthorize("@ss.hasPermission('holiday:annual-leave:query')")
+    public CommonResult<EmployeeRespDTO> get(@Valid EmployeeQueryReqDTO reqDTO) {
+        EmployeeRespDTO info = employeeApi.getEmployee(reqDTO);
+        return success(info);
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得员工年假信息分页")
+    @PreAuthorize("@ss.hasPermission('holiday:annual-leave:query')")
+    public CommonResult<PageResult<EmployeeRespDTO>> page(@Valid EmployeePageReqDTO pageReqVO) {
+        PageResult<EmployeeRespDTO> pageResult = employeeApi.getEmployeePage(pageReqVO);
+        return success(pageResult);
+    }
+
+}

+ 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;

+ 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>

+ 34 - 0
yudao-module-personnel/yudao-module-relations-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-relations-api</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        relations 模块 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-relations-api/src/main/java/cn/iocoder/yudao/module/relations/api/RelationsApi.java

@@ -0,0 +1,11 @@
+package cn.iocoder.yudao.module.relations.api;
+
+
+/**
+ * 员工关系 API 接口
+ *
+ * @author zhaopq
+ */
+public interface RelationsApi {
+
+}

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

@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.relations.enums;
+
+
+import cn.iocoder.yudao.framework.common.exception.ErrorCode;
+
+/**
+ * Relations 错误码枚举类
+ *
+ * relations 系统,使用 1-011-000-000 段
+ */
+public interface ErrorCodeConstants {
+
+    // ========== 员工关系模块 1-011-000-000 ==========
+    ErrorCode RELATIONS_CONTRACT_INFO_NOT_EXISTS = new ErrorCode(1_011_000_000, "员工合同信息不存在");
+    ErrorCode RELATIONS_ENTRY_NOT_EXISTS = new ErrorCode(1_011_000_001, "入职信息不存在");
+    ErrorCode RELATIONS_CONVERSION_NOT_EXISTS = new ErrorCode(1_011_000_002, "转正信息不存在");
+    ErrorCode RELATIONS_RENEW_NOT_EXISTS = new ErrorCode(1_011_000_003, "续签信息不存在");
+    ErrorCode RELATIONS_TURNOVER_NOT_EXISTS = new ErrorCode(1_011_000_004, "离职信息不存在");
+
+}

+ 30 - 0
yudao-module-personnel/yudao-module-relations-api/src/main/java/cn/iocoder/yudao/module/relations/enums/contractinfo/ContractInfoStatusEnum.java

@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.relations.enums.contractinfo;
+
+import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
+import cn.iocoder.yudao.framework.common.util.object.ObjectUtils;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * 员工合同的状态枚举
+ *
+ * @author zhaopq
+ */
+@Getter
+@AllArgsConstructor
+public enum ContractInfoStatusEnum implements IntArrayValuable {
+    LATEST(0, "最新"),
+    HISTORY(1, "历史"),
+    ;
+
+    private final Integer status;
+    private final String name;
+
+    @Override
+    public int[] array() {
+        return new int[0];
+    }
+
+}

+ 96 - 0
yudao-module-personnel/yudao-module-relations-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-relations-biz</artifactId>
+    <packaging>jar</packaging>
+
+    <name>${project.artifactId}</name>
+    <description>
+        relations 模块,主要实现员工关系相关功能
+    </description>
+
+    <dependencies>
+        <dependency>
+            <groupId>cn.iocoder.boot</groupId>
+            <artifactId>yudao-module-relations-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-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/api/contract/RelationsApiImpl.java

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

+ 28 - 28
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/EmployeeContractInfoController.java

@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo;
+package cn.iocoder.yudao.module.relations.controller.admin.contract;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.EmployeeContractInfoPageReqVO;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.EmployeeContractInfoRespVO;
-import cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo.EmployeeContractInfoSaveReqVO;
-import cn.iocoder.yudao.module.employee.dal.dataobject.employeeinfo.EmployeeContractInfoDO;
-import cn.iocoder.yudao.module.employee.service.employeeinfo.EmployeeContractInfoService;
+import cn.iocoder.yudao.module.relations.controller.admin.contract.vo.RelationsContractPageReqVO;
+import cn.iocoder.yudao.module.relations.controller.admin.contract.vo.RelationsContractRespVO;
+import cn.iocoder.yudao.module.relations.controller.admin.contract.vo.RelationsContractSaveReqVO;
+import cn.iocoder.yudao.module.relations.dal.dataobject.contract.RelationsContractDO;
+import cn.iocoder.yudao.module.relations.service.contract.RelationsContractService;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -13,8 +13,8 @@ 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 java.util.List;
 
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -31,26 +31,27 @@ import javax.validation.Valid;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
 
+
 @Tag(name = "管理后台 - 员工合同信息")
 @RestController
-@RequestMapping("/presonnel/employee/contract")
+@RequestMapping("/presonnel/relations/contract")
 @Validated
-public class EmployeeContractInfoController {
+public class RelationsContractController {
 
     @Resource
-    private EmployeeContractInfoService contractInfoService;
+    private RelationsContractService contractInfoService;
 
     @PostMapping("/create")
     @Operation(summary = "创建员工合同信息")
-    @PreAuthorize("@ss.hasPermission('employee:contract-info:create')")
-    public CommonResult<Long> createContractInfo(@Valid @RequestBody EmployeeContractInfoSaveReqVO createReqVO) {
+    @PreAuthorize("@ss.hasPermission('relations:contract:create')")
+    public CommonResult<Long> createContractInfo(@Valid @RequestBody RelationsContractSaveReqVO createReqVO) {
         return success(contractInfoService.createContractInfo(createReqVO));
     }
 
     @PutMapping("/update")
     @Operation(summary = "更新员工合同信息")
-    @PreAuthorize("@ss.hasPermission('employee:contract-info:update')")
-    public CommonResult<Boolean> updateContractInfo(@Valid @RequestBody EmployeeContractInfoSaveReqVO updateReqVO) {
+    @PreAuthorize("@ss.hasPermission('relations:contract:update')")
+    public CommonResult<Boolean> updateContractInfo(@Valid @RequestBody RelationsContractSaveReqVO updateReqVO) {
         contractInfoService.updateContractInfo(updateReqVO);
         return success(true);
     }
@@ -58,7 +59,7 @@ public class EmployeeContractInfoController {
     @DeleteMapping("/delete")
     @Operation(summary = "删除员工合同信息")
     @Parameter(name = "id", description = "编号", required = true)
-    @PreAuthorize("@ss.hasPermission('employee:contract-info:delete')")
+    @PreAuthorize("@ss.hasPermission('relations:contract:delete')")
     public CommonResult<Boolean> deleteContractInfo(@RequestParam("id") Long id) {
         contractInfoService.deleteContractInfo(id);
         return success(true);
@@ -67,31 +68,30 @@ public class EmployeeContractInfoController {
     @GetMapping("/get")
     @Operation(summary = "获得员工合同信息")
     @Parameter(name = "id", description = "编号", required = true, example = "1024")
-    @PreAuthorize("@ss.hasPermission('employee:contract-info:query')")
-    public CommonResult<EmployeeContractInfoRespVO> getContractInfo(@RequestParam("id") Long id) {
-        EmployeeContractInfoDO contractInfo = contractInfoService.getContractInfo(id);
-        return success(BeanUtils.toBean(contractInfo, EmployeeContractInfoRespVO.class));
+    @PreAuthorize("@ss.hasPermission('relations:contract:query')")
+    public CommonResult<RelationsContractRespVO> getContractInfo(@RequestParam("id") Long id) {
+        return success(contractInfoService.getById(id));
     }
 
     @GetMapping("/page")
     @Operation(summary = "获得员工合同信息分页")
-    @PreAuthorize("@ss.hasPermission('employee:contract-info:query')")
-    public CommonResult<PageResult<EmployeeContractInfoRespVO>> getContractInfoPage(@Valid EmployeeContractInfoPageReqVO pageReqVO) {
-        PageResult<EmployeeContractInfoDO> pageResult = contractInfoService.getContractInfoPage(pageReqVO);
-        return success(BeanUtils.toBean(pageResult, EmployeeContractInfoRespVO.class));
+    @PreAuthorize("@ss.hasPermission('relations:contract:query')")
+    public CommonResult<PageResult<RelationsContractRespVO>> getContractInfoPage(@Valid RelationsContractPageReqVO pageReqVO) {
+        PageResult<RelationsContractDO> pageResult = contractInfoService.getContractInfoPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, RelationsContractRespVO.class));
     }
 
     @GetMapping("/export-excel")
     @Operation(summary = "导出员工合同信息 Excel")
-    @PreAuthorize("@ss.hasPermission('employee:contract-info:export')")
+    @PreAuthorize("@ss.hasPermission('relations:contract:export')")
     @ApiAccessLog(operateType = EXPORT)
-    public void exportContractInfoExcel(@Valid EmployeeContractInfoPageReqVO pageReqVO,
+    public void exportContractInfoExcel(@Valid RelationsContractPageReqVO pageReqVO,
               HttpServletResponse response) throws IOException {
         pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
-        List<EmployeeContractInfoDO> list = contractInfoService.getContractInfoPage(pageReqVO).getList();
+        List<RelationsContractDO> list = contractInfoService.getContractInfoPage(pageReqVO).getList();
         // 导出 Excel
-        ExcelUtils.write(response, "员工合同信息.xls", "数据", EmployeeContractInfoRespVO.class,
-                        BeanUtils.toBean(list, EmployeeContractInfoRespVO.class));
+        ExcelUtils.write(response, "员工合同信息.xls", "数据", RelationsContractRespVO.class,
+                        BeanUtils.toBean(list, RelationsContractRespVO.class));
     }
 
 }

+ 29 - 14
yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/employeeinfo/vo/EmployeeContractInfoPageReqVO.java

@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.employee.controller.admin.employeeinfo.vo;
+package cn.iocoder.yudao.module.relations.controller.admin.contract.vo;
 
 import lombok.*;
 
@@ -14,16 +14,28 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @Data
 @EqualsAndHashCode(callSuper = true)
 @ToString(callSuper = true)
-public class EmployeeContractInfoPageReqVO extends PageParam {
+public class RelationsContractPageReqVO extends PageParam {
 
-    @Schema(description = "业务UUID", example = "8684")
-    private String infoId;
+    @Schema(description = "业务UUID", example = "17794")
+    private String contractId;
 
-    @Schema(description = "合同编号,唯一")
-    private String contractNumber;
+    @Schema(description = "姓名", example = "芋艿")
+    private String name;
 
-    @Schema(description = "员工ID", example = "19556")
-    private String employeeId;
+    @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)
@@ -33,20 +45,23 @@ public class EmployeeContractInfoPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDate[] contractEndDate;
 
-    @Schema(description = "工作内容")
-    private String jobContent;
-
-    @Schema(description = "合同状态", example = "1")
-    private String contractStatus;
+    @Schema(description = "合同期限")
+    private String contractDeadline;
 
     @Schema(description = "备注信息")
     private String remarks;
 
-    @Schema(description = "状态", example = "2")
+    @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;
+
+    @Schema(description = "租户编号", example = "4014")
+    private Long tenantId;
+
 }

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

@@ -0,0 +1,85 @@
+package cn.iocoder.yudao.module.relations.controller.admin.contract.vo;
+
+import cn.iocoder.yudao.module.infra.api.file.dto.FileDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 员工合同信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RelationsContractRespVO {
+
+    @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 contractId;
+
+    @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;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4014")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+}

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

@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.relations.controller.admin.contract.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDate;
+import java.util.List;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 员工合同信息新增/修改 Request VO")
+@Data
+public class RelationsContractSaveReqVO {
+
+    @Schema(description = "自增ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "28961")
+    private Long id;
+
+    @Schema(description = "业务UUID", requiredMode = Schema.RequiredMode.REQUIRED, example = "17794")
+    private String contractId;
+
+    @Schema(description = "姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+    @NotEmpty(message = "姓名不能为空")
+    private String name;
+
+    @Schema(description = "部门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 = "合同结束日期")
+    @NotNull(message = "合同开始日期不能为空")
+    private LocalDate contractEndDate;
+
+    @Schema(description = "合同期限")
+    @NotEmpty(message = "合同期限不能为空")
+    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;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4014")
+    @NotNull(message = "租户编号不能为空")
+    private Long tenantId;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+}

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

@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.relations.controller.admin.conversion;
+
+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.relations.controller.admin.conversion.vo.*;
+import cn.iocoder.yudao.module.relations.dal.dataobject.conversion.RelationsConversionDO;
+import cn.iocoder.yudao.module.relations.service.conversion.RelationsConversionService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 转正信息")
+@RestController
+@RequestMapping("/presonnel/relations/conversion")
+@Validated
+public class RelationsConversionController {
+
+    @Resource
+    private RelationsConversionService conversionService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建转正信息")
+    @PreAuthorize("@ss.hasPermission('relations:conversion:create')")
+    public CommonResult<Long> createConversion(@Valid @RequestBody RelationsConversionSaveReqVO createReqVO) {
+        return success(conversionService.createConversion(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新转正信息")
+    @PreAuthorize("@ss.hasPermission('relations:conversion:update')")
+    public CommonResult<Boolean> updateConversion(@Valid @RequestBody RelationsConversionSaveReqVO updateReqVO) {
+        conversionService.updateConversion(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除转正信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('relations:conversion:delete')")
+    public CommonResult<Boolean> deleteConversion(@RequestParam("id") Long id) {
+        conversionService.deleteConversion(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得转正信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('relations:conversion:query')")
+    public CommonResult<RelationsConversionRespVO> getConversion(@RequestParam("id") Long id) {
+        return success(conversionService.getById(id));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得转正信息分页")
+    @PreAuthorize("@ss.hasPermission('relations:conversion:query')")
+    public CommonResult<PageResult<RelationsConversionRespVO>> getConversionPage(@Valid RelationsConversionPageReqVO pageReqVO) {
+        PageResult<RelationsConversionDO> pageResult = conversionService.getConversionPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, RelationsConversionRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出转正信息 Excel")
+    @PreAuthorize("@ss.hasPermission('relations:conversion:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportConversionExcel(@Valid RelationsConversionPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<RelationsConversionDO> list = conversionService.getConversionPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "转正信息.xls", "数据", RelationsConversionRespVO.class,
+                        BeanUtils.toBean(list, RelationsConversionRespVO.class));
+    }
+
+}

+ 88 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/vo/RelationsConversionPageReqVO.java

@@ -0,0 +1,88 @@
+package cn.iocoder.yudao.module.relations.controller.admin.conversion.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 RelationsConversionPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "182")
+    private String conversionId;
+
+    @Schema(description = "转正人id", example = "16390")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "11168")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "芋艿")
+    private String employeeName;
+
+    @Schema(description = "转正员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "5018")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "21562")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "2507")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "11190")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] entryDate;
+
+    @Schema(description = "试用期结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] probationEndDate;
+
+    @Schema(description = "转正日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] conversionDate;
+
+    @Schema(description = "转正申请理由", example = "不香")
+    private String conversionReason;
+
+    @Schema(description = "工作总结")
+    private String workSummary;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "11670")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "赵六")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "4014")
+    private Long tenantId;
+
+}

+ 110 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/vo/RelationsConversionRespVO.java

@@ -0,0 +1,110 @@
+package cn.iocoder.yudao.module.relations.controller.admin.conversion.vo;
+
+import cn.iocoder.yudao.module.infra.api.file.dto.FileDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 转正信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RelationsConversionRespVO {
+
+    @Schema(description = "转正表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15594")
+    @ExcelProperty("转正表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "182")
+    @ExcelProperty("uuid")
+    private String conversionId;
+
+    @Schema(description = "转正人id", example = "16390")
+    @ExcelProperty("转正人id")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "11168")
+    @ExcelProperty("转正人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "芋艿")
+    @ExcelProperty("转正员工姓名")
+    private String employeeName;
+
+    @Schema(description = "转正员工手机号")
+    @ExcelProperty("转正员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "5018")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "21562")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "2507")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "11190")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @ExcelProperty("入职日期")
+    private String entryDate;
+
+    @Schema(description = "试用期结束日期")
+    @ExcelProperty("试用期结束日期")
+    private String probationEndDate;
+
+    @Schema(description = "转正日期")
+    @ExcelProperty("转正日期")
+    private String conversionDate;
+
+    @Schema(description = "转正申请理由", example = "不香")
+    @ExcelProperty("转正申请理由")
+    private String conversionReason;
+
+    @Schema(description = "工作总结")
+    @ExcelProperty("工作总结")
+    private String workSummary;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "11670")
+    @ExcelProperty("创建人员工id")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "赵六")
+    @ExcelProperty("创建人员工姓名")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4014")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+}

+ 84 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/vo/RelationsConversionSaveReqVO.java

@@ -0,0 +1,84 @@
+package cn.iocoder.yudao.module.relations.controller.admin.conversion.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 转正信息新增/修改 Request VO")
+@Data
+public class RelationsConversionSaveReqVO {
+
+    @Schema(description = "转正表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "15594")
+    private Long id;
+
+    @Schema(description = "uuid", example = "182")
+    private String conversionId;
+
+    @Schema(description = "转正人id", example = "16390")
+    private Long employeeId;
+
+    @Schema(description = "转正人uuid", example = "11168")
+    private String employeeUuid;
+
+    @Schema(description = "转正员工姓名", example = "芋艿")
+    private String employeeName;
+
+    @Schema(description = "转正员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "5018")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "21562")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "2507")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "11190")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    private String entryDate;
+
+    @Schema(description = "试用期结束日期")
+    private String probationEndDate;
+
+    @Schema(description = "转正日期")
+    private String conversionDate;
+
+    @Schema(description = "转正申请理由", example = "不香")
+    private String conversionReason;
+
+    @Schema(description = "工作总结")
+    private String workSummary;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "11670")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "赵六")
+    private String creatorEmployeeName;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4014")
+    @NotNull(message = "租户编号不能为空")
+    private Long tenantId;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+}

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

@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.relations.controller.admin.entry;
+
+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.relations.controller.admin.entry.vo.*;
+import cn.iocoder.yudao.module.relations.dal.dataobject.entry.RelationsEntryDO;
+import cn.iocoder.yudao.module.relations.service.entry.RelationsEntryService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 入职信息")
+@RestController
+@RequestMapping("/presonnel/relations/entry")
+@Validated
+public class RelationsEntryController {
+
+    @Resource
+    private RelationsEntryService entryService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建入职信息")
+    @PreAuthorize("@ss.hasPermission('relations:entry:create')")
+    public CommonResult<Long> createEntry(@Valid @RequestBody RelationsEntrySaveReqVO createReqVO) {
+        return success(entryService.createEntry(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新入职信息")
+    @PreAuthorize("@ss.hasPermission('relations:entry:update')")
+    public CommonResult<Boolean> updateEntry(@Valid @RequestBody RelationsEntrySaveReqVO updateReqVO) {
+        entryService.updateEntry(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除入职信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('relations:entry:delete')")
+    public CommonResult<Boolean> deleteEntry(@RequestParam("id") Long id) {
+        entryService.deleteEntry(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得入职信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('relations:entry:query')")
+    public CommonResult<RelationsEntryRespVO> getEntry(@RequestParam("id") Long id) {
+        return success(entryService.getById(id));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得入职信息分页")
+    @PreAuthorize("@ss.hasPermission('relations:entry:query')")
+    public CommonResult<PageResult<RelationsEntryRespVO>> getEntryPage(@Valid RelationsEntryPageReqVO pageReqVO) {
+        PageResult<RelationsEntryDO> pageResult = entryService.getEntryPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, RelationsEntryRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出入职信息 Excel")
+    @PreAuthorize("@ss.hasPermission('relations:entry:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportEntryExcel(@Valid RelationsEntryPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<RelationsEntryDO> list = entryService.getEntryPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "入职信息.xls", "数据", RelationsEntryRespVO.class,
+                        BeanUtils.toBean(list, RelationsEntryRespVO.class));
+    }
+
+}

+ 77 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/vo/RelationsEntryPageReqVO.java

@@ -0,0 +1,77 @@
+package cn.iocoder.yudao.module.relations.controller.admin.entry.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 RelationsEntryPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "20723")
+    private String entryId;
+
+    @Schema(description = "入职人", example = "王五")
+    private String entryName;
+
+    @Schema(description = "部门", example = "24059")
+    private String deptId;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "员工类型", example = "2")
+    private String employeeType;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "出身日期")
+    private String birthday;
+
+    @Schema(description = "联系电话")
+    private String contactNumber;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "教育背景")
+    private String education;
+
+    @Schema(description = "工作经验")
+    private String workExperience;
+
+    @Schema(description = "入职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] entryDate;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "11779")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "赵六")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "17470")
+    private Long tenantId;
+
+}

+ 98 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/vo/RelationsEntryRespVO.java

@@ -0,0 +1,98 @@
+package cn.iocoder.yudao.module.relations.controller.admin.entry.vo;
+
+import cn.iocoder.yudao.module.infra.api.file.dto.FileDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 入职信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RelationsEntryRespVO {
+
+    @Schema(description = "入职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30064")
+    @ExcelProperty("入职表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "20723")
+    @ExcelProperty("uuid")
+    private String entryId;
+
+    @Schema(description = "入职人", example = "王五")
+    @ExcelProperty("入职人")
+    private String entryName;
+
+    @Schema(description = "部门", example = "24059")
+    @ExcelProperty("部门")
+    private String deptId;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "员工类型", example = "2")
+    @ExcelProperty("员工类型")
+    private String employeeType;
+
+    @Schema(description = "性别")
+    @ExcelProperty("性别")
+    private String gender;
+
+    @Schema(description = "出身日期")
+    @ExcelProperty("出身日期")
+    private String birthday;
+
+    @Schema(description = "联系电话")
+    @ExcelProperty("联系电话")
+    private String contactNumber;
+
+    @Schema(description = "电子邮箱")
+    @ExcelProperty("电子邮箱")
+    private String email;
+
+    @Schema(description = "教育背景")
+    @ExcelProperty("教育背景")
+    private String education;
+
+    @Schema(description = "工作经验")
+    @ExcelProperty("工作经验")
+    private String workExperience;
+
+    @Schema(description = "入职日期")
+    @ExcelProperty("入职日期")
+    private String entryDate;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "11779")
+    @ExcelProperty("创建人员工id")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "赵六")
+    @ExcelProperty("创建人员工姓名")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17470")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+}

+ 75 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/vo/RelationsEntrySaveReqVO.java

@@ -0,0 +1,75 @@
+package cn.iocoder.yudao.module.relations.controller.admin.entry.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.*;
+
+@Schema(description = "管理后台 - 入职信息新增/修改 Request VO")
+@Data
+public class RelationsEntrySaveReqVO {
+
+    @Schema(description = "入职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "30064")
+    private Long id;
+
+    @Schema(description = "uuid", example = "20723")
+    private String entryId;
+
+    @Schema(description = "入职人", example = "王五")
+    private String entryName;
+
+    @Schema(description = "部门", example = "24059")
+    private String deptId;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "员工类型", example = "2")
+    private String employeeType;
+
+    @Schema(description = "性别")
+    private String gender;
+
+    @Schema(description = "出身日期")
+    private String birthday;
+
+    @Schema(description = "联系电话")
+    private String contactNumber;
+
+    @Schema(description = "电子邮箱")
+    private String email;
+
+    @Schema(description = "教育背景")
+    private String education;
+
+    @Schema(description = "工作经验")
+    private String workExperience;
+
+    @Schema(description = "入职日期")
+    private String entryDate;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "11779")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "赵六")
+    private String creatorEmployeeName;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "17470")
+    @NotNull(message = "租户编号不能为空")
+    private Long tenantId;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+}

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

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.relations.controller.admin.renew;
+
+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.relations.controller.admin.renew.vo.*;
+import cn.iocoder.yudao.module.relations.dal.dataobject.renew.RelationsRenewDO;
+import cn.iocoder.yudao.module.relations.service.renew.RelationsRenewService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 续签信息")
+@RestController
+@RequestMapping("/presonnel/relations/renew")
+@Validated
+public class RelationsRenewController {
+
+    @Resource
+    private RelationsRenewService renewService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建续签信息")
+    @PreAuthorize("@ss.hasPermission('relations:renew:create')")
+    public CommonResult<Long> createRenew(@Valid @RequestBody RelationsRenewSaveReqVO createReqVO) {
+        return success(renewService.createRenew(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新续签信息")
+    @PreAuthorize("@ss.hasPermission('relations:renew:update')")
+    public CommonResult<Boolean> updateRenew(@Valid @RequestBody RelationsRenewSaveReqVO updateReqVO) {
+        renewService.updateRenew(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除续签信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('relations:renew:delete')")
+    public CommonResult<Boolean> deleteRenew(@RequestParam("id") Long id) {
+        renewService.deleteRenew(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得续签信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('relations:renew:query')")
+    public CommonResult<RelationsRenewRespVO> getRenew(@RequestParam("id") Long id) {
+//        RelationsRenewDO renew = renewService.getRenew(id);
+        return success(renewService.getById(id));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得续签信息分页")
+    @PreAuthorize("@ss.hasPermission('relations:renew:query')")
+    public CommonResult<PageResult<RelationsRenewRespVO>> getRenewPage(@Valid RelationsRenewPageReqVO pageReqVO) {
+        PageResult<RelationsRenewDO> pageResult = renewService.getRenewPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, RelationsRenewRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出续签信息 Excel")
+    @PreAuthorize("@ss.hasPermission('relations:renew:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportRenewExcel(@Valid RelationsRenewPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<RelationsRenewDO> list = renewService.getRenewPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "续签信息.xls", "数据", RelationsRenewRespVO.class,
+                        BeanUtils.toBean(list, RelationsRenewRespVO.class));
+    }
+
+}

+ 94 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/vo/RelationsRenewPageReqVO.java

@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.relations.controller.admin.renew.vo;
+
+import lombok.*;
+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 RelationsRenewPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "14155")
+    private String renewId;
+
+    @Schema(description = "续签人id", example = "18481")
+    private Long employeeId;
+
+    @Schema(description = "续签人uuid", example = "15219")
+    private String employeeUuid;
+
+    @Schema(description = "续签员工姓名", example = "李四")
+    private String employeeName;
+
+    @Schema(description = "续签员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "12361")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "2148")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "9504")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "7043")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "原合同开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] oldContractStartDate;
+
+    @Schema(description = "原合同结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] oldContractEndDate;
+
+    @Schema(description = "续签合同期限")
+    private String renewPeriod;
+
+    @Schema(description = "续签开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] renewContractStartDate;
+
+    @Schema(description = "续签结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] renewContractEndDate;
+
+    @Schema(description = "续签理由", example = "不好")
+    private String renewReason;
+
+    @Schema(description = "工作表现")
+    private String workPerformance;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "27141")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "李四")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "618")
+    private Long tenantId;
+
+}

+ 120 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/vo/RelationsRenewRespVO.java

@@ -0,0 +1,120 @@
+package cn.iocoder.yudao.module.relations.controller.admin.renew.vo;
+
+import cn.iocoder.yudao.module.infra.api.file.dto.FileDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 续签信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RelationsRenewRespVO {
+
+    @Schema(description = "续签表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25101")
+    @ExcelProperty("续签表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "14155")
+    @ExcelProperty("uuid")
+    private String renewId;
+
+    @Schema(description = "续签人id", example = "18481")
+    @ExcelProperty("续签人id")
+    private Long employeeId;
+
+    @Schema(description = "续签人uuid", example = "15219")
+    @ExcelProperty("续签人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "续签员工姓名", example = "李四")
+    @ExcelProperty("续签员工姓名")
+    private String employeeName;
+
+    @Schema(description = "续签员工手机号")
+    @ExcelProperty("续签员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "12361")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "2148")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "9504")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "7043")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "原合同开始日期")
+    @ExcelProperty("原合同开始日期")
+    private String oldContractStartDate;
+
+    @Schema(description = "原合同结束日期")
+    @ExcelProperty("原合同结束日期")
+    private String oldContractEndDate;
+
+    @Schema(description = "续签合同期限")
+    @ExcelProperty("续签合同期限")
+    private String renewPeriod;
+
+    @Schema(description = "续签开始日期")
+    @ExcelProperty("续签开始日期")
+    private String renewContractStartDate;
+
+    @Schema(description = "续签结束日期")
+    @ExcelProperty("续签结束日期")
+    private String renewContractEndDate;
+
+    @Schema(description = "续签理由", example = "不好")
+    @ExcelProperty("续签理由")
+    private String renewReason;
+
+    @Schema(description = "工作表现")
+    @ExcelProperty("工作表现")
+    private String workPerformance;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "27141")
+    @ExcelProperty("创建人员工id")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "李四")
+    @ExcelProperty("创建人员工姓名")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "618")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+}

+ 90 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/vo/RelationsRenewSaveReqVO.java

@@ -0,0 +1,90 @@
+package cn.iocoder.yudao.module.relations.controller.admin.renew.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Schema(description = "管理后台 - 续签信息新增/修改 Request VO")
+@Data
+public class RelationsRenewSaveReqVO {
+
+    @Schema(description = "续签表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "25101")
+    private Long id;
+
+    @Schema(description = "uuid", example = "14155")
+    private String renewId;
+
+    @Schema(description = "续签人id", example = "18481")
+    private Long employeeId;
+
+    @Schema(description = "续签人uuid", example = "15219")
+    private String employeeUuid;
+
+    @Schema(description = "续签员工姓名", example = "李四")
+    private String employeeName;
+
+    @Schema(description = "续签员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "12361")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "2148")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "9504")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "7043")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "原合同开始日期")
+    private String oldContractStartDate;
+
+    @Schema(description = "原合同结束日期")
+    private String oldContractEndDate;
+
+    @Schema(description = "续签合同期限")
+    private String renewPeriod;
+
+    @Schema(description = "续签开始日期")
+    private String renewContractStartDate;
+
+    @Schema(description = "续签结束日期")
+    private String renewContractEndDate;
+
+    @Schema(description = "续签理由", example = "不好")
+    private String renewReason;
+
+    @Schema(description = "工作表现")
+    private String workPerformance;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @NotNull(message = "状态不能为空")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "27141")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "李四")
+    private String creatorEmployeeName;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "618")
+    @NotNull(message = "租户编号不能为空")
+    private Long tenantId;
+
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
+}

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

@@ -0,0 +1,94 @@
+package cn.iocoder.yudao.module.relations.controller.admin.turnover;
+
+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.relations.controller.admin.turnover.vo.*;
+import cn.iocoder.yudao.module.relations.dal.dataobject.turnover.RelationsTurnoverDO;
+import cn.iocoder.yudao.module.relations.service.turnover.RelationsTurnoverService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 离职信息")
+@RestController
+@RequestMapping("/presonnel/relations/turnover")
+@Validated
+public class RelationsTurnoverController {
+
+    @Resource
+    private RelationsTurnoverService turnoverService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建离职信息")
+    @PreAuthorize("@ss.hasPermission('relations:turnover:create')")
+    public CommonResult<Long> createTurnover(@Valid @RequestBody RelationsTurnoverSaveReqVO createReqVO) {
+        return success(turnoverService.createTurnover(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新离职信息")
+    @PreAuthorize("@ss.hasPermission('relations:turnover:update')")
+    public CommonResult<Boolean> updateTurnover(@Valid @RequestBody RelationsTurnoverSaveReqVO updateReqVO) {
+        turnoverService.updateTurnover(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除离职信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('relations:turnover:delete')")
+    public CommonResult<Boolean> deleteTurnover(@RequestParam("id") Long id) {
+        turnoverService.deleteTurnover(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得离职信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('relations:turnover:query')")
+    public CommonResult<RelationsTurnoverRespVO> getTurnover(@RequestParam("id") Long id) {
+        return success(turnoverService.getById(id));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得离职信息分页")
+    @PreAuthorize("@ss.hasPermission('relations:turnover:query')")
+    public CommonResult<PageResult<RelationsTurnoverRespVO>> getTurnoverPage(@Valid RelationsTurnoverPageReqVO pageReqVO) {
+        PageResult<RelationsTurnoverDO> pageResult = turnoverService.getTurnoverPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, RelationsTurnoverRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出离职信息 Excel")
+    @PreAuthorize("@ss.hasPermission('relations:turnover:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportTurnoverExcel(@Valid RelationsTurnoverPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<RelationsTurnoverDO> list = turnoverService.getTurnoverPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "离职信息.xls", "数据", RelationsTurnoverRespVO.class,
+                        BeanUtils.toBean(list, RelationsTurnoverRespVO.class));
+    }
+
+}

+ 81 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/vo/RelationsTurnoverPageReqVO.java

@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.relations.controller.admin.turnover.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 RelationsTurnoverPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "25144")
+    private String turnoverId;
+
+    @Schema(description = "离职人id", example = "28288")
+    private Long employeeId;
+
+    @Schema(description = "离职人uuid", example = "32274")
+    private String employeeUuid;
+
+    @Schema(description = "离职员工姓名", example = "张三")
+    private String employeeName;
+
+    @Schema(description = "续签员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "31092")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "17689")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "19364")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "6524")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] entryDate;
+
+    @Schema(description = "离职日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] turnoverDate;
+
+    @Schema(description = "离职原因", example = "不对")
+    private String turnoverReason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "29636")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "王五")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "23947")
+    private Long tenantId;
+
+}

+ 102 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/vo/RelationsTurnoverRespVO.java

@@ -0,0 +1,102 @@
+package cn.iocoder.yudao.module.relations.controller.admin.turnover.vo;
+
+import cn.iocoder.yudao.module.infra.api.file.dto.FileDTO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 离职信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class RelationsTurnoverRespVO {
+
+    @Schema(description = "离职表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "5207")
+    @ExcelProperty("离职表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "25144")
+    @ExcelProperty("uuid")
+    private String turnoverId;
+
+    @Schema(description = "离职人id", example = "28288")
+    @ExcelProperty("离职人id")
+    private Long employeeId;
+
+    @Schema(description = "离职人uuid", example = "32274")
+    @ExcelProperty("离职人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "离职员工姓名", example = "张三")
+    @ExcelProperty("离职员工姓名")
+    private String employeeName;
+
+    @Schema(description = "续签员工手机号")
+    @ExcelProperty("续签员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "31092")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "17689")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "19364")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "6524")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "入职日期")
+    @ExcelProperty("入职日期")
+    private String entryDate;
+
+    @Schema(description = "离职日期")
+    @ExcelProperty("离职日期")
+    private String turnoverDate;
+
+    @Schema(description = "离职原因", example = "不对")
+    @ExcelProperty("离职原因")
+    private String turnoverReason;
+
+    @Schema(description = "备注")
+    @ExcelProperty("备注")
+    private String remarks;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    @ExcelProperty("数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "29636")
+    @ExcelProperty("创建人员工id")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "王五")
+    @ExcelProperty("创建人员工姓名")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23947")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+    @Schema(description = "附件列表")
+    private List<FileDTO> fileList;
+
+}

+ 0 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/vo/RelationsTurnoverSaveReqVO.java


Some files were not shown because too many files changed in this diff