zhaopeiqing 6 місяців тому
батько
коміт
618f65a731
12 змінених файлів з 93 додано та 17 видалено
  1. 2 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoPageReqVO.java
  2. 7 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoRespVO.java
  3. 6 2
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoImportExcelVO.java
  4. 3 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoPageReqVO.java
  5. 6 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceInfoSaveReqVO.java
  6. 3 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoPageReqVO.java
  7. 3 0
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceMonthlyInfoRespVO.java
  8. 5 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/dataobject/info/AttendanceInfoDO.java
  9. 1 1
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/dal/mysql/info/AttendanceInfoMapper.java
  10. 55 8
      yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/service/info/AttendanceInfoServiceImpl.java
  11. 1 3
      yudao-module-personnel/yudao-module-attendance-biz/src/main/resources/mapper/info/AttendanceInfoMapper.xml
  12. 1 0
      yudao-server/src/main/resources/application-local.yaml

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

@@ -31,11 +31,11 @@ public class AttendanceDailyInfoPageReqVO extends PageParam {
 
     @Schema(description = "考勤开始日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
-    private LocalDate[] attendanceStartDate;
+    private LocalDate attendanceStartDate;
 
     @Schema(description = "考勤结束日期")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY)
-    private LocalDate[] attendanceEndDate;
+    private LocalDate attendanceEndDate;
 
     @Schema(description = "上班时间")
     @DateTimeFormat(pattern = FORMAT_HOUR_MINUTE)

+ 7 - 0
yudao-module-personnel/yudao-module-attendance-biz/src/main/java/cn/iocoder/yudao/module/attendance/controller/admin/info/vo/AttendanceDailyInfoRespVO.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;
 
@@ -27,19 +28,25 @@ public class AttendanceDailyInfoRespVO {
     @NotEmpty(message = "员工手机号不能为空")
     private String employeeMobile;
 
+    @Schema(description = "部门ID", example = "13463")
+    private Long deptId;
+
     @Schema(description = "部门名称", example = "13463")
     private String deptName;
 
     @Schema(description = "考勤日期", requiredMode = Schema.RequiredMode.REQUIRED)
     @ExcelProperty("考勤日期")
+    @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDate attendanceDate;
 
     @Schema(description = "上班时间")
     @ExcelProperty("上班时间")
+    @JsonFormat(pattern = "HH:mm:ss")
     private LocalTime workStartTime;
 
     @Schema(description = "下班时间")
     @ExcelProperty("下班时间")
+    @JsonFormat(pattern = "HH:mm:ss")
     private LocalTime workEndTime;
 
     @Schema(description = "迟到时间(min)", example = "2")

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

@@ -29,6 +29,8 @@ public class AttendanceInfoImportExcelVO {
     @ExcelProperty("员工手机号")
     private String employeeMobile;
 
+    private Long deptId;
+
     @ExcelProperty("部门名称")
     private String deptName;
 
@@ -39,12 +41,14 @@ public class AttendanceInfoImportExcelVO {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDate[] attendanceDate;
 
+    private String attendanceMonth;
+
     @ExcelProperty("上班时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalTime[] workStartTime;
+    private LocalTime workStartTime;
 
     @ExcelProperty("下班时间")
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
-    private LocalTime[] workEndTime;
+    private LocalTime workEndTime;
 
 }

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

@@ -31,6 +31,9 @@ public class AttendanceInfoPageReqVO extends PageParam {
     @Schema(description = "员工手机号", requiredMode = Schema.RequiredMode.REQUIRED, example = "13812345678")
     private String employeeMobile;
 
+    @Schema(description = "部门ID", example = "13463")
+    private Long deptId;
+
     @Schema(description = "部门名称", example = "13463")
     private String deptName;
 

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

@@ -31,6 +31,9 @@ public class AttendanceInfoSaveReqVO {
     @NotEmpty(message = "员工手机号不能为空")
     private String employeeMobile;
 
+    @Schema(description = "部门ID", example = "13463")
+    private Long deptId;
+
     @Schema(description = "部门名称", example = "13463")
     private String deptName;
 
@@ -41,6 +44,9 @@ public class AttendanceInfoSaveReqVO {
     @NotNull(message = "考勤日期不能为空")
     private LocalDate attendanceDate;
 
+    @Schema(description = "考勤月份", example = "2024-08")
+    private String attendanceMonth;
+
     @Schema(description = "上班时间")
     private LocalTime workStartTime;
 

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

@@ -26,6 +26,9 @@ public class AttendanceMonthlyInfoPageReqVO extends PageParam {
     @Schema(description = "员工编号", example = "6960")
     private String employeeNumber;
 
+    @Schema(description = "部门ID", example = "13463")
+    private Long deptId;
+
     @Schema(description = "部门名称", example = "13463")
     private String deptName;
 

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

@@ -26,6 +26,9 @@ public class AttendanceMonthlyInfoRespVO {
     @NotEmpty(message = "员工手机号不能为空")
     private String employeeMobile;
 
+    @Schema(description = "部门ID", example = "13463")
+    private Long deptId;
+
     @Schema(description = "部门名称", example = "13463")
     private String deptName;
 

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

@@ -45,10 +45,14 @@ public class AttendanceInfoDO extends BaseDO {
      * 员工手机号
      */
     private String employeeMobile;
+    /**
+     * 部门ID
+     */
+    private Long deptId;
     /**
      * 部门名称
      */
-     String deptName;
+    private String deptName;
     /**
      * 职位名称
      */

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

@@ -48,8 +48,8 @@ public interface AttendanceInfoMapper extends BaseMapperX<AttendanceInfoDO> {
                 .likeIfPresent(AttendanceInfoDO::getEmployeeName, reqVO.getEmployeeName())
                 .likeIfPresent(AttendanceInfoDO::getEmployeeNumber, reqVO.getEmployeeNumber())
                 .eqIfPresent(AttendanceInfoDO::getAttendanceMonth, reqVO.getAttendanceMonth())
+                .eqIfPresent(AttendanceInfoDO::getDeptId, reqVO.getDeptId())
                 .eqIfPresent(AttendanceInfoDO::getDeptName, reqVO.getDeptName())
-                .eqIfPresent(AttendanceInfoDO::getTenantId, reqVO.getTenantId())
                 .orderByDesc(AttendanceInfoDO::getId));
     }
 

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

@@ -19,6 +19,9 @@ import cn.iocoder.yudao.module.attendance.service.employeesetting.AttendanceEmpl
 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.api.EmployeeApi;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeQueryReqDTO;
+import cn.iocoder.yudao.module.employee.api.dto.EmployeeRespDTO;
 import cn.iocoder.yudao.module.employee.controller.admin.info.vo.EmployeeInfoPageReqVO;
 import cn.iocoder.yudao.module.employee.dal.dataobject.info.EmployeeInfoDO;
 import cn.iocoder.yudao.module.employee.service.info.EmployeeInfoService;
@@ -34,6 +37,7 @@ import java.text.SimpleDateFormat;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -70,9 +74,23 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
     private AttendanceOutService attendanceOutService;
     @Resource
     private AttendanceWorkdaySettingService workdaySettingService;
+    @Resource
+    private EmployeeApi employeeApi;
 
     @Override
     public Long createInfo(AttendanceInfoSaveReqVO createReqVO) {
+        // 选择员工信息
+        EmployeeRespDTO choseEmployee = employeeApi.getEmployeeById(createReqVO.getEmployeeId());
+        if (choseEmployee != null) {
+            createReqVO.setDeptId(choseEmployee.getDeptId());
+            createReqVO.setDeptName(choseEmployee.getDeptName());
+        }
+        if (createReqVO != null && createReqVO.getAttendanceDate() != null) {
+            LocalDate localDate = createReqVO.getAttendanceDate();
+            // 使用 DateTimeFormatter 来格式化 LocalDate 为 "yyyy-MM" 格式的字符串
+            String formattedMonth = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+            createReqVO.setAttendanceMonth(formattedMonth);
+        }
         // 插入
         AttendanceInfoDO info = BeanUtils.toBean(createReqVO, AttendanceInfoDO.class);
         infoMapper.insert(info);
@@ -84,6 +102,18 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
     public void updateInfo(AttendanceInfoSaveReqVO updateReqVO) {
         // 校验存在
         validateInfoExists(updateReqVO.getId());
+        // 选择员工信息
+        EmployeeRespDTO choseEmployee = employeeApi.getEmployeeById(updateReqVO.getEmployeeId());
+        if (choseEmployee != null) {
+            updateReqVO.setDeptId(choseEmployee.getDeptId());
+            updateReqVO.setDeptName(choseEmployee.getDeptName());
+        }
+        if (updateReqVO != null && updateReqVO.getAttendanceDate() != null) {
+            LocalDate localDate = updateReqVO.getAttendanceDate();
+            // 使用 DateTimeFormatter 来格式化 LocalDate 为 "yyyy-MM" 格式的字符串
+            String formattedMonth = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+            updateReqVO.setAttendanceMonth(formattedMonth);
+        }
         // 更新
         AttendanceInfoDO updateObj = BeanUtils.toBean(updateReqVO, AttendanceInfoDO.class);
         infoMapper.updateById(updateObj);
@@ -140,7 +170,18 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
             try {
                 // 验证员工是否存在
                 validateEmployeeExists(importAttendance.getEmployeeName(), importAttendance.getEmployeeMobile(), tenantId);
-
+                EmployeeQueryReqDTO reqDTO = new EmployeeQueryReqDTO().setName(importAttendance.getEmployeeName()).setPhone(importAttendance.getEmployeeMobile());
+                EmployeeRespDTO choseEmployee = employeeApi.getEmployee(reqDTO);
+                if (choseEmployee != null) {
+                    importAttendance.setDeptId(choseEmployee.getDeptId());
+                    importAttendance.setDeptName(choseEmployee.getDeptName());
+                }
+                if (importAttendance != null && importAttendance.getAttendanceDate() != null) {
+                    LocalDate localDate = importAttendance.getAttendanceDate()[0];
+                    // 使用 DateTimeFormatter 来格式化 LocalDate 为 "yyyy-MM" 格式的字符串
+                    String formattedMonth = localDate.format(DateTimeFormatter.ofPattern("yyyy-MM"));
+                    importAttendance.setAttendanceMonth(formattedMonth);
+                }
                 // 查找并收集要删除的数据
                 List<AttendanceInfoDO> existingInfos = infoMapper.selectPage(
                         new AttendanceInfoPageReqVO().setAttendanceDate(importAttendance.getAttendanceDate()).setEmployeeMobile(importAttendance.getEmployeeMobile())
@@ -173,10 +214,10 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
 
     @Override
     public PageResult<AttendanceDailyInfoRespVO> getDailyInfoPage(AttendanceDailyInfoPageReqVO pageReqVO) {
-//        int currentPage = pageReqVO.getPageNo();
-//        if (currentPage > 0) {
-//            pageReqVO.setPageNo(currentPage - 1);
-//        }
+        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) {
@@ -245,6 +286,10 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
             // 创建一个新的月度考勤信息对象
             AttendanceMonthlyInfoRespVO monthlyInfo = new AttendanceMonthlyInfoRespVO();
             monthlyInfo.setEmployeeId(employeeDailyInfoList.get(0).getEmployeeId());
+            monthlyInfo.setEmployeeName(employeeDailyInfoList.get(0).getEmployeeName());
+            monthlyInfo.setDeptId(employeeDailyInfoList.get(0).getDeptId());
+            monthlyInfo.setDeptName(employeeDailyInfoList.get(0).getDeptName());
+            monthlyInfo.setEmployeeMobile(employeeDailyInfoList.get(0).getEmployeeMobile());
             monthlyInfo.setAttendanceMonth(pageReqVO.getAttendanceMonth());
 
             // 计算月度数据
@@ -292,7 +337,8 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
         // 查询该员工考勤规则
         AttendanceEmployeeSettingRespVO respVO = attendanceEmployeeSettingService.getByEmployeeId(dailyInfoList.get(0).getEmployeeId());
         if (respVO == null) {
-            throw exception(ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS);
+            return map;
+//            throw exception(ATTENDANCE_EMPLOYEE_SETTING_NOT_EXISTS);
         }
         LocalTime ruleStartTime = respVO.getStartTime();
         LocalTime ruleEndTime = respVO.getEndTime();
@@ -303,8 +349,9 @@ public class AttendanceInfoServiceImpl implements AttendanceInfoService {
             LocalDate date = dailyInfo.getAttendanceDate();
             LocalTime start = dailyInfo.getWorkStartTime();
             LocalTime end = dailyInfo.getWorkEndTime();
-
-            boolean isWorkDay = workDays.stream().anyMatch(wd -> wd.getWorkDate().equals(date));
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 或者 "yyyy-MM",根据你的需求
+            String dateString = date.format(formatter);
+            boolean isWorkDay = workDays.stream().anyMatch(wd -> wd.getWorkDate().equals(dateString));
 
             if (isWorkDay) {
                 AttendanceBusinessDO businessDO = attendanceBusinessService

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

@@ -24,10 +24,8 @@
         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
+            ai.employee_name,ai.attendance_date,ai.dept_name
         <if test="reqVO.pageSize != null and reqVO.pageNo != null">
             LIMIT #{reqVO.pageNo}, #{reqVO.pageSize}
         </if>

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

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