Browse Source

3.3.1 题库试卷包解析

xiaofei 1 năm trước cách đây
mục cha
commit
731f7d7952

+ 123 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/ExamTaskPaperData.java

@@ -0,0 +1,123 @@
+package com.qmth.distributed.print.business.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.io.Serializable;
+
+import com.github.jeffreyning.mybatisplus.anno.MppMultiId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * 命题任务选择题库试卷相关文件表
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-29
+ */
+@TableName("exam_task_paper_data")
+@ApiModel(value="ExamTaskPaperData对象", description="命题任务选择题库试卷相关文件表")
+public class ExamTaskPaperData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "考试ID")
+    @MppMultiId(value = "exam_id")
+    private Long examId;
+
+    @ApiModelProperty(value = "试卷编号")
+    @MppMultiId(value = "paper_number")
+    private String paperNumber;
+
+    @ApiModelProperty(value = "题库试卷ID")
+    @MppMultiId(value = "paper_id")
+    private Long paperId;
+
+    @ApiModelProperty(value = "题库试卷数据包地址(zip)")
+    private String dataPacketPath;
+
+    @ApiModelProperty(value = "试卷结构内容(从paper.json解析)")
+    private String paperJson;
+
+    @ApiModelProperty(value = "试卷答案内容(从answer.json解析)")
+    private String answerJson;
+
+    @ApiModelProperty(value = "试卷pdf文件地址(paper.pdf上传地址)")
+    private String paperPdf;
+
+    @ApiModelProperty(value = "标答pdf文件地址(answer.pdf上传地址)")
+    private String answerPdf;
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+    public Long getPaperId() {
+        return paperId;
+    }
+
+    public void setPaperId(Long paperId) {
+        this.paperId = paperId;
+    }
+    public String getDataPacketPath() {
+        return dataPacketPath;
+    }
+
+    public void setDataPacketPath(String dataPacketPath) {
+        this.dataPacketPath = dataPacketPath;
+    }
+    public String getPaperJson() {
+        return paperJson;
+    }
+
+    public void setPaperJson(String paperJson) {
+        this.paperJson = paperJson;
+    }
+    public String getAnswerJson() {
+        return answerJson;
+    }
+
+    public void setAnswerJson(String answerJson) {
+        this.answerJson = answerJson;
+    }
+    public String getPaperPdf() {
+        return paperPdf;
+    }
+
+    public void setPaperPdf(String paperPdf) {
+        this.paperPdf = paperPdf;
+    }
+    public String getAnswerPdf() {
+        return answerPdf;
+    }
+
+    public void setAnswerPdf(String answerPdf) {
+        this.answerPdf = answerPdf;
+    }
+
+    @Override
+    public String toString() {
+        return "ExamTaskPaperData{" +
+            "examId=" + examId +
+            ", paperNumber=" + paperNumber +
+            ", paperId=" + paperId +
+            ", dataPacketPath=" + dataPacketPath +
+            ", paperJson=" + paperJson +
+            ", answerJson=" + answerJson +
+            ", paperPdf=" + paperPdf +
+            ", answerPdf=" + answerPdf +
+        "}";
+    }
+}

+ 17 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/ExamTaskPaperDataMapper.java

@@ -0,0 +1,17 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.github.jeffreyning.mybatisplus.base.MppBaseMapper;
+import com.qmth.distributed.print.business.entity.ExamTaskPaperData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 命题任务选择题库试卷相关文件表 Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-29
+ */
+public interface ExamTaskPaperDataMapper extends MppBaseMapper<ExamTaskPaperData> {
+
+}

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskPaperDataService.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.service;
+
+import com.qmth.distributed.print.business.entity.ExamTaskPaperData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 命题任务选择题库试卷相关文件表 服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-29
+ */
+public interface ExamTaskPaperDataService extends IService<ExamTaskPaperData> {
+
+}

+ 1 - 1
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/ExamTaskService.java

@@ -216,5 +216,5 @@ public interface ExamTaskService extends IService<ExamTask> {
 
     IPage<TikuPaperInfo> pageTikuPaper(String courseCode, String paperName, String account, Integer pageNumber, Integer pageSize);
 
-    String getTikuPaperData(Long paperId);
+    String getTikuPaperData(Long examId, Long paperId);
 }

+ 21 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskPaperDataServiceImpl.java

