deason 2 năm trước cách đây
mục cha
commit
f3fe4e9a94

+ 51 - 5
src/main/java/cn/com/qmth/examcloud/tool/service/export_student_answer_and_score_detail/ExportStudentAnswerAndScoreDetailTask.java

@@ -4,6 +4,7 @@ import cn.com.qmth.examcloud.tool.config.SysProperty;
 import cn.com.qmth.examcloud.tool.entity.TaskEntity;
 import cn.com.qmth.examcloud.tool.service.CommonService;
 import cn.com.qmth.examcloud.tool.service.export_student_answer_and_score_detail.vo.CourseVO;
+import cn.com.qmth.examcloud.tool.service.export_student_answer_and_score_detail.vo.ExamStudentScoreVO;
 import cn.com.qmth.examcloud.tool.utils.*;
 import cn.com.qmth.examcloud.tool.vo.Pager;
 import cn.com.qmth.examcloud.tool.vo.User;
@@ -11,7 +12,9 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.write.handler.SheetWriteHandler;
 import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
 import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
+import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.ss.usermodel.Sheet;
 import org.slf4j.Logger;
@@ -80,25 +83,65 @@ public class ExportStudentAnswerAndScoreDetailTask {
 
         for (CourseVO course : todoCourses) {
             // 按考试课程逐个导出
-            this.export(examId, course, tempDir);
+            this.export(examId, course, user, tempDir);
         }
     }
 
