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

增加标准卷数量限制,科组长直接判档,评卷跳过等功能

ting.yin 6 жил өмнө
parent
commit
3c2e65f2c9
15 өөрчлөгдсөн 230 нэмэгдсэн , 51 устгасан
  1. 43 23
      stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java
  2. 16 7
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/SystemConfig.java
  3. 1 1
      stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/image/ImageCompression.java
  4. 14 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java
  5. 14 1
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java
  6. 13 4
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java
  7. 2 0
      stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java
  8. 13 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java
  9. 4 2
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java
  10. 2 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java
  11. 2 1
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java
  12. 9 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java
  13. 9 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java
  14. 58 10
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java
  15. 30 0
      stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

+ 43 - 23
stmms-ms-collect/src/main/java/cn/com/qmth/stmms/ms/collect/api/CollectApi.java

@@ -16,6 +16,7 @@ import cn.com.qmth.stmms.ms.core.repository.StudentRepo;
 import cn.com.qmth.stmms.ms.core.repository.WorkRepo;
 import cn.com.qmth.stmms.ms.core.vo.Subject;
 import net.sf.json.JSONObject;
+
 import org.assertj.core.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.FileCopyUtils;
@@ -24,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
 import javax.imageio.ImageIO;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.text.SimpleDateFormat;
@@ -117,37 +119,55 @@ public class CollectApi {
         }
         return list;
     }
-
+    /**
+     * 上传裁切原图并压缩
+     * @param workId
+     * @param subjectId
+     * @param fileName
+     * @param request
+     * @param response
+     * @throws IOException
+     */
     @RequestMapping(value = "file/ms-slice/{workId}/{subjectId}/{fileName}", method = { RequestMethod.PUT, RequestMethod.POST })
