Parcourir la source

Merge branch 'stmms_ft_dev' of http://git.qmth.com.cn/luoshi/stmms-ft
into stmms_ft_dev

# Conflicts:
# stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java
# stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java
# stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

luoshi il y a 6 ans
Parent
commit
f725cb8844

+ 27 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/ArbitrateController.java

@@ -12,6 +12,7 @@ import javax.servlet.http.HttpServletRequest;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.ui.Model;
@@ -23,6 +24,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.mark.model.ArbitrateHistory;
 import cn.com.qmth.stmms.biz.mark.model.Task;
@@ -47,6 +49,9 @@ public class ArbitrateController extends BaseExamController {
     @Autowired
     private UserService userService;
 
+    @Autowired
+    private ExamSubjectService subjectService;
+
     @Autowired
     private MarkGroupService groupService;
 
@@ -59,6 +64,15 @@ public class ArbitrateController extends BaseExamController {
     @Autowired
     private MarkService markService;
 
+    @Value("${slice.image.server}")
+    private String sliceServer;
+
+    @Value("${sheet.image.server}")
+    private String sheetServer;
+
+    @Value("${card.server}")
+    private String cardServer;
+
     // 并发处理互斥锁
     private Map<Integer, Integer> currentTaskMap = new HashMap<Integer, Integer>();
 
@@ -110,8 +124,10 @@ public class ArbitrateController extends BaseExamController {
             return "redirect:/admin/exam/arbitrate";
         }
         releaseByUser(wu.getUser().getId());
-        model.addAttribute("subjectCode", subjectCode);
-        model.addAttribute("groupNumber", groupNumber);
+        model.addAttribute("sheetServer", sheetServer);
+        model.addAttribute("sliceServer", sliceServer);
+        model.addAttribute("cardServer", cardServer);
+        model.addAttribute("subject", subjectService.find(group.getExamId(), group.getSubjectCode()));
         model.addAttribute("group", group);
         return "modules/exam/arbitrateProcess";
     }
@@ -240,6 +256,15 @@ public class ArbitrateController extends BaseExamController {
         return status;
     }
 
+    @RequestMapping("/clear")
+    @ResponseBody
+    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
+    public Object clear(HttpServletRequest request) {
+        WebUser wu = RequestUtils.getWebUser(request);
+        releaseByUser(wu.getUser().getId());
+        return true;
+    }
+
     private void releaseByUser(Integer userId) {
         Set<Integer> taskIds = new HashSet<>();
         taskIds.addAll(currentTaskMap.keySet());

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

@@ -191,6 +191,7 @@ public class MarkGroupController extends BaseExamController {
             model.addAttribute("group", group);
             model.addAttribute("questions", questionService.findByExamAndSubjectAndObjectiveAndMainNumber(
                     group.getExamId(), group.getSubjectCode(), false, group.getNumber()));
+            model.addAttribute("pictureConfig", buildPictureConfig(group));
             return "modules/exam/groupEditSimple";
         } else {
             redirectAttributes.addAttribute("subjectCode", subjectCode);
@@ -208,6 +209,7 @@ public class MarkGroupController extends BaseExamController {
             group.setScoreList(
                     questionService.findByExamAndSubjectAndObjectiveAndMainNumber(examId, subjectCode, false, number));
             model.addAttribute("group", group);
+            model.addAttribute("pictureConfig", buildPictureConfig(group));
             return "modules/exam/groupEditFull";
         } else {
             redirectAttributes.addAttribute("subjectCode", subjectCode);
@@ -357,8 +359,7 @@ public class MarkGroupController extends BaseExamController {
     @RequestMapping("/getPictureConfig")
     @RoleRequire(Role.SCHOOL_ADMIN)
     public String get(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes,
-            @RequestParam String subjectCode, @RequestParam Integer number,
-            @RequestParam(required = false) String picList) throws JsonProcessingException {
+            @RequestParam String subjectCode, @RequestParam Integer number) {
         int examId = getSessionExamId(request);
         ExamStudentSearchQuery query = new ExamStudentSearchQuery();
         query.setExamId(examId);
@@ -370,11 +371,8 @@ public class MarkGroupController extends BaseExamController {
             group = groupService.findOne(examId, subjectCode, number);
         }
         if (examStudents.size() > 0) {
-            model.addAttribute("picUrls", buildPicUrl(group, examStudents.get(0)));
+            model.addAttribute("picUrls", buildPicUrl(examStudents.get(0)));
             model.addAttribute("pictureConfig", buildPictureConfig(group));
-            if (StringUtils.isNotBlank(picList)) {
-                model.addAttribute("pictureConfig", StringEscapeUtils.unescapeHtml(picList));
-            }
             model.addAttribute("imageServer", imageServer);
             return "modules/mark/picConfig";
         } else {
@@ -384,29 +382,23 @@ public class MarkGroupController extends BaseExamController {
         }
     }
 
-    private String buildPictureConfig(MarkGroup group) throws JsonProcessingException {
+    private String buildPictureConfig(MarkGroup group) {
+        String json = "";
         if (group != null) {
-            ObjectMapper mapper = new ObjectMapper();
-            String json = mapper.writeValueAsString(group.getPictureConfigList());
-            return json;
-        } else {
-            return "";
+            try {
+                ObjectMapper mapper = new ObjectMapper();
+                json = mapper.writeValueAsString(group.getPictureConfigList());
+            } catch (JsonProcessingException e) {
+                e.printStackTrace();
+            }
         }
+        return json;
     }
 
-    private String buildPicUrl(MarkGroup group, ExamStudent examStudent) {
-        List<String> picUrls = null;
+    private List<String> buildPicUrl(ExamStudent examStudent) {
         Campus campus = campusService.findBySchoolAndName(examStudent.getSchoolId(), examStudent.getCampusName());
-        if (group == null) {
-            picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
-                    examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSliceCount());
-        } else {
-            List<String> picNumbers = new ArrayList<String>();
-            picNumbers.add(String.valueOf(group.getNumber()));
-            picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
-                    examStudent.getSubjectCode(), examStudent.getExamNumber(), picNumbers);
-        }
-
-        return picUrls.toString();
+        List<String> picUrls = PictureUrlBuilder.getSliceUrls(examStudent.getExamId(), campus.getId(),
+                examStudent.getSubjectCode(), examStudent.getExamNumber(), examStudent.getSliceCount());
+        return picUrls;
     }
 }

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/mark/MarkController.java

@@ -340,4 +340,4 @@ public class MarkController extends BaseController {
         return array;
     }
 
-}
+}

+ 6 - 7
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/arbitrateProcess.jsp

@@ -44,12 +44,12 @@
 				imageServer : '${sliceServer}',
 				userName : '${web_user.name}',
 				logoutUrl: '${ctx}/mark/logout',
-				clearUrl: '${ctx}/mark/clear',
+				clearUrl: '${ctx}/admin/arbitrate/clear',
 				modules : {
 					'single-image-view' : {},
 					'image-builder': {},
 					'header-mark-status': {
-						title : '${group.subjectCode}-${group.number}'
+						title : '${group.subjectCode}_${group.number}'
 					},
 					'mark-board' : {
 						showScoreBoard : false,
@@ -75,11 +75,10 @@
 			});
 			mc.start({
 				mode : 'loop',
-				statusUrl : '${ctx}/mark/status',
-				getUrl : '${ctx}/mark/gettask',
-				historyUrl : '${ctx}/mark/gethistory',
-				submitUrl : '${ctx}/mark/savetask',
-				clearUrl : '${ctx}/mark/clear'
+				statusUrl : '${ctx}/admin/arbitrate/status?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+				getUrl : '${ctx}/admin/arbitrate/getTask?subjectCode=${group.subjectCode}&groupNumber=${group.number}',
+				submitUrl : '${ctx}/admin/arbitrate/saveTask',
+				clearUrl : '${ctx}/admin/arbitrate/clear'
 			});
 		});
 	</script>

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

@@ -7,6 +7,7 @@
 	<%@include file="/WEB-INF/views/include/head.jsp" %>
 	<script type="text/javascript">
 		$(document).ready(function() {
+			window.localStorage.removeItem("pictureConfig");
 			$("#number").focus();
 			$("#inputForm").validate({
 				submitHandler: function(form){

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

@@ -7,6 +7,8 @@
 	<%@include file="/WEB-INF/views/include/head.jsp" %>
 	<script type="text/javascript">
 		$(document).ready(function() {
+			var pictureConfig = '${pictureConfig}';
+			window.localStorage.setItem("pictureConfig",pictureConfig);
 			$("#number").focus();
 			$("#inputForm").validate({
 				submitHandler: function(form){

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

@@ -7,6 +7,8 @@
 	<%@include file="/WEB-INF/views/include/head.jsp" %>
 	<script type="text/javascript">
 		$(document).ready(function() {
+			var pictureConfig = '${pictureConfig}';
+			window.localStorage.setItem("pictureConfig",pictureConfig);
 			$("#title").focus();
 			$("#inputForm").validate({
 				submitHandler: function(form){

+ 202 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/picConfig.jsp

@@ -0,0 +1,202 @@
+<%@ page language="java" pageEncoding="utf-8"%>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>高校版阅卷系统</title>
+	<link rel="stylesheet" href="${ctxStatic}/jcrop/css/jquery.Jcrop.min.css"/>
+	<link rel="stylesheet" href="${ctxStatic}/pic-config/css/style.css"/>
+	<script type="text/javascript" src="${ctxStatic}/jquery/jquery-1.9.1.min.js"></script>
+	<script type="text/javascript" src="${ctxStatic}/jcrop/js/jquery.Jcrop.min.js"></script>
+</head>
+<body>
+<div class="c-box" style="display:none" id="pic-config-div">
+    <div class="cont-z">
+        <div class="c-top">
+            <!--
+            <div class="c-icon">
+                <div class="iviewer_zoom_in iviewer_common iviewer_button"></div>
+                <div class="iviewer_zoom_out iviewer_common iviewer_button"></div>
+                <div class="iviewer_zoom_zero iviewer_common iviewer_button"></div>
+                <div class="iviewer_zoom_fit iviewer_common iviewer_button"></div>
+            </div>
+            -->
+            <ul class="c-tab cl" id="pic-switch" data-index="">
+            </ul>
+        </div>
+        <div class="c-mn">
+            <div class="imgcont"><img id="pic-content" src=""/></div>
+            <canvas id="pic-canvas" style="display:none"></canvas>
+        </div>
+    </div>
+    <div class="cont-y">
+        <div class="c-mn">
+            <div class="c-preview">
+                <ul id="pic-config-preview">
+                </ul>
+            </div>
+        </div>
+        <div class="c-bottom cl">
+            <a class="c-btn close" id="pic-config-clear" href="javascript:void(0)">清空</a>
+            <a class="c-btn s" id="pic-config-save" href="javascript:void(0)">保存</a>
+            <a class="c-btn" id="pic-config-cancel" href="javascript:void(0)">取消</a>
+        </div>
+    </div>
+</div>
+</body>
+
+<script type="text/javascript">
+var image_server = '${imageServer}';
+var pictureConfig = '${pictureConfig}';
+var picUrls = '${picUrls}';
+var picUrl = picUrls.split('[')[1].split(']')[0];
+var urls=[];
+for (var j = 0; j < picUrl.split(',').length; j++) {
+	urls.push(picUrl.split(',')[j].trim());
+} 
+var config=window.localStorage.getItem("pictureConfig");
+if(config!=null&&config!=undefined){
+	pictureConfig = config;
+}
+
+var saveCallback;
+var jcrop_canvas;
+var jcrop_api;
+var image_array = [];
+$(document).ready(function(e) {
+    $('#pic-config-div').css('z-index', 9999);
+    $('#pic-config-div').height($(window).height());
+    $('#pic-config-div').width($(window).width());
+    $('#pic-config-div').offset({top:0, left:0});
+    
+    $('#pic-config-clear').click(function(){
+        $('#pic-config-preview').empty();
+    });
+    $('#pic-config-save').click(function(){
+        var result = [];
+        $('#pic-config-preview').find('li').each(function(){
+            result.push(JSON.parse($(this).attr('data-config')));
+        })
+        if(result.length==0){
+            alert('请至少裁切一张小图后再保存');
+            return;
+        }
+        $('#pic-config-div').hide();
+        if(saveCallback!=undefined){
+            saveCallback(result);
+        }
+    });
+    $('#pic-config-cancel').click(function(){
+       // $('#pic-config-div').hide();
+    	window.close(); 
+    });
+    $('#pic-content').Jcrop({
+        onDblClick: addPreview
+    }, function() {
+        jcrop_api = this;
+    });
+    jcrop_canvas = $('#pic-canvas')[0];
+    
+    initPicConfigPopup(urls,pictureConfig,function(result){
+    	if (window.opener && !window.opener.closed) {
+    	 	window.opener.document.getElementById("picList").value = JSON.stringify(result);
+    		window.opener.document.getElementById("configuration").innerText="设置成功";
+    		window.localStorage.setItem("pictureConfig",JSON.stringify(result));
+    		window.close(); 
+    	}
+    });
+});
+
+function initPicConfigPopup(urls, config, onSave) {
+	if(config){
+		config = JSON.parse(config);
+	}
+    initImages(urls,config);
+    saveCallback = onSave;
+    $('#pic-config-div').show();
+}
+
+function initImages(urls,config) {
+    var container = $('#pic-switch');
+    container.empty();
+    container.attr('data-index','');
+    image_array = [];
+    for(var i=1;i<=urls.length;i++) {
+        var img = new Image();
+        img.crossOrigin = '';
+        var timestamp = new Date().getTime();
+        img.src = image_server + urls[i-1]+ '?' + timestamp;
+        image_array.push(img);
+        var dom = $('<li data-index="'+i+'"><a href="javascript:void(0)">'+i+'</a></li>').appendTo(container);
+        dom.find('a').click(function(){
+            var index = parseInt($(this).parent().attr('data-index'));
+            jcrop_api.setImage(image_array[index-1].src);
+            container.attr('data-index', index);
+            container.find('li').removeClass('on');
+            $(this).parent().addClass('on');
+        })
+    }
+    container.find('li:first a').trigger('click');
+    if(image_array.length==urls.length){
+    	img.onload = function () {
+    		initConfigs(config);
+    	};
+    }
+    
+}
+
+function initConfigs(config) {
+    $('#pic-config-preview').empty();
+
+    if(config!=undefined){
+        for(var i=0;i<config.length;i++){
+            addPreviewByConfig(config[i]);
+        }
+    }
+}
+
+function getCropConfig(c) {
+    var scaleX = jcrop_api.getScaleFactor()[0];
+    var scaleY = jcrop_api.getScaleFactor()[1];
+    config = {
+        x: c.x * scaleX,
+        y: c.y * scaleY,
+        w: c.w * scaleX,
+        h: c.h * scaleY
+    }
+    return config;
+}
+
+function addPreview(c) {
+    if (parseInt(c.w) > 0) {
+        var config = getCropConfig(c);
+        config.i = $('#pic-switch').attr('data-index');
+        if(config.i!='') {
+            config.i = parseInt(config.i);
+            addPreviewByConfig(config);
+        }
+        jcrop_api.release();
+    }
+}
+
+function addPreviewByConfig(config){
+    var container = $('#pic-config-preview');
+    jcrop_canvas.width=config.w;
+    jcrop_canvas.height=config.h;
+    
+    if(config.w==0||config.h==0){
+    	return ;
+    }
+    jcrop_canvas.getContext("2d").drawImage(image_array[config.i-1], config.x, config.y, config.w, config.h,0,0,config.w, config.h);
+    
+    var dom = $('<li><span class="order">'+config.i+'</span><div class="m"><img src=""/></div><span class="close">&times;</span></li>').appendTo(container);
+    dom.attr('data-config', JSON.stringify(config));
+    dom.find('img').attr('src', jcrop_canvas.toDataURL());
+    dom.find('span.close').click(function(){
+        $(this).parent().remove();
+    });
+}
+</script>
+
+</html>