|
@@ -13,18 +13,18 @@ import com.qmth.teachcloud.common.bean.marking.scanAnswerCard.AnswerCard;
|
|
|
import com.qmth.teachcloud.common.bean.marking.scanAnswerCard.AnswerCardPage;
|
|
|
import com.qmth.teachcloud.common.bean.vo.FilePathVo;
|
|
|
import com.qmth.teachcloud.common.contant.SystemConstant;
|
|
|
+import com.qmth.teachcloud.common.entity.MarkQuestion;
|
|
|
import com.qmth.teachcloud.common.entity.SysUser;
|
|
|
import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
|
|
|
+import com.qmth.teachcloud.common.enums.scan.OmrField;
|
|
|
import com.qmth.teachcloud.common.service.BasicRoleDataPermissionService;
|
|
|
import com.qmth.teachcloud.common.service.FileUploadService;
|
|
|
import com.qmth.teachcloud.common.service.TeachcloudCommonService;
|
|
|
-import com.qmth.teachcloud.common.util.HttpUtil;
|
|
|
import com.qmth.teachcloud.common.util.ServletUtil;
|
|
|
import com.qmth.teachcloud.mark.bean.UriVo;
|
|
|
-import com.qmth.teachcloud.mark.bean.answercard.AnswerCardSaveDomain;
|
|
|
-import com.qmth.teachcloud.mark.bean.answercard.AnswerCardVo;
|
|
|
-import com.qmth.teachcloud.mark.bean.answercard.CardFile;
|
|
|
+import com.qmth.teachcloud.mark.bean.answercard.*;
|
|
|
import com.qmth.teachcloud.mark.entity.MarkPaper;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkQuestionAnswer;
|
|
|
import com.qmth.teachcloud.mark.entity.ScanAnswerCard;
|
|
|
import com.qmth.teachcloud.mark.enums.CardSource;
|
|
|
import com.qmth.teachcloud.mark.mapper.ScanAnswerCardMapper;
|
|
@@ -41,6 +41,7 @@ import javax.annotation.Resource;
|
|
|
import java.io.IOException;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
|
* <p>
|
|
@@ -63,6 +64,10 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
|
|
|
@Resource
|
|
|
private MarkStudentService markStudentService;
|
|
|
@Resource
|
|
|
+ private MarkQuestionService markQuestionService;
|
|
|
+ @Resource
|
|
|
+ private MarkQuestionAnswerService markQuestionAnswerService;
|
|
|
+ @Resource
|
|
|
private BasicRoleDataPermissionService basicRoleDataPermissionService;
|
|
|
@Resource
|
|
|
private TeachcloudCommonService teachcloudCommonService;
|
|
@@ -150,7 +155,7 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
|
|
|
// if (!singlePage && domain.getPaperCount() * 2 != cardFile.getPages().size()) {
|
|
|
// throw new ParameterException("卡格式数量不一致");
|
|
|
// }
|
|
|
-//// // 提取裁切坐标
|
|
|
+// // 提取裁切坐标
|
|
|
// sliceConfig = cardFile.getSliceConfig().toString();
|
|
|
// } catch (IOException e) {
|
|
|
// throw new ParameterException("文件解析失败", e);
|
|
@@ -167,9 +172,68 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
|
|
|
card.setAdapteMd5(domain.getMd5());
|
|
|
card.setAdapteUri(filePath);
|
|
|
this.saveOrUpdate(card);
|
|
|
+
|
|
|
+ saveObjectiveStruct(domain.getExamId(), domain.getCoursePaperId(), domain.getFile());
|
|
|
return card;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 根据卡格式中的结构,更新客观题试卷结构
|
|
|
+ */
|
|
|
+ private void saveObjectiveStruct(Long examId, String coursePaperId, MultipartFile file) {
|
|
|
+ MarkPaper markPaper = markPaperService.getByExamIdAndCoursePaperId(examId, coursePaperId);
|
|
|
+ CardFile cardFile;
|
|
|
+ byte[] fileData;
|
|
|
+ String sliceConfig;
|
|
|
+ try {
|
|
|
+ fileData = file.getBytes();
|
|
|
+ // 解析卡格式文件
|
|
|
+ cardFile = parseCardFile(fileData);
|
|
|
+ List<MarkQuestion> markQuestions = new ArrayList<>();
|
|
|
+ List<MarkQuestionAnswer> markQuestionAnswers = new ArrayList<>();
|
|
|
+ int i = 1;
|
|
|
+ for (CardPageWrapper page : cardFile.getPages()) {
|
|
|
+ for (FillArea fillArea : page.getExchange().getFillArea().stream().filter(m -> OmrField.QUESTION.equals(m.getField())).collect(Collectors.toList())) {
|
|
|
+ for (FillItem item : fillArea.getItems()) {
|
|
|
+ MarkQuestion markQuestion = new MarkQuestion();
|
|
|
+ markQuestion.setId(SystemConstant.getDbUuid());
|
|
|
+ markQuestion.setExamId(examId);
|
|
|
+ markQuestion.setPaperNumber(markPaper.getPaperNumber());
|
|
|
+ markQuestion.setObjective(fillArea.isSingle());
|
|
|
+ markQuestion.setMainNumber(item.getMainNumber());
|
|
|
+ markQuestion.setSubNumber(item.getSubNumber());
|
|
|
+ markQuestion.setMainTitle(fillArea.isSingle() ? item.getOptions().size() == 2 ? "判断题" : "单选题" : "多选题");
|
|
|
+ markQuestion.setOptionCount(item.getOptions().size());
|
|
|
+ markQuestion.setQuestionType(fillArea.isSingle() ? item.getOptions().size() == 2 ? 3 : 1 : 2);
|
|
|
+ markQuestion.setPaperIndex(i / 2);
|
|
|
+ markQuestion.setPageIndex(i % 2 == 1 ? 1 : 2);
|
|
|
+ markQuestions.add(markQuestion);
|
|
|
+
|
|
|
+ // 保存客观题数据
|
|
|
+ for (String paperType : markPaper.getPaperTypeList()) {
|
|
|
+ MarkQuestionAnswer markQuestionAnswer = new MarkQuestionAnswer(examId, markQuestion.getPaperNumber(), paperType, markQuestion.getMainNumber(), markQuestion.getSubNumber());
|
|
|
+ markQuestionAnswers.add(markQuestionAnswer);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ i++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isNotEmpty(markQuestions)) {
|
|
|
+ // 删除
|
|
|
+ markQuestionService.deleteByExamIdAndPaperNumberAndObjective(examId, markPaper.getPaperNumber(), true);
|
|
|
+ markQuestionService.saveBatch(markQuestions);
|
|
|
+ }
|
|
|
+ if (CollectionUtils.isNotEmpty(markQuestionAnswers)) {
|
|
|
+ // 删除客观题标答
|
|
|
+ markQuestionAnswerService.deleteByExamIdAndPaperNumber(examId, markPaper.getPaperNumber());
|
|
|
+ markQuestionAnswerService.saveBatch(markQuestionAnswers);
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new ParameterException("文件解析失败", e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 解析卡格式文件中的裁切图坐标,用于云阅卷同步
|
|
|
*
|
|
@@ -318,5 +382,4 @@ public class ScanAnswerCardServiceImpl extends ServiceImpl<ScanAnswerCardMapper,
|
|
|
.eq(ScanAnswerCard::getSource, source);
|
|
|
return this.list(queryWrapper);
|
|
|
}
|
|
|
-
|
|
|
}
|