Parcourir la source

服务端渲染原图功能,增加第一张原图左上角的成绩明细与客观题明细内容

luoshi il y a 6 ans
Parent
commit
87a70194f9

+ 6 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/Exam.java

@@ -2,6 +2,7 @@ package cn.com.qmth.stmms.biz.exam.model;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
@@ -13,6 +14,7 @@ import javax.persistence.Table;
 import javax.persistence.Temporal;
 import javax.persistence.TemporalType;
 
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.common.enums.ExamStatus;
 
 @Entity
@@ -154,4 +156,8 @@ public class Exam implements Serializable {
         this.sliceConfig = sliceConfig;
     }
 
+    public List<PictureConfigItem> getSliceConfigList() {
+        return PictureConfigItem.parse(sliceConfig);
+    }
+
 }

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

@@ -737,9 +737,10 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
      */
     @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 = PictureConfigItem.parse(exam.getSliceConfig());
+        List<PictureConfigItem> sliceConfig = exam.getSliceConfigList();
         if (!sliceConfig.isEmpty()) {
             // 裁切图配置存在时才继续下面内容
             List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
@@ -751,7 +752,50 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
                 tagMap.put(group, buildOriginTags(student, group, questions, scoreList));
             }
         }
-        return PictureConfigTransform.process(sliceConfig, tagMap);
+        Map<Integer, List<PictureTag>> map = PictureConfigTransform.process(sliceConfig, tagMap);
+        // 开始构建总分与客观题得分明细
+        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<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjective(student.getExamId(),
+                student.getSubjectCode(), true);
+        List<ScoreItem> scoreList = student.getScoreList(true);
+        List<String> details = new ArrayList<>();
+        int i = 0;
+        for (ScoreItem item : scoreList) {
+            i++;
+            if (questions.size() < i) {
+                break;
+            }
+            ExamQuestion question = questions.get(i - 1);
+            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, ","));
+                details.clear();
+            }
+        }
+        if (!details.isEmpty()) {
+            lines.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);
+        }
+        list.add(headerTag);
+        return map;
     }
 
     /**

+ 2 - 2
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureConfigTransform.java

@@ -70,7 +70,7 @@ public class PictureConfigTransform {
                     if (config.getW() > 0 && config.getH() > 0) {
                         if (top <= (config.getH() + start)) {
                             // 根据绝对高度判断显示元素是否落在当前拼接块
-                            buildSheetTag(map, sliceConfigs, config, tag.getContent(), left, top - start);
+                            buildTag(map, sliceConfigs, config, tag.getContent(), left, top - start);
                             break;
                         } else {
                             start += config.getH();
@@ -98,7 +98,7 @@ public class PictureConfigTransform {
      * @param top
      *            - 在拼接块内的上偏移
      */
