Browse Source

评卷坐标配置兼容比例模式

ting.yin 2 years ago
parent
commit
77b2e77f26

+ 13 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/common/domain/card/CardFile.java

@@ -53,17 +53,17 @@ public class CardFile {
     }
 
     private void postInit() {
-        //解析卡格式文件中的裁切图坐标,用于云阅卷同步
+        // 解析卡格式文件中的裁切图坐标,用于云阅卷同步
         this.sliceConfig = new SliceConfig();
         if (pages != null) {
             int pageNumber = 0;
             for (CardPageWrapper pageWrapper : pages) {
                 pageNumber++;
-                //默认使用遮盖模式
+                // 默认使用遮盖模式
                 sliceConfig.addConfig(pageNumber, 0, 0, 0, 0);
             }
         }
-        //解析卡格式文件中的大题评卷坐标,用于云阅卷评卷分组设置
+        // 解析卡格式文件中的大题评卷坐标,用于云阅卷评卷分组设置
         this.markConfig = new MarkConfig();
         if (pages != null) {
             int pageNumber = 0;
@@ -87,6 +87,16 @@ public class CardFile {
         return markConfig.getConfig(mainNumber);
     }
 
+    public String getMarkConfigAdd(List<MarkConfig.ConfigItem> list, double position) {
+        for (MarkConfig.ConfigItem configItem : list) {
+            configItem.left = configItem.left + position;
+            configItem.top = configItem.top + position;
+            configItem.width = configItem.width + position;
+            configItem.height = configItem.height + position;
+        }
+        return list.toString();
+    }
+
     /**
      * 输出到文件前,进行必要的字段值转换与处理
      */

+ 25 - 15
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/model/MarkGroup.java

@@ -1,14 +1,5 @@
 package cn.com.qmth.stmms.biz.exam.model;
 
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
-import cn.com.qmth.stmms.biz.utils.ScoreItem;
-import cn.com.qmth.stmms.common.enums.MarkMode;
-import cn.com.qmth.stmms.common.enums.MarkStatus;
-import cn.com.qmth.stmms.common.enums.ScorePolicy;
-import cn.com.qmth.stmms.common.enums.ThirdPolicy;
-import org.apache.commons.lang.StringUtils;
-
-import javax.persistence.*;
 import java.io.Serializable;
 import java.text.DecimalFormat;
 import java.util.Date;
@@ -16,6 +7,25 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Table;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+
+import org.apache.commons.lang.StringUtils;
+
+import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
+import cn.com.qmth.stmms.biz.utils.ScoreItem;
+import cn.com.qmth.stmms.common.enums.MarkMode;
+import cn.com.qmth.stmms.common.enums.MarkStatus;
+import cn.com.qmth.stmms.common.enums.ScorePolicy;
+import cn.com.qmth.stmms.common.enums.ThirdPolicy;
+
 /**
  * 评卷分组对象
  */
@@ -145,7 +155,7 @@ public class MarkGroup implements Serializable {
         this.pk = new MarkGroupPK();
     }
 
-    public MarkGroup(Integer examId, String subjectCode, Integer number, List<PictureConfigItem> configList,
+    public MarkGroup(Integer examId, String subjectCode, Integer number, List<MarkConfigItem> configList,
             Double totalScore, Double doubleRate, Double arbitrateThreshold, Integer scorePolicy, String markMode,
             Integer trialCount, boolean sheetView, boolean enableAllZero, Integer thirdPolicy, boolean selective) {
         this.pk = new MarkGroupPK();
@@ -153,7 +163,7 @@ public class MarkGroup implements Serializable {
         this.pk.setNumber(number);
         this.pk.setSubjectCode(subjectCode);
         this.picList = configList != null && configList.size() > 0 ? StringUtils.join(configList,
-                PictureConfigItem.DB_ITEM_JOINER) : "";
+                MarkConfigItem.DB_ITEM_JOINER) : "";
         this.totalScore = totalScore;
         this.libraryCount = 0;
         this.markedCount = 0;
@@ -221,13 +231,13 @@ public class MarkGroup implements Serializable {
         this.picList = picList;
     }
 
-    public void setPicList(List<PictureConfigItem> configList) {
+    public void setPicList(List<MarkConfigItem> configList) {
         this.picList = configList != null && configList.size() > 0 ? StringUtils.join(configList,
-                PictureConfigItem.DB_ITEM_JOINER) : "";
+                MarkConfigItem.DB_ITEM_JOINER) : "";
     }
 
-    public List<PictureConfigItem> getPictureConfigList() {
-        return PictureConfigItem.parse(this.picList);
+    public List<MarkConfigItem> getPictureConfigList() {
+        return MarkConfigItem.parse(this.picList);
     }
 
     public Double getTotalScore() {

+ 3 - 1
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/ExamStudentService.java

@@ -4,6 +4,7 @@ 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.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
+import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
 import cn.com.qmth.stmms.biz.utils.OriginTag;
 import cn.com.qmth.stmms.biz.utils.PictureTag;
 import cn.com.qmth.stmms.common.enums.SubjectiveStatus;
@@ -123,7 +124,8 @@ public interface ExamStudentService {
 
     Map<Integer, List<PictureTag>> buildSheetTags(ExamStudent student, boolean withGroupScore);
 
-    Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student, boolean withGroupScore);
+    Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student, boolean withGroupScore,
+            List<PictureConfigItem> sliceConfig);
 
     boolean updateScanInfo(ExamStudent student);
 

+ 5 - 5
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/MarkGroupService.java

@@ -1,13 +1,13 @@
 package cn.com.qmth.stmms.biz.exam.service;
 
+import java.util.Date;
+import java.util.List;
+
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 
-import java.util.Date;
-import java.util.List;
-
 public interface MarkGroupService {
 
     MarkGroup save(MarkGroup markGroup);
@@ -24,7 +24,7 @@ public interface MarkGroupService {
 
     long countByExam(int examId);
 
-    void updatePicList(int examId, String subjectCode, int number, List<PictureConfigItem> picList);
+    void updatePicList(int examId, String subjectCode, int number, List<MarkConfigItem> picList);
 
     void updateBuildTime(int examId, String subjectCode, int number, Date time);
 

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

@@ -45,6 +45,7 @@ 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.exam.service.MarkGroupService;
+import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
 import cn.com.qmth.stmms.biz.mark.model.MarkLibrary;
 import cn.com.qmth.stmms.biz.mark.model.MarkSpecialTag;
 import cn.com.qmth.stmms.biz.mark.model.MarkTrack;
@@ -848,8 +849,8 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
             sliceConfig = exam.getSliceConfigList();
         }
         if (!sliceConfig.isEmpty()) {
-            List<PictureTag> tags = PictureConfigTransform.process(sliceConfig, getSliceTags(student, withGroupScore))
-                    .get(index);
+            List<PictureTag> tags = PictureConfigTransform.process(sliceConfig,
+                    getSliceTags(student, withGroupScore, sliceConfig)).get(index);
             if (tags != null) {
                 list.addAll(tags);
             }
@@ -880,7 +881,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         }
         if (!sliceConfig.isEmpty()) {
             // 有裁切图配置时才需要获取原始评卷标记信息
-            tagMap = getSliceTags(student, withGroupScore);
+            tagMap = getSliceTags(student, withGroupScore, sliceConfig);
         }
         Map<Integer, List<PictureTag>> map = PictureConfigTransform.process(sliceConfig, tagMap);
         // List<PictureTag> list = map.get(1);
@@ -896,14 +897,15 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
      * 根据考生获取所有评卷分组的评卷标记内容
      */
     @Override
-    public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student, boolean withGroupScore) {
+    public Map<MarkGroup, List<OriginTag>> getSliceTags(ExamStudent student, boolean withGroupScore,
+            List<PictureConfigItem> sliceConfig) {
         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, withGroupScore));
+            tagMap.put(group, buildOriginTags(student, group, questions, scoreList, withGroupScore, sliceConfig));
         }
         return tagMap;
     }
@@ -976,7 +978,7 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
      * @return
      */
     private List<OriginTag> buildOriginTags(ExamStudent student, MarkGroup group, List<ExamQuestion> questions,
-            List<ScoreItem> scoreList, boolean withGroupScore) {
+            List<ScoreItem> scoreList, boolean withGroupScore, List<PictureConfigItem> sliceConfig) {
         if (scoreList.size() == 0) {
             return new LinkedList<>();
         }
@@ -997,14 +999,22 @@ public class ExamStudentServiceImpl extends BaseQueryService<ExamStudent> implem
         List<OriginTag> originTags = new LinkedList<>();
         // 首先添加本大题总得分
         if (withGroupScore) {
-            List<PictureConfigItem> configList = group.getPictureConfigList();
+            List<MarkConfigItem> configList = group.getPictureConfigList();
             if (configList.isEmpty()) {
                 // 未设置评卷区域,则自动取第一张裁切图的固定位置
                 originTags.add(new OriginTag(format.format(score), 1, 10, 10));
             } else {
                 // 取第一个显示区域相对裁切图的位置
-                PictureConfigItem config = configList.get(0);
-                originTags.add(new OriginTag(format.format(score), config.getI(), config.getX(), config.getY()));
+                MarkConfigItem config = configList.get(0);
+                OriginTag tag = new OriginTag(format.format(score), config.getI(), config.getX(), config.getY());
+                if (config.getX() <= 1 && config.getY() <= 1 
+                        && sliceConfig.get(config.getI() - 1).getW() > 0
+                        && sliceConfig.get(config.getI() - 1).getH() > 0) {
+                    tag = new OriginTag(format.format(score), config.getI(), 
+                            config.getX() * sliceConfig.get(config.getI() - 1).getW(), 
+                            config.getY() * sliceConfig.get(config.getI() - 1).getH());
+                }
+                originTags.add(tag);
             }
         }
         // 检测应该使用哪个评卷任务的轨迹记录

+ 11 - 11
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/exam/service/impl/MarkGroupServiceImpl.java

@@ -1,22 +1,22 @@
 package cn.com.qmth.stmms.biz.exam.service.impl;
 
+import java.util.Date;
+import java.util.List;
+
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
 import cn.com.qmth.stmms.biz.common.BaseQueryService;
 import cn.com.qmth.stmms.biz.exam.dao.MarkGroupDao;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroupPK;
 import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
 import cn.com.qmth.stmms.common.enums.MarkMode;
 import cn.com.qmth.stmms.common.enums.MarkStatus;
 
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.Date;
-import java.util.List;
-
 @Service("markGroupService")
 public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements MarkGroupService {
 
@@ -37,13 +37,13 @@ public class MarkGroupServiceImpl extends BaseQueryService<MarkGroup> implements
 
     @Transactional
     @Override
-    public void updatePicList(int examId, String subjectCode, int number, List<PictureConfigItem> configList) {
+    public void updatePicList(int examId, String subjectCode, int number, List<MarkConfigItem> configList) {
         groupDao.updatePicList(
                 examId,
                 subjectCode,
                 number,
                 configList != null && configList.size() > 0 ? StringUtils.join(configList,
-                        PictureConfigItem.DB_ITEM_JOINER) : "");
+                        MarkConfigItem.DB_ITEM_JOINER) : "");
     }
 
     @Transactional

+ 130 - 0
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/MarkConfigItem.java

@@ -0,0 +1,130 @@
+package cn.com.qmth.stmms.biz.mark.model;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 单个评卷区设置模型
+ * 
+ *
+ */
+public class MarkConfigItem {
+
+    // 数据库中多个单元紧凑保存的拼接符,兼容旧版本只保存图片序号的模式
+    public static final String DB_ITEM_JOINER = ",";
+
+    // 数据库中单个单元紧凑保存的拼接符,兼容旧版本只保存图片序号的模式
+    public static final String DB_FIELD_JOINER = ":";
+
+    // 裁切去所属的图片序号,从1开始
+    private int i;
+
+    // 裁切区左上角X坐标
+    private double x;
+
+    // 裁切区左上角Y坐标
+    private double y;
+
+    // 裁切区宽度
+    private double w;
+
+    // 裁切区高度
+    private double h;
+
+    public MarkConfigItem() {
+
+    }
+
+    public MarkConfigItem(String text) {
+        text = StringUtils.trimToEmpty(text);
+        String[] values = StringUtils.split(text, DB_FIELD_JOINER);
+        try {
+            i = Integer.valueOf(values[0]);
+            if (values.length > 1) {
+                x = Integer.valueOf(values[1]);
+            }
+            if (values.length > 2) {
+                y = Integer.valueOf(values[2]);
+            }
+            if (values.length > 3) {
+                w = Integer.valueOf(values[3]);
+            }
+            if (values.length > 4) {
+                h = Integer.valueOf(values[4]);
+            }
+        } catch (Exception e) {
+            throw new IllegalArgumentException("Invalid PictureConfigItem init text:" + text);
+        }
+    }
+
+    public int getI() {
+        return i;
+    }
+
+    public void setI(int i) {
+        this.i = i;
+    }
+
+    public double getX() {
+        return x;
+    }
+
+    public void setX(double x) {
+        this.x = x;
+    }
+
+    public double getY() {
+        return y;
+    }
+
+    public void setY(double y) {
+        this.y = y;
+    }
+
+    public double getW() {
+        return w;
+    }
+
+    public void setW(double w) {
+        this.w = w;
+    }
+
+    public double getH() {
+        return h;
+    }
+
+    public void setH(double h) {
+        this.h = h;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder();
+        sb.append(i).append(DB_FIELD_JOINER);
+        sb.append(x).append(DB_FIELD_JOINER);
+        sb.append(y).append(DB_FIELD_JOINER);
+        sb.append(w).append(DB_FIELD_JOINER);
+        sb.append(h);
+        return sb.toString();
+    }
+
+    public static List<MarkConfigItem> parse(String text) {
+        List<MarkConfigItem> list = new LinkedList<MarkConfigItem>();
+        text = StringUtils.trimToEmpty(text);
+        String[] values = StringUtils.split(text, DB_ITEM_JOINER);
+        for (String value : values) {
+            try {
+                MarkConfigItem item = new MarkConfigItem(value);
+                if (item != null && item.i > 0) {
+                    list.add(item);
+                }
+            } catch (Exception e) {
+                continue;
+            }
+        }
+        return list;
+    }
+
+}

+ 3 - 3
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/mark/model/Task.java

@@ -53,7 +53,7 @@ public class Task implements Serializable {
     /**
      * 题卡图片拼接配置
      */
-    private List<PictureConfigItem> sliceConfig;
+    private List<MarkConfigItem> sliceConfig;
 
     /**
      * 多媒体地址
@@ -184,11 +184,11 @@ public class Task implements Serializable {
         this.sliceUrls = sliceUrls;
     }
 
-    public List<PictureConfigItem> getSliceConfig() {
+    public List<MarkConfigItem> getSliceConfig() {
         return sliceConfig;
     }
 
-    public void setSliceConfig(List<PictureConfigItem> sliceConfig) {
+    public void setSliceConfig(List<MarkConfigItem> sliceConfig) {
         this.sliceConfig = sliceConfig;
     }
 

+ 7 - 7
stmms-biz/src/main/java/cn/com/qmth/stmms/biz/utils/OriginTag.java

@@ -6,15 +6,15 @@ public class OriginTag {
 
     private int offsetIndex;
 
-    private int offsetX;
+    private double offsetX;
 
-    private int offsetY;
+    private double offsetY;
 
     public OriginTag() {
 
     }
 
-    public OriginTag(String content, int offsetIndex, int offsetX, int offsetY) {
+    public OriginTag(String content, int offsetIndex, double offsetX, double offsetY) {
         this.content = content;
         this.offsetIndex = offsetIndex;
         this.offsetX = offsetX;
@@ -37,19 +37,19 @@ public class OriginTag {
         this.offsetIndex = offsetIndex;
     }
 
-    public int getOffsetX() {
+    public double getOffsetX() {
         return offsetX;
     }
 
-    public void setOffsetX(int offsetX) {
+    public void setOffsetX(double offsetX) {
         this.offsetX = offsetX;
     }
 
-    public int getOffsetY() {
+    public double getOffsetY() {
         return offsetY;
     }
 
-    public void setOffsetY(int offsetY) {
+    public void setOffsetY(double offsetY) {
         this.offsetY = offsetY;
     }
 }

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

@@ -19,26 +19,28 @@ public class PictureConfigTransform {
     /**
      * 转换方法
      *
-     * @param sliceConfigs - 裁切图配置
-     * @param groups       - 评卷分组与原始元素列表
+     * @param sliceConfigs
+     *            - 裁切图配置
+     * @param groups
+     *            - 评卷分组与原始元素列表
      * @return 原图序号与新的显示元素列表,序号从1开始
      */
     public static Map<Integer, List<PictureTag>> process(List<PictureConfigItem> sliceConfigs,
             Map<MarkGroup, List<OriginTag>> groups) {
         Map<Integer, List<PictureTag>> map = new HashMap<>();
-        //不判断裁切坐标是否空白,兼容新的原图遮盖模式
+        // 不判断裁切坐标是否空白,兼容新的原图遮盖模式
         int sliceCount = sliceConfigs.size();
         for (Entry<MarkGroup, List<OriginTag>> entry : groups.entrySet()) {
             // 遍历所有显示元素
             for (OriginTag tag : entry.getValue()) {
                 if (tag.getOffsetIndex() > sliceCount) {
-                    //元素所属裁切图不在裁切坐标范围内,表示裁切图直接使用的原图
+                    // 元素所属裁切图不在裁切坐标范围内,表示裁切图直接使用的原图
                     buildTag(map, tag.getContent(), tag.getOffsetIndex(), tag.getOffsetX(), tag.getOffsetY());
                 } else {
-                    //有裁切坐标时,原图坐标=元素相对坐标+裁切坐标
+                    // 有裁切坐标时,原图坐标=元素相对坐标+裁切坐标
                     PictureConfigItem config = sliceConfigs.get(tag.getOffsetIndex() - 1);
-                    buildTag(map, tag.getContent(), config.getI(), config.getX() + tag.getOffsetX(),
-                            config.getY() + tag.getOffsetY());
+                    buildTag(map, tag.getContent(), config.getI(), config.getX() + tag.getOffsetX(), config.getY()
+                            + tag.getOffsetY());
                 }
             }
         }
@@ -48,13 +50,18 @@ public class PictureConfigTransform {
     /**
      * 根据计算出的拼接块,构造新的原图显示元素
      *
-     * @param tags    - 原图显示元素集合
-     * @param content - 显示元素内容
-     * @param index   - 所属原图序号
-     * @param left    - 在原图内的左偏移
-     * @param top     - 在原图内的上偏移
+     * @param tags
+     *            - 原图显示元素集合
+     * @param content
+     *            - 显示元素内容
+     * @param index
+     *            - 所属原图序号
+     * @param left
+     *            - 在原图内的左偏移
+     * @param top
+     *            - 在原图内的上偏移
      */
-    private static void buildTag(Map<Integer, List<PictureTag>> tags, String content, int index, int left, int top) {
+    private static void buildTag(Map<Integer, List<PictureTag>> tags, String content, int index, double left, double top) {
         PictureTag tag = new PictureTag();
         tag.setContent(content);
         tag.setLeft(left);

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

@@ -6,9 +6,9 @@ public class PictureTag {
 
     private String[] content;
 
-    private int left;
+    private double left;
 
-    private int top;
+    private double top;
 
     private int size;
 
@@ -26,19 +26,19 @@ public class PictureTag {
         }
     }
 
-    public int getLeft() {
+    public double getLeft() {
         return left;
     }
 
-    public void setLeft(int left) {
+    public void setLeft(double left) {
         this.left = left;
     }
 
-    public int getTop() {
+    public double getTop() {
         return top;
     }
 
-    public void setTop(int top) {
+    public void setTop(double top) {
         this.top = top;
     }
 

+ 5 - 5
stmms-web/src/main/java/cn/com/qmth/stmms/admin/dto/SubjectQuestionDTO.java

@@ -14,7 +14,7 @@ import org.apache.commons.lang.StringUtils;
 
 import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
 import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
 import cn.com.qmth.stmms.common.enums.QuestionType;
 import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
 
@@ -68,10 +68,10 @@ public class SubjectQuestionDTO {
             } else {
                 MarkGroup group = groups.get(question.getGroupNumber());
                 if (group == null) {
-                    group = new MarkGroup(examId, subjectCode, question.getGroupNumber(),
-                            PictureConfigItem.parse(question.getPicList()), 0d, question.getDoubleRate(),
-                            question.getArbitrateThreshold(), question.getScorePolicy(), question.getMarkMode(),
-                            question.getTrialCount(), false, false, 1, false);
+                    group = new MarkGroup(examId, subjectCode, question.getGroupNumber(), MarkConfigItem.parse(question
+                            .getPicList()), 0d, question.getDoubleRate(), question.getArbitrateThreshold(),
+                            question.getScorePolicy(), question.getMarkMode(), question.getTrialCount(), false, false,
+                            1, false);
                     group.setImportQuestionList(new LinkedList<>());
                     groups.put(question.getGroupNumber(), group);
                 }

+ 4 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/MarkGroupController.java

@@ -47,7 +47,7 @@ import cn.com.qmth.stmms.biz.exam.service.MarkerService;
 import cn.com.qmth.stmms.biz.exam.service.SelectiveGroupService;
 import cn.com.qmth.stmms.biz.file.service.FileService;
 import cn.com.qmth.stmms.biz.lock.LockService;
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
 import cn.com.qmth.stmms.biz.mark.service.MarkService;
 import cn.com.qmth.stmms.common.annotation.Logging;
 import cn.com.qmth.stmms.common.annotation.RoleRequire;
@@ -490,7 +490,7 @@ public class MarkGroupController extends BaseExamController {
                 // quick update
                 picList = StringEscapeUtils.unescapeHtml(picList);
                 JSONArray array = JSONArray.fromObject(picList);
-                List<PictureConfigItem> list = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
+                List<MarkConfigItem> list = JSONArray.toList(array, new MarkConfigItem(), new JsonConfig());
                 if (list != null && !list.isEmpty()) {
                     groupService.updatePicList(examId, subjectCode, number, list);
                 }
@@ -592,11 +592,11 @@ public class MarkGroupController extends BaseExamController {
             try {
                 // create group
                 // build picList
-                List<PictureConfigItem> picConfigList = null;
+                List<MarkConfigItem> picConfigList = null;
                 if (!exam.getType().equals(ExamType.MULTI_MEDIA)) {
                     picList = StringEscapeUtils.unescapeHtml(StringUtils.trimToNull(picList));
                     JSONArray array = JSONArray.fromObject(picList);
-                    picConfigList = JSONArray.toList(array, new PictureConfigItem(), new JsonConfig());
+                    picConfigList = JSONArray.toList(array, new MarkConfigItem(), new JsonConfig());
                 }
                 if (questionIds != null && questionIds.length > 0) {
                     List<ExamQuestion> list = new ArrayList<ExamQuestion>();

+ 1 - 0
stmms-web/src/main/java/cn/com/qmth/stmms/admin/exam/PaperController.java

@@ -922,6 +922,7 @@ public class PaperController extends BaseExamController {
                         for (Integer number : mainMap.keySet()) {
                             MarkGroup group = new MarkGroup(examId, subject.getCode(), number, null,
                                     mainMap.get(number), null, null, null, null, 0, false, false, null, false);
+                            group.setPicList(cardFile.getMarkConfigAdd(cardFile.getMarkConfig(number), 0.01));
                             groupService.save(group);
                         }
                         subjectService.updateScore(examId, subject.getCode(), false,

+ 4 - 4
stmms-web/src/main/java/cn/com/qmth/stmms/api/dto/GroupDTO.java

@@ -2,13 +2,13 @@ package cn.com.qmth.stmms.api.dto;
 
 import java.util.List;
 
-import cn.com.qmth.stmms.biz.mark.model.PictureConfigItem;
+import cn.com.qmth.stmms.biz.mark.model.MarkConfigItem;
 
 public class GroupDTO {
 
     private Integer number;
 
-    private List<PictureConfigItem> picConfig;
+    private List<MarkConfigItem> picConfig;
 
     private Double doubleRate;
 
@@ -30,11 +30,11 @@ public class GroupDTO {
         this.number = number;
     }
 
-    public List<PictureConfigItem> getPicConfig() {
+    public List<MarkConfigItem> getPicConfig() {
         return picConfig;
     }
 
-    public void setPicConfig(List<PictureConfigItem> picConfig) {
+    public void setPicConfig(List<MarkConfigItem> picConfig) {
         this.picConfig = picConfig;
     }
 

+ 4 - 0
stmms-web/src/main/webapp/WEB-INF/views/include/sheetTagViewCanvas.jsp

@@ -64,6 +64,10 @@ function initSheetTagPopoverContent(sheetServer, sheetUrls, answerUrl, tags, cal
             this.ctx.fillStyle ='red';
 		    for(var j=0;j<this.tagList.length;j++) {
 		        var tag = this.tagList[j];
+		        if(tag.left <=1 && tag.top<=1){
+		        	tag.left = tag.left*this.width;
+		        	tag.top = tag.top* this.height;
+		        }
 		        this.ctx.fillText(tag.content, tag.left * this.scaleRate, tag.top * this.scaleRate);
 		    }
 		    loadCount++;

+ 15 - 0
stmms-web/src/main/webapp/WEB-INF/views/modules/mark/picConfig.jsp

@@ -88,6 +88,15 @@
                 alert('请至少裁切一张小图后再保存');
                 return;
             }
+            /* for (var i = 0; i < result.length; i++) {
+            	 if(result[i].w>1 && result[i].h>1){
+            		 var imageI=result[i].i;
+            		 result[i].x = (result[i].x/image_array[imageI - 1].width).toFixed(3);
+            		 result[i].y = (result[i].y/image_array[imageI - 1].height).toFixed(3);
+            		 result[i].w = (result[i].w/image_array[imageI - 1].width).toFixed(3);
+            		 result[i].h = (result[i].h/image_array[imageI - 1].height).toFixed(3);
+                 }
+            } */
             $('#pic-config-div').hide();
             if (saveCallback != undefined) {
                 saveCallback(result);
@@ -205,6 +214,12 @@
 
     function addPreviewByConfig(config) {
         var container = $('#pic-config-preview');
+        if(config.x<=1 && config.y<=1 && config.w<=1 && config.h<=1){
+        	config.x = image_array[config.i - 1].width*config.x;
+        	config.y = image_array[config.i - 1].height*config.y;
+        	config.w = image_array[config.i - 1].width*config.w;
+        	config.h = image_array[config.i - 1].height*config.h;
+        }
         var width = config.w;
         var height = config.h;
         if (width == 0) {