xiatian 1 year ago
parent
commit
e22e053344

+ 0 - 1
db/am_db.sql

@@ -9,7 +9,6 @@ CREATE TABLE `am_question` (
   `full_score` double NOT NULL,
   `image_slice` varchar(1000) COLLATE utf8mb4_bin NOT NULL,
   `main_number` int NOT NULL,
-  `page_index` int NOT NULL,
   `sub_number` int NOT NULL,
   `subject_code` varchar(255) COLLATE utf8mb4_bin NOT NULL,
   PRIMARY KEY (`id`),

+ 4 - 4
src/main/java/cn/com/qmth/am/bean/ImageSlice.java

@@ -5,7 +5,7 @@ public class ImageSlice {
 	private Double y;
 	private Double w;
 	private Double h;
-	private Double i;
+	private Integer i;
 	public Double getX() {
 		return x;
 	}
@@ -30,16 +30,16 @@ public class ImageSlice {
 	public void setH(Double h) {
 		this.h = h;
 	}
-	public Double getI() {
+	public Integer getI() {
 		return i;
 	}
-	public void setI(Double i) {
+	public void setI(Integer i) {
 		this.i = i;
 	}
 	public ImageSlice() {
 		super();
 	}
-	public ImageSlice(Double x, Double y, Double w, Double h, Double i) {
+	public ImageSlice(Double x, Double y, Double w, Double h, Integer i) {
 		super();
 		this.x = x;
 		this.y = y;

+ 12 - 16
src/main/java/cn/com/qmth/am/entity/QuestionEntity.java

@@ -1,11 +1,13 @@
 package cn.com.qmth.am.entity;
 
+import java.util.List;
+
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
-import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
 
 import cn.com.qmth.am.bean.ImageSlice;
 import cn.com.qmth.am.entity.base.IdEntity;
+import cn.com.qmth.am.handle.ImageSliceListTypeHandler;
 
 @TableName("am_question")
 public class QuestionEntity extends IdEntity {
@@ -16,7 +18,7 @@ public class QuestionEntity extends IdEntity {
 
 	private String subjectCode;
 	private Integer mainNumber;
-	private Integer subNumber;
+	private String subNumber;
 
 	// 满分
 	private Double fullScore;
@@ -24,10 +26,10 @@ public class QuestionEntity extends IdEntity {
 	private String content;
 	// 试题答案
 	private String answer;
-
-	private Integer pageIndex;
-	@TableField(value = "image_slice", typeHandler = JacksonTypeHandler.class)
-	private ImageSlice imageSlice;
+	
+	@TableField(value = "image_slice", typeHandler = ImageSliceListTypeHandler.class)
+	private List<ImageSlice> imageSlice;
+	
 	public Long getExamId() {
 		return examId;
 	}
@@ -46,10 +48,10 @@ public class QuestionEntity extends IdEntity {
 	public void setMainNumber(Integer mainNumber) {
 		this.mainNumber = mainNumber;
 	}
-	public Integer getSubNumber() {
+	public String getSubNumber() {
 		return subNumber;
 	}
-	public void setSubNumber(Integer subNumber) {
+	public void setSubNumber(String subNumber) {
 		this.subNumber = subNumber;
 	}
 	public Double getFullScore() {
@@ -70,16 +72,10 @@ public class QuestionEntity extends IdEntity {
 	public void setAnswer(String answer) {
 		this.answer = answer;
 	}
-	public Integer getPageIndex() {
-		return pageIndex;
-	}
-	public void setPageIndex(Integer pageIndex) {
-		this.pageIndex = pageIndex;
-	}
-	public ImageSlice getImageSlice() {
+	public List<ImageSlice> getImageSlice() {
 		return imageSlice;
 	}
-	public void setImageSlice(ImageSlice imageSlice) {
+	public void setImageSlice(List<ImageSlice> imageSlice) {
 		this.imageSlice = imageSlice;
 	}
 

+ 3 - 3
src/main/java/cn/com/qmth/am/entity/StudentScoreEntity.java

@@ -13,7 +13,7 @@ public class StudentScoreEntity extends IdEntity {
 	private Long studentId;
 
 	private Integer mainNumber;
-	private Integer subNumber;
+	private String subNumber;
 	
 	//机评分
 	private Double aiScore;
@@ -43,11 +43,11 @@ public class StudentScoreEntity extends IdEntity {
 		this.mainNumber = mainNumber;
 	}
 
-	public Integer getSubNumber() {
+	public String getSubNumber() {
 		return subNumber;
 	}
 
-	public void setSubNumber(Integer subNumber) {
+	public void setSubNumber(String subNumber) {
 		this.subNumber = subNumber;
 	}
 

+ 1 - 1
src/main/java/cn/com/qmth/am/enums/DataType.java

@@ -5,7 +5,7 @@ package cn.com.qmth.am.enums;
  */
 public enum DataType {
 
-	MSRKING_CLOUD("云阅卷"),
+	MARKING_CLOUD("云阅卷"),
 	TEACH_CLOUD("知学知考"),
 	;
 

+ 16 - 0
src/main/java/cn/com/qmth/am/handle/ImageSliceListTypeHandler.java

@@ -0,0 +1,16 @@
+package cn.com.qmth.am.handle;
+
+import java.util.List;
+
+import com.fasterxml.jackson.databind.JavaType;
+
+import cn.com.qmth.am.bean.ImageSlice;
+
+public class ImageSliceListTypeHandler extends ListTypeHandler<ImageSlice> {
+
+    @Override
+    protected JavaType specificType() {
+        return super.mapper.getTypeFactory().constructParametricType(List.class, ImageSlice.class);
+    }
+
+}

+ 66 - 0
src/main/java/cn/com/qmth/am/handle/ListTypeHandler.java

@@ -0,0 +1,66 @@
+package cn.com.qmth.am.handle;
+
+import java.sql.CallableStatement;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.ibatis.type.BaseTypeHandler;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.MappedJdbcTypes;
+import org.apache.ibatis.type.MappedTypes;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.github.xiaoymin.knife4j.core.util.StrUtil;
+import com.qmth.boot.core.exception.StatusException;
+
+@MappedJdbcTypes(JdbcType.VARCHAR)
+@MappedTypes({List.class})
+public abstract class ListTypeHandler<T> extends BaseTypeHandler<List<T>> {
+	protected ObjectMapper mapper = new ObjectMapper();
+    @Override
+    public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
+		try {
+			String content = CollectionUtils.isEmpty(parameter) ? null : mapper.writeValueAsString(parameter);
+			ps.setString(i, content);
+		} catch (Exception e) {
+			throw new StatusException("出错",e);
+		}
+    }
+ 
+    @Override
+    public List<T> getNullableResult(ResultSet rs, String columnName) throws SQLException {
+        return this.getListByJsonArrayString(rs.getString(columnName));
+    }
+ 
+    @Override
+    public List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+        return this.getListByJsonArrayString(rs.getString(columnIndex));
+    }
+ 
+    @Override
+    public List<T> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+        return this.getListByJsonArrayString(cs.getString(columnIndex));
+    }
+ 
+ 
+    private List<T> getListByJsonArrayString(String content) {
+        try {
+			return StrUtil.isBlank(content) ? null : mapper.readValue(content,specificType());
+		} catch (Exception e) {
+			throw new StatusException("出错",e);
+		}
+    }
+ 
+    /**
+     * 具体类型,由子类提供
+     *
+     * @return 具体类型
+     */
+    protected abstract JavaType specificType();
+ 
+ 
+}

+ 17 - 37
src/main/java/cn/com/qmth/am/service/impl/QuestionServiceImpl.java

@@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.StatusException;
@@ -35,8 +36,7 @@ import cn.com.qmth.am.service.QuestionService;
 @Service
 public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity> implements QuestionService {
 
-	private static final String[] EXCEL_HEADER = new String[] { "考试ID", "科目代码", "大题号", "小题号", "满分", "试题内容", "试题答案",
-			"作答页码", "作答坐标" };
+	private static final String[] EXCEL_HEADER = new String[] { "考试ID", "科目代码", "大题号", "小题号", "满分", "试题内容", "试题答案","作答坐标" };
 	@Autowired
 	private SysProperty sysProperty;
 	@Autowired
@@ -206,17 +206,8 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 				msg.append("  小题号不能为空");
 			} else if (subNum.length() > 10) {
 				msg.append("  小题号不能超过10个字符");
-			} else {
-				try {
-					Integer subNumVal = Integer.parseInt(subNum);
-					if (subNumVal <= 0) {
-						msg.append("  小题号必须大于0");
-					}
-					imp.setSubNumber(subNumVal);
-				} catch (NumberFormatException e) {
-					msg.append("  小题号格式错误");
-				}
-			}
+			} 
+			imp.setSubNumber(subNum);
 
 			String fullScore = trimAndNullIfBlank(line.get(EXCEL_HEADER[4]));
 			if (StringUtils.isBlank(fullScore)) {
@@ -247,30 +238,14 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 			}
 			imp.setAnswer(answer);
 
-			String pageIndex = trimAndNullIfBlank(line.get(EXCEL_HEADER[7]));
-			if (StringUtils.isBlank(pageIndex)) {
-				msg.append("  作答页码不能为空");
-			} else if (pageIndex.length() > 10) {
-				msg.append("  作答页码不能超过10个字符");
-			} else {
-				try {
-					Integer pageIndexVal = Integer.parseInt(pageIndex);
-					if (pageIndexVal <= 0) {
-						msg.append("  作答页码必须大于0");
-					}
-					imp.setPageIndex(pageIndexVal);
-				} catch (NumberFormatException e) {
-					msg.append("  作答页码格式错误");
-				}
-			}
 
-			String imageSlice = trimAndNullIfBlank(line.get(EXCEL_HEADER[8]));
+			String imageSlice = trimAndNullIfBlank(line.get(EXCEL_HEADER[7]));
 			if (StringUtils.isBlank(imageSlice)) {
 				msg.append("  作答坐标不能为空");
 			} else if (imageSlice.length() > 1000) {
 				msg.append("  作答坐标不能超过1000个字符");
 			} else {
-				ImageSlice val=getImageSlice(imageSlice);
+				List<ImageSlice> val=getImageSlice(imageSlice);
 				if(val==null) {
 					msg.append("  作答坐标格式有误");
 				}else {
@@ -298,17 +273,22 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 		return ret;
 	}
 
-	private ImageSlice getImageSlice(String s) {
+	private List<ImageSlice> getImageSlice(String s) {
 		if (StringUtils.isBlank(s)) {
 			return null;
 		}
 		try {
-			ImageSlice ret = JSONObject.parseObject(s, ImageSlice.class);
-			if (ret.getH() == null || ret.getI() == null || ret.getW() == null || ret.getX() == null
-					|| ret.getY() == null) {
-				return null;
+			List<ImageSlice> list=new ArrayList<>();
+			JSONArray ja=JSONArray.parseArray(s);
+			for(int i=0;i<ja.size();i++) {
+				ImageSlice ret = JSONObject.parseObject(ja.getString(i), ImageSlice.class);
+				if (ret.getH() == null || ret.getI() == null || ret.getW() == null || ret.getX() == null
+						|| ret.getY() == null||ret.getI()<0) {
+					return null;
+				}
+				list.add(ret);
 			}
-			return ret;
+			return list;
 		} catch (Exception e) {
 			return null;
 		}

+ 1 - 9
src/main/resources/application.properties

@@ -24,22 +24,14 @@ com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.database}?useUni
 com.qmth.logging.root-level=info
 com.qmth.logging.file-path=/home/admin/project/ai-marking/log/ai-marking.log
 
-#OSS config {oss://key:secret@bucket.host}
-#com.qmth.fss.config=oss://LTAI4FboXLCJzrjVo5dUoXaU:O0my6eSAl1Ic62WvxEf3WlMXox1LNX@examcloud-test.oss-cn-shenzhen.aliyuncs.com
-#com.qmth.fss.server=https://ecs-test-static.qmth.com.cn
-
-#DISK
-com.qmth.fss.config=/home/admin/project/ai-marking/static
-com.qmth.fss.server=/file
 
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
 spring.jackson.time-zone=GMT+8
 
 
 com.qmth.solar.app-version=@project.version@
-com.qmth.solar.server=https://solar.qmth.com.cn
 com.qmth.solar.access-key=
 com.qmth.solar.access-secret=
 
-am.data-type=MSRKING_CLOUD
+am.data-type=MARKING_CLOUD
 am.data-dir=../data