Explorar o código

增加评卷任务密号,增加评卷员权重,增加定档过半原则可配置

ting.yin %!s(int64=6) %!d(string=hai) anos
pai
achega
665cb8d9da

+ 1 - 1
stmms-ms-accesscontrol/src/main/java/cn/com/qmth/stmms/ms/accesscontrol/api/AuthApi.java

@@ -36,7 +36,7 @@ public class AuthApi {
         MarkUser domain = null;
         if (loginConfig.getLoginName().equals(user.getLoginName()) &&
                 loginConfig.getPassword().equals(user.getPassword())) {
-            domain = new MarkUser(loginConfig.getLoginName(), loginConfig.getPassword(), null, null, "系统管理员", Role.ADMIN);
+            domain = new MarkUser(loginConfig.getLoginName(), loginConfig.getPassword(), null, null, "系统管理员", Role.ADMIN,0);
         } else {
 //            Work activeWork = workRepo.findByActiveTrue();
 //            String loginName = activeWork.getId() + "-" + user.getLoginName();

+ 24 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/ScoreApi.java

@@ -13,6 +13,7 @@ import cn.com.qmth.stmms.ms.core.repository.PaperRepo;
 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 org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpStatus;
@@ -82,6 +83,29 @@ public class ScoreApi {
 
         return scoreAssembler.toDTO(student, papers);
     }
+    
+    /**
+     * 查询
+     *
+     * @param workId       评卷工作id
+     * @param secretNumber 任务密号
+     * @return
+     */
+    @RequestMapping(value = "search/byTaskSecretNumber", method = RequestMethod.GET)
+    public ScoreCheckDTO getByTaskSecretNumber(@RequestParam Long workId,
+                                           @RequestParam String secretNumber) {
+        List<Paper> papers = new ArrayList<Paper>();
+        List<MarkTask> markTasks = markTaskRepo.findByWorkIdAndSecretNumber(workId, secretNumber);
+        for (MarkTask markTask : markTasks) {
+        	papers.add(markTask.getPaper());
+		}
+        if(papers.isEmpty()){
+        	return null;
+        }
+        String examNumber = papers.get(0).getExamNumber();
+        Student student = studentRepo.findByWorkIdAndExamNumber(workId, examNumber);
+        return scoreAssembler.toDTO(student, papers);
+    }
 
     @RequestMapping(value = "search/byTotalScore", method = RequestMethod.GET)
     public ResponseEntity getByTotalScore(@RequestParam final Long workId,

+ 1 - 0
stmms-ms-admin/src/main/java/cn/com/qmth/stmms/ms/admin/api/UserApi.java

@@ -52,6 +52,7 @@ public class UserApi {
     public void update(@PathVariable MarkUser domain, @RequestBody MarkUser user) {
         domain.setName(user.getName());
         domain.setMarkRight(user.getMarkRight());
+        domain.setWeight(user.getWeight());
         markUserRepo.save(domain);
     }
 

+ 15 - 0
stmms-ms-core/src/main/java/cn/com/qmth/stmms/ms/core/domain/task/MarkTask.java

@@ -7,6 +7,7 @@ import cn.com.qmth.stmms.ms.core.vo.Subject;
 
 import javax.persistence.*;
 import javax.validation.constraints.NotNull;
+
 import java.io.Serializable;
 import java.util.Date;
 
@@ -68,6 +69,10 @@ public class MarkTask implements Serializable {
 
 
     private Integer randomSeq;
+    /**
+     * 密号
+     */
+    private String secretNumber;
 
     public MarkTask(MarkUser marker, Paper paper, MarkStage stage){
         this.markerId = marker.getId();
@@ -78,6 +83,7 @@ public class MarkTask implements Serializable {
         this.questionId = paper.getQuestionId();
         this.stage = stage;
         this.createdOn = new Date();
+        this.secretNumber = marker.getId() + subject.ordinal() + paper.getAreaCode() + paper.getExamNumber().substring(3, paper.getExamNumber().length());
     }
 
     public MarkTask() {
@@ -202,4 +208,13 @@ public class MarkTask implements Serializable {
     public void setRandomSeq(Integer randomSeq) {
         this.randomSeq = randomSeq;
     }
+
+	public String getSecretNumber() {
+		return secretNumber;
+	}
+
+	public void setSecretNumber(String secretNumber) {
+		this.secretNumber = secretNumber;
+	}
+    
 }

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

@@ -35,18 +35,22 @@ public class MarkUser extends AbstractUser {
 
     @Column(name = "inspect_sx")
     private Boolean inspectSX;
+    
+    private double weight;
 
     public MarkUser(String loginName,
                     String password,
                     Long workId,
                     Subject subject,
                     String name,
-                    Role role) {
+                    Role role,
+                    double weight) {
         super(loginName, password);
         this.workId = workId;
         this.subject = subject;
         this.setName(name);
         this.role = role;
+        this.weight = weight;
     }
 
     public MarkUser() {
@@ -123,4 +127,13 @@ public class MarkUser extends AbstractUser {
     public void setInspectSX(Boolean inspectSX) {
         this.inspectSX = inspectSX;
     }
+
+	public double getWeight() {
+		return weight;
+	}
+
+	public void setWeight(double weight) {
+		this.weight = weight;
+	}
+    
 }

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

@@ -127,4 +127,6 @@ public interface MarkTaskRepo extends JpaRepository<MarkTask, Long>, JpaSpecific
 
 	int countByWorkIdAndSubjectAndStageAndQuestionId(Long workId,MarkSubject markSubject, MarkStage level, Long id);
 
+	List<MarkTask> findByWorkIdAndSecretNumber(Long workId, String secretNumber);
+
 }

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

@@ -35,7 +35,7 @@ public class MarkTaskAssembler {
             else {
                 markTaskDTO.setLevel(paper.getLevel());
             }
-            markTaskDTO.setSn(paper.getSecretNumber());
+            markTaskDTO.setSn(markTask.getSecretNumber());
             markTaskDTO.setRedoLevel(paper.getRedoLevel());
             String imgSrc = systemConfig.getImageUrl(markTask.getWorkId(),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber());
             String thumbSrc = systemConfig.getThumbUrl(markTask.getWorkId(),paper.getSubject().toString(),paper.getAreaCode(),paper.getExamNumber());

+ 13 - 0
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/config/MarkingConfig.java

@@ -20,6 +20,11 @@ public class MarkingConfig {
      * 图片保存根目录
      */
     private String imagePath;
+    
+    /**
+     * 表示是否启用定档时数量大于半数,直接定档
+     */
+    private boolean majority;
 
     public int getDeviation() {
         return deviation;
@@ -36,5 +41,13 @@ public class MarkingConfig {
 	public void setImagePath(String imagePath) {
 		this.imagePath = imagePath;
 	}
+
+	public boolean isMajority() {
+		return majority;
+	}
+
+	public void setMajority(boolean majority) {
+		this.majority = majority;
+	}
     
 }

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

@@ -136,4 +136,5 @@ public class MarkTaskDTO implements Serializable{
 	public void setMarkByLeader(boolean markByLeader) {
 		this.markByLeader = markByLeader;
 	}
+	
 }

+ 26 - 18
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/DetermineLevelService.java

@@ -4,7 +4,7 @@ import java.util.Comparator;
 import java.util.Map;
 import java.util.Optional;
 import java.util.stream.Collectors;
-import java.util.stream.IntStream;
+import java.util.stream.DoubleStream;
 import java.util.stream.Stream;
 
 import org.springframework.beans.factory.annotation.Autowired;
@@ -12,7 +12,9 @@ import org.springframework.stereotype.Service;
 
 import cn.com.qmth.stmms.ms.core.domain.Level;
 import cn.com.qmth.stmms.ms.core.domain.task.MarkTask;
+import cn.com.qmth.stmms.ms.core.domain.user.MarkUser;
 import cn.com.qmth.stmms.ms.core.repository.LevelRepo;
+import cn.com.qmth.stmms.ms.core.repository.MarkUserRepo;
 
 /**
  * 定档
@@ -34,23 +36,27 @@ public class DetermineLevelService {
 
     @Autowired
     private LevelRepo levelRepo;
+    @Autowired
+    private MarkUserRepo markUserRepo;
 
-    public DeterResult determine(MarkTask...tasks){
-        //如果相同的数量大于半数,直接定档
-        Stream<MarkTask> taskStream = Stream.of(tasks);
-        Optional<Map.Entry<String,Long>> optional = taskStream
-                .collect(Collectors.groupingBy(i -> i.getResult().toString(), Collectors.counting()))
-                .entrySet()
-                .stream()
-                .max(Comparator.comparing(Map.Entry::getValue));
-        if(optional.isPresent()){
-            Map.Entry<String,Long> entry = optional.get();
-            if(entry.getValue() > tasks.length/2){
-                return new DeterResult(entry.getKey(),DeterType.MAJORITY);
-            }
-        }
+    public DeterResult determine(boolean majority,MarkTask...tasks){
+    	if(majority){
+    		//如果相同的数量大于半数,直接定档
+    		Stream<MarkTask> taskStream = Stream.of(tasks);
+    		Optional<Map.Entry<String,Long>> optional = taskStream
+    				.collect(Collectors.groupingBy(i -> i.getResult().toString(), Collectors.counting()))
+    				.entrySet()
+    				.stream()
+    				.max(Comparator.comparing(Map.Entry::getValue));
+    		if(optional.isPresent()){
+    			Map.Entry<String,Long> entry = optional.get();
+    			if(entry.getValue() > tasks.length/2){
+    				return new DeterResult(entry.getKey(),DeterType.MAJORITY);
+    			}
+    		}
+    	}
         //通过权重计算,平均值四舍五入
-        int[] values = new int[tasks.length];
+        double[] values = new double[tasks.length];
         Long workId = null;
         for (int i = 0; i < tasks.length; i++) {
             workId = tasks[i].getWorkId();
@@ -58,9 +64,11 @@ public class DetermineLevelService {
             if(level == null){
                 throw new RuntimeException("无此档位");
             }
-            values[i] = level.getWeight();
+            MarkUser marker = markUserRepo.findOne(tasks[i].getMarkerId());
+            double maekerWeight = marker.getWeight();
+            values[i] = level.getWeight()*maekerWeight;
         }
-        int avg = (int)Math.round(IntStream.of(values).average().orElse(0));
+        int avg = (int)Math.round(DoubleStream.of(values).average().orElse(0));
         Optional<Level> levelOptional = levelRepo.findByWorkId(workId).stream().filter(o -> o.getMaxScore() >= avg && o.getMinScore() <= avg).findFirst();
         Level level = levelOptional.orElseThrow(null);
         return new DeterResult(level.getCode(),DeterType.WEIGHT);

+ 5 - 19
stmms-ms-marking/src/main/java/cn/com/qmth/stmms/ms/marking/service/MarkingService.java

@@ -122,7 +122,7 @@ public class MarkingService {
                 paper.arbitrate();
             } else {
                 //定档
-                DeterResult determine = determineLevelService.determine(markTasks.toArray(sources));
+                DeterResult determine = determineLevelService.determine(markingConfig.isMajority(),markTasks.toArray(sources));
                 paper.determineLevel(determine.getResult());
                 if (determine.getDeterType() == DetermineLevelService.DeterType.WEIGHT) {
                     paper.setMarkedLogic(true);
@@ -223,24 +223,10 @@ public class MarkingService {
 	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;
+			int randomSeq = markTaskRepo.countByWorkIdAndSubjectAndMarkerIdAndStageAndQuestionId(m.getWorkId(), m.getSubject(),m.getMarkerId(), m.getStage(), m.getQuestionId());
+			m.setRandomSeq(randomSeq+1);
+			markTaskRepo.save(m);
+			return m;
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw new RuntimeException("该任务可能被占用,跳过失败");