-    public void upload(@PathVariable Long workId,@PathVariable Integer subjectId,@PathVariable String fileName,
-                       HttpServletRequest request,
-                       HttpServletResponse response) throws IOException{
+    public void upload(@PathVariable Long workId,@PathVariable Integer subjectId,
+    					@PathVariable String fileName,@RequestParam boolean original,
+                       HttpServletRequest request,HttpServletResponse response) throws IOException{
         Student student = studentRepo.findByWorkIdAndExamNumber(workId,fileName);
         Subject subject = Subject.values()[subjectId-1];
-        String savePath = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
-                + File.separator + student.getAreaCode();
-        File out = new File(savePath);
-        if (!out.exists()) {
-            out.mkdirs();
-        }
-        File outFile = new File(savePath + File.separator + student.getExamNumber() + ".jpg");
         InputStream inputStream = request.getInputStream();
-        FileCopyUtils.copy(request.getInputStream(), new FileOutputStream(outFile));
-
-        // 生成缩略图
-        String thumbDir = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
-                + File.separator + student.getAreaCode();
-        File thumb = new File(thumbDir);
-        if (!thumb.exists()) {
-            thumb.mkdirs();
+        if(original){//仅保存原图
+        	String savePath = systemConfig.getSheetDir() + File.separator + workId + File.separator + subject
+        			+ File.separator + student.getAreaCode();
+        	saveImage(student, inputStream, savePath);
+        }else{
+        	String savePath = systemConfig.getImageDir() + File.separator + workId + File.separator + subject
+        			+ File.separator + student.getAreaCode();
+        	File outFile = saveImage(student, inputStream, savePath);
+        	// 生成缩略图
+        	String thumbDir = systemConfig.getThumbDir() + File.separator + workId + File.separator + subject
+        			+ File.separator + student.getAreaCode();
+        	File thumb = new File(thumbDir);
+        	if (!thumb.exists()) {
+        		thumb.mkdirs();
+        	}
+        	BufferedImage bufferedImage = ImageCompression.compress(outFile, compressionConfig);
+        	String thumbFileName = thumbDir + File.separator + student.getExamNumber() + ".jpg";
+        	ImageIO.write(bufferedImage, "jpg", new File(thumbFileName));
         }
-        BufferedImage bufferedImage = ImageCompression.compress(outFile, compressionConfig);
-        String thumbFileName = thumbDir + File.separator + student.getExamNumber() + ".jpg";
-        ImageIO.write(bufferedImage, "jpg", new File(thumbFileName));
-
 
     }
 
+	private File saveImage(Student student, InputStream inputStream,
+			String savePath) throws IOException, FileNotFoundException {
+		File out = new File(savePath);
+		if (!out.exists()) {
+			out.mkdirs();
+		}
+		File outFile = new File(savePath + File.separator + student.getExamNumber() + ".jpg");
+		FileCopyUtils.copy(inputStream, new FileOutputStream(outFile));
+		return outFile;
+	}
+    
     @RequestMapping(value = "subject/collect-config", method = RequestMethod.POST)
     public boolean updateConfig(@RequestBody  CollectSubjectDTO collectSubjectDTO){
         Subject subject = Subject.values()[collectSubjectDTO.getSubjectId()-1];

+ 16 - 7
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/config/SystemConfig.java

@@ -1,15 +1,11 @@
 package cn.com.qmth.stmms.ms.commons.config;
 
-import org.assertj.core.internal.Strings;
+import java.util.UUID;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.stereotype.Component;
 
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.Random;
-import java.util.UUID;
-
 /**
  * 系统配置
  * Created by zhengmin on 2016/11/18.
@@ -22,7 +18,7 @@ public class SystemConfig {
     private ImageServerConfig imageServerConfig;
 
     /**
-     * 原图目录
+     * 裁切原图目录
      */
     private String imageDir;
 
@@ -30,6 +26,11 @@ public class SystemConfig {
      * 缩略图目录
      */
     private String thumbDir;
+    
+    /**
+     * 原图目录
+     */
+    private String sheetDir;
 
     public String getImageDir() {
         return imageDir;
@@ -57,4 +58,12 @@ public class SystemConfig {
                 + subject + "/" + areaCode + "/" + examNumber + ".jpg?random=" + UUID.randomUUID().toString();
     }
 
+	public String getSheetDir() {
+		return sheetDir;
+	}
+
+	public void setSheetDir(String sheetDir) {
+		this.sheetDir = sheetDir;
+	}
+
 }

+ 1 - 1
stmms-ms-commons/src/main/java/cn/com/qmth/stmms/ms/commons/utils/image/ImageCompression.java

@@ -59,6 +59,6 @@ public class ImageCompression {
 
     public static void rotate(File in, File out, int degree) throws IOException {
         BufferedImage image = ImageIO.read(in);
-        Thumbnails.of(image).size(image.getWidth(), image.getHeight()).rotate(degree).toFile(out);
+        Thumbnails.of(image).scale(1f).rotate(degree).toFile(out);
     }
 }

+ 14 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/MarkSubject.java

@@ -30,6 +30,11 @@ public class MarkSubject implements Serializable{
 
     @Enumerated(value = EnumType.ORDINAL)
     private MarkStage stage;
+    
+    /**
+     * 标准卷
+     */
+    private int sampleCount;
 
     public MarkSubject(Subject subject,Long workId) {
         this.id = workId + "-" + subject;
@@ -92,4 +97,13 @@ public class MarkSubject implements Serializable{
     public void setCollectConfig(String collectConfig) {
         this.collectConfig = collectConfig;
     }
+
+	public int getSampleCount() {
+		return sampleCount;
+	}
+
+	public void setSampleCount(int sampleCount) {
+		this.sampleCount = sampleCount;
+	}
+    
 }

+ 14 - 1
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/Paper.java

@@ -97,7 +97,11 @@ public class Paper implements Serializable {
      */
     private boolean isTagged;
 
-
+    /**
+     * 是否标记
+     */
+    private boolean isSample;
+    
     //抽查范围ID
     private Long inspectRange;
 
@@ -378,4 +382,13 @@ public class Paper implements Serializable {
     public void setInspector(Long inspector) {
         this.inspector = inspector;
     }
+
+	public boolean isSample() {
+		return isSample;
+	}
+
+	public void setSample(boolean isSample) {
+		this.isSample = isSample;
+	}
+    
 }

+ 13 - 4
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/MarkTaskRepo.java

@@ -1,14 +1,15 @@
 package cn.com.qmth.stmms.ms.core.repository;
 
-import cn.com.qmth.stmms.ms.core.domain.MarkStage;
-import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
-import cn.com.qmth.stmms.ms.core.vo.Subject;
+import java.util.List;
 
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Query;
 
-import java.util.List;
+import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
+import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.vo.Subject;
 
 /**
  * Created by zhengmin on 2016/9/23.
@@ -118,4 +119,12 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
      */
     Long countByPaperId(Long id);
 
+	int countByWorkIdAndSubjectAndStageAndResult(Long workId,MarkSubject markSubject, MarkStage level, String code);
+
+	int countByWorkIdAndSubjectAndStage(Long workId, MarkSubject markSubject,MarkStage level);
+
+	int countByWorkIdAndSubjectAndStageAndQuestionIdAndResult(Long workId, MarkSubject markSubject, MarkStage level, Long id,String code);
+
+	int countByWorkIdAndSubjectAndStageAndQuestionId(Long workId,MarkSubject markSubject, MarkStage level, Long id);
+
 }

+ 2 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/repository/PaperRepo.java

@@ -144,6 +144,8 @@ public interface PaperRepo extends JpaRepository<Paper, Long>, JpaSpecificationE
     @Query(value = "update Paper p set p.inspectRange = ?1 where p.examNumber in ?2")
     void markInspectRange(Long inspectRange, List<String> examNumbers);
 
+	long countByWorkIdAndSubjectAndIsSampleIsTrue(Long workId, Subject subject);
+
 //    List<Paper> findByWorkIdAndSubjectAndInspectRange(Long workId, Subject subject, Long inspectRange);
 
 }

+ 13 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/MarkTaskApi.java

@@ -76,7 +76,7 @@ public class MarkTaskApi {
                 predicates.add(builder.isNotNull(root.get("result")));
             }
             if(isSample != null){
-                predicates.add(builder.equal(root.get("paper").get("markByLeader"),isSample));
+                predicates.add(builder.equal(root.get("paper").get("isSample"),isSample));
             }
             return builder.and(predicates.toArray(new Predicate[predicates.size()]));
         };
@@ -115,5 +115,17 @@ public class MarkTaskApi {
         }
         return new ResponseEntity(markTaskAssembler.toDTO(markTask),HttpStatus.OK);
     }
+    
+    /**
+     * 跳过评卷任务
+     * @param markTask 评卷你任务id
+     * @param body 评卷内容
+     * @return
+     */
+    @RequestMapping(value = "{markTaskId}/skip",method = RequestMethod.POST)
+    public ResponseEntity skip(@PathVariable Long markTaskId){
+    	MarkTask markTask = markingService.skip(markTaskId);
+        return new ResponseEntity(markTaskAssembler.toDTO(markTask),HttpStatus.OK);
+    }
 
 }

+ 4 - 2
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/api/PaperApi.java

@@ -156,7 +156,7 @@ public class PaperApi {
                 predicates.add(builder.equal(root.get("isRejected"),reject));
             }
             if(isSample != null){
-                predicates.add(builder.equal(root.get("markByLeader"),isSample));
+                predicates.add(builder.equal(root.get("isSample"),isSample));
             }
             if(markedLogic != null){
                 predicates.add(builder.equal(root.get("markedLogic"),markedLogic));
@@ -187,7 +187,9 @@ public class PaperApi {
         String tagged = body.get("tagged");
         if (action != null && level != null) {
             if (action.equals("leveling")) {
-                markingService.levelMarkPaper(paper, level);
+                markingService.levelMarkPaper(paper, level,false);
+            } else if (action.equals("sampling")) {
+                markingService.levelMarkPaper(paper, level,true);
             } else if (action.equals("reject")) {
                 markingService.reject(paper, level);
             }

+ 2 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/MarkTaskAssembler.java

@@ -41,7 +41,8 @@ public class MarkTaskAssembler {
             String thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber());
             markTaskDTO.setThumbSrc(thumbSrc);
             markTaskDTO.setImgSrc(imgSrc);
-            markTaskDTO.setSample(paper.isMarkByLeader());
+            markTaskDTO.setSample(paper.isSample());
+            markTaskDTO.setMarkByLeader(paper.isMarkByLeader());
         }
         return markTaskDTO;
     }

+ 2 - 1
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/assembler/PaperAssembler.java

@@ -39,7 +39,8 @@ public class PaperAssembler {
             paperDTO.setScore(paper.getScore());
             paperDTO.setArbitrated(paper.isArbitrated());
             paperDTO.setRejected(paper.isRejected());
-            paperDTO.setSample(paper.isMarkByLeader());
+            paperDTO.setSample(paper.isSample());
+            paperDTO.setMarkByLeader(paper.isMarkByLeader());
             paperDTO.setTagged(paper.isTagged());
             paperDTO.setMarkedLogic(paper.isMarkedLogic());
             paperDTO.setRedoLevel(paper.getRedoLevel());

+ 9 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/MarkTaskDTO.java

@@ -23,6 +23,7 @@ public class MarkTaskDTO implements Serializable{
     private String imgSrc;;
     private String thumbSrc;
     private boolean isSample;
+    private boolean markByLeader;
 
     public Long getId() {
         return id;
@@ -127,4 +128,12 @@ public class MarkTaskDTO implements Serializable{
     public void setOriginLevel(String originLevel) {
         this.originLevel = originLevel;
     }
+
+	public boolean isMarkByLeader() {
+		return markByLeader;
+	}
+
+	public void setMarkByLeader(boolean markByLeader) {
+		this.markByLeader = markByLeader;
+	}
 }

+ 9 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/dto/PaperDTO.java

@@ -26,6 +26,7 @@ public class PaperDTO implements Serializable{
     private String imgSrc;
     private String thumbSrc;
     private boolean isSample;
+    private boolean markByLeader;
     private boolean markedLogic;
     private String areaCode;
     //抽查成绩
@@ -194,4 +195,12 @@ public class PaperDTO implements Serializable{
     public void setInspector(Long inspector) {
         this.inspector = inspector;
     }
+
+	public boolean isMarkByLeader() {
+		return markByLeader;
+	}
+
+	public void setMarkByLeader(boolean markByLeader) {
+		this.markByLeader = markByLeader;
+	}
 }

+ 58 - 10
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -8,6 +8,7 @@ import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 import cn.com.qmth.stmms.ms.marking.config.MarkingConfig;
 import cn.com.qmth.stmms.ms.marking.service.arbitration.ArbitrationService;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -16,9 +17,11 @@ import org.springframework.transaction.annotation.Transactional;
 
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.MarkStage;
+import cn.com.qmth.stmms.ms.core.domain.MarkSubject;
 import cn.com.qmth.stmms.ms.core.domain.Paper;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
 import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkSubjectRepo;
 import cn.com.qmth.stmms.ms.core.repository.MarkTaskRepo;
 import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 
@@ -47,6 +50,9 @@ public class MarkingService {
 
     @Autowired
     private LevelRepo levelRepo;
+    
+    @Autowired
+    private MarkSubjectRepo markSubjectRepo;
 
     /**
      * 提交分档。如果每个评卷都提交了,则进行仲裁判定,如果没有触发仲裁就定档
@@ -65,6 +71,8 @@ public class MarkingService {
         if (paper.isMarkByLeader()) {
             return markTask;
         }
+        /**
+        阀值判断
 
         //控制分档比例
         List<Level> levels = levelRepo.findByWorkId(markTask.getWorkId());
@@ -89,7 +97,7 @@ public class MarkingService {
         if ((kdcount + 1.0D) / kdtotal * 1.0D > kdpt / 100.D) {
             throw new RuntimeException(levelCode + "档已满,考点阀值已达" + kdpt + "%。");
         }
-
+         */
 
         MarkUser maker = markUserRepo.findOne(markTask.getMarkerId());
         Level level = levelRepo.findByWorkIdAndCode(markTask.getWorkId(), levelCode);
@@ -134,15 +142,23 @@ public class MarkingService {
      * @param level
      */
     @Transactional
-    public Paper levelMarkPaper(Paper paper, String level) {
-        paper.determineLevel(level);
-        paper.setMarkByLeader(true);
-        paperRepo.save(paper);
-        List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
-        for (MarkTask markTask : markTasks) {
-            markTask.setResult(level);
-        }
-        markTaskRepo.save(markTasks);
+    public Paper levelMarkPaper(Paper paper, String level,boolean isSample) {
+    	if(isSample){
+    		MarkSubject markSubject = markSubjectRepo.findOne(paper.getWorkId() + "-" + paper.getSubject().toString());
+    		long sampleCount = paperRepo.countByWorkIdAndSubjectAndIsSampleIsTrue(paper.getWorkId(), paper.getSubject());
+    		if(sampleCount >= markSubject.getSampleCount()){
+    			throw new RuntimeException("标准卷上限已达到");
+    		}
+    	}
+    	paper.determineLevel(level);
+    	paper.setMarkByLeader(true);
+    	paper.setSample(isSample);
+    	paperRepo.save(paper);
+    	List<MarkTask> markTasks = markTaskRepo.findByPaperIdAndStage(paper.getId(), MarkStage.LEVEL);
+    	for (MarkTask markTask : markTasks) {
+    		markTask.setResult(level);
+    	}
+    	markTaskRepo.save(markTasks);
         return paper;
     }
 
@@ -199,4 +215,36 @@ public class MarkingService {
         }
         return markTask;
     }
+    /**
+     * 跳过该任务,最后处理
+     * @param markTaskId
+     */
+    @Transactional
+	public MarkTask skip(Long markTaskId) {
+		try {
+			MarkTask m = markTaskRepo.findOne(markTaskId);
+			MarkTask markTask = new MarkTask();
+			markTask.setCreatedOn(m.getCreatedOn());
+			markTask.setLevelValue(m.getLevelValue());
+			markTask.setMarkerId(m.getMarkerId());
+			markTask.setMarkerName(m.getMarkerName());
+			markTask.setOriginLevel(m.getOriginLevel());
+			markTask.setPaper(m.getPaper());
+			markTask.setQuestionId(m.getQuestionId());
+			markTask.setRandomSeq(m.getRandomSeq());
+			markTask.setRejected(m.isRejected());
+			markTask.setResult(m.getResult());
+			markTask.setStage(m.getStage());
+			markTask.setSubject(m.getSubject());
+			markTask.setUpdatedOn(new Date());
+			markTask.setWorkId(m.getWorkId());
+			markTaskRepo.save(markTask);
+			markTaskRepo.delete(m);
+			return markTask;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException("该任务可能被占用,跳过失败");
+		}
+		
+	}
 }

+ 30 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/StageControlService.java

@@ -131,6 +131,7 @@ public class StageControlService {
      */
     private void enterScoreStage(MarkSubject markSubject) {
         Long workId = markSubject.getWorkId();
+        this.isPtFull(workId,markSubject);
         Subject subject = markSubject.getSubject();
         List<MarkUser> markers = markUserRepo.findByWorkIdAndSubjectAndRole(workId, subject, Role.MARKER);
         List<MarkUser> levelMarkers = markers.stream().filter(m -> m.getMarkRight() == MarkRight.ALLOW_ALL || m.getMarkRight() == MarkRight.ALLOW_SCORING).collect(Collectors.toList());
@@ -152,6 +153,35 @@ public class StageControlService {
         }
         assignTaskService.assignForGrouping(papers, markerGroups, markSubject);
     }
+    
+    /**
+     * 
+     * @param workId
+     * @param markSubject
+     */
+	private void isPtFull(Long workId,MarkSubject markSubject) {
+		//控制分档比例
+        List<Level> levels = levelRepo.findByWorkId(workId);
+        for (Level targetLevel : levels) {
+        	int pt = targetLevel.getPt();
+        	int count = markTaskRepo.countByWorkIdAndSubjectAndStageAndResult(workId, markSubject, MarkStage.LEVEL, targetLevel.getCode());
+        	int total = markTaskRepo.countByWorkIdAndSubjectAndStage(workId, markSubject, MarkStage.LEVEL);
+        	
+        	if ((count + 1.0D) / total * 1.0D > pt / 100.D) {
+        		throw new RuntimeException(targetLevel.getCode() + "档已满,占比总阀值已达" + pt + "%。");
+        	}
+        	//判断考点阀值是否已满
+        	int kdpt = targetLevel.getKdpt();
+        	List<ExamQuestion> examQuestions = examQuestionRepo.findByWorkIdAndSubject(workId, markSubject.getSubject());
+        	for (ExamQuestion examQuestion : examQuestions) {
+        		int kdcount = markTaskRepo.countByWorkIdAndSubjectAndStageAndQuestionIdAndResult(workId, markSubject, MarkStage.LEVEL, examQuestion.getId(), targetLevel.getCode());
+        		int kdtotal = markTaskRepo.countByWorkIdAndSubjectAndStageAndQuestionId(workId, markSubject,  MarkStage.LEVEL, examQuestion.getId());
+        		if ((kdcount + 1.0D) / kdtotal * 1.0D > kdpt / 100.D) {
+        			throw new RuntimeException(targetLevel.getCode() + "档已满,考点阀值已达" + kdpt + "%。");
+        		}
+			}
+        }
+	}
 
     /**
      * 进入到抽查阶段