@@ -0,0 +1,21 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.github.jeffreyning.mybatisplus.service.MppServiceImpl;
+import com.qmth.distributed.print.business.entity.ExamTaskPaperData;
+import com.qmth.distributed.print.business.mapper.ExamTaskPaperDataMapper;
+import com.qmth.distributed.print.business.service.ExamTaskPaperDataService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 命题任务选择题库试卷相关文件表 服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-29
+ */
+@Service
+public class ExamTaskPaperDataServiceImpl extends MppServiceImpl<ExamTaskPaperDataMapper, ExamTaskPaperData> implements ExamTaskPaperDataService {
+
+}

+ 36 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/ExamTaskServiceImpl.java

@@ -34,7 +34,6 @@ import com.qmth.teachcloud.common.bean.params.BasicStudentExtrasParam;
 import com.qmth.teachcloud.common.bean.result.BasicStudentResult;
 import com.qmth.teachcloud.common.bean.result.SysUserResult;
 import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
-import com.qmth.teachcloud.common.bean.tiku.TikuCourseProperty;
 import com.qmth.teachcloud.common.bean.tiku.TikuPaperInfo;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
@@ -2146,10 +2145,43 @@ public class ExamTaskServiceImpl extends ServiceImpl<ExamTaskMapper, ExamTask> i
     }
 
     @Override
