Parcourir la source

查询答题卡扫描详情

xiatian il y a 1 an
Parent
commit
d80f136d4d
20 fichiers modifiés avec 888 ajouts et 25 suppressions
  1. 13 0
      distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanAnswerController.java
  2. 60 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerPageVo.java
  3. 38 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerPaperVo.java
  4. 151 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerQueryDomain.java
  5. 245 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerQueryVo.java
  6. 33 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/StudentPaperVo.java
  7. 12 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java
  8. 7 6
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/ScanPaper.java
  9. 26 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/ExamStatus.java
  10. 4 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/MarkStudentMapper.java
  11. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/ScanPaperMapper.java
  12. 4 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java
  13. 2 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPaperPageService.java
  14. 3 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPaperService.java
  15. 141 17
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java
  16. 9 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperPageServiceImpl.java
  17. 7 1
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperServiceImpl.java
  18. 52 0
      teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/BatchGetDataUtil.java
  19. 62 0
      teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml
  20. 16 0
      teachcloud-mark/src/main/resources/mapper/ScanPaperMapper.xml

+ 13 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/ScanAnswerController.java

@@ -9,13 +9,17 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.multipart.MultipartFile;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qmth.boot.api.constant.ApiConstant;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.util.ServletUtil;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
 import com.qmth.teachcloud.mark.bean.scananswer.SheetUploadVo;
 import com.qmth.teachcloud.mark.dto.refix.AnswerRefixDomain;
 import com.qmth.teachcloud.mark.dto.refix.AnswerRefixVo;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
 import com.qmth.teachcloud.mark.service.ScanBatchService;
 import com.qmth.teachcloud.mark.service.ScanRefixBatchService;
 
@@ -40,6 +44,9 @@ public class ScanAnswerController {
 	
 	@Autowired
 	private ScanBatchService scanBatchService;
+	
+	@Autowired
+	private MarkStudentService markStudentService;
 
 	@ApiOperation(value = "答题卡二次识别")
 	@RequestMapping(value = "refix", method = RequestMethod.POST)
@@ -55,5 +62,11 @@ public class ScanAnswerController {
 			@RequestParam MultipartFile file, @RequestParam String md5) {
 		return scanBatchService.sheetUpload(batchId, coursePaperId,studentCode, paperNumber, pageIndex, file, md5);
 	}
+	
+    @ApiOperation(value = "查询答题卡扫描详情")
+    @RequestMapping(value = "query", method = RequestMethod.POST)
+    public IPage<AnswerQueryVo> query(@Validated AnswerQueryDomain query) {
+        return markStudentService.query(query);
+    }
 
 }

+ 60 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerPageVo.java

@@ -0,0 +1,60 @@
+package com.qmth.teachcloud.mark.bean.scananswer;
+
+import java.util.List;
+
+import com.qmth.teachcloud.mark.bean.ArrayResult;
+import com.qmth.teachcloud.mark.bean.BoolResult;
+
+public class AnswerPageVo {
+	private Integer index;
+    private String sheetUri;
+    private List<String> sliceUri;
+	private BoolResult absent;
+	private BoolResult breach;
+	private ArrayResult question;
+	private String recogData;
+	public Integer getIndex() {
+		return index;
+	}
+	public void setIndex(Integer index) {
+		this.index = index;
+	}
+	public BoolResult getAbsent() {
+		return absent;
+	}
+	public void setAbsent(BoolResult absent) {
+		this.absent = absent;
+	}
+	public BoolResult getBreach() {
+		return breach;
+	}
+	public void setBreach(BoolResult breach) {
+		this.breach = breach;
+	}
+	public ArrayResult getQuestion() {
+		return question;
+	}
+	public void setQuestion(ArrayResult question) {
+		this.question = question;
+	}
+	public String getSheetUri() {
+		return sheetUri;
+	}
+	public void setSheetUri(String sheetUri) {
+		this.sheetUri = sheetUri;
+	}
+	public List<String> getSliceUri() {
+		return sliceUri;
+	}
+	public void setSliceUri(List<String> sliceUri) {
+		this.sliceUri = sliceUri;
+	}
+	public String getRecogData() {
+		return recogData;
+	}
+	public void setRecogData(String recogData) {
+		this.recogData = recogData;
+	}
+
+	
+}