-    private static void buildSheetTag(Map<Integer, List<PictureTag>> tags, List<PictureConfigItem> sliceConfigs,
+    private static void buildTag(Map<Integer, List<PictureTag>> tags, List<PictureConfigItem> sliceConfigs,
             PictureConfigItem config, String content, int left, int top) {
         if (sliceConfigs.size() >= config.getI()) {
             PictureConfigItem sliceConfig = sliceConfigs.get(config.getI() - 1);

+ 21 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/PictureTag.java

@@ -1,21 +1,31 @@
 package cn.com.qmth.stmms.biz.utils;
 
+import java.util.List;
+
 public class PictureTag {
 
-    private String content;
+    private String[] content;
 
     private int left;
 
     private int top;
 
-    public String getContent() {
+    private int size;
+
+    public String[] getContent() {
         return content;
     }
 
-    public void setContent(String content) {
+    public void setContent(String... content) {
         this.content = content;
     }
 
+    public void setContent(List<String> content) {
+        if (content != null && !content.isEmpty()) {
+            this.content = content.toArray(new String[content.size()]);
+        }
+    }
+
     public int getLeft() {
         return left;
     }
@@ -32,4 +42,12 @@ public class PictureTag {
         this.top = top;
     }
 
+    public int getSize() {
+        return size;
+    }
+
+    public void setSize(int size) {
+        this.size = size;
+    }
+
 }

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

@@ -25,7 +25,7 @@ import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
 import cn.com.qmth.stmms.admin.utils.UpyunConfig;
-import cn.com.qmth.stmms.api.utils.SheetBuildUtil;
+import cn.com.qmth.stmms.api.utils.ImageBuildUtil;
 import cn.com.qmth.stmms.api.utils.SheetDownloadThread;
 import cn.com.qmth.stmms.biz.campus.model.Campus;
 import cn.com.qmth.stmms.biz.campus.service.CampusService;
@@ -87,7 +87,7 @@ public class PictureController {
             if (withTag != null && withTag) {
                 tags = studentService.buildSheetTags(student).get(index);
             }
-            BufferedImage image = SheetBuildUtil.buildSheetImage(getSheetImage(student, index), tags);
+            BufferedImage image = ImageBuildUtil.buildTagImage(getSheetImage(student, index), tags);
             response.setContentType("image/jpeg");
             ImageIO.write(image, "jpg", response.getOutputStream());
         } catch (Exception e) {

+ 55 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/api/utils/ImageBuildUtil.java

@@ -0,0 +1,55 @@
+package cn.com.qmth.stmms.api.utils;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.util.List;
+
+import cn.com.qmth.stmms.biz.utils.PictureTag;
+
+public class ImageBuildUtil {
+
+    public static final String DEFAULT_FONT_NAME = "Arial";
+
+    public static final int DEFAULT_FONT_SIZE = 60;
+
+    public static final int DEFAULT_LINE_GAP = 10;
+
+    /**
+     * 根据指定的标记内容绘制新的图片
+     * 
+     * @param image
+     * @param tags
+     * @return
+     * @throws FileNotFoundException
+     * @throws IOException
+     */
+    public static BufferedImage buildTagImage(BufferedImage image, List<PictureTag> tags)
+            throws FileNotFoundException, IOException {
+        if (tags != null && !tags.isEmpty()) {
+            BufferedImage newImg = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
+            Graphics2D g = newImg.createGraphics();
+            g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
+            g.setColor(Color.RED);
+            for (PictureTag tag : tags) {
+                if (tag.getContent() == null) {
+                    continue;
+                }
+                int fontSize = tag.getSize() > 0 ? tag.getSize() : DEFAULT_FONT_SIZE;
+                int left = Math.max(fontSize, tag.getLeft());
+                int top = Math.max(fontSize, tag.getTop());
+                g.setFont(new Font(DEFAULT_FONT_NAME, Font.PLAIN, fontSize));
+                for (String content : tag.getContent()) {
+                    g.drawString(content, left, top);
+                    top = top + fontSize + DEFAULT_LINE_GAP;
+                }
+            }
+            g.dispose();
+            image = newImg;
+        }
+        return image;
+    }
+}

+ 0 - 31
stmms-web/src/main/java/cn/com/qmth/stmms/api/utils/SheetBuildUtil.java

@@ -1,31 +0,0 @@
-package cn.com.qmth.stmms.api.utils;
-
-import java.awt.Color;
-import java.awt.Font;
-import java.awt.Graphics2D;
-import java.awt.image.BufferedImage;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.List;
-
-import cn.com.qmth.stmms.biz.utils.PictureTag;
-
-public class SheetBuildUtil {
-
-    public static BufferedImage buildSheetImage(BufferedImage image, List<PictureTag> tags)
-            throws FileNotFoundException, IOException {
-        if (tags != null && !tags.isEmpty()) {
-            BufferedImage newImg = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_RGB);
-            Graphics2D g = newImg.createGraphics();
-            g.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null);
-            g.setColor(Color.RED);
-            g.setFont(new Font("Arial", Font.PLAIN, 60));
-            for (PictureTag tag : tags) {
-                g.drawString(tag.getContent(), Math.max(60, tag.getLeft()), Math.max(60, tag.getTop()));
-            }
-            g.dispose();
-            image = newImg;
-        }
-        return image;
-    }
-}

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

@@ -72,7 +72,7 @@ public class SheetDownloadThread implements Runnable {
                 + student.getExamNumber() + "-" + index + ".jpg");
         try {
             file.getParentFile().mkdirs();
-            BufferedImage image = SheetBuildUtil.buildSheetImage(controller.getSheetImage(student, index),
+            BufferedImage image = ImageBuildUtil.buildTagImage(controller.getSheetImage(student, index),
                     withTag != null && withTag.booleanValue() ? studentService.buildSheetTags(student).get(index)
                             : null);
             ImageIO.write(image, "jpg", file);