longz
2026-07-21 b23029478bc8ce3631f34307e648e766a4be1a24
fix: format site export operation date
2个文件已修改
36 ■■■■■ 已修改文件
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/dto/SiteExcelDTO.java
@@ -6,7 +6,12 @@
import org.springframework.beans.BeanUtils;
import java.math.BigDecimal;
import java.time.Instant;
import java.time.LocalDate;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
@Data
public class SiteExcelDTO {
@@ -138,6 +143,30 @@
        if (site.getEstablishmentTime() != null) {
            dto.setEstablishmentTime(site.getEstablishmentTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        }
        dto.setOfficialRunTime(formatDateOnly(site.getOfficialRunTime()));
        return dto;
    }
    static String formatDateOnly(String value) {
        if (value == null || value.trim().isEmpty()) {
            return value;
        }
        String text = value.trim();
        try {
            return LocalDate.parse(text, DateTimeFormatter.ISO_LOCAL_DATE).toString();
        } catch (DateTimeParseException ignored) {
            // Continue with timestamp formats used by historical site data.
        }
        try {
            return OffsetDateTime.parse(text, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
                    .atZoneSameInstant(ZoneId.of("Asia/Shanghai")).toLocalDate().toString();
        } catch (DateTimeParseException ignored) {
            // Some records use an instant with millisecond precision and a trailing Z.
        }
        try {
            return Instant.parse(text).atZone(ZoneId.of("Asia/Shanghai")).toLocalDate().toString();
        } catch (DateTimeParseException ignored) {
            return text;
        }
    }
}
ruoyi-service/ruoyi-chargingPile/src/test/java/com/ruoyi/chargingPile/dto/SiteExcelDTOTest.java
@@ -14,6 +14,13 @@
class SiteExcelDTOTest {
    @Test
    void formatsOfficialRunTimeAsLocalDate() {
        assertEquals("2024-12-31", SiteExcelDTO.formatDateOnly("2024-12-30T16:00:00.000Z"));
        assertEquals("2025-05-31", SiteExcelDTO.formatDateOnly("2025-05-30T16:02:14.900Z"));
        assertEquals("2026-07-21", SiteExcelDTO.formatDateOnly("2026-07-21"));
    }
    @Test
    void columnsFollowSitePrototypeOrder() {
        List<String> actual = Arrays.stream(SiteExcelDTO.class.getDeclaredFields())
                .map(field -> field.getAnnotation(Excel.class))