+ 38 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerPaperVo.java

@@ -0,0 +1,38 @@
+package com.qmth.teachcloud.mark.bean.scananswer;
+
+import java.util.List;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AnswerPaperVo {
+	private Long id;
+	private Integer number;
+	private Boolean assigned;
+	private List<AnswerPageVo> pages;
+	public Long getId() {
+		return id;
+	}
+	public void setId(Long id) {
+		this.id = id;
+	}
+	public Integer getNumber() {
+		return number;
+	}
+	public void setNumber(Integer number) {
+		this.number = number;
+	}
+	public Boolean getAssigned() {
+		return assigned;
+	}
+	public void setAssigned(Boolean assigned) {
+		this.assigned = assigned;
+	}
+	public List<AnswerPageVo> getPages() {
+		return pages;
+	}
+	public void setPages(List<AnswerPageVo> pages) {
+		this.pages = pages;
+	}
+	
+}

+ 151 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerQueryDomain.java

@@ -0,0 +1,151 @@
+package com.qmth.teachcloud.mark.bean.scananswer;
+
+import java.util.List;
+
+import javax.validation.constraints.NotNull;
+
+import com.qmth.teachcloud.common.enums.ScanStatus;
+import com.qmth.teachcloud.mark.utils.PagerQuery;
+
+
+public class AnswerQueryDomain extends PagerQuery {
+
+    @NotNull(message = "考试ID不能为空")
+    private Long examId;
+
+    private List<ScanStatus> status;
+
+    private String studentCode;
+    
+    private String studentName;
+
+
+    private String packageCode;
+
+    private String courseCode;
+
+    private String coursePaperId;
+
+    private String coursePaperNumber;
+
+	private String examPlace;
+
+	private String examRoom;
+
+
+    private Boolean absentSuspect;
+
+    private Boolean omrAbsent;
+
+    private Boolean assigned;
+
+    private Boolean incomplete;
+
+    private Boolean questionFilled;
+    private Boolean withPaper;
+    private Boolean withOmrDetail;
+	public Long getExamId() {
+		return examId;
+	}
+	public void setExamId(Long examId) {
+		this.examId = examId;
+	}
+	public List<ScanStatus> getStatus() {
+		return status;
+	}
+	public void setStatus(List<ScanStatus> status) {
+		this.status = status;
+	}
+	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 String getPackageCode() {
+		return packageCode;
+	}
+	public void setPackageCode(String packageCode) {
+		this.packageCode = packageCode;
+	}
+	public String getCourseCode() {
+		return courseCode;
+	}
+	public void setCourseCode(String courseCode) {
+		this.courseCode = courseCode;
+	}
+	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 String getExamPlace() {
+		return examPlace;
+	}
+	public void setExamPlace(String examPlace) {
+		this.examPlace = examPlace;
+	}
+	public String getExamRoom() {
+		return examRoom;
+	}
+	public void setExamRoom(String examRoom) {
+		this.examRoom = examRoom;
+	}
+	public Boolean getAbsentSuspect() {
+		return absentSuspect;
+	}
+	public void setAbsentSuspect(Boolean absentSuspect) {
+		this.absentSuspect = absentSuspect;
+	}
+	public Boolean getOmrAbsent() {
+		return omrAbsent;
+	}
+	public void setOmrAbsent(Boolean omrAbsent) {
+		this.omrAbsent = omrAbsent;
+	}
+	public Boolean getAssigned() {
+		return assigned;
+	}
+	public void setAssigned(Boolean assigned) {
+		this.assigned = assigned;
+	}
+	public Boolean getIncomplete() {
+		return incomplete;
+	}
+	public void setIncomplete(Boolean incomplete) {
+		this.incomplete = incomplete;
+	}
+	public Boolean getQuestionFilled() {
+		return questionFilled;
+	}
+	public void setQuestionFilled(Boolean questionFilled) {
+		this.questionFilled = questionFilled;
+	}
+	public Boolean getWithPaper() {
+		return withPaper;
+	}
+	public void setWithPaper(Boolean withPaper) {
+		this.withPaper = withPaper;
+	}
+	public Boolean getWithOmrDetail() {
+		return withOmrDetail;
+	}
+	public void setWithOmrDetail(Boolean withOmrDetail) {
+		this.withOmrDetail = withOmrDetail;
+	}
+
+
+}

