瀏覽代碼

管理员复核校验

yin 9 月之前
父節點
當前提交
a2c60d1351

+ 0 - 109
src/main/java/cn/com/qmth/scancentral/controller/admin/AssignedCheckController.java

@@ -1,109 +0,0 @@
-package cn.com.qmth.scancentral.controller.admin;
-
-import cn.com.qmth.scancentral.bean.AssignedQueryDomain;
-import cn.com.qmth.scancentral.bean.User;
-import cn.com.qmth.scancentral.controller.BaseController;
-import cn.com.qmth.scancentral.service.StudentService;
-import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
-import cn.com.qmth.scancentral.vo.assginedcheck.AssginedTaskResult;
-import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExport;
-import cn.com.qmth.scancentral.vo.assginedcheck.AssignedTaskSaveVo;
-import cn.com.qmth.scancentral.vo.task.TaskStatusVo;
-import com.qmth.boot.api.annotation.Aac;
-import com.qmth.boot.api.constant.ApiConstant;
-import com.qmth.boot.core.collection.PageResult;
-import com.qmth.boot.tools.excel.ExcelWriter;
-import com.qmth.boot.tools.excel.enums.ExcelType;
-import com.qmth.boot.tools.iterator.PageListIterator;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.net.URLEncoder;
-import java.util.Collection;
-import java.util.List;
-
-@RestController
-@Api(tags = "人工绑定校验接口")
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/admin/assigned/check")
-@Aac(strict = false, auth = true)
-public class AssignedCheckController extends BaseController {
-
-    @Autowired
-    private StudentService studentService;
-
-    @ApiOperation(value = "列表")
-    @RequestMapping(value = "/list", method = RequestMethod.POST)
-    public PageResult<AnswerQueryVo> list(@Validated AssignedQueryDomain query) {
-        if (query.getAssignedCheckCount() == null || query.getAssignedCheckCount() <= 1) {
-            query.setAssignedCheckCount(1);
-        }
-        query.setAssigned(true);
-        return studentService.queryAssignedCheckPage(query);
-    }
-
-    @ApiOperation(value = "导出")
-    @RequestMapping(value = "/export", method = RequestMethod.POST)
-    public void export(@Validated AssignedQueryDomain query, HttpServletResponse response) throws IOException {
-        AssignedQueryDomain query1 = new AssignedQueryDomain();
-        query1.setExamId(query.getExamId());
-        query1.setAssigned(true);
-        query1.setAssignedSuspect(true);
-        String fileName = URLEncoder.encode("人工绑定", "UTF-8");
-        response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".xlsx");
-        response.setContentType("application/vnd.ms-excel");
-        User user = getAccessUser();
-        ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
-        PageListIterator<AssignedCheckExport> iterator = new PageListIterator<AssignedCheckExport>(100) {
-
-            @Override
-            public Collection<AssignedCheckExport> getPageList(int pageNumber, int pageSize) {
-                query1.setPageNumber(pageNumber);
-                query1.setPageSize(pageSize);
-                return studentService.exportAssignedCheckPage(query1);
-            }
-        };
-        writer.writeObjects("用户", null, AssignedCheckExport.class, iterator);
-        writer.output(response.getOutputStream());
-    }
-
-    @ApiOperation(value = "审核员任务获取")
-    @RequestMapping(value = "task/get", method = RequestMethod.POST)
-    public AnswerQueryVo get(@RequestParam Long examId) {
-        User user = getAccessUser();
-        return studentService.getAssignedCheckTask(examId, user.getAccount());
-    }
-
-    @ApiOperation(value = "审核员任务历史")
-    @RequestMapping(value = "task/history", method = RequestMethod.POST)
-    public List<AnswerQueryVo> history(@RequestParam Long id, @RequestParam Long pageSize) {
-        User user = getAccessUser();
-        return studentService.getAssignedCheckTaskHistory(id, pageSize, user);
-    }
-
-    @ApiOperation(value = "审核员任务提交")
-    @RequestMapping(value = "task/save", method = RequestMethod.POST)
-    public AssignedTaskSaveVo submit(@Validated @RequestBody AssginedTaskResult result) {
-        User user = getAccessUser();
-        return studentService.submitAssignedCheckTask(result, user);
-    }
-
-    @ApiOperation(value = "答题卡扫描图片检查任务状态")
-    @PostMapping("task/status")
-    public TaskStatusVo status(@RequestParam Long examId) {
-        User user = getAccessUser();
-        return studentService.getAssignedCheckTaskStatus(examId, user);
-    }
-
-    @ApiOperation(value = "审核员任务释放")
-    @PostMapping("task/release")
-    public Object release(@RequestParam Long examId) {
-        User user = getAccessUser();
-        studentService.releaseAssignedCheckTaskByUser(examId, user.getAccount());
-        return success(true);
-    }
-}

