Browse Source

Merge remote-tracking branch 'origin/master_20240722' into lc_saas

dongpo 7 months ago
parent
commit
183c18a4d1
81 changed files with 3600 additions and 40 deletions
  1. 4 0
      yudao-module-personnel/yudao-module-attendance-api/src/main/java/cn/iocoder/yudao/module/attendance/enums/ErrorCodeConstants.java
  2. 95 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/AttendanceBusinessController.java
  3. 91 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessPageReqVO.java
  4. 113 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessRespVO.java
  5. 86 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessSaveReqVO.java
  6. 17 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/AttendanceEmployeeSettingController.java
  7. 24 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingBatchSaveReqVO.java
  8. 6 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingPageReqVO.java
  9. 18 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingRespVO.java
  10. 3 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingSaveReqVO.java
  11. 15 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/AttendanceInfoController.java
  12. 57 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoPageReqVO.java
  13. 54 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoRespVO.java
  14. 3 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoPageReqVO.java
  15. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoRespVO.java
  16. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoSaveReqVO.java
  17. 39 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoPageReqVO.java
  18. 66 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoRespVO.java
  19. 95 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/AttendanceLeaveController.java
  20. 96 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeavePageReqVO.java
  21. 116 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeaveRespVO.java
  22. 87 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeaveSaveReqVO.java
  23. 95 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/AttendanceOutController.java
  24. 88 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutPageReqVO.java
  25. 108 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutRespVO.java
  26. 81 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutSaveReqVO.java
  27. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/AttendanceSchedulingManageController.java
  28. 5 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManagePageReqVO.java
  29. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageRespVO.java
  30. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageSaveReqVO.java
  31. 110 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/AttendanceWorkdaySettingController.java
  32. 36 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingPageReqVO.java
  33. 40 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingRespVO.java
  34. 32 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingSaveReqVO.java
  35. 122 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/business/AttendanceBusinessDO.java
  36. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/employeesetting/AttendanceEmployeeSettingDO.java
  37. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/info/AttendanceInfoDO.java
  38. 123 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/leave/AttendanceLeaveDO.java
  39. 115 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/out/AttendanceOutDO.java
  40. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/schedulingmanage/AttendanceSchedulingManageDO.java
  41. 47 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/workdaysetting/AttendanceWorkdaySettingDO.java
  42. 57 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/business/AttendanceBusinessMapper.java
  43. 8 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/employeesetting/AttendanceEmployeeSettingMapper.java
  44. 17 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/info/AttendanceInfoMapper.java
  45. 60 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/leave/AttendanceLeaveMapper.java
  46. 48 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/out/AttendanceOutMapper.java
  47. 2 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/schedulingmanage/AttendanceSchedulingManageMapper.java
  48. 45 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/workdaysetting/AttendanceWorkdaySettingMapper.java
  49. 61 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/business/AttendanceBusinessService.java
  50. 80 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/business/AttendanceBusinessServiceImpl.java
  51. 25 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingService.java
  52. 84 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingServiceImpl.java
  53. 18 4
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoService.java
  54. 296 8
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoServiceImpl.java
  55. 59 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveService.java
  56. 81 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveServiceImpl.java
  57. 56 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/out/AttendanceOutService.java
  58. 72 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/out/AttendanceOutServiceImpl.java
  59. 72 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/workdaysetting/AttendanceWorkdaySettingService.java
  60. 158 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/workdaysetting/AttendanceWorkdaySettingServiceImpl.java
  61. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/business/AttendanceBusinessMapper.xml
  62. 53 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/employeesetting/AttendanceEmployeeSettingMapper.xml
  63. 24 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/info/AttendanceInfoMapper.xml
  64. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/leave/AttendanceLeaveMapper.xml
  65. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/out/AttendanceOutMapper.xml
  66. 12 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/workdaysetting/AttendanceWorkdaySettingMapper.xml
  67. 1 1
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/EmployeeInfoController.java
  68. 1 1
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/EmployeeInfoHistoryController.java
  69. 2 2
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoSaveReqVO.java
  70. 1 1
      yudao-module-personnel/yudao-module-holiday-biz/src/main/java/cn/iocoder/yudao/module/holiday/controller/admin/annualleave/HolidayAnnualLeaveController.java
  71. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/RelationsContractController.java
  72. 5 2
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractPageReqVO.java
  73. 7 3
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractRespVO.java
  74. 6 3
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/contract/vo/RelationsContractSaveReqVO.java
  75. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/conversion/RelationsConversionController.java
  76. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/entry/RelationsEntryController.java
  77. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/renew/RelationsRenewController.java
  78. 1 1
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/controller/admin/turnover/RelationsTurnoverController.java
  79. 8 4
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/dal/dataobject/contract/RelationsContractDO.java
  80. 3 2
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/dal/mysql/contract/RelationsContractMapper.java
  81. 13 0
      yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/dept/PostServiceImpl.java

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

@@ -15,4 +15,8 @@ public interface ErrorCodeConstants {
     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, "导入考勤信息数据不能为空!");
