diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java index f269410..41cfbc8 100644 --- a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java +++ b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java @@ -6,11 +6,7 @@ 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 github.benjamin.equipreservebackend.vo.*; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.format.annotation.DateTimeFormat; @@ -54,7 +50,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(new DeviceAdminVO(device)); } @@ -69,7 +65,7 @@ public class DeviceController { @PreAuthorize("hasRole('DEVICE_ADMIN')") @PutMapping("/{id}") public ResponseResult updateDevice(@PathVariable("id") Long id, - @RequestBody Device device) { + @RequestBody Device device) { device.setId(id); Device updatedDevice = deviceService.updateDevice(device); return ResponseResult.success(new DeviceAdminVO(updatedDevice)); @@ -120,4 +116,30 @@ public class DeviceController { .sheet("设备使用统计") .doWrite(data); } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/detail-stats") + public ResponseResult> getDeviceDetailStats(@RequestParam Long deviceId, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate start, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end) { + return ResponseResult.success(reservationService.getDeviceDetailStats(deviceId, start, end)); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/detail-stats/export") + public void exportDeviceDetailStats(@RequestParam Long deviceId, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate start, + @RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate end, + HttpServletResponse response) throws IOException { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + + // 查询数据 + List data = reservationService.getDeviceDetailStats(deviceId, start, end); + + // 使用EasyExcel写入response流 + EasyExcel.write(response.getOutputStream(), DeviceDetailStatsVO.class) + .sheet("设备使用详情") + .doWrite(data); + } } diff --git a/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java b/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java index a33c016..280d3c6 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java @@ -2,10 +2,7 @@ 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 github.benjamin.equipreservebackend.vo.*; import java.time.LocalDate; import java.util.List; @@ -23,4 +20,6 @@ public interface ReservationService { Page getReservationVO(Long userId, Integer page, Integer size); List getReservationStats(LocalDate start, LocalDate end); + + List getDeviceDetailStats(Long deviceId, 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 5f8cb36..bae7cef 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java @@ -3,15 +3,15 @@ package github.benjamin.equipreservebackend.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import github.benjamin.equipreservebackend.constant.ReservationStatus; -import github.benjamin.equipreservebackend.entity.*; +import github.benjamin.equipreservebackend.entity.Device; +import github.benjamin.equipreservebackend.entity.Reservation; +import github.benjamin.equipreservebackend.entity.Role; +import github.benjamin.equipreservebackend.entity.User; 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; +import github.benjamin.equipreservebackend.vo.*; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -152,4 +152,14 @@ public class ReservationServiceImpl implements ReservationService { public List getReservationStats(LocalDate start, LocalDate end) { return reservationMapper.getReservationStats(start, end); } + + @Override + public List getDeviceDetailStats(Long deviceId, LocalDate start, LocalDate end) { + return reservationMapper.selectList(new LambdaQueryWrapper() + .eq(Reservation::getDeviceId, deviceId) + .in(Reservation::getStatus, List.of("APPROVED", "APPROVED_ASSIST")) + .ge(Reservation::getStartTime, start) + .le(Reservation::getEndTime, end) + .orderByAsc(Reservation::getApplicantName, Reservation::getStartTime)).stream().map(DeviceDetailStatsVO::new).toList(); + } } diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/DeviceDetailStatsVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/DeviceDetailStatsVO.java new file mode 100644 index 0000000..c346624 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/vo/DeviceDetailStatsVO.java @@ -0,0 +1,39 @@ +package github.benjamin.equipreservebackend.vo; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import github.benjamin.equipreservebackend.entity.Reservation; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class DeviceDetailStatsVO { + + @ExcelProperty("使用人") + @ColumnWidth(15) + private String applicantName; + + @ExcelProperty("所属团队") + @ColumnWidth(15) + private String applicantTeam; + + @ExcelProperty("开始日期") + @ColumnWidth(15) + private LocalDate startDay; + + @ExcelProperty("结束日期") + @ColumnWidth(15) + private LocalDate endDay; + + public DeviceDetailStatsVO(Reservation r) { + this.applicantName = r.getApplicantName(); + this.applicantTeam = r.getApplicantTeam(); + this.startDay = r.getStartTime(); + this.endDay = r.getEndTime(); + } +} diff --git a/src/main/resources/mapper/DeviceMapper.xml b/src/main/resources/mapper/DeviceMapper.xml index 381dfa4..0027ded 100644 --- a/src/main/resources/mapper/DeviceMapper.xml +++ b/src/main/resources/mapper/DeviceMapper.xml @@ -14,7 +14,7 @@ JOIN devices d ON r.device_id = d.id WHERE r.status IN ('APPROVED', 'APPROVED_ASSIST') AND r.start_time >= #{start} - AND r.end_time < #{end} + AND r.end_time <= #{end} GROUP BY d.id ORDER BY totalUsageDays DESC