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