1
0
Эх сурвалжийг харах

评卷复核增加回评功能

ting.yin 5 жил өмнө
parent
commit
52f2d9d084

+ 72 - 33
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/InspectedController.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.stmms.admin.exam;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,7 +32,6 @@ import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
 import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
-import cn.com.qmth.stmms.biz.lock.LockService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
@@ -40,8 +40,10 @@ import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
 import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.domain.WebUser;
 import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
 
 @Controller("inspectedController")
 @RequestMapping("/admin/exam/inspected")
@@ -73,6 +75,9 @@ public class InspectedController extends BaseExamController {
     @Autowired
     private MarkGroupService groupService;
 
+    // 并发处理互斥锁
+    private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
+
     @Value("${slice.image.server}")
     private String sliceServer;
 
@@ -109,41 +114,48 @@ public class InspectedController extends BaseExamController {
 
     @RequestMapping("/info")
     @ResponseBody
-    public Object info(@RequestParam Integer libraryId) {
+    public Object info(HttpServletRequest request, @RequestParam Integer libraryId) {
+        WebUser wu = RequestUtils.getWebUser(request);
         MarkLibrary library = libraryService.findById(libraryId);
-        ExamStudent student = studentService.findById(library.getStudentId());
         JSONObject result = new JSONObject();
-        result.accumulate("id", libraryId);
-        result.accumulate("studentId", library.getStudentId());
-        result.accumulate("subjectCode", library.getSubjectCode());
-        result.accumulate("subjectName", student.getSubjectName());
-        Marker marker = markerService.findById(library.getMarkerId());
-        result.accumulate("markerName", marker.getLoginName());
-        result.accumulate("markerScore", library.getMarkerScore());
-
-        JSONArray array = new JSONArray();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
-                library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
-        List<ScoreItem> scores = library.getScoreList();
-        for (int i = 0; i < questions.size(); i++) {
-            ExamQuestion question = questions.get(i);
-            JSONObject obj = new JSONObject();
-            obj.accumulate("questionNumber", question.getMainTitle() + " " + question.getQuestionNumber());
-            obj.accumulate("score", scores.get(i).getScore());
-            array.add(obj);
+        if (setCurrent(library.getId(), wu.getUser().getId())) {
+            ExamStudent student = studentService.findById(library.getStudentId());
+            result.accumulate("id", libraryId);
+            result.accumulate("studentId", library.getStudentId());
+            result.accumulate("subjectCode", library.getSubjectCode());
+            result.accumulate("subjectName", student.getSubjectName());
+            Marker marker = markerService.findById(library.getMarkerId());
+            result.accumulate("markerName", marker.getLoginName());
+            result.accumulate("markerScore", library.getMarkerScore());
+
+            JSONArray array = new JSONArray();
+            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(
+                    library.getExamId(), library.getSubjectCode(), false, library.getGroupNumber());
+            List<ScoreItem> scores = library.getScoreList();
+            for (int i = 0; i < questions.size(); i++) {
+                ExamQuestion question = questions.get(i);
+                JSONObject obj = new JSONObject();
+                obj.accumulate("questionNumber", question.getMainTitle() + " " + question.getQuestionNumber());
+                obj.accumulate("score", scores.get(i).getScore());
+                array.add(obj);
+            }
+            result.accumulate("questions", array);
+
+            MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(),
+                    library.getGroupNumber());
+            Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
+            List<String> picUrls = PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
+                    student.getSubjectCode(), student.getExamNumber(), student.getSliceCount());
+            List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
+            List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
+            result.accumulate("picUrls", picUrls);
+            result.accumulate("pictureConfig", group.getPictureConfigList());
+            result.accumulate("markTracks", markTracks);
+            result.accumulate("markSpecialTagList", markSpecialTagList);
+            result.accumulate("success", true);
+        } else {
+            result.accumulate("success", false);
         }
-        result.accumulate("questions", array);
-
-        MarkGroup group = groupService.findOne(student.getExamId(), student.getSubjectCode(), library.getGroupNumber());
-        Campus campus = campusService.findBySchoolAndName(student.getSchoolId(), student.getCampusName());
-        List<String> picUrls = PictureUrlBuilder.getSliceUrls(student.getExamId(), campus.getId(),
-                student.getSubjectCode(), student.getExamNumber(), student.getSliceCount());
-        List<MarkTrack> markTracks = markTrackService.findByLibraryId(library.getId());
-        List<MarkSpecialTag> markSpecialTagList = markSpecialTagService.findByLibraryId(library.getId());
-        result.accumulate("picUrls", picUrls);
-        result.accumulate("pictureConfig", group.getPictureConfigList());
-        result.accumulate("markTracks", markTracks);
-        result.accumulate("markSpecialTagList", markSpecialTagList);
         return result;
     }
 
@@ -151,12 +163,39 @@ public class InspectedController extends BaseExamController {
     @ResponseBody
     public Object save(HttpServletRequest request, @RequestParam Integer libraryId) {
         MarkLibrary library = libraryService.findById(libraryId);
+        WebUser wu = RequestUtils.getWebUser(request);
         if (library != null && library.getStatus().equals(LibraryStatus.MARKED)) {
             library.setStatus(LibraryStatus.INSPECTED);
+            library.setHeaderId(wu.getUser().getId());
+            library.setHeaderTime(new Date());
             libraryService.save(library);
+            releaseTask(libraryId);
             return true;
         } else {
             return false;
         }
     }
+
+    private boolean setCurrent(Integer taskId, Integer userId) {
+        Integer value = currentTaskMap.get(taskId);
+        if (value == null) {
+            synchronized (currentTaskMap) {
+                value = currentTaskMap.get(taskId);
+                if (value == null) {
+                    currentTaskMap.put(taskId, userId);
+                    return true;
+                } else {
+                    return false;
+                }
+            }
+        } else {
+            return false;
+        }
+    }
+
+    private void releaseTask(Integer taskId) {
+        synchronized (currentTaskMap) {
+            currentTaskMap.remove(taskId);
+        }
+    }
 }

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/LibraryController.java

@@ -124,7 +124,7 @@ public class LibraryController extends BaseExamController {
                 try {
                     lockService.watch(LockType.GROUP, library.getExamId(), library.getSubjectCode(),
                             library.getGroupNumber());
-                    if (markService.backLibrary(library)) {
+                    if (library.getStatus().equals(LibraryStatus.MARKED) && markService.backLibrary(library)) {
                         obj.accumulate("success", true);
                     } else {
                         obj.accumulate("success", false);

+ 27 - 9
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java

@@ -1,11 +1,16 @@
 package cn.com.qmth.stmms.api.controller;
 
 import java.text.DecimalFormat;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 
+import net.sf.json.JSONArray;
+import net.sf.json.JSONObject;
+
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -18,8 +23,6 @@ import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
-import com.google.common.base.Strings;
-
 import cn.com.qmth.stmms.api.utils.AESUtil;
 import cn.com.qmth.stmms.api.utils.MenualAbsentDTO;
 import cn.com.qmth.stmms.biz.api.auth.annotation.AuthValidate;
@@ -38,10 +41,11 @@ import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.user.model.User;
+import cn.com.qmth.stmms.biz.user.service.UserService;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONArray;
-import net.sf.json.JSONObject;
+
+import com.google.common.base.Strings;
 
 @Controller("examStudentApiController")
 @RequestMapping("/api")
@@ -67,6 +71,9 @@ public class ExamStudentController extends BaseApiController {
     @Autowired
     private MarkerService markerService;
 
+    @Autowired
+    private UserService userService;
+
     @AuthValidate("adminUser")
     @RequestMapping(value = "/student/manualAbsent/{examId}", method = RequestMethod.POST)
     @ResponseBody
@@ -305,7 +312,9 @@ public class ExamStudentController extends BaseApiController {
                             detail.accumulate("subNumber", question.getSubNumber());
                             detail.accumulate("score", item.getScore());
                             detail.accumulate("marker",
-                                    StringUtils.join(getMarkerNames(student, question.getMainNumber()), ","));
+                                    getMarkerNames(student, question.getMainNumber()).get("markerNames"));
+                            detail.accumulate("header",
+                                    getMarkerNames(student, question.getMainNumber()).get("headerNames"));
                             subjective.add(detail);
                         }
                         obj.accumulate("subjectiveScoreDetail", subjective);
@@ -323,16 +332,25 @@ public class ExamStudentController extends BaseApiController {
         return array;
     }
 
-    private List<String> getMarkerNames(ExamStudent student, Integer groupNumber) {
-        List<String> names = new LinkedList<>();
+    private Map<String, String> getMarkerNames(ExamStudent student, Integer groupNumber) {
+        Map<String, String> map = new HashMap<String, String>();
+        List<String> markerNames = new LinkedList<>();
+        List<String> headerNames = new LinkedList<>();
+
         List<MarkLibrary> list = libraryService.findByStudentAndGroup(student.getId(), groupNumber);
         for (MarkLibrary library : list) {
             Marker marker = markerService.findById(library.getMarkerId());
             if (marker != null) {
-                names.add(marker.getName());
+                markerNames.add(marker.getName());
+            }
+            User user = userService.findById(library.getHeaderId());
+            if (user != null) {
+                headerNames.add(user.getName());
             }
         }
-        return names;
+        map.put("markerNames", StringUtils.join(markerNames, ","));
+        map.put("headerNames", StringUtils.join(headerNames, ","));
+        return map;
     }
 
     /**

+ 35 - 4
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/inspected.jsp

@@ -67,7 +67,10 @@
 	                </tbody>
 	              </table>
 	            </div>
-	            <div class="form-b cl"> <input type="button" id="save-button" value="保存"/><!--<a class="grey" href=""/>取消</a>--> </div>
+	            <div class="form-b cl"> 
+	            	<input type="button" id="save-button" value="确认"/>
+	           		<input type="button" class="grey" id="back-button" value="打回"/>
+	            </div>
 	          </div>
 	        </div>
 		    <div class="tipsbox">
@@ -85,6 +88,8 @@ var iviewer;
 var regex = /^[a-z]+$/ig;
 $(document).ready(function() {
     $('#save-button').click(save);
+    $('#back-button').click(back);
+    
     $('#zoom-in-button').click(function(){
         if(iviewer!=undefined) {
             iviewer.iviewer('zoom_by', 1);
@@ -128,11 +133,16 @@ function process(index){
     $.post('${ctx}/admin/exam/inspected/info', {
         libraryId: ids[index-1]
     }, function(result){
-        student = result;
-        render();
+    	if(result.success==true){
+        	student = result;
+        	render();
+    	}else{
+    		alert('获取考生信息出错');
+    		onProcessFinish(true);
+    	}
     }).error(function() {
         alert('获取考生信息出错');
-        onProcessFinish(true)
+        onProcessFinish(true);
     });
 }
 
@@ -192,6 +202,7 @@ function save(){
     	libraryId: student.id
     }, function(result){
         if(result==true){
+        	 $('#progress').html(ids.length-current);
             process(current+1);
         }else{
             alert('保存失败,请稍后重试');
@@ -199,6 +210,26 @@ function save(){
     });
 }
 
+function back(){
+    if(student==undefined){
+        return;
+    }
+    if(!confirm('确定要打回该评卷任务吗?')){
+	    return;
+	}
+	$.post('${ctx}/admin/exam/library/back', {
+		id: student.id
+	}, function(result){
+	    if(result.success==true){
+	    	$('#progress').html(ids.length-current);
+            process(current+1);
+        }else{
+            alert(result.message);
+        }
+	});
+
+}
+
 function buildImages (imageServer,picUrls,config,canvas,ctx,markTracks,markSpecialTagList) {
     var indexSet = {};
     for(var i=0;i<config.length;i++){

+ 4 - 3
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/libraryList.jsp

@@ -54,11 +54,12 @@
             <input type="text" name="studentId" id="studentId" value="${query.studentId}" maxlength="10" class="input-medium"onkeyup="this.value=this.value.replace(/\D/g,'')"/>
             &nbsp;
             <label>总分:从</label>
-			<input  type="number" id="startScroe"  name="startScroe"value="${query.startScroe}" class="input-medium"/>
+			<input  type="number" id="startScroe"  name="startScroe"value="${query.startScroe}" class="input-mini"/>
 			<label> 到&nbsp;&nbsp;&nbsp;</label>
-			<input type="number"  id="endScroe" name="endScroe"  value="${query.endScroe}"  class="input-medium"/>
-			
+			<input type="number"  id="endScroe" name="endScroe"  value="${query.endScroe}"  class="input-mini"/>
+			&nbsp;&nbsp;
 			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+			&nbsp;
 			<a target="_blank" href="${ctx}/admin/exam/inspected/start?subjectCode=${query.subjectCode}&groupNumber=${query.groupNumber}" class="btn">待复核:${inspectedCount }</a>
 		</div>
 	</form>