瀏覽代碼

增加按原图序号获取标记内容的接口;支持后台渲染左上角成绩明细的方法

luoshi 6 年之前
父節點
當前提交
ad6ddb6e7e

+ 2 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -112,6 +112,8 @@ public interface ExamStudentService {
     List<Object[]> statisticsByAbsentAndBreach(Integer examId, String code, Boolean upload, boolean absent,
             boolean breach);
 
+    List<PictureTag> buildSheetTags(ExamStudent student, int index);
+
     Map<Integer, List<PictureTag>> buildSheetTags(ExamStudent student);
 
     Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student);

+ 86 - 42
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/ExamStudentServiceImpl.java

@@ -733,39 +733,88 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
     }
 
     /**
-     * 根据考生还原图片上轨迹和特殊标记并拼接
+     * 根据考生获得某张原图上的评卷标记和分数明细
+     */
+    @Override
+    public List<PictureTag> buildSheetTags(ExamStudent student, int index) {
+        List<PictureTag> list = new LinkedList<>();
+        // 第一页原图才需要显示总分明细
+        // if (index == 1) {
+        // list.add(buildScoreDetailTag(student));
+        // }
+        // 构造评卷标记信息
+        Exam exam = examService.findById(student.getExamId());
+        List<PictureConfigItem> sliceConfig = exam.getSliceConfigList();
+        if (!sliceConfig.isEmpty()) {
+            List<PictureTag> tags = PictureConfigTransform.process(sliceConfig, getSliceTags(student)).get(index);
+            if (tags != null) {
+                list.addAll(tags);
+            }
+        }
+        return list;
+    }
+
+    /**
+     * 根据考生获得所有原图上的评卷标记和分数明细
      */
     @Override
     public Map<Integer, List<PictureTag>> buildSheetTags(ExamStudent student) {
-        DecimalFormat format = new DecimalFormat("###.#");
         Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
         Exam exam = examService.findById(student.getExamId());
         List<PictureConfigItem> sliceConfig = exam.getSliceConfigList();
         if (!sliceConfig.isEmpty()) {
-            // 裁切图配置存在时才继续下面内容
-            List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
-                    student.getSubjectCode(), false);
-            List<ScoreItem> scoreList = student.getScoreList(false);
-            List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(),
-                    student.getSubjectCode());
-            for (MarkGroup group : markGroups) {
-                tagMap.put(group, buildOriginTags(student, group, questions, scoreList));
-            }
+            // 有裁切图配置时才需要获取原始评卷标记信息
+            tagMap = getSliceTags(student);
         }
         Map<Integer, List<PictureTag>> map = PictureConfigTransform.process(sliceConfig, tagMap);
-        // 开始构建总分与客观题得分明细
+        // List<PictureTag> list = map.get(1);
+        // if (list == null) {
+        // list = new LinkedList<>();
+        // map.put(1, list);
+        // }
+        // list.add(buildScoreDetailTag(student));
+        return map;
+    }
+
+    /**
+     * 根据考生获取所有评卷分组的评卷标记内容
+     */
+    @Override
+    public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student) {
+        Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
+        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
+                student.getSubjectCode(), false);
+        List<ScoreItem> scoreList = student.getScoreList(false);
+        List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
+        for (MarkGroup group : markGroups) {
+            tagMap.put(group, buildOriginTags(student, group, questions, scoreList));
+        }
+        return tagMap;
+    }
+
+    /**
+     * 根据考生构造显示到第一张原图左上角的总分与主客观题明细标记
+     * 
+     * @param student
+     * @return
+     */
+    private PictureTag buildScoreDetailTag(ExamStudent student) {
+        DecimalFormat format = new DecimalFormat("###.#");
+        // 所有显示内容
         List<String> lines = new LinkedList<>();
         lines.add("成绩明细");
+        // 总分得分明细
         lines.add("总分 (客观+主观) | " + format.format(student.getTotalScore()) + "="
                 + format.format(student.getObjectiveScore() != null ? student.getObjectiveScore() : 0) + "+"
                 + format.format(student.getSubjectiveScore() != null ? student.getSubjectiveScore() : 0));
-        lines.add("客观题结果");
-
+        // 客观题得分明细
+        List<String> objectives = new LinkedList<>();
         List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
                 student.getSubjectCode(), true);
         List<ScoreItem> scoreList = student.getScoreList(true);
         List<String> details = new ArrayList<>();
         int i = 0;
