diff --git a/src/main/java/github/benjamin/equipreservebackend/config/WebConfig.java b/src/main/java/github/benjamin/equipreservebackend/config/WebConfig.java new file mode 100644 index 0000000..1493a1c --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/config/WebConfig.java @@ -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/"); + } +} diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java index e9112bf..a03aea7 100644 --- a/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java +++ b/src/main/java/github/benjamin/equipreservebackend/controller/DeviceController.java @@ -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> 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> getUnavailableTimes(@PathVariable Long id) { + List res = reservationService.getUnavailableTimes(id); + return ResponseResult.success(res); + } + @PreAuthorize("hasRole('DEVICE_ADMIN')") @PostMapping public ResponseResult addDevice(@RequestBody Device device){ diff --git a/src/main/java/github/benjamin/equipreservebackend/mapper/TeamMapper.java b/src/main/java/github/benjamin/equipreservebackend/mapper/TeamMapper.java new file mode 100644 index 0000000..ed45f0d --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/mapper/TeamMapper.java @@ -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 { +} diff --git a/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java b/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java index 77770c4..88838c2 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/ReservationService.java @@ -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 getUserReservationVO(Long userId, Page pageRequest); + + List getUnavailableTimes(Long id); } diff --git a/src/main/java/github/benjamin/equipreservebackend/service/TeamService.java b/src/main/java/github/benjamin/equipreservebackend/service/TeamService.java new file mode 100644 index 0000000..0d2eac4 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/service/TeamService.java @@ -0,0 +1,4 @@ +package github.benjamin.equipreservebackend.service; + +public interface TeamService { +} 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 e331cc6..bebf728 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java @@ -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 getApprovedReservationsByDeviceIds(List devicesIds) { - LocalDateTime endTime = LocalDateTime.now().plusDays(days); + LocalDate now = LocalDate.now(); + LocalDate endTime = now.plusDays(days); return reservationMapper.selectList(new LambdaQueryWrapper() .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 getUnavailableTimes(Long id) { + List reservations = reservationMapper.selectList(new LambdaQueryWrapper() + .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(); + } } diff --git a/src/main/java/github/benjamin/equipreservebackend/vo/TimeRangeVO.java b/src/main/java/github/benjamin/equipreservebackend/vo/TimeRangeVO.java new file mode 100644 index 0000000..181cac7 --- /dev/null +++ b/src/main/java/github/benjamin/equipreservebackend/vo/TimeRangeVO.java @@ -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; + +}