Переглянути джерело

Merge branch 'stmms_ft_dev' into test_20181225

luoshi 6 роки тому
батько
коміт
478bb45412

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/dao/MarkGroupDao.java

@@ -43,6 +43,12 @@ public interface MarkGroupDao
     @Query("select count(q) from MarkGroup q where q.pk.examId=?1")
     long countByExamId(int examId);
 
+    @Query("select sum(g.libraryCount) from MarkGroup g where g.pk.examId=?1")
+    Integer sumLibraryCount(Integer examId);
+
+    @Query("select sum(g.markedCount) from MarkGroup g where g.pk.examId=?1")
+    Integer sumMarkedCount(Integer examId);
+
     @Modifying
     @Query("update MarkGroup g set g.libraryCount=(select count(l) from MarkLibrary l "
             + "where l.examId=?1 and l.subjectCode=?2 and l.groupNumber=g.pk.number) "

+ 6 - 4
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java

@@ -30,10 +30,12 @@ public interface MarkGroupService {
 
     void resetBuildTime(int examId, String subjectCode);
 
-	void updateDoubleRate(int examId, String subjectCode, Integer number,
-			Double doubleRate);
+    void updateDoubleRate(int examId, String subjectCode, Integer number, Double doubleRate);
 
-	void updateArbitrateThreshold(int examId, String subjectCode,
-			Integer number, Double arbitrateThreshold);
+    void updateArbitrateThreshold(int examId, String subjectCode, Integer number, Double arbitrateThreshold);
+
+    long sumLibraryCount(Integer examId);
+
+    long sumMarkedCount(Integer examId);
 
 }

+ 26 - 16
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java

@@ -93,21 +93,31 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
         return groupDao.countByExamId(examId);
     }
 
-	@Override
-	public void updateDoubleRate(int examId, String subjectCode,
-			Integer number, Double doubleRate) {
-		MarkGroup group  = findOne(examId, subjectCode, number); 
-		group.setDoubleRate(doubleRate);
-		save(group);
-	}
-
-	@Override
-	public void updateArbitrateThreshold(int examId, String subjectCode,
-			Integer number, Double arbitrateThreshold) {
-		MarkGroup group  = findOne(examId, subjectCode, number); 
-		group.setArbitrateThreshold(arbitrateThreshold);
-		save(group);
-		
-	}
+    @Override
+    public long sumLibraryCount(Integer examId) {
+        Integer count = groupDao.sumLibraryCount(examId);
+        return count != null ? count : 0;
+    }
+
+    @Override
+    public long sumMarkedCount(Integer examId) {
+        Integer count = groupDao.sumMarkedCount(examId);
+        return count != null ? count : 0;
+    }
+
+    @Override
+    public void updateDoubleRate(int examId, String subjectCode, Integer number, Double doubleRate) {
+        MarkGroup group = findOne(examId, subjectCode, number);
+        group.setDoubleRate(doubleRate);
+        save(group);
+    }
+
+    @Override
+    public void updateArbitrateThreshold(int examId, String subjectCode, Integer number, Double arbitrateThreshold) {
+        MarkGroup group = findOne(examId, subjectCode, number);
+        group.setArbitrateThreshold(arbitrateThreshold);
+        save(group);
+
+    }
 
 }

+ 13 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/dao/MarkLibraryDao.java

@@ -4,9 +4,12 @@ import java.util.Date;
 import java.util.List;
 import java.util.Set;
 
+import javax.persistence.LockModeType;
+
 import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Lock;
 import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
