xiatian před 1 dnem
rodič
revize
f1de411bb6

+ 214 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/InspectImportVo.java

@@ -0,0 +1,214 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
+import io.swagger.annotations.ApiModelProperty;
+
+public class InspectImportVo {
+
+    @ApiModelProperty("studentId")
+    private Integer id;
+
+    /**
+     * 考试ID
+     */
+    private Integer examId;
+
+    /**
+     * 学校ID
+     */
+    private Integer schoolId;
+
+    /**
+     * 科目代码
+     */
+    private String subjectCode;
+
+    /**
+     * 科目名称
+     */
+    private String subjectName;
+
+    @ApiModelProperty("科目")
+    private String subjectText;
+
+    /**
+     * 学号
+     */
+    @ApiModelProperty("学号")
+    private String studentCode;
+
+    /**
+     * 是否已上传
+     */
+    private Boolean upload;
+
+    private Boolean breach;
+
+    /**
+     * 是否缺考
+     */
+    private Boolean absent;
+
+    /**
+     * 主观题得分明细
+     */
+    private String subjectiveScoreList;
+
+    @ApiModelProperty("标记卷,1-标记")
+    private String tagValue;
+
+    @ApiModelProperty("试卷总分")
+    private Double totalScore;
+
+    @ApiModelProperty("得分明细")
+    private String scoreText;
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    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 getSubjectText() {
+        return subjectText;
+    }
+
+    public void setSubjectText(String subjectText) {
+        this.subjectText = subjectText;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public Boolean getUpload() {
+        return upload;
+    }
+
+    public void setUpload(Boolean upload) {
+        this.upload = upload;
+    }
+
+    public Boolean getBreach() {
+        return breach;
+    }
+
+    public void setBreach(Boolean breach) {
+        this.breach = breach;
+    }
+
+    public Boolean getAbsent() {
+        return absent;
+    }
+
+    public void setAbsent(Boolean absent) {
+        this.absent = absent;
+    }
+
+    public String getSubjectiveScoreList() {
+        return subjectiveScoreList;
+    }
+
+    public void setSubjectiveScoreList(String subjectiveScoreList) {
+        this.subjectiveScoreList = subjectiveScoreList;
+    }
+
+    public String getTagValue() {
+        return tagValue;
+    }
+
+    public void setTagValue(String tagValue) {
+        this.tagValue = tagValue;
+    }
+
+    public String getScoreText() {
+        return scoreText;
+    }
+
+    public void setScoreText(String scoreText) {
+        this.scoreText = scoreText;
+    }
+
+    public Double getTotalScore() {
+        return totalScore;
+    }
+
+    public void setTotalScore(Double totalScore) {
+        this.totalScore = totalScore;
+    }
+
+    public static InspectImportVo of(ExamStudent from) {
+        if (from == null) {
+            return null;
+        }
+        InspectImportVo ret = new InspectImportVo();
+        ret.setId(from.getId());
+        ret.setExamId(from.getExamId());
+        ret.setSchoolId(from.getSchoolId());
+        ret.setSubjectCode(from.getSubjectCode());
+        ret.setSubjectName(from.getSubjectName());
+        ret.setSubjectText(from.getSubjectCode() + "-" + from.getSubjectName());
+        ret.setStudentCode(from.getStudentCode());
+        ret.setUpload(from.isUpload());
+        ret.setBreach(from.isBreach());
+        ret.setAbsent(from.isAbsent());
+        ret.setSubjectiveScoreList(from.getSubjectiveScoreList());
+        ret.setTagValue(from.getTagValue());
+        double score = 0;
+        if (from.getObjectiveScore() != null) {
+            score = BigDecimalUtils.add(score, from.getObjectiveScore());
+        }
+        if (from.getSubjectiveScore() != null) {
+            score = BigDecimalUtils.add(score, from.getSubjectiveScore());
+        }
+        ret.setTotalScore(score);
+        if (from.isAbsent() == true || from.isUpload() == false) {
+            ret.setScoreText("缺考");
+        } else if (from.isBreach() == true) {
+            ret.setScoreText("违纪");
+        } else {
+            ret.setScoreText(from.getSubjectiveScoreList());
+        }
+        return ret;
+    }
+
+}

+ 687 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/bean/ScoreVo.java

@@ -0,0 +1,687 @@
+package cn.com.qmth.stmms.biz.exam.bean;
+
+import java.util.Date;
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import io.swagger.annotations.ApiModelProperty;
+
+public class ScoreVo {
+
+    @ApiModelProperty("科目")
+    private String subjectText;
+
+    /**
+     * 学号
+     */
+    @ApiModelProperty("学号")
+    private String studentCode;
+
+    private Integer id;
+
+    /**
+     * 考试ID
+     */
+    private Integer examId;
+
+    /**
+     * 学校ID
+     */
+    private Integer schoolId;
+
+    /**
+     * 学习中心
+     */
+    private String campusName;
+
+    /**
+     * 科目代码
+     */
+    private String subjectCode;
+
+    /**
+     * 科目名称
+     */
+    private String subjectName;
+
+    /**
+     * 试卷类型
+     */
+    private String paperType;
+
+    /**
+     * 准考证号
+     */
+    @ApiModelProperty("准考证号")
+    private String examNumber;
+
+    /**
+     * 密号
+     */
+    private String secretNumber;
+
+    /**
+     * 姓名
+     */
+    @ApiModelProperty("姓名")
+    private String name;
+
+    /**
+     * 试卷袋签到表编号
+     */
+    private String packageCode;
+
+    /**
+     * 考生考点信息
+     */
+    @ApiModelProperty("考点")
+    private String examSite;
+
+    /**
+     * 考生考场信息
+     */
+    @ApiModelProperty("考场")
+    private String examRoom;
+
+    /**
+     * 考生备注信息
+     */
+    private String remark;
+
+    /**
+     * 扫描批次编号
+     */
+    private String batchCode;
+
+    /**
+     * 客观题图数量
+     */
+    private Integer objectivePageCount;
+
+    /**
+     * 原图数量
+     */
+    private Integer sheetCount;
+
+    /**
+     * 裁切图数量
+     */
+    private Integer sliceCount;
+
+    /**
+     * 客观答案
+     */
+    private String answers;
+
+    /**
+     * 是否已上传
+     */
+    private Boolean upload;
+
+    /**
+     * 是否缺考
+     */
+    private Boolean absent;
+
+    /**
+     * 是否人工指定缺考
+     */
+    private Boolean manualAbsent;
+
+    private Boolean breach;
+
+    /**
+     * 是否数据校验异常
+     */
+    private Boolean exception;
+
+    /**
+     * 是否数试评
+     */
+    private Boolean trial;
+
+    /**
+     * 上传时间
+     */
+    private Date uploadTime;
+
+    /**
+     * 客观总分
+     */
+    private Double objectiveScore;
+
+    @ApiModelProperty("客观总分")
+    private String objectiveScoreText;
+
+    /**
+     * 客观题得分明细
+     */
+    private String objectiveScoreList;
+
+    /**
+     * 主观题状态
+     */
+    private SubjectiveStatus subjectiveStatus;
+
+    /**
+     * 主观总分
+     */
+    private Double subjectiveScore;
+
+    @ApiModelProperty("主观总分")
+    private String subjectiveScoreText;
+
+    /**
+     * 主观题得分明细
+     */
+    private String subjectiveScoreList;
+
+    /**
+     * 科目层次信息
+     */
+    @ApiModelProperty("层次")
+    private String subjectLevel;
+
+    /**
+     * 专业类型信息
+     */
+    @ApiModelProperty("专业类型")
+    private String subjectCategory;
+
+    @ApiModelProperty("全卷总分")
+    private String totalScoreText;
+
+    /**
+     * 学院
+     */
+    @ApiModelProperty("学院")
+    private String college;
+
+    /**
+     * 班级
+     */
+    @ApiModelProperty("班级")
+    private String className;
+
+    /**
+     * 任课老师
+     */
+    @ApiModelProperty("任课老师")
+    private String teacher;
+
+    private List<String> sheetUrls;
+
+    private List<String> packageUrls;
+
+    private String answerUrl;
+
+    private String examName;
+
+    @ApiModelProperty("是否缺考")
+    private String absentText;
+
+    @ApiModelProperty("是否上传")
+    private String uploadText;
+
+    @ApiModelProperty("是否违纪")
+    private String breachText;
+
+    public String getSubjectText() {
+        return subjectText;
+    }
+
+    public void setSubjectText(String subjectText) {
+        this.subjectText = subjectText;
+    }
+
+    public String getStudentCode() {
+        return studentCode;
+    }
+
+    public void setStudentCode(String studentCode) {
+        this.studentCode = studentCode;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Integer examId) {
+        this.examId = examId;
+    }
+
+    public Integer getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Integer schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public String getCampusName() {
+        return campusName;
+    }
+
+    public void setCampusName(String campusName) {
+        this.campusName = campusName;
+    }
+
+    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 getPaperType() {
+        return paperType;
+    }
+
+    public void setPaperType(String paperType) {
+        this.paperType = paperType;
+    }
+
+    public String getExamNumber() {
+        return examNumber;
+    }
+
+    public void setExamNumber(String examNumber) {
+        this.examNumber = examNumber;
+    }
+
+    public String getSecretNumber() {
+        return secretNumber;
+    }
+
+    public void setSecretNumber(String secretNumber) {
+        this.secretNumber = secretNumber;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public String getPackageCode() {
+        return packageCode;
+    }
+
+    public void setPackageCode(String packageCode) {
+        this.packageCode = packageCode;
+    }
+
+    public String getExamSite() {
+        return examSite;
+    }
+
+    public void setExamSite(String examSite) {
+        this.examSite = examSite;
+    }
+
+    public String getExamRoom() {
+        return examRoom;
+    }
+
+    public void setExamRoom(String examRoom) {
+        this.examRoom = examRoom;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getBatchCode() {
+        return batchCode;
+    }
+
+    public void setBatchCode(String batchCode) {
+        this.batchCode = batchCode;
+    }
+
+    public Integer getObjectivePageCount() {
+        return objectivePageCount;
+    }
+
+    public void setObjectivePageCount(Integer objectivePageCount) {
+        this.objectivePageCount = objectivePageCount;
+    }
+
+    public Integer getSheetCount() {
+        return sheetCount;
+    }
+
+    public void setSheetCount(Integer sheetCount) {
+        this.sheetCount = sheetCount;
+    }
+
+    public Integer getSliceCount() {
+        return sliceCount;
+    }
+
+    public void setSliceCount(Integer sliceCount) {
+        this.sliceCount = sliceCount;
+    }
+
+    public String getAnswers() {
+        return answers;
+    }
+
+    public void setAnswers(String answers) {
+        this.answers = answers;
+    }
+
+    public Boolean getUpload() {
+        return upload;
+    }
+
+    public void setUpload(Boolean upload) {
+        this.upload = upload;
+    }
+
+    public Boolean getAbsent() {
+        return absent;
+    }
+
+    public void setAbsent(Boolean absent) {
+        this.absent = absent;
+    }
+
+    public Boolean getManualAbsent() {
+        return manualAbsent;
+    }
+
+    public void setManualAbsent(Boolean manualAbsent) {
+        this.manualAbsent = manualAbsent;
+    }
+
+    public Boolean getBreach() {
+        return breach;
+    }
+
+    public void setBreach(Boolean breach) {
+        this.breach = breach;
+    }
+
+    public Boolean getException() {
+        return exception;
+    }
+
+    public void setException(Boolean exception) {
+        this.exception = exception;
+    }
+
+    public Boolean getTrial() {
+        return trial;
+    }
+
+    public void setTrial(Boolean trial) {
+        this.trial = trial;
+    }
+
+    public Date getUploadTime() {
+        return uploadTime;
+    }
+
+    public void setUploadTime(Date uploadTime) {
+        this.uploadTime = uploadTime;
+    }
+
+    public Double getObjectiveScore() {
+        return objectiveScore;
+    }
+
+    public void setObjectiveScore(Double objectiveScore) {
+        this.objectiveScore = objectiveScore;
+    }
+
+    public String getObjectiveScoreText() {
+        return objectiveScoreText;
+    }
+
+    public void setObjectiveScoreText(String objectiveScoreText) {
+        this.objectiveScoreText = objectiveScoreText;
+    }
+
+    public String getObjectiveScoreList() {
+        return objectiveScoreList;
+    }
+
+    public void setObjectiveScoreList(String objectiveScoreList) {
+        this.objectiveScoreList = objectiveScoreList;
+    }
+
+    public SubjectiveStatus getSubjectiveStatus() {
+        return subjectiveStatus;
+    }
+
+    public void setSubjectiveStatus(SubjectiveStatus subjectiveStatus) {
+        this.subjectiveStatus = subjectiveStatus;
+    }
+
+    public Double getSubjectiveScore() {
+        return subjectiveScore;
+    }
+
+    public void setSubjectiveScore(Double subjectiveScore) {
+        this.subjectiveScore = subjectiveScore;
+    }
+
+    public String getSubjectiveScoreText() {
+        return subjectiveScoreText;
+    }
+
+    public void setSubjectiveScoreText(String subjectiveScoreText) {
+        this.subjectiveScoreText = subjectiveScoreText;
+    }
+
+    public String getSubjectiveScoreList() {
+        return subjectiveScoreList;
+    }
+
+    public void setSubjectiveScoreList(String subjectiveScoreList) {
+        this.subjectiveScoreList = subjectiveScoreList;
+    }
+
+    public String getSubjectLevel() {
+        return subjectLevel;
+    }
+
+    public void setSubjectLevel(String subjectLevel) {
+        this.subjectLevel = subjectLevel;
+    }
+
+    public String getSubjectCategory() {
+        return subjectCategory;
+    }
+
+    public void setSubjectCategory(String subjectCategory) {
+        this.subjectCategory = subjectCategory;
+    }
+
+    public String getTotalScoreText() {
+        return totalScoreText;
+    }
+
+    public void setTotalScoreText(String totalScoreText) {
+        this.totalScoreText = totalScoreText;
+    }
+
+    public String getCollege() {
+        return college;
+    }
+
+    public void setCollege(String college) {
+        this.college = college;
+    }
+
+    public String getClassName() {
+        return className;
+    }
+
+    public void setClassName(String className) {
+        this.className = className;
+    }
+
+    public String getTeacher() {
+        return teacher;
+    }
+
+    public void setTeacher(String teacher) {
+        this.teacher = teacher;
+    }
+
+    public List<String> getSheetUrls() {
+        return sheetUrls;
+    }
+
+    public void setSheetUrls(List<String> sheetUrls) {
+        this.sheetUrls = sheetUrls;
+    }
+
+    public List<String> getPackageUrls() {
+        return packageUrls;
+    }
+
+    public void setPackageUrls(List<String> packageUrls) {
+        this.packageUrls = packageUrls;
+    }
+
+    public String getAnswerUrl() {
+        return answerUrl;
+    }
+
+    public void setAnswerUrl(String answerUrl) {
+        this.answerUrl = answerUrl;
+    }
+
+    public String getExamName() {
+        return examName;
+    }
+
+    public void setExamName(String examName) {
+        this.examName = examName;
+    }
+
+    public String getAbsentText() {
+        return absentText;
+    }
+
+    public void setAbsentText(String absentText) {
+        this.absentText = absentText;
+    }
+
+    public String getUploadText() {
+        return uploadText;
+    }
+
+    public void setUploadText(String uploadText) {
+        this.uploadText = uploadText;
+    }
+
+    public String getBreachText() {
+        return breachText;
+    }
+
+    public void setBreachText(String breachText) {
+        this.breachText = breachText;
+    }
+
+    public static ScoreVo of(ExamStudent from) {
+        if (from == null) {
+            return null;
+        }
+        ScoreVo ret = new ScoreVo();
+        ret.setSubjectText(from.getSubjectCode() + "-" + from.getSubjectName() + " " + from.getSubjectRemark());
+        ret.setStudentCode(from.getStudentCode());
+        ret.setId(from.getId());
+        ret.setExamId(from.getExamId());
+        ret.setSchoolId(from.getSchoolId());
+        ret.setCampusName(from.getCampusName());
+        ret.setSubjectCode(from.getSubjectCode());
+        ret.setSubjectName(from.getSubjectName());
+        ret.setPaperType(from.getPaperType());
+        ret.setExamNumber(from.getExamNumber());
+        ret.setSecretNumber(from.getSecretNumber());
+        ret.setName(from.getName());
+        ret.setPackageCode(from.getPackageCode());
+        ret.setExamSite(from.getExamSite());
+        ret.setExamRoom(from.getExamRoom());
+        ret.setRemark(from.getRemark());
+        ret.setBatchCode(from.getBatchCode());
+        ret.setObjectivePageCount(from.getObjectivePageCount());
+        ret.setSheetCount(from.getSheetCount());
+        ret.setSliceCount(from.getSliceCount());
+        ret.setAnswers(from.getAnswers());
+        ret.setUpload(from.isUpload());
+        ret.setAbsent(from.isAbsent());
+        ret.setManualAbsent(from.isManualAbsent());
+        ret.setBreach(from.isBreach());
+        ret.setException(from.isException());
+        ret.setTrial(from.isTrial());
+        ret.setUploadTime(from.getUploadTime());
+        ret.setObjectiveScore(from.getObjectiveScore());
+        ret.setObjectiveScoreList(from.getObjectiveScoreList());
+        ret.setSubjectiveStatus(from.getSubjectiveStatus());
+        ret.setSubjectiveScore(from.getSubjectiveScore());
+        ret.setSubjectiveScoreList(from.getSubjectiveScoreList());
+        ret.setSubjectLevel(from.getSubjectLevel());
+        ret.setSubjectCategory(from.getSubjectCategory());
+        ret.setCollege(from.getCollege());
+        ret.setClassName(from.getClassName());
+        ret.setTeacher(from.getTeacher());
+        ret.setSheetUrls(from.getSheetUrls());
+        ret.setPackageUrls(from.getPackageUrls());
+        ret.setAnswerUrl(from.getAnswerUrl());
+        ret.setExamName(from.getExamName());
+
+        if (from.isAbsent() == true || from.isUpload() == false) {
+            ret.setObjectiveScoreText("-");
+            ret.setSubjectiveScoreText("-");
+            ret.setTotalScoreText("-");
+            ret.setAbsentText("缺考");
+        } else if (from.isBreach() == true) {
+            ret.setObjectiveScoreText("0");
+            ret.setSubjectiveScoreText("0");
+            ret.setTotalScoreText("0");
+        } else {
+            ret.setObjectiveScoreText(from.getObjectiveScoreString());
+            ret.setSubjectiveScoreText(from.getSubjectiveScoreString());
+            ret.setTotalScoreText(from.getTotalScoreString());
+        }
+
+        if (from.isUpload() == false) {
+            ret.setUploadText("未上传");
+        } else {
+            ret.setUploadText("已上传");
+        }
+        if (from.isBreach() == true) {
+            ret.setBreachText("违纪");
+        }
+        return ret;
+    }
+}

+ 26 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/query/ExamStudentSearchQuery.java

@@ -12,9 +12,13 @@ import cn.com.qmth.stmms.biz.common.BaseQuery;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.common.enums.Role;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
+import io.swagger.annotations.ApiModelProperty;
 
 public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
+    @ApiModelProperty(value = "筛选 0-无;1-客观0分,主观有分;2-客观有分,主观0分")
+    private Integer filter;
+
     private Integer userId;
 
     private Role role;
@@ -25,16 +29,20 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
     private String campusName;
 
+    @ApiModelProperty(value = "姓名")
     private String name;
 
     private String examNumberIn;
 
+    @ApiModelProperty(value = "准考证号")
     private String examNumber;
 
     private String secretNumber;
 
+    @ApiModelProperty(value = "学号")
     private String studentCode;
 
+    @ApiModelProperty(value = "科目")
     private String subjectCode;
 
     private String batchCode;
@@ -45,8 +53,10 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
     private String subjectCategory;
 
+    @ApiModelProperty(value = "考点")
     private String examSite;
 
+    @ApiModelProperty(value = "考场")
     private String examRoom;
 
     private Double objectiveScore;
@@ -63,8 +73,10 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
     private Double subjectiveScoreLt;
 
+    @ApiModelProperty(value = "是否上传")
     private Boolean upload;
 
+    @ApiModelProperty(value = "是否缺考")
     private Boolean absent;
 
     private Boolean manualAbsent;
@@ -91,18 +103,24 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
 
     private String ids;
 
+    @ApiModelProperty(value = "总分开始")
     private Double startScore;
 
+    @ApiModelProperty(value = "总分截止")
     private Double endScore;
 
+    @ApiModelProperty(value = "是否违纪")
     private Boolean breach;
 
     private Boolean trial;
 
+    @ApiModelProperty(value = "学院")
     private String college;
 
+    @ApiModelProperty(value = "班级")
     private String className;
 
+    @ApiModelProperty(value = "任课老师")
     private String teacher;
 
     private String paperType;
@@ -603,4 +621,12 @@ public class ExamStudentSearchQuery extends BaseQuery<ExamStudent> {
         this.objectiveCodes = objectiveCodes;
     }
 
+    public Integer getFilter() {
+        return filter;
+    }
+
+    public void setFilter(Integer filter) {
+        this.filter = filter;
+    }
+
 }

+ 8 - 8
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/ImportQueryController.java → stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/InspectImportController.java

@@ -24,6 +24,7 @@ import com.qmth.boot.core.collection.PageResult;
 import cn.com.qmth.stmms.admin.vo.InspectedStudentVO;
 import cn.com.qmth.stmms.admin.vo.TagStudentVO;
 import cn.com.qmth.stmms.api.controller.BaseApiController;
+import cn.com.qmth.stmms.biz.exam.bean.InspectImportVo;
 import cn.com.qmth.stmms.biz.exam.bean.ResultMessage;
 import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
 import cn.com.qmth.stmms.biz.exam.model.ImportQuery;
@@ -44,11 +45,11 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
 @Api(tags = "导入复核")
-@Controller("adminImportQueryController")
+@Controller
 @RequestMapping("/api/admin/exam/inspected/import")
-public class ImportQueryController extends BaseApiController {
+public class InspectImportController extends BaseApiController {
 
-    protected static Logger log = LoggerFactory.getLogger(ImportQueryController.class);
+    protected static Logger log = LoggerFactory.getLogger(InspectImportController.class);
 
     @Autowired
     private ExamStudentService studentService;
@@ -78,7 +79,7 @@ public class ImportQueryController extends BaseApiController {
     @ApiOperation(value = "分页查询")
     @ResponseBody
     @RequestMapping(value = "list", method = RequestMethod.POST)
-    public PageResult<ExamStudent> list(ExamStudentSearchQuery query) {
+    public PageResult<InspectImportVo> list(ExamStudentSearchQuery query) {
         int examId = getSessionExamId();
         ApiUser wu = getApiUser();
         ImportQuery importQuery = queryService.findByExamIdAndUserIdAndType(examId, wu.getUser().getId(),
@@ -88,9 +89,9 @@ public class ImportQueryController extends BaseApiController {
             inspectCount = importQuery.getStudentCodeList().size() > 0 ? 0 : importQuery.getStudentIdList().size();
         }
         if (inspectCount > 0) {
+            List<InspectImportVo> ret = new ArrayList<>();
             List<?> ids = PageUtil.startPage(importQuery.getStudentIdList(), query.getPageNumber(),
                     query.getPageSize());
-            List<ExamStudent> list = new ArrayList<ExamStudent>();
             if (ids != null) {
                 for (Object id : ids) {
                     ExamStudent student = studentService.findById((int) id);
@@ -101,12 +102,11 @@ public class ImportQueryController extends BaseApiController {
                         student.setSubjectiveScoreList(
                                 student.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
                     }
-                    list.add(student);
+                    ret.add(InspectImportVo.of(student));
                 }
             }
             query.setTotalCount(inspectCount);
-            query.setResult(list);
-            return PageUtil.of(list, query);
+            return PageUtil.of(ret, query);
         }
         return PageUtil.emptyPage();
     }

+ 301 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/admin/ScoreController.java

@@ -0,0 +1,301 @@
+package cn.com.qmth.stmms.api.controller.admin;
+
+import java.io.ByteArrayInputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.io.output.ByteArrayOutputStream;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.qmth.boot.core.collection.PageResult;
+import com.qmth.boot.tools.io.ZipWriter;
+
+import cn.com.qmth.stmms.admin.dto.ExamStudentDTO;
+import cn.com.qmth.stmms.admin.utils.ExportStudentExcel;
+import cn.com.qmth.stmms.api.controller.BaseApiController;
+import cn.com.qmth.stmms.biz.exam.bean.ScoreVo;
+import cn.com.qmth.stmms.biz.exam.model.Exam;
+import cn.com.qmth.stmms.biz.exam.model.ExamPackage;
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
+import cn.com.qmth.stmms.biz.exam.model.ExamSubject;
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.exam.service.ExamPackageService;
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
+import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
+import cn.com.qmth.stmms.biz.exception.StatusException;
+import cn.com.qmth.stmms.biz.file.service.FileService;
+import cn.com.qmth.stmms.biz.utils.PageUtil;
+import cn.com.qmth.stmms.common.annotation.Logging;
+import cn.com.qmth.stmms.common.domain.ApiUser;
+import cn.com.qmth.stmms.common.enums.LogType;
+import cn.com.qmth.stmms.common.utils.Encodes;
+import cn.com.qmth.stmms.common.utils.ExportExcel;
+import cn.com.qmth.stmms.common.utils.RequestUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api(tags = "成绩查询")
+@Controller("adminScoreController")
+@RequestMapping("/api/admin/exam/score")
+public class ScoreController extends BaseApiController {
+
+    @Autowired
+    private ExamSubjectService subjectService;
+
+    @Autowired
+    private ExamStudentService studentService;
+
+    @Autowired
+    private ExamQuestionService questionService;
+
+    @Autowired
+    private ExamPackageService packageService;
+
+    @Autowired
+    private ExamService examService;
+
+    @Autowired
+    private FileService fileService;
+
+    public static final String UN_SELECTIVE_SCORE = "-1";
+
+    @Logging(menu = "成绩查询", type = LogType.QUERY)
+    @ApiOperation(value = "分页查询")
+    @RequestMapping(value = "list", method = RequestMethod.POST)
+    @ResponseBody
+    public PageResult<ScoreVo> list(ExamStudentSearchQuery query) {
+        Integer filter = query.getFilter();
+        ApiUser wu = getApiUser();
+        int examId = getSessionExamId();
+        query.setExamId(examId);
+        if (filter == 1) {
+            query.setObjectiveScore(0d);
+            query.setSubjectiveScoreGt(0d);
+        } else if (filter == 2) {
+            query.setObjectiveScoreGt(0d);
+            query.setSubjectiveScore(0d);
+        }
+        if ((wu.isSubjectHeader() || wu.isSchoolViewer()) && StringUtils.isBlank(query.getSubjectCode())) {
+            String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
+            query.setSubjectCodeIn(subjectCodeIn);
+        }
+        query.setRole(wu.getRole());
+        query.setUserId(wu.getId());
+        query = studentService.findByQueryPlus(query);
+        for (ExamStudent student : query.getResult()) {
+            buildSheetUrl(student);
+            buildPackageUrl(student);
+            buildAnswerUrl(student);
+        }
+        String logMessage = getLogMessage(query, filter);
+        RequestUtils.setLog(logMessage);
+        Exam exam = examService.findById(examId);
+        List<ScoreVo> ret = new ArrayList<>();
+        for (ExamStudent es : query.getResult()) {
+            ScoreVo vo = ScoreVo.of(es);
+            if ((wu.isSubjectHeader() || wu.isSchoolViewer()) && exam.isForbiddenInfo()) {
+                vo.setExamNumber("***");
+                vo.setName("***");
+                vo.setStudentCode("***");
+            }
+            ret.add(vo);
+        }
+        return PageUtil.of(ret, query);
+    }
+
+    private String getLogMessage(ExamStudentSearchQuery query, Integer filter) {
+        StringBuilder builder = new StringBuilder();
+        if (StringUtils.isNotBlank(query.getName())) {
+            builder.append("姓名:").append(query.getName()).append(";");
+        }
+        if (StringUtils.isNotBlank(query.getExamNumber())) {
+            builder.append("准考证号:").append(query.getExamNumber()).append(";");
+        }
+        if (StringUtils.isNotBlank(query.getStudentCode())) {
+            builder.append("学号:").append(query.getStudentCode()).append(";");
+        }
+        if (StringUtils.isNotBlank(query.getSubjectCode())) {
+            builder.append("科目代码:").append(query.getSubjectCode()).append(";");
+        }
+        if (filter == 1) {
+            builder.append("客观0分,主观有分").append(";");
+        }
+        if (filter == 2) {
+            builder.append("客观有分,主观0分").append(";");
+        }
+        if (query.getAbsent() != null) {
+            builder.append("缺考:").append(query.getAbsent() ? "缺考" : "正常").append(";");
+        }
+        if (query.getUpload() != null) {
+            builder.append("上传:").append(query.getUpload() ? "已上传" : "未上传").append(";");
+        }
+        if (query.getBreach() != null) {
+            builder.append("缺考:").append(query.getBreach() ? "违纪" : "正常").append(";");
+        }
+        if (StringUtils.isNotBlank(query.getExamSite())) {
+            builder.append("考点:").append(query.getExamSite()).append(";");
+        }
+        if (StringUtils.isNotBlank(query.getExamRoom())) {
+            builder.append("考场:").append(query.getExamRoom()).append(";");
+        }
+        if (StringUtils.isNotBlank(query.getCollege())) {
+            builder.append("学院:").append(query.getCollege()).append(";");
+        }
+        if (StringUtils.isNotBlank(query.getClassName())) {
+            builder.append("班级:").append(query.getClassName()).append(";");
+        }
+        if (StringUtils.isNotBlank(query.getTeacher())) {
+            builder.append("任课老师:").append(query.getTeacher()).append(";");
+        }
+        if (query.getStartScore() != null) {
+            builder.append("总分从").append(query.getStartScore()).append("到").append(query.getEndScore()).append(";");
+        }
+        return builder.toString();
+    }
+
+    @Logging(menu = "导出成绩", type = LogType.EXPORT)
+    @ApiOperation(value = "导出成绩")
+    @RequestMapping(value = "export", method = RequestMethod.POST)
+    @ResponseBody
+    public void export(ExamStudentSearchQuery query, HttpServletResponse response) {
+        ApiUser wu = getApiUser();
+        Exam exam = examService.findById(getSessionExamId());
+        if (exam == null || !exam.getSchoolId().equals(wu.getUser().getSchoolId())) {
+            throw new StatusException("请选择正确的考试");
+        }
+        String fileName = "成绩单.xlsx";
+        query.setExamId(exam.getId());
+        Set<String> subjectSet = new HashSet<>();
+        List<String> error = new ArrayList<String>();
+        // 单科目导出
+        if (StringUtils.isNotBlank(query.getSubjectCode())) {
+            String exportMessage = subjectService.enableExport(exam, query.getSubjectCode());
+            // 判断不允许导出则直接返回
+            if (exportMessage != null) {
+                throw new StatusException("该科目不能导出成绩 " + exportMessage);
+            }
+            subjectSet.add(query.getSubjectCode());
+        }
+        // 全体科目导出
+        else {
+            List<ExamSubject> list = subjectService.list(exam.getId());
+            if (wu.isSubjectHeader() || wu.isSchoolViewer()) {
+                list = getExamSubject(exam.getId(), wu);
+            }
+            for (ExamSubject subject : list) {
+                // 遍历所有科目,判断是否允许导出
+                String meaages = subjectService.enableExport(exam, subject.getCode());
+                if (meaages == null) {
+                    subjectSet.add(subject.getCode());
+                } else {
+                    error.add(meaages);
+                }
+            }
+            if (list.size() != subjectSet.size()) {
+                fileName = "成绩单(未导出全量数据).xlsx";
+            }
+        }
+        try {
+            List<ExamStudentDTO> list = new LinkedList<>();
+            // 可导出科目不为空时,才能执行查询操作
+            if (!subjectSet.isEmpty()) {
+                String subjectCodeIn = StringUtils.join(subjectSet, ",");
+                query.setSubjectCodeIn(subjectCodeIn);
+                query.setPageNumber(1);
+                query.setPageSize(Integer.MAX_VALUE);
+                query.setRole(wu.getRole());
+                query.setUserId(wu.getId());
+                query = studentService.findByQueryPlus(query);
+                for (ExamStudent student : query.getResult()) {
+                    if (!student.isUpload() || student.isBreach() || student.isAbsent()) {
+                        student.setObjectiveScore(0d);
+                        student.setSubjectiveScore(0d);
+                    }
+                    if (student.getSubjectiveScoreList() != null) {
+                        student.setSubjectiveScoreList(
+                                student.getSubjectiveScoreList().replace(UN_SELECTIVE_SCORE, "/"));
+                    }
+                    list.add(new ExamStudentDTO(student));
+                }
+            }
+            if (StringUtils.isNotBlank(query.getSubjectCode())) {
+                List<String> headerList = getOptionHeader(exam.getId(), query.getSubjectCode());
+                ExportStudentExcel excel = new ExportStudentExcel("成绩单", headerList, ExamStudentDTO.class);
+                excel.setDataList(list, true);
+                excel.write(response, fileName).dispose();
+            } else {
+                response.setHeader("Content-Disposition", "attachment; filename=" + Encodes.urlEncode("成绩单.zip"));
+                ZipWriter writer = ZipWriter.create(response.getOutputStream());
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                new ExportExcel("成绩单", ExamStudentDTO.class).setDataList(list).write(os);
+                byte[] value = os.toByteArray();
+                writer.write(new ByteArrayInputStream(value), fileName);
+                if (!error.isEmpty()) {
+                    writer.write(StringUtils.join(error, ";").getBytes(), "error.txt");
+                }
+                writer.close();
+            }
+        } catch (Exception e) {
+            throw new StatusException("导出成绩失败!" + e.getMessage());
+        }
+    }
+
+    private List<String> getOptionHeader(int examId, String subjectCode) {
+        List<String> headerList = new ArrayList<String>();
+        List<ExamQuestion> oQuestions = questionService.findByExamAndSubjectAndObjectiveGroupByNumber(examId,
+                subjectCode, true);
+        List<ExamQuestion> sQestions = questionService.findByExamAndSubjectAndObjective(examId, subjectCode, false);
+        for (ExamQuestion examQuestion : oQuestions) {
+            headerList.add(getTitle(examQuestion) + "选项");
+            headerList.add(getTitle(examQuestion) + "得分");
+        }
+        for (ExamQuestion examQuestion : sQestions) {
+            headerList.add(getTitle(examQuestion));
+        }
+        return headerList;
+    }
+
+    private String getTitle(ExamQuestion examQuestion) {
+        return examQuestion.getMainTitle() + " " + examQuestion.getMainNumber() + "-" + examQuestion.getSubNumber();
+    }
+
+    private void buildSheetUrl(ExamStudent student) {
+        // 改为内部原图浏览地址,直接附带标记内容
+        student.setSheetUrls(
+                fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1, student.getSheetCount()));
+    }
+
+    private void buildPackageUrl(ExamStudent student) {
+        if (StringUtils.isNotBlank(student.getPackageCode())) {
+            ExamPackage ep = packageService.find(student.getExamId(), student.getPackageCode());
+            if (ep != null && ep.getPicCount() > 0) {
+                student.setPackageUrls(fileService.getPackageUris(ep.getExamId(), ep.getCode(), 1, ep.getPicCount()));
+            }
+        }
+    }
+
+    private void buildAnswerUrl(ExamStudent student) {
+        ExamSubject subject = subjectService.find(student.getExamId(), student.getSubjectCode());
+        if (subject != null && subject.getAnswerFileType() != null) {
+            student.setAnswerUrl(
+                    fileService.getAnswerUri(subject.getExamId(), subject.getCode(), subject.getAnswerFileType()));
+        }
+        if (subject != null) {
+            student.setSubjectRemark(StringUtils.trimToEmpty(subject.getRemark()));
+        }
+    }
+
+}