Przeglądaj źródła

Merge remote-tracking branch 'origin/dev_v3.3.0' into dev_v3.3.0

xiaofei 1 rok temu
rodzic
commit
c1b786c18c

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

@@ -18,6 +18,8 @@ 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.UpdateTimeVo;
+import com.qmth.teachcloud.mark.bean.omredit.OmrEditDomain;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
 import com.qmth.teachcloud.mark.bean.scananswer.SheetUploadVo;
@@ -78,4 +80,11 @@ public class ScanAnswerController {
     public Result summary(@Validated AnswerQueryDomain query) {
         return ResultUtil.ok(markStudentService.summary(query));
     }
+    
+    @ApiOperation(value = "修改答题卡识别结果")
+    @RequestMapping(value = "omr/edit", method = RequestMethod.POST)
+    public UpdateTimeVo omrEdit(@Validated @RequestBody OmrEditDomain domain) {
+    	SysUser user = (SysUser) ServletUtil.getRequestUser();
+        return markStudentService.omrEdit(user.getId(),domain);
+    }
 }

+ 21 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/UpdateTimeVo.java

@@ -0,0 +1,21 @@
+package com.qmth.teachcloud.mark.bean;
+
+public class UpdateTimeVo {
+
+    private Long updateTime;
+
+    public static UpdateTimeVo create() {
+        UpdateTimeVo vo = new UpdateTimeVo();
+        vo.setUpdateTime(System.currentTimeMillis());
+        return vo;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+}

+ 47 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/omredit/OmrEditDomain.java

@@ -0,0 +1,47 @@
+package com.qmth.teachcloud.mark.bean.omredit;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.List;
+
+public class OmrEditDomain {
+
+    @NotNull(message = "考试ID不能为空")
+    private Long examId;
+
+    @NotBlank(message = "学号号不能为空")
+    private String studentCode;
+
+    @Valid
+    @NotNull(message = "papers不能为空")
+    @Size(min = 1, message = "papers不能为空")
+    private List<OmrEditPaper> papers;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+
+    public String getStudentCode() {
+		return studentCode;
+	}
+
+	public void setStudentCode(String studentCode) {
+		this.studentCode = studentCode;
+	}
+
+	public List<OmrEditPaper> getPapers() {
+        return papers;
+    }
+
+    public void setPapers(List<OmrEditPaper> papers) {
+        this.papers = papers;
+    }
+
+}

+ 58 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/omredit/OmrEditPage.java

@@ -0,0 +1,58 @@
+package com.qmth.teachcloud.mark.bean.omredit;
+
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+
+import com.qmth.teachcloud.mark.bean.ArrayResult;
+import com.qmth.teachcloud.mark.bean.BoolResult;
+
+public class OmrEditPage {
+
+    @NotNull(message = "pageIndex不能为空")
+    @Min(value = 1, message = "pageIndex不能小于1")
+    @Max(value = 2, message = "pageIndex不能大于2")
+    private Integer index;
+
+    private BoolResult absent;
+
+    private BoolResult breach;
+
+
+    private ArrayResult question;
+
+
+    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;
+    }
+
+}

+ 54 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/bean/omredit/OmrEditPaper.java

@@ -0,0 +1,54 @@
+package com.qmth.teachcloud.mark.bean.omredit;
+
+import java.util.List;
+
+import javax.validation.Valid;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.qmth.teachcloud.mark.entity.ScanPaperPage;
+
+public class OmrEditPaper {
+
+    @NotNull(message = "paper.number不能为空")
+    @Min(value = 1, message = "paper.number不能小于1")
+    private Integer number;
+
+    @Valid
+    @NotNull(message = "paper.pages不能为空")
+    @Size(min = 1, message = "paper.pages不能为空")
+    private List<OmrEditPage> pages;
+
+    public Integer getNumber() {
+        return number;
+    }
+
+    public void setNumber(Integer number) {
+        this.number = number;
+    }
+
+    public List<OmrEditPage> getPages() {
+        return pages;
+    }
+
+    public void setPages(List<OmrEditPage> pages) {
+        this.pages = pages;
+    }
+
+    public void updatePage(ScanPaperPage page) {
+        for (OmrEditPage pageEdit : pages) {
+            if (pageEdit.getIndex().equals(page.getPageIndex())) {
+                if (pageEdit.getAbsent() != null) {
+                    page.setAbsent(pageEdit.getAbsent());
+                }
+                if (pageEdit.getBreach() != null) {
+                    page.setBreach(pageEdit.getBreach());
+                }
+                if (pageEdit.getQuestion() != null) {
+                    page.setQuestion(pageEdit.getQuestion());
+                }
+            }
+        }
+    }
+}

+ 6 - 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.UpdateTimeVo;
+import com.qmth.teachcloud.mark.bean.omredit.OmrEditDomain;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryVo;
 import com.qmth.teachcloud.mark.bean.scanexaminfo.ScanExamCheckInfoVo;
