xiatian 9 luni în urmă
părinte
comite
4f90b5dff2

+ 52 - 4
src/main/java/cn/com/qmth/scancentral/controller/admin/CheckController.java

@@ -3,12 +3,10 @@ package cn.com.qmth.scancentral.controller.admin;
 import java.io.IOException;
 import java.net.URLEncoder;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
@@ -41,7 +39,6 @@ import cn.com.qmth.scancentral.bean.AnswerQueryDomain;
 import cn.com.qmth.scancentral.controller.BaseController;
 import cn.com.qmth.scancentral.entity.ExamEntity;
 import cn.com.qmth.scancentral.entity.SubjectEntity;
-import cn.com.qmth.scancentral.enums.ConditionType;
 import cn.com.qmth.scancentral.enums.ExamStatus;
 import cn.com.qmth.scancentral.enums.ExamStatusCheckMode;
 import cn.com.qmth.scancentral.enums.GroupType;
@@ -53,13 +50,15 @@ import cn.com.qmth.scancentral.service.StudentService;
 import cn.com.qmth.scancentral.service.SubjectService;
 import cn.com.qmth.scancentral.task.thread.ExamStatusImportThread;
 import cn.com.qmth.scancentral.task.thread.ExamStatusResetThread;
+import cn.com.qmth.scancentral.util.ResouceUtil;
 import cn.com.qmth.scancentral.vo.AbsentInfoVo;
 import cn.com.qmth.scancentral.vo.AbsentManualImportVo;
 import cn.com.qmth.scancentral.vo.AbsentQueryVo;
 import cn.com.qmth.scancentral.vo.ExamStatusSaveVo;
-import cn.com.qmth.scancentral.vo.OmrConditionsVo;
 import cn.com.qmth.scancentral.vo.UpdateTimeVo;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerQueryVo;
+import cn.com.qmth.scancentral.vo.student.StudentExamRoomVo;
+import cn.com.qmth.scancentral.vo.student.StudentVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import net.sf.json.JSONObject;
@@ -206,6 +205,49 @@ public class CheckController extends BaseController {
         return studentService.query(query);
     }
 
