From 199d4010e50cb239ef34d61c97d84fb656a58b44 Mon Sep 17 00:00:00 2001
From: tortoise <2891138827@qq.com>
Date: Mon, 9 Sep 2024 11:25:16 +0800
Subject: [PATCH] cherry

---
 .../sims/controller/RecordController.java     |   3 +
 .../sims/controller/RevokedController.java    | 112 +++++++++++++++++-
 .../top/suyiiyii/sims/mapper/MpRevRecord.java |  17 +++
 .../suyiiyii/sims/mapper/RecordMapper.java    |   6 +
 .../suyiiyii/sims/service/RecordService.java  |  11 ++
 .../suyiiyii/sims/service/RevokedService.java |  29 ++++-
 6 files changed, 176 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/top/suyiiyii/sims/mapper/MpRevRecord.java

diff --git a/src/main/java/top/suyiiyii/sims/controller/RecordController.java b/src/main/java/top/suyiiyii/sims/controller/RecordController.java
index 7c20a46..36e0a70 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;
diff --git a/src/main/java/top/suyiiyii/sims/controller/RevokedController.java b/src/main/java/top/suyiiyii/sims/controller/RevokedController.java
index f13741f..7244f4f 100644
--- a/src/main/java/top/suyiiyii/sims/controller/RevokedController.java
+++ b/src/main/java/top/suyiiyii/sims/controller/RevokedController.java
@@ -1,13 +1,32 @@
 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.*;
+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 org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import top.suyiiyii.sims.service.RevokedService;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @Author tortoise
  * @Date 2024/9/6 10:03
@@ -22,9 +41,100 @@ 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<CommonResponse> 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<List<RevokeRequestDto>> revoked(
+            @RequestParam(defaultValue = "0") int page,
+            @RequestParam(defaultValue = "10") int size) {
+        List<RevokeRequest> revokeRequests = revokedService.getAll(page, size);
+        List<RevokeRequestDto> 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 = "管理员处理撤销申请")
+    @PutMapping("/{id}")
+    public Result<CommonResponse> 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("状态不合法");
+        }
+/*        if("批准".equals(revokedRequest.getStatus())){
+            recordService.update(id,userId,revokedRequest.getStatus(),revokedRequest.getAdminRemark(),
+                    revokedRequest.getReason(),revokedRequest.getHandleTime());
+        }*/
+
+        revokedService.updateRevokeRequest(id,
+                revokedRequest.getStatus(),revokedRequest.getAdminRemark(),
+                revokedRequest.getReason(),revokedRequest.getHandleTime());
+            //TODO 要加到记录里面去
+            revokedService.addRevokedRecord(id,userId,revokedRequest.getReason(),revokedRequest.getHandleTime());
+
+        return Result.success(CommonResponse.factory("申请成功"));
+    }
+    @AuthAccess(allowRoles = {"admin"})
+    @Operation(summary = "撤销单个奖惩记录")
+    @DeleteMapping("/admin/records/{id}")
+    public Result<CommonResponse> adminDeleteRecord(@PathVariable Integer id, String reason, HttpServletRequest request) {
+        Integer i = recordService.IsRecord(id);
+        String userId = String.valueOf(JwtInterceptor.getUserIdFromReq(request));
+        if(i==null) {
+            throw new RuntimeException("该记录不存在");
+        }
+        recordService.revokeUpdate(id,reason,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/mapper/MpRevRecord.java b/src/main/java/top/suyiiyii/sims/mapper/MpRevRecord.java
new file mode 100644
index 0000000..9cffa50
--- /dev/null
+++ b/src/main/java/top/suyiiyii/sims/mapper/MpRevRecord.java
@@ -0,0 +1,17 @@
+package top.suyiiyii.sims.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+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<RevokedRecord> {
+    void addRevokedRecord(Integer id, String userId, 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..5c56ab4 100644
--- a/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java
+++ b/src/main/java/top/suyiiyii/sims/mapper/RecordMapper.java
@@ -81,4 +81,10 @@ public interface RecordMapper {
     List<Record> 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 = #{reason}, revoke_reason = #{revokeReason} WHERE id = #{id}")
+    void Rupdate(Integer id, String reason, Boolean isRevoked,String revokeReason, String userId);
 }
diff --git a/src/main/java/top/suyiiyii/sims/service/RecordService.java b/src/main/java/top/suyiiyii/sims/service/RecordService.java
index a364583..fcb2cd2 100644
--- a/src/main/java/top/suyiiyii/sims/service/RecordService.java
+++ b/src/main/java/top/suyiiyii/sims/service/RecordService.java
@@ -106,4 +106,15 @@ public class RecordService {
         List<Integer> 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 userId) {
+        String revokeReason="申请撤销";
+        Boolean isRevoked=true;
+        recordMapper.Rupdate(id, reason,isRevoked,revokeReason,userId);
+    }
 }
diff --git a/src/main/java/top/suyiiyii/sims/service/RevokedService.java b/src/main/java/top/suyiiyii/sims/service/RevokedService.java
index 7ff5a4c..9dd6340 100644
--- a/src/main/java/top/suyiiyii/sims/service/RevokedService.java
+++ b/src/main/java/top/suyiiyii/sims/service/RevokedService.java
@@ -2,6 +2,12 @@ package top.suyiiyii.sims.service;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+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;
 import top.suyiiyii.sims.mapper.MpRevRecordMapper;
 import top.suyiiyii.sims.mapper.RoleMapper;
 
@@ -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<RevokeRequest> 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);
+    }
 }