From 25ca0715b47090fc79527910cbb4cf7ea9b3e1f2 Mon Sep 17 00:00:00 2001
From: zouyu <2723363702@qq.com>
Date: 星期四, 07 五月 2026 17:07:36 +0800
Subject: [PATCH] 人员考勤:导出日期选择调整&不合格处理展示供应商编码字段

---
 performance-server/src/main/java/com/ruoyi/performance/service/impl/StaffAttendanceTrackingRecordServiceImpl.java |   53 +++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/performance-server/src/main/java/com/ruoyi/performance/service/impl/StaffAttendanceTrackingRecordServiceImpl.java b/performance-server/src/main/java/com/ruoyi/performance/service/impl/StaffAttendanceTrackingRecordServiceImpl.java
index d848646..e220e51 100644
--- a/performance-server/src/main/java/com/ruoyi/performance/service/impl/StaffAttendanceTrackingRecordServiceImpl.java
+++ b/performance-server/src/main/java/com/ruoyi/performance/service/impl/StaffAttendanceTrackingRecordServiceImpl.java
@@ -13,10 +13,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.util.concurrent.AtomicDouble;
 import com.ruoyi.common.core.domain.entity.User;
-import com.ruoyi.common.enums.ClockInState;
-import com.ruoyi.common.enums.EnterOrExitType;
-import com.ruoyi.common.enums.CalendarType;
-import com.ruoyi.common.enums.SyncStatus;
+import com.ruoyi.common.enums.*;
 import com.ruoyi.common.utils.api.icc.IccApiUtil;
 import com.ruoyi.common.utils.api.icc.model.GetResultPageRequest;
 import com.ruoyi.common.utils.api.icc.model.GetResultPageResponse;
@@ -53,10 +50,7 @@
 import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.ZoneId;
+import java.time.*;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -240,13 +234,13 @@
                 if (!enterRecords.isEmpty()) {
                     // 涓婄彮鏃堕棿鍜岀姸鎬�
                     StaffAttendanceTrackingRecord enterRecord = enterRecords.stream()
-                            .filter(s -> !s.getSwingTime().isAfter(currentShiftStartDateTime) && !s.getSwingTime().isBefore(boundaryTime))
+                            .filter(s -> (!s.getSwingTime().isAfter(currentShiftStartDateTime) && !s.getSwingTime().isBefore(boundaryTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.WORK.getValue()))
                             .max(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime))
                             .orElse(new StaffAttendanceTrackingRecord());
                     if (BeanUtil.isEmpty(enterRecord)) {
                         enterRecord = enterRecords.stream()
                                 .filter(s -> (s.getSwingTime().isAfter(currentShiftStartDateTime)
-                                        && s.getSwingTime().isBefore(currentShiftEndDateTime)))
+                                        && s.getSwingTime().isBefore(currentShiftEndDateTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.WORK.getValue()))
                                 .min(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime))
                                 .orElse(new StaffAttendanceTrackingRecord());
                         workDateTime = enterRecord.getSwingTime();
@@ -263,14 +257,14 @@
                 if (!exitRecords.isEmpty()) {
                     // 涓嬬彮鏃堕棿鍜岀姸鎬�
                     StaffAttendanceTrackingRecord exitRecord = exitRecords.stream()
-                            .filter(s -> !s.getSwingTime().isBefore(currentShiftEndDateTime)
-                                    && s.getSwingTime().isBefore(nextShiftStartDateTime))
+                            .filter(s -> (!s.getSwingTime().isBefore(currentShiftEndDateTime)
+                                    && s.getSwingTime().isBefore(nextShiftStartDateTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.OFF_WORK.getValue()))
                             .min(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime))
                             .orElse(new StaffAttendanceTrackingRecord());
                     if (BeanUtil.isEmpty(exitRecord) && !now.isBefore(currentShiftEndDateTime)) {
                         exitRecord = exitRecords.stream()
                                 .filter(s -> (s.getSwingTime().isAfter(currentShiftStartDateTime)
-                                        && s.getSwingTime().isBefore(currentShiftEndDateTime)))
+                                        && s.getSwingTime().isBefore(currentShiftEndDateTime)) || StringUtils.equals(s.getWorkStateFlag(), StaffWorkStateFlag.OFF_WORK.getValue()))
                                 .max(Comparator.comparing(StaffAttendanceTrackingRecord::getSwingTime))
                                 .orElse(new StaffAttendanceTrackingRecord());
                         offWorkDateTime = exitRecord.getSwingTime();