+    @ApiOperation(value = "缺考校验按考生导出")
+    @PostMapping(value = "exam-status/student/export")
+    public void studentExport(@Validated AnswerQueryDomain query, HttpServletResponse response) throws IOException {
+        String fileName = URLEncoder.encode("按考生导出", "UTF-8");
+        response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".xlsx");
+        response.setContentType("application/vnd.ms-excel");
+        ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
+        PageListIterator<StudentVo> iterator = new PageListIterator<StudentVo>(5000) {
+
+            @Override
+            public Collection<StudentVo> getPageList(int pageNumber, int pageSize) {
+                query.setPageNumber(pageNumber);
+                query.setPageSize(pageSize);
+                return studentService.studentExportList(query);
+            }
+        };
+        writer.writeObjects("按考生导出", null, StudentVo.class, iterator);
+        writer.output(response.getOutputStream());
+
+    }
+
+    @ApiOperation(value = "缺考校验按考场导出")
+    @PostMapping(value = "exam-status/exam-room/export")
+    public void studentExamRoomExport(@Validated AnswerQueryDomain query, HttpServletResponse response)
+            throws IOException {
+        String fileName = URLEncoder.encode("按考场导出", "UTF-8");
+        response.setHeader("Content-Disposition", "inline; filename=" + fileName + ".xlsx");
+        response.setContentType("application/vnd.ms-excel");
+        ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
+        PageListIterator<StudentExamRoomVo> iterator = new PageListIterator<StudentExamRoomVo>(5000) {
+
+            @Override
+            public Collection<StudentExamRoomVo> getPageList(int pageNumber, int pageSize) {
+                query.setPageNumber(pageNumber);
+                query.setPageSize(pageSize);
+                return studentService.studentExamRoomExportList(query);
+            }
+        };
+        writer.writeObjects("按考场导出", null, StudentExamRoomVo.class, iterator);
+        writer.output(response.getOutputStream());
+
+    }
+
     @ApiOperation(value = "缺考校验提交")
     @RequestMapping(value = "exam-status/save", method = RequestMethod.POST)
     public ExamStatusSaveVo examStatusSave(@RequestParam Long id, @RequestParam ExamStatus examStatus) {
@@ -213,6 +255,12 @@ public class CheckController extends BaseController {
         return ExamStatusSaveVo.create(examStatus);
     }
 
+    @ApiOperation(value = "缺考校验导入模版下载")
+    @PostMapping("exam-status/template")
+    public void breachTemplate(HttpServletResponse response) {
+        exportFile("缺考校验导入模板.txt", ResouceUtil.getStream("templates/absent-import.txt"));
+    }
+
     @ApiOperation(value = "缺考校验导入")
     @RequestMapping(value = "exam-status/import", method = RequestMethod.POST)
     public JSONObject examStatusImportFile(@RequestParam Long examId, @RequestParam ExamStatusCheckMode mode,

+ 3 - 0
src/main/java/cn/com/qmth/scancentral/dao/StudentDao.java

@@ -21,6 +21,7 @@ import cn.com.qmth.scancentral.vo.examroom.ExamRoomScannedVo;
 import cn.com.qmth.scancentral.vo.imagecheck.ImageCheckDetailVo;
 import cn.com.qmth.scancentral.vo.imagecheck.ImageCheckQuery;
 import cn.com.qmth.scancentral.vo.imagecheck.ImageCheckVo;
+import cn.com.qmth.scancentral.vo.student.StudentAnswerVo;
 import cn.com.qmth.scancentral.vo.student.StudentExamRoomVo;
 import cn.com.qmth.scancentral.vo.student.StudentPageQuery;
 import cn.com.qmth.scancentral.vo.student.StudentPageVo;
@@ -111,4 +112,6 @@ public interface StudentDao extends BaseMapper<StudentEntity> {
 
     List<AssignedCheckExamRoomExport> exportAssignedCheck(@Param("examId") Long examId,
             @Param("subjectCode") String subjectCode);
+
+    StudentAnswerVo getStudentVo(@Param("studentId") Long studentId);
 }

+ 5 - 5
src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java

@@ -243,7 +243,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         // }
         if (updateOmrTask) {
             // 遍历固定任务分组
-            List<OmrGroupEntity> gs = omrGroupService.findByExamIdAndSubjectCodeAndFixed(student.getExamId(),student.getSubjectCode(), true);
+            List<OmrGroupEntity> gs = omrGroupService.findByExamIdAndSubjectCodeAndFixed(student.getExamId(),
+                    student.getSubjectCode(), true);
             if (CollectionUtils.isNotEmpty(gs)) {
                 for (OmrGroupEntity g : gs) {
                     concurrentService.getReadWriteLock(LockType.OMR_GROUP + "-" + g.getId()).readLock().lock();
@@ -1797,14 +1798,14 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
                 // 已读字符串长度
                 StringBuilder msg = new StringBuilder();
                 String[] str = line.split(",");
-                if (str.length != 2) {
+                if (str.length != 3) {
                     msg.append("  无法解析,请检查分隔符和数据");
                     failRecords.add(newError(i, msg.toString()));
                     continue;
                 }
                 String examNumber = str[0];
                 String absent = str[1];
-                String subjectCode = str[3];
+                String subjectCode = str[2];
                 if (StringUtils.isBlank(examNumber)) {
                     examNumber = null;
                     msg.append("  准考证号不能为空");
@@ -2219,8 +2220,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         if (studentId == null) {
             throw new ParameterException("studentId不能为空");
         }
-        StudentAnswerVo ret = new StudentAnswerVo();
-        ret.setStudentId(studentId);
+        StudentAnswerVo ret = this.baseMapper.getStudentVo(studentId);
         ret.setPapers(new ArrayList<>());
         List<StudentPaperVo> paperList = paperService.listByBatchIdAndStudentId(batchId, studentId);
 

+ 3 - 3
src/main/java/cn/com/qmth/scancentral/util/AuthorizationCreateUtil.java

@@ -10,9 +10,9 @@ public class AuthorizationCreateUtil {
 
     public static void main(String[] args) {
         long time = System.currentTimeMillis();
-        String identity = "SCHOOL_ADMIN_admin4";// 登录后user属性
-        String token = "6ghwNXEfuAN4eQh9e0OZ23L1UPxzT7Jg";// 登录后user属性
-        String url = "/api/admin/scan/answer/export";// 请求路径
+        String identity = "SCANNER_111";// 登录后user属性
+        String token = "nS0SusCm2HPvLXN6kwzNBjJhiyHDbcXW";// 登录后user属性
+        String url = "/api/admin/card/import";// 请求路径
         String s = SignatureEntity.build(SignatureType.TOKEN, "post", url, time, identity, token);
         System.out.println("time:" + time);
         System.out.println("Authorization:" + s);

+ 260 - 8
src/main/java/cn/com/qmth/scancentral/vo/student/StudentAnswerVo.java

@@ -2,21 +2,65 @@ package cn.com.qmth.scancentral.vo.student;
 
 import java.util.List;
 
+import cn.com.qmth.scancentral.enums.ExamStatus;
+import cn.com.qmth.scancentral.enums.ScanStatus;
 import cn.com.qmth.scancentral.vo.answerquery.AnswerPaperVo;
 
 public class StudentAnswerVo {
 
-    private Long studentId;
+    private Long id;
 
-    private List<AnswerPaperVo> papers;
+    private String examNumber;
 
-    public Long getStudentId() {
-        return studentId;
-    }
+    private String name;
 
-    public void setStudentId(Long studentId) {
-        this.studentId = studentId;
-    }
+    private String subjectCode;
+
+    private String subjectName;
+
+    private String packageCode;
+
+    private String campusCode;
+
+    private String campusName;
+
+    private String examSite;
+
+    private String examSiteName;
+
+    private String examRoom;
+
+    private String seatNumber;
+
+    private ExamStatus examStatus;
+
+    private String device;
+
+    private ScanStatus status;
+
+    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 String paperType;
+
+    private Boolean assignedSuspect;
+
+    private Integer assignedCheckCount;
+
+    private List<AnswerPaperVo> papers;
 
     public List<AnswerPaperVo> getPapers() {
         return papers;
@@ -26,4 +70,212 @@ public class StudentAnswerVo {
         this.papers = papers;
     }
 
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    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 String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public String getCampusCode() {
+        return campusCode;
+    }
+
+    public void setCampusCode(String campusCode) {
+        this.campusCode = campusCode;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    public String getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
+    public String getExamSiteName() {
+        return examSiteName;
+    }
+
+    public void setExamSiteName(String examSiteName) {
+        this.examSiteName = examSiteName;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getSeatNumber() {
+        return seatNumber;
+    }
+
+    public void setSeatNumber(String seatNumber) {
+        this.seatNumber = seatNumber;
+    }
+
+    public ExamStatus getExamStatus() {
+        return examStatus;
+    }
+
+    public void setExamStatus(ExamStatus examStatus) {
+        this.examStatus = examStatus;
+    }
+
+    public String getDevice() {
+        return device;
+    }
+
+    public void setDevice(String device) {
+        this.device = device;
+    }
+
+    public ScanStatus getStatus() {
+        return status;
+    }
+
+    public void setStatus(ScanStatus status) {
+        this.status = status;
+    }
+
+    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 Integer getCardPaperCount() {
+        return cardPaperCount;
+    }
+
+    public void setCardPaperCount(Integer cardPaperCount) {
+        this.cardPaperCount = cardPaperCount;
+    }
+
+    public String getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public Boolean getAssignedSuspect() {
+        return assignedSuspect;
+    }
+
+    public void setAssignedSuspect(Boolean assignedSuspect) {
+        this.assignedSuspect = assignedSuspect;
+    }
+
+    public Integer getAssignedCheckCount() {
+        return assignedCheckCount;
+    }
+
+    public void setAssignedCheckCount(Integer assignedCheckCount) {
+        this.assignedCheckCount = assignedCheckCount;
+    }
+
 }

+ 12 - 1
src/main/resources/mapper/StudentMapper.xml

@@ -690,5 +690,16 @@
           and stu.assigned_suspect = 1
         group by stu.exam_room
     </select>
-
+    <select id="getStudentVo"
+            resultType="cn.com.qmth.scancentral.vo.student.StudentAnswerVo">
+        select
+        t.*,
+        c.paper_count cardPaperCount,
+        s.name subjectName
+        from sc_student t
+        left join sc_answer_card c on t.exam_id=c.exam_id and
+        t.card_number=c.number
+        left join sc_subject s on s.code=t.subject_code and s.exam_id=t.exam_id
+        where t.id=#{studentId}
+    </select>
 </mapper>

+ 1 - 0
src/main/resources/templates/absent-import.txt

@@ -0,0 +1 @@
+准考证号,缺考标识,科目代码(标题行,数据从第二行读取)