+ 245 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/AnswerQueryVo.java

@@ -0,0 +1,245 @@
+package com.qmth.teachcloud.mark.bean.scananswer;
+
+import java.util.List;
+
+import com.qmth.teachcloud.common.enums.ScanStatus;
+import com.qmth.teachcloud.mark.enums.ExamStatus;
+
+public class AnswerQueryVo {
+
+	private Long id;
+
+	private String studentCode;
+
+	private String studentName;
+
+	private String courseCode;
+
+	private String courseName;
+
+	private String coursePaperNumber;
+	private String coursePaperId;
+	private String packageCode;
+
+	private String examPlace;
+
+	private String examRoom;
+
+	private String siteNumber;
+	private ExamStatus examStatus;
+	private ScanStatus status;
+
+	private Boolean markFinished;
+
+	private Boolean absentSuspect;
+
+	private Boolean omrAbsent;
+
+	private Boolean assigned;
+
+	private Boolean incomplete;
+
+	private Integer cardNumber;
+
+	private String updator;
+
+	private Long updateTime;
+	
+	private Integer cardPaperCount;
+    private Boolean isAbsent;
+
+	private List<AnswerPaperVo> papers;
+
+	public Long getId() {
+		return id;
+	}
+
+	public void setId(Long id) {
+		this.id = id;
+	}
+
+	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 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 getCoursePaperNumber() {
+		return coursePaperNumber;
+	}
+
+	public void setCoursePaperNumber(String coursePaperNumber) {
+		this.coursePaperNumber = coursePaperNumber;
+	}
+
+	public String getCoursePaperId() {
+		return coursePaperId;
+	}
+
+	public void setCoursePaperId(String coursePaperId) {
+		this.coursePaperId = coursePaperId;
+	}
+
+	public String getPackageCode() {
+		return packageCode;
+	}
+
+	public void setPackageCode(String packageCode) {
+		this.packageCode = packageCode;
+	}
+
+	public String getExamPlace() {
+		return examPlace;
+	}
+
+	public void setExamPlace(String examPlace) {
+		this.examPlace = examPlace;
+	}
+
+	public String getExamRoom() {
+		return examRoom;
+	}
+
+	public void setExamRoom(String examRoom) {
+		this.examRoom = examRoom;
+	}
+
+	public String getSiteNumber() {
+		return siteNumber;
+	}
+
+	public void setSiteNumber(String siteNumber) {
+		this.siteNumber = siteNumber;
+	}
+
+	public ScanStatus getStatus() {
+		return status;
+	}
+
+	public void setStatus(ScanStatus status) {
+		this.status = status;
+	}
+
+	public Boolean getMarkFinished() {
+		return markFinished;
+	}
+
+	public void setMarkFinished(Boolean markFinished) {
+		this.markFinished = markFinished;
+	}
+
+	public Boolean getAbsentSuspect() {
+		return absentSuspect;
+	}
+
+	public void setAbsentSuspect(Boolean absentSuspect) {
+		this.absentSuspect = absentSuspect;
+	}
+
+	public Boolean getOmrAbsent() {
+		return omrAbsent;
+	}
+
+	public void setOmrAbsent(Boolean omrAbsent) {
+		this.omrAbsent = omrAbsent;
+	}
+
+	public Boolean getAssigned() {
+		return assigned;
+	}
+
+	public void setAssigned(Boolean assigned) {
+		this.assigned = assigned;
+	}
+
+	public Boolean getIncomplete() {
+		return incomplete;
+	}
+
+	public void setIncomplete(Boolean incomplete) {
+		this.incomplete = incomplete;
+	}
+
+	public Integer getCardNumber() {
+		return cardNumber;
+	}
+
+	public void setCardNumber(Integer cardNumber) {
+		this.cardNumber = cardNumber;
+	}
+
+	public String getUpdator() {
+		return updator;
+	}
+
+	public void setUpdator(String updator) {
+		this.updator = updator;
+	}
+
+	public Long getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Long updateTime) {
+		this.updateTime = updateTime;
+	}
+
+	public List<AnswerPaperVo> getPapers() {
+		return papers;
+	}
+
+	public void setPapers(List<AnswerPaperVo> papers) {
+		this.papers = papers;
+	}
+
+	public ExamStatus getExamStatus() {
+		return examStatus;
+	}
+
+	public void setExamStatus(ExamStatus examStatus) {
+		this.examStatus = examStatus;
+	}
+
+	public Integer getCardPaperCount() {
+		return cardPaperCount;
+	}
+
+	public void setCardPaperCount(Integer cardPaperCount) {
+		this.cardPaperCount = cardPaperCount;
+	}
+
+	public Boolean getIsAbsent() {
+		return isAbsent;
+	}
+
+	public void setIsAbsent(Boolean isAbsent) {
+		this.isAbsent = isAbsent;
+	}
+
+}