-    public String getTikuPaperData(Long paperId) {
+    public String getTikuPaperData(Long examId, Long paperId) {
         Long schoolId = Long.valueOf(ServletUtil.getRequestHeaderSchoolId().toString());
-        tikuUtils.getTikuPaperData(schoolId, paperId);
-        return null;
+        try {
+            File paperDataFile = tikuUtils.getTikuPaperData(schoolId, paperId);
+            ExamTaskPaperData examTaskPaperData = saveTikuPaperData(examId, paperId, paperDataFile);
+            return examTaskPaperData.getAnswerJson();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private ExamTaskPaperData saveTikuPaperData(Long examId, Long paperId, File zipFile) {
+        String zipDestPath = null;
+        try {
+            zipDestPath = zipFile.getParent() + File.separator + System.nanoTime();
+            Zip4jUtil.unzip(zipFile.getPath(), zipDestPath);
+
+            ExamTaskPaperData examTaskPaperData = new ExamTaskPaperData();
+            examTaskPaperData.setExamId(examId);
+            examTaskPaperData.setPaperNumber(SystemConstant.getNanoId());
+            examTaskPaperData.setPaperId(paperId);
+            // paper.json
+            // answer.json
+            // paper.pdf
+            // answer.pdf
+            return examTaskPaperData;
+        } catch (Exception e) {
+            throw ExceptionResultEnum.ERROR.exception("获取试卷包数据失败");
+        } finally {
+            if (zipFile.exists()) {
+                FileUtil.deleteFile(zipFile);
+            }
+            if (zipDestPath != null) {
+                FileUtil.deleteDirectory(zipDestPath);
+            }
+        }
+
     }
 
     /**

+ 17 - 0
distributed-print-business/src/main/resources/mapper/ExamTaskPaperDataMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.distributed.print.business.mapper.ExamTaskPaperDataMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.qmth.distributed.print.business.entity.ExamTaskPaperData">
+        <id column="exam_id" property="examId" />
+        <id column="paper_number" property="paperNumber" />
+        <id column="paper_id" property="paperId" />
+        <result column="data_packet_path" property="dataPacketPath" />
+        <result column="paper_json" property="paperJson" />
+        <result column="answer_json" property="answerJson" />
+        <result column="paper_pdf" property="paperPdf" />
+        <result column="answer_pdf" property="answerPdf" />
+    </resultMap>
+
+</mapper>

+ 13 - 0
distributed-print/install/mysql/upgrade/3.3.1.sql

@@ -401,3 +401,16 @@ INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence
 INSERT INTO `sys_privilege` (`id`, `name`, `url`, `type`, `parent_id`, `sequence`, `property`, `enable`, `default_auth`, `front_display`) VALUES ('287', '题库试卷包', '/api/admin/exam/task/get_tiku_paper_data', 'URL', '40', '13', 'AUTH', '1', '1', '1');
 UPDATE `sys_privilege` SET `related` = '71,167,286,287,424,477,417,420,421,441,442,640,641' WHERE (`id` = '283');
 UPDATE `sys_privilege` SET `related` = '49,167,174,286,287,371,464,465,427,642,417,420,421,441,442,640,641,642' WHERE (`id` = '463');
+
+
+CREATE TABLE `exam_task_paper_data` (
+           `exam_id` BIGINT(20) NOT NULL COMMENT '考试ID',
+           `paper_number` VARCHAR(100) NOT NULL COMMENT '试卷编号',
+           `paper_id` BIGINT(20) NOT NULL COMMENT '题库试卷ID',
+           `data_packet_path` VARCHAR(200) NULL COMMENT '题库试卷数据包地址(zip)',
+           `paper_json` MEDIUMTEXT NULL COMMENT '试卷结构内容(从paper.json解析)',
+           `answer_json` MEDIUMTEXT NULL COMMENT '试卷答案内容(从answer.json解析)',
+           `paper_pdf` VARCHAR(200) NULL COMMENT '试卷pdf文件地址(paper.pdf上传地址)',
+           `answer_pdf` VARCHAR(200) NULL COMMENT '标答pdf文件地址(answer.pdf上传地址)',
+           PRIMARY KEY (`exam_id`, `paper_number`, `paper_id`))
+    COMMENT = '命题任务选择题库试卷相关文件表';

+ 3 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/ExamTaskApplyController.java

@@ -278,8 +278,9 @@ public class ExamTaskApplyController {
     @RequestMapping(value = "/get_tiku_paper_data", method = RequestMethod.POST)
     @Transactional(rollbackFor = Exception.class)
     @ApiResponses({@ApiResponse(code = 200, message = "{\"success\":true}", response = Result.class)})
-    public Result getTikuPaperData(@ApiParam(value = "题库试卷ID", required = true) @RequestParam Long paperId) {
-        return ResultUtil.ok(examTaskService.getTikuPaperData(paperId));
+    public Result getTikuPaperData(@ApiParam(value = "考试ID", required = true) @RequestParam Long examId,
+                                   @ApiParam(value = "题库试卷ID", required = true) @RequestParam Long paperId) {
+        return ResultUtil.ok(examTaskService.getTikuPaperData(examId, paperId));
     }
 }
 

+ 3 - 10
teachcloud-common/src/main/java/com/qmth/teachcloud/common/kit/TikuUtils.java

@@ -15,7 +15,6 @@ import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.FileUtil;
 import com.qmth.teachcloud.common.util.HttpUtil;
-import com.qmth.teachcloud.common.util.JacksonUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -93,10 +92,10 @@ public class TikuUtils {
     /**
      * 获取试卷数据包
      *
-     * @param schoolId
+     * @param schoolId 学校ID
      * @param paperId  题库试卷ID
      */
-    public boolean getTikuPaperData(Long schoolId, Long paperId) {
+    public File getTikuPaperData(Long schoolId, Long paperId) {
         String hostUrl = getHostUrl(schoolId);
         String url = SystemConstant.TIKU_PAPER_DATA_API;
         validUrl(hostUrl, url);
@@ -111,19 +110,13 @@ public class TikuUtils {
             File filePath = SystemConstant.getFileTempDirVar(SystemConstant.ZIP_PREFIX);
             file = HttpUtil.postDownload(postUrl, map, createSign(schoolId, timestamp, url), timestamp, filePath.getPath());
             if (file.exists()) {
-                System.out.println(filePath.getPath());
-                System.out.println(1);
+                return file;
             } else {
                 throw ExceptionResultEnum.ERROR.exception("试卷结构包获取失败");
             }
         } catch (Exception e) {
             throw ExceptionResultEnum.ERROR.exception(e.getMessage());
-        } finally {
-            if (file.exists()) {
-                FileUtil.deleteFile(file);
-            }
         }
-        return true;
     }
 
     /**

+ 2 - 1
teachcloud-common/src/main/java/com/qmth/teachcloud/common/util/Zip4jUtil.java

@@ -140,7 +140,8 @@ public class Zip4jUtil {
             }
             File currentFile = new File(destPath);
             if (!currentFile.exists()) {
-                throw ExceptionResultEnum.ERROR.exception("待解压的路径不存在");
+                currentFile.getParentFile().mkdirs();
+//                throw ExceptionResultEnum.ERROR.exception("待解压的路径不存在");
             }
             zipFile.extractAll(destPath);
         } catch (ZipException e) {

+ 0 - 0
teachcloud-mark/src/main/resources/mapper/MarkSubjectiveScoreMapper.xml → teachcloud-mark/src/main/resources/mapper/ExamTaskPaperDataService.xml


+ 0 - 0
teachcloud-report-business/src/main/resources/mapper/CourseReportMapper.xml → teachcloud-report-business/src/main/resources/mapper/ExamTaskPaperDataService.xml