From 387b746f5650ed2b341c56453960d118e69d7a02 Mon Sep 17 00:00:00 2001 From: zhangyue Date: Tue, 3 Feb 2026 14:17:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=80=E4=BA=BA=E4=B8=80?= =?UTF-8?q?=E6=A1=A3=E4=B8=8B=E8=BD=BD=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E8=80=83=E8=AF=95=E8=AE=B0=E5=BD=95=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- start/src/main/resources/license.xml | 16 ++++ .../template/category_score_list.docx | Bin 0 -> 13181 bytes .../edu/web/archives/ArchivesController.java | 10 +++ .../ArchivesReviewRecordController.java | 1 + .../query/archives/ArchivesQueryExe.java | 57 +++++++++++++ .../service/archives/ArchivesServiceImpl.java | 66 +++++++++++++++ .../edu/api/archives/ArchivesServiceI.java | 20 +++++ .../zcloud/edu/dto/archives/ArchivesQry.java | 30 +++++++ .../study/StudentExamRecordCO.java | 19 +++++ .../dto/clientobject/study/StudentSignCO.java | 9 ++- .../edu/dto/study/StudentSignAddCmd.java | 4 +- .../edu/dto/study/StudentSignUpdateCmd.java | 2 +- .../edu/domain/model/study/StudentSignE.java | 2 +- .../edu/config/ArchivesAsyncConfig.java | 75 ++++++++++++++++++ .../dataobject/study/StudentSignDO.java | 4 +- .../StudentExamRecordRepositoryImpl.java | 6 +- .../mapper/study/StudentExamRecordMapper.xml | 45 ++++++----- .../resources/mapper/study/StudentMapper.xml | 28 +++---- 18 files changed, 348 insertions(+), 46 deletions(-) create mode 100644 start/src/main/resources/license.xml create mode 100644 start/src/main/resources/templates/template/category_score_list.docx create mode 100644 web-app/src/main/java/com/zcloud/edu/command/query/archives/ArchivesQueryExe.java create mode 100644 web-app/src/main/java/com/zcloud/edu/service/archives/ArchivesServiceImpl.java create mode 100644 web-client/src/main/java/com/zcloud/edu/api/archives/ArchivesServiceI.java create mode 100644 web-client/src/main/java/com/zcloud/edu/dto/archives/ArchivesQry.java create mode 100644 web-infrastructure/src/main/java/com/zcloud/edu/config/ArchivesAsyncConfig.java 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 0000000000000000000000000000000000000000..27f7a9d42fd14fb19d752fa296b7d6afa866aaa4 GIT binary patch literal 13181 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 dx&8_KeeNwQ0rt~g? literal 0 HcmV?d00001 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 @@ select - count(DISTINCT s.phone) student_count, - s.class_corpinfo_id + u.corpinfo_id, + count(DISTINCT u.username) student_count from - student s - left join class c on c.class_id = s.class_id - - s.delete_enum = 'FALSE' - and c.delete_enum = 'FALSE' - and c.state != 1 - - s.class_corpinfo_id in - - #{item} + user u + left join training_user tu on tu.phone = u.username + where u.delete_enum = 'FALSE' + AND u.employment_flag = '1' + and tu.start_time <= now() + and tu.end_time >= now() + + AND u.corpinfo_id in + + #{corpinfoId} - - group by - s.class_corpinfo_id + GROUP BY u.corpinfo_id