diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/ApprovalController.java b/src/main/java/github/benjamin/equipreservebackend/controller/ApprovalController.java index a4b13ae..0c3266c 100644 --- a/src/main/java/github/benjamin/equipreservebackend/controller/ApprovalController.java +++ b/src/main/java/github/benjamin/equipreservebackend/controller/ApprovalController.java @@ -18,8 +18,8 @@ public class ApprovalController { private final ApprovalService approvalService; - @PreAuthorize("hasRole('LEADER')") - @PostMapping("/leader") + @PreAuthorize("hasAnyRole('LEADER', 'DEVICE_ADMIN')") + @PostMapping public ResponseResult addApproval(@RequestBody LeaderApprovalDTO dto) { approvalService.addApproval(dto); return ResponseResult.success(); diff --git a/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java b/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java index 694dd4f..15ac33b 100644 --- a/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java +++ b/src/main/java/github/benjamin/equipreservebackend/controller/ReservationController.java @@ -34,9 +34,9 @@ public class ReservationController { return ResponseResult.success(res); } - @PreAuthorize("hasRole('LEADER')") - @GetMapping("/leader/{id}") - public ResponseResult> getLeaderReservation(@PathVariable("id") Long id, + @PreAuthorize("hasAnyRole('LEADER', 'DEVICE_ADMIN')") + @GetMapping("/approval/{id}") + public ResponseResult> getReservation(@PathVariable("id") Long id, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) { return ResponseResult.success(reservationService.getReservationVO(id, page, size)); diff --git a/src/main/java/github/benjamin/equipreservebackend/dto/LeaderApprovalDTO.java b/src/main/java/github/benjamin/equipreservebackend/dto/LeaderApprovalDTO.java index d96d8d4..f385e5d 100644 --- a/src/main/java/github/benjamin/equipreservebackend/dto/LeaderApprovalDTO.java +++ b/src/main/java/github/benjamin/equipreservebackend/dto/LeaderApprovalDTO.java @@ -5,8 +5,9 @@ import lombok.Data; @Data public class LeaderApprovalDTO { - private Long leaderId; + private Long userId; private Long reservationId; private Boolean isApprove; + private Boolean needAssist; } diff --git a/src/main/java/github/benjamin/equipreservebackend/service/impl/ApprovalServiceImpl.java b/src/main/java/github/benjamin/equipreservebackend/service/impl/ApprovalServiceImpl.java index 1754488..e114229 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/impl/ApprovalServiceImpl.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/ApprovalServiceImpl.java @@ -9,13 +9,18 @@ import github.benjamin.equipreservebackend.constant.ReservationStatus; import github.benjamin.equipreservebackend.dto.LeaderApprovalDTO; import github.benjamin.equipreservebackend.entity.Approval; import github.benjamin.equipreservebackend.entity.Reservation; +import github.benjamin.equipreservebackend.entity.Role; +import github.benjamin.equipreservebackend.exception.ApiException; import github.benjamin.equipreservebackend.mapper.ApprovalMapper; import github.benjamin.equipreservebackend.mapper.ReservationMapper; +import github.benjamin.equipreservebackend.mapper.RoleMapper; import github.benjamin.equipreservebackend.service.ApprovalService; import github.benjamin.equipreservebackend.vo.LeaderApprovalVO; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor public class ApprovalServiceImpl implements ApprovalService { @@ -24,18 +29,36 @@ public class ApprovalServiceImpl implements ApprovalService { private final ReservationMapper reservationMapper; + private final RoleMapper roleMapper; + @Override public void addApproval(LeaderApprovalDTO dto) { + List userRoles = roleMapper.selectRoleByUserId(dto.getUserId()); + final ApprovalStep step; + final ReservationStatus status; + if (userRoles.stream().anyMatch(r -> r.getCode().equals("LEADER"))) { + step = ApprovalStep.LEADER; + status = dto.getIsApprove() ? ReservationStatus.APPROVED : ReservationStatus.REJECTED; + } else if (userRoles.stream().anyMatch(r -> r.getCode().equals("DEVICE_ADMIN"))){ + step = ApprovalStep.DEVICE_ADMIN; + if (dto.getIsApprove()) { + status = dto.getNeedAssist() ? ReservationStatus.APPROVED_ASSIST : ReservationStatus.APPROVED; + } else { + status = ReservationStatus.REJECTED; + } + } else { + throw new ApiException("用户角色不匹配,请核对或联系开发人员"); + } Approval approval = Approval.builder() - .approverId(dto.getLeaderId()) + .approverId(dto.getUserId()) .reservationId(dto.getReservationId()) - .step(ApprovalStep.LEADER.getStep()) + .step(step.getStep()) .decision(dto.getIsApprove() ? 1 : 0) .build(); approvalMapper.insert(approval); reservationMapper.update(new LambdaUpdateWrapper() .eq(Reservation::getId, dto.getReservationId()) - .set(Reservation::getStatus, dto.getIsApprove() ? ReservationStatus.PENDING_DEVICE_ADMIN : ReservationStatus.REJECTED)); + .set(Reservation::getStatus, status)); } @Override 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 d79cebf..6292970 100644 --- a/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java +++ b/src/main/java/github/benjamin/equipreservebackend/service/impl/ReservationServiceImpl.java @@ -3,14 +3,9 @@ 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.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.entity.*; +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.ReservationVO; @@ -39,6 +34,8 @@ public class ReservationServiceImpl implements ReservationService { private final TeamMapper teamMapper; + private final RoleMapper roleMapper; + /** * 未来days天内有预约的设备显示为“有预约” */ @@ -128,11 +125,21 @@ public class ReservationServiceImpl implements ReservationService { List devices = deviceMapper.selectList(new LambdaQueryWrapper() .eq(Device::getTeamId, user.getTeamId()) .select()); + List userRole = roleMapper.selectRoleByUserId(userId); + ReservationStatus status; + if (userRole.stream().anyMatch(r -> r.getCode().equals("LEADER"))) { + status = ReservationStatus.PENDING_LEADER; + } else if (userRole.stream().anyMatch(r -> r.getCode().equals("DEVICE_ADMIN"))) { + status = ReservationStatus.PENDING_DEVICE_ADMIN; + } else { + throw new ApiException("用户角色不正确,请检查或联系开发人员"); + } + List deviceIds = devices.stream().map(Device::getId).toList(); Map deviceMap = devices.stream().collect(Collectors.toMap(Device::getId, Function.identity())); Page reservationPage = reservationMapper.selectPage(new Page<>(page, size), new LambdaQueryWrapper() .in(Reservation::getDeviceId, deviceIds) - .eq(Reservation::getStatus, ReservationStatus.PENDING_LEADER) + .eq(Reservation::getStatus, status) .orderByDesc(Reservation::getCreatedTime)); Page res = PageUtil.copyPage(reservationPage); res.setRecords(reservationPage.getRecords().stream()