1
0
Prechádzať zdrojové kódy

删除题目改为异步线程

ting.yin 2 rokov pred
rodič
commit
551fc721e9

+ 11 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/ExamQuestion.java

@@ -106,6 +106,9 @@ public class ExamQuestion implements Serializable {
     @Transient
     private Integer selectivePart;
 
+    @Transient
+    private boolean deleting;
+
     public Integer getId() {
         return id;
     }
@@ -352,4 +355,12 @@ public class ExamQuestion implements Serializable {
         this.name = name;
     }
 
+    public boolean isDeleting() {
+        return deleting;
+    }
+
+    public void setDeleting(boolean deleting) {
+        this.deleting = deleting;
+    }
+
 }

+ 41 - 33
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkServiceImpl.java

@@ -1765,47 +1765,55 @@ public class MarkServiceImpl implements MarkService {
 
     @Transactional
     @Override
-    public boolean deleteByQuestion(ExamQuestion question) {
-        SelectiveGroup selectiveGroup = selectiveGroupService.findOne(question.getExamId(), question.getSubjectCode(),
-                question.getMainNumber());
-        if (selectiveGroup != null) {
+    public boolean deleteByQuestion(List<ExamQuestion> list) {
+        if (list == null || list.isEmpty()) {
             return false;
         }
-        if (!question.isObjective() && question.getGroupNumber() != null) {
-            return false;
-        } else {
-            int examId = question.getExamId();
-            String subjectCode = question.getSubjectCode();
-            boolean objective = question.isObjective();
-            ExamSubject subject = subjectService.find(examId, subjectCode);
-            double totalScore = objective ? BigDecimalUtils.sub(subject.getObjectiveScore(), question.getTotalScore())
-                    : BigDecimalUtils.sub(subject.getSubjectiveScore(), question.getTotalScore());
-            questionService.deleteById(question.getId());
-            if (objective) {
-                examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
+        for (ExamQuestion question : list) {
+
+            SelectiveGroup selectiveGroup = selectiveGroupService.findOne(question.getExamId(),
+                    question.getSubjectCode(), question.getMainNumber());
+            if (selectiveGroup != null) {
+                continue;
+            }
+            if (!question.isObjective() && question.getGroupNumber() != null) {
+                continue;
             } else {
-                // 未分组的题目
-                long unGroupQuestionCount = questionService.countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(
-                        examId, subjectCode, false);
-                // 考生整体状态与总分更新
-                long groupCount = groupDao.countByExamIdAndSubjectCode(examId, subjectCode);
-                if (groupCount == 0 || unGroupQuestionCount > 0) {
-                    studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode,
-                            SubjectiveStatus.UNMARK, 0, null, null, null);
-                    // studentService.resetSubjectiveStatusAndScoreWithoutTrial(examId,
-                    // subjectCode);
-                    inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+                int examId = question.getExamId();
+                String subjectCode = question.getSubjectCode();
+                boolean objective = question.isObjective();
+                ExamSubject subject = subjectService.find(examId, subjectCode);
+                double totalScore = objective ? BigDecimalUtils.sub(subject.getObjectiveScore(),
+                        question.getTotalScore()) : BigDecimalUtils.sub(subject.getSubjectiveScore(),
+                        question.getTotalScore());
+                questionService.deleteById(question.getId());
+                if (objective) {
+                    examService.updateObjectiveStatus(examId, ObjectiveStatus.WAITING);
                 } else {
-                    List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(examId,
-                            subjectCode, SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED, SubjectiveStatus.INSPECTED);
-                    for (Integer studentId : studentList) {
-                        checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
+                    // 未分组的题目
+                    long unGroupQuestionCount = questionService
+                            .countByExamIdAndSubjectAndObjectiveAndGroupNumberIsNull(examId, subjectCode, false);
+                    // 考生整体状态与总分更新
+                    long groupCount = groupDao.countByExamIdAndSubjectCode(examId, subjectCode);
+                    if (groupCount == 0 || unGroupQuestionCount > 0) {
+                        studentService.updateSubjectiveStatusAndScoreAndInspectorId(examId, subjectCode,
+                                SubjectiveStatus.UNMARK, 0, null, null, null);
+                        // studentService.resetSubjectiveStatusAndScoreWithoutTrial(examId,
+                        // subjectCode);
+                        inspectHistoryService.deleteByExamIdAndSubjectCode(examId, subjectCode);
+                    } else {
+                        List<Integer> studentList = studentService.findIdByExamIdAndSubjectCodeAndSubjectiveStatus(
+                                examId, subjectCode, SubjectiveStatus.UNMARK, SubjectiveStatus.MARKED,
+                                SubjectiveStatus.INSPECTED);
+                        for (Integer studentId : studentList) {
+                            checkStudentSubjective(studentId, groupCount, unGroupQuestionCount);
+                        }
                     }
                 }
+                subjectService.updateScore(examId, subjectCode, objective, totalScore);
             }
-            subjectService.updateScore(examId, subjectCode, objective, totalScore);
-            return true;
         }
+        return true;
     }
 
     @Override

+ 1 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/MarkService.java

@@ -256,7 +256,7 @@ public interface MarkService {
      * 
      * @param question
      */
-    boolean deleteByQuestion(ExamQuestion question);
+    boolean deleteByQuestion(List<ExamQuestion> question);
 
     /**
      * 管理员/组长打回某个任务的指定题目

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

@@ -4,7 +4,7 @@ public enum LockType {
     EXAM_SUBJECT("exam_subject"), GROUP("group"), GROUP_DELETE("group_delete"), STUDENT("student"), MARKER("marker"), MARKER_RESET(
             "marker_reset"), USER("user"), FORMAL_LIBRARY("formal_library"), TRIAL_LIBRARY("trial_library"), ARBITRATE(
             "arbitrate"), BATCH_QUALITY("batch_quality"), SCORE_CALCULATE("score_calculate"), GROUP_LIBRARY(
-            "group_library"), DATA_SYNC("data_sync"), SCHOOL("school");
+            "group_library"), DATA_SYNC("data_sync"), SCHOOL("school"), QUESTION_DELETE("question_delete");
 
     private String name;
 

+ 29 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -44,6 +44,7 @@ import cn.com.qmth.stmms.admin.dto.ObjectiveQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.QuestionDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectQuestionDTO;
 import cn.com.qmth.stmms.admin.dto.SubjectiveQuestionDTO;
+import cn.com.qmth.stmms.admin.thread.QuestionDeleteThread;
 import cn.com.qmth.stmms.admin.thread.ScoreCalculateThread;
 import cn.com.qmth.stmms.admin.thread.ScoreReportThread;
 import cn.com.qmth.stmms.admin.vo.StructFile;
@@ -232,6 +233,10 @@ public class PaperController extends BaseExamController {
                 }
                 list.addAll(subjectiveList);
             }
+            for (ExamQuestion examQuestion : list) {
+                examQuestion.setDeleting(lockService.isLocked(LockType.QUESTION_DELETE, examQuestion.getExamId(),
+                        examQuestion.getSubjectCode(), examQuestion.getMainNumber(), examQuestion.getSubNumber()));
+            }
             List<ExamQuestion> mainList = new LinkedList<ExamQuestion>();
             mainList.addAll(questionService.findMainByExamAndSubjectAndObjective(examId, subjectCode, true));
             mainList.addAll(questionService.findMainByExamAndSubjectAndObjective(examId, subjectCode, false));
@@ -628,11 +633,23 @@ public class PaperController extends BaseExamController {
             @RequestParam(required = false) Boolean upload) {
         ExamQuestion question = questionService.findById(questionId);
         String subjectCode = question.getSubjectCode();
-        if (markService.deleteByQuestion(question)) {
-            addMessage(redirectAttributes, "删除成功");
-        } else {
+        SelectiveGroup selectiveGroup = selectiveGroupService.findOne(question.getExamId(), question.getSubjectCode(),
+                question.getMainNumber());
+        if (selectiveGroup != null) {
+            addMessage(redirectAttributes, "删除失败,该题目已有分组或选做题存在选做题分组");
+        }
+        if (!question.isObjective() && question.getGroupNumber() != null) {
             addMessage(redirectAttributes, "删除失败,该题目已有分组或选做题存在选做题分组");
         }
+        if (lockService.trylock(LockType.QUESTION_DELETE, question.getExamId(), question.getSubjectCode(),
+                question.getMainNumber(), question.getSubNumber())) {
+            List<ExamQuestion> list = new ArrayList<ExamQuestion>();
+            list.add(question);
+            taskExecutor.submit(new QuestionDeleteThread(list, markService, lockService));
+            RequestUtils.setLog(request,
+                    "开始删除题目,subjectCode:" + subjectCode + " main number:" + question.getMainNumber() + " sub number:"
+                            + question.getSubNumber());
+        }
         String u = upload == null ? "" : upload.toString();
         String t = query.getTotalScoreNotEqual() == null ? "" : query.getTotalScoreNotEqual().toString();
         return "redirect:/admin/exam/paper/detail?subjectCode=" + subjectCode + "&pageNumber=" + query.getPageNumber()
@@ -733,12 +750,20 @@ public class PaperController extends BaseExamController {
     @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER, Role.COLLEGE_ADMIN })
     public String delete(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
             @RequestParam Integer[] ids, ExamSubjectSearchQuery query, @RequestParam(required = false) Boolean upload) {
+        List<ExamQuestion> list = new ArrayList<ExamQuestion>();
         for (Integer id : ids) {
             ExamQuestion question = questionService.findById(id);
             if (question != null) {
-                markService.deleteByQuestion(question);
+                if (lockService.trylock(LockType.QUESTION_DELETE, question.getExamId(), question.getSubjectCode(),
+                        question.getMainNumber(), question.getSubNumber())) {
+                    RequestUtils.setLog(request, "开始删除题目,subjectCode:" + question.getSubjectCode() + " main number:"
+                            + question.getMainNumber() + " sub number:" + question.getSubNumber());
+                }
             }
         }
+        if (!list.isEmpty()) {
+            taskExecutor.submit(new QuestionDeleteThread(list, markService, lockService));
+        }
         String u = upload == null ? "" : upload.toString();
         String t = query.getTotalScoreNotEqual() == null ? "" : query.getTotalScoreNotEqual().toString();
         return "redirect:/admin/exam/paper/detail?subjectCode=" + query.getCode() + "&pageNumber="

+ 49 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/QuestionDeleteThread.java

@@ -0,0 +1,49 @@
+package cn.com.qmth.stmms.admin.thread;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.lock.LockService;
+import cn.com.qmth.stmms.biz.mark.service.MarkService;
+import cn.com.qmth.stmms.common.enums.LockType;
+
+public class QuestionDeleteThread implements Runnable {
+
+    protected static Logger log = LoggerFactory.getLogger(QuestionDeleteThread.class);
+
+    private List<ExamQuestion> list;
+
+    private ExamQuestion question;
+
+    private MarkService markService;
+
+    private LockService lockService;
+
+    public QuestionDeleteThread(List<ExamQuestion> list, MarkService markService, LockService lockService) {
+        this.list = list;
+        this.markService = markService;
+        this.lockService = lockService;
+    }
+
+    @Override
+    public void run() {
+        if (list == null || list.isEmpty()) {
+            return;
+        }
+        try {
+            question = list.get(0);
+            lockService.waitlock(LockType.EXAM_SUBJECT, question.getExamId(), question.getSubjectCode());
+            markService.deleteByQuestion(list);
+        } catch (Exception e) {
+            log.error("delete group error", e);
+        } finally {
+            lockService.unlock(LockType.EXAM_SUBJECT, question.getExamId(), question.getSubjectCode());
+            lockService.unlock(LockType.QUESTION_DELETE, question.getExamId(), question.getSubjectCode(),
+                    question.getMainNumber(), question.getSubNumber());
+        }
+    }
+
+}

+ 5 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/paperDetail.jsp

@@ -86,9 +86,14 @@
 				<td><c:if test="${!question.objective}">${question.groupNumber}</c:if>
 				</td>
 				<td>
+				<c:if test="${question.deleting==true}">
+                    正在删除
+                </c:if>
+                <c:if test="${question.deleting!=true}">
 					<c:if test="${question.objective}"><a href="${ctx}/admin/exam/paper/question-edit/${question.id}?pageNumber=${query.pageNumber}&code=${query.code }&category=${ query.category}&level=${query.level }&upload=${ upload}&totalScoreNotEqual=${  query.totalScoreNotEqual}">编辑</a></c:if>
 					<c:if test="${!question.objective && question.enableUpdate}"><a href="${ctx}/admin/exam/paper/question-edit/${question.id}?pageNumber=${query.pageNumber}&code=${query.code }&category=${ query.category}&level=${query.level }&upload=${ upload}&totalScoreNotEqual=${  query.totalScoreNotEqual}">编辑</a></c:if>
 					<c:if test="${question.groupNumber==null ||question.groupNumber==0}"><a href="${ctx}/admin/exam/paper/question-delete/${question.id}?pageNumber=${query.pageNumber}&code=${query.code }&category=${ query.category}&level=${query.level }&upload=${ upload}&totalScoreNotEqual=${  query.totalScoreNotEqual}" class="delete-button">删除</a></c:if>
+                </c:if>
 				</td>
 			</tr>
 		</c:forEach>