@@ -415,14 +409,45 @@
         return this.saveOrUpdateBatch(records);
     }
 
+    /**
+     * 鏍规嵁瀵煎嚭鏃ユ湡鏍煎紡鍖栧鍑烘椂闂磋寖鍥�
+     * @param staffAttendanceDTO
+     */
+    private static void formatExportDateRange(StaffAttendanceDTO staffAttendanceDTO){
+        if(StringUtils.isNoneBlank(staffAttendanceDTO.getReportDate())){
+            LocalTime startTime = LocalTime.of(0,0,0);
+            LocalTime endTime = LocalTime.of(23,59,59);
+            YearMonth yearMonth;
+            if(StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(),CalendarType.MONTH.name())){
+                yearMonth = YearMonth.parse(staffAttendanceDTO.getReportDate(),DateTimeFormatter.ofPattern("yyyy-MM"));
+                LocalDateTime startDateTime = LocalDateTime.of(yearMonth.minusMonths(1L).atDay(26),startTime);
+                LocalDateTime endDateTime = LocalDateTime.of(yearMonth.atDay(25),endTime);
+                staffAttendanceDTO.setStartDate(startDateTime);
+                staffAttendanceDTO.setEndDate(endDateTime);
+            }else if(StringUtils.equals(staffAttendanceDTO.getAttendanceReportType(),CalendarType.YEAR.name())){
+                Year year = Year.parse(staffAttendanceDTO.getReportDate(),DateTimeFormatter.ofPattern("yyyy"));
+                yearMonth = year.atMonth(1);
+                LocalDateTime startDateTime = LocalDateTime.of(yearMonth.minusMonths(1L).atDay(26),startTime);
+                LocalDateTime endDateTime = LocalDateTime.of(yearMonth.withMonth(12).atDay(25),endTime);
+                staffAttendanceDTO.setStartDate(startDateTime);
+                staffAttendanceDTO.setEndDate(endDateTime);
+            }
+        }
+    }
+
     @Override
     public void exportStaffAttendanceRecords(HttpServletResponse response, StaffAttendanceDTO staffAttendanceDTO) {
         response.reset();
         try{
+            formatExportDateRange(staffAttendanceDTO);
+            //鏌ヨ浜哄憳鏋舵瀯
+            List<User> userList = userMapper.selectUserListByPerformance(false);
+            List<Integer> userIdList = userList.stream().map(User::getId).collect(Collectors.toList());
             List<LocalDate> attendanceDateList = buildAttendanceDateList(staffAttendanceDTO);
             //鎵规敞淇℃伅鍧愭爣淇℃伅
             List<StaffAttendanceAnnotationTextExcelData> annotationTextList = new ArrayList<>();
             // 鏌ヨ鐝
+
             List<PerformanceShiftMapDto> performanceShifts = performanceShiftMapper.selectListByWorkTime(
                     staffAttendanceDTO.getStartDate(), staffAttendanceDTO.getEndDate(), staffAttendanceDTO.getKeyword());
             //鑾峰彇鑰冨嫟鏁版嵁
@@ -430,7 +455,7 @@
             //缁勮瀵煎嚭鏁版嵁
             List<StaffAttendanceExcelData> excelData = new ArrayList<>();
             Map<Integer, List<PerformanceShiftMapDto>> groupByUserId = performanceShifts.stream().collect(Collectors.groupingBy(PerformanceShiftMapDto::getUserId));
-            List<Integer> userIdKeys = groupByUserId.keySet().stream().sorted().collect(Collectors.toList());
+            List<Integer> userIdKeys = groupByUserId.keySet().stream().sorted(Comparator.comparing(userIdList::indexOf)).collect(Collectors.toList());
             for (int i = 0; i < userIdKeys.size(); i++) {
                 List<PerformanceShiftMapDto> shiftMapDtos = groupByUserId.get(userIdKeys.get(i));
                 StaffAttendanceExcelData attendanceExcelData = new StaffAttendanceExcelData();

--
Gitblit v1.9.3