+ 2 - 2
src/main/java/cn/com/qmth/scancentral/controller/admin/AuditorController.java

@@ -18,7 +18,7 @@ import io.swagger.annotations.ApiOperation;
 
 @RestController
 @Api(tags = "审核员管理接口")
-@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/auditor/admin")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/auditor")
 @Aac(strict = false, auth = true)
 public class AuditorController extends BaseController {
 
@@ -26,7 +26,7 @@ public class AuditorController extends BaseController {
     private ExamService examService;
 
     @ApiOperation(value = "考试概览数据")
-    @RequestMapping(value = "/overview", method = RequestMethod.POST)
+    @RequestMapping(value = "/exam/overview", method = RequestMethod.POST)
     public AuditorOverview overview(@RequestParam Long examId) {
         User user = getAccessUser();
         return examService.getAuditorOverview(examId, user);

+ 174 - 0
src/main/java/cn/com/qmth/scancentral/controller/admin/CheckAssignedController.java

@@ -0,0 +1,174 @@
+package cn.com.qmth.scancentral.controller.admin;
+
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.core.task.AsyncTaskExecutor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.constant.ApiConstant;
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
+import com.qmth.boot.core.exception.ReentrantException;
+import com.qmth.boot.tools.excel.ExcelWriter;
+import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.boot.tools.iterator.PageListIterator;
+
+import cn.com.qmth.scancentral.bean.AssignedQueryDomain;
+import cn.com.qmth.scancentral.bean.User;
+import cn.com.qmth.scancentral.controller.BaseController;
+import cn.com.qmth.scancentral.entity.ExamEntity;
+import cn.com.qmth.scancentral.enums.GroupType;
+import cn.com.qmth.scancentral.enums.LockType;
+import cn.com.qmth.scancentral.exception.ParameterExceptions;
+import cn.com.qmth.scancentral.service.ExamService;
+import cn.com.qmth.scancentral.service.StudentService;
+import cn.com.qmth.scancentral.task.thread.CheckAssignedResetThread;
+import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
+import cn.com.qmth.scancentral.vo.assginedcheck.AssginedTaskResult;
+import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExamRoomExport;
+import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExport;
+import cn.com.qmth.scancentral.vo.assginedcheck.AssignedTaskSaveVo;
+import cn.com.qmth.scancentral.vo.task.TaskStatusVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import net.sf.json.JSONObject;
+
+@RestController
+@Api(tags = "人工绑定校验接口")
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/admin/check/assigned")
+@Aac(strict = false, auth = true)
+public class CheckAssignedController extends BaseController {
+
+    @Autowired
+    private StudentService studentService;
+
+     @Resource
+     private ConcurrentService concurrentService;
+
+     @Autowired
+     private ExamService examService;
+
+     @Autowired
+     private AsyncTaskExecutor taskExecutor;
+
+//    @ApiOperation(value = "列表")
+//    @RequestMapping(value = "/list", method = RequestMethod.POST)
+//    public PageResult<AnswerQueryVo> list(@Validated AssignedQueryDomain query) {
+//        if (query.getAssignedCheckCount() == null || query.getAssignedCheckCount() <= 1) {
+//            query.setAssignedCheckCount(1);
+//        }
+//        query.setAssigned(true);
+//        return studentService.queryAssignedCheckPage(query);
+//    }
+
+    @ApiOperation(value = "导出")
+    @RequestMapping(value = "/export", method = RequestMethod.POST)
+    public void export(@RequestParam Long examId, @RequestParam String subjectCode, @RequestParam GroupType type, HttpServletResponse response) throws IOException {
+        String fileName = URLEncoder.encode("复核校验", "UTF-8");
+        response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".xlsx");
+        response.setContentType("application/vnd.ms-excel");
+        ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
+        if(GroupType.STUDENT_CODE.equals(type)){
+            AssignedQueryDomain query1 = new AssignedQueryDomain();
+            query1.setExamId(examId);
+            query1.setSubjectCode(subjectCode);
+            query1.setAssigned(true);
+            query1.setAssignedSuspect(true);
+            PageListIterator<AssignedCheckExport> iterator = new PageListIterator<AssignedCheckExport>(100) {
+                @Override
+                public Collection<AssignedCheckExport> getPageList(int pageNumber, int pageSize) {
+                    query1.setPageNumber(pageNumber);
+                    query1.setPageSize(pageSize);
+                    return studentService.exportAssignedCheckPage(query1);
+                }
+            };
+            writer.writeObjects("复核校验", null, AssignedCheckExport.class, iterator);
+
+        }else if(GroupType.EXAM_ROOM.equals(type)){
+            List<AssignedCheckExamRoomExport> list = studentService.exportAssignedCheck(examId,subjectCode);
+            writer.writeObjects("复核校验", null, AssignedCheckExamRoomExport.class, list.iterator());
+        }
+        writer.output(response.getOutputStream());
+    }
+
+    @ApiOperation(value = "审核员任务获取")
+    @RequestMapping(value = "task/get", method = RequestMethod.POST)
+    public AnswerQueryVo get(@RequestParam Long examId) {
+        User user = getAccessUser();
+        return studentService.getAssignedCheckTask(examId, user.getAccount());
+    }
+
+    @ApiOperation(value = "审核员任务历史")
+    @RequestMapping(value = "task/history", method = RequestMethod.POST)
+    public List<AnswerQueryVo> history(@RequestParam Long id, @RequestParam Long pageSize) {
+        User user = getAccessUser();
+        return studentService.getAssignedCheckTaskHistory(id, pageSize, user);
+    }
+
+    @ApiOperation(value = "审核员任务提交")
+    @RequestMapping(value = "task/save", method = RequestMethod.POST)
+    public AssignedTaskSaveVo submit(@Validated @RequestBody AssginedTaskResult result) {
+        User user = getAccessUser();
+        return studentService.submitAssignedCheckTask(result, user);
+    }
+
+    @ApiOperation(value = "答题卡扫描图片检查任务状态")
+    @PostMapping("task/status")
+    public TaskStatusVo status(@RequestParam Long examId) {
+        User user = getAccessUser();
+        return studentService.getAssignedCheckTaskStatus(examId, user);
+    }
+
+    @ApiOperation(value = "审核员任务释放")
+    @PostMapping("task/release")
+    public Object release(@RequestParam Long examId) {
+        User user = getAccessUser();
+        studentService.releaseAssignedCheckTaskByUser(examId, user.getAccount());
+        return success(true);
+    }
+
+     @ApiOperation(value = "重新生成")
+     @RequestMapping(value = "/reset", method = RequestMethod.POST)
+     public JSONObject reset(@RequestParam Long examId, @RequestParam String subjectCode) {
+     User user = getAccessUser();
+     ExamEntity exam = examService.getById(examId);
+     if (exam == null) {
+     throw ParameterExceptions.EXAM_NOT_FOUND;
+     }
+
+     if (!concurrentService.isLocked(LockType.CHECK_ASSIGNED_RESET + "-" + examId)) {
+     taskExecutor.submit(new CheckAssignedResetThread(examId, subjectCode,
+     studentService, concurrentService));
+     } else {
+     throw new ReentrantException("正在重置,请稍后再试");
+     }
+     JSONObject result = new JSONObject();
+     result.put("updateTime", System.currentTimeMillis());
+     result.put("synching", true);
+     return result;
+     }
+
+     @ApiOperation(value = "重新生成状态")
+     @RequestMapping(value = "/reset/status", method = RequestMethod.POST)
+     public Map<String, Object> resetStatus(@RequestParam Long examId, @RequestParam String subjectCode) {
+     User user = getAccessUser();
+     ExamEntity exam = examService.getById(examId);
+     if (exam == null) {
+     throw ParameterExceptions.EXAM_NOT_FOUND;
+     }
+     Map<String, Object> result = new HashMap<String, Object>();
+     result.put("synching",
+     concurrentService.isLocked(LockType.CHECK_ASSIGNED_RESET + "-" + examId));
+     return result;
+     }
+}

+ 10 - 6
src/main/java/cn/com/qmth/scancentral/dao/StudentDao.java

@@ -1,11 +1,20 @@
 package cn.com.qmth.scancentral.dao;
 
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
 import cn.com.qmth.scancentral.bean.AbsentQueryDomain;
 import cn.com.qmth.scancentral.bean.AnswerQueryDomain;
 import cn.com.qmth.scancentral.bean.AssignedQueryDomain;
 import cn.com.qmth.scancentral.entity.StudentEntity;
 import cn.com.qmth.scancentral.vo.*;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
+import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExamRoomExport;
 import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExport;
 import cn.com.qmth.scancentral.vo.examroom.ExamRoomScannedQuery;
 import cn.com.qmth.scancentral.vo.examroom.ExamRoomScannedVo;
@@ -18,12 +27,6 @@ import cn.com.qmth.scancentral.vo.student.StudentPageVo;
 import cn.com.qmth.scancentral.vo.student.StudentVo;
 import cn.com.qmth.scancentral.vo.studentimport.StudentCountVo;
 import cn.com.qmth.scancentral.vo.subject.SubjectScanProgressVo;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
 
 public interface StudentDao extends BaseMapper<StudentEntity> {
 
@@ -100,4 +103,5 @@ public interface StudentDao extends BaseMapper<StudentEntity> {
 
     IPage<ImageCheckDetailVo> queryImageCheckDetail(Page<ImageCheckDetailVo> page, @Param("query") ImageCheckQuery query);
 
+    List<AssignedCheckExamRoomExport> exportAssignedCheck(@Param("examId")Long examId, @Param("subjectCode")String subjectCode);
 }

+ 5 - 2
src/main/java/cn/com/qmth/scancentral/entity/AssignedCheckHistoryEntity.java

@@ -1,14 +1,17 @@
 package cn.com.qmth.scancentral.entity;
 
-import cn.com.qmth.scancentral.entity.base.AuditingEntity;
+import java.io.Serializable;
+
 import com.baomidou.mybatisplus.annotation.TableName;
 
-import java.io.Serializable;
+import cn.com.qmth.scancentral.entity.base.AuditingEntity;
 
 // 人工确认记录
 @TableName("sc_assigned_check_history")
 public class AssignedCheckHistoryEntity extends AuditingEntity implements Serializable {
 
+    private static final long serialVersionUID = -8031686838334944827L;
+
     private Long studentId;
 
     private Long userId;

+ 1 - 1
src/main/java/cn/com/qmth/scancentral/enums/LockType.java

@@ -8,7 +8,7 @@ public enum LockType {
                             "student_answer_group_delete"), STUDENT_ANSWER_GROUP_RESET(
                                     "student_answer_group_reset"), STUDENT_ANSWER_GROUP_BUILD(
                                             "student_answer_group_build"), USER(
-                                                    "user"), EXAM_STATUS_RESET("exam_status_reset"),;
+                                                    "user"), EXAM_STATUS_RESET("exam_status_reset"), CHECK_ASSIGNED_RESET("check_assigned_reset");
 
     private String name;
 

+ 14 - 8
src/main/java/cn/com/qmth/scancentral/service/StudentService.java

@@ -1,5 +1,15 @@
 package cn.com.qmth.scancentral.service;
 
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
+
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.boot.core.collection.PageResult;
+
 import cn.com.qmth.scancentral.bean.*;
 import cn.com.qmth.scancentral.bean.omredit.OmrEditDomain;
 import cn.com.qmth.scancentral.bean.omredit.OmrFieldEditDomain;
@@ -10,6 +20,7 @@ import cn.com.qmth.scancentral.enums.*;
 import cn.com.qmth.scancentral.vo.*;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
 import cn.com.qmth.scancentral.vo.assginedcheck.AssginedTaskResult;
+import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExamRoomExport;
 import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExport;
 import cn.com.qmth.scancentral.vo.assginedcheck.AssignedTaskSaveVo;
 import cn.com.qmth.scancentral.vo.examroom.ExamRoomScannedQuery;
@@ -18,14 +29,6 @@ import cn.com.qmth.scancentral.vo.student.*;
 import cn.com.qmth.scancentral.vo.studentimport.StudentCountVo;
 import cn.com.qmth.scancentral.vo.subject.SubjectScanProgressVo;
 import cn.com.qmth.scancentral.vo.task.TaskStatusVo;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.boot.core.collection.PageResult;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collection;
-import java.util.List;
 
 public interface StudentService extends IService<StudentEntity> {
 
@@ -189,4 +192,7 @@ public interface StudentService extends IService<StudentEntity> {
 
     List<StudentCountVo> countStudent(Long examId);
 
+    List<AssignedCheckExamRoomExport> exportAssignedCheck(Long examId, String subjectCode);
+
+    void resetAssignedCheck(Long examId, String subjectCode);
 }

+ 67 - 38
src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java

@@ -1,5 +1,42 @@
 package cn.com.qmth.scancentral.service.impl;
 
+import java.io.*;
+import java.math.BigDecimal;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import javax.validation.constraints.NotNull;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.gson.Gson;
+import com.qmth.boot.core.collection.PageResult;
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
+import com.qmth.boot.core.exception.ParameterException;
+import com.qmth.boot.core.exception.StatusException;
+import com.qmth.boot.core.retrofit.utils.SignatureInfo;
+import com.qmth.boot.tools.excel.ExcelReader;
+import com.qmth.boot.tools.excel.enums.ExcelType;
+import com.qmth.boot.tools.signature.SignatureType;
+import com.qmth.boot.tools.uuid.FastUUID;
+
 import cn.com.qmth.scancentral.bean.*;
 import cn.com.qmth.scancentral.bean.answersave.ArrayResult;
 import cn.com.qmth.scancentral.bean.answersave.BoolResult;
@@ -29,10 +66,7 @@ import cn.com.qmth.scancentral.vo.answerquery.AnswerPageVo;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerPaperVo;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
 import cn.com.qmth.scancentral.vo.answerquery.StudentPaperVo;
-import cn.com.qmth.scancentral.vo.assginedcheck.AssginedTaskResult;
-import cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExport;
-import cn.com.qmth.scancentral.vo.assginedcheck.AssignedTaskResultPaper;
-import cn.com.qmth.scancentral.vo.assginedcheck.AssignedTaskSaveVo;
+import cn.com.qmth.scancentral.vo.assginedcheck.*;
 import cn.com.qmth.scancentral.vo.examroom.ExamRoomScannedQuery;
 import cn.com.qmth.scancentral.vo.examroom.ExamRoomScannedVo;
 import cn.com.qmth.scancentral.vo.paper.PaperCetVo;
@@ -41,40 +75,6 @@ import cn.com.qmth.scancentral.vo.student.*;
 import cn.com.qmth.scancentral.vo.studentimport.StudentCountVo;
 import cn.com.qmth.scancentral.vo.subject.SubjectScanProgressVo;
 import cn.com.qmth.scancentral.vo.task.TaskStatusVo;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.google.gson.Gson;
-import com.qmth.boot.core.collection.PageResult;
-import com.qmth.boot.core.concurrent.service.ConcurrentService;
-import com.qmth.boot.core.exception.ParameterException;
-import com.qmth.boot.core.exception.StatusException;
-import com.qmth.boot.core.retrofit.utils.SignatureInfo;
-import com.qmth.boot.tools.excel.ExcelReader;
-import com.qmth.boot.tools.excel.enums.ExcelType;
-import com.qmth.boot.tools.signature.SignatureType;
-import com.qmth.boot.tools.uuid.FastUUID;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.io.FileUtils;
-import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.multipart.MultipartFile;
-
-import javax.validation.constraints.NotNull;
-import java.io.*;
-import java.math.BigDecimal;
-import java.util.*;
-import java.util.stream.Collectors;
 
 @Service
 public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> implements StudentService {
@@ -2583,4 +2583,33 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         return baseMapper.countStudent(examId);
     }
 
+    @Override
+    public List<AssignedCheckExamRoomExport> exportAssignedCheck(Long examId, String subjectCode) {
+        return baseMapper.exportAssignedCheck(examId,subjectCode);
+    }
+
+    @Override
+    public void resetAssignedCheck(Long examId, String subjectCode) {
+        QueryWrapper<StudentEntity> wrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<StudentEntity> lw = wrapper.lambda();
+        lw.eq(StudentEntity::getExamId, examId);
+        lw.eq(StudentEntity::getSubjectCode, subjectCode);
+        lw.eq(StudentEntity::getAssigned, true);
+        lw.eq(StudentEntity::getAssignedSuspect, true);
+        lw.gt(StudentEntity::getAssignedCheckCount, 1);
+        List<StudentEntity> list = this.list(wrapper);
+        for (StudentEntity student : list) {
+            concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().lock();
+            try {
+                student.setAbsentSuspect(false);
+                student.setAssignedCheckCount(1);
+                saveOrUpdate(student);
+//                assignedCheckHistoryService.deleteByStudentId(student.getId(),Role.AUDITOR);
+            } finally {
+                concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
+            }
+        }
+        examService.updateExamNumberFillCount(examId, examNumberFillCount);
+    }
+
 }

+ 52 - 0
src/main/java/cn/com/qmth/scancentral/task/thread/CheckAssignedResetThread.java

@@ -0,0 +1,52 @@
+package cn.com.qmth.scancentral.task.thread;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.qmth.boot.core.concurrent.service.ConcurrentService;
+import com.qmth.boot.core.exception.StatusException;
+
+import cn.com.qmth.scancentral.enums.LockType;
+import cn.com.qmth.scancentral.service.StudentService;
+
+public class CheckAssignedResetThread implements Runnable {
+
+    protected static Logger log = LoggerFactory.getLogger(CheckAssignedResetThread.class);
+
+    private String subjectCode;
+
+    private Long examId;
+
+    private StudentService studentService;
+
+    private ConcurrentService concurrentService;
+
+    public CheckAssignedResetThread(Long examId, String subjectCode, StudentService studentService,
+                                    ConcurrentService concurrentService) {
+        this.examId = examId;
+        this.subjectCode = subjectCode;
+        this.studentService = studentService;
+        this.concurrentService = concurrentService;
+    }
+
+    @Override
+    public void run() {
+        if (examId == null) {
+            return;
+        }
+        if (subjectCode == null) {
+            return;
+        }
+        try {
+            if (concurrentService.getLock(LockType.CHECK_ASSIGNED_RESET + "-" + examId).tryLock()) {
+                studentService.resetAssignedCheck(examId, subjectCode);
+            }
+        } catch (Exception e) {
+            log.error("exam status reset error", e);
+            throw new StatusException("缺考校验重新生成失败");
+        } finally {
+            concurrentService.getLock(LockType.CHECK_ASSIGNED_RESET + "-" + examId).unlock();
+        }
+    }
+
+}

+ 64 - 0
src/main/java/cn/com/qmth/scancentral/vo/assginedcheck/AssignedCheckExamRoomExport.java

@@ -0,0 +1,64 @@
+package cn.com.qmth.scancentral.vo.assginedcheck;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+
+/**
+ * @author tin.yin
+ * @since 2024/4/17 14:19
+ */
+public class AssignedCheckExamRoomExport {
+
+    @ExcelColumn(name = "科目代码", index = 1)
+    private String subjectCode;
+
+    @ExcelColumn(name = "考点", index = 2)
+    private String examSite;
+
+    @ExcelColumn(name = "校区", index = 3)
+    private String campusCode;
+
+    @ExcelColumn(name = "校区", index = 4)
+    private String campusName;
+    @ExcelColumn(name = "考场", index = 5)
+    private String examRoom;
+
+    public String getSubjectCode() {
+        return subjectCode;
+    }
+
+    public void setSubjectCode(String subjectCode) {
+        this.subjectCode = subjectCode;
+    }
+
+    public String getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+}

+ 22 - 7
src/main/resources/mapper/StudentMapper.xml

@@ -129,7 +129,7 @@
           and e.enable = 1
           and (t.file_upload_status = 'WAITING_UPLOAD' or t.data_upload_status =
                                                           'WAITING_UPLOAD')
-        limit #{pageSize}
+            limit #{pageSize}
     </select>
 
     <select id="findUploadError"
@@ -142,7 +142,7 @@
           and e.enable_upload = 1
           and e.enable = 1
           and (t.file_upload_status = 'ERROR' or t.data_upload_status = 'ERROR')
-        limit #{pageSize}
+            limit #{pageSize}
     </select>
 
     <select id="getPackageCountByExam" resultType="int">
@@ -250,7 +250,7 @@
         where e.enable = 1
           and (e.image_transfer_mode = 'OW' or e.image_transfer_mode = 'CET')
           and t.file_upload_status = 'WAITING_UPLOAD'
-        limit #{pageSize}
+            limit #{pageSize}
     </select>
 
     <select id="getUploadedCount" resultType="int">
@@ -266,8 +266,8 @@
         from sc_student t
         where t.exam_id = #{examId}
           and (
-            t.file_upload_status in ('WAITING_UPLOAD', 'ERROR') or
-            t.data_upload_status in ('WAITING_UPLOAD', 'ERROR')
+                    t.file_upload_status in ('WAITING_UPLOAD', 'ERROR') or
+                    t.data_upload_status in ('WAITING_UPLOAD', 'ERROR')
             )
     </select>
 
@@ -490,7 +490,7 @@
           and t.assigned_check_count = #{checkCount}
           and t.assigned = 1
         order by t.id
-        limit #{pageNumber}, #{pageSize}
+            limit #{pageNumber}, #{pageSize}
     </select>
 
 
@@ -511,7 +511,7 @@
                             and user_id = #{userId}
                             and exam_id = #{examId})
         order by h.id desc
-        limit #{pageSize}
+            limit #{pageSize}
     </select>
 
     <update id="updateAssignedCheckCount">
@@ -652,4 +652,19 @@
         group by stu.exam_room
     </select>
 
+    <select id="exportAssignedCheck" resultType="cn.com.qmth.scancentral.vo.assginedcheck.AssignedCheckExamRoomExport">
+        select stu.subject_code,
+               sb.name as subject_name,
+               stu.campus_code,
+               stu.campus_name,
+               stu.exam_site,
+               stu.exam_room,
+        from sc_student stu
+        where stu.exam_id = #{examId}
+          and stu.subject_code = #{subjectCode}
+          and stu.assigned = 1
+          and stu.assigned_suspect = 1
+        group by stu.exam_room
+    </select>
+
 </mapper>