Browse Source

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

dongpo 7 months ago
parent
commit
2a1455cb5b
47 changed files with 437 additions and 43 deletions
  1. 2 0
      yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java
  2. 4 0
      yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java
  3. 46 0
      yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/LocalTimeConverter.java
  4. 1 1
      yudao-module-finance/yudao-module-cash-biz/src/main/java/cn/iocoder/yudao/module/cash/controller/admin/paymentinfo/PaymentInfoController.java
  5. 1 1
      yudao-module-finance/yudao-module-cash-biz/src/main/java/cn/iocoder/yudao/module/cash/controller/admin/refundinfo/RefundInfoController.java
  6. 1 1
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expenseinfo/ExpenseInfoController.java
  7. 1 1
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expenseitem/ExpenseItemController.java
  8. 1 1
      yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expensetype/ExpenseTypeController.java
  9. 29 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/AttendanceBusinessController.java
  10. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessRespVO.java
  11. 3 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/business/vo/AttendanceBusinessSaveReqVO.java
  12. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/AttendanceEmployeeSettingController.java
  13. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/employeesetting/vo/AttendanceEmployeeSettingRespVO.java
  14. 3 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/AttendanceInfoController.java
  15. 5 5
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoPageReqVO.java
  16. 7 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoRespVO.java
  17. 0 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoSaveReqVO.java
  18. 3 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoRespVO.java
  19. 30 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/AttendanceLeaveController.java
  20. 6 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeaveRespVO.java
  21. 3 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/leave/vo/AttendanceLeaveSaveReqVO.java
  22. 30 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/AttendanceOutController.java
  23. 6 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutRespVO.java
  24. 3 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/out/vo/AttendanceOutSaveReqVO.java
  25. 9 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/AttendanceSchedulingManageController.java
  26. 4 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageRespVO.java
  27. 0 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/schedulingmanage/vo/AttendanceSchedulingManageSaveReqVO.java
  28. 2 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/AttendanceWorkdaySettingController.java
  29. 17 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingDatesReqVO.java
  30. 2 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/workdaysetting/vo/AttendanceWorkdaySettingRespVO.java
  31. 1 5
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/info/AttendanceInfoDO.java
  32. 0 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/info/AttendanceInfoMapper.java
  33. 41 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/business/AttendanceBusinessServiceImpl.java
  34. 9 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/employeesetting/AttendanceEmployeeSettingServiceImpl.java
  35. 2 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoService.java
  36. 12 5
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoServiceImpl.java
  37. 41 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/leave/AttendanceLeaveServiceImpl.java
  38. 41 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/out/AttendanceOutServiceImpl.java
  39. 10 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/employeesetting/AttendanceEmployeeSettingMapper.xml
  40. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/info/AttendanceInfoMapper.xml
  41. 1 0
      yudao-module-personnel/yudao-module-employee-api/src/main/java/cn/iocoder/yudao/module/employee/api/dto/EmployeeRespDTO.java
  42. 3 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/controller/admin/info/vo/EmployeeInfoQueryReqVO.java
  43. 1 0
      yudao-module-personnel/yudao-module-employee-biz/src/main/java/cn/iocoder/yudao/module/employee/dal/mysql/info/EmployeeInfoMapper.java
  44. 14 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/service/conversion/RelationsConversionServiceImpl.java
  45. 14 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/service/renew/RelationsRenewServiceImpl.java
  46. 14 0
      yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/service/turnover/RelationsTurnoverServiceImpl.java
  47. 4 0
      yudao-server/src/main/resources/application-local.yaml

+ 2 - 0
yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/date/DateUtils.java

