xiatian 11 months ago
parent
commit
d2338ba871

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

@@ -4,10 +4,12 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.qmth.boot.core.ai.model.llm.StandardAnswer;
 
 import cn.com.qmth.am.bean.ImageSlice;
 import cn.com.qmth.am.entity.base.IdEntity;
 import cn.com.qmth.am.handle.ImageSliceListTypeHandler;
+import cn.com.qmth.am.handle.StandardAnswerListTypeHandler;
 
 @TableName(value = "am_question", autoResultMap = true)
 public class QuestionEntity extends IdEntity {
@@ -26,7 +28,8 @@ public class QuestionEntity extends IdEntity {
 	// 试题内容
 	private String content;
 	// 试题答案
-	private String answer;
+	@TableField(value = "answer", typeHandler = StandardAnswerListTypeHandler.class)
+	private List<StandardAnswer> answer;
 	
 	@TableField(value = "image_slice", typeHandler = ImageSliceListTypeHandler.class)
 	private List<ImageSlice> imageSlice;
@@ -67,10 +70,10 @@ public class QuestionEntity extends IdEntity {
 	public void setContent(String content) {
 		this.content = content;
 	}
-	public String getAnswer() {
+	public List<StandardAnswer> getAnswer() {
 		return answer;
 	}
-	public void setAnswer(String answer) {
+	public void setAnswer(List<StandardAnswer> answer) {
 		this.answer = answer;
 	}
 	public List<ImageSlice> getImageSlice() {

+ 15 - 0
src/main/java/cn/com/qmth/am/handle/StandardAnswerListTypeHandler.java

@@ -0,0 +1,15 @@
+package cn.com.qmth.am.handle;
+
+import java.util.List;
+
+import com.fasterxml.jackson.databind.JavaType;
+import com.qmth.boot.core.ai.model.llm.StandardAnswer;
+
+public class StandardAnswerListTypeHandler extends ListTypeHandler<StandardAnswer> {
+
+    @Override
+    protected JavaType specificType() {
+        return super.mapper.getTypeFactory().constructParametricType(List.class, StandardAnswer.class);
+    }
+
+}

+ 39 - 2
src/main/java/cn/com/qmth/am/service/impl/QuestionServiceImpl.java

@@ -12,6 +12,8 @@ import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
@@ -23,6 +25,7 @@ import org.springframework.transaction.annotation.Transactional;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.core.ai.model.llm.StandardAnswer;
 import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.tools.excel.ExcelReader;
 import com.qmth.boot.tools.excel.enums.ExcelType;
@@ -38,7 +41,7 @@ import cn.com.qmth.am.service.QuestionService;
 
 @Service
 public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity> implements QuestionService {
-
+	private Pattern scoreRex = Pattern.compile("\\[\\[([0-9](.[0-9]+){0,1})分\\]\\]");
 	private static final String[] EXCEL_HEADER = new String[] { "考试ID", "科目代码", "科目名称", "大题号", "小题号", "满分", "试题内容",
 			"试题答案", "作答坐标" };
 	@Autowired
@@ -248,7 +251,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 			if (StringUtils.isBlank(answer)) {
 				msg.append("  试题答案不能为空");
 			}
-			imp.setAnswer(answer);
+			imp.setAnswer(getStandardAnswer(answer));
 
 			String imageSlice = trimAndNullIfBlank(line.get(EXCEL_HEADER[8]));
 			if (StringUtils.isBlank(imageSlice)) {
@@ -340,6 +343,40 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 			return null;
 		}
 	}
+	private List<StandardAnswer> getStandardAnswer(String s) {
+		if (StringUtils.isBlank(s)) {
+			return null;
+		}
+		s = s.trim();
+		if (StringUtils.isBlank(s)) {
+			return null;
+		}
+		try {
+			List<StandardAnswer> list = new ArrayList<>();
+			Matcher matcher = scoreRex.matcher(s);
+			int start=0;
+			String score = null;
+			while (matcher.find()) {
+				if(start!=0) {
+					StandardAnswer a=new StandardAnswer();
+					list.add(a);
+					a.setScore(score);
+					a.setContent(s.substring(start,matcher.start()));
+				}
+				score=matcher.group(1);
+				start=matcher.end();
+	        }
+			if(start<s.length()) {
+				StandardAnswer a=new StandardAnswer();
+				list.add(a);
+				a.setScore(score);
+				a.setContent(s.substring(start,s.length()));
+			}
+			return list;
+		} catch (Exception e) {
+			return null;
+		}
+	}
 
 	private void saveQuestionBatch(ImportResult ret, List<QuestionEntity> ss) {
 		if (CollectionUtils.isEmpty(ss)) {

+ 27 - 7
src/main/java/cn/com/qmth/am/service/impl/StudentScoreServiceImpl.java

@@ -30,6 +30,7 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.ai.client.OcrApiClient;
 import com.qmth.boot.core.ai.model.llm.AutoScoreRequest;
+import com.qmth.boot.core.ai.model.llm.AutoScoreResult;
 import com.qmth.boot.core.ai.model.ocr.OcrType;
 import com.qmth.boot.core.ai.service.AiService;
 import com.qmth.boot.core.exception.StatusException;
@@ -60,7 +61,6 @@ import cn.com.qmth.am.enums.ImportFileName;
 import cn.com.qmth.am.service.QuestionService;
 import cn.com.qmth.am.service.StudentScoreService;
 import cn.com.qmth.am.service.StudentService;
-import cn.com.qmth.am.utils.Calculator;
 import cn.com.qmth.am.utils.ImageUtil;
 
 @Service
@@ -494,9 +494,29 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
 	}
 
 	public static void main(String[] args) {
-		String code = "2022301052070";
-		String s = "https://file.markingcloud.com/" + getMarkingCloudPath(1342, getSuffix(code), code, 1, "jpg");
-		System.out.println(s);
+//		Pattern pattern = Pattern.compile("\\[\\[([0-9](.[0-9]+){0,1})分\\]\\]");
+//		String code = "2022301052070";
+//		String s = "https://file.markingcloud.com/" + getMarkingCloudPath(1342, getSuffix(code), code, 1, "jpg");
+//		String d="[[1.1分]]中国共产党是中国特色社会主义事业的坚强领导核心。\n"
+//				+ "[[1.2分]]中国共产党的领导地位是在历史奋斗中形成的。\n"
+//				+ "[[1.3分]]中国共产党领导是人民当家作主的可靠保障。\n"
+//				+ "[[1.4分]]中国共产党领导关系中国特色社会主义的性质、方向和命运。\n"
+//				+ "[[2分]]中国共产党领导是实现中华民族伟大复兴的根本保证。";
+//		Matcher matcher = pattern.matcher(d);
+//		int start=0;
+//		double score=0.0;
+//		while (matcher.find()) {
+//			if(start!=0) {
+//				System.out.println(score+d.substring(start,matcher.start()));
+//			}
+//			score=Double.valueOf(matcher.group(1));
+//			start=matcher.end();
+//        }
+//		if(start<d.length()) {
+//			System.out.println(score+d.substring(start,d.length()));
+//		}
+//		String[] items = d.split("\\[\\[[0-9](.[0-9]+){0,1}分\\]\\]");
+//		System.out.println(s);
 	}
 
 	@Override
@@ -592,9 +612,9 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
 			req.setStandardAnswer(q.getAnswer());
 			req.setStudentAnswer(score.getAnswer());
 			req.setSubjectName(q.getSubjectName());
-			Double ret = aiMarkingDispose(dto, org, req);
+			AutoScoreResult ret = aiMarkingDispose(dto, org, req);
 			if (ret != null) {
-				updateScore(score.getId(), Calculator.multiply(q.getFullScore(), ret), ret);
+				updateScore(score.getId(), ret.getTotalScore(), null);
 			} else {
 				updateScoreNone(score.getId(), 0.0, 0.0);
 			}
@@ -619,7 +639,7 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
 		return true;
 	}
 
-	private Double aiMarkingDispose(AiMarkingDto dto, OrgInfo org, AutoScoreRequest req) {
+	private AutoScoreResult aiMarkingDispose(AiMarkingDto dto, OrgInfo org, AutoScoreRequest req) {
 		SignatureInfo signature = SignatureInfo.secret(org.getAccessKey(), org.getAccessSecret());
 		try {
 			return aiService.autoScore(req, signature);