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

3.3.0 更新识别对照接口

ting.yin 1 жил өмнө
parent
commit
ef30b2c4fe

+ 17 - 15
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanOmrTaskController.java

@@ -1,5 +1,7 @@
 package com.qmth.distributed.print.api.mark;
 
+import java.util.List;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -42,33 +44,33 @@ public class ScanOmrTaskController {
 
     @ApiOperation(value = "识别对照任务获取")
     @RequestMapping(value = "/get", method = RequestMethod.POST)
-    public Result get(@RequestParam Long id) {
+    public Result get(@RequestParam Long studentId) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(omrTaskService.getTask(id, user.getId()));
+        return ResultUtil.ok(omrTaskService.getTask(studentId, user.getId()));
     }
 
     @ApiOperation(value = "识别对照任务提交")
     @RequestMapping(value = "/save", method = RequestMethod.POST)
-    public Result save(@Validated @RequestBody ScanOmrTaskResultDto result) {
+    public Result save(@Validated @RequestBody List<ScanOmrTaskResultDto> result) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        return ResultUtil.ok(omrTaskService.submitTask(result, user));
+        return ResultUtil.ok(omrTaskService.submitTask(result, user.getId()));
     }
 
-//    @ApiOperation(value = "识别对照任务状态")
-//    @RequestMapping(value = "/status", method = RequestMethod.POST)
-//    public Result status(@RequestParam Long examId) {
-//        SysUser user = (SysUser) ServletUtil.getRequestUser();
-//        return ResultUtil.ok(omrTaskService.getStatus(examId, user.getId()));
-//    }
-
     @ApiOperation(value = "识别对照任务状态")
-    @RequestMapping(value = "/release", method = RequestMethod.POST)
-    public Result release(@RequestParam Long examId) {
+    @RequestMapping(value = "/status", method = RequestMethod.POST)
+    public Result status(@RequestParam Long examId) {
         SysUser user = (SysUser) ServletUtil.getRequestUser();
-        omrTaskService.releaseByUser(examId, user.getId());
-        return ResultUtil.ok(true);
+        return ResultUtil.ok(omrTaskService.getStatus(examId, user.getId()));
     }
 
+//    @ApiOperation(value = "识别对照任务状态")
+//    @RequestMapping(value = "/release", method = RequestMethod.POST)
+//    public Result release(@RequestParam Long examId) {
+//        SysUser user = (SysUser) ServletUtil.getRequestUser();
+//        omrTaskService.releaseByUser(examId, user.getId());
+//        return ResultUtil.ok(true);
+//    }
+
     @ApiOperation(value = "识别对照任务列表")
     @RequestMapping(value = "/list", method = RequestMethod.POST)
     public Result list(@RequestParam Long examId,

+ 91 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/ScanOmrStudent.java

@@ -0,0 +1,91 @@
+package com.qmth.teachcloud.mark.dto;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ScanOmrStudent {
+
+	private String studentCode;
+
+	private String studentName;
+
+	private Integer cardNumber;
+	
+	private String courseCode;
+
+	private String courseName;
+
+	private String coursePaperId;
+
+	private String coursePaperNumber;
+	
+	private List<ScanOmrTaskDto> tasks;
+	
+	public  ScanOmrStudent (){
+		this.tasks = new ArrayList<ScanOmrTaskDto>();
+	}
+	public String getStudentCode() {
+		return studentCode;
+	}
+
+	public void setStudentCode(String studentCode) {
+		this.studentCode = studentCode;
+	}
+
+	public String getStudentName() {
+		return studentName;
+	}
+
+	public void setStudentName(String studentName) {
+		this.studentName = studentName;
+	}
+
+	public Integer getCardNumber() {
+		return cardNumber;
+	}
+
+	public void setCardNumber(Integer cardNumber) {
+		this.cardNumber = cardNumber;
+	}
+
+	public String getCourseCode() {
+		return courseCode;
+	}
+
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+
+	public String getCourseName() {
+		return courseName;
+	}
+
+	public void setCourseName(String courseName) {
+		this.courseName = courseName;
+	}
+
+	public String getCoursePaperId() {
+		return coursePaperId;
+	}
+
+	public void setCoursePaperId(String coursePaperId) {
+		this.coursePaperId = coursePaperId;
+	}
+
+	public String getCoursePaperNumber() {
+		return coursePaperNumber;
+	}
+
+	public void setCoursePaperNumber(String coursePaperNumber) {
+		this.coursePaperNumber = coursePaperNumber;
+	}
+
+	public List<ScanOmrTaskDto> getTasks() {
+		return tasks;
+	}
+
+	public void setTasks(List<ScanOmrTaskDto> tasks) {
+		this.tasks = tasks;
+	}
+
+}

+ 35 - 77
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/ScanOmrTaskDto.java

@@ -4,96 +4,54 @@ import java.util.List;
 
 public class ScanOmrTaskDto {
 
-    private Long id;
+	private Long id;
 
-    private String studentCode;
+	private String conditions;
 
-    private String name;
+	private Long paperId;
 
-    private String subjectCode;
+	private Integer paperIndex;
 
-    private String subjectName;
+	private List<ScanOmrTaskPageDto> pages;
 
-    private Integer cardNumber;
+	public Long getId() {
+		return id;
+	}
 
-    private Long paperId;
+	public void setId(Long id) {
+		this.id = id;
+	}
 
-    private Integer paperIndex;
+	public String getConditions() {
+		return conditions;
+	}
 
-    private List<ScanOmrTaskPageDto> pages;
-    
-    
+	public void setConditions(String conditions) {
+		this.conditions = conditions;
+	}
 
-    public Long getId() {
-        return id;
-    }
+	public Long getPaperId() {
+		return paperId;
+	}
 
-    public void setId(Long id) {
-        this.id = id;
-    }
+	public void setPaperId(Long paperId) {
+		this.paperId = paperId;
+	}
 
-    public String getStudentCode() {
-        return studentCode;
-    }
+	public Integer getPaperIndex() {
+		return paperIndex;
+	}
 
-    public void setStudentCode(String studentCode) {
-        this.studentCode = studentCode;
-    }
+	public void setPaperIndex(Integer paperIndex) {
+		this.paperIndex = paperIndex;
+	}
 
-    public String getName() {
-        return name;
-    }
+	public List<ScanOmrTaskPageDto> getPages() {
+		return pages;
+	}
 
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getSubjectCode() {
-        return subjectCode;
-    }
-
-    public void setSubjectCode(String subjectCode) {
-        this.subjectCode = subjectCode;
-    }
-
-    public String getSubjectName() {
-        return subjectName;
-    }
-
-    public void setSubjectName(String subjectName) {
-        this.subjectName = subjectName;
-    }
-
-    public Integer getCardNumber() {
-        return cardNumber;
-    }
-
-    public void setCardNumber(Integer cardNumber) {
-        this.cardNumber = cardNumber;
-    }
-
-    public Long getPaperId() {
-        return paperId;
-    }
-
-    public void setPaperId(Long paperId) {
-        this.paperId = paperId;
-    }
-
-    public Integer getPaperIndex() {
-        return paperIndex;
-    }
-
-    public void setPaperIndex(Integer paperIndex) {
-        this.paperIndex = paperIndex;
-    }
-
-    public List<ScanOmrTaskPageDto> getPages() {
-        return pages;
-    }
-
-    public void setPages(List<ScanOmrTaskPageDto> pages) {
-        this.pages = pages;
-    }
+	public void setPages(List<ScanOmrTaskPageDto> pages) {
+		this.pages = pages;
+	}
 
 }

+ 10 - 31
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/ScanOmrTaskSaveDto.java

@@ -2,27 +2,24 @@ package com.qmth.teachcloud.mark.dto;
 
 public class ScanOmrTaskSaveDto {
 
-    private Long id;
+    private Long studentId;
 
     private Long updateTime;
 
-    private ScanOmrTaskStatusDto status;
-    
-    private boolean arbitrate;
-
     public ScanOmrTaskSaveDto() {
-        this.status = new ScanOmrTaskStatusDto();
     }
 
-    public Long getId() {
-        return id;
-    }
+    public Long getStudentId() {
+		return studentId;
+	}
 
-    public void setId(Long id) {
-        this.id = id;
-    }
 
-    public Long getUpdateTime() {
+	public void setStudentId(Long studentId) {
+		this.studentId = studentId;
+	}
+
+
+	public Long getUpdateTime() {
         return updateTime;
     }
 
@@ -30,23 +27,5 @@ public class ScanOmrTaskSaveDto {
         this.updateTime = updateTime;
     }
 
-    public ScanOmrTaskStatusDto getStatus() {
-        return status;
-    }
-
-    public void setStatus(ScanOmrTaskStatusDto status) {
-        this.status = status;
-    }
-
-    
-    public boolean isArbitrate() {
-        return arbitrate;
-    }
-
-    
-    public void setArbitrate(boolean arbitrate) {
-        this.arbitrate = arbitrate;
-    }
-
 
 }

+ 28 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/ScanStudentDto.java

@@ -0,0 +1,28 @@
+package com.qmth.teachcloud.mark.dto;
+
+public class ScanStudentDto {
+	private Long studentId;
+	private String studentCode;
+	private String studentName;
+	public Long getStudentId() {
+		return studentId;
+	}
+	public void setStudentId(Long studentId) {
+		this.studentId = studentId;
+	}
+	public String getStudentCode() {
+		return studentCode;
+	}
+	public void setStudentCode(String studentCode) {
+		this.studentCode = studentCode;
+	}
+	public String getStudentName() {
+		return studentName;
+	}
+	public void setStudentName(String studentName) {
+		this.studentName = studentName;
+	}
+	
+	
+}
+

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/ScanOmrTaskMapper.java

@@ -5,6 +5,7 @@ import java.util.List;
 import org.apache.ibatis.annotations.Param;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.teachcloud.mark.dto.ScanStudentDto;
 import com.qmth.teachcloud.mark.entity.ScanOmrTask;
 import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
 
@@ -21,4 +22,7 @@ public interface ScanOmrTaskMapper extends BaseMapper<ScanOmrTask> {
 	List<ScanOmrTask> findUnMarked(@Param(value = "examId") Long examId, @Param(value = "pageNumber") int pageNumber,
 			@Param(value = "pageSize") int pageSize, @Param(value = "status") OmrTaskStatus status);
 
+	List<ScanStudentDto> listByExamIdAndStatusAndUserId(@Param(value = "examId") Long examId,
+			@Param(value = "status") OmrTaskStatus status, @Param(value = "userId") Long userId);
+
 }

+ 7 - 22
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanOmrTaskService.java

@@ -2,14 +2,13 @@ package com.qmth.teachcloud.mark.service;
 
 import java.util.List;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.scan.ConditionType;
-import com.qmth.teachcloud.mark.dto.ScanOmrTaskDto;
+import com.qmth.teachcloud.mark.dto.ScanOmrStudent;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskResultDto;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskSaveDto;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskStatusDto;
+import com.qmth.teachcloud.mark.dto.ScanStudentDto;
 import com.qmth.teachcloud.mark.entity.ScanOmrTask;
 import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
 
@@ -25,34 +24,20 @@ public interface ScanOmrTaskService extends IService<ScanOmrTask> {
 	
 	ScanOmrTask buildTask(ConditionType c, Long studentId);
 
-	ScanOmrTaskDto getTask(Long id, Long userId);
+	ScanOmrStudent getTask(Long studentId, Long userId);
 
-	ScanOmrTaskSaveDto submitTask(ScanOmrTaskResultDto result, SysUser user);
+	ScanOmrTaskSaveDto submitTask(List<ScanOmrTaskResultDto> result, Long userId);
 
 	ScanOmrTaskStatusDto getStatus(Long examId, Long userId);
 
-	void releaseByUser(Long examId, Long userId);
+	int getStudentCountByExamAndStatusAndUserId(Long examId, Long userId, OmrTaskStatus status);
 
-	ScanOmrTaskDto history(Long examId, Long taskId, Long userId, Boolean next);
-
-	List<ScanOmrTask> findUnMarked(Long examId, int pageNumber, int pageSize, OmrTaskStatus status);
-
-	boolean hasApplied(ScanOmrTask task, String userId);
-
-	boolean apply(ScanOmrTask task, String userId);
-
-	int getCountByExamAndStatusAndUserId(Long examId, Long userId, OmrTaskStatus... status);
-
-	int getCountByExamAndStatus(Long examId, OmrTaskStatus... status);
-
-	boolean hasApplied(ScanOmrTask t, Long userId);
-
-	void releaseByTask(ScanOmrTask t);
+	int getStudentCountByExamAndStatus(Long examId, OmrTaskStatus status);
 
 	void deleteByStudentId(Long examId, Long studentId);
 
 	int getCount(Long examId, OmrTaskStatus status);
 
-	IPage<ScanOmrTaskDto> list(Long examId, OmrTaskStatus status, Long userId);
+	List<ScanStudentDto> list(Long examId, OmrTaskStatus status, Long userId);
 
 }

+ 136 - 244
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanOmrTaskServiceImpl.java

@@ -16,13 +16,10 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.concurrent.service.ConcurrentService;
 import com.qmth.boot.core.exception.ParameterException;
 import com.qmth.teachcloud.common.entity.MarkQuestion;
-import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.enums.QuestionType;
 import com.qmth.teachcloud.common.enums.ScanStatus;
@@ -32,12 +29,14 @@ import com.qmth.teachcloud.mark.bean.OmrTaskItem;
 import com.qmth.teachcloud.mark.bean.OmrTaskPage;
 import com.qmth.teachcloud.mark.dto.OmrTaskDto;
 import com.qmth.teachcloud.mark.dto.OmrTaskPageDto;
+import com.qmth.teachcloud.mark.dto.ScanOmrStudent;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskDto;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskPageDto;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskResultDto;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskResultPageDto;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskSaveDto;
 import com.qmth.teachcloud.mark.dto.ScanOmrTaskStatusDto;
+import com.qmth.teachcloud.mark.dto.ScanStudentDto;
 import com.qmth.teachcloud.mark.entity.MarkStudent;
 import com.qmth.teachcloud.mark.entity.ScanOmrTask;
 import com.qmth.teachcloud.mark.entity.ScanPaper;
@@ -52,8 +51,6 @@ import com.qmth.teachcloud.mark.service.ScanOmrTaskService;
 import com.qmth.teachcloud.mark.service.ScanPaperPageService;
 import com.qmth.teachcloud.mark.service.ScanPaperService;
 import com.qmth.teachcloud.mark.service.ScanStudentPaperService;
-import com.qmth.teachcloud.mark.utils.TaskLock;
-import com.qmth.teachcloud.mark.utils.TaskLockUtil;
 
 /**
  * <p>
@@ -337,213 +334,174 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
 	}
 
 	@Override
-	public ScanOmrTaskDto getTask(Long id, Long userId) {
-//		int retry = 0;
-//		ScanOmrTaskDto task = null;
-//		while (task == null) {
-//			List<ScanOmrTask> list = this.findUnMarked(examId, retry * 20, 20, OmrTaskStatus.WAITING);
-//			if (list.isEmpty()) {
-//				break;
-//			}
-//			for (ScanOmrTask t : list) {
-//				if (this.apply(t, userId.toString())) {
-//					task = toTaskVo(t, false);
-//					break;
-//				}
-//			}
-//			if (task == null) {
-//				retry++;
-//			}
-//		}
-//		if (task == null) {
-//			throw ExceptionResultEnum.ERROR.exception("没有识别对照任务");
-//		}
-		ScanOmrTaskDto task = null;
-		ScanOmrTask t = this.getById(id);
-		if (t == null) {
+	public ScanOmrStudent getTask(Long studentId, Long userId) {
+		MarkStudent student = studentService.getById(studentId);
+		if(student==null) {
 			throw ExceptionResultEnum.ERROR.exception("没有识别对照任务");
 		}
-		if (this.apply(t, userId.toString())) {
-			task = toTaskVo(t, false);
+		QueryWrapper<ScanOmrTask> wrapper = new QueryWrapper<>();
+		LambdaQueryWrapper<ScanOmrTask> lw = wrapper.lambda();
+		lw.eq(ScanOmrTask::getStudentId, studentId);
+		List<ScanOmrTask> list =  baseMapper.selectList(wrapper);
+		if (list.isEmpty()) {
+			throw ExceptionResultEnum.ERROR.exception("没有识别对照任务");
 		}
-		return task;
+		ScanOmrStudent scanOmrStudent = new ScanOmrStudent();
+		scanOmrStudent.setCardNumber(student.getCardNumber());
+		scanOmrStudent.setStudentCode(student.getStudentCode());
+		scanOmrStudent.setStudentName(student.getStudentName());
+		scanOmrStudent.setCourseCode(student.getCourseCode());
+		scanOmrStudent.setCourseName(student.getCourseName());
+		scanOmrStudent.setCoursePaperId(student.getCoursePaperId());
+		scanOmrStudent.setCoursePaperNumber(student.getPaperNumber());
+		scanOmrStudent.setTasks(toTaskVo(list));
+		return scanOmrStudent;
 	}
 
-	private ScanOmrTaskDto toTaskVo(ScanOmrTask task, boolean history) {
-		ScanOmrTaskDto vo = new ScanOmrTaskDto();
-		MarkStudent student = studentService.getById(task.getStudentId());
-		vo.setCardNumber(task.getCardNumber());
-		vo.setStudentCode(student.getStudentCode());
-		vo.setId(task.getId());
-		vo.setName(student.getStudentName());
-		vo.setPaperId(task.getPaperId());
-		vo.setPaperIndex(task.getPaperIndex());
-		vo.setSubjectCode(student.getCourseCode());
-		vo.setSubjectName(student.getCourseName());
-		List<ScanOmrTaskPageDto> pages = new ArrayList<>();
-		for (OmrTaskPage taskPage : task.getPages()) {
-			ScanOmrTaskPageDto page = new ScanOmrTaskPageDto();
-			Map<Integer, List<String>> question = new HashMap<>();
-			Map<Integer, List<String>> selective = new HashMap<>();
-			for (OmrTaskItem item : taskPage.getItems()) {
-				if (OmrField.ABSENT.equals(item.getField())) {
-					page.setAbsent(getBooleanItem(item, history));
-				}
-				if (OmrField.BREACH.equals(item.getField())) {
-					page.setBreach(getBooleanItem(item, history));
+	private List<ScanOmrTaskDto> toTaskVo(List<ScanOmrTask> tasks) {
+		List<ScanOmrTaskDto> list = new ArrayList<ScanOmrTaskDto>();
+		for (ScanOmrTask task : tasks) {
+			ScanOmrTaskDto vo = new ScanOmrTaskDto();
+			vo.setId(task.getId());
+			vo.setPaperId(task.getPaperId());
+			vo.setPaperIndex(task.getPaperIndex());
+			vo.setConditions(task.getConditions());
+			List<ScanOmrTaskPageDto> pages = new ArrayList<>();
+			for (OmrTaskPage taskPage : task.getPages()) {
+				ScanOmrTaskPageDto page = new ScanOmrTaskPageDto();
+				Map<Integer, List<String>> question = new HashMap<>();
+				Map<Integer, List<String>> selective = new HashMap<>();
+				for (OmrTaskItem item : taskPage.getItems()) {
+					if (OmrField.ABSENT.equals(item.getField())) {
+						page.setAbsent(getBooleanItem(item));
+					}
+					if (OmrField.BREACH.equals(item.getField())) {
+						page.setBreach(getBooleanItem(item));
+					}
+					if (OmrField.PAPER_TYPE.equals(item.getField())) {
+						page.setPaperType(getStringItem(item));
+					}
+					if (OmrField.QUESTION.equals(item.getField())) {
+						List<String> content = getStringItem(item);
+						if (content != null) {
+							question.put(item.getIndex(), content);
+						}
+					}
+					if (OmrField.SELECTIVE.equals(item.getField())) {
+						List<String> content = getStringItem(item);
+						if (content != null) {
+							selective.put(item.getIndex(), content);
+						}
+					}
 				}
-				if (OmrField.PAPER_TYPE.equals(item.getField())) {
-					page.setPaperType(getStringItem(item, history));
+				if (question.size() > 0) {
+					page.setQuestion(question);
 				}
-				if (OmrField.QUESTION.equals(item.getField())) {
-					List<String> content = getStringItem(item, history);
-					if (content != null) {
-						question.put(item.getIndex(), content);
-					}
+				if (selective.size() > 0) {
+					page.setSelective(selective);
 				}
-				if (OmrField.SELECTIVE.equals(item.getField())) {
-					List<String> content = getStringItem(item, history);
-					if (content != null) {
-						selective.put(item.getIndex(), content);
-					}
+				// 有需要仲裁的数据才返回结构
+				if (page.getAbsent() != null || page.getBreach() != null || page.getPaperType() != null
+						|| page.getQuestion() != null || page.getSelective() != null) {
+					page.setIndex(taskPage.getIndex());
+					ScanPaperPage p = pageService.findPaperIdAndIndex(task.getPaperId(), taskPage.getIndex());
+					page.setRecogData(p.getRecogData());
+					page.setUri(p.getSheetPath());
+					pages.add(page);
 				}
 			}
-			if (question.size() > 0) {
-				page.setQuestion(question);
-			}
-			if (selective.size() > 0) {
-				page.setSelective(selective);
-			}
-			// 有需要仲裁的数据才返回结构
-			if (page.getAbsent() != null || page.getBreach() != null || page.getPaperType() != null
-					|| page.getQuestion() != null || page.getSelective() != null) {
-				page.setIndex(taskPage.getIndex());
-				ScanPaperPage p = pageService.findPaperIdAndIndex(task.getPaperId(), taskPage.getIndex());
-				page.setRecogData(p.getRecogData());
-				page.setUri(p.getSheetPath());
-				pages.add(page);
-			}
+			vo.setPages(pages);
+			list.add(vo);
 		}
-		vo.setPages(pages);
-		return vo;
+		return list;
 	}
 
-	private List<String> getStringItem(OmrTaskItem item, boolean history) {
+	private List<String> getStringItem(OmrTaskItem item) {
 		List<String> value = new ArrayList<>();
 		value.add(item.getOmrResult());
-		if (history && item.getFirstResult() != null && item.getSecondResult() == null) {
+		if (item.getFirstResult() != null && item.getSecondResult() == null) {
 			value.add(item.getFirstResult());
-		} else if (history && item.getSecondResult() != null) {
+		} else if (item.getSecondResult() != null) {
 			value.add(item.getSecondResult());
 		}
 		return value;
 	}
 
-	private List<Boolean> getBooleanItem(OmrTaskItem item, boolean history) {
+	private List<Boolean> getBooleanItem(OmrTaskItem item) {
 		List<Boolean> value = new ArrayList<>();
 		value.add(Boolean.valueOf(item.getOmrResult()));
-		if (history && item.getFirstResult() != null && item.getSecondResult() == null) {
+		if (item.getFirstResult() != null && item.getSecondResult() == null) {
 			value.add(Boolean.valueOf(item.getFirstResult()));
-		} else if (history && item.getSecondResult() != null) {
+		} else if (item.getSecondResult() != null) {
 			value.add(Boolean.valueOf(item.getSecondResult()));
 		}
 		return value;
 	}
 
-	@Override
-	public List<ScanOmrTask> findUnMarked(Long examId, int pageNumber, int pageSize, OmrTaskStatus status) {
-		return this.baseMapper.findUnMarked(examId, pageNumber, pageSize, status);
-	}
-
-	@Override
-	public boolean apply(ScanOmrTask t, String userId) {
-		TaskLock taskLock = TaskLockUtil.getOmrTask(t.getExamId().toString());
-		boolean lock = taskLock.add(t.getId(), 1, userId);
-		// 上锁失败直接返回
-		if (!lock) {
-			return false;
-		}
-		// 重复校验任务状态
-		if (t.getStatus().equals(OmrTaskStatus.WAITING)) {
-			return true;
-		} else {
-			taskLock.remove(t.getId(), 1);
-			return false;
-		}
-	}
-
-	@Override
-	public boolean hasApplied(ScanOmrTask t, String userId) {
-		TaskLock taskLock = TaskLockUtil.getOmrTask(t.getExamId().toString());
-		return taskLock.exist(t.getId(), 1, userId);
-	}
-
 	@Override
 	@Transactional
-	public ScanOmrTaskSaveDto submitTask(@NotNull ScanOmrTaskResultDto result, @NotNull SysUser user) {
-		ScanOmrTask task = this.getById(result.getId());
-		if (task == null) {
-			throw new ParameterException("任务不存在");
-		}
-		// if (TaskStatus.PROCESSED.equals(task.getStatus())) {
-		// throw new ParameterException("任务已处理");
-		// }
-		if (!task.getUserId().equals(user.getId())) {
-			throw new ParameterException("任务非本人领取");
-		}
-		if (OmrTaskStatus.WAITING.equals(task.getStatus()) && !hasApplied(task, user.getId())) {
-			throw new ParameterException("任务非本人领取");
-		}
-		concurrentService.getReadWriteLock(LockType.STUDENT + "-" + task.getStudentId()).writeLock().lock();
-
-		for (OmrTaskPage page : task.getPages()) {
-			ScanOmrTaskResultPageDto pageVo = result.findPage(page.getIndex());
-			if (pageVo == null) {
-				throw new ParameterException("page[" + page.getIndex() + "]不存在");
+	public ScanOmrTaskSaveDto submitTask(@NotNull List<ScanOmrTaskResultDto> results, @NotNull Long userId) {
+		Long studentId = null;
+		for (ScanOmrTaskResultDto result : results) {
+			ScanOmrTask task = this.getById(result.getId());
+			if (task == null) {
+				throw new ParameterException("任务不存在");
 			}
-			for (OmrTaskItem item : page.getItems()) {
-				if (OmrField.ABSENT.equals(item.getField())) {
-					if (pageVo.getAbsent() == null) {
-						throw new ParameterException("page[" + page.getIndex() + "].absent不存在");
-					}
-					item.setFirstResult(pageVo.getAbsent().toString());
+			if(studentId == null ) {
+				studentId = task.getStudentId();
+			}
+			if(studentId != task.getStudentId()) {
+				throw new ParameterException("任务非同一个学生");
+			}
+			concurrentService.getReadWriteLock(LockType.STUDENT + "-" + task.getStudentId()).writeLock().lock();
+
+			for (OmrTaskPage page : task.getPages()) {
+				ScanOmrTaskResultPageDto pageVo = result.findPage(page.getIndex());
+				if (pageVo == null) {
+					throw new ParameterException("page[" + page.getIndex() + "]不存在");
 				}
-				if (OmrField.BREACH.equals(item.getField())) {
-					if (pageVo.getBreach() == null) {
-						throw new ParameterException("page[" + page.getIndex() + "].breach不存在");
+				for (OmrTaskItem item : page.getItems()) {
+					if (OmrField.ABSENT.equals(item.getField())) {
+						if (pageVo.getAbsent() == null) {
+							throw new ParameterException("page[" + page.getIndex() + "].absent不存在");
+						}
+						item.setFirstResult(pageVo.getAbsent().toString());
 					}
-					item.setFirstResult(pageVo.getBreach().toString());
-				}
-				if (OmrField.QUESTION.equals(item.getField())) {
-					String content = pageVo.getQuestion() != null ? pageVo.getQuestion().get(item.getIndex()) : null;
-					if (content == null) {
-						throw new ParameterException(
-								"page[" + page.getIndex() + "].question[" + item.getIndex() + "]不存在");
+					if (OmrField.BREACH.equals(item.getField())) {
+						if (pageVo.getBreach() == null) {
+							throw new ParameterException("page[" + page.getIndex() + "].breach不存在");
+						}
+						item.setFirstResult(pageVo.getBreach().toString());
 					}
-					item.setFirstResult(content);
-				}
-				if (OmrField.SELECTIVE.equals(item.getField())) {
-					String content = pageVo.getSelective() != null ? pageVo.getSelective().get(item.getIndex()) : null;
-					if (content == null) {
-						throw new ParameterException(
-								"page[" + page.getIndex() + "].selective[" + item.getIndex() + "]不存在");
+					if (OmrField.QUESTION.equals(item.getField())) {
+						String content = pageVo.getQuestion() != null ? pageVo.getQuestion().get(item.getIndex()) : null;
+						if (content == null) {
+							throw new ParameterException(
+									"page[" + page.getIndex() + "].question[" + item.getIndex() + "]不存在");
+						}
+						item.setFirstResult(content);
+					}
+					if (OmrField.SELECTIVE.equals(item.getField())) {
+						String content = pageVo.getSelective() != null ? pageVo.getSelective().get(item.getIndex()) : null;
+						if (content == null) {
+							throw new ParameterException(
+									"page[" + page.getIndex() + "].selective[" + item.getIndex() + "]不存在");
+						}
+						item.setFirstResult(content);
 					}
-					item.setFirstResult(content);
 				}
 			}
-		}
-		task.setStatus(OmrTaskStatus.PROCESSED);
+			task.setStatus(OmrTaskStatus.PROCESSED);
 
-		updatePaperResult(result, task.getPaperId(), user.getId());
-		task.setUserId(user.getId());
-		task.setUpdateTime(System.currentTimeMillis());
-		this.saveOrUpdate(task);
-		this.releaseByTask(task);
-		concurrentService.getReadWriteLock(LockType.STUDENT + "-" + task.getStudentId()).writeLock().unlock();
+			updatePaperResult(result, task.getPaperId(),userId);
+			task.setUserId(userId);
+			task.setUpdateTime(System.currentTimeMillis());
+			this.saveOrUpdate(task);
+			concurrentService.getReadWriteLock(LockType.STUDENT + "-" + task.getStudentId()).writeLock().unlock();
+		}
 		ScanOmrTaskSaveDto vo = new ScanOmrTaskSaveDto();
-		vo.setId(result.getId());
+		vo.setStudentId(studentId);
 		vo.setUpdateTime(System.currentTimeMillis());
-		vo.setStatus(this.getStatus(task.getExamId(), user.getId()));
 		return vo;
 	}
 
@@ -570,18 +528,6 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
 		studentService.updateStudentByPaper(userId, sp.getStudentId(), false);
 	}
 
-	@Override
-	public boolean hasApplied(ScanOmrTask t, Long userId) {
-		TaskLock taskLock = TaskLockUtil.getOmrTask(t.getExamId().toString());
-		return taskLock.exist(t.getId(), 1, userId.toString());
-	}
-
-	@Override
-	public void releaseByTask(ScanOmrTask t) {
-		TaskLock taskLock = TaskLockUtil.getOmrTask(t.getExamId().toString());
-		taskLock.remove(t.getId(), 1);
-	}
-
 	@Override
 	public ScanOmrTaskStatusDto getStatus(Long examId, Long userId) {
 		ScanOmrTaskStatusDto status = new ScanOmrTaskStatusDto();
@@ -591,68 +537,22 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
 	}
 
 	@Override
-	public int getCountByExamAndStatusAndUserId(Long examId, Long userId, OmrTaskStatus... status) {
+	public int getStudentCountByExamAndStatusAndUserId(Long examId, Long userId, OmrTaskStatus status) {
 		QueryWrapper<ScanOmrTask> wrapper = new QueryWrapper<>();
 		LambdaQueryWrapper<ScanOmrTask> lw = wrapper.lambda();
-		lw.and(param -> {
-			for (OmrTaskStatus taskStatus : status) {
-				param.or().eq(ScanOmrTask::getStatus, taskStatus);
-			}
-		});
 		lw.eq(ScanOmrTask::getUserId, userId);
 		lw.eq(ScanOmrTask::getExamId, examId);
 		return this.count(wrapper);
 	}
 
 	@Override
-	public int getCountByExamAndStatus(Long examId, OmrTaskStatus... status) {
+	public int getStudentCountByExamAndStatus(Long examId, OmrTaskStatus status) {
 		QueryWrapper<ScanOmrTask> wrapper = new QueryWrapper<>();
 		LambdaQueryWrapper<ScanOmrTask> lw = wrapper.lambda();
-		lw.and(param -> {
-			for (OmrTaskStatus taskStatus : status) {
-				param.or().eq(ScanOmrTask::getStatus, taskStatus);
-			}
-		});
 		lw.eq(ScanOmrTask::getExamId, examId);
 		return this.count(wrapper);
 	}
 
-	@Override
-	public void releaseByUser(Long examId, Long userId) {
-		TaskLock taskLock = TaskLockUtil.getOmrTask(examId.toString());
-		taskLock.clear(userId.toString());
-	}
-
-	@Override
-	public ScanOmrTaskDto history(Long examId, Long taskId, Long userId, Boolean next) {
-		ScanOmrTask cur = null;
-		if (taskId != null) {
-			cur = this.getById(taskId);
-		}
-		QueryWrapper<ScanOmrTask> wrapper = new QueryWrapper<>();
-		LambdaQueryWrapper<ScanOmrTask> lw = wrapper.lambda();
-		lw.eq(ScanOmrTask::getExamId, examId);
-		lw.eq(ScanOmrTask::getUserId, userId);
-		lw.eq(ScanOmrTask::getStatus, OmrTaskStatus.PROCESSED);
-		if (next != null && next) {
-			if (taskId != null) {
-				lw.gt(ScanOmrTask::getId, cur.getId());
-			}
-			lw.orderByAsc(ScanOmrTask::getId);
-		} else {
-			if (taskId != null) {
-				lw.lt(ScanOmrTask::getId, cur.getId());
-			}
-			lw.orderByDesc(ScanOmrTask::getId);
-		}
-		wrapper.last("LIMIT 1");
-		ScanOmrTask task = this.baseMapper.selectOne(wrapper);
-		if (task == null) {
-			throw ExceptionResultEnum.ERROR.exception("没有识别对照任务");
-		}
-		return toTaskVo(task, true);
-	}
-
 	@Transactional
 	@Override
 	public void deleteByStudentId(Long examId, Long studentId) {
@@ -680,18 +580,10 @@ public class ScanOmrTaskServiceImpl extends ServiceImpl<ScanOmrTaskMapper, ScanO
 	}
 
 	@Override
-	public IPage<ScanOmrTaskDto> list(Long examId, OmrTaskStatus status, Long userId) {
-		QueryWrapper<ScanOmrTask> wrapper = new QueryWrapper<>();
-        LambdaQueryWrapper<ScanOmrTask> lw = wrapper.lambda();
-        lw.eq(ScanOmrTask::getExamId, examId);
-        lw.eq(ScanOmrTask::getStatus, status);
-		IPage<ScanOmrTask> list =this.baseMapper.selectPage(new Page<>(0, 20), null);
-		IPage<ScanOmrTaskDto> result = new Page<ScanOmrTaskDto>();
-		result.setCurrent(list.getCurrent());
-		result.setPages(list.getPages());
-		result.setRecords(null);
-		result.setSize(list.getSize());
-		result.setTotal(list.getTotal());
-		return result; 
+	public List<ScanStudentDto> list(Long examId, OmrTaskStatus status, Long userId) {
+		if(status.equals(OmrTaskStatus.WAITING)) {
+			userId = null;
+		}
+		return this.baseMapper.listByExamIdAndStatusAndUserId(examId,status,userId); 
 	}
 }

+ 21 - 1
teachcloud-mark/src/main/resources/mapper/ScanOmrTaskMapper.xml

@@ -21,7 +21,7 @@
 			typeHandler="com.qmth.teachcloud.mark.handle.OmrTaskPageListTypeHandler" />
     </resultMap>
     
-    <select id="findUnMarked" resultMap="BaseResultMap">
+    <select id="findUnMarked" resultMap="com.qmth.teachcloud.mark.entity.ScanOmrTask">
 		select *
 		from scan_omr_task t
 		where t.exam_id=#{examId}
@@ -31,5 +31,25 @@
 		limit
 		#{pageNumber},#{pageSize}
 	</select>
+	
+	   <select id="listByExamIdAndStatusAndUserId" resultMap="com.qmth.teachcloud.mark.dto.ScanStudentDto">
+		select 
+			s.id,
+			s.student_name,
+			s.student_code
+		from mark_student s where s.id in(
+			select DISTINCT(t.student_id)
+			from scan_omr_task t
+			where 
+			t.exam_id=#{examId}
+			and t.status=#{status}
+			<if test="userId == null or userId == ''">
+			and t.user_id is null
+			</if>
+			<if test="userId != null and userId != ''">
+			and t.user_id=#{userId}
+			</if>
+		)
+	</select>
 
 </mapper>