diff --git a/src/main/java/top/suyiiyii/sims/controller/RecordController.java b/src/main/java/top/suyiiyii/sims/controller/RecordController.java index 7c20a46..f7cd470 100644 --- a/src/main/java/top/suyiiyii/sims/controller/RecordController.java +++ b/src/main/java/top/suyiiyii/sims/controller/RecordController.java @@ -2,6 +2,8 @@ package top.suyiiyii.sims.controller; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpSession; import lombok.Data; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +19,7 @@ import top.suyiiyii.sims.service.CategoryService; import top.suyiiyii.sims.service.RecordService; import top.suyiiyii.sims.service.RoleService; import top.suyiiyii.sims.service.UserService; +import top.suyiiyii.sims.utils.JwtUtils; import java.util.ArrayList; import java.util.HashSet; @@ -98,6 +101,7 @@ RecordController { } + @AuthAccess(allowRoles = {"admin"}) @Operation(summary = "添加奖惩记录") @PostMapping("/admin/record") @@ -121,7 +125,6 @@ RecordController { @RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "10") int size, SearchRequest searchRequest) { - Integer s1; List studentIds = new ArrayList<>(); List records=new ArrayList<>(); @@ -169,16 +172,10 @@ RecordController { return Result.error("请选择正确奖惩类别"); } List idByCategoryName = categoryService.getIdByCategoryName(categoryName); - for (Integer i : idByCategoryName) { - List sid = recordService.getSidByCategoryId(i); - studentIds.addAll(sid); - } List records=new ArrayList<>(); - HashSet studentIds1= new HashSet<>(studentIds); - for (Integer Sid : studentIds1) { - if(Sid!=null){ - records.addAll(recordService.getRecordsById(page,size,Sid)); - } + for (Integer i : idByCategoryName) { + List recordsByCategoryId = recordService.getRecordsByCategoryId(page, size, i); + records.addAll(recordsByCategoryId); } List RecordDtos = new ArrayList<>(); for (Record record : records) { @@ -198,25 +195,20 @@ RecordController { @RequestParam(defaultValue = "10") int size, String categoryName,HttpServletRequest request) { int userId = JwtInterceptor.getUserIdFromReq(request); - List studentIds = new ArrayList<>(); //CategoryName不是奖励或者惩罚 if (!categoryName.equals("奖励") && !categoryName.equals("惩罚")) { return Result.error("请选择正确奖惩类别"); } + Integer studentId = userService.getStudentIdByUserId(userId); List idByCategoryName = categoryService.getIdByCategoryName(categoryName); - for (Integer i : idByCategoryName) { - List sid = recordService.getSidByCategoryId(i); - if(sid!=null) { - studentIds.addAll(sid); - } - } List records=new ArrayList<>(); - HashSet studentIds1= new HashSet<>(studentIds); - for (Integer Sid : studentIds1) { - Integer studentId1 =userService.getStudentIdByUserId(userId); - if (studentId1!= null && studentId1.equals(Sid)) { - records.addAll(recordService.getRecordsById(page, size, Sid)); + for (Integer i : idByCategoryName) { + List records1 = recordService.getRecordsByCategoryId(page, size, i); + for (Record record : records1) { + if (record.getStudentId()==studentId) { + records.add(record); + } } } List RecordDtos = new ArrayList<>(); diff --git a/src/main/java/top/suyiiyii/sims/controller/RevokedController.java b/src/main/java/top/suyiiyii/sims/controller/RevokedController.java index f13741f..a2bd0c9 100644 --- a/src/main/java/top/suyiiyii/sims/controller/RevokedController.java +++ b/src/main/java/top/suyiiyii/sims/controller/RevokedController.java @@ -1,13 +1,30 @@ package top.suyiiyii.sims.controller; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.responses.ApiResponses; +import jakarta.servlet.http.HttpServletRequest; +import lombok.Data; import lombok.extern.slf4j.Slf4j; +import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; +import top.suyiiyii.sims.common.AuthAccess; +import top.suyiiyii.sims.common.JwtInterceptor; +import top.suyiiyii.sims.common.Result; +import top.suyiiyii.sims.dto.CommonResponse; +import top.suyiiyii.sims.dto.RecordDto; +import top.suyiiyii.sims.dto.RevokeRequestDto; +import top.suyiiyii.sims.entity.RevokeRequest; +import top.suyiiyii.sims.exception.ServiceException; +import top.suyiiyii.sims.service.CategoryService; +import top.suyiiyii.sims.service.NotificationService; +import top.suyiiyii.sims.service.RecordService; import top.suyiiyii.sims.service.RevokedService; +import java.util.ArrayList; +import java.util.List; + /** * @Author tortoise * @Date 2024/9/6 10:03 @@ -22,9 +39,97 @@ import top.suyiiyii.sims.service.RevokedService; public class RevokedController { @Autowired RevokedService revokedService; + @Autowired + ModelMapper modelMapper; + @Autowired + NotificationService notificationService; + @Autowired + CategoryService categoryService; + @Autowired + RecordService recordService; + //TODO 普通成员向管理员申请撤销 + @AuthAccess(allowRoles = {"user"}) + @Operation(summary = "成员申请撤销") + @PostMapping("") + public Result revoked(@RequestBody Request request) { + if(request.getReason().isBlank()) { + throw new ServiceException("撤销原因不能为空"); + } + RevokeRequest revokeRequest = modelMapper.map(request, RevokeRequest.class); + + revokedService.addRevokeRequest(revokeRequest); + //发送通知给管理员 + notificationService.addNotification(revokeRequest); + return Result.success(CommonResponse.factory("申请成功")); + } //TODO 管理员查看所有撤销申请 - + @AuthAccess(allowRoles = {"admin"}) + @Operation(summary = "管理员查看所有撤销申请") + @GetMapping("") + public Result> revoked( + @RequestParam(defaultValue = "0") int page, + @RequestParam(defaultValue = "10") int size) { + List revokeRequests = revokedService.getAll(page, size); + List revokeRequestDtos = new ArrayList<>(); + for (RevokeRequest revokeRequest : revokeRequests) { + RevokeRequestDto revokeRequestDto = modelMapper.map(revokeRequest, RevokeRequestDto.class); + revokeRequestDto.setCategoryName(categoryService.getCategoryName(recordService.getCategoryIdById(revokeRequest.getRecordId()))); + revokeRequestDto.setSubCategoryName(categoryService.getsubCategoryName(recordService.getCategoryIdById(revokeRequest.getRecordId()))); + revokeRequestDtos.add(revokeRequestDto); + } + return Result.success(revokeRequestDtos); + } //TODO 管理员可以撤销某一成员的奖励或惩罚记录,需填写撤销原因,撤销备注 + + @AuthAccess(allowRoles = {"admin"}) + @Operation(summary = "管理员处理撤销申请",description = "status:批准/拒绝") + @PutMapping("/{id}") + public Result revoked(@PathVariable Integer id, RevokedRequest revokedRequest, HttpServletRequest request) { + String userId = String.valueOf(JwtInterceptor.getUserIdFromReq(request)); + if(revokedRequest.getAdminRemark().isBlank()) { + throw new ServiceException("撤销备注不能为空"); + } + if(!"批准".equals(revokedRequest.getStatus()) && !"拒绝".equals(revokedRequest.getStatus()) ) { + throw new ServiceException("状态不合法"); + } + + revokedService.updateRevokeRequest(id, + revokedRequest.getStatus(),revokedRequest.getAdminRemark(), + revokedRequest.getReason(),revokedRequest.getHandleTime()); + //TODO 要加到记录里面去 + if ("批准".equals(revokedRequest.getStatus())) { + revokedService.addRevokedRecord(id,userId,revokedRequest.getReason(),revokedRequest.getHandleTime()); + } + return Result.success(CommonResponse.factory("修改成功")); + } + @AuthAccess(allowRoles = {"admin"}) + @Operation(summary = "撤销单个奖惩记录") + @DeleteMapping("/admin/records/{id}") + public Result adminDeleteRecord(@PathVariable Integer id, String reason,String remark, HttpServletRequest request) { + Integer i = recordService.IsRecord(id); + String userId = String.valueOf(JwtInterceptor.getUserIdFromReq(request)); + if(i==null) { + throw new RuntimeException("该记录不存在"); + } + recordService.revokeUpdate(id,reason,remark,userId); + return Result.msg("撤销成功"); + } + + + @Data + public static class Request { + private Integer userId; + private Integer recordId; + private String reason; + private Long requestTime; + } + @Data + public static class RevokedRequest { + private String status; + private String adminRemark; + private String reason; + private Long handleTime; + } } diff --git a/src/main/java/top/suyiiyii/sims/dto/RevokeRequestDto.java b/src/main/java/top/suyiiyii/sims/dto/RevokeRequestDto.java new file mode 100644 index 0000000..d427298 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/dto/RevokeRequestDto.java @@ -0,0 +1,32 @@ +package top.suyiiyii.sims.dto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @Author tortoise + * @Date 2024/9/8 21:34 + * @PackageName:top.suyiiyii.sims.dto + * @ClassName: RevokeRequestDto + * @Description: TODO + * @Version 1.0 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RevokeRequestDto { + private Integer id; + private String categoryName; + private String subCategoryName; + private Integer userId; + private String reason; + private Long requestTime; + private String status; + //处理时间 + private Long handleTime; + private String adminRemark; + +} diff --git a/src/main/java/top/suyiiyii/sims/entity/Notification.java b/src/main/java/top/suyiiyii/sims/entity/Notification.java index c28cddb..b387bd5 100644 --- a/src/main/java/top/suyiiyii/sims/entity/Notification.java +++ b/src/main/java/top/suyiiyii/sims/entity/Notification.java @@ -27,7 +27,7 @@ public class Notification { private String title; private String content; private Integer senderId; - private LocalDateTime createdAt; + private Long createdAt; private String status; private String type; private Integer targetUserId; diff --git a/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java b/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java index 65218c9..b6505cc 100644 --- a/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java +++ b/src/main/java/top/suyiiyii/sims/entity/RevokeRequest.java @@ -27,10 +27,10 @@ public class RevokeRequest { private Integer recordId; private Integer userId; private String reason; - private LocalDateTime requestTime; + private Long requestTime; private String status; //处理时间 - private LocalDateTime handleTime; + private Long handleTime; private String adminRemark; } diff --git a/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java b/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java index 3918cd7..88f1037 100644 --- a/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java +++ b/src/main/java/top/suyiiyii/sims/entity/RevokedRecord.java @@ -31,7 +31,7 @@ public class RevokedRecord { // 撤销原因 private String reason; // 撤销时间 - private LocalDateTime revokedTime; + private Long revokedTime; } diff --git a/src/main/java/top/suyiiyii/sims/mapper/MpRevRecordMapper.java b/src/main/java/top/suyiiyii/sims/mapper/MpNotificationMapper.java similarity index 52% rename from src/main/java/top/suyiiyii/sims/mapper/MpRevRecordMapper.java rename to src/main/java/top/suyiiyii/sims/mapper/MpNotificationMapper.java index 9ca809f..a414820 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/MpRevRecordMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/MpNotificationMapper.java @@ -1,15 +1,15 @@ package top.suyiiyii.sims.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import top.suyiiyii.sims.entity.RevokedRecord; +import top.suyiiyii.sims.entity.Notification; /** * @Author tortoise - * @Date 2024/9/6 10:04 + * @Date 2024/9/8 20:50 * @PackageName:top.suyiiyii.sims.mapper - * @ClassName: MpRevRecordMapper + * @ClassName: MpNotificationMapper * @Description: TODO * @Version 1.0 */ -public interface MpRevRecordMapper extends BaseMapper { +public interface MpNotificationMapper extends BaseMapper { } diff --git a/src/main/java/top/suyiiyii/sims/mapper/MpRevRecord.java b/src/main/java/top/suyiiyii/sims/mapper/MpRevRecord.java new file mode 100644 index 0000000..58e924c --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/MpRevRecord.java @@ -0,0 +1,20 @@ +package top.suyiiyii.sims.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Update; +import top.suyiiyii.sims.entity.RevokeRequest; +import top.suyiiyii.sims.entity.RevokedRecord; + +/** + * @Author tortoise + * @Date 2024/9/9 10:08 + * @PackageName:top.suyiiyii.sims.mapper + * @ClassName: MpRevRecord + * @Description: TODO + * @Version 1.0 + */ +public interface MpRevRecord extends BaseMapper { + @Insert("INSERT INTO revoked_record (admin_id, reason, revoked_time, record_id) VALUES (#{userId}, #{reason}, #{handleTime}, #{id})") + void addRevokedRecord(Integer id, String userId, String reason, Long handleTime); +} diff --git a/src/main/java/top/suyiiyii/sims/mapper/MpRevRequestMapper.java b/src/main/java/top/suyiiyii/sims/mapper/MpRevRequestMapper.java new file mode 100644 index 0000000..01b56b0 --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/mapper/MpRevRequestMapper.java @@ -0,0 +1,26 @@ +package top.suyiiyii.sims.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import top.suyiiyii.sims.entity.RevokeRequest; + +import java.util.List; + +/** + * @Author tortoise + * @Date 2024/9/6 10:04 + * @PackageName:top.suyiiyii.sims.mapper + * @ClassName: MpRevRequestMapper + * @Description: TODO + * @Version 1.0 + */ + +public interface MpRevRequestMapper extends BaseMapper { + @Select("select * from revoke_request limit #{page},#{size}") + List selectList(int page, int size); +@Update("update revoke_request set status=#{status},admin_remark=#{adminRemark} where id=#{id}") + void update(Integer id, String status, String adminRemark); +@Update("update revoke_request set status=#{status},admin_remark=#{adminRemark},reason=#{reason},handle_time=#{handleTime} where id=#{id}") + void update(Integer id, String status, String adminRemark, String reason, Long handleTime); +} diff --git a/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java b/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java index a35517c..0f3721e 100644 --- a/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java +++ b/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java @@ -81,4 +81,12 @@ public interface RecordMapper { List getRecordsById(int page, int size, Integer sid); @Select("SELECT id FROM record WHERE id = #{id}") Integer IsRecord(Integer id); +@Select("SELECT category_id FROM record WHERE id = #{id}") + Integer getCategoryIdById(Integer id); +@Update("UPDATE record SET is_revoked=#{isRevoked},operator_user_id=#{userId},revoke_remark = #{adminRemark}, revoke_reason = #{reason}, lsat_update_time = #{handleTime} WHERE id = #{id}") + void update(Integer id ,Boolean isRevoked,String userId, String adminRemark, String reason, Long handleTime); +@Update("UPDATE record SET is_revoked=#{isRevoked},operator_user_id=#{userId},revoke_remark = #{remark}, revoke_reason = #{reason} WHERE id = #{id}") + void Rupdate(Integer id,Boolean isRevoked,String reason,String remark , String userId); +@Select("SELECT * FROM record WHERE category_id = #{i} LIMIT #{page},#{size}") + List getRecordsByCategoryId(int page, int size, Integer i); } diff --git a/src/main/java/top/suyiiyii/sims/service/NotificationService.java b/src/main/java/top/suyiiyii/sims/service/NotificationService.java new file mode 100644 index 0000000..e80b7bb --- /dev/null +++ b/src/main/java/top/suyiiyii/sims/service/NotificationService.java @@ -0,0 +1,33 @@ +package top.suyiiyii.sims.service; + +import org.checkerframework.checker.units.qual.A; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import top.suyiiyii.sims.entity.Notification; +import top.suyiiyii.sims.entity.RevokeRequest; +import top.suyiiyii.sims.mapper.MpNotificationMapper; + +/** + * @Author tortoise + * @Date 2024/9/8 20:50 + * @PackageName:top.suyiiyii.sims.service + * @ClassName: NotificationService + * @Description: TODO + * @Version 1.0 + */ +@Service +public class NotificationService { + @Autowired + MpNotificationMapper mpNotificationMapper; + public void addNotification(RevokeRequest revokeRequest) { + Notification notification = new Notification(); + notification.setSenderId(revokeRequest.getUserId()); + notification.setTitle("申请撤销"); + notification.setContent(revokeRequest.getReason()); + notification.setType("申请"); + notification.setCreatedAt(revokeRequest.getRequestTime()); + notification.setStatus("未处理"); + notification.setTargetUserId(-1); + mpNotificationMapper.insert(notification); + } +} diff --git a/src/main/java/top/suyiiyii/sims/service/RecordService.java b/src/main/java/top/suyiiyii/sims/service/RecordService.java index a364583..d77d27d 100644 --- a/src/main/java/top/suyiiyii/sims/service/RecordService.java +++ b/src/main/java/top/suyiiyii/sims/service/RecordService.java @@ -4,6 +4,7 @@ package top.suyiiyii.sims.service; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + import top.suyiiyii.sims.dto.RecordDto; import top.suyiiyii.sims.entity.Record; import top.suyiiyii.sims.entity.RewardPunishmentCategory; @@ -63,7 +64,7 @@ public class RecordService { //查看数据库里面是否有这个类别 String subCategoryName = categoryMapper.IsSubCategoryName(recordDto.getSubCategoryName()); - if (subCategoryName == null) { + if(subCategoryName == null) { //没有这个类别就加上 categoryMapper.addsubcategory(recordDto.getCategoryName(), recordDto.getSubCategoryName()); } @@ -75,11 +76,12 @@ public class RecordService { } public List getRecordsLike(int page, int size, Integer studentId, String userGroup, String grade) { - return recordMapper.getRecordsLike(page, size, studentId, userGroup, grade); + return recordMapper.getRecordsLike(page, size, studentId, userGroup,grade); } - public List getSidByCategoryId(Integer i) { + + public List getSidByCategoryId(Integer i) { return recordMapper.getSidByCategoryId(i); } @@ -106,4 +108,22 @@ public class RecordService { List availableCatIds = catIds.stream().filter(c -> (catMap.containsKey(c) && (catMap.get(c).getStatus() == null || catMap.get(c).getStatus().equals("enable")))).toList(); return recordDtos.stream().filter(r -> availableCatIds.contains(r.getCategoryId())).toList(); } + + public void update(Integer id, String userId, String adminRemark, String reason, Long handleTime) { + Boolean isRevoked=true; + recordMapper.update(id, isRevoked,userId, adminRemark, reason, handleTime); + } + + public void revokeUpdate(Integer id, String reason,String remark,String userId) { + Boolean isRevoked=true; + recordMapper.Rupdate(id, isRevoked,reason,remark,userId); + } + + public Integer getCategoryIdById(Integer id) { + return recordMapper.getCategoryIdById(id); + } + + public List getRecordsByCategoryId(int page, int size, Integer i) { + return recordMapper.getRecordsByCategoryId(page, size, i); + } } diff --git a/src/main/java/top/suyiiyii/sims/service/RevokedService.java b/src/main/java/top/suyiiyii/sims/service/RevokedService.java index 7ff5a4c..295cfcb 100644 --- a/src/main/java/top/suyiiyii/sims/service/RevokedService.java +++ b/src/main/java/top/suyiiyii/sims/service/RevokedService.java @@ -2,8 +2,14 @@ package top.suyiiyii.sims.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import top.suyiiyii.sims.mapper.MpRevRecordMapper; -import top.suyiiyii.sims.mapper.RoleMapper; +import top.suyiiyii.sims.controller.RevokedController; +import top.suyiiyii.sims.entity.RevokeRequest; +import top.suyiiyii.sims.mapper.MpRevRecord; +import top.suyiiyii.sims.mapper.MpRevRequestMapper; + +import java.util.List; + + /** * @Author tortoise @@ -15,6 +21,27 @@ import top.suyiiyii.sims.mapper.RoleMapper; */ @Service public class RevokedService { + @Autowired - MpRevRecordMapper mpRevRecordMapper; + MpRevRequestMapper mpRevRequestMapper; + @Autowired + MpRevRecord mpRevRecord; + public void addRevokeRequest(RevokeRequest revokeRequest) { + revokeRequest.setStatus("待审核"); + mpRevRequestMapper.insert(revokeRequest); + + } + public List getAll(int page, int size){ + return mpRevRequestMapper.selectList(page,size); + } + + + public void updateRevokeRequest(Integer id, String status, String adminRemark, String reason, Long handleTime) { + + mpRevRequestMapper.update(id, status, adminRemark, reason, handleTime); + } + + public void addRevokedRecord(Integer id, String userId, String reason, Long handleTime) { + mpRevRecord.addRevokedRecord(id, userId, reason, handleTime); + } }