+    ErrorCode ATTENDANCE_LEAVE_NOT_EXISTS = new ErrorCode(1_013_000_004, "请假信息不存在");
+    ErrorCode ATTENDANCE_BUSINESS_NOT_EXISTS = new ErrorCode(1_013_000_005, "出差信息不存在");
+    ErrorCode ATTENDANCE_OUT_NOT_EXISTS = new ErrorCode(1_013_000_006, "公务外出信息不存在");
+    ErrorCode WORKDAY_SETTING_NOT_EXISTS = new ErrorCode(1_013_000_007, "考勤工作日设置不存在");
 }

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

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.business;
+
+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.business.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
+import cn.iocoder.yudao.module.attendance.service.business.AttendanceBusinessService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 出差信息")
+@RestController
+@RequestMapping("/personnel/attendance/business")
+@Validated
+public class AttendanceBusinessController {
+
+    @Resource
+    private AttendanceBusinessService businessService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建出差信息")
+    @PreAuthorize("@ss.hasPermission('attendance:business:create')")
+    public CommonResult<Long> createBusiness(@Valid @RequestBody AttendanceBusinessSaveReqVO createReqVO) {
+        return success(businessService.createBusiness(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新出差信息")
+    @PreAuthorize("@ss.hasPermission('attendance:business:update')")
+    public CommonResult<Boolean> updateBusiness(@Valid @RequestBody AttendanceBusinessSaveReqVO updateReqVO) {
+        businessService.updateBusiness(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除出差信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('attendance:business:delete')")
+    public CommonResult<Boolean> deleteBusiness(@RequestParam("id") Long id) {
+        businessService.deleteBusiness(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得出差信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('attendance:business:query')")
+    public CommonResult<AttendanceBusinessRespVO> getBusiness(@RequestParam("id") Long id) {
+        AttendanceBusinessDO business = businessService.getBusiness(id);
+        return success(BeanUtils.toBean(business, AttendanceBusinessRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得出差信息分页")
+    @PreAuthorize("@ss.hasPermission('attendance:business:query')")
+    public CommonResult<PageResult<AttendanceBusinessRespVO>> getBusinessPage(@Valid AttendanceBusinessPageReqVO pageReqVO) {
+        PageResult<AttendanceBusinessDO> pageResult = businessService.getBusinessPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttendanceBusinessRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出出差信息 Excel")
+    @PreAuthorize("@ss.hasPermission('attendance:business:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportBusinessExcel(@Valid AttendanceBusinessPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceBusinessDO> list = businessService.getBusinessPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "出差信息.xls", "数据", AttendanceBusinessRespVO.class,
+                        BeanUtils.toBean(list, AttendanceBusinessRespVO.class));
+    }
+
+}

+ 91 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessPageReqVO.java

@@ -0,0 +1,91 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.business.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 出差信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AttendanceBusinessPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "20857")
+    private String businessId;
+
+    @Schema(description = "出差人id", example = "797")
+    private Long employeeId;
+
+    @Schema(description = "出差人uuid", example = "5176")
+    private String employeeUuid;
+
+    @Schema(description = "出差员工姓名", example = "芋艿")
+    private String employeeName;
+
+    @Schema(description = "出差员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "25207")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "28825")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "17524")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "30513")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "出差事由", example = "不好")
+    private String reason;
+
+    @Schema(description = "出差目的地")
+    private String destination;
+
+    @Schema(description = "出差开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] startDate;
+
+    @Schema(description = "出差结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] endDate;
+
+    @Schema(description = "出差天数(d)")
+    private String day;
+
+    @Schema(description = "出差预算费用,单位(元)")
+    private BigDecimal estimatedCost;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "13908")
+    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 = "1")
+    private Long tenantId;
+
+}

+ 113 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessRespVO.java

@@ -0,0 +1,113 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.business.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 出差信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AttendanceBusinessRespVO {
+
+    @Schema(description = "出差表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "21097")
+    @ExcelProperty("出差表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "20857")
+    @ExcelProperty("uuid")
+    private String businessId;
+
+    @Schema(description = "出差人id", example = "797")
+    @ExcelProperty("出差人id")
+    private Long employeeId;
+
+    @Schema(description = "出差人uuid", example = "5176")
+    @ExcelProperty("出差人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "出差员工姓名", example = "芋艿")
+    @ExcelProperty("出差员工姓名")
+    private String employeeName;
+
+    @Schema(description = "出差员工手机号")
+    @ExcelProperty("出差员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "25207")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "28825")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "17524")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "30513")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    @ExcelProperty("职位")
+    private String position;
+
+    @Schema(description = "出差事由", example = "不好")
+    @ExcelProperty("出差事由")
+    private String reason;
+
+    @Schema(description = "出差目的地")
+    @ExcelProperty("出差目的地")
+    private String destination;
+
+    @Schema(description = "出差开始日期")
+    @ExcelProperty("出差开始日期")
+    private String startDate;
+
+    @Schema(description = "出差结束日期")
+    @ExcelProperty("出差结束日期")
+    private String endDate;
+
+    @Schema(description = "出差天数(d)")
+    @ExcelProperty("出差天数(d)")
+    private String day;
+
+    @Schema(description = "出差预算费用,单位(元)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("出差预算费用,单位(元)")
+    private BigDecimal estimatedCost;
+
+    @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 = "13908")
+    @ExcelProperty("创建人员工id")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "张三")
+    @ExcelProperty("创建人员工姓名")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+}

+ 86 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessSaveReqVO.java

@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.business.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+
+import javax.validation.constraints.NotNull;
+import java.util.*;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 出差信息新增/修改 Request VO")
+@Data
+public class AttendanceBusinessSaveReqVO {
+
+    @Schema(description = "出差表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "21097")
+    private Long id;
+
+    @Schema(description = "uuid", example = "20857")
+    private String businessId;
+
+    @Schema(description = "出差人id", example = "797")
+    private Long employeeId;
+
+    @Schema(description = "出差人uuid", example = "5176")
+    private String employeeUuid;
+
+    @Schema(description = "出差员工姓名", example = "芋艿")
+    private String employeeName;
+
+    @Schema(description = "出差员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "25207")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "28825")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "17524")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "30513")
+    private String deptUuid;
+
+    @Schema(description = "职位")
+    private String position;
+
+    @Schema(description = "出差事由", example = "不好")
+    private String reason;
+
+    @Schema(description = "出差目的地")
+    private String destination;
+
+    @Schema(description = "出差开始日期")
+    private String startDate;
+
+    @Schema(description = "出差结束日期")
+    private String endDate;
+
+    @Schema(description = "出差天数(d)")
+    private String day;
+
+    @Schema(description = "出差预算费用,单位(元)", requiredMode = Schema.RequiredMode.REQUIRED)
+    @NotNull(message = "出差预算费用,单位(元)不能为空")
+    private BigDecimal estimatedCost;
+
+    @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 = "13908")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "张三")
+    private String creatorEmployeeName;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+}

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting;
 
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingBatchSaveReqVO;
 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;
@@ -34,7 +35,7 @@ import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.*;
 
 @Tag(name = "管理后台 - 考勤员工设置")
 @RestController
-@RequestMapping("/presonnel/attendance/employee-setting")
+@RequestMapping("/personnel/attendance/employee-setting")
 @Validated
 public class AttendanceEmployeeSettingController {
 
@@ -82,6 +83,13 @@ public class AttendanceEmployeeSettingController {
         return success(BeanUtils.toBean(pageResult, AttendanceEmployeeSettingRespVO.class));
     }
 
+    @GetMapping("/info-page")
+    @Operation(summary = "获得考勤员工设置分页")
+//    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:query')")
+    public CommonResult<PageResult<AttendanceEmployeeSettingRespVO>> getEmployeeInfoSettingPage(@Valid AttendanceEmployeeSettingPageReqVO pageReqVO) {
+        return success(employeeSettingService.getEmployeeInfoSettingPage(pageReqVO));
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出考勤员工设置 Excel")
     @PreAuthorize("@ss.hasPermission('attendance:employee-setting:export')")
@@ -95,4 +103,12 @@ public class AttendanceEmployeeSettingController {
                         BeanUtils.toBean(list, AttendanceEmployeeSettingRespVO.class));
     }
 
+    @PutMapping("/batch-update")
+    @Operation(summary = "更新考勤员工设置")
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:update')")
+    public CommonResult<Boolean> batchUpdateEmployeeSetting(@Valid @RequestBody AttendanceEmployeeSettingBatchSaveReqVO updateReqVO) {
+        employeeSettingService.batchUpdateEmployeeSetting(updateReqVO);
+        return success(true);
+    }
+
 }

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

@@ -0,0 +1,24 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
+
+@Schema(description = "管理后台 - 考勤员工设置新增/修改 Request VO")
+@Data
+public class AttendanceEmployeeSettingBatchSaveReqVO {
+
+    @Schema(description = "员工IDS", requiredMode = Schema.RequiredMode.REQUIRED, example = "employeeIds: [12,13,14]")
+    @NotNull(message = "员工IDS不能为空")
+    private List<Long> employeeIds;
+
+    @Schema(description = "排班ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23897")
+    private Long schedulingId;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+}

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

@@ -27,6 +27,9 @@ public class AttendanceEmployeeSettingPageReqVO extends PageParam {
     @Schema(description = "排班ID", example = "23897")
     private Long schedulingId;
 
+    @Schema(description = "班次名称,如早班、中班、晚班等")
+    private String shiftName;
+
     @Schema(description = "考勤地点")
     private String attendanceLocation;
 
@@ -43,4 +46,7 @@ public class AttendanceEmployeeSettingPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
 }

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

@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
+
+import java.time.LocalTime;
 import java.util.*;
 import java.util.*;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -45,6 +47,10 @@ public class AttendanceEmployeeSettingRespVO {
     @ExcelProperty("电子邮箱")
     private String email;
 
+    @Schema(description = "班次名称,如早班、中班、晚班等")
+    @ExcelProperty("班次名称,如早班、中班、晚班等")
+    private String shiftName;
+
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @ExcelProperty("状态")
     private Integer status;
@@ -53,4 +59,16 @@ public class AttendanceEmployeeSettingRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "考勤设置上班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤设置上班时间")
+    private LocalTime startTime;
+
+    @Schema(description = "考勤设置下班时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("考勤设置下班时间")
+    private LocalTime endTime;
+
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
 }

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

@@ -42,4 +42,7 @@ public class AttendanceEmployeeSettingSaveReqVO {
     @NotNull(message = "状态不能为空")
     private Integer status;
 
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
 }

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

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

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

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 每日考勤信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AttendanceDailyInfoPageReqVO extends PageParam {
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    private String employeeName;
+
+    @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
+    private String employeeMobile;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "考勤开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] attendanceStartDate;
+
+    @Schema(description = "考勤结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDate[] attendanceEndDate;
+
+    @Schema(description = "上班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] workStartTime;
+
+    @Schema(description = "下班时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalTime[] workEndTime;
+
+    @Schema(description = "迟到时间(min)", example = "2")
+    private String lateMinute;
+
+    @Schema(description = "早退时间(min)", example = "2")
+    private String earlyMinute;
+
+    @Schema(description = "总工作时间(min)", example = "2")
+    private String totalWorkingMinute;
+
+}

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

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

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

@@ -79,4 +79,7 @@ public class AttendanceInfoPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
 }

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

@@ -89,4 +89,8 @@ public class AttendanceInfoRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
 }

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -71,4 +72,7 @@ public class AttendanceInfoSaveReqVO {
     @NotNull(message = "状态不能为空")
     private Integer status;
 
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
 }

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

@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import javax.validation.constraints.NotEmpty;
+import java.time.LocalDate;
+import java.time.LocalTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 每日考勤信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AttendanceMonthlyInfoPageReqVO extends PageParam {
+
+    @Schema(description = "员工姓名", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+    private String employeeName;
+
+    @Schema(description = "员工编号", example = "6960")
+    private String employeeNumber;
+
+    @Schema(description = "部门名称", example = "13463")
+    private String deptName;
+
+    @Schema(description = "考勤月份", example = "2024-07")
+    private String attendanceMonth;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+
+}

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

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

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

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.leave;
+
+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.leave.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.leave.AttendanceLeaveDO;
+import cn.iocoder.yudao.module.attendance.service.leave.AttendanceLeaveService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 请假信息")
+@RestController
+@RequestMapping("/personnel/attendance/leave")
+@Validated
+public class AttendanceLeaveController {
+
+    @Resource
+    private AttendanceLeaveService leaveService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建请假信息")
+    @PreAuthorize("@ss.hasPermission('attendance:leave:create')")
+    public CommonResult<Long> createLeave(@Valid @RequestBody AttendanceLeaveSaveReqVO createReqVO) {
+        return success(leaveService.createLeave(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新请假信息")
+    @PreAuthorize("@ss.hasPermission('attendance:leave:update')")
+    public CommonResult<Boolean> updateLeave(@Valid @RequestBody AttendanceLeaveSaveReqVO updateReqVO) {
+        leaveService.updateLeave(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除请假信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('attendance:leave:delete')")
+    public CommonResult<Boolean> deleteLeave(@RequestParam("id") Long id) {
+        leaveService.deleteLeave(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得请假信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('attendance:leave:query')")
+    public CommonResult<AttendanceLeaveRespVO> getLeave(@RequestParam("id") Long id) {
+        AttendanceLeaveDO leave = leaveService.getLeave(id);
+        return success(BeanUtils.toBean(leave, AttendanceLeaveRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得请假信息分页")
+    @PreAuthorize("@ss.hasPermission('attendance:leave:query')")
+    public CommonResult<PageResult<AttendanceLeaveRespVO>> getLeavePage(@Valid AttendanceLeavePageReqVO pageReqVO) {
+        PageResult<AttendanceLeaveDO> pageResult = leaveService.getLeavePage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttendanceLeaveRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出请假信息 Excel")
+    @PreAuthorize("@ss.hasPermission('attendance:leave:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportLeaveExcel(@Valid AttendanceLeavePageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceLeaveDO> list = leaveService.getLeavePage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "请假信息.xls", "数据", AttendanceLeaveRespVO.class,
+                        BeanUtils.toBean(list, AttendanceLeaveRespVO.class));
+    }
+
+}

+ 96 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeavePageReqVO.java

@@ -0,0 +1,96 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.leave.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 请假信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AttendanceLeavePageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "9396")
+    private String leaveId;
+
+    @Schema(description = "请假人id", example = "25553")
+    private Long employeeId;
+
+    @Schema(description = "请假人uuid", example = "9213")
+    private String employeeUuid;
+
+    @Schema(description = "请假员工姓名", example = "王五")
+    private String employeeName;
+
+    @Schema(description = "请假员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "20160")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "27340")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "5849")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "864")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "1")
+    private String leaveType;
+
+    @Schema(description = "开始日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] startDate;
+
+    @Schema(description = "具体时间,精确到上下午,am上午 pm下午")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] startTime;
+
+    @Schema(description = "结束日期")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] endDate;
+
+    @Schema(description = "具体时间,精确到上下午,am上午 pm下午")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] endTime;
+
+    @Schema(description = "请假天数")
+    private String day;
+
+    @Schema(description = "请假原因", example = "不香")
+    private String reason;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "22995")
+    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 = "1")
+    private Long tenantId;
+
+}

+ 116 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeaveRespVO.java

@@ -0,0 +1,116 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.leave.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 AttendanceLeaveRespVO {
+
+    @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "11893")
+    @ExcelProperty("请假表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "9396")
+    @ExcelProperty("uuid")
+    private String leaveId;
+
+    @Schema(description = "请假人id", example = "25553")
+    @ExcelProperty("请假人id")
+    private Long employeeId;
+
+    @Schema(description = "请假人uuid", example = "9213")
+    @ExcelProperty("请假人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "请假员工姓名", example = "王五")
+    @ExcelProperty("请假员工姓名")
+    private String employeeName;
+
+    @Schema(description = "请假员工手机号")
+    @ExcelProperty("请假员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "20160")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "27340")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "5849")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "864")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    @ExcelProperty("员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "1")
+    @ExcelProperty("请假类型")
+    private String leaveType;
+
+    @Schema(description = "开始日期")
+    @ExcelProperty("开始日期")
+    private String startDate;
+
+    @Schema(description = "具体时间,精确到上下午,am上午 pm下午")
+    @ExcelProperty("具体时间,精确到上下午,am上午 pm下午")
+    private String startTime;
+
+    @Schema(description = "结束日期")
+    @ExcelProperty("结束日期")
+    private String endDate;
+
+    @Schema(description = "具体时间,精确到上下午,am上午 pm下午")
+    @ExcelProperty("具体时间,精确到上下午,am上午 pm下午")
+    private String endTime;
+
+    @Schema(description = "请假天数")
+    @ExcelProperty("请假天数")
+    private String day;
+
+    @Schema(description = "请假原因", example = "不香")
+    @ExcelProperty("请假原因")
+    private String reason;
+
+    @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 = "22995")
+    @ExcelProperty("创建人员工id")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "张三")
+    @ExcelProperty("创建人员工姓名")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+}

+ 87 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeaveSaveReqVO.java

@@ -0,0 +1,87 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.leave.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+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 AttendanceLeaveSaveReqVO {
+
+    @Schema(description = "请假表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "11893")
+    private Long id;
+
+    @Schema(description = "uuid", example = "9396")
+    private String leaveId;
+
+    @Schema(description = "请假人id", example = "25553")
+    private Long employeeId;
+
+    @Schema(description = "请假人uuid", example = "9213")
+    private String employeeUuid;
+
+    @Schema(description = "请假员工姓名", example = "王五")
+    private String employeeName;
+
+    @Schema(description = "请假员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "20160")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "27340")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "5849")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "864")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "请假类型", example = "1")
+    private String leaveType;
+
+    @Schema(description = "开始日期")
+    private String startDate;
+
+    @Schema(description = "具体时间,精确到上下午,am上午 pm下午")
+    private String startTime;
+
+    @Schema(description = "结束日期")
+    private String endDate;
+
+    @Schema(description = "具体时间,精确到上下午,am上午 pm下午")
+    private String endTime;
+
+    @Schema(description = "请假天数")
+    private String day;
+
+    @Schema(description = "请假原因", example = "不香")
+    private String reason;
+
+    @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 = "22995")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "张三")
+    private String creatorEmployeeName;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+}

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

@@ -0,0 +1,95 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.out;
+
+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.out.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.out.AttendanceOutDO;
+import cn.iocoder.yudao.module.attendance.service.out.AttendanceOutService;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Tag(name = "管理后台 - 公务外出信息")
+@RestController
+@RequestMapping("/personnel/attendance/out")
+@Validated
+public class AttendanceOutController {
+
+    @Resource
+    private AttendanceOutService outService;
+
+    @PostMapping("/create")
+    @Operation(summary = "创建公务外出信息")
+    @PreAuthorize("@ss.hasPermission('attendance:out:create')")
+    public CommonResult<Long> createOut(@Valid @RequestBody AttendanceOutSaveReqVO createReqVO) {
+        return success(outService.createOut(createReqVO));
+    }
+
+    @PutMapping("/update")
+    @Operation(summary = "更新公务外出信息")
+    @PreAuthorize("@ss.hasPermission('attendance:out:update')")
+    public CommonResult<Boolean> updateOut(@Valid @RequestBody AttendanceOutSaveReqVO updateReqVO) {
+        outService.updateOut(updateReqVO);
+        return success(true);
+    }
+
+    @DeleteMapping("/delete")
+    @Operation(summary = "删除公务外出信息")
+    @Parameter(name = "id", description = "编号", required = true)
+    @PreAuthorize("@ss.hasPermission('attendance:out:delete')")
+    public CommonResult<Boolean> deleteOut(@RequestParam("id") Long id) {
+        outService.deleteOut(id);
+        return success(true);
+    }
+
+    @GetMapping("/get")
+    @Operation(summary = "获得公务外出信息")
+    @Parameter(name = "id", description = "编号", required = true, example = "1024")
+    @PreAuthorize("@ss.hasPermission('attendance:out:query')")
+    public CommonResult<AttendanceOutRespVO> getOut(@RequestParam("id") Long id) {
+        AttendanceOutDO out = outService.getOut(id);
+        return success(BeanUtils.toBean(out, AttendanceOutRespVO.class));
+    }
+
+    @GetMapping("/page")
+    @Operation(summary = "获得公务外出信息分页")
+    @PreAuthorize("@ss.hasPermission('attendance:out:query')")
+    public CommonResult<PageResult<AttendanceOutRespVO>> getOutPage(@Valid AttendanceOutPageReqVO pageReqVO) {
+        PageResult<AttendanceOutDO> pageResult = outService.getOutPage(pageReqVO);
+        return success(BeanUtils.toBean(pageResult, AttendanceOutRespVO.class));
+    }
+
+    @GetMapping("/export-excel")
+    @Operation(summary = "导出公务外出信息 Excel")
+    @PreAuthorize("@ss.hasPermission('attendance:out:export')")
+    @ApiAccessLog(operateType = EXPORT)
+    public void exportOutExcel(@Valid AttendanceOutPageReqVO pageReqVO,
+              HttpServletResponse response) throws IOException {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceOutDO> list = outService.getOutPage(pageReqVO).getList();
+        // 导出 Excel
+        ExcelUtils.write(response, "公务外出信息.xls", "数据", AttendanceOutRespVO.class,
+                        BeanUtils.toBean(list, AttendanceOutRespVO.class));
+    }
+
+}

+ 88 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutPageReqVO.java

@@ -0,0 +1,88 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.out.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 公务外出信息分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AttendanceOutPageReqVO extends PageParam {
+
+    @Schema(description = "uuid", example = "16029")
+    private String outId;
+
+    @Schema(description = "外出人id", example = "27799")
+    private Long employeeId;
+
+    @Schema(description = "外出人uuid", example = "22887")
+    private String employeeUuid;
+
+    @Schema(description = "外出员工姓名", example = "芋艿")
+    private String employeeName;
+
+    @Schema(description = "外出员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "13471")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "10860")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "7228")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "29774")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "外出事由", example = "不好")
+    private String reason;
+
+    @Schema(description = "外出地点")
+    private String destination;
+
+    @Schema(description = "外出开始时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] startDate;
+
+    @Schema(description = "外出结束时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] endDate;
+
+    @Schema(description = "外出时长,单位(小时)")
+    private String hour;
+
+    @Schema(description = "备注")
+    private String remarks;
+
+    @Schema(description = "状态", example = "2")
+    private Integer status;
+
+    @Schema(description = "数据来源,0流程添加、1手动添加")
+    private String infoSource;
+
+    @Schema(description = "创建人员工id", example = "6769")
+    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 = "1")
+    private Long tenantId;
+
+}

+ 108 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutRespVO.java

@@ -0,0 +1,108 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.out.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 AttendanceOutRespVO {
+
+    @Schema(description = "出差表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "28683")
+    @ExcelProperty("出差表单主键")
+    private Long id;
+
+    @Schema(description = "uuid", example = "16029")
+    @ExcelProperty("uuid")
+    private String outId;
+
+    @Schema(description = "外出人id", example = "27799")
+    @ExcelProperty("外出人id")
+    private Long employeeId;
+
+    @Schema(description = "外出人uuid", example = "22887")
+    @ExcelProperty("外出人uuid")
+    private String employeeUuid;
+
+    @Schema(description = "外出员工姓名", example = "芋艿")
+    @ExcelProperty("外出员工姓名")
+    private String employeeName;
+
+    @Schema(description = "外出员工手机号")
+    @ExcelProperty("外出员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "13471")
+    @ExcelProperty("用户账号id")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "10860")
+    @ExcelProperty("用户账号uuid")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "7228")
+    @ExcelProperty("部门id")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "29774")
+    @ExcelProperty("部门uuid")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    @ExcelProperty("员工职位")
+    private String position;
+
+    @Schema(description = "外出事由", example = "不好")
+    @ExcelProperty("外出事由")
+    private String reason;
+
+    @Schema(description = "外出地点")
+    @ExcelProperty("外出地点")
+    private String destination;
+
+    @Schema(description = "外出开始时间")
+    @ExcelProperty("外出开始时间")
+    private String startDate;
+
+    @Schema(description = "外出结束时间")
+    @ExcelProperty("外出结束时间")
+    private String endDate;
+
+    @Schema(description = "外出时长,单位(小时)")
+    @ExcelProperty("外出时长,单位(小时)")
+    private String hour;
+
+    @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 = "6769")
+    @ExcelProperty("创建人员工id")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "芋艿")
+    @ExcelProperty("创建人员工姓名")
+    private String creatorEmployeeName;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+}

+ 81 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutSaveReqVO.java

@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.out.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+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 AttendanceOutSaveReqVO {
+
+    @Schema(description = "出差表单主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "28683")
+    private Long id;
+
+    @Schema(description = "uuid", example = "16029")
+    private String outId;
+
+    @Schema(description = "外出人id", example = "27799")
+    private Long employeeId;
+
+    @Schema(description = "外出人uuid", example = "22887")
+    private String employeeUuid;
+
+    @Schema(description = "外出员工姓名", example = "芋艿")
+    private String employeeName;
+
+    @Schema(description = "外出员工手机号")
+    private String employeePhone;
+
+    @Schema(description = "用户账号id", example = "13471")
+    private Long userId;
+
+    @Schema(description = "用户账号uuid", example = "10860")
+    private String userUuid;
+
+    @Schema(description = "部门id", example = "7228")
+    private Long deptId;
+
+    @Schema(description = "部门uuid", example = "29774")
+    private String deptUuid;
+
+    @Schema(description = "员工职位")
+    private String position;
+
+    @Schema(description = "外出事由", example = "不好")
+    private String reason;
+
+    @Schema(description = "外出地点")
+    private String destination;
+
+    @Schema(description = "外出开始时间")
+    private String startDate;
+
+    @Schema(description = "外出结束时间")
+    private String endDate;
+
+    @Schema(description = "外出时长,单位(小时)")
+    private String hour;
+
+    @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 = "6769")
+    private Long creatorEmployeeId;
+
+    @Schema(description = "创建人员工姓名", example = "芋艿")
+    private String creatorEmployeeName;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+}

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

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

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import lombok.*;
 
 import java.time.LocalTime;
@@ -38,4 +39,8 @@ public class AttendanceSchedulingManagePageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
 }

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

@@ -43,4 +43,8 @@ public class AttendanceSchedulingManageRespVO {
     @ExcelProperty("创建时间")
     private LocalDateTime createTime;
 
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
 }

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -35,4 +36,7 @@ public class AttendanceSchedulingManageSaveReqVO {
     @NotNull(message = "状态不能为空")
     private Integer status;
 
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
 }

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

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

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

@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 考勤工作日设置分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class AttendanceWorkdaySettingPageReqVO extends PageParam {
+
+    @Schema(description = "工作月")
+    private String workMonth;
+
+    @Schema(description = "工作日")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private String[] workDate;
+
+    @Schema(description = "状态", example = "1")
+    private Integer status;
+
+    @Schema(description = "创建时间")
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    private LocalDateTime[] createTime;
+
+    @Schema(description = "租户编号", example = "1")
+    private Long tenantId;
+
+}

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

@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 考勤工作日设置 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class AttendanceWorkdaySettingRespVO {
+
+    @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32468")
+    @ExcelProperty("自增主键")
+    private Long id;
+
+    @Schema(description = "工作月")
+    @ExcelProperty("工作月")
+    private String workMonth;
+
+    @Schema(description = "工作日", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("工作日")
+    private String workDate;
+
+    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+    @ExcelProperty("状态")
+    private Integer status;
+
+    @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("创建时间")
+    private LocalDateTime createTime;
+
+    @Schema(description = "租户编号", example = "1")
+    @ExcelProperty("租户编号")
+    private Long tenantId;
+
+}

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

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

+ 122 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/business/AttendanceBusinessDO.java

@@ -0,0 +1,122 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.business;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+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_business")
+@KeySequence("attendance_business_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceBusinessDO extends BaseDO {
+
+    /**
+     * 出差表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String businessId;
+    /**
+     * 出差人id
+     */
+    private Long employeeId;
+    /**
+     * 出差人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 出差员工姓名
+     */
+    private String employeeName;
+    /**
+     * 出差员工手机号
+     */
+    private String employeePhone;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 职位
+     */
+    private String position;
+    /**
+     * 出差事由
+     */
+    private String reason;
+    /**
+     * 出差目的地
+     */
+    private String destination;
+    /**
+     * 出差开始日期
+     */
+    private String startDate;
+    /**
+     * 出差结束日期
+     */
+    private String endDate;
+    /**
+     * 出差天数(d)
+     */
+    private String day;
+    /**
+     * 出差预算费用,单位(元)
+     */
+    private BigDecimal estimatedCost;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+    /**
+     * 创建人员工id
+     */
+    private Long creatorEmployeeId;
+    /**
+     * 创建人员工姓名
+     */
+    private String creatorEmployeeName;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
+
+}

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

@@ -59,5 +59,9 @@ public class AttendanceEmployeeSettingDO extends BaseDO {
      * 状态
      */
     private Integer status;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
 
 }

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

@@ -37,6 +37,10 @@ public class AttendanceInfoDO extends BaseDO {
      * 员工ID
      */
     private Long employeeId;
+    /**
+     * 员工编号
+     */
+    private String employeeNumber;
     /**
      * 员工姓名
      */
@@ -53,6 +57,10 @@ public class AttendanceInfoDO extends BaseDO {
      * 职位名称
      */
     private String position;
+    /**
+     * 考勤月份
+     */
+    private String attendanceMonth;
     /**
      * 考勤日期
      */
@@ -97,5 +105,9 @@ public class AttendanceInfoDO extends BaseDO {
      * 状态
      */
     private Integer status;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
 
 }

+ 123 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/leave/AttendanceLeaveDO.java

@@ -0,0 +1,123 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.leave;
+
+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_leave")
+@KeySequence("attendance_leave_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceLeaveDO extends BaseDO {
+
+    /**
+     * 请假表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String leaveId;
+    /**
+     * 请假人id
+     */
+    private Long employeeId;
+    /**
+     * 请假人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 请假员工姓名
+     */
+    private String employeeName;
+    /**
+     * 请假员工手机号
+     */
+    private String employeePhone;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 员工职位
+     */
+    private String position;
+    /**
+     * 请假类型
+     */
+    private String leaveType;
+    /**
+     * 开始日期
+     */
+    private String startDate;
+    /**
+     * 具体时间,精确到上下午,am上午 pm下午
+     */
+    private String startTime;
+    /**
+     * 结束日期
+     */
+    private String endDate;
+    /**
+     * 具体时间,精确到上下午,am上午 pm下午
+     */
+    private String endTime;
+    /**
+     * 请假天数
+     */
+    private String day;
+    /**
+     * 请假原因
+     */
+    private String reason;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+    /**
+     * 创建人员工id
+     */
+    private Long creatorEmployeeId;
+    /**
+     * 创建人员工姓名
+     */
+    private String creatorEmployeeName;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
+
+}

+ 115 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/out/AttendanceOutDO.java

@@ -0,0 +1,115 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.out;
+
+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_out")
+@KeySequence("attendance_out_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceOutDO extends BaseDO {
+
+    /**
+     * 出差表单主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * uuid
+     */
+    private String outId;
+    /**
+     * 外出人id
+     */
+    private Long employeeId;
+    /**
+     * 外出人uuid
+     */
+    private String employeeUuid;
+    /**
+     * 外出员工姓名
+     */
+    private String employeeName;
+    /**
+     * 外出员工手机号
+     */
+    private String employeePhone;
+    /**
+     * 用户账号id
+     */
+    private Long userId;
+    /**
+     * 用户账号uuid
+     */
+    private String userUuid;
+    /**
+     * 部门id
+     */
+    private Long deptId;
+    /**
+     * 部门uuid
+     */
+    private String deptUuid;
+    /**
+     * 员工职位
+     */
+    private String position;
+    /**
+     * 外出事由
+     */
+    private String reason;
+    /**
+     * 外出地点
+     */
+    private String destination;
+    /**
+     * 外出开始时间
+     */
+    private String startDate;
+    /**
+     * 外出结束时间
+     */
+    private String endDate;
+    /**
+     * 外出时长,单位(小时)
+     */
+    private String hour;
+    /**
+     * 备注
+     */
+    private String remarks;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 数据来源,0流程添加、1手动添加
+     */
+    private String infoSource;
+    /**
+     * 创建人员工id
+     */
+    private Long creatorEmployeeId;
+    /**
+     * 创建人员工姓名
+     */
+    private String creatorEmployeeName;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
+
+}

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

@@ -46,5 +46,9 @@ public class AttendanceSchedulingManageDO extends BaseDO {
      * 状态
      */
     private Integer status;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
 
 }

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

@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting;
+
+import lombok.*;
+import java.util.*;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 考勤工作日设置 DO
+ *
+ * @author zhaopq
+ */
+@TableName("attendance_workday_setting")
+@KeySequence("attendance_workday_setting_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class AttendanceWorkdaySettingDO extends BaseDO {
+
+    /**
+     * 自增主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * 工作月
+     */
+    private String workMonth;
+    /**
+     * 工作日
+     */
+    private String workDate;
+    /**
+     * 状态
+     */
+    private Integer status;
+    /**
+     * 租户编号
+     */
+    private Long tenantId;
+
+}

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

@@ -0,0 +1,57 @@
+package cn.iocoder.yudao.module.attendance.dal.mysql.business;
+
+import java.time.LocalDate;
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.attendance.controller.admin.business.vo.*;
+
+/**
+ * 出差信息 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface AttendanceBusinessMapper extends BaseMapperX<AttendanceBusinessDO> {
+
+    default PageResult<AttendanceBusinessDO> selectPage(AttendanceBusinessPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceBusinessDO>()
+                .eqIfPresent(AttendanceBusinessDO::getBusinessId, reqVO.getBusinessId())
+                .eqIfPresent(AttendanceBusinessDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(AttendanceBusinessDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(AttendanceBusinessDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(AttendanceBusinessDO::getEmployeePhone, reqVO.getEmployeePhone())
+                .eqIfPresent(AttendanceBusinessDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(AttendanceBusinessDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(AttendanceBusinessDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(AttendanceBusinessDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(AttendanceBusinessDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(AttendanceBusinessDO::getReason, reqVO.getReason())
+                .eqIfPresent(AttendanceBusinessDO::getDestination, reqVO.getDestination())
+                .betweenIfPresent(AttendanceBusinessDO::getStartDate, reqVO.getStartDate())
+                .betweenIfPresent(AttendanceBusinessDO::getEndDate, reqVO.getEndDate())
+                .eqIfPresent(AttendanceBusinessDO::getDay, reqVO.getDay())
+                .eqIfPresent(AttendanceBusinessDO::getEstimatedCost, reqVO.getEstimatedCost())
+                .eqIfPresent(AttendanceBusinessDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(AttendanceBusinessDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(AttendanceBusinessDO::getInfoSource, reqVO.getInfoSource())
+                .eqIfPresent(AttendanceBusinessDO::getCreatorEmployeeId, reqVO.getCreatorEmployeeId())
+                .likeIfPresent(AttendanceBusinessDO::getCreatorEmployeeName, reqVO.getCreatorEmployeeName())
+                .betweenIfPresent(AttendanceBusinessDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(AttendanceBusinessDO::getTenantId, reqVO.getTenantId())
+                .orderByDesc(AttendanceBusinessDO::getId));
+    }
+
+    default AttendanceBusinessDO selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return selectOne(new LambdaQueryWrapperX<AttendanceBusinessDO>()
+                .eqIfPresent(AttendanceBusinessDO::getEmployeeId, employeeId)
+                .betweenIfPresent(AttendanceBusinessDO::getStartDate, new LocalDate[]{date})
+                .betweenIfPresent(AttendanceBusinessDO::getEndDate, new LocalDate[]{date})
+                .orderByDesc(AttendanceBusinessDO::getId));
+    }
+
+}

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

@@ -6,8 +6,11 @@ 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.business.AttendanceBusinessDO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 考勤员工设置 Mapper
@@ -28,7 +31,12 @@ public interface AttendanceEmployeeSettingMapper extends BaseMapperX<AttendanceE
                 .eqIfPresent(AttendanceEmployeeSettingDO::getEmail, reqVO.getEmail())
                 .eqIfPresent(AttendanceEmployeeSettingDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(AttendanceEmployeeSettingDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(AttendanceEmployeeSettingDO::getTenantId, reqVO.getTenantId())
                 .orderByDesc(AttendanceEmployeeSettingDO::getId));
     }
 
+    AttendanceEmployeeSettingRespVO getByEmployeeId(@Param("employeeId") Long employeeId);
+
+    List<AttendanceEmployeeSettingRespVO> getEmployeeInfoSettingPage(@Param("reqVO") AttendanceEmployeeSettingPageReqVO reqVO);
+
 }

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

@@ -5,9 +5,12 @@ import java.util.*;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
-import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceInfoPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.workdaysetting.AttendanceWorkdaySettingDO;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 考勤信息 Mapper
@@ -36,6 +39,19 @@ public interface AttendanceInfoMapper extends BaseMapperX<AttendanceInfoDO> {
                 .eqIfPresent(AttendanceInfoDO::getRemarks, reqVO.getRemarks())
                 .eqIfPresent(AttendanceInfoDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(AttendanceInfoDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(AttendanceInfoDO::getTenantId, reqVO.getTenantId())
+                .orderByDesc(AttendanceInfoDO::getId));
+    }
+
+    List<AttendanceDailyInfoRespVO> getDailyInfoPage(@Param("reqVO") AttendanceDailyInfoPageReqVO reqVO);
+
+    default PageResult<AttendanceInfoDO> selectPage(AttendanceMonthlyInfoPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceInfoDO>()
+                .likeIfPresent(AttendanceInfoDO::getEmployeeName, reqVO.getEmployeeName())
+                .likeIfPresent(AttendanceInfoDO::getEmployeeNumber, reqVO.getEmployeeNumber())
+                .eqIfPresent(AttendanceInfoDO::getAttendanceMonth, reqVO.getAttendanceMonth())
+                .eqIfPresent(AttendanceInfoDO::getDeptName, reqVO.getDeptName())
+                .eqIfPresent(AttendanceInfoDO::getTenantId, reqVO.getTenantId())
                 .orderByDesc(AttendanceInfoDO::getId));
     }
 

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

@@ -0,0 +1,60 @@
+package cn.iocoder.yudao.module.attendance.dal.mysql.leave;
+
+import java.time.LocalDate;
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.info.AttendanceInfoDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.leave.AttendanceLeaveDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.attendance.controller.admin.leave.vo.*;
+
+/**
+ * 请假信息 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface AttendanceLeaveMapper extends BaseMapperX<AttendanceLeaveDO> {
+
+    default PageResult<AttendanceLeaveDO> selectPage(AttendanceLeavePageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceLeaveDO>()
+                .eqIfPresent(AttendanceLeaveDO::getLeaveId, reqVO.getLeaveId())
+                .eqIfPresent(AttendanceLeaveDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(AttendanceLeaveDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(AttendanceLeaveDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(AttendanceLeaveDO::getEmployeePhone, reqVO.getEmployeePhone())
+                .eqIfPresent(AttendanceLeaveDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(AttendanceLeaveDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(AttendanceLeaveDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(AttendanceLeaveDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(AttendanceLeaveDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(AttendanceLeaveDO::getLeaveType, reqVO.getLeaveType())
+                .betweenIfPresent(AttendanceLeaveDO::getStartDate, reqVO.getStartDate())
+                .betweenIfPresent(AttendanceLeaveDO::getStartTime, reqVO.getStartTime())
+                .betweenIfPresent(AttendanceLeaveDO::getEndDate, reqVO.getEndDate())
+                .betweenIfPresent(AttendanceLeaveDO::getEndTime, reqVO.getEndTime())
+                .eqIfPresent(AttendanceLeaveDO::getDay, reqVO.getDay())
+                .eqIfPresent(AttendanceLeaveDO::getReason, reqVO.getReason())
+                .eqIfPresent(AttendanceLeaveDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(AttendanceLeaveDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(AttendanceLeaveDO::getInfoSource, reqVO.getInfoSource())
+                .eqIfPresent(AttendanceLeaveDO::getCreatorEmployeeId, reqVO.getCreatorEmployeeId())
+                .likeIfPresent(AttendanceLeaveDO::getCreatorEmployeeName, reqVO.getCreatorEmployeeName())
+                .betweenIfPresent(AttendanceLeaveDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(AttendanceLeaveDO::getTenantId, reqVO.getTenantId())
+                .orderByDesc(AttendanceLeaveDO::getId));
+    }
+
+    default List<AttendanceLeaveDO> selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return selectList(new LambdaQueryWrapperX<AttendanceLeaveDO>()
+                .eqIfPresent(AttendanceLeaveDO::getEmployeeId, employeeId)
+                .betweenIfPresent(AttendanceLeaveDO::getStartDate, new LocalDate[]{date})
+                .betweenIfPresent(AttendanceLeaveDO::getEndDate, new LocalDate[]{date})
+                .orderByDesc(AttendanceLeaveDO::getId));
+    }
+
+}

+ 48 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/out/AttendanceOutMapper.java

@@ -0,0 +1,48 @@
+package cn.iocoder.yudao.module.attendance.dal.mysql.out;
+
+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.leave.AttendanceLeaveDO;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.out.AttendanceOutDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.attendance.controller.admin.out.vo.*;
+
+/**
+ * 公务外出信息 Mapper
+ *
+ * @author zhaopq
+ */
+@Mapper
+public interface AttendanceOutMapper extends BaseMapperX<AttendanceOutDO> {
+
+    default PageResult<AttendanceOutDO> selectPage(AttendanceOutPageReqVO reqVO) {
+        return selectPage(reqVO, new LambdaQueryWrapperX<AttendanceOutDO>()
+                .eqIfPresent(AttendanceOutDO::getOutId, reqVO.getOutId())
+                .eqIfPresent(AttendanceOutDO::getEmployeeId, reqVO.getEmployeeId())
+                .eqIfPresent(AttendanceOutDO::getEmployeeUuid, reqVO.getEmployeeUuid())
+                .likeIfPresent(AttendanceOutDO::getEmployeeName, reqVO.getEmployeeName())
+                .eqIfPresent(AttendanceOutDO::getEmployeePhone, reqVO.getEmployeePhone())
+                .eqIfPresent(AttendanceOutDO::getUserId, reqVO.getUserId())
+                .eqIfPresent(AttendanceOutDO::getUserUuid, reqVO.getUserUuid())
+                .eqIfPresent(AttendanceOutDO::getDeptId, reqVO.getDeptId())
+                .eqIfPresent(AttendanceOutDO::getDeptUuid, reqVO.getDeptUuid())
+                .eqIfPresent(AttendanceOutDO::getPosition, reqVO.getPosition())
+                .eqIfPresent(AttendanceOutDO::getReason, reqVO.getReason())
+                .eqIfPresent(AttendanceOutDO::getDestination, reqVO.getDestination())
+                .betweenIfPresent(AttendanceOutDO::getStartDate, reqVO.getStartDate())
+                .betweenIfPresent(AttendanceOutDO::getEndDate, reqVO.getEndDate())
+                .eqIfPresent(AttendanceOutDO::getHour, reqVO.getHour())
+                .eqIfPresent(AttendanceOutDO::getRemarks, reqVO.getRemarks())
+                .eqIfPresent(AttendanceOutDO::getStatus, reqVO.getStatus())
+                .eqIfPresent(AttendanceOutDO::getInfoSource, reqVO.getInfoSource())
+                .eqIfPresent(AttendanceOutDO::getCreatorEmployeeId, reqVO.getCreatorEmployeeId())
+                .likeIfPresent(AttendanceOutDO::getCreatorEmployeeName, reqVO.getCreatorEmployeeName())
+                .betweenIfPresent(AttendanceOutDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(AttendanceOutDO::getTenantId, reqVO.getTenantId())
+                .orderByDesc(AttendanceOutDO::getId));
+    }
+
+}

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

@@ -5,6 +5,7 @@ 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.out.AttendanceOutDO;
 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.*;
@@ -25,6 +26,7 @@ public interface AttendanceSchedulingManageMapper extends BaseMapperX<Attendance
                 .eqIfPresent(AttendanceSchedulingManageDO::getRemarks, reqVO.getRemarks())
                 .eqIfPresent(AttendanceSchedulingManageDO::getStatus, reqVO.getStatus())
                 .betweenIfPresent(AttendanceSchedulingManageDO::getCreateTime, reqVO.getCreateTime())
+                .eqIfPresent(AttendanceSchedulingManageDO::getTenantId, reqVO.getTenantId())
                 .orderByDesc(AttendanceSchedulingManageDO::getId));
     }
 

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

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

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

@@ -0,0 +1,61 @@
+package cn.iocoder.yudao.module.attendance.service.business;
+
+import java.time.LocalDate;
+import java.util.*;
+import cn.iocoder.yudao.module.attendance.controller.admin.business.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import org.apache.ibatis.annotations.Param;
+
+import javax.validation.Valid;
+
+/**
+ * 出差信息 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceBusinessService {
+
+    /**
+     * 创建出差信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createBusiness(@Valid AttendanceBusinessSaveReqVO createReqVO);
+
+    /**
+     * 更新出差信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateBusiness(@Valid AttendanceBusinessSaveReqVO updateReqVO);
+
+    /**
+     * 删除出差信息
+     *
+     * @param id 编号
+     */
+    void deleteBusiness(Long id);
+
+    /**
+     * 获得出差信息
+     *
+     * @param id 编号
+     * @return 出差信息
+     */
+    AttendanceBusinessDO getBusiness(Long id);
+
+    /**
+     * 获得出差信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 出差信息分页
+     */
+    PageResult<AttendanceBusinessDO> getBusinessPage(AttendanceBusinessPageReqVO pageReqVO);
+
+    AttendanceBusinessDO selectByDateAndEmployeeId(LocalDate date, Long employeeId);
+
+
+}

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

@@ -0,0 +1,80 @@
+package cn.iocoder.yudao.module.attendance.service.business;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import cn.iocoder.yudao.module.attendance.controller.admin.business.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.business.AttendanceBusinessDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.attendance.dal.mysql.business.AttendanceBusinessMapper;
+
+import javax.annotation.Resource;
+
+import java.time.LocalDate;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
+
+/**
+ * 出差信息 Service 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+@Validated
+public class AttendanceBusinessServiceImpl implements AttendanceBusinessService {
+
+    @Resource
+    private AttendanceBusinessMapper businessMapper;
+
+    @Override
+    public Long createBusiness(AttendanceBusinessSaveReqVO createReqVO) {
+        // 插入
+        AttendanceBusinessDO business = BeanUtils.toBean(createReqVO, AttendanceBusinessDO.class);
+        businessMapper.insert(business);
+        // 返回
+        return business.getId();
+    }
+
+    @Override
+    public void updateBusiness(AttendanceBusinessSaveReqVO updateReqVO) {
+        // 校验存在
+        validateBusinessExists(updateReqVO.getId());
+        // 更新
+        AttendanceBusinessDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceBusinessDO.class);
+        businessMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteBusiness(Long id) {
+        // 校验存在
+        validateBusinessExists(id);
+        // 删除
+        businessMapper.deleteById(id);
+    }
+
+    private void validateBusinessExists(Long id) {
+        if (businessMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_BUSINESS_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttendanceBusinessDO getBusiness(Long id) {
+        return businessMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttendanceBusinessDO> getBusinessPage(AttendanceBusinessPageReqVO pageReqVO) {
+        return businessMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public AttendanceBusinessDO selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return businessMapper.selectByDateAndEmployeeId(date, employeeId);
+    }
+
+
+}

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

@@ -1,7 +1,9 @@
 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.AttendanceEmployeeSettingBatchSaveReqVO;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingSaveReqVO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 
@@ -53,4 +55,27 @@ public interface AttendanceEmployeeSettingService {
      */
     PageResult<AttendanceEmployeeSettingDO> getEmployeeSettingPage(AttendanceEmployeeSettingPageReqVO pageReqVO);
 
+    /**
+     * 获得考勤员工设置分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 考勤员工设置分页
+     */
+    PageResult<AttendanceEmployeeSettingRespVO> getEmployeeInfoSettingPage(AttendanceEmployeeSettingPageReqVO pageReqVO);
+    /**
+     * 通过员工ID获得考勤员工设置
+     *
+     * @param employeeId 员工ID
+     * @return 考勤员工设置
+     */
+    AttendanceEmployeeSettingRespVO getByEmployeeId(Long employeeId);
+
+    /**
+     * 更新考勤员工设置
+     *
+     * @param updateReqVO 更新信息
+     */
+    void batchUpdateEmployeeSetting(@Valid AttendanceEmployeeSettingBatchSaveReqVO updateReqVO);
+
+
 }

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

@@ -1,11 +1,18 @@
 package cn.iocoder.yudao.module.attendance.service.employeesetting;
 
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
+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.employeesetting.vo.AttendanceEmployeeSettingBatchSaveReqVO;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingPageReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO;
 import cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingSaveReqVO;
+import cn.iocoder.yudao.module.attendance.controller.admin.info.vo.AttendanceDailyInfoRespVO;
 import cn.iocoder.yudao.module.attendance.dal.dataobject.employeesetting.AttendanceEmployeeSettingDO;
 import cn.iocoder.yudao.module.attendance.dal.mysql.employeesetting.AttendanceEmployeeSettingMapper;
+import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
+import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoService;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.transaction.annotation.Transactional;
@@ -17,6 +24,8 @@ 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;
+import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.ATTENDANCE_SCHEDULING_MANAGE_NOT_EXISTS;
+import static cn.iocoder.yudao.module.employee.enums.ErrorCodeConstants.EMPLOYEE_INFO_NOT_EXISTS;
 
 /**
  * 考勤员工设置 Service 实现类
@@ -29,6 +38,8 @@ public class AttendanceEmployeeSettingServiceImpl implements AttendanceEmployeeS
 
     @Resource
     private AttendanceEmployeeSettingMapper employeeSettingMapper;
+    @Resource
+    private EmployeeInfoService employeeInfoService;
 
     @Override
     @TenantIgnore
@@ -78,4 +89,77 @@ public class AttendanceEmployeeSettingServiceImpl implements AttendanceEmployeeS
         return employeeSettingMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    @TenantIgnore
+    public PageResult<AttendanceEmployeeSettingRespVO> getEmployeeInfoSettingPage(AttendanceEmployeeSettingPageReqVO pageReqVO) {
+        // 获取用户信息和租户ID
+        LoginUser user = SecurityFrameworkUtils.getLoginUser();
+        Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
+        pageReqVO.setTenantId(tenantId);
+        List<AttendanceEmployeeSettingRespVO> list = employeeSettingMapper.getEmployeeInfoSettingPage(pageReqVO);
+        return new PageResult<>(list, (long) list.size());
+    }
+
+    @Override
+    @TenantIgnore
+    public AttendanceEmployeeSettingRespVO getByEmployeeId(Long employeeId) {
+        return employeeSettingMapper.getByEmployeeId(employeeId);
+    }
+
+    @Override
+    @TenantIgnore
+    public void batchUpdateEmployeeSetting(AttendanceEmployeeSettingBatchSaveReqVO updateReqVO) {
+        List<Long> employeeIds = updateReqVO.getEmployeeIds();
+        Long schedulingId = updateReqVO.getSchedulingId();
+        if (schedulingId == null) {
+            throw exception(ATTENDANCE_SCHEDULING_MANAGE_NOT_EXISTS);
+        }
+        for (Long employeeId : employeeIds) {
+            // 校验存在
+            boolean exists = validateEmployeeSettingExistsByEmployeeId(employeeId);
+            if (exists) {
+                // 更新
+                AttendanceEmployeeSettingDO updateObj = new AttendanceEmployeeSettingDO();
+                updateObj.setSchedulingId(schedulingId);
+                employeeSettingMapper.updateById(updateObj);
+            } else {
+                // 先查询员工信息
+                EmployeeInfoDO employeeInfoDO = employeeInfoService.getInfo(employeeId);
+                if (employeeInfoDO == null) {
+                    throw exception(EMPLOYEE_INFO_NOT_EXISTS);
+                }
+                // 新增
+                AttendanceEmployeeSettingDO employeeSetting = new AttendanceEmployeeSettingDO();
+                // 设置非空字段
+                if (employeeInfoDO.getName() != null) {
+                    employeeSetting.setName(employeeInfoDO.getName());
+                }
+                if (employeeInfoDO.getDeptId() != null) {
+                    employeeSetting.setDeptId(employeeInfoDO.getDeptId());
+                }
+                employeeSetting.setSchedulingId(schedulingId);
+                employeeSetting.setEmployeeId(employeeId);
+
+                if (employeeInfoDO.getEmail() != null) {
+                    employeeSetting.setEmail(employeeInfoDO.getEmail());
+                }
+                if (employeeInfoDO.getPhone() != null) {
+                    employeeSetting.setPhoneNumber(employeeInfoDO.getPhone());
+                }
+
+                if (employeeInfoDO.getTenantId() != null) {
+                    employeeSetting.setTenantId(employeeInfoDO.getTenantId());
+                }
+
+                employeeSettingMapper.insert(employeeSetting);
+            }
+        }
+    }
+
+    @TenantIgnore
+    private boolean validateEmployeeSettingExistsByEmployeeId(Long employeeId) {
+        return employeeSettingMapper.getByEmployeeId(employeeId) != null;
+    }
+
+
 }

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

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

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

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

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

@@ -0,0 +1,59 @@
+package cn.iocoder.yudao.module.attendance.service.leave;
+
+import java.time.LocalDate;
+import java.util.*;
+import cn.iocoder.yudao.module.attendance.controller.admin.leave.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.leave.AttendanceLeaveDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 请假信息 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceLeaveService {
+
+    /**
+     * 创建请假信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createLeave(@Valid AttendanceLeaveSaveReqVO createReqVO);
+
+    /**
+     * 更新请假信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateLeave(@Valid AttendanceLeaveSaveReqVO updateReqVO);
+
+    /**
+     * 删除请假信息
+     *
+     * @param id 编号
+     */
+    void deleteLeave(Long id);
+
+    /**
+     * 获得请假信息
+     *
+     * @param id 编号
+     * @return 请假信息
+     */
+    AttendanceLeaveDO getLeave(Long id);
+
+    /**
+     * 获得请假信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 请假信息分页
+     */
+    PageResult<AttendanceLeaveDO> getLeavePage(AttendanceLeavePageReqVO pageReqVO);
+
+    List<AttendanceLeaveDO> selectByDateAndEmployeeId(LocalDate date, Long employeeId);
+
+}

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

@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.attendance.service.leave;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import cn.iocoder.yudao.module.attendance.controller.admin.leave.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.leave.AttendanceLeaveDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.attendance.dal.mysql.leave.AttendanceLeaveMapper;
+
+import javax.annotation.Resource;
+
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.attendance.enums.ErrorCodeConstants.*;
+
+/**
+ * 请假信息 Service 实现类
+ *
+ * @author zhaopq
+ */
+@Service
+@Validated
+public class AttendanceLeaveServiceImpl implements AttendanceLeaveService {
+
+    @Resource
+    private AttendanceLeaveMapper leaveMapper;
+
+    @Override
+    public Long createLeave(AttendanceLeaveSaveReqVO createReqVO) {
+        // 插入
+        AttendanceLeaveDO leave = BeanUtils.toBean(createReqVO, AttendanceLeaveDO.class);
+        leaveMapper.insert(leave);
+        // 返回
+        return leave.getId();
+    }
+
+    @Override
+    public void updateLeave(AttendanceLeaveSaveReqVO updateReqVO) {
+        // 校验存在
+        validateLeaveExists(updateReqVO.getId());
+        // 更新
+        AttendanceLeaveDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceLeaveDO.class);
+        leaveMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteLeave(Long id) {
+        // 校验存在
+        validateLeaveExists(id);
+        // 删除
+        leaveMapper.deleteById(id);
+    }
+
+    private void validateLeaveExists(Long id) {
+        if (leaveMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_LEAVE_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttendanceLeaveDO getLeave(Long id) {
+        return leaveMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttendanceLeaveDO> getLeavePage(AttendanceLeavePageReqVO pageReqVO) {
+        return leaveMapper.selectPage(pageReqVO);
+    }
+
+    @Override
+    public List<AttendanceLeaveDO> selectByDateAndEmployeeId(LocalDate date, Long employeeId) {
+        return leaveMapper.selectByDateAndEmployeeId(date, employeeId);
+    }
+
+}

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

@@ -0,0 +1,56 @@
+package cn.iocoder.yudao.module.attendance.service.out;
+
+import java.util.*;
+import cn.iocoder.yudao.module.attendance.controller.admin.out.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.out.AttendanceOutDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+
+import javax.validation.Valid;
+
+/**
+ * 公务外出信息 Service 接口
+ *
+ * @author zhaopq
+ */
+public interface AttendanceOutService {
+
+    /**
+     * 创建公务外出信息
+     *
+     * @param createReqVO 创建信息
+     * @return 编号
+     */
+    Long createOut(@Valid AttendanceOutSaveReqVO createReqVO);
+
+    /**
+     * 更新公务外出信息
+     *
+     * @param updateReqVO 更新信息
+     */
+    void updateOut(@Valid AttendanceOutSaveReqVO updateReqVO);
+
+    /**
+     * 删除公务外出信息
+     *
+     * @param id 编号
+     */
+    void deleteOut(Long id);
+
+    /**
+     * 获得公务外出信息
+     *
+     * @param id 编号
+     * @return 公务外出信息
+     */
+    AttendanceOutDO getOut(Long id);
+
+    /**
+     * 获得公务外出信息分页
+     *
+     * @param pageReqVO 分页查询
+     * @return 公务外出信息分页
+     */
+    PageResult<AttendanceOutDO> getOutPage(AttendanceOutPageReqVO pageReqVO);
+
+}

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

@@ -0,0 +1,72 @@
+package cn.iocoder.yudao.module.attendance.service.out;
+
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import cn.iocoder.yudao.module.attendance.controller.admin.out.vo.*;
+import cn.iocoder.yudao.module.attendance.dal.dataobject.out.AttendanceOutDO;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+
+import cn.iocoder.yudao.module.attendance.dal.mysql.out.AttendanceOutMapper;
+
+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 AttendanceOutServiceImpl implements AttendanceOutService {
+
+    @Resource
+    private AttendanceOutMapper outMapper;
+
+    @Override
+    public Long createOut(AttendanceOutSaveReqVO createReqVO) {
+        // 插入
+        AttendanceOutDO out = BeanUtils.toBean(createReqVO, AttendanceOutDO.class);
+        outMapper.insert(out);
+        // 返回
+        return out.getId();
+    }
+
+    @Override
+    public void updateOut(AttendanceOutSaveReqVO updateReqVO) {
+        // 校验存在
+        validateOutExists(updateReqVO.getId());
+        // 更新
+        AttendanceOutDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceOutDO.class);
+        outMapper.updateById(updateObj);
+    }
+
+    @Override
+    public void deleteOut(Long id) {
+        // 校验存在
+        validateOutExists(id);
+        // 删除
+        outMapper.deleteById(id);
+    }
+
+    private void validateOutExists(Long id) {
+        if (outMapper.selectById(id) == null) {
+            throw exception(ATTENDANCE_OUT_NOT_EXISTS);
+        }
+    }
+
+    @Override
+    public AttendanceOutDO getOut(Long id) {
+        return outMapper.selectById(id);
+    }
+
+    @Override
+    public PageResult<AttendanceOutDO> getOutPage(AttendanceOutPageReqVO pageReqVO) {
+        return outMapper.selectPage(pageReqVO);
+    }
+
+}

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

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

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

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

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

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

@@ -8,5 +8,58 @@
         代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
         文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
      -->
+    <!-- 通过员工ID获得考勤员工设置 -->
+    <select id="getByEmployeeId" resultType="cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO">
+        SELECT
+            aes.employee_id,
+            aes.name,
+            asm.shift_name,
+            asm.start_time,
+            asm.end_time
+        FROM
+            attendance_employee_setting aes
+            LEFT JOIN attendance_scheduling_manage asm ON asm.id = aes.scheduling_id
+        WHERE
+            aes.deleted = 0 AND aes.status = 0
+            AND asm.deleted = 0 AND asm.status = 0
+            AND aes.employee_id = #{employeeId}
+        LIMIT 1
+    </select>
+
+    <!-- 获得考勤员工设置分页 -->
+    <select id="getEmployeeInfoSettingPage" resultType="cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO">
+        SELECT
+            aes.id as 'id',
+            ei.id as 'employeeId',
+            ei.name,
+            ei.phone as 'employeePhone',
+            ei.employee_number,
+            asm.shift_name,
+            asm.start_time,
+            asm.end_time,
+            ei.tenant_id
+        FROM
+            employee_info ei
+            LEFT JOIN attendance_employee_setting aes on aes.employee_id = ei.id AND aes.deleted = 0 AND aes.status = 0
+            LEFT JOIN attendance_scheduling_manage asm ON asm.id = aes.scheduling_id AND asm.deleted = 0 AND asm.status = 0
+        WHERE
+            ei.deleted = 0
+        <if test="reqVO.tenantId != null">
+            AND ei.tenant_id = #{reqVO.tenantId}
+        </if>
+        <if test="reqVO.name != null and reqVO.name != ''">
+            AND ei.name LIKE CONCAT('%', #{reqVO.name}, '%')
+        </if>
+        <if test="reqVO.shiftName != null and reqVO.shiftName != ''">
+            AND asm.shift_name LIKE CONCAT('%', #{reqVO.shiftName}, '%')
+        </if>
+        <if test="reqVO.phoneNumber != null and reqVO.phoneNumber != ''">
+            AND ei.phone LIKE CONCAT('%', #{reqVO.phoneNumber}, '%')
+        </if>
+        ORDER BY ei.id
+        <if test="reqVO.pageSize != null and reqVO.pageNo != null">
+            LIMIT #{reqVO.pageNo}, #{reqVO.pageSize}
+        </if>
+    </select>
 
 </mapper>

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

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

+ 12 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/leave/AttendanceLeaveMapper.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.leave.AttendanceLeaveMapper">
+
+    <!--
+        一般情况下,尽可能使用 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/out/AttendanceOutMapper.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.out.AttendanceOutMapper">
+
+    <!--
+        一般情况下,尽可能使用 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/workdaysetting/AttendanceWorkdaySettingMapper.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.iocoder.yudao.module.attendance.dal.mysql.workdaysetting.AttendanceWorkdaySettingMapper">
+
+    <!--
+        一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
+        无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
+        代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
+        文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
+     -->
+
+</mapper>

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

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

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

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

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

@@ -50,7 +50,7 @@ public class EmployeeInfoSaveReqVO {
     @Schema(description = "离职原因", example = "不香")
     private String resignationReason;
 
-    @Schema(description = "员工状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @Schema(description = "员工状态:0-在职,1-试用,2-离职", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @NotEmpty(message = "员工状态不能为空")
     private String employeeStatus;
 
@@ -144,7 +144,7 @@ public class EmployeeInfoSaveReqVO {
     @Schema(description = "头像地址")
     private String avatar;
 
-    @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
+    @Schema(description = "状态:0-开启,1-关闭", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
     @NotNull(message = "状态不能为空")
     private Integer status;
 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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