From bf973f3d288c065b6d4eccb6401edb1bc189f055 Mon Sep 17 00:00:00 2001 From: BenjaminNH <1249376374@qq.com> Date: Tue, 1 Jul 2025 11:26:05 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E8=8E=B7=E5=8F=96=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/DeviceStatus.java | 15 ++++++++-- .../controller/DeviceController.java | 24 +++++++++++---- .../service/DeviceService.java | 13 ++++++++- .../service/impl/DeviceServiceImpl.java | 29 +++++++++++++++++-- .../equipreservebackend/vo/DeviceAdminVO.java | 29 +++++++++++++++++++ 5 files changed, 98 insertions(+), 12 deletions(-) create mode 100644 src/main/java/github/benjamin/equipreservebackend/vo/DeviceAdminVO.java diff --git a/src/main/java/github/benjamin/equipreservebackend/constant/DeviceStatus.java b/src/main/java/github/benjamin/equipreservebackend/constant/DeviceStatus.java index a10fbae..7da3a80 100644 --- a/src/main/java/github/benjamin/equipreservebackend/constant/DeviceStatus.java +++ b/src/main/java/github/benjamin/equipreservebackend/constant/DeviceStatus.java @@ -1,12 +1,21 @@ package github.benjamin.equipreservebackend.constant; +import lombok.Getter; + /** * 设备内部状态 */ +@Getter public enum DeviceStatus { - AVAILABLE, - MAINTENANCE, - DISABLED + AVAILABLE("可用"), + MAINTENANCE("维护中"), + DISABLED("停用"); + + final String label; + + DeviceStatus(String label) { + this.label = label; + } } diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java index a03aea7..c9c2950 100644 --- a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java +++ b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java @@ -5,6 +5,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.DeviceUserVO; import github.benjamin.equipreservebackend.vo.TimeRangeVO; import lombok.RequiredArgsConstructor; @@ -26,16 +27,16 @@ public class DeviceController { @PreAuthorize("hasRole('USER')") @GetMapping - public ResponseResult> getDevices(@RequestParam(defaultValue = "1") Integer page, - @RequestParam(defaultValue = "10") Integer size, - @RequestParam(required = false) String name) { + public ResponseResult> getUserDevices(@RequestParam(defaultValue = "1") Integer page, + @RequestParam(defaultValue = "10") Integer size, + @RequestParam(required = false) String name) { Page pageRequest = new Page<>(page, size); - Page res = deviceService.getDeviceVO(pageRequest, name); + Page res = deviceService.getUserDevices(pageRequest, name); return ResponseResult.success(res); } @PreAuthorize("hasRole('USER')") - @GetMapping ("/unavailable-times/{id}") + @GetMapping("/unavailable-times/{id}") public ResponseResult> getUnavailableTimes(@PathVariable Long id) { List res = reservationService.getUnavailableTimes(id); return ResponseResult.success(res); @@ -43,7 +44,7 @@ public class DeviceController { @PreAuthorize("hasRole('DEVICE_ADMIN')") @PostMapping - public ResponseResult addDevice(@RequestBody Device device){ + public ResponseResult addDevice(@RequestBody Device device) { deviceService.addDevice(device); return ResponseResult.success(device); } @@ -64,6 +65,17 @@ public class DeviceController { return ResponseResult.success(updatedDevice); } + @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) { + + Page pageRequest = new Page<>(page, size); + return ResponseResult.success(deviceService.getAdminDevice(pageRequest, userId, name)); + } + @PreAuthorize("hasRole('DEVICE_ADMIN')") @PostMapping("/{id}/image") public ResponseResult uploadImage(@PathVariable("id") Long id, diff --git a/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java b/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java index 42afcab..81d7348 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/DeviceService.java @@ -1,14 +1,16 @@ package github.benjamin.equipreservebackend.service; +import com.baomidou.mybatisplus.core.metadata.IPage; 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.DeviceUserVO; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; public interface DeviceService { - Page getDeviceVO(Page pageRequest, String name); + Page getUserDevices(Page pageRequest, String name); void addDevice(Device device); @@ -17,4 +19,13 @@ public interface DeviceService { Device updateDevice(Device device); String saveImage(Long id, MultipartFile image) throws IOException; + + /** + * 获取用户所属团队的所有设备 + * @param pageRequest + * @param userId + * @param name + * @return 分页后的设备列表 + */ + Page getAdminDevice(Page pageRequest, Long userId, String name); } 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 903a6b7..67f899c 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/impl/DeviceServiceImpl.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/DeviceServiceImpl.java @@ -7,13 +7,16 @@ import github.benjamin.equipreservebackend.constant.DeviceReservationState; import github.benjamin.equipreservebackend.constant.DeviceStatus; import github.benjamin.equipreservebackend.entity.Device; import github.benjamin.equipreservebackend.entity.Reservation; +import github.benjamin.equipreservebackend.entity.User; import github.benjamin.equipreservebackend.exception.ApiException; import github.benjamin.equipreservebackend.mapper.DeviceMapper; +import github.benjamin.equipreservebackend.mapper.UserMapper; import github.benjamin.equipreservebackend.response.ResponseCode; import github.benjamin.equipreservebackend.service.DeviceService; 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.DeviceUserVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -26,6 +29,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; import java.util.List; import java.util.Objects; @@ -37,8 +41,10 @@ public class DeviceServiceImpl implements DeviceService { private final ReservationService reservationService; + private final UserMapper userMapper; + @Override - public Page getDeviceVO(Page pageRequest, String name) { + public Page getUserDevices(Page pageRequest, String name) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(Device::getStatus, DeviceStatus.AVAILABLE) .orderByAsc(Device::getName); @@ -49,11 +55,15 @@ public class DeviceServiceImpl implements DeviceService { List deviceIds = devices.getRecords().stream() .map(Device::getId) .toList(); + Page res = PageUtil.copyPage(devices); + if (deviceIds.isEmpty()) { + res.setRecords(new ArrayList<>()); + return res; + } List reservations = reservationService.getApprovedReservationsByDeviceIds(deviceIds); List deviceUserVOS = devices.getRecords().stream() .map(device -> buildDeviceVO(device, reservations)) .toList(); - Page res = PageUtil.copyPage(devices); res.setRecords(deviceUserVOS); return res; } @@ -121,6 +131,21 @@ public class DeviceServiceImpl implements DeviceService { return imagePath; } + @Override + public Page getAdminDevice(Page pageRequest, Long userId, String name) { + User user = userMapper.selectById(userId); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(Device::getTeamId, user.getTeamId()) + .orderByAsc(Device::getName); + if (StringUtils.hasText(name)) { + wrapper.like(Device::getName, name); + } + Page devicePage = deviceMapper.selectPage(pageRequest, wrapper); + Page res = PageUtil.copyPage(devicePage); + res.setRecords(devicePage.getRecords().stream().map(DeviceAdminVO::new).toList()); + return res; + } + private DeviceUserVO buildDeviceVO(Device device, List reservations) { DeviceUserVO vo = new DeviceUserVO(device); // TODO 显示设备状态逻辑,根据客户需求修改 diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/DeviceAdminVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/DeviceAdminVO.java new file mode 100644 index 0000000..b0e826d --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/vo/DeviceAdminVO.java @@ -0,0 +1,29 @@ +package github.benjamin.equipreservebackend.vo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import github.benjamin.equipreservebackend.constant.DeviceStatus; +import github.benjamin.equipreservebackend.entity.Device; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class DeviceAdminVO { + @JsonSerialize(using = ToStringSerializer.class) + private Long deviceId; + private String name; + private String usageRequirement; + private String location; + private String imagePath; + private String status; + + public DeviceAdminVO(Device d) { + this.deviceId = d.getId(); + this.name = d.getName(); + this.usageRequirement = d.getUsageRequirement(); + this.location = d.getLocation(); + this.imagePath = d.getImagePath(); + this.status = d.getStatus(); + } +}