@@ -15,6 +18,10 @@ import cn.com.qmth.stmms.common.enums.LibraryStatus;
 
 public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, JpaSpecificationExecutor<MarkLibrary> {
 
+    @Lock(LockModeType.PESSIMISTIC_WRITE)
+    @Query("select l from MarkLibrary l where l.id=?1")
+    MarkLibrary findByIdForLock(Integer id);
+
     List<MarkLibrary> findByExamId(Integer examId, Pageable page);
 
     List<MarkLibrary> findByExamIdAndSubjectCode(Integer examId, String subjectCode, Pageable page);
@@ -42,6 +49,9 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Query("select count(*) from MarkLibrary f where f.studentId=?1 and f.markerId=?2")
     long countByStudentIdAndMarkerId(Integer studentId, Integer markerId);
 
+    @Query("select count(*) from MarkLibrary f where f.studentId=?1 and f.markerId=?2 and f.id!=?3")
+    long countByStudentIdAndMarkerIdAndIdNotEqual(Integer studentId, Integer markerId, Integer id);
+
     @Query("select distinct l.campusId from MarkLibrary l where l.examId=?1 and l.tags is not null")
     List<Integer> findTagCampusId(Integer examId);
 
@@ -69,6 +79,9 @@ public interface MarkLibraryDao extends JpaRepository<MarkLibrary, Integer>, Jpa
     @Query("select count(*) from MarkLibrary f where f.examId=?1 and f.subjectCode=?2 and f.status=?3")
     long countByExamIdAndSubjectCodeAndStatus(Integer examId, String subjectCode, LibraryStatus status);
 
+    @Query("select count(*) from MarkLibrary f where f.id=?1 and f.markerId=?2 and f.status=?3")
+    long countByIdAndMarkerIdAndStatus(Integer id, Integer markerId, LibraryStatus status);
+
     @Query("select f.markerId, count(*) as markerCount from MarkLibrary f where f.examId=?1 and f.status=?2 group by f.markerId")
     List<Object[]> countByMarkerAndStatus(Integer examId, LibraryStatus status);
 

+ 39 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/service/Impl/MarkLockService.java

@@ -27,6 +27,8 @@ public class MarkLockService {
 
     private Map<Object, AtomicBoolean> studentMap = new HashMap<>();
 
+    private Map<Object, AtomicBoolean> markerMap = new HashMap<>();
+
     /**
      * 对评卷分组进行重置/删除操作前,先尝试锁定
      * 
@@ -99,9 +101,46 @@ public class MarkLockService {
         }
     }
 
+    /**
+     * 评卷员进行评卷操作前,先尝试锁定
+     * 
+     * @param markerId
+     */
+    public void lockMarker(Integer markerId) {
+        AtomicBoolean lock = getLock(markerMap, markerId);
+        while (!lock.get()) {
+            lock.compareAndSet(false, true);
+        }
+    }
+
+    /**
+     * 评卷员进行评卷操作后,释放锁定
+     * 
+     * @param markerId
+     */
+    public void unlockMarker(Integer markerId) {
+        AtomicBoolean lock = getLock(markerMap, markerId);
+        while (lock.get()) {
+            lock.compareAndSet(true, false);
+        }
+    }
+
+    /**
+     * 等待评卷员释放锁定
+     * 
+     * @param studentId
+     */
+    public void waitUnlockMarker(Integer markerId) {
+        AtomicBoolean lock = getLock(markerMap, markerId);
+        while (lock.get()) {
+            ;
+        }
+    }
+
     public void clear() {
         clearLock(groupMap);
         clearLock(studentMap);
+        clearLock(markerMap);
     }
 
     private void clearLock(Map<Object, AtomicBoolean> map) {

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

@@ -194,7 +194,7 @@ public class MarkServiceImpl implements MarkService {
             subjectService.updateScore(group.getExamId(), group.getSubjectCode());
             resetGroup(group);
         } catch (Exception e) {
-        	e.printStackTrace();
+            e.printStackTrace();
             throw e;
         } finally {
             lockService.unlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
@@ -300,57 +300,81 @@ public class MarkServiceImpl implements MarkService {
         lockService.waitUnlockGroup(group.getExamId(), group.getSubjectCode(), group.getNumber());
         // 等待考生释放锁定
         lockService.waitUnlockStudent(library.getStudentId());
-        // 若该评卷任务已被删除,则直接返回
-        if (!libraryDao.exists(library.getId())) {
-            return;
-        }
-        // 保存阅卷轨迹
-        if (trackList != null) {
-            trackDao.deleteByLibraryId(library.getId());
-            trackDao.save(trackList);
-        }
-        // 保存特殊标记
-        if (tagList != null) {
-            specialTagDao.deleteByLibraryId(library.getId());
-            specialTagDao.save(tagList);
-        }
 
-        ArbitrateHistory history = null;
-        if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
-            // 多评模式
-            List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(library.getStudentId(),
-                    library.getGroupNumber());
-            for (MarkLibrary other : list) {
-                if (other.getId().equals(library.getId()) || other.getStatus() != LibraryStatus.MARKED
-                        || other.getMarkerScore() == null || other.getHeaderScore() != null) {
-                    // 未评卷或组长已打分,则跳过该任务
-                    continue;
-                }
-                if (Math.abs(other.getMarkerScore() - library.getMarkerScore()) > group.getArbitrateThreshold()) {
-                    // 分差超过阀值,触发仲裁
-                    history = new ArbitrateHistory();
-                    history.setExamId(library.getExamId());
-                    history.setSubjectCode(library.getSubjectCode());
-                    history.setGroupNumber(library.getGroupNumber());
-                    history.setStudentId(library.getStudentId());
-                    history.setExamNumber(library.getExamNumber());
-                    history.setStatus(HistoryStatus.WAITING);
-                    history.setCreateTime(new Date());
-                    arbitrateDao.save(history);
-
-                    library.setStatus(LibraryStatus.WAIT_ARBITRATE);
-                    break;
+        try {
+            // 尝试锁定评卷员
+            lockService.lockMarker(library.getMarkerId());
+            // 锁定该评卷任务
+            MarkLibrary previous = libraryDao.findByIdForLock(library.getId());
+            // 若该评卷任务已被删除,则直接返回
+            if (previous == null) {
+                return;
+            }
+            // 该评卷任务已被别人评过,也直接返回
+            if (previous.getMarkerId() != null && !previous.getMarkerId().equals(library.getMarkerId())) {
+                return;
+            }
+            // 该评卷任务状态不是已评或未评,也直接返回
+            if (previous.getStatus() != LibraryStatus.WAITING && previous.getStatus() != LibraryStatus.MARKED) {
+                return;
+            }
+            // 已经评过该考生的其他评卷任务,则直接返回
+            if (libraryDao.countByStudentIdAndMarkerIdAndIdNotEqual(library.getStudentId(), library.getMarkerId(),
+                    library.getId()) > 0) {
+                return;
+            }
+            // 保存阅卷轨迹
+            if (trackList != null) {
+                trackDao.deleteByLibraryId(library.getId());
+                trackDao.save(trackList);
+            }
+            // 保存特殊标记
+            if (tagList != null) {
+                specialTagDao.deleteByLibraryId(library.getId());
+                specialTagDao.save(tagList);
+            }
+            // 判断多评模式下是否需要仲裁
+            ArbitrateHistory history = null;
+            if (group.getArbitrateThreshold() != null && group.getArbitrateThreshold() > 0) {
+                // 多评模式
+                List<MarkLibrary> list = libraryDao.findByStudentIdAndGroupNumber(library.getStudentId(),
+                        library.getGroupNumber());
+                for (MarkLibrary other : list) {
+                    if (other.getId().equals(library.getId()) || other.getStatus() != LibraryStatus.MARKED
+                            || other.getMarkerScore() == null || other.getHeaderScore() != null) {
+                        // 未评卷或组长已打分,则跳过该任务
+                        continue;
+                    }
+                    if (Math.abs(other.getMarkerScore() - library.getMarkerScore()) > group.getArbitrateThreshold()) {
+                        // 分差超过阀值,触发仲裁
+                        history = new ArbitrateHistory();
+                        history.setExamId(library.getExamId());
+                        history.setSubjectCode(library.getSubjectCode());
+                        history.setGroupNumber(library.getGroupNumber());
+                        history.setStudentId(library.getStudentId());
+                        history.setExamNumber(library.getExamNumber());
+                        history.setStatus(HistoryStatus.WAITING);
+                        history.setCreateTime(new Date());
+                        arbitrateDao.save(history);
+
+                        library.setStatus(LibraryStatus.WAIT_ARBITRATE);
+                        break;
+                    }
                 }
             }
-        }
-        library = libraryDao.saveAndFlush(library);
-        // 触发仲裁后续处理
-        if (history != null) {
-            libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
-                    LibraryStatus.WAIT_ARBITRATE);
-        } else if (library.getStatus() == LibraryStatus.MARKED) {
-            // 评卷正常完成才尝试统分
-            scoreCalculate(library.getExamId(), library.getSubjectCode(), library.getStudentId());
+            library = libraryDao.saveAndFlush(library);
+            // 触发仲裁后续处理
+            if (history != null) {
+                libraryDao.updateByStudentIdAndGroupNumber(library.getStudentId(), library.getGroupNumber(),
+                        LibraryStatus.WAIT_ARBITRATE);
+            } else if (library.getStatus() == LibraryStatus.MARKED) {
+                // 评卷正常完成才尝试统分
+                scoreCalculate(library.getExamId(), library.getSubjectCode(), library.getStudentId());
+            }
+        } catch (Exception e) {
+            throw e;
+        } finally {
+            lockService.unlockMarker(library.getMarkerId());
         }
     }
 

+ 2 - 7
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkController.java

@@ -26,9 +26,7 @@ import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
 import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.query.ExamSubjectSearchQuery;
-import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.LibraryStatus;
 import cn.com.qmth.stmms.common.utils.ExportExcel;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
 
@@ -41,9 +39,6 @@ public class MarkController extends BaseExamController {
     @Autowired
     private ExamSubjectService subjectService;
 
-    @Autowired
-    private MarkLibraryService libraryService;
-
     @Autowired
     private MarkerService markerService;
 
@@ -76,8 +71,8 @@ public class MarkController extends BaseExamController {
             list.add(vo);
         }
 
-        double total = libraryService.countByExamAndSubjectAndGroupAndStatus(examId, null, 0, null);
-        double finish = libraryService.countByExamAndSubjectAndGroupAndStatus(examId, null, 0, LibraryStatus.MARKED);
+        double total = (double) groupService.sumLibraryCount(examId);
+        double finish = (double) groupService.sumMarkedCount(examId);
         double percent = total > 0 ? (finish * 100 / total) : 0;
         model.addAttribute("percent", new DecimalFormat("###.#").format(percent));
         model.addAttribute("resultList", list);

+ 0 - 30
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/TagController.java

@@ -12,8 +12,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.ResponseBody;
 
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
@@ -23,14 +21,10 @@ import cn.com.qmth.stmms.biz.exam.service.TagService;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.query.MarkLibrarySearchQuery;
 import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
-import cn.com.qmth.stmms.biz.mark.service.MarkService;
-import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
 import cn.com.qmth.stmms.common.domain.WebUser;
-import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.utils.DateUtils;
 import cn.com.qmth.stmms.common.utils.PictureUrlBuilder;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
-import net.sf.json.JSONObject;
 
 @Controller("tagController")
 @RequestMapping("/admin/exam/tag")
@@ -50,9 +44,6 @@ public class TagController extends BaseExamController {
     @Autowired
     private TagService tagService;
 
-    @Autowired
-    private MarkService markService;
-
     @Value("${sheet.image.server}")
     private String imageServer;
 
@@ -95,27 +86,6 @@ public class TagController extends BaseExamController {
         return "modules/exam/tagInfo";
     }
 
-    @RequestMapping("/back")
-    @ResponseBody
-    @RoleRequire({ Role.SCHOOL_ADMIN, Role.SUBJECT_HEADER })
-    public Object back(HttpServletRequest request, @RequestParam Integer libraryId) {
-        JSONObject result = new JSONObject();
-        MarkLibrary library = libraryService.findById(libraryId);
-        if (library != null) {
-            if (subjectCheck(library.getSubjectCode(), RequestUtils.getWebUser(request))) {
-                markService.backLibrary(library);
-                result.accumulate("success", true);
-            } else {
-                result.accumulate("success", false);
-                result.accumulate("message", "没有操作该评卷任务的权限");
-            }
-        } else {
-            result.accumulate("success", false);
-            result.accumulate("message", "找不到对应的评卷任务");
-        }
-        return result;
-    }
-
     private List<Campus> getTagCampus(int examId) {
         List<Campus> list = new LinkedList<Campus>();
         List<Integer> ids = libraryService.findTagCampusId(examId);

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

@@ -30,8 +30,6 @@
 			<a href="${ctx}/admin/exam/group/add?subjectCode=${subject.code}" class="btn">新增</a>
 			&nbsp;
 			<a href="${ctx}/admin/exam/group/check-count?subjectCode=${subject.code}" class="btn">数量校对</a>
-			&nbsp;
-			<a href="${ctx}/admin/exam/marker?subjectCode=${subject.code}" class="btn">评卷员管理</a>
 			</c:if>
 		</div>
 	</form>

+ 126 - 138
stmms-web/src/main/webapp/WEB-INF/views/modules/exam/tagInfo.jsp

@@ -1,139 +1,127 @@
-<%@ page contentType="text/html;charset=UTF-8" %>
-<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
-<html>
-<head>
-	<title>标记试卷处理</title>
-	<meta name="decorator" content="default"/>
-	<%@include file="/WEB-INF/views/include/head.jsp" %>
-	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
-</head>
-<body>
-	<form id="searchForm" action="${ctx}/admin/exam/tag" method="post" class="breadcrumb form-search">
-		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
-		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
-		<div>
-			<label>科目</label>
-			<select class="input-large" id="subject-select" name="subjectCode">
-				<option value="">请选择</option>
-				<c:forEach items="${subjectList}" var="subject">
-				<option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
-				</c:forEach>
-			</select>
-			<label>大题</label>
-			<select class="input-medium" id="group-select" name="groupNumber">
-				<option value="0">请选择</option>
-			</select>
-			<label>学习中心</label>
-			<select class="input-large" name="campusId">
-				<option value="0">请选择</option>
-				<c:forEach items="${campusList}" var="campus">
-				<option value="${campus.id}" <c:if test="${campus.id==query.campusId}">selected</c:if>>${campus.name}</option>
-				</c:forEach>
-			</select>
-			<label>标记类型</label>
-			<select class="input-medium" name="tagId">
-				<c:forEach items="${tagList}" var="tag">
-				<option value="${tag.id}" <c:if test="${tag.id==query.tagId}">selected</c:if>>${tag.name}</option>
-				</c:forEach>
-			</select>
-			<br/><br/>
-			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
-		</div>
-	</form>
-	<tags:message content="${message}"/>
-	<table id="contentTable" class="table table-striped table-bordered table-condensed">
-		<thead>
-			<tr>
-				<th>科目</th>
-				<th>学习中心</th>
-				<th>准考证号</th>
-				<th>姓名</th>
-				<th>提交时间</th>
-				<th>操作</th>
-			</tr>
-		</thead>
-		<tbody>
-		<c:forEach items="${resultList}" var="result">
-			<tr>
-				<td>${result.subjectCode}-${result.subjectName}</td>
-				<td>${result.campusName}</td>
-				<td>${result.examNumber}</td>
-				<td>${result.name}</td>
-				<td>${result.markTime}</td>
-				<td>
-					<a class="sheet-link" href="##" data-sheet-url="${result.sheetUrlString}" data-answer-url="<c:if test="${result.answerUrl!=null}">${cardServer}${result.answerUrl}</c:if>" data-title="${result.examNumber}&nbsp;&nbsp;${result.name}&nbsp;&nbsp;客观总分${result.objectiveScoreString}&nbsp;&nbsp;主观总分${result.subjectiveScoreString}&nbsp;&nbsp;全卷总分${result.totalScoreString}">原图</a>
-					<a href="##" class="back-button" data-library-id="${result.libraryId}">打回</a>
-				</td>
-			</tr>
-		</c:forEach>
-		</tbody>
-	</table>
-	<div class="pagination">${query}</div>
-	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
-<script type="text/javascript">
-var searchSubjectCode = '${query.subjectCode}';
-var searchGroupNumber = '${query.groupNumber}';
-$(document).ready(function() {
-    /* new jBox('Image', {
-    	imageFade: 0,
-    	delayOpen: 0,
-    	delayClose: 0,
-    	maxHeight: $(window).height()*0.88
-    }); */
-    $('.sheet-link').click(function(){
-    	initImagePopover($(this).attr('data-title'), '${imageServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
-    	return false;
-    });
-    $('.back-button').click(function(){
-        if(confirm('确定要打回改试卷?')){  
-        $.post('${ctx}/admin/exam/tag/back', {libraryId: $(this).attr('data-library-id')}, function(result){
-            if(result.success==true){
-            	$("#searchForm").submit();
-            }else{
-                alert(result.message || '提交失败,请稍后重试');
-            }
-        });
-        }
-    });
-
-    $('#subject-select').change(function(){
-        var code = $(this).val();
-        if(code==''){
-            $('#group-select').empty();
-            return;
-        }
-        $.post('${ctx}/admin/exam/group/query', {subjectCode: code}, function(result){
-            var parent = $('#group-select');
-            parent.empty();
-            for(var i=0;i<result.length;i++){
-                var group = result[i];
-                $('<option value="'+group.number+'">'+group.number+'-'+group.title+'</option>').appendTo(parent);
-            }
-            if(searchSubjectCode==code && searchGroupNumber!=''){
-                parent.val(searchGroupNumber);
-            }
-            parent.trigger('change');
-        });
-    });
-    $('#subject-select').trigger('change');
-});
-function page(n,s){
-	$("#pageNumber").val(n);
-	$("#searchForm").attr('action', '${ctx}/admin/exam/tag');
-	$("#searchForm").submit();
-	return false;
-}
-function goSearch(){
-	$("#pageNumber").val(1);
-	$("#searchForm").attr('action', '${ctx}/admin/exam/tag');
-	$("#searchForm").submit();
-	return false;
-}
-function goExport(){
-	$("#searchForm").attr('action', '${ctx}/admin/exam/tag/export');
-	$("#searchForm").submit();
-	return false;
-}
-</script>	
-</body>
+<%@ page contentType="text/html;charset=UTF-8" %>
+<%@ include file="/WEB-INF/views/include/taglib.jsp"%>
+<html>
+<head>
+	<title>标记试卷处理</title>
+	<meta name="decorator" content="default"/>
+	<%@include file="/WEB-INF/views/include/head.jsp" %>
+	<style type="text/css">.sort{color:#0663A2;cursor:pointer;}</style>
+</head>
+<body>
+	<form id="searchForm" action="${ctx}/admin/exam/tag" method="post" class="breadcrumb form-search">
+		<input type="hidden" id="pageNumber" name="pageNumber" value="${query.pageNumber }"/>
+		<input type="hidden" id="pageSize" name="pageSize" value="${query.pageSize }"/>
+		<div>
+			<label>科目</label>
+			<select class="input-large" id="subject-select" name="subjectCode">
+				<option value="">请选择</option>
+				<c:forEach items="${subjectList}" var="subject">
+				<option value="${subject.code}" <c:if test="${subject.code==query.subjectCode}">selected</c:if>>${subject.code}-${subject.name}</option>
+				</c:forEach>
+			</select>
+			<label>大题</label>
+			<select class="input-medium" id="group-select" name="groupNumber">
+				<option value="0">请选择</option>
+			</select>
+			<label>学习中心</label>
+			<select class="input-large" name="campusId">
+				<option value="0">请选择</option>
+				<c:forEach items="${campusList}" var="campus">
+				<option value="${campus.id}" <c:if test="${campus.id==query.campusId}">selected</c:if>>${campus.name}</option>
+				</c:forEach>
+			</select>
+			<label>标记类型</label>
+			<select class="input-medium" name="tagId">
+				<c:forEach items="${tagList}" var="tag">
+				<option value="${tag.id}" <c:if test="${tag.id==query.tagId}">selected</c:if>>${tag.name}</option>
+				</c:forEach>
+			</select>
+			<br/><br/>
+			<input id="btnSubmit" class="btn btn-primary" type="button" value="查询" onclick="goSearch()"/>
+		</div>
+	</form>
+	<tags:message content="${message}"/>
+	<table id="contentTable" class="table table-striped table-bordered table-condensed">
+		<thead>
+			<tr>
+				<th>科目</th>
+				<th>学习中心</th>
+				<th>准考证号</th>
+				<th>姓名</th>
+				<th>提交时间</th>
+				<th>操作</th>
+			</tr>
+		</thead>
+		<tbody>
+		<c:forEach items="${resultList}" var="result">
+			<tr>
+				<td>${result.subjectCode}-${result.subjectName}</td>
+				<td>${result.campusName}</td>
+				<td>${result.examNumber}</td>
+				<td>${result.name}</td>
+				<td>${result.markTime}</td>
+				<td>
+					<a class="sheet-link" href="##" data-sheet-url="${result.sheetUrlString}" data-answer-url="<c:if test="${result.answerUrl!=null}">${cardServer}${result.answerUrl}</c:if>" data-title="${result.examNumber}&nbsp;&nbsp;${result.name}&nbsp;&nbsp;客观总分${result.objectiveScoreString}&nbsp;&nbsp;主观总分${result.subjectiveScoreString}&nbsp;&nbsp;全卷总分${result.totalScoreString}">原图</a>
+				</td>
+			</tr>
+		</c:forEach>
+		</tbody>
+	</table>
+	<div class="pagination">${query}</div>
+	<%@include file="/WEB-INF/views/include/imageView.jsp" %>
+<script type="text/javascript">
+var searchSubjectCode = '${query.subjectCode}';
+var searchGroupNumber = '${query.groupNumber}';
+$(document).ready(function() {
+    /* new jBox('Image', {
+    	imageFade: 0,
+    	delayOpen: 0,
+    	delayClose: 0,
+    	maxHeight: $(window).height()*0.88
+    }); */
+    $('.sheet-link').click(function(){
+    	initImagePopover($(this).attr('data-title'), '${imageServer}', $(this).attr('data-sheet-url'), $(this).attr('data-answer-url'));
+    	return false;
+    });
+
+    $('#subject-select').change(function(){
+        var code = $(this).val();
+        if(code==''){
+            $('#group-select').empty();
+            return;
+        }
+        $.post('${ctx}/admin/exam/group/query', {subjectCode: code}, function(result){
+            var parent = $('#group-select');
+            parent.empty();
+            for(var i=0;i<result.length;i++){
+                var group = result[i];
+                $('<option value="'+group.number+'">'+group.number+'-'+group.title+'</option>').appendTo(parent);
+            }
+            if(searchSubjectCode==code && searchGroupNumber!=''){
+                parent.val(searchGroupNumber);
+            }
+            parent.trigger('change');
+        });
+    });
+    $('#subject-select').trigger('change');
+});
+function page(n,s){
+	$("#pageNumber").val(n);
+	$("#searchForm").attr('action', '${ctx}/admin/exam/tag');
+	$("#searchForm").submit();
+	return false;
+}
+function goSearch(){
+	$("#pageNumber").val(1);
+	$("#searchForm").attr('action', '${ctx}/admin/exam/tag');
+	$("#searchForm").submit();
+	return false;
+}
+function goExport(){
+	$("#searchForm").attr('action', '${ctx}/admin/exam/tag/export');
+	$("#searchForm").submit();
+	return false;
+}
+</script>	
+</body>
 </html>