Bläddra i källkod

评卷分组删除与评卷员重置由同步模式改为异步模式,增加内存锁,提交到后台任务执行

luoshi 4 år sedan
förälder
incheckning
2114230840

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

@@ -141,6 +141,9 @@ public class MarkGroup implements Serializable {
     @Transient
     private List<ScoreItem> markScoreDetail;
 
+    @Transient
+    private boolean deleting;
+
     public MarkGroup() {
         this.pk = new MarkGroupPK();
     }
@@ -433,4 +436,12 @@ public class MarkGroup implements Serializable {
     public void setEnableAllZero(boolean enableAllZero) {
         this.enableAllZero = enableAllZero;
     }
+
+    public boolean isDeleting() {
+        return deleting;
+    }
+
+    public void setDeleting(boolean deleting) {
+        this.deleting = deleting;
+    }
 }

+ 13 - 11
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Marker.java

@@ -1,20 +1,12 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
-import java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.common.annotation.ExcelField;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 
+import javax.persistence.*;
+import java.io.Serializable;
+
 @Entity
 @Table(name = "eb_marker")
 public class Marker implements Serializable {
@@ -96,6 +88,9 @@ public class Marker implements Serializable {
     @Transient
     private User user;
 
+    @Transient
+    private boolean reseting;
+
     public Marker() {
     }
 
@@ -275,4 +270,11 @@ public class Marker implements Serializable {
         this.loginName = loginName;
     }
 
+    public boolean isReseting() {
+        return reseting;
+    }
+
+    public void setReseting(boolean reseting) {
+        this.reseting = reseting;
+    }
 }

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

@@ -1,10 +1,10 @@
 package cn.com.qmth.stmms.common.enums;
 
 public enum LockType {
-    EXAM_SUBJECT("exam_subject"), GROUP("group"), STUDENT("student"), MARKER("marker"), 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");
+    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");
 
     private String name;
 

+ 25 - 11
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import cn.com.qmth.stmms.admin.dto.ExamQuestionDTO;
+import cn.com.qmth.stmms.admin.thread.MarkGroupDeleteThread;
 import cn.com.qmth.stmms.biz.exam.model.*;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 import cn.com.qmth.stmms.biz.exam.service.*;
@@ -23,6 +24,8 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.Model;
@@ -67,6 +70,10 @@ public class MarkGroupController extends BaseExamController {
     @Autowired
     private FileService fileService;
 
+    @Qualifier("task-executor")
+    @Autowired
+    private AsyncTaskExecutor taskExecutor;
+
     @Logging(menu = "大题管理查询", type = LogType.QUERY)
     @RequestMapping
     public String list(HttpServletRequest request, Model model, @RequestParam(required = false) String subjectCode) {
@@ -90,6 +97,8 @@ public class MarkGroupController extends BaseExamController {
             int percent =
                     group.getLibraryCount() > 0 ? (int) (group.getMarkedCount() * 100.00 / group.getLibraryCount()) : 0;
             group.setPercent(percent);
+            group.setDeleting(lockService
+                    .isLocked(LockType.GROUP_DELETE, group.getExamId(), group.getSubjectCode(), group.getNumber()));
         }
         model.addAttribute("resultList", list);
         model.addAttribute("subject", subject);
@@ -321,19 +330,24 @@ public class MarkGroupController extends BaseExamController {
             redirectAttributes.addAttribute("subjectCode", subjectCode);
             return "redirect:/admin/exam/group";
         }
-        try {
-            lockService.waitlock(LockType.EXAM_SUBJECT, group.getExamId(), group.getSubjectCode());
-            lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
-            markService.deleteGroup(group);
-            RequestUtils.setLog(request, "删除成功,subjectCode:" + subjectCode + " number:" + number);
-        } catch (Exception e) {
-            log.error("delete group error", e);
-            throw new RuntimeException("删除大题失败", e);
-        } finally {
-            lockService.unlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
-            lockService.unlock(LockType.EXAM_SUBJECT, group.getExamId(), group.getSubjectCode());
+        if (lockService.trylock(LockType.GROUP_DELETE, group.getExamId(), group.getSubjectCode(), group.getNumber())) {
+            taskExecutor.submit(new MarkGroupDeleteThread(group, markService, lockService));
+            RequestUtils.setLog(request, "开始删除分组,subjectCode:" + subjectCode + " number:" + number);
         }
 
+        //        try {
+        //            lockService.waitlock(LockType.EXAM_SUBJECT, group.getExamId(), group.getSubjectCode());
+        //            lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
+        //            markService.deleteGroup(group);
+        //            RequestUtils.setLog(request, "删除成功,subjectCode:" + subjectCode + " number:" + number);
+        //        } catch (Exception e) {
+        //            log.error("delete group error", e);
+        //            throw new RuntimeException("删除大题失败", e);
+        //        } finally {
+        //            lockService.unlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
+        //            lockService.unlock(LockType.EXAM_SUBJECT, group.getExamId(), group.getSubjectCode());
+        //        }
+
         redirectAttributes.addAttribute("subjectCode", subjectCode);
         redirectAttributes.addAttribute("number", number);
         return "redirect:/admin/exam/group";

+ 31 - 15
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkerController.java

@@ -1,5 +1,6 @@
 package cn.com.qmth.stmms.admin.exam;
 
+import cn.com.qmth.stmms.admin.thread.MarkerResetThread;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
@@ -27,6 +28,8 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.core.task.AsyncTaskExecutor;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.*;
@@ -78,6 +81,10 @@ public class MarkerController extends BaseExamController {
     @Autowired
     private MarkLibraryService libraryService;
 
+    @Qualifier("task-executor")
+    @Autowired
+    private AsyncTaskExecutor taskExecutor;
+
     @Logging(menu = "评卷员查询", type = LogType.QUERY)
     @RequestMapping
     public String list(Model model, HttpServletRequest request, MarkerSearchQuery query) {
@@ -101,6 +108,7 @@ public class MarkerController extends BaseExamController {
             marker.setMarkedCount(markService.markedCount(marker));
             marker.setCurrentCount(markService.applyCount(marker));
             marker.setUser(userService.findById(marker.getUserId()));
+            marker.setReseting(lockService.isLocked(LockType.MARKER_RESET, marker.getId()));
         }
         model.addAttribute("query", query);
         model.addAttribute("subjectList", getExamSubject(examId, wu));
@@ -198,24 +206,32 @@ public class MarkerController extends BaseExamController {
         Marker marker = markerService.findById(id);
         JSONObject obj = new JSONObject();
         if (marker != null) {
-            try {
-                lockService.waitlock(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
-                lockService
-                        .waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-                lockService.waitlock(LockType.MARKER, marker.getId());
-
-                markService.resetMarker(marker);
+            if (lockService.trylock(LockType.MARKER_RESET, marker.getId())) {
+                taskExecutor.submit(new MarkerResetThread(marker, markService, lockService));
                 obj.accumulate("success", true);
-            } catch (Exception e) {
-                log.error("reset marker error", e);
+            } else {
                 obj.accumulate("success", false);
-                obj.accumulate("message", "重置评卷员失败");
-            } finally {
-                lockService.unlock(LockType.MARKER, marker.getId());
-                lockService
-                        .unlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
-                lockService.unlock(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
+                obj.accumulate("message", "评卷员正在重置");
             }
+
+            //            try {
+            //                lockService.waitlock(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
+            //                lockService
+            //                        .waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+            //                lockService.waitlock(LockType.MARKER, marker.getId());
+            //
+            //                markService.resetMarker(marker);
+            //                obj.accumulate("success", true);
+            //            } catch (Exception e) {
+            //                log.error("reset marker error", e);
+            //                obj.accumulate("success", false);
+            //                obj.accumulate("message", "重置评卷员失败");
+            //            } finally {
+            //                lockService.unlock(LockType.MARKER, marker.getId());
+            //                lockService
+            //                        .unlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+            //                lockService.unlock(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
+            //            }
         } else {
             obj.accumulate("success", false);
             obj.accumulate("message", "该评卷员不存在");

+ 44 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/MarkGroupDeleteThread.java

@@ -0,0 +1,44 @@
+package cn.com.qmth.stmms.admin.thread;
+
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MarkGroupDeleteThread implements Runnable {
+
+    protected static Logger log = LoggerFactory.getLogger(MarkGroupDeleteThread.class);
+
+    private MarkGroup group;
+
+    private MarkService markService;
+
+    private LockService lockService;
+
+    public MarkGroupDeleteThread(MarkGroup group, MarkService markService, LockService lockService) {
+        this.group = group;
+        this.markService = markService;
+        this.lockService = lockService;
+    }
+
+    @Override
+    public void run() {
+        if (group == null) {
+            return;
+        }
+        try {
+            lockService.waitlock(LockType.EXAM_SUBJECT, group.getExamId(), group.getSubjectCode());
+            lockService.waitlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
+            markService.deleteGroup(group);
+        } catch (Exception e) {
+            log.error("delete group error", e);
+        } finally {
+            lockService.unlock(LockType.GROUP, group.getExamId(), group.getSubjectCode(), group.getNumber());
+            lockService.unlock(LockType.EXAM_SUBJECT, group.getExamId(), group.getSubjectCode());
+            lockService.unlock(LockType.GROUP_DELETE, group.getExamId(), group.getSubjectCode(), group.getNumber());
+        }
+    }
+
+}

+ 46 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/thread/MarkerResetThread.java

@@ -0,0 +1,46 @@
+package cn.com.qmth.stmms.admin.thread;
+
+import cn.com.qmth.stmms.biz.exam.model.Marker;
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class MarkerResetThread implements Runnable {
+
+    protected static Logger log = LoggerFactory.getLogger(MarkerResetThread.class);
+
+    private Marker marker;
+
+    private MarkService markService;
+
+    private LockService lockService;
+
+    public MarkerResetThread(Marker marker, MarkService markService, LockService lockService) {
+        this.marker = marker;
+        this.markService = markService;
+        this.lockService = lockService;
+    }
+
+    @Override
+    public void run() {
+        if (marker == null) {
+            return;
+        }
+        try {
+            lockService.waitlock(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
+            lockService.waitlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+            lockService.waitlock(LockType.MARKER, marker.getId());
+            markService.resetMarker(marker);
+        } catch (Exception e) {
+            log.error("reset marker error", e);
+        } finally {
+            lockService.unlock(LockType.MARKER, marker.getId());
+            lockService.unlock(LockType.GROUP, marker.getExamId(), marker.getSubjectCode(), marker.getGroupNumber());
+            lockService.unlock(LockType.EXAM_SUBJECT, marker.getExamId(), marker.getSubjectCode());
+            lockService.unlock(LockType.MARKER_RESET, marker.getId());
+        }
+    }
+
+}

+ 29 - 22
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/groupList.jsp

@@ -76,33 +76,40 @@
             <td>${result.percent}%</td>
             <td>${result.status.name}</td>
             <td>
-                <c:if test="${web_user.schoolAdmin==true && result.status.value!=3}">
-                    <c:if test="${result.status.value==1}">
-                        <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}" class="edit-button"
-                           id="statusButton">开始正评</a>
-                    </c:if>
-                    <c:if test="${result.status.value==2 && result.leftCount==0}">
-                        <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FINISH" data-number="${result.number}" class="edit-button">结束</a>
-                    </c:if>
-                    <c:if test="${result.currentCount>0}">
-                        &nbsp;
-                        <a href="${ctx}/admin/exam/group/release?subjectCode=${result.subjectCode}&number=${result.number}">回收</a>
-                    </c:if>
-                    <c:if test="${result.libraryCount>0}">
+                <c:if test="${result.deleting==true}">
+                    正在删除
+                </c:if>
+                <c:if test="${result.deleting==false}">
+                    <c:if test="${web_user.schoolAdmin==true && result.status.value!=3}">
+                        <c:if test="${result.status.value==1}">
+                            <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}" class="edit-button"
+                               id="statusButton">开始正评</a>
+                        </c:if>
+                        <c:if test="${result.status.value==2 && result.leftCount==0}">
+                            <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FINISH" data-number="${result.number}"
+                               class="edit-button">结束</a>
+                        </c:if>
+                        <c:if test="${result.currentCount>0}">
+                            &nbsp;
+                            <a href="${ctx}/admin/exam/group/release?subjectCode=${result.subjectCode}&number=${result.number}">回收</a>
+                        </c:if>
+                        <c:if test="${result.libraryCount>0}">
+                            &nbsp;
+                            <a href="${ctx}/admin/exam/group/reset?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="reset-button">重置</a>
+                        </c:if>
                         &nbsp;
-                        <a href="${ctx}/admin/exam/group/reset?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="reset-button">重置</a>
+                        <c:if test="${examType!='MULTI_MEDIA'}">
+                            <a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="edit-button">修改</a>
+                            &nbsp;
+                        </c:if>
                     </c:if>
-                    &nbsp;
-                    <c:if test="${examType!='MULTI_MEDIA'}">
-                        <a href="${ctx}/admin/exam/group/edit-simple?subjectCode=${result.subjectCode}&number=${result.number}" data-number="${result.number}" class="edit-button">修改</a>
+                    
+                    <c:if test="${web_user.schoolAdmin==true && result.status.value==3}">
                         &nbsp;
+                        <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}"
+                           class="edit-button">开始正评</a>
                     </c:if>
                 </c:if>
-                
-                <c:if test="${web_user.schoolAdmin==true && result.status.value==3}">
-                    &nbsp;
-                    <a href="${ctx}/admin/exam/group/changeStatus?subjectCode=${result.subjectCode}&number=${result.number}&status=FORMAL" data-number="${result.number}" class="edit-button">开始正评</a>
-                </c:if>
             </td>
         </tr>
     </c:forEach>

+ 28 - 25
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/markerList.jsp

@@ -14,7 +14,7 @@
             color: #0663A2;
             cursor: pointer;
         }
-
+        
         .taskWindow, .reSetPasswordWin {
             width: 400px;
             min-height: 150px;
@@ -28,14 +28,14 @@
             text-align: center;
             z-index: 99999;
         }
-
+        
         .task-header, .password-header {
             width: 100%;
             height: 46px;
             background: #5d6d7d;
             color: #fff;
         }
-
+        
         .task-content, .password-content {
             font-size: 18px;
             color: #005277;
@@ -44,14 +44,14 @@
             line-height: 30px;
             word-wrap: break-word;
         }
-
+        
         .image-close {
             margin-top: 15px;
             margin-right: 15px;
             cursor: pointer;
             float: right;
         }
-
+        
         .title {
             font-size: 22px;
             font-weight: bold;
@@ -60,24 +60,24 @@
             padding: 13px 0 0 13px;
             float: left;
         }
-
+        
         .task-count, .password-value {
             width: 150px;
         }
-
+        
         .btn-info {
             height: 25px;
             margin-left: 320px;
             margin-bottom: 20px;
         }
-
+        
         .wrong, .passwordWrong {
             font-size: 12px;
             color: #f00;
             line-height: 30px;
             padding-left: 20px;
         }
-
+        
         #cover {
             position: fixed;
             z-index: 9999;
@@ -93,7 +93,7 @@
 </head>
 <body>
 <ul class="nav nav-tabs">
-	<li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
+    <li><a href="${ctx}/admin/exam/mark?subjectCode=${subject.code}">评卷进度</a></li>
     <li><a href="${ctx}/admin/exam/group?subjectCode=${query.subjectCode}">分组管理</a></li>
     <li class="active"><a href="##">评卷员管理</a></li>
     <li><a href="${ctx}/admin/exam/trial?subjectCode=${query.subjectCode}">试评管理</a></li>
@@ -142,9 +142,9 @@
             &nbsp;
             <a href="${ctx}/admin/exam/marker/add" class="btn btn-success">新增</a>
             &nbsp;<input id="btnImport" class="btn" type="button" value="导入"/>
-             &nbsp;<a href="###" class="btn" id="save-button"">绑定评卷员</a>
+            &nbsp;<a href="###" class="btn" id="save-button"">绑定评卷员</a>
         </c:if>
-    <!--     <input id="btnExport" class="btn" type="button" value="导出"/> -->
+        <!--     <input id="btnExport" class="btn" type="button" value="导出"/> -->
     </div>
 </form>
 <tags:message content="${message}"/>
@@ -182,7 +182,10 @@
             <td>${marker.currentCount}</td>
             <td>${marker.topCount}</td>
             <td>
-                <c:if test="${web_user.schoolAdmin==true}">
+                <c:if test="${marker.reseting==true}">
+                    正在重置
+                </c:if>
+                <c:if test="${web_user.schoolAdmin==true && marker.reseting==false}">
                     <a href="javascript:void(0)" class="reset-button" data-id="${marker.id}">重置</a>
                     <c:if test="${marker.enable==true}">
                         <a href="javascript:void(0)" class="toggle-button" data-id="${marker.id}" data-value="false">禁用</a>
@@ -252,11 +255,11 @@
         var id = $(this).attr('data-id');
         $.post('${ctx}/admin/exam/marker/reset', {id: id}, function (result) {
             if (result.success == true) {
-                alert('重置成功');
-                $("#searchForm").submit();
+                alert('开始重置');
             } else {
                 alert(result.message);
             }
+            $("#searchForm").submit();
         });
     });
     $('.toggle-button').click(function () {
@@ -357,10 +360,10 @@
                 wrongMessage.html('请输入正整数!');
                 return false;
             }
-            if(taskCount>2147483647 ){
- 		       wrongMessage.html('数量不合法!');
- 		       return false;
- 		     }
+            if (taskCount > 2147483647) {
+                wrongMessage.html('数量不合法!');
+                return false;
+            }
         }
         $.post('${ctx}/admin/exam/marker/setTaskCount', {id: markerId, taskCount: taskCount}, function (result) {
             if (result.success == true) {
@@ -384,7 +387,7 @@
         }
         $.post('${ctx}/admin/exam/marker/reSetPassword', {id: markerId, password: password}, function (result) {
             if (result.success == true) {
-            	alert('修改成功');
+                alert('修改成功');
                 $("#searchForm").submit();
             } else {
                 alert(result.message);
@@ -392,14 +395,14 @@
             $('.reSetPasswordWin').hide();
         });
     });
-    $('#save-button').click(function(){
-    	var subjectCode = $('#subject-select').val();
-    	var groupNumber = $('#group-select').val();
-        if(groupNumber==''||subjectCode=="") {
+    $('#save-button').click(function () {
+        var subjectCode = $('#subject-select').val();
+        var groupNumber = $('#group-select').val();
+        if (groupNumber == '' || subjectCode == "") {
             alert('请选择科目分组');
             return false;
         }
-        $(this).attr('href','${ctx}/admin/exam/marker/save?subjectCode='+subjectCode+'&groupNumber='+groupNumber);
+        $(this).attr('href', '${ctx}/admin/exam/marker/save?subjectCode=' + subjectCode + '&groupNumber=' + groupNumber);
         return true;
     });
 </script>