+ 33 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/scananswer/StudentPaperVo.java

@@ -0,0 +1,33 @@
+package com.qmth.teachcloud.mark.bean.scananswer;
+
+public class StudentPaperVo {
+	private Long paperId;
+	private Long studentId;
+	private Integer number;
+	private Boolean assigned;
+	public Integer getNumber() {
+		return number;
+	}
+	public void setNumber(Integer number) {
+		this.number = number;
+	}
+	public Boolean getAssigned() {
+		return assigned;
+	}
+	public void setAssigned(Boolean assigned) {
+		this.assigned = assigned;
+	}
+	public Long getPaperId() {
+		return paperId;
+	}
+	public void setPaperId(Long paperId) {
+		this.paperId = paperId;
+	}
+	public Long getStudentId() {
+		return studentId;
+	}
+	public void setStudentId(Long studentId) {
+		this.studentId = studentId;
+	}
+	
+}

+ 12 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/MarkStudent.java

@@ -146,7 +146,8 @@ public class MarkStudent implements Serializable {
 
     //是否人工绑定
     private Boolean assigned;
-
+    //人工绑定确认
+    private Boolean assignConfirmed;
     // 是否标记异常
     private Boolean absentSuspect;
 
@@ -560,6 +561,16 @@ public class MarkStudent implements Serializable {
         }
         return scoreList;
     }
