From e7fbef58a1497e6b42fd7f9004ec9942078c4975 Mon Sep 17 00:00:00 2001 From: BenjaminNH <1249376374@qq.com> Date: Wed, 2 Jul 2025 23:15:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=91=98=E4=BD=BF=E7=94=A8=E4=BA=BA=E7=BB=9F=E8=AE=A1=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=AE=A1=E7=AE=97=E5=8F=8A=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/CorsConfig.java | 1 + .../controller/ReservationController.java | 41 +++++++++++++++++++ .../mapper/ReservationMapper.java | 5 +++ .../service/ReservationService.java | 4 ++ .../service/impl/ReservationServiceImpl.java | 6 +++ .../vo/ReservationStatsVO.java | 33 +++++++++++++++ .../resources/mapper/ReservationMapper.xml | 28 +++++++++++++ 7 files changed, 118 insertions(+) create mode 100644 src/main/java/github/benjamin/equipreservebackend/vo/ReservationStatsVO.java create mode 100644 src/main/resources/mapper/ReservationMapper.xml diff --git a/src/main/java/github/benjamin/equipreservebackend/config/CorsConfig.java b/src/main/java/github/benjamin/equipreservebackend/config/CorsConfig.java index 6d50fe8..958e7cd 100644 --- a/src/main/java/github/benjamin/equipreservebackend/config/CorsConfig.java +++ b/src/main/java/github/benjamin/equipreservebackend/config/CorsConfig.java @@ -23,6 +23,7 @@ public class CorsConfig { config.addAllowedHeader("*"); config.addAllowedMethod("*"); config.setMaxAge(3600L); + config.addExposedHeader("Content-Disposition"); UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); source.registerCorsConfiguration("/**", config); diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java b/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java index 15ac33b..4669875 100644 --- a/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java +++ b/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java @@ -1,15 +1,28 @@ package github.benjamin.equipreservebackend.controller; +import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import github.benjamin.equipreservebackend.constant.ReservationStatus; import github.benjamin.equipreservebackend.entity.Reservation; import github.benjamin.equipreservebackend.response.ResponseResult; import github.benjamin.equipreservebackend.service.ReservationService; +import github.benjamin.equipreservebackend.vo.DeviceStatsVO; +import github.benjamin.equipreservebackend.vo.ReservationStatsVO; import github.benjamin.equipreservebackend.vo.ReservationVO; import github.benjamin.equipreservebackend.vo.UserReservationVO; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; +import org.springframework.format.annotation.DateTimeFormat; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.List; + @RestController @RequestMapping("/reservation") @RequiredArgsConstructor @@ -42,4 +55,32 @@ public class ReservationController { return ResponseResult.success(reservationService.getReservationVO(id, page, size)); } + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/stats") + public ResponseResult> getReservationStats(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate start, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { + return ResponseResult.success(reservationService.getReservationStats(start, end)); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/stats/export") + public void exportReservationStats(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate start, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end, + HttpServletResponse response) throws IOException { + + String fileName = String.format("使用人统计_%s-%s.xlsx", start.format(DateTimeFormatter.ISO_DATE), end.format(DateTimeFormatter.ISO_DATE)); + String encodedName = URLEncoder.encode(fileName, StandardCharsets.UTF_8); + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + response.setHeader("Content-Disposition", "attachment;filename=" + encodedName); + + // 查询数据 + List data = reservationService.getReservationStats(start, end); + + // 使用EasyExcel写入response流 + EasyExcel.write(response.getOutputStream(), ReservationStatsVO.class) + .sheet("使用人统计") + .doWrite(data); + } + } diff --git a/src/main/java/github/benjamin/equipreservebackend/mapper/ReservationMapper.java b/src/main/java/github/benjamin/equipreservebackend/mapper/ReservationMapper.java index 4851185..2a94cb8 100644 --- a/src/main/java/github/benjamin/equipreservebackend/mapper/ReservationMapper.java +++ b/src/main/java/github/benjamin/equipreservebackend/mapper/ReservationMapper.java @@ -2,8 +2,13 @@ package github.benjamin.equipreservebackend.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import github.benjamin.equipreservebackend.entity.Reservation; +import github.benjamin.equipreservebackend.vo.ReservationStatsVO; import org.springframework.stereotype.Repository; +import java.time.LocalDate; +import java.util.List; + @Repository public interface ReservationMapper extends BaseMapper { + List getReservationStats(LocalDate start, LocalDate end); } diff --git a/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java b/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java index 948da91..a33c016 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java @@ -2,10 +2,12 @@ package github.benjamin.equipreservebackend.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import github.benjamin.equipreservebackend.entity.Reservation; +import github.benjamin.equipreservebackend.vo.ReservationStatsVO; import github.benjamin.equipreservebackend.vo.ReservationVO; import github.benjamin.equipreservebackend.vo.TimeRangeVO; import github.benjamin.equipreservebackend.vo.UserReservationVO; +import java.time.LocalDate; import java.util.List; public interface ReservationService { @@ -19,4 +21,6 @@ public interface ReservationService { List getUnavailableTimes(Long id); Page getReservationVO(Long userId, Integer page, Integer size); + + List getReservationStats(LocalDate start, LocalDate end); } diff --git a/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java b/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java index faad217..5b87c79 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java @@ -8,6 +8,7 @@ import github.benjamin.equipreservebackend.exception.ApiException; import github.benjamin.equipreservebackend.mapper.*; import github.benjamin.equipreservebackend.service.ReservationService; import github.benjamin.equipreservebackend.utils.PageUtil; +import github.benjamin.equipreservebackend.vo.ReservationStatsVO; import github.benjamin.equipreservebackend.vo.ReservationVO; import github.benjamin.equipreservebackend.vo.TimeRangeVO; import github.benjamin.equipreservebackend.vo.UserReservationVO; @@ -146,4 +147,9 @@ public class ReservationServiceImpl implements ReservationService { .toList()); return res; } + + @Override + public List getReservationStats(LocalDate start, LocalDate end) { + return reservationMapper.getReservationStats(start, end); + } } diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/ReservationStatsVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/ReservationStatsVO.java new file mode 100644 index 0000000..d7e5935 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/vo/ReservationStatsVO.java @@ -0,0 +1,33 @@ +package github.benjamin.equipreservebackend.vo; + +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import lombok.Data; + +@Data +public class ReservationStatsVO { + + @JsonSerialize(using = ToStringSerializer.class) + @ExcelIgnore + private Long deviceId; + + @ExcelProperty("设备名称") + @ColumnWidth(15) + private String deviceName; + + @ExcelProperty("使用人") + @ColumnWidth(15) + private String applicantName; + + @ExcelProperty("所属团队") + @ColumnWidth(15) + private String applicantTeam; + + @ExcelProperty("使用次数") + @ColumnWidth(15) + private Integer usageCount; + +} diff --git a/src/main/resources/mapper/ReservationMapper.xml b/src/main/resources/mapper/ReservationMapper.xml new file mode 100644 index 0000000..b246c78 --- /dev/null +++ b/src/main/resources/mapper/ReservationMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + \ No newline at end of file