@@ -27,6 +27,8 @@ public class DateUtils {
 
     public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss";
 
+    public static final String FORMAT_HOUR_MINUTE = "HH:mm";
+
     /**
      * 将 LocalDateTime 转换成 Date
      *

+ 4 - 0
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.framework.excel.core.util;
 
 import cn.iocoder.yudao.framework.excel.core.handler.SelectSheetWriteHandler;
 import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.converters.localdatetime.LocalDateTimeDateConverter;
 import com.alibaba.excel.converters.longconverter.LongStringConverter;
 import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
 import org.springframework.web.multipart.MultipartFile;
@@ -38,6 +39,7 @@ public class ExcelUtils {
                 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 基于 column 长度,自动适配。最大 255 宽度
                 .registerWriteHandler(new SelectSheetWriteHandler(head)) // 基于固定 sheet 实现下拉框
                 .registerConverter(new LongStringConverter()) // 避免 Long 类型丢失精度
+                .registerConverter(new LocalTimeConverter()) // 注册 LocalTime 转换器
                 .sheet(sheetName).doWrite(data);
         // 设置 header 和 contentType。写在最后的原因是,避免报错时,响应 contentType 已经被修改了
         response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
@@ -50,4 +52,6 @@ public class ExcelUtils {
                 .doReadAllSync();
     }
 
+
+
 }

+ 46 - 0
yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/LocalTimeConverter.java

@@ -0,0 +1,46 @@
+package cn.iocoder.yudao.framework.excel.core.util;
+
+import com.alibaba.excel.converters.Converter;
+import com.alibaba.excel.enums.CellDataTypeEnum;
+import com.alibaba.excel.metadata.GlobalConfiguration;
+import com.alibaba.excel.metadata.data.WriteCellData;
+import com.alibaba.excel.metadata.property.ExcelContentProperty;
+
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+
+public class LocalTimeConverter implements Converter<LocalTime> {
+
+    @Override
+    public Class supportJavaTypeKey() {
+        return LocalTime.class;
+    }
+
+    @Override
+    public CellDataTypeEnum supportExcelTypeKey() {
+        // 明确指定支持 Excel 中的字符串类型
+        return CellDataTypeEnum.STRING;
+    }
+
+    @Override
+    public WriteCellData<?> convertToExcelData(LocalTime value, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception {
+        if (value == null) {
+            return new WriteCellData<>();
+        }
+
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss"); // 默认格式
+        String format = null;
+        if (contentProperty != null && contentProperty.getDateTimeFormatProperty() != null) {
+            format = contentProperty.getDateTimeFormatProperty().getFormat();
+            if (format != null && !format.isEmpty()) {
+                formatter = DateTimeFormatter.ofPattern(format);
+            }
+        }
+
+        String formattedTime = value.format(formatter);
+        return new WriteCellData<>(formattedTime);
+    }
+
+    // convertToJavaData 方法在这个场景中可能不需要,因为我们只关心写入操作
+    // 如果需要处理从 Excel 读取到 Java 的情况,则需要实现该方法
+}

+ 1 - 1
yudao-module-finance/yudao-module-cash-biz/src/main/java/cn/iocoder/yudao/module/cash/controller/admin/paymentinfo/PaymentInfoController.java

@@ -32,7 +32,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 付款信息")
 @RestController
-@RequestMapping("/cash/payment-info")
+@RequestMapping("/finance/cash/payment-info")
 @Validated
 public class PaymentInfoController {
 

+ 1 - 1
yudao-module-finance/yudao-module-cash-biz/src/main/java/cn/iocoder/yudao/module/cash/controller/admin/refundinfo/RefundInfoController.java

@@ -32,7 +32,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 回款信息")
 @RestController
-@RequestMapping("/cash/refund-info")
+@RequestMapping("/finance/cash/refund-info")
 @Validated
 public class RefundInfoController {
 

+ 1 - 1
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expenseinfo/ExpenseInfoController.java

@@ -44,7 +44,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 报销信息")
 @RestController
-@RequestMapping("/expense/info")
+@RequestMapping("/finance/expense/info")
 @Validated
 public class ExpenseInfoController {
 

+ 1 - 1
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expenseitem/ExpenseItemController.java

@@ -36,7 +36,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 报销费用项目信息")
 @RestController
-@RequestMapping("/expense/item")
+@RequestMapping("/finance/expense/item")
 @Validated
 public class ExpenseItemController {
 

+ 1 - 1
yudao-module-finance/yudao-module-expense-biz/src/main/java/cn/iocoder/yudao/module/expense/controller/admin/expensetype/ExpenseTypeController.java

@@ -36,7 +36,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 
 @Tag(name = "管理后台 - 报销类型信息")
 @RestController
-@RequestMapping("/expense/type")
+@RequestMapping("/finance/expense/type")
 @Validated
 public class ExpenseTypeController {
 

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

@@ -1,5 +1,8 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.business;
 
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -37,6 +40,8 @@ public class AttendanceBusinessController {
 
     @Resource
     private AttendanceBusinessService businessService;
+    @Resource
+    private DeptApi deptApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建出差信息")
@@ -68,7 +73,16 @@ public class AttendanceBusinessController {
     @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));
+        AttendanceBusinessRespVO respVO = BeanUtils.toBean(business, AttendanceBusinessRespVO.class);
+        // 部门
+        if (respVO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(respVO.getDeptId());
+            respVO.setDeptName(dept.getName());
+            if (dept != null && StringUtils.isNotBlank(dept.getName())) {
+                respVO.setDeptName(dept.getName());
+            }
+        }
+        return success(respVO);
     }
 
     @GetMapping("/page")
@@ -76,7 +90,20 @@ public class AttendanceBusinessController {
     @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));
+        PageResult<AttendanceBusinessRespVO> result = BeanUtils.toBean(pageResult, AttendanceBusinessRespVO.class);
+        if (result != null && result.getList() != null && result.getList().size() > 0) {
+            result.getList().forEach(respVO -> {
+                // 部门
+                if (respVO.getDeptId() != null) {
+                    DeptRespDTO dept = deptApi.getDept(respVO.getDeptId());
+                    respVO.setDeptName(dept.getName());
+                    if (dept != null && StringUtils.isNotBlank(dept.getName())) {
+                        respVO.setDeptName(dept.getName());
+                    }
+                }
+            });
+        }
+        return success(result);
     }
 
     @GetMapping("/export-excel")

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

@@ -54,6 +54,10 @@ public class AttendanceBusinessRespVO {
     @ExcelProperty("部门uuid")
     private String deptUuid;
 
+    @Schema(description = "部门名称", example = "财务部")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
     @Schema(description = "职位")
     @ExcelProperty("职位")
     private String position;

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

@@ -68,7 +68,6 @@ public class AttendanceBusinessSaveReqVO {
     private String remarks;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "状态不能为空")
     private Integer status;
 
     @Schema(description = "数据来源,0流程添加、1手动添加")
@@ -83,4 +82,7 @@ public class AttendanceBusinessSaveReqVO {
     @Schema(description = "租户编号", example = "1")
     private Long tenantId;
 
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
 }

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

@@ -85,7 +85,7 @@ public class AttendanceEmployeeSettingController {
 
     @GetMapping("/info-page")
     @Operation(summary = "获得考勤员工设置分页")
-//    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:query')")
+    @PreAuthorize("@ss.hasPermission('attendance:employee-setting:query')")
     public CommonResult<PageResult<AttendanceEmployeeSettingRespVO>> getEmployeeInfoSettingPage(@Valid AttendanceEmployeeSettingPageReqVO pageReqVO) {
         return success(employeeSettingService.getEmployeeInfoSettingPage(pageReqVO));
     }

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

@@ -31,6 +31,10 @@ public class AttendanceEmployeeSettingRespVO {
     @ExcelProperty("部门ID")
     private Long deptId;
 
+    @Schema(description = "部门名称", example = "人事部")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
     @Schema(description = "排班ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "23897")
     @ExcelProperty("排班ID")
     private Long schedulingId;

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

@@ -108,14 +108,15 @@ public class AttendanceInfoController {
     @GetMapping("/dailyPage")
     @Operation(summary = "获得每日考勤信息分页")
     @PreAuthorize("@ss.hasPermission('attendance:info:query')")
-    public CommonResult<List<AttendanceDailyInfoRespVO>> getDailyInfoPage(@Valid AttendanceDailyInfoPageReqVO pageReqVO) {
+    public CommonResult<PageResult<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) {
+    public CommonResult<PageResult<AttendanceMonthlyInfoRespVO>> getMonthlyInfoPage(@Valid AttendanceMonthlyInfoPageReqVO pageReqVO) {
         return success(infoService.getMonthlyInfoPage(pageReqVO));
     }
 

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

@@ -12,7 +12,7 @@ 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;
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.*;
 
 @Schema(description = "管理后台 - 每日考勤信息分页 Request VO")
 @Data
@@ -30,19 +30,19 @@ public class AttendanceDailyInfoPageReqVO extends PageParam {
     private String deptName;
 
     @Schema(description = "考勤开始日期")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
     private LocalDate[] attendanceStartDate;
 
     @Schema(description = "考勤结束日期")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
     private LocalDate[] attendanceEndDate;
 
     @Schema(description = "上班时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @DateTimeFormat(pattern = FORMAT_HOUR_MINUTE)
     private LocalTime[] workStartTime;
 
     @Schema(description = "下班时间")
-    @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+    @DateTimeFormat(pattern = FORMAT_HOUR_MINUTE)
     private LocalTime[] workEndTime;
 
     @Schema(description = "迟到时间(min)", example = "2")

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -43,22 +44,27 @@ public class AttendanceInfoRespVO {
 
     @Schema(description = "考勤日期", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("考勤日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDate attendanceDate;
 
     @Schema(description = "上班时间")
     @ExcelProperty("上班时间")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime workStartTime;
 
     @Schema(description = "下班时间")
     @ExcelProperty("下班时间")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime workEndTime;
 
     @Schema(description = "迟到时间(如有)")
     @ExcelProperty("迟到时间(如有)")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime lateTime;
 
     @Schema(description = "早退时间(如有)")
     @ExcelProperty("早退时间(如有)")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime leaveEarlyTime;
 
     @Schema(description = "加班时长(小时)")
@@ -87,6 +93,7 @@ public class AttendanceInfoRespVO {
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     @Schema(description = "租户编号", example = "1")

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

@@ -69,7 +69,6 @@ public class AttendanceInfoSaveReqVO {
     private String remarks;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "状态不能为空")
     private Integer status;
 
     @Schema(description = "租户编号", example = "1")

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

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.attendance.controller.admin.info.vo;
 
 import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
 import com.alibaba.excel.annotation.ExcelProperty;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
@@ -57,10 +58,12 @@ public class AttendanceMonthlyInfoRespVO {
 
     @Schema(description = "考勤设置上班时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("考勤设置上班时间")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime startTime;
 
     @Schema(description = "考勤设置下班时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("考勤设置下班时间")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime endTime;
 
 }

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

@@ -1,5 +1,9 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.leave;
 
+import cn.iocoder.yudao.module.attendance.controller.admin.business.vo.AttendanceBusinessRespVO;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -37,6 +41,8 @@ public class AttendanceLeaveController {
 
     @Resource
     private AttendanceLeaveService leaveService;
+    @Resource
+    private DeptApi deptApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建请假信息")
@@ -68,7 +74,16 @@ public class AttendanceLeaveController {
     @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));
+        AttendanceLeaveRespVO respVO = BeanUtils.toBean(leave, AttendanceLeaveRespVO.class);
+        // 部门
+        if (respVO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(respVO.getDeptId());
+            respVO.setDeptName(dept.getName());
+            if (dept != null && StringUtils.isNotBlank(dept.getName())) {
+                respVO.setDeptName(dept.getName());
+            }
+        }
+        return success(respVO);
     }
 
     @GetMapping("/page")
@@ -76,7 +91,20 @@ public class AttendanceLeaveController {
     @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));
+        PageResult<AttendanceLeaveRespVO> result = BeanUtils.toBean(pageResult, AttendanceLeaveRespVO.class);
+        if (result != null && result.getList() != null && result.getList().size() > 0) {
+            result.getList().forEach(respVO -> {
+                // 部门
+                if (respVO.getDeptId() != null) {
+                    DeptRespDTO dept = deptApi.getDept(respVO.getDeptId());
+                    respVO.setDeptName(dept.getName());
+                    if (dept != null && StringUtils.isNotBlank(dept.getName())) {
+                        respVO.setDeptName(dept.getName());
+                    }
+                }
+            });
+        }
+        return success(result);
     }
 
     @GetMapping("/export-excel")

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.leave.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
@@ -53,6 +54,10 @@ public class AttendanceLeaveRespVO {
     @ExcelProperty("部门uuid")
     private String deptUuid;
 
+    @Schema(description = "部门名称", example = "财务部")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
     @Schema(description = "员工职位")
     @ExcelProperty("员工职位")
     private String position;
@@ -107,6 +112,7 @@ public class AttendanceLeaveRespVO {
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     @Schema(description = "租户编号", example = "1")

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

@@ -69,7 +69,6 @@ public class AttendanceLeaveSaveReqVO {
     private String remarks;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "状态不能为空")
     private Integer status;
 
     @Schema(description = "数据来源,0流程添加、1手动添加")
@@ -84,4 +83,7 @@ public class AttendanceLeaveSaveReqVO {
     @Schema(description = "租户编号", example = "1")
     private Long tenantId;
 
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
 }

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

@@ -1,5 +1,9 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.out;
 
+import cn.iocoder.yudao.module.attendance.controller.admin.leave.vo.AttendanceLeaveRespVO;
+import cn.iocoder.yudao.module.system.api.dept.DeptApi;
+import cn.iocoder.yudao.module.system.api.dept.dto.DeptRespDTO;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -37,6 +41,8 @@ public class AttendanceOutController {
 
     @Resource
     private AttendanceOutService outService;
+    @Resource
+    private DeptApi deptApi;
 
     @PostMapping("/create")
     @Operation(summary = "创建公务外出信息")
@@ -68,7 +74,16 @@ public class AttendanceOutController {
     @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));
+        AttendanceOutRespVO respVO = BeanUtils.toBean(out, AttendanceOutRespVO.class);
+        // 部门
+        if (respVO.getDeptId() != null) {
+            DeptRespDTO dept = deptApi.getDept(respVO.getDeptId());
+            respVO.setDeptName(dept.getName());
+            if (dept != null && StringUtils.isNotBlank(dept.getName())) {
+                respVO.setDeptName(dept.getName());
+            }
+        }
+        return success(respVO);
     }
 
     @GetMapping("/page")
@@ -76,7 +91,20 @@ public class AttendanceOutController {
     @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));
+        PageResult<AttendanceOutRespVO> result = BeanUtils.toBean(pageResult, AttendanceOutRespVO.class);
+        if (result != null && result.getList() != null && result.getList().size() > 0) {
+            result.getList().forEach(respVO -> {
+                // 部门
+                if (respVO.getDeptId() != null) {
+                    DeptRespDTO dept = deptApi.getDept(respVO.getDeptId());
+                    respVO.setDeptName(dept.getName());
+                    if (dept != null && StringUtils.isNotBlank(dept.getName())) {
+                        respVO.setDeptName(dept.getName());
+                    }
+                }
+            });
+        }
+        return success(result);
     }
 
     @GetMapping("/export-excel")

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.out.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
@@ -53,6 +54,10 @@ public class AttendanceOutRespVO {
     @ExcelProperty("部门uuid")
     private String deptUuid;
 
+    @Schema(description = "部门名称", example = "财务部")
+    @ExcelProperty("部门名称")
+    private String deptName;
+
     @Schema(description = "员工职位")
     @ExcelProperty("员工职位")
     private String position;
@@ -99,6 +104,7 @@ public class AttendanceOutRespVO {
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     @Schema(description = "租户编号", example = "1")

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

@@ -63,7 +63,6 @@ public class AttendanceOutSaveReqVO {
     private String remarks;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "2")
-    @NotNull(message = "状态不能为空")
     private Integer status;
 
     @Schema(description = "数据来源,0流程添加、1手动添加")
@@ -78,4 +77,7 @@ public class AttendanceOutSaveReqVO {
     @Schema(description = "租户编号", example = "1")
     private Long tenantId;
 
+    @Schema(description = "附件主键id", example = "[1, 2]")
+    private List<Long> fileIdList;
+
 }

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

@@ -79,6 +79,15 @@ public class AttendanceSchedulingManageController {
         return success(BeanUtils.toBean(pageResult, AttendanceSchedulingManageRespVO.class));
     }
 
+    @GetMapping("/list")
+    @Operation(summary = "获得考勤排班管理列表")
+    @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:query')")
+    public CommonResult<List<AttendanceSchedulingManageRespVO>> getSchedulingManageList(@Valid AttendanceSchedulingManagePageReqVO pageReqVO) {
+        pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+        List<AttendanceSchedulingManageDO> list = schedulingManageService.getSchedulingManagePage(pageReqVO).getList();
+        return success(BeanUtils.toBean(list, AttendanceSchedulingManageRespVO.class));
+    }
+
     @GetMapping("/export-excel")
     @Operation(summary = "导出考勤排班管理 Excel")
     @PreAuthorize("@ss.hasPermission('attendance:scheduling-manage:export')")

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.schedulingmanage.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
@@ -25,10 +26,12 @@ public class AttendanceSchedulingManageRespVO {
 
     @Schema(description = "上班时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("上班时间")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime startTime;
 
     @Schema(description = "下班时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("下班时间")
+    @JsonFormat(pattern = "HH:mm")
     private LocalTime endTime;
 
     @Schema(description = "备注信息")
@@ -41,6 +44,7 @@ public class AttendanceSchedulingManageRespVO {
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     @Schema(description = "租户编号", example = "1")

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

@@ -33,7 +33,6 @@ public class AttendanceSchedulingManageSaveReqVO {
     private String remarks;
 
     @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "状态不能为空")
     private Integer status;
 
     @Schema(description = "租户编号", example = "1")

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

@@ -95,8 +95,8 @@ public class AttendanceWorkdaySettingController {
     @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));
+    public CommonResult<Boolean> batchInsert(@RequestBody AttendanceWorkdaySettingDatesReqVO reqVO) {
+        return success(workdaySettingService.batchInsert(reqVO.getDates()));
     }
 
     @GetMapping("/get-workdays")

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

@@ -0,0 +1,17 @@
+package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 考勤工作日设置日期 Request VO")
+@Data
+public class AttendanceWorkdaySettingDatesReqVO {
+
+    @Schema(description = "日期数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[\"2024-08-01\", \"2024-08-02\", ...]")
+    @NotEmpty(message = "日期数组不能为空")
+    private String[] dates;
+
+}

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

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.attendance.controller.admin.workdaysetting.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 import java.util.*;
@@ -31,6 +32,7 @@ public class AttendanceWorkdaySettingRespVO {
 
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("创建时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private LocalDateTime createTime;
 
     @Schema(description = "租户编号", example = "1")

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

@@ -1,15 +1,11 @@
 package cn.iocoder.yudao.module.attendance.dal.dataobject.info;
 
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import java.time.LocalDate;
 import java.time.LocalTime;
-import java.util.*;
 import java.math.BigDecimal;
-import java.math.BigDecimal;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
+
 import com.baomidou.mybatisplus.annotation.*;
 import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
 

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

@@ -6,9 +6,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.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;
 

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

@@ -1,5 +1,11 @@
 package cn.iocoder.yudao.module.attendance.service.business;
 
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -28,12 +34,38 @@ public class AttendanceBusinessServiceImpl implements AttendanceBusinessService
 
     @Resource
     private AttendanceBusinessMapper businessMapper;
+    @Resource
+    private EmployeeApi employeeApi;
+    @Resource
+    private FileApi fileApi;
 
     @Override
     public Long createBusiness(AttendanceBusinessSaveReqVO createReqVO) {
+        // 获取用户信息和租户ID
+        LoginUser user = SecurityFrameworkUtils.getLoginUser();
+        Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
+        Long userId = user != null && user.getId() != null ? user.getId() : 0L;
+        createReqVO.setTenantId(tenantId);
+        // 出差人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        createReqVO.setEmployeeId(employee.getId());
+        createReqVO.setEmployeeName(employee.getName());
+        createReqVO.setEmployeePhone(employee.getPhone());
+        createReqVO.setDeptId(employee.getDeptId());
+        createReqVO.setPosition(employee.getPosition());
+        // 登录员工信息
+        EmployeeRespDTO loginEmployee = employeeApi.getEmployeeByUserId(userId);// 判空检查
+        if (loginEmployee != null) {
+            createReqVO.setCreatorEmployeeId(loginEmployee.getId());
+            createReqVO.setCreatorEmployeeName(loginEmployee.getName());
+        }
         // 插入
+        String infoId = IdUtil.fastSimpleUUID();
+        createReqVO.setBusinessId(infoId);
         AttendanceBusinessDO business = BeanUtils.toBean(createReqVO, AttendanceBusinessDO.class);
         businessMapper.insert(business);
+        // 保存业务uuid到附件中
+        fileApi.updateFileBiz(createReqVO.getFileIdList(), infoId);
         // 返回
         return business.getId();
     }
@@ -42,6 +74,15 @@ public class AttendanceBusinessServiceImpl implements AttendanceBusinessService
     public void updateBusiness(AttendanceBusinessSaveReqVO updateReqVO) {
         // 校验存在
         validateBusinessExists(updateReqVO.getId());
+        // 保存业务uuid到附件中
+        fileApi.updateFileBiz(updateReqVO.getFileIdList(), updateReqVO.getBusinessId());
+        // 出差人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        updateReqVO.setEmployeeId(employee.getId());
+        updateReqVO.setEmployeeName(employee.getName());
+        updateReqVO.setEmployeePhone(employee.getPhone());
+        updateReqVO.setDeptId(employee.getDeptId());
+        updateReqVO.setPosition(employee.getPosition());
         // 更新
         AttendanceBusinessDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceBusinessDO.class);
         businessMapper.updateById(updateObj);

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

@@ -96,6 +96,10 @@ public class AttendanceEmployeeSettingServiceImpl implements AttendanceEmployeeS
         LoginUser user = SecurityFrameworkUtils.getLoginUser();
         Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
         pageReqVO.setTenantId(tenantId);
+        int currentPage = pageReqVO.getPageNo();
+        if (currentPage > 0) {
+            pageReqVO.setPageNo(currentPage - 1);
+        }
         List<AttendanceEmployeeSettingRespVO> list = employeeSettingMapper.getEmployeeInfoSettingPage(pageReqVO);
         return new PageResult<>(list, (long) list.size());
     }
@@ -119,7 +123,11 @@ public class AttendanceEmployeeSettingServiceImpl implements AttendanceEmployeeS
             boolean exists = validateEmployeeSettingExistsByEmployeeId(employeeId);
             if (exists) {
                 // 更新
-                AttendanceEmployeeSettingDO updateObj = new AttendanceEmployeeSettingDO();
+                AttendanceEmployeeSettingRespVO respVO = this.getByEmployeeId(employeeId);
+                if (respVO == null) {
+                    throw exception(ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS);
+                }
+                AttendanceEmployeeSettingDO updateObj = BeanUtils.toBean(respVO, AttendanceEmployeeSettingDO.class);
                 updateObj.setSchedulingId(schedulingId);
                 employeeSettingMapper.updateById(updateObj);
             } else {

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

@@ -69,7 +69,7 @@ public interface AttendanceInfoService {
      * @param pageReqVO 分页查询
      * @return 考勤信息分页
      */
-    List<AttendanceDailyInfoRespVO> getDailyInfoPage(AttendanceDailyInfoPageReqVO pageReqVO);
+    PageResult<AttendanceDailyInfoRespVO> getDailyInfoPage(AttendanceDailyInfoPageReqVO pageReqVO);
 
     /**
      * 获得考勤信息分页
@@ -77,6 +77,6 @@ public interface AttendanceInfoService {
      * @param pageReqVO 分页查询
      * @return 考勤信息分页
      */
-    List<AttendanceMonthlyInfoRespVO> getMonthlyInfoPage(AttendanceMonthlyInfoPageReqVO pageReqVO);
+    PageResult<AttendanceMonthlyInfoRespVO> getMonthlyInfoPage(AttendanceMonthlyInfoPageReqVO pageReqVO);
 
 }

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