+    
+    
+
+	public Boolean getAssignConfirmed() {
+		return assignConfirmed;
+	}
+
+	public void setAssignConfirmed(Boolean assignConfirmed) {
+		this.assignConfirmed = assignConfirmed;
+	}
 
 	@Override
     public String toString() {

+ 7 - 6
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/entity/ScanPaper.java

@@ -57,8 +57,8 @@ public class ScanPaper implements Serializable {
 
     private Long updateTime;
     
-    //已检查
-    private Boolean checked;
+    //人工绑定确认
+    private Boolean assignConfirmed;
 
     public Long getId() {
         return id;
@@ -163,13 +163,14 @@ public class ScanPaper implements Serializable {
         "}";
     }
 
-	public Boolean getChecked() {
-		return checked;
+	public Boolean getAssignConfirmed() {
+		return assignConfirmed;
 	}
 
-	public void setChecked(Boolean checked) {
-		this.checked = checked;
+	public void setAssignConfirmed(Boolean assignConfirmed) {
+		this.assignConfirmed = assignConfirmed;
 	}
+
     
     
 }

+ 26 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/enums/ExamStatus.java

@@ -0,0 +1,26 @@
+package com.qmth.teachcloud.mark.enums;
+
+public enum ExamStatus {
+		OK("已扫描"),
+     ABSENT("缺考");
+
+    private String name;
+
+    ExamStatus(String name) {
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public static ExamStatus getByName(String name) {
+        for (ExamStatus r : ExamStatus.values()) {
+            if (r.getName().equals(name)) {
+                return r;
+            }
+        }
+        return null;
+    }
+
+}

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

@@ -3,6 +3,8 @@ package com.qmth.teachcloud.mark.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
 import com.qmth.teachcloud.mark.bean.student.StudentQuery;
 import com.qmth.teachcloud.mark.bean.student.StudentVo;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
@@ -28,4 +30,6 @@ public interface MarkStudentMapper extends BaseMapper<MarkStudent> {
     IPage<MarkStudent> listUnMarkTaskStudent(@Param("page") Page<MarkStudent> page, @Param("examId") Long examId, @Param("paperNumber") String paperNumber, @Param("groupNumber") Integer groupNumber);
 
 	StudentVo findOne(@Param("req") StudentQuery query);
+
+	IPage<AnswerQueryVo> queryPage(Page<AnswerQueryVo> page,@Param("query") AnswerQueryDomain query);
 }

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/mapper/ScanPaperMapper.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.mapper;
 
+import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
 import com.qmth.teachcloud.mark.bean.scanpaper.PaperVo;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
 import com.qmth.teachcloud.mark.entity.ScanPaper;
@@ -21,4 +22,6 @@ public interface ScanPaperMapper extends BaseMapper<ScanPaper> {
     List<StudentPaperDetailDto> listStudentPaperDetail(@Param("studentId") Long studentId);
 
 	List<PaperVo> findStudentPaper(@Param("studentId")Long studentId);
+
+	List<StudentPaperVo> listByStudentIds(@Param("studentIds")List<Long> studentIds);
 }

+ 4 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -9,6 +9,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.qmth.teachcloud.common.entity.BasicExam;
 import com.qmth.teachcloud.common.entity.SysUser;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamCheckInfoVo;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamInfoVo;
 import com.qmth.teachcloud.mark.bean.student.StudentQuery;
@@ -70,4 +72,6 @@ public interface MarkStudentService extends IService<MarkStudent> {
     int countByExamIdAndSecretNumber(Long examId, String secretNumber);
 
     List<MarkStudent> listByExamIdAndCoursePaperId(Long examId, String coursePaperId);
+
+	IPage<AnswerQueryVo> query(AnswerQueryDomain query);
 }

+ 2 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPaperPageService.java

@@ -20,4 +20,6 @@ public interface ScanPaperPageService extends IService<ScanPaperPage> {
 
 	List<ScanPaperPage> listByPaperId(Long paperId);
 
+	List<ScanPaperPage> listByPaperList(List<Long> paramList);
+
 }

+ 3 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/ScanPaperService.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.mark.service;
 
+import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
 import com.qmth.teachcloud.mark.bean.scanpaper.PaperVo;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
 import com.qmth.teachcloud.mark.entity.ScanPaper;
@@ -28,4 +29,6 @@ public interface ScanPaperService extends IService<ScanPaper> {
 	int getCountByExamAndCardNumber(Long examId, Integer number);
 
 	List<PaperVo> findStudentPaper(Long studentId);
+
+	List<StudentPaperVo> listByStudentIds(List<Long> paramList);
 }

+ 141 - 17
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1,5 +1,21 @@
 package com.qmth.teachcloud.mark.service.impl;
 
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import javax.annotation.Resource;
+import javax.validation.constraints.NotNull;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -15,32 +31,43 @@ import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.enums.mark.SubjectiveStatus;
 import com.qmth.teachcloud.common.enums.scan.ConditionType;
 import com.qmth.teachcloud.common.service.TeachcloudCommonService;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerPageVo;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerPaperVo;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
+import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
+import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.CheckTask;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamCheckInfoVo;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamInfoVo;
 import com.qmth.teachcloud.mark.bean.student.StudentQuery;
 import com.qmth.teachcloud.mark.bean.student.StudentVo;
 import com.qmth.teachcloud.mark.dto.mark.ScoreInfo;
-import com.qmth.teachcloud.mark.dto.mark.score.*;
-import com.qmth.teachcloud.mark.entity.*;
+import com.qmth.teachcloud.mark.dto.mark.score.SheetUrlDto;
+import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveAnswerDto;
+import com.qmth.teachcloud.mark.dto.mark.score.StudentObjectiveDetailDto;
+import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
+import com.qmth.teachcloud.mark.dto.mark.score.StudentScoreDetailDto;
+import com.qmth.teachcloud.mark.entity.MarkPaper;
+import com.qmth.teachcloud.mark.entity.MarkQuestion;
+import com.qmth.teachcloud.mark.entity.MarkStudent;
+import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
+import com.qmth.teachcloud.mark.entity.ScanPaper;
+import com.qmth.teachcloud.mark.entity.ScanPaperPage;
+import com.qmth.teachcloud.mark.entity.ScanStudentPaper;
+import com.qmth.teachcloud.mark.enums.ExamStatus;
 import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
 import com.qmth.teachcloud.mark.mapper.MarkStudentMapper;
-import com.qmth.teachcloud.mark.service.*;
+import com.qmth.teachcloud.mark.service.MarkPaperService;
+import com.qmth.teachcloud.mark.service.MarkQuestionService;
+import com.qmth.teachcloud.mark.service.MarkStudentService;
+import com.qmth.teachcloud.mark.service.ScanAnswerCardService;
+import com.qmth.teachcloud.mark.service.ScanOmrTaskService;
+import com.qmth.teachcloud.mark.service.ScanPackageService;
+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.BatchGetDataUtil;
 import com.qmth.teachcloud.mark.utils.ScoreCalculateUtil;
-import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.annotation.Resource;
-import javax.validation.constraints.NotNull;
-import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -442,4 +469,101 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
                 .eq(MarkStudent::getCoursePaperId, coursePaperId);
         return this.list(queryWrapper);
     }
+    
+    @Override
+	public IPage<AnswerQueryVo> query(AnswerQueryDomain query) {
+		// 查询考生分页信息
+		IPage<AnswerQueryVo> iPage = baseMapper.queryPage(new Page<>(query.getPageNumber(), query.getPageSize()),
+				query);
+		if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
+			for (AnswerQueryVo vo : iPage.getRecords()) {
+				if(vo.getIsAbsent()!=null&&vo.getIsAbsent()) {
+					vo.setExamStatus(ExamStatus.ABSENT);
+				}else {
+					vo.setExamStatus(ExamStatus.OK);
+				}
+			}
+		}
+		if (CollectionUtils.isNotEmpty(iPage.getRecords()) && (query.getWithPaper() != null && query.getWithPaper())) {
+			Map<Long, AnswerQueryVo> map = new HashMap<>();
+
+			for (AnswerQueryVo vo : iPage.getRecords()) {
+				List<AnswerPaperVo> papers = new ArrayList<>();
+				vo.setPapers(papers);
+				if (vo.getCardPaperCount() != null) {
+					for (int i = 1; i <= vo.getCardPaperCount(); i++) {
+						AnswerPaperVo pv = new AnswerPaperVo();
+						pv.setNumber(i);
+						papers.add(pv);
+					}
+				}
+				map.put(vo.getId(), vo);
+			}
+			// 根据考生id查找绑定paper
+			List<Long> studentIds = iPage.getRecords().stream().map(p -> p.getId()).collect(Collectors.toList());
+			List<StudentPaperVo> paperList = new BatchGetDataUtil<StudentPaperVo, Long>() {
+
+				@Override
+				public List<StudentPaperVo> getData(List<Long> paramList) {
+					return scanPaperService.listByStudentIds(paramList);
+				}
+			}.getDataForBatch(studentIds, 200);
+
+			if (CollectionUtils.isNotEmpty(paperList)) {
+				Map<Long, AnswerPaperVo> paperMap = new HashMap<>();
+				for (StudentPaperVo p : paperList) {
+					AnswerQueryVo vo = map.get(p.getStudentId());
+					if (vo == null) {
+						continue;
+					}
+					List<AnswerPaperVo> papers = vo.getPapers();
+					if (papers == null) {
+						continue;
+					}
+					if (papers.size() < p.getNumber()) {
+						continue;
+					}
+					AnswerPaperVo pvo = papers.get(p.getNumber() - 1);
+					pvo.setId(p.getPaperId());
+					pvo.setNumber(p.getNumber());
+					pvo.setAssigned(p.getAssigned());
+					paperMap.put(p.getPaperId(), pvo);
+				}
+				// 查找page
+				List<Long> paperIds = paperList.stream().map(p -> p.getPaperId()).collect(Collectors.toList());
+				List<ScanPaperPage> paperPageList = new BatchGetDataUtil<ScanPaperPage, Long>() {
+
+					@Override
+					public List<ScanPaperPage> getData(List<Long> paramList) {
+						return scanPaperPageService.listByPaperList(paramList);
+					}
+				}.getDataForBatch(paperIds, 200);
+
+				if (CollectionUtils.isNotEmpty(paperPageList)) {
+					for (ScanPaperPage p : paperPageList) {
+						AnswerPaperVo pvo = paperMap.get(p.getPaperId());
+						if (pvo == null) {
+							continue;
+						}
+						List<AnswerPageVo> pages = pvo.getPages();
+						if (pages == null) {
+							pages = new ArrayList<>();
+							pvo.setPages(pages);
+						}
+						AnswerPageVo pageVo = new AnswerPageVo();
+						pageVo.setIndex(p.getPageIndex());
+						pageVo.setSheetUri(p.getSheetPath());
+						if (query.getWithOmrDetail() != null && query.getWithOmrDetail()) {
+							pageVo.setAbsent(p.getAbsent());
+							pageVo.setBreach(p.getBreach());
+							pageVo.setQuestion(p.getQuestion());
+							pageVo.setRecogData(p.getRecogData());
+						}
+						pages.add(pageVo);
+					}
+				}
+			}
+		}
+		return iPage;
+	}
 }

+ 9 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperPageServiceImpl.java

@@ -50,4 +50,13 @@ public class ScanPaperPageServiceImpl extends ServiceImpl<ScanPaperPageMapper, S
 		return baseMapper.selectList(wrapper);
 	}
 
+	@Override
+	public List<ScanPaperPage> listByPaperList(List<Long> paperIds) {
+		QueryWrapper<ScanPaperPage> wrapper = new QueryWrapper<>();
+		LambdaQueryWrapper<ScanPaperPage> lw = wrapper.lambda();
+		lw.in(ScanPaperPage::getPaperId, paperIds);
+		wrapper.orderByAsc("paper_id", "page_index");
+		return this.list(wrapper);
+	}
+
 }

