diff --git a/start/src/main/resources/license.xml b/start/src/main/resources/license.xml
new file mode 100644
index 0000000..eb55a8d
--- /dev/null
+++ b/start/src/main/resources/license.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Aspose.Total for Java
+ Aspose.Words for Java
+
+ Enterprise
+ 20991231
+ 20991231
+ 8bfe198c-7f0c-4ef8-8ff0-acc3237bf0d7
+
+
+ sNLLKGMUdF0r8O1kKilWAGdgfs2BvJb/2Xp8p5iuDVfZXmhppo+d0Ran1P9TKdjV4ABwAgKXxJ3jcQTqE/2IRfqwnPf8itN8aFZlV3TJPYeD3yWE7IT55Gz6EijUpC7aKeoohTb4w2fpox58wWoF3SNp6sK6jDfiAUGEHYJ9pjU=
+
+
diff --git a/start/src/main/resources/templates/template/category_score_list.docx b/start/src/main/resources/templates/template/category_score_list.docx
new file mode 100644
index 0000000..27f7a9d
--- /dev/null
+++ b/start/src/main/resources/templates/template/category_score_list.docx
@@ -0,0 +1,35 @@
+ 自评得分汇总表
+ {{category_list}}考评类目
+ 标准分
+ 实得分
+ 扣分
+ 空项分
+[category]
+[total_score]
+[score]
+[deduction_score]
+[is_ignore_score]
+ 合 计
+{{total_score}}
+{{score}}
+{{deduction_score}}
+{{is_ignore_score}}
+ 评审分小计
+ 总分
+{{total_score}}
+ 空项分
+{{is_ignore_score}}
+ 应得分
+{{should_score}}
+ 实得分
+{{score}}
+ 按百分制换算后得分
+{{hundred_mark_score}}
+ 等级
+三级
+自评组成员签字:
+{{qry}}
+
+
+ 年 月 日
+
diff --git a/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesController.java b/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesController.java
index 6593bb7..e448e1d 100644
--- a/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesController.java
+++ b/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesController.java
@@ -4,8 +4,10 @@ import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.jjb.saas.framework.auth.model.SSOUser;
import com.jjb.saas.framework.auth.utils.AuthContext;
+import com.zcloud.edu.api.archives.ArchivesServiceI;
import com.zcloud.edu.api.study.ClassServiceI;
import com.zcloud.edu.api.study.StudentServiceI;
+import com.zcloud.edu.dto.archives.ArchivesQry;
import com.zcloud.edu.dto.archives.ClassArchivesQry;
import com.zcloud.edu.dto.clientobject.study.ClassCO;
import com.zcloud.edu.dto.clientobject.study.StudentCO;
@@ -31,6 +33,7 @@ import org.springframework.web.bind.annotation.RestController;
public class ArchivesController {
private final ClassServiceI classService;
private final StudentServiceI studentService;
+ private final ArchivesServiceI archivesService;
@ApiOperation("分页")
@PostMapping("/list")
@@ -67,5 +70,12 @@ public class ArchivesController {
public SingleResponse getClassExamResult(@RequestBody ClassArchivesQry qry) {
return studentService.getClassExamResult(qry);
}
+ @ApiOperation("下载一人一档")
+ @PostMapping("/downloadPersonArchives")
+ public SingleResponse downloadPersonArchives(@RequestBody ArchivesQry qry) {
+ archivesService.downloadPersonArchives(qry);
+ return null;
+ }
+
}
diff --git a/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesReviewRecordController.java b/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesReviewRecordController.java
index 6b6dbc0..2648d28 100644
--- a/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesReviewRecordController.java
+++ b/web-adapter/src/main/java/com/zcloud/edu/web/archives/ArchivesReviewRecordController.java
@@ -13,6 +13,7 @@ import com.zcloud.edu.dto.archives.ArchivesReviewRecordAddCmd;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordPageQry;
import com.zcloud.edu.dto.archives.ArchivesReviewRecordUpdateCmd;
import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewRecordCO;
+import com.zcloud.gbscommon.utils.Tools;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
diff --git a/web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java b/web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java
new file mode 100644
index 0000000..d641234
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java
@@ -0,0 +1,57 @@
+package com.zcloud.edu.command.query.archives;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.zcloud.edu.command.convertor.archives.ArchivesPdfFileCoConvertor;
+import com.zcloud.edu.dto.archives.ArchivesPdfFilePageQry;
+import com.zcloud.edu.dto.clientobject.archives.ArchivesPdfFileCO;
+import com.zcloud.edu.persistence.dataobject.archives.ArchivesPdfFileDO;
+import com.zcloud.edu.persistence.repository.archives.ArchivesPdfFileRepository;
+import com.zcloud.gbscommon.utils.PageQueryHelper;
+import lombok.AllArgsConstructor;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+
+/**
+ * web-app
+ *
+ * @Author zhangyue
+ * @Date 2026-02-02 10:32:42
+ */
+@Component
+@AllArgsConstructor
+public class ArchivesQueryExe {
+ private final ArchivesPdfFileRepository archivesPdfFileRepository;
+ private final ArchivesPdfFileCoConvertor archivesPdfFileCoConvertor;
+
+ /**
+ * 分页
+ *
+ * @param archivesPdfFilePageQry
+ * @return
+ */
+ public PageResponse execute(ArchivesPdfFilePageQry archivesPdfFilePageQry) {
+ Map params = PageQueryHelper.toHashMap(archivesPdfFilePageQry);
+ PageResponse pageResponse = archivesPdfFileRepository.listPage(params);
+ List examCenterCOS = archivesPdfFileCoConvertor.converDOsToCOs(pageResponse.getData());
+ return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
+ }
+
+ public void execte1(){
+ System.out.println(1);
+ }
+ @Async("archivesAsyncExecutor")
+ public void execte2(){
+ // 5s后执行
+ try {
+ Thread.sleep(5000);
+ } catch (InterruptedException e) {
+ throw new RuntimeException(e);
+ }
+ System.out.println(2);
+ }
+}
+
diff --git a/web-app/src/main/java/com/zcloud/edu/service/archives/ArchivesServiceImpl.java b/web-app/src/main/java/com/zcloud/edu/service/archives/ArchivesServiceImpl.java
new file mode 100644
index 0000000..6b44cea
--- /dev/null
+++ b/web-app/src/main/java/com/zcloud/edu/service/archives/ArchivesServiceImpl.java
@@ -0,0 +1,66 @@
+package com.zcloud.edu.service.archives;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.edu.api.archives.ArchivesReviewServiceI;
+import com.zcloud.edu.api.archives.ArchivesServiceI;
+import com.zcloud.edu.command.archives.ArchivesReviewAddExe;
+import com.zcloud.edu.command.archives.ArchivesReviewRemoveExe;
+import com.zcloud.edu.command.archives.ArchivesReviewUpdateExe;
+import com.zcloud.edu.command.query.archives.ArchivesPdfFileQueryExe;
+import com.zcloud.edu.command.query.archives.ArchivesQueryExe;
+import com.zcloud.edu.command.query.archives.ArchivesReviewQueryExe;
+import com.zcloud.edu.dto.archives.ArchivesQry;
+import com.zcloud.edu.dto.archives.ArchivesReviewAddCmd;
+import com.zcloud.edu.dto.archives.ArchivesReviewPageQry;
+import com.zcloud.edu.dto.archives.ArchivesReviewUpdateCmd;
+import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewCO;
+import com.zcloud.gbscommon.utils.Tools;
+import com.zcloud.gbscommon.utils.WordToPdfUtil;
+import com.zcloud.gbscommon.zcloudimgfiles.facade.ZcloudImgFilesFacade;
+import lombok.AllArgsConstructor;
+import org.apache.commons.io.output.ByteArrayOutputStream;
+import org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Service;
+
+import java.io.IOException;
+import java.util.HashMap;
+
+/**
+ * web-app
+ *
+ * @Author zhangyue
+ * @Date 2026-01-26 10:59:35
+ */
+@Service
+@AllArgsConstructor
+public class ArchivesServiceImpl implements ArchivesServiceI {
+ @DubboReference
+ private ZcloudImgFilesFacade zcloudImgFilesFacade;
+
+ private final ArchivesQueryExe archivesQueryExe;
+ @Override
+ public void downloadPersonArchives(ArchivesQry qry) {
+
+// HashMap workItem = new HashMap<>();
+// workItem.put("qry", "555");
+// String templatePath = "templates/template/category_score_list.docx";
+// try {
+
+// ByteArrayOutputStream outputStream = Tools.renderTemplate(templatePath, workItem);
+// byte[] pdfBytes = WordToPdfUtil.convertWordBytesToPdfBytes(outputStream.toByteArray());
+// String s = zcloudImgFilesFacade.saveFile(pdfBytes, "clockSign.pdf","clockSign");
+
+// System.out.println(s);
+// archivesQueryExe.downloadPersonArchives();
+ archivesQueryExe.execte2();
+ System.out.println("下载成功");
+// } catch (IOException e) {
+// throw new RuntimeException(e);
+// }
+
+ }
+}
+
diff --git a/web-client/src/main/java/com/zcloud/edu/api/archives/ArchivesServiceI.java b/web-client/src/main/java/com/zcloud/edu/api/archives/ArchivesServiceI.java
new file mode 100644
index 0000000..e4b04f3
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/edu/api/archives/ArchivesServiceI.java
@@ -0,0 +1,20 @@
+package com.zcloud.edu.api.archives;
+
+import com.alibaba.cola.dto.PageResponse;
+import com.alibaba.cola.dto.SingleResponse;
+import com.zcloud.edu.dto.archives.ArchivesQry;
+import com.zcloud.edu.dto.archives.ArchivesReviewAddCmd;
+import com.zcloud.edu.dto.archives.ArchivesReviewPageQry;
+import com.zcloud.edu.dto.archives.ArchivesReviewUpdateCmd;
+import com.zcloud.edu.dto.clientobject.archives.ArchivesReviewCO;
+
+/**
+ * web-client
+ *
+ * @Author zhangyue
+ * @Date 2026-01-26 10:59:35
+ */
+public interface ArchivesServiceI {
+ void downloadPersonArchives(ArchivesQry qry);
+}
+
diff --git a/web-client/src/main/java/com/zcloud/edu/dto/archives/ArchivesQry.java b/web-client/src/main/java/com/zcloud/edu/dto/archives/ArchivesQry.java
new file mode 100644
index 0000000..61703b2
--- /dev/null
+++ b/web-client/src/main/java/com/zcloud/edu/dto/archives/ArchivesQry.java
@@ -0,0 +1,30 @@
+package com.zcloud.edu.dto.archives;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * web-client
+ *
+ * @Author zhangyue
+ * @Date 2026-01-13 14:18:12
+ */
+@Data
+public class ArchivesQry {
+
+ /**
+ * 查询条件操作前缀,支持以下几种数据库查询操作:
+ * - `like`: 模糊匹配查询,对应SQL的LIKE操作符
+ * - `eq`: 等值查询,对应SQL的=操作符
+ * - `gt`: 大于比较查询
+ * - `lt`: 小于比较查询
+ * - `ge`: 大于等于比较查询
+ * - `le`: 小于等于比较查询
+ * - `ne`: 不等比较查询,对应SQL的!=操作符
+ */
+ private List typeList;
+
+}
+
diff --git a/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentExamRecordCO.java b/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentExamRecordCO.java
index 3c47f70..531a622 100644
--- a/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentExamRecordCO.java
+++ b/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentExamRecordCO.java
@@ -1,6 +1,7 @@
package com.zcloud.edu.dto.clientobject.study;
import com.alibaba.cola.dto.ClientObject;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -71,6 +72,24 @@ public class StudentExamRecordCO extends ClientObject {
@ApiModelProperty(value = "剩余考试次数")
private Integer surplusExamNum;
+ //试卷名称
+ @ApiModelProperty(value = "试卷名称")
+ @TableField(exist = false)
+ private String examName;
+ //试卷总分数
+ @ApiModelProperty(value = "试卷总分数")
+ @TableField(exist = false)
+ private BigDecimal paperExamScore;
+ //合格分数
+ @ApiModelProperty(value = "合格分数")
+ @TableField(exist = false)
+ private BigDecimal passScore;
+ //考试时长(分钟)
+ @ApiModelProperty(value = "考试时长(分钟)")
+ @TableField(exist = false)
+ private Integer examTime;
+
+
//环境
@ApiModelProperty(value = "环境")
private String env;
diff --git a/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentSignCO.java b/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentSignCO.java
index 13c4c33..fff21cf 100644
--- a/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentSignCO.java
+++ b/web-client/src/main/java/com/zcloud/edu/dto/clientobject/study/StudentSignCO.java
@@ -1,6 +1,7 @@
package com.zcloud.edu.dto.clientobject.study;
import com.alibaba.cola.dto.ClientObject;
+import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -40,8 +41,12 @@ public class StudentSignCO extends ClientObject {
@ApiModelProperty(value = "打卡签字路径")
private String signUrl;
- //签到类型 1-打卡签到 2-人脸签到
- @ApiModelProperty(value = "签到类型 1-打卡签到 2-人脸签到")
+
+ @ApiModelProperty(value = "培训地点")
+ @TableField(exist = false)
+ private String trainingLocation;
+ //签到类型 1-打卡签到 2-考试签到
+ @ApiModelProperty(value = "签到类型 1-打卡签到 2-考试签到")
private Integer type;
//环境
@ApiModelProperty(value = "环境")
diff --git a/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignAddCmd.java b/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignAddCmd.java
index e0f6bf0..47af03c 100644
--- a/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignAddCmd.java
+++ b/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignAddCmd.java
@@ -32,8 +32,8 @@ public class StudentSignAddCmd extends Command {
- @ApiModelProperty(value = "签到类型 1-打卡签到 2-人脸签到", name = "type", required = true)
- @NotNull(message = "签到类型 1-打卡签到 2-人脸签到不能为空")
+ @ApiModelProperty(value = "签到类型 1-打卡签到 2-考试签到", name = "type", required = true)
+ @NotNull(message = "签到类型 1-打卡签到 2-考试签到不能为空")
private Integer type;
@ApiModelProperty(value = "手机号", name = "phone", required = true)
diff --git a/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignUpdateCmd.java b/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignUpdateCmd.java
index ceb49f2..48ddcff 100644
--- a/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignUpdateCmd.java
+++ b/web-client/src/main/java/com/zcloud/edu/dto/study/StudentSignUpdateCmd.java
@@ -38,7 +38,7 @@ public class StudentSignUpdateCmd extends Command {
private String faceUrl;
@ApiModelProperty(value = "签字路径", name = "signUrl", required = true)
private String signUrl;
- @ApiModelProperty(value = "签到类型 1-打卡签到 2-人脸签到", name = "type", required = true)
+ @ApiModelProperty(value = "签到类型 1-打卡签到 2-考试签到", name = "type", required = true)
private Integer type;
}
diff --git a/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java b/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java
index 5736caa..3b4a334 100644
--- a/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java
+++ b/web-domain/src/main/java/com/zcloud/edu/domain/model/study/StudentSignE.java
@@ -42,7 +42,7 @@ public class StudentSignE extends BaseE {
private String faceUrl;
//打卡签字路径
private String signUrl;
- //签到类型 1-打卡签到 2-人脸签到
+ //签到类型 1-打卡签到 2-考试签到
private Integer type;
private String phone;
diff --git a/web-infrastructure/src/main/java/com/zcloud/edu/config/ArchivesAsyncConfig.java b/web-infrastructure/src/main/java/com/zcloud/edu/config/ArchivesAsyncConfig.java
new file mode 100644
index 0000000..3de3f07
--- /dev/null
+++ b/web-infrastructure/src/main/java/com/zcloud/edu/config/ArchivesAsyncConfig.java
@@ -0,0 +1,75 @@
+package com.zcloud.edu.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+/**
+ * @author zhangyue
+ * @date 2026/2/2 17:24
+ */
+
+@Configuration
+public class ArchivesAsyncConfig {
+
+
+ public static Integer maxPoolSize;
+ public static Integer corePoolSize;
+ public static Integer queueCapacity;
+ public static String namePrefix;
+ public static Integer keepAliveSeconds;
+
+ @Value("${archives.async.pool.maxPoolSize}")
+ public void setMaxPoolSize(Integer maxPoolSizeProperties) {
+ maxPoolSize = maxPoolSizeProperties;
+ }
+
+ @Value("${archives.async.pool.corePoolSize}")
+ public void setCorePoolSize(Integer corePoolSizeProperties) {
+ corePoolSize = corePoolSizeProperties;
+ }
+
+ @Value("${archives.async.pool.queueCapacity}")
+ public void setQueueCapacity(Integer queueCapacityProperties) {
+ queueCapacity = queueCapacityProperties;
+ }
+
+ @Value("${archives.async.pool.namePrefix}")
+ public void setNamePrefix(String namePrefixProperties) {
+ namePrefix = namePrefixProperties;
+ }
+
+ @Value("${archives.async.pool.keepAliveSeconds}")
+ public void setKeepAliveSeconds(Integer keepAliveSecondsProperties) {
+ keepAliveSeconds = keepAliveSecondsProperties;
+ }
+
+ @Bean()
+ public Executor archivesAsyncExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ //最大线程数
+ executor.setMaxPoolSize(maxPoolSize);
+ //核心线程数
+ executor.setCorePoolSize(corePoolSize);
+ //任务队列的大小
+ executor.setQueueCapacity(queueCapacity);
+ //线程前缀名
+ executor.setThreadNamePrefix(namePrefix);
+ //线程存活时间
+ executor.setKeepAliveSeconds(keepAliveSeconds);
+ /**
+ * 拒绝处理策略
+ * CallerRunsPolicy():交由调用方线程运行,比如 main 线程。
+ * AbortPolicy():直接抛出异常。
+ * DiscardPolicy():直接丢弃。
+ * DiscardOldestPolicy():丢弃队列中最老的任务。
+ */
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
+ // 初始化
+ executor.initialize();
+ return executor;
+ }
+}
diff --git a/web-infrastructure/src/main/java/com/zcloud/edu/persistence/dataobject/study/StudentSignDO.java b/web-infrastructure/src/main/java/com/zcloud/edu/persistence/dataobject/study/StudentSignDO.java
index 8077fdc..e1b3299 100644
--- a/web-infrastructure/src/main/java/com/zcloud/edu/persistence/dataobject/study/StudentSignDO.java
+++ b/web-infrastructure/src/main/java/com/zcloud/edu/persistence/dataobject/study/StudentSignDO.java
@@ -50,8 +50,8 @@ public class StudentSignDO extends BaseDO {
@ApiModelProperty(value = "打卡签字路径")
private String signUrl;
- //签到类型 1-打卡签到 2-人脸签到
- @ApiModelProperty(value = "签到类型 1-打卡签到 2-人脸签到")
+ //签到类型 1-打卡签到 2-考试签到
+ @ApiModelProperty(value = "签到类型 1-打卡签到 2-考试签到")
private Integer type;
@ApiModelProperty(value = "签到时间")
diff --git a/web-infrastructure/src/main/java/com/zcloud/edu/persistence/repository/impl/study/StudentExamRecordRepositoryImpl.java b/web-infrastructure/src/main/java/com/zcloud/edu/persistence/repository/impl/study/StudentExamRecordRepositoryImpl.java
index 36d03a0..ab8f393 100644
--- a/web-infrastructure/src/main/java/com/zcloud/edu/persistence/repository/impl/study/StudentExamRecordRepositoryImpl.java
+++ b/web-infrastructure/src/main/java/com/zcloud/edu/persistence/repository/impl/study/StudentExamRecordRepositoryImpl.java
@@ -32,9 +32,9 @@ public class StudentExamRecordRepositoryImpl extends BaseRepositoryImpl listPage(Map params) {
IPage iPage = new Query().getPage(params);
QueryWrapper queryWrapper = new QueryWrapper<>();
- queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, params);
- queryWrapper.orderByDesc("create_time");
- IPage result = studentExamRecordMapper.selectPage(iPage, queryWrapper);
+ queryWrapper = PageQueryHelper.createPageQueryWrapper(queryWrapper, params, "er.");
+ queryWrapper.orderByDesc("er.create_time");
+ IPage result = studentExamRecordMapper.listPage(iPage, queryWrapper,null);
return PageHelper.pageToResponse(result, result.getRecords());
}
diff --git a/web-infrastructure/src/main/resources/mapper/study/StudentExamRecordMapper.xml b/web-infrastructure/src/main/resources/mapper/study/StudentExamRecordMapper.xml
index 6529358..d75ef0b 100644
--- a/web-infrastructure/src/main/resources/mapper/study/StudentExamRecordMapper.xml
+++ b/web-infrastructure/src/main/resources/mapper/study/StudentExamRecordMapper.xml
@@ -36,26 +36,31 @@