From b350e933d3d5c4c59da0d5d71ca1ab081753dc8c Mon Sep 17 00:00:00 2001
From: BenjaminNH <1249376374@qq.com>
Date: Wed, 2 Jul 2025 22:06:15 +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=E8=AE=BE=E5=A4=87=E7=BB=9F=E8=AE=A1=E6=95=B0=E6=8D=AE?=
=?UTF-8?q?=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
---
pom.xml | 5 +++
.../controller/DeviceController.java | 44 +++++++++++++++++--
.../mapper/DeviceMapper.java | 5 +++
.../service/DeviceService.java | 5 +++
.../service/impl/DeviceServiceImpl.java | 7 +++
.../service/impl/ReservationServiceImpl.java | 4 --
.../equipreservebackend/vo/DeviceStatsVO.java | 29 ++++++++++++
src/main/resources/mapper/DeviceMapper.xml | 22 ++++++++++
8 files changed, 113 insertions(+), 8 deletions(-)
create mode 100644 src/main/java/github/benjamin/equipreservebackend/vo/DeviceStatsVO.java
create mode 100644 src/main/resources/mapper/DeviceMapper.xml
diff --git a/pom.xml b/pom.xml
index 646c86a..fc1e67e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -61,6 +61,11 @@
0.12.6
+
+ com.alibaba
+ easyexcel
+ 4.0.3
+
org.springframework.boot
diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java
index 82dbed3..41e0821 100644
--- a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java
+++ b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java
@@ -1,19 +1,28 @@
package github.benjamin.equipreservebackend.controller;
+import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import github.benjamin.equipreservebackend.entity.Device;
import github.benjamin.equipreservebackend.response.ResponseResult;
import github.benjamin.equipreservebackend.service.DeviceService;
import github.benjamin.equipreservebackend.service.ReservationService;
import github.benjamin.equipreservebackend.vo.DeviceAdminVO;
+import github.benjamin.equipreservebackend.vo.DeviceStatsVO;
import github.benjamin.equipreservebackend.vo.DeviceUserVO;
import github.benjamin.equipreservebackend.vo.TimeRangeVO;
+import jakarta.servlet.http.HttpServlet;
+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 org.springframework.web.multipart.MultipartFile;
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
@@ -45,7 +54,7 @@ public class DeviceController {
@PreAuthorize("hasRole('DEVICE_ADMIN')")
@PostMapping("/{userId}")
public ResponseResult addDevice(@PathVariable("userId") Long userId,
- @RequestBody Device device) {
+ @RequestBody Device device) {
deviceService.addDevice(userId, device);
return ResponseResult.success(device);
}
@@ -69,9 +78,9 @@ public class DeviceController {
@PreAuthorize("hasRole('DEVICE_ADMIN')")
@GetMapping("/{userId}")
public ResponseResult> getAdminDevice(@PathVariable("userId") Long userId,
- @RequestParam(defaultValue = "1") Integer page,
- @RequestParam(defaultValue = "10") Integer size,
- @RequestParam(required = false) String name) {
+ @RequestParam(defaultValue = "1") Integer page,
+ @RequestParam(defaultValue = "10") Integer size,
+ @RequestParam(required = false) String name) {
Page pageRequest = new Page<>(page, size);
return ResponseResult.success(deviceService.getAdminDevice(pageRequest, userId, name));
@@ -84,4 +93,31 @@ public class DeviceController {
String imagePath = deviceService.saveImage(id, image);
return ResponseResult.success(imagePath);
}
+
+ @PreAuthorize("hasRole('ADMIN')")
+ @GetMapping("/usage-stats")
+ public ResponseResult> getDeviceUsageStats(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate start,
+ @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) {
+ return ResponseResult.success(deviceService.getDeviceUsageStats(start, end));
+ }
+
+ @PreAuthorize("hasRole('ADMIN')")
+ @GetMapping("/usage-stats/export")
+ public void exportDeviceUsageStats(@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 = deviceService.getDeviceUsageStats(start, end);
+
+ // 使用EasyExcel写入response流
+ EasyExcel.write(response.getOutputStream(), DeviceStatsVO.class)
+ .sheet("设备使用统计")
+ .doWrite(data);
+ }
}
diff --git a/src/main/java/github/benjamin/equipreservebackend/mapper/DeviceMapper.java b/src/main/java/github/benjamin/equipreservebackend/mapper/DeviceMapper.java
index a2bfa17..021e8e3 100644
--- a/src/main/java/github/benjamin/equipreservebackend/mapper/DeviceMapper.java
+++ b/src/main/java/github/benjamin/equipreservebackend/mapper/DeviceMapper.java
@@ -2,8 +2,13 @@ package github.benjamin.equipreservebackend.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import github.benjamin.equipreservebackend.entity.Device;
+import github.benjamin.equipreservebackend.vo.DeviceStatsVO;
import org.springframework.stereotype.Repository;
+import java.time.LocalDate;
+import java.util.List;
+
@Repository
public interface DeviceMapper extends BaseMapper {
+ List getDeviceUsageStats(LocalDate start, LocalDate end);
}
diff --git a/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java b/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java
index 2e3aef1..d54253f 100644
--- a/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java
+++ b/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java
@@ -3,10 +3,13 @@ package github.benjamin.equipreservebackend.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import github.benjamin.equipreservebackend.entity.Device;
import github.benjamin.equipreservebackend.vo.DeviceAdminVO;
+import github.benjamin.equipreservebackend.vo.DeviceStatsVO;
import github.benjamin.equipreservebackend.vo.DeviceUserVO;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
+import java.time.LocalDate;
+import java.util.List;
public interface DeviceService {
Page getUserDevices(Page pageRequest, String name);
@@ -27,4 +30,6 @@ public interface DeviceService {
* @return 分页后的设备列表
*/
Page getAdminDevice(Page pageRequest, Long userId, String name);
+
+ List getDeviceUsageStats(LocalDate start, LocalDate end);
}
diff --git a/src/main/java/github/benjamin/equipreservebackend/service/impl/DeviceServiceImpl.java b/src/main/java/github/benjamin/equipreservebackend/service/impl/DeviceServiceImpl.java
index 2746230..caba509 100644
--- a/src/main/java/github/benjamin/equipreservebackend/service/impl/DeviceServiceImpl.java
+++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/DeviceServiceImpl.java
@@ -17,6 +17,7 @@ import github.benjamin.equipreservebackend.service.ReservationService;
import github.benjamin.equipreservebackend.utils.FileUtil;
import github.benjamin.equipreservebackend.utils.PageUtil;
import github.benjamin.equipreservebackend.vo.DeviceAdminVO;
+import github.benjamin.equipreservebackend.vo.DeviceStatsVO;
import github.benjamin.equipreservebackend.vo.DeviceUserVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
@@ -29,6 +30,7 @@ import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
+import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -149,6 +151,11 @@ public class DeviceServiceImpl implements DeviceService {
return res;
}
+ @Override
+ public List getDeviceUsageStats(LocalDate start, LocalDate end) {
+ return deviceMapper.getDeviceUsageStats(start, end);
+ }
+
private DeviceUserVO buildDeviceVO(Device device, List reservations) {
DeviceUserVO vo = new DeviceUserVO(device);
// TODO 显示设备状态逻辑,根据客户需求修改
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 56ba9f8..faad217 100644
--- a/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java
+++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java
@@ -56,12 +56,8 @@ public class ReservationServiceImpl implements ReservationService {
@Override
public void addReservation(Reservation reservation) {
User user = userMapper.selectById(reservation.getUserId());
- Team team = teamMapper.selectById(user.getTeamId());
Device device = deviceMapper.selectById(reservation.getDeviceId());
- reservation.setApplicantName(user.getName());
- reservation.setApplicantTeam(team.getName());
- reservation.setApplicantContact(user.getPhone());
reservation.setDeviceAdminId(device.getDeviceAdminId());
reservation.setStatus(String.valueOf(ReservationStatus.PENDING_LEADER));
reservationMapper.insert(reservation);
diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/DeviceStatsVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/DeviceStatsVO.java
new file mode 100644
index 0000000..db84bfc
--- /dev/null
+++ b/src/main/java/github/benjamin/equipreservebackend/vo/DeviceStatsVO.java
@@ -0,0 +1,29 @@
+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 DeviceStatsVO {
+
+ @JsonSerialize(using = ToStringSerializer.class)
+ @ExcelIgnore
+ private Long deviceId;
+
+ @ColumnWidth(15)
+ @ExcelProperty("设备名称")
+ private String deviceName;
+
+ @ColumnWidth(15)
+ @ExcelProperty("使用次数")
+ private Integer usageCount;
+
+ @ColumnWidth(20)
+ @ExcelProperty("使用时长(天)")
+ private Integer totalUsageDays;
+
+}
diff --git a/src/main/resources/mapper/DeviceMapper.xml b/src/main/resources/mapper/DeviceMapper.xml
new file mode 100644
index 0000000..29ca210
--- /dev/null
+++ b/src/main/resources/mapper/DeviceMapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
\ No newline at end of file