+ 7 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/ScanPaperServiceImpl.java

@@ -12,6 +12,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo;
 import com.qmth.teachcloud.mark.bean.scanpaper.PaperVo;
 import com.qmth.teachcloud.mark.dto.mark.score.StudentPaperDetailDto;
 import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
@@ -81,7 +82,7 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
         lw.eq(ScanPaper::getExamId, examId);
         lw.eq(ScanPaper::getAssigned, true);
         if(checked!=null) {
-        	lw.eq(ScanPaper::getChecked, checked);
+        	lw.eq(ScanPaper::getAssignConfirmed, checked);
         }
         return baseMapper.selectCount(wrapper);
 	}
@@ -102,4 +103,9 @@ public class ScanPaperServiceImpl extends ServiceImpl<ScanPaperMapper, ScanPaper
     public List<PaperVo> findStudentPaper(Long studentId) {
         return baseMapper.findStudentPaper(studentId);
     }
+    
+    @Override
+    public List<StudentPaperVo> listByStudentIds(List<Long> paramList) {
+        return baseMapper.listByStudentIds(paramList);
+    }
 }

+ 52 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/utils/BatchGetDataUtil.java

@@ -0,0 +1,52 @@
+package com.qmth.teachcloud.mark.utils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+
+/**
+ *	多次批量获取数据
+ * @param <R> 结果类
+ * @param <P> 参数类
+ */
+public abstract  class BatchGetDataUtil<R,P> {
+	/**
+	 * @param resultList 全部结果集合
+	 * @param paramList 全部参数集合
+	 * @param batchSize 每批参数数量
+	 */
+	public final List<R> getDataForBatch(List<P> paramList,int batchSize) {
+		if(CollectionUtils.isEmpty(paramList)) {
+			return null;
+		}
+		List<R> resultList=new ArrayList<>();
+		if(paramList.size()<=batchSize) {
+			List<R> temlist = getData(paramList);
+			if(temlist!=null&&temlist.size()>0) {
+				resultList.addAll(temlist);
+			}
+		}else {
+			int size = paramList.size();
+			int len=batchSize;
+			int count = (size + len - 1) / len;
+
+			for (int i = 0; i < count; i++) {
+				List<P> subList = paramList.subList(i * len, ((i + 1) * len > size ? size : len * (i + 1)));
+				List<R> temlist = getData(subList);
+				if(temlist!=null&&temlist.size()>0) {
+					resultList.addAll(temlist);
+				}
+			}
+		}
+		return resultList;
+	}
+	/**
+	 * 	每批获取数据方法
+	 * @param <R>
+	 * @param <P>
+	 * @param paramList 获取每批数据时参数
+	 * @return
+	 */
+	protected abstract  List<R> getData(List<P> paramList);
+}