@@ -76,4 +78,8 @@ public interface MarkStudentService extends IService<MarkStudent> {
 	IPage<AnswerQueryVo> query(AnswerQueryDomain query);
 
 	List<String> summary(AnswerQueryDomain query);
+
+	UpdateTimeVo omrEdit(Long userId,OmrEditDomain domain);
+
+	MarkStudent findByExamIdAndStudentCode(Long examId, String studentCode);
 }

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

@@ -23,4 +23,6 @@ public interface ScanStudentPaperService extends IService<ScanStudentPaper> {
 
 	void removeByStudentId(@NotNull Long studentId);
 
+	ScanStudentPaper findByStudentIdAndPaperNumber(Long studentId, Integer number);
+
 }

+ 56 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -22,6 +22,7 @@ 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.BasicExam;
 import com.qmth.teachcloud.common.entity.SysUser;
@@ -31,6 +32,9 @@ 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.UpdateTimeVo;
+import com.qmth.teachcloud.mark.bean.omredit.OmrEditDomain;
+import com.qmth.teachcloud.mark.bean.omredit.OmrEditPaper;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerPageVo;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerPaperVo;
 import com.qmth.teachcloud.mark.bean.scananswer.AnswerQueryDomain;
@@ -55,6 +59,7 @@ 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.LockType;
 import com.qmth.teachcloud.mark.enums.OmrTaskStatus;
 import com.qmth.teachcloud.mark.mapper.MarkStudentMapper;
 import com.qmth.teachcloud.mark.service.MarkPaperService;
@@ -97,6 +102,9 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     private MarkQuestionService markQuestionService;
     @Resource
     private TeachcloudCommonService teachcloudCommonService;
+    @Autowired
+    private ConcurrentService concurrentService;
+    
 
     @Override
     public List<String> listClassByExamIdAndCourseCode(Long examId, String paperNumber) {
@@ -572,4 +580,52 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         // 不分页查询考生准考证号
         return baseMapper.querySummary(query);
     }
+
+    @Transactional
+	@Override
+	public UpdateTimeVo omrEdit(Long userId,OmrEditDomain domain) {
+		MarkStudent student = findByExamIdAndStudentCode(domain.getExamId(), domain.getStudentCode());
+        if (student == null) {
+            throw new ParameterException("考生信息未找到");
+        }
+        concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().lock();
+        try {
+            for (OmrEditPaper paperEdit : domain.getPapers()) {
+                ScanStudentPaper sp = studentPaperService.findByStudentIdAndPaperNumber(student.getId(),
+                        paperEdit.getNumber());
+                if (sp == null) {
+                    throw new ParameterException("未找到绑定扫描结果");
+                }
+                ScanPaper paperEntity = scanPaperService.getById(sp.getPaperId());
+                if (paperEntity == null) {
+                    throw new ParameterException("未找到paper信息结果");
+                }
+                paperEntity.setUpdaterId(userId);
+                paperEntity.setUpdateTime(System.currentTimeMillis());
+                List<ScanPaperPage> pages = scanPaperPageService.listByPaperId(paperEntity.getId());
+                for (ScanPaperPage pageEntity : pages) {
+                    paperEdit.updatePage(pageEntity);
+                }
+                scanPaperService.savePaperAndPages(paperEntity, pages);
+            }
+            updateStudentByPaper(userId, student.getId(), false);
+            return UpdateTimeVo.create();
+        } finally {
+            concurrentService.getReadWriteLock(LockType.STUDENT + "-" + student.getId()).writeLock().unlock();
+        }
+	}
+
+    @Override
+    public MarkStudent findByExamIdAndStudentCode(Long examId, String studentCode) {
+        if (examId == null) {
+            throw new ParameterException("examId 不能为空");
+        }
+        if (StringUtils.isBlank(studentCode)) {
+            throw new ParameterException("studentCode不能为空");
+        }
+        QueryWrapper<MarkStudent> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(MarkStudent::getExamId, examId);
+        queryWrapper.lambda().eq(MarkStudent::getStudentCode, studentCode);
+        return baseMapper.selectOne(queryWrapper);
+    }
 }

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

@@ -49,4 +49,13 @@ public class ScanStudentPaperServiceImpl extends ServiceImpl<ScanStudentPaperMap
         lw.eq(ScanStudentPaper::getStudentId, studentId);
         this.baseMapper.delete(wrapper);
     }
+    
+    @Override
+    public ScanStudentPaper findByStudentIdAndPaperNumber(Long studentId, Integer paperNumber) {
+        QueryWrapper<ScanStudentPaper> wrapper = new QueryWrapper<>();
+        LambdaQueryWrapper<ScanStudentPaper> lw = wrapper.lambda();
+        lw.eq(ScanStudentPaper::getStudentId, studentId);
+        lw.eq(ScanStudentPaper::getPaperIndex, paperNumber);
+        return baseMapper.selectOne(wrapper);
+    }
 }