@@ -180,7 +180,11 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
 
     @Override
     @TenantIgnore
-    public List<AttendanceDailyInfoRespVO> getDailyInfoPage(AttendanceDailyInfoPageReqVO pageReqVO) {
+    public PageResult<AttendanceDailyInfoRespVO> getDailyInfoPage(AttendanceDailyInfoPageReqVO pageReqVO) {
+        int currentPage = pageReqVO.getPageNo();
+        if (currentPage > 0) {
+            pageReqVO.setPageNo(currentPage - 1);
+        }
         List<AttendanceDailyInfoRespVO> list = infoMapper.getDailyInfoPage(pageReqVO);
         if (list != null && list.size() > 0) {
             for (AttendanceDailyInfoRespVO info : list) {
@@ -216,12 +220,16 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
                 }
             }
         }
-        return list;
+        return new PageResult<>(list, (long) list.size());
     }
 
     @Override
     @TenantIgnore
-    public List<AttendanceMonthlyInfoRespVO> getMonthlyInfoPage(AttendanceMonthlyInfoPageReqVO pageReqVO) {
+    public PageResult<AttendanceMonthlyInfoRespVO> getMonthlyInfoPage(AttendanceMonthlyInfoPageReqVO pageReqVO) {
+        int currentPage = pageReqVO.getPageNo();
+        if (currentPage > 0) {
+            pageReqVO.setPageNo(currentPage - 1);
+        }
         // 获取每日考勤信息
         List<AttendanceInfoDO> dos = infoMapper.selectPage(pageReqVO).getList();
         List<AttendanceDailyInfoRespVO> dailyInfoList = BeanUtils.toBean(dos, AttendanceDailyInfoRespVO.class);
@@ -263,8 +271,7 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
             // 添加到月度考勤信息列表
             monthlyInfoList.add(monthlyInfo);
         }
-
-        return monthlyInfoList;
+        return new PageResult<>(monthlyInfoList, (long) monthlyInfoList.size());
     }
 
     private boolean validateEmployeeExists(String employeeName, String employeeMobile, Long tenantId) {

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

@@ -1,5 +1,11 @@
 package cn.iocoder.yudao.module.attendance.service.leave;
 
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -30,12 +36,38 @@ public class AttendanceLeaveServiceImpl implements AttendanceLeaveService {
 
     @Resource
     private AttendanceLeaveMapper leaveMapper;
+    @Resource
+    private EmployeeApi employeeApi;
+    @Resource
+    private FileApi fileApi;
 
     @Override
     public Long createLeave(AttendanceLeaveSaveReqVO createReqVO) {
+        // 获取用户信息和租户ID
+        LoginUser user = SecurityFrameworkUtils.getLoginUser();
+        Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
+        Long userId = user != null && user.getId() != null ? user.getId() : 0L;
+        createReqVO.setTenantId(tenantId);
+        // 请假人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        createReqVO.setEmployeeId(employee.getId());
+        createReqVO.setEmployeeName(employee.getName());
+        createReqVO.setEmployeePhone(employee.getPhone());
+        createReqVO.setDeptId(employee.getDeptId());
+        createReqVO.setPosition(employee.getPosition());
+        // 登录员工信息
+        EmployeeRespDTO loginEmployee = employeeApi.getEmployeeByUserId(userId);// 判空检查
+        if (loginEmployee != null) {
+            createReqVO.setCreatorEmployeeId(loginEmployee.getId());
+            createReqVO.setCreatorEmployeeName(loginEmployee.getName());
+        }
         // 插入
+        String infoId = IdUtil.fastSimpleUUID();
+        createReqVO.setLeaveId(infoId);
         AttendanceLeaveDO leave = BeanUtils.toBean(createReqVO, AttendanceLeaveDO.class);
         leaveMapper.insert(leave);
+        // 保存业务uuid到附件中
+        fileApi.updateFileBiz(createReqVO.getFileIdList(), infoId);
         // 返回
         return leave.getId();
     }
@@ -44,6 +76,15 @@ public class AttendanceLeaveServiceImpl implements AttendanceLeaveService {
     public void updateLeave(AttendanceLeaveSaveReqVO updateReqVO) {
         // 校验存在
         validateLeaveExists(updateReqVO.getId());
+        // 保存业务uuid到附件中
+        fileApi.updateFileBiz(updateReqVO.getFileIdList(), updateReqVO.getLeaveId());
+        // 请假人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        updateReqVO.setEmployeeId(employee.getId());
+        updateReqVO.setEmployeeName(employee.getName());
+        updateReqVO.setEmployeePhone(employee.getPhone());
+        updateReqVO.setDeptId(employee.getDeptId());
+        updateReqVO.setPosition(employee.getPosition());
         // 更新
         AttendanceLeaveDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceLeaveDO.class);
         leaveMapper.updateById(updateObj);

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

@@ -1,5 +1,11 @@
 package cn.iocoder.yudao.module.attendance.service.out;
 
+import cn.hutool.core.util.IdUtil;
+import cn.iocoder.yudao.framework.security.core.LoginUser;
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
+import cn.iocoder.yudao.module.employee.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
+import cn.iocoder.yudao.module.infra.api.file.FileApi;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -26,12 +32,38 @@ public class AttendanceOutServiceImpl implements AttendanceOutService {
 
     @Resource
     private AttendanceOutMapper outMapper;
+    @Resource
+    private EmployeeApi employeeApi;
+    @Resource
+    private FileApi fileApi;
 
     @Override
     public Long createOut(AttendanceOutSaveReqVO createReqVO) {
+        // 获取用户信息和租户ID
+        LoginUser user = SecurityFrameworkUtils.getLoginUser();
+        Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
+        Long userId = user != null && user.getId() != null ? user.getId() : 0L;
+        createReqVO.setTenantId(tenantId);
+        // 公务外出人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        createReqVO.setEmployeeId(employee.getId());
+        createReqVO.setEmployeeName(employee.getName());
+        createReqVO.setEmployeePhone(employee.getPhone());
+        createReqVO.setDeptId(employee.getDeptId());
+        createReqVO.setPosition(employee.getPosition());
+        // 登录员工信息
+        EmployeeRespDTO loginEmployee = employeeApi.getEmployeeByUserId(userId);// 判空检查
+        if (loginEmployee != null) {
+            createReqVO.setCreatorEmployeeId(loginEmployee.getId());
+            createReqVO.setCreatorEmployeeName(loginEmployee.getName());
+        }
         // 插入
+        String infoId = IdUtil.fastSimpleUUID();
+        createReqVO.setOutId(infoId);
         AttendanceOutDO out = BeanUtils.toBean(createReqVO, AttendanceOutDO.class);
         outMapper.insert(out);
+        // 保存业务uuid到附件中
+        fileApi.updateFileBiz(createReqVO.getFileIdList(), infoId);
         // 返回
         return out.getId();
     }
@@ -40,6 +72,15 @@ public class AttendanceOutServiceImpl implements AttendanceOutService {
     public void updateOut(AttendanceOutSaveReqVO updateReqVO) {
         // 校验存在
         validateOutExists(updateReqVO.getId());
+        // 保存业务uuid到附件中
+        fileApi.updateFileBiz(updateReqVO.getFileIdList(), updateReqVO.getOutId());
+        // 公务外出人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        updateReqVO.setEmployeeId(employee.getId());
+        updateReqVO.setEmployeeName(employee.getName());
+        updateReqVO.setEmployeePhone(employee.getPhone());
+        updateReqVO.setDeptId(employee.getDeptId());
+        updateReqVO.setPosition(employee.getPosition());
         // 更新
         AttendanceOutDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceOutDO.class);
         outMapper.updateById(updateObj);

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

@@ -11,6 +11,7 @@
     <!-- 通过员工ID获得考勤员工设置 -->
     <select id="getByEmployeeId" resultType="cn.iocoder.yudao.module.attendance.controller.admin.employeesetting.vo.AttendanceEmployeeSettingRespVO">
         SELECT
+            aes.id,
             aes.employee_id,
             aes.name,
             asm.shift_name,
@@ -32,7 +33,9 @@
             aes.id as 'id',
             ei.id as 'employeeId',
             ei.name,
-            ei.phone as 'employeePhone',
+            ei.phone as 'phoneNumber',
+            ei.email,
+            ei.dept_name as 'deptName',
             ei.employee_number,
             asm.shift_name,
             asm.start_time,
@@ -56,6 +59,12 @@
         <if test="reqVO.phoneNumber != null and reqVO.phoneNumber != ''">
             AND ei.phone LIKE CONCAT('%', #{reqVO.phoneNumber}, '%')
         </if>
+        <if test="reqVO.schedulingId != null">
+            AND aes.scheduling_id = #{reqVO.schedulingId}
+        </if>
+        <if test="reqVO.deptId != null">
+            AND ei.dept_id = #{reqVO.deptId}
+        </if>
         ORDER BY ei.id
         <if test="reqVO.pageSize != null and reqVO.pageNo != null">
             LIMIT #{reqVO.pageNo}, #{reqVO.pageSize}

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

@@ -13,7 +13,7 @@
         SELECT
             ai.employee_id,
             ai.employee_name,
-            ai.employee_phone,
+            ai.employee_mobile,
             ai.dept_name,
             ai.attendance_date,
             ai.work_start_time,

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

@@ -66,6 +66,7 @@ public class EmployeeRespDTO {
     /**
      * 入职时间
      */
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDate entryDate;
 
     /**

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

@@ -19,6 +19,9 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
 @ToString(callSuper = true)
 public class EmployeeInfoQueryReqVO extends PageParam {
 
+    @Schema(description = "员工ID", example = "18657")
+    private Long id;
+
     @Schema(description = "业务UUID", example = "4007")
     private String infoId;
 

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

@@ -72,6 +72,7 @@ public interface EmployeeInfoMapper extends BaseMapperX<EmployeeInfoDO> {
                 .eqIfPresent(EmployeeInfoDO::getUserId, reqVO.getUserId())
                 .eqIfPresent(EmployeeInfoDO::getTenantId, reqVO.getTenantId())
                 .eqIfPresent(EmployeeInfoDO::getPhone, reqVO.getPhone())
+                .eqIfPresent(EmployeeInfoDO::getId, reqVO.getId())
                 .orderByDesc(EmployeeInfoDO::getId));
     }
 

+ 14 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/service/conversion/RelationsConversionServiceImpl.java

@@ -56,6 +56,13 @@ public class RelationsConversionServiceImpl implements RelationsConversionServic
         Long tenantId = user != null && user.getTenantId() != null ? user.getTenantId() : 0L;
         Long userId = user != null && user.getId() != null ? user.getId() : 0L;
         createReqVO.setTenantId(tenantId);
+        // 转正人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        createReqVO.setEmployeeId(employee.getId());
+        createReqVO.setEmployeeName(employee.getName());
+        createReqVO.setEmployeePhone(employee.getPhone());
+        createReqVO.setDeptId(employee.getDeptId());
+        createReqVO.setPosition(employee.getPosition());
         // 插入
         String infoId = IdUtil.fastSimpleUUID();
         createReqVO.setConversionId(infoId);
@@ -80,6 +87,13 @@ public class RelationsConversionServiceImpl implements RelationsConversionServic
         validateConversionExists(updateReqVO.getId());
         // 保存业务uuid到附件中
         fileApi.updateFileBiz(updateReqVO.getFileIdList(), updateReqVO.getConversionId());
+        // 转正人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        updateReqVO.setEmployeeId(employee.getId());
+        updateReqVO.setEmployeeName(employee.getName());
+        updateReqVO.setEmployeePhone(employee.getPhone());
+        updateReqVO.setDeptId(employee.getDeptId());
+        updateReqVO.setPosition(employee.getPosition());
         // 更新
         RelationsConversionDO updateObj = BeanUtils.toBean(updateReqVO, RelationsConversionDO.class);
         conversionMapper.updateById(updateObj);

+ 14 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/service/renew/RelationsRenewServiceImpl.java

@@ -59,6 +59,13 @@ public class RelationsRenewServiceImpl implements RelationsRenewService {
         // 插入
         String infoId = IdUtil.fastSimpleUUID();
         createReqVO.setRenewId(infoId);
+        // 续签人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        createReqVO.setEmployeeId(employee.getId());
+        createReqVO.setEmployeeName(employee.getName());
+        createReqVO.setEmployeePhone(employee.getPhone());
+        createReqVO.setDeptId(employee.getDeptId());
+        createReqVO.setPosition(employee.getPosition());
         RelationsRenewDO renew = BeanUtils.toBean(createReqVO, RelationsRenewDO.class);
         // 登录员工信息
         EmployeeRespDTO loginEmployee = employeeApi.getEmployeeByUserId(userId);// 判空检查
@@ -80,6 +87,13 @@ public class RelationsRenewServiceImpl implements RelationsRenewService {
         validateRenewExists(updateReqVO.getId());
         // 保存业务uuid到附件中
         fileApi.updateFileBiz(updateReqVO.getFileIdList(), updateReqVO.getRenewId());
+        // 续签人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        updateReqVO.setEmployeeId(employee.getId());
+        updateReqVO.setEmployeeName(employee.getName());
+        updateReqVO.setEmployeePhone(employee.getPhone());
+        updateReqVO.setDeptId(employee.getDeptId());
+        updateReqVO.setPosition(employee.getPosition());
         // 更新
         RelationsRenewDO updateObj = BeanUtils.toBean(updateReqVO, RelationsRenewDO.class);
         renewMapper.updateById(updateObj);

+ 14 - 0
yudao-module-personnel/yudao-module-relations-biz/src/main/java/cn/iocoder/yudao/module/relations/service/turnover/RelationsTurnoverServiceImpl.java

@@ -59,6 +59,13 @@ public class RelationsTurnoverServiceImpl implements RelationsTurnoverService {
         // 插入
         String infoId = IdUtil.fastSimpleUUID();
         createReqVO.setTurnoverId(infoId);
+        // 离职人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        createReqVO.setEmployeeId(employee.getId());
+        createReqVO.setEmployeeName(employee.getName());
+        createReqVO.setEmployeePhone(employee.getPhone());
+        createReqVO.setDeptId(employee.getDeptId());
+        createReqVO.setPosition(employee.getPosition());
         RelationsTurnoverDO turnover = BeanUtils.toBean(createReqVO, RelationsTurnoverDO.class);
         // 登录员工信息
         EmployeeRespDTO loginEmployee = employeeApi.getEmployeeByUserId(userId);// 判空检查
@@ -80,6 +87,13 @@ public class RelationsTurnoverServiceImpl implements RelationsTurnoverService {
         validateTurnoverExists(updateReqVO.getId());
         // 保存业务uuid到附件中
         fileApi.updateFileBiz(updateReqVO.getFileIdList(), updateReqVO.getTurnoverId());
+        // 离职人信息
+        EmployeeRespDTO employee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        updateReqVO.setEmployeeId(employee.getId());
+        updateReqVO.setEmployeeName(employee.getName());
+        updateReqVO.setEmployeePhone(employee.getPhone());
+        updateReqVO.setDeptId(employee.getDeptId());
+        updateReqVO.setPosition(employee.getPosition());
         // 更新
         RelationsTurnoverDO updateObj = BeanUtils.toBean(updateReqVO, RelationsTurnoverDO.class);
         turnoverMapper.updateById(updateObj);

+ 4 - 0
yudao-server/src/main/resources/application-local.yaml

@@ -176,6 +176,10 @@ logging:
     cn.iocoder.yudao.module.relations.dal.mysql: debug
     cn.iocoder.yudao.module.holiday.dal.mysql: debug
     cn.iocoder.yudao.module.attendance.dal.mysql: debug
+    cn.iocoder.yudao.module.asset.dal.mysql: debug
+    cn.iocoder.yudao.module.cash.dal.mysql: debug
+    cn.iocoder.yudao.module.contract.dal.mysql: debug
+    cn.iocoder.yudao.module.expense.dal.mysql: debug
     org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
 #    org.flowable: debug