+ 62 - 0
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -162,4 +162,66 @@
 		FROM mark_student t
 		WHERE t.exam_id=#{req.examId} and t.course_paper_id=#{req.coursePaperId} and t.student_code=#{req.studentCode}
 	</select>
+	<sql id="queryWhereAndOrder">
+        where t.exam_id=#{query.examId}
+        <if test="query.status != null and query.status.size>0">
+            AND t.status in
+            <foreach collection="query.status" index="index" item="st"
+                     open="(" separator="," close=")">
+                #{st}
+            </foreach>
+        </if>
+        <if test="query.studentCode != null and query.studentCode !=''">
+            and t.student_code=#{query.studentCode}
+        </if>
+        <if test="query.studentName != null and query.studentName !=''">
+            and t.student_name=#{query.studentName}
+        </if>
+        <if test="query.packageCode != null and query.packageCode !=''">
+            and t.package_code=#{query.packageCode}
+        </if>
+        <if test="query.courseCode != null and query.courseCode !=''">
+            and t.course_code=#{query.courseCode}
+        </if>
+        <if test="query.coursePaperId != null and query.coursePaperId !=''">
+            and t.course_paper_id=#{query.coursePaperId}
+        </if>
+        <if test="query.coursePaperNumber != null and query.coursePaperNumber !=''">
+            and t.course_paper_number=#{query.coursePaperNumber}
+        </if>
+        <if test="query.examPlace != null and query.examPlace !=''">
+            and t.exam_place=#{query.examPlace}
+        </if>
+		<if test="query.examRoom != null and query.examRoom !=''">
+            and t.exam_room=#{query.examRoom}
+        </if>
+        
+        <if test="query.absentSuspect != null">
+            and t.absent_suspect=#{query.absentSuspect}
+        </if>
+        <if test="query.omrAbsent != null">
+            and t.omr_absent=#{query.omrAbsent}
+        </if>
+        <if test="query.assigned != null">
+            and t.assigned=#{query.assigned}
+        </if>
+        <if test="query.assignConfirmed != null">
+            and t.assign_confirmed=#{query.assignConfirmed}
+        </if>
+        <if test="query.incomplete != null">
+            and t.incomplete=#{query.incomplete}
+        </if>
+        <if test="query.questionFilled != null">
+            and t.question_filled=#{query.questionFilled}
+        </if>
+    </sql>
+    <select id="queryPage"
+            resultType="com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo">
+        select t.*,t.paper_number coursePaperNumber,c.paper_count cardPaperCount,
+        from mark_student t
+        left join scan_answer_card c on t.exam_id=c.exam_id and t.card_number=c.number
+        left join mark_paper s on s.course_paper_id=t.course_paper_id and s.exam_id=t.exam_id
+        <include refid="queryWhereAndOrder"/>
+        order by t.id
+    </select>
 </mapper>

+ 16 - 0
teachcloud-mark/src/main/resources/mapper/ScanPaperMapper.xml

@@ -55,4 +55,20 @@
         WHERE t.student_id = #{studentId}
         ORDER BY t.paper_index
     </select>
+    <select id="listByStudentIds"
+            resultType="com.qmth.teachcloud.mark.bean.scananswer.StudentPaperVo">
+        SELECT
+        t.paper_id,
+        t.student_id,
+        t.paper_index number,
+        p.assigned
+        FROM
+        scan_student_paper t
+        inner join scan_paper p on t.paper_id=p.id
+        WHERE 1=2
+        <foreach collection="studentIds" index="index" item="studentId">
+            or t.student_id=#{studentId}
+        </foreach>
+        order by t.paper_index
+    </select>
 </mapper>