-    private void export(Long examId, CourseVO course, String tempDir) {
+    private void export(Long examId, CourseVO course, User user, String tempDir) {
+        List<ExamStudentScoreVO> examStudentScoreList = this.getExamStudentScoreList(user.getKey(), user.getToken(), examId, course.getCourseId());
+
         //todo
 
         final String dataFilePath = tempDir + "/" + examId + "_" + course.getCourseCode() + ".xlsx";
         File dataFile = new File(sysProperty.getDataDir() + "/" + dataFilePath);
 
-        EasyExcel.write(dataFile, User.class).registerWriteHandler(new SheetWriteHandler() {
+        EasyExcel.write(dataFile, ExamStudentScoreVO.class).registerWriteHandler(new SheetWriteHandler() {
             @Override
             public void afterSheetCreate(WriteWorkbookHolder workbookHolder, WriteSheetHolder sheetHolder) {
                 Sheet sheet = sheetHolder.getSheet();
                 sheet.createFreezePane(1, 1);
             }
-        }).sheet().doWrite(new ArrayList<>());
+        }).sheet().doWrite(examStudentScoreList);
+    }
+
+    /**
+     * 获取考生成绩明细列表
+     */
+    private List<ExamStudentScoreVO> getExamStudentScoreList(String key, String token, Long examId, Long courseId) {
+        Map<String, Object> params = new HashMap<>();
+        params.put("examId", examId);
+        params.put("courseId", courseId);
+        params.put("pageSize", 2);
+
+        Map<String, String> headers = new HashMap<>();
+        headers.put("key", key);
+        headers.put("token", token);
+
+        String url = sysProperty.getServerUrl() + "/api/ecs_oe_admin/exam/score/statistic/list";
+        List<ExamStudentScoreVO> all = new ArrayList<>();
+        JsonMapper jsonMapper = new JsonMapper();
+
+        int sum = 0, pageNo = 0;
+        while (true) {
+            params.put("pageNo", ++pageNo);
+            String json = HttpHelper.post(url, headers, params);
+
+            Pager<ExamStudentScoreVO> page = jsonMapper.parseJson(json, new TypeReference<Pager<ExamStudentScoreVO>>() {
+            });
+            if (page == null || CollectionUtils.isEmpty(page.getContent())) {
+                break;
+            }
+            all.addAll(page.getContent());
+
+            sum += page.getContent().size();
+            float rate = sum * 100f / page.getTotalElements();
+            log.info("已获取考生成绩明细数:{} 进度:{}%", sum, rate);
+        }
+
+        return all;
     }
 
+
     /**
      * 获取考试相关的课程列表
      */
@@ -115,7 +158,10 @@ public class ExportStudentAnswerAndScoreDetailTask {
         String url = sysProperty.getServerUrl() + "/api/ecs_exam_work/exam/course/list";
         String json = HttpHelper.post(url, headers, params);
 
-        Pager<CourseVO> page = new JsonMapper().parseJson(json, Pager.class);
+        JsonMapper jsonMapper = new JsonMapper();
+        Pager<CourseVO> page = jsonMapper.parseJson(json, new TypeReference<Pager<CourseVO>>() {
+        });
+
         if (page != null && page.getContent() != null) {
             return page.getContent();
         }

+ 115 - 0
src/main/java/cn/com/qmth/examcloud/tool/service/export_student_answer_and_score_detail/vo/ExamStudentScoreVO.java

@@ -0,0 +1,115 @@
+package cn.com.qmth.examcloud.tool.service.export_student_answer_and_score_detail.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class ExamStudentScoreVO {
+
+    /**
+     * 考试ID
+     */
+    private Long examId;
+
+    /**
+     * 考试名称
+     */
+    private String examName;
+
+    /**
+     * 学生ID
+     */
+    private Long studentId;
+
+    /**
+     * 学号
+     */
+    private String studentCode;
+
+    /**
+     * 学生姓名
+     */
+    private String studentName;
+
+    /**
+     * 身份证号
+     */
+    private String identityNumber;
+
+    /**
+     * 课程ID
+     */
+    private Long courseId;
+
+    /**
+     * 课程Code
+     */
+    private String courseCode;
+
+    /**
+     * 课程名称
+     */
+    private String courseName;
+
+    /**
+     * 课程层次
+     */
+    private String courseLevel;
+
+    /**
+     * 学习中心ID
+     */
+    private Long orgId;
+
+    /**
+     * 学习中心代码
+     */
+    private String orgCode;
+
+    /**
+     * 学习中心名称
+     */
+    private String orgName;
+
+    /**
+     * 专业名称
+     */
+    private String specialtyName;
+
+    /**
+     * 年级
+     */
+    private String grade;
+
+    /**
+     * 是否完成考试
+     */
+    private String isFinished;
+
+    /**
+     * 是否缺考
+     */
+    private String isAbsent;
+
+    /**
+     * 最终成绩
+     */
+    private String finalExamScore;
+
+    /**
+     * 客观题得分总分
+     */
+    private String objectiveScore;
+
+    /**
+     * 主观题得分总分
+     */
+    private String subjectiveScore;
+
+    /**
+     * 考试记录ID
+     */
+    private Long examRecordDataId;
+
+}

+ 2 - 1
src/main/java/cn/com/qmth/examcloud/tool/utils/JsonMapper.java

@@ -159,7 +159,8 @@ public class JsonMapper {
     }
 
     /**
-     * 反序列化复杂的对象,如Page<Bean>
+     * 反序列化复杂的对象
+     * 如:jsonMapper.parseJson(json, new TypeReference<Bean<Bean>>(){});
      */
     public <T> T parseJson(String jsonStr, TypeReference javaType) {
         if (StringUtils.isEmpty(jsonStr)) {

+ 1 - 1
src/main/resources/templates/admin/taskList.ftlh

@@ -44,7 +44,7 @@
                         <template slot-scope="scope">
                             <span v-if="scope.row.status!='ERROR'">{{ taskStatusTitle(scope.row.status) }}</span>
                             <el-popover trigger="hover" placement="right" v-if="scope.row.status=='ERROR'">
-                                <p style="color: red">{{ scope.row.description }}&nbsp;</p>
+                                <p style="color: red;max-width: 500px">{{ scope.row.description }}&nbsp;</p>
                                 <div slot="reference">
                                     <span style="color: red;cursor: pointer">{{ taskStatusTitle(scope.row.status) }}</span>
                                 </div>