+        int length = 0;
         for (ScoreItem item : scoreList) {
             i++;
             if (questions.size() < i) {
@@ -775,45 +824,40 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             if (question.getTotalScore() == null || question.getTotalScore() == 0) {
                 continue;
             }
-            details.add(item.getAnswer() + ":" + format.format(item.getScore()));
-            if (details.size() == 20) {
-                lines.add(StringUtils.join(details, ","));
+            String content = item.getAnswer() + ":" + format.format(item.getScore());
+            if ((length + content.length()) > 60) {
+                // 一行只显示不超过60个字符,避免遮盖主观题答题区域
+                objectives.add(StringUtils.join(details, ","));
                 details.clear();
+                length = 0;
             }
+            details.add(content);
+            length += content.length();
         }
         if (!details.isEmpty()) {
-            lines.add(StringUtils.join(details, ","));
+            objectives.add(StringUtils.join(details, ","));
             details.clear();
         }
-        PictureTag headerTag = new PictureTag();
-        headerTag.setSize(30);
-        headerTag.setContent(lines);
-        // 添加到第一张图片的标记列表中
-        List<PictureTag> list = map.get(1);
-        if (list == null) {
-            list = new LinkedList<>();
-            map.put(1, list);
+        if (objectives.size() > 1) {
+            objectives.add(0, "客观题明细");
+            lines.addAll(objectives);
         }
-        list.add(headerTag);
-        return map;
+        PictureTag tag = new PictureTag();
+        tag.setSize(30);
+        tag.setTop(40);
+        tag.setContent(lines);
+        return tag;
     }
 
     /**
-     * 根据考生获取所有评卷分组的标记内容
+     * 获取某个考生某个评卷分组的所有评卷标记
+     * 
+     * @param student
+     * @param group
+     * @param questions
+     * @param scoreList
+     * @return
      */
-    @Override
-    public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student) {
-        Map<MarkGroup, List<OriginTag>> tagMap = new HashMap<MarkGroup, List<OriginTag>>();
-        List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
-                student.getSubjectCode(), false);
-        List<ScoreItem> scoreList = student.getScoreList(false);
-        List<MarkGroup> markGroups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
-        for (MarkGroup group : markGroups) {
-            tagMap.put(group, buildOriginTags(student, group, questions, scoreList));
-        }
-        return tagMap;
-    }
-
     private List<OriginTag> buildOriginTags(ExamStudent student, MarkGroup group, List<ExamQuestion> questions,
             List<ScoreItem> scoreList) {
         DecimalFormat format = new DecimalFormat("###.#");

+ 39 - 12
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/ExamStudentController.java

@@ -29,10 +29,14 @@ import cn.com.qmth.stmms.biz.campus.service.CampusService;
 import cn.com.qmth.stmms.biz.exam.model.Exam;
 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.Marker;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
 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.MarkerService;
+import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
+import cn.com.qmth.stmms.biz.mark.service.MarkLibraryService;
 import cn.com.qmth.stmms.biz.user.model.User;
 import cn.com.qmth.stmms.biz.utils.ScoreItem;
 import cn.com.qmth.stmms.common.utils.RequestUtils;
@@ -46,7 +50,7 @@ public class ExamStudentController extends BaseApiController {
     protected static Logger logger = LoggerFactory.getLogger(ExamStudentController.class);
 
     @Autowired
-    private ExamStudentService examStudentService;
+    private ExamStudentService studentService;
 
     @Autowired
     private ExamService examService;
@@ -57,6 +61,12 @@ public class ExamStudentController extends BaseApiController {
     @Autowired
     private ExamQuestionService questionService;
 
+    @Autowired
+    private MarkLibraryService libraryService;
+
+    @Autowired
+    private MarkerService markerService;
+
     @AuthValidate("adminUser")
     @RequestMapping(value = "/student/manualAbsent/{examId}", method = RequestMethod.POST)
     @ResponseBody
@@ -66,7 +76,7 @@ public class ExamStudentController extends BaseApiController {
         Exam exam = examService.findById(examId);
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
             for (MenualAbsentDTO dto : datas) {
-                examStudentService.updateManualAbsent(examId, dto.getExamNumber(), dto.isAbsent());
+                studentService.updateManualAbsent(examId, dto.getExamNumber(), dto.isAbsent());
             }
             return true;
         } else {
@@ -81,7 +91,7 @@ public class ExamStudentController extends BaseApiController {
         User user = RequestUtils.getApiUser(request);
         Exam exam = examService.findById(examId);
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
-            examStudentService.clearManualAbsent(examId);
+            studentService.clearManualAbsent(examId);
             return true;
         } else {
             throw ApiException.EXAM_NOT_ACCESSIBLED;
@@ -96,7 +106,7 @@ public class ExamStudentController extends BaseApiController {
         List<ExamStudent> esList = new LinkedList<ExamStudent>();
         Exam exam = examService.findById(examId);
         if (exam != null) {
-            esList = examStudentService.findByExamId(examId);
+            esList = studentService.findByExamId(examId);
         }
         for (ExamStudent student : esList) {
             JSONObject obj = new JSONObject();
@@ -138,7 +148,7 @@ public class ExamStudentController extends BaseApiController {
             query.setPageNumber(1);
             query.setPageSize(Integer.MAX_VALUE);
         }
-        examStudentService.findByQuery(query);
+        studentService.findByQuery(query);
         for (ExamStudent student : query.getResult()) {
             JSONObject obj = new JSONObject();
             obj.accumulate("id", student.getId());
@@ -162,7 +172,7 @@ public class ExamStudentController extends BaseApiController {
     public JSONObject checkStudent(HttpServletRequest request, @RequestBody ExamStudent examStudent) {
         JSONObject obj = new JSONObject();
         Exam exam = examService.findById(examStudent.getExamId());
-        ExamStudent student = examStudentService.findByExamIdAndExamNumber(examStudent.getExamId(),
+        ExamStudent student = studentService.findByExamIdAndExamNumber(examStudent.getExamId(),
                 examStudent.getExamNumber());
         if (student != null) {
             obj.accumulate("examId", examStudent.getExamId());
@@ -200,7 +210,7 @@ public class ExamStudentController extends BaseApiController {
             query.setExamId(examId);
             query.setUpload(upload);
             query.setAbsent(absent);
-            return examStudentService.countByQuery(query);
+            return studentService.countByQuery(query);
         }
         return 0;
     }
@@ -209,7 +219,8 @@ public class ExamStudentController extends BaseApiController {
     @RequestMapping("/exam/students")
     @ResponseBody
     public JSONArray getStudent(HttpServletRequest request, ExamStudentSearchQuery query,
-            @RequestParam(required = false) Boolean withScoreDetail) {
+            @RequestParam(required = false) Boolean withScoreDetail,
+            @RequestParam(required = false) Boolean withMarkTrack) {
         User user = RequestUtils.getApiUser(request);
         JSONArray array = new JSONArray();
         if (query.getExamId() == null) {
@@ -218,7 +229,7 @@ public class ExamStudentController extends BaseApiController {
         Exam exam = examService.findById(query.getExamId());
         if (exam != null && exam.getSchoolId().equals(user.getSchoolId())) {
             DecimalFormat format = new DecimalFormat("####.##");
-            examStudentService.findByQuery(query);
+            studentService.findByQuery(query);
             for (ExamStudent student : query.getResult()) {
                 JSONObject obj = new JSONObject();
                 obj.accumulate("id", student.getId());
@@ -293,10 +304,15 @@ public class ExamStudentController extends BaseApiController {
                             detail.accumulate("mainNumber", question.getMainNumber());
                             detail.accumulate("subNumber", question.getSubNumber());
                             detail.accumulate("score", item.getScore());
+                            detail.accumulate("marker", getMarkerNames(student, question.getMainNumber()));
                             subjective.add(detail);
                         }
                         obj.accumulate("subjectiveScoreDetail", subjective);
                     }
+                    // 返回评卷标记
+                    if (withMarkTrack != null && withMarkTrack.booleanValue()) {
+                        obj.accumulate("tags", studentService.buildSheetTags(student));
+                    }
                     array.add(obj);
                 } catch (Exception e) {
                     logger.error("student api error", e);
@@ -306,6 +322,18 @@ public class ExamStudentController extends BaseApiController {
         return array;
     }
 
+    private List<String> getMarkerNames(ExamStudent student, Integer groupNumber) {
+        List<String> names = new LinkedList<>();
+        List<MarkLibrary> list = libraryService.findByStudentAndGroup(student.getId(), groupNumber);
+        for (MarkLibrary library : list) {
+            Marker marker = markerService.findById(library.getMarkerId());
+            if (marker != null) {
+                names.add(marker.getName());
+            }
+        }
+        return names;
+    }
+
     /**
      * 
      * @param s
@@ -369,10 +397,9 @@ public class ExamStudentController extends BaseApiController {
         ExamStudent student = null;
         try {
             if (Strings.isNullOrEmpty(examSeqCode)) {
-                student = examStudentService.findBySchoolIdAndSubjectCodeAndStudentCode(schoolId, subjectCode,
-                        studentCode);
+                student = studentService.findBySchoolIdAndSubjectCodeAndStudentCode(schoolId, subjectCode, studentCode);
             } else {
-                student = examStudentService.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode,
+                student = studentService.findBySchoolIdAndSubjectCodeAndStudentCodeAndRemark(schoolId, subjectCode,
                         studentCode, examSeqCode);
             }
             if (student != null) {

+ 1 - 1
stmms-web/src/main/java/cn/com/qmth/stmms/api/controller/PictureController.java

@@ -85,7 +85,7 @@ public class PictureController {
         try {
             List<PictureTag> tags = null;
             if (withTag != null && withTag) {
-                tags = studentService.buildSheetTags(student).get(index);
+                tags = studentService.buildSheetTags(student, index);
             }
             BufferedImage image = ImageBuildUtil.buildTagImage(getSheetImage(student, index), tags);
             response.setContentType("image/jpeg");

+ 1 - 2
stmms-web/src/main/java/cn/com/qmth/stmms/api/utils/SheetDownloadThread.java

@@ -73,8 +73,7 @@ public class SheetDownloadThread implements Runnable {
         try {
             file.getParentFile().mkdirs();
             BufferedImage image = ImageBuildUtil.buildTagImage(controller.getSheetImage(student, index),
-                    withTag != null && withTag.booleanValue() ? studentService.buildSheetTags(student).get(index)
-                            : null);
+                    withTag != null && withTag.booleanValue() ? studentService.buildSheetTags(student, index) : null);
             ImageIO.write(image, "jpg", file);
             log.info("write sheet file success: " + file.getAbsolutePath());
         } catch (Exception e) {