feat: 实现查询设备不可用时间,预约设备功能

This commit is contained in:
BenjaminNH 2025-06-24 17:29:20 +08:00
parent 44df4b564d
commit 581cc02388
7 changed files with 89 additions and 2 deletions

View File

@ -0,0 +1,15 @@
package github.benjamin.equipreservebackend.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/device_image/**")
.addResourceLocations("file:" + System.getProperty("user.dir") + "/device_image/");
}
}

View File

@ -4,13 +4,16 @@ 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.DeviceUserVO;
import github.benjamin.equipreservebackend.vo.TimeRangeVO;
import lombok.RequiredArgsConstructor;
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.util.List;
@RestController
@RequiredArgsConstructor
@ -19,6 +22,8 @@ public class DeviceController {
private final DeviceService deviceService;
private final ReservationService reservationService;
@PreAuthorize("hasRole('USER')")
@GetMapping
public ResponseResult<Page<DeviceUserVO>> getDevices(@RequestParam(defaultValue = "1") Integer page,
@ -29,6 +34,13 @@ public class DeviceController {
return ResponseResult.success(res);
}
@PreAuthorize("hasRole('USER')")
@GetMapping ("/unavailable-times/{id}")
public ResponseResult<List<TimeRangeVO>> getUnavailableTimes(@PathVariable Long id) {
List<TimeRangeVO> res = reservationService.getUnavailableTimes(id);
return ResponseResult.success(res);
}
@PreAuthorize("hasRole('DEVICE_ADMIN')")
@PostMapping
public ResponseResult<?> addDevice(@RequestBody Device device){

View File

@ -0,0 +1,9 @@
package github.benjamin.equipreservebackend.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import github.benjamin.equipreservebackend.entity.Team;
import org.springframework.stereotype.Repository;
@Repository
public interface TeamMapper extends BaseMapper<Team> {
}

View File

@ -2,6 +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.TimeRangeVO;
import github.benjamin.equipreservebackend.vo.UserReservationVO;
import java.util.List;
@ -13,4 +14,6 @@ public interface ReservationService {
void addReservation(Reservation reservation);
Page<UserReservationVO> getUserReservationVO(Long userId, Page<Reservation> pageRequest);
List<TimeRangeVO> getUnavailableTimes(Long id);
}

View File

@ -0,0 +1,4 @@
package github.benjamin.equipreservebackend.service;
public interface TeamService {
}

View File

@ -5,17 +5,21 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import github.benjamin.equipreservebackend.constant.ReservationStatus;
import github.benjamin.equipreservebackend.entity.Device;
import github.benjamin.equipreservebackend.entity.Reservation;
import github.benjamin.equipreservebackend.entity.Team;
import github.benjamin.equipreservebackend.entity.User;
import github.benjamin.equipreservebackend.mapper.DeviceMapper;
import github.benjamin.equipreservebackend.mapper.ReservationMapper;
import github.benjamin.equipreservebackend.mapper.TeamMapper;
import github.benjamin.equipreservebackend.mapper.UserMapper;
import github.benjamin.equipreservebackend.service.ReservationService;
import github.benjamin.equipreservebackend.utils.PageUtil;
import github.benjamin.equipreservebackend.vo.TimeRangeVO;
import github.benjamin.equipreservebackend.vo.UserReservationVO;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@ -33,6 +37,8 @@ public class ReservationServiceImpl implements ReservationService {
private final UserMapper userMapper;
private final TeamMapper teamMapper;
/**
* 未来days天内有预约的设备显示为有预约
*/
@ -41,15 +47,24 @@ public class ReservationServiceImpl implements ReservationService {
@Override
public List<Reservation> getApprovedReservationsByDeviceIds(List<Long> devicesIds) {
LocalDateTime endTime = LocalDateTime.now().plusDays(days);
LocalDate now = LocalDate.now();
LocalDate endTime = now.plusDays(days);
return reservationMapper.selectList(new LambdaQueryWrapper<Reservation>()
.in(Reservation::getDeviceId, devicesIds)
.eq(Reservation::getStatus, ReservationStatus.APPROVED)
.lt(Reservation::getEndTime, endTime));
.between(Reservation::getStartTime, now, endTime));
}
@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);
}
@ -94,4 +109,16 @@ public class ReservationServiceImpl implements ReservationService {
res.setRecords(vos);
return res;
}
@Override
public List<TimeRangeVO> getUnavailableTimes(Long id) {
List<Reservation> reservations = reservationMapper.selectList(new LambdaQueryWrapper<Reservation>()
.eq(Reservation::getDeviceId, id)
.eq(Reservation::getStatus, "APPROVED")
.gt(Reservation::getEndTime, LocalDate.now()));
return reservations.stream()
.map(r -> new TimeRangeVO(r.getStartTime(), r.getEndTime()))
.toList();
}
}

View File

@ -0,0 +1,17 @@
package github.benjamin.equipreservebackend.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TimeRangeVO {
private LocalDate startTime;
private LocalDate endTime;
}