소스 검색

add. 归档管理-总量分析

caozixuan 10 달 전
부모
커밋
ff560ddb41

+ 5 - 1
distributed-print-business/src/main/resources/db/log/脚本-caozx.sql

@@ -2,4 +2,8 @@
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3055', '首页-评卷待办数量', '/api/admin/work/mark/task/ready_count', 'URL', '16', '11', 'SYS', '1', '1', '1');
 INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3056', '首页-评卷待办列表', '/api/admin/work/mark/task/ready', 'URL', '16', '12', 'SYS', '1', '1', '1');
 
-INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (43, NULL, NULL, 'sys.card.size.list', '全局题卡格式清单', '[A3, 8K]', NULL, 1, 2, 1, NULL, NULL, NULL);
+INSERT INTO `sys_config` (`id`, `school_id`, `org_id`, `config_key`, `config_name`, `config_value`, `remark`, `enable`, `sort`, `create_id`, `create_time`, `update_id`, `update_time`) VALUES (43, NULL, NULL, 'sys.card.size.list', '全局题卡格式清单', '[A3, 8K]', NULL, 1, 2, 1, NULL, NULL, NULL);
+
+-- 2024-08-22
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, enable, default_auth, front_display) VALUES ('3057', '总量分析', '/api/admin/mark/archive/score/list/export', 'URL', '487', '3', 'AUTH', '1', '1', '1');
+INSERT INTO sys_privilege (id, name, url, type, parent_id, sequence, property, related, enable, default_auth, front_display) VALUES ('3058', '总量分析', 'aggregateAnalysis', 'BUTTON', '487', '3', 'AUTH', '3057', '1', '0', '1');

+ 8 - 0
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArchiveController.java

@@ -23,6 +23,7 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 /**
  * <p>
@@ -52,6 +53,13 @@ public class MarkArchiveController {
         return ResultUtil.ok(markPaperService.scoreList(query));
     }
 
+    @ApiOperation(value = "总量分析(导出)")
+    @RequestMapping(value = "score/list/export", method = RequestMethod.POST)
+    public Result scoreListExport(@Validated ArchiveScoreQuery query,HttpServletResponse response) throws IOException {
+        markPaperService.scoreListExport(query, response);
+        return ResultUtil.ok();
+    }
+
     @ApiOperation(value = "班级详情列表")
     @RequestMapping(value = "student/list", method = RequestMethod.POST)
     public Result studentList(@Validated ArchiveStudentQuery query) {

+ 154 - 0
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/dto/ArchiveScoreExportDto.java

@@ -0,0 +1,154 @@
+package com.qmth.teachcloud.mark.dto;
+
+import com.qmth.boot.tools.excel.annotation.ExcelColumn;
+
+/**
+ * @Description: 总量分析dto
+ * @Author: CaoZixuan
+ * @Date: 2024-08-22
+ */
+public class ArchiveScoreExportDto {
+
+    @ExcelColumn(name = "课程名称(代码)", index = 0)
+    private String courseInfo;
+
+    @ExcelColumn(name = "开课学院", index = 1)
+    private String openCollege;
+
+    @ExcelColumn(name = "试卷编号", index = 2)
+    private String paperNumber;
+
+    @ExcelColumn(name = "总考生", index = 3)
+    private Integer studentCount;
+
+    @ExcelColumn(name = "参考班级", index = 4)
+    private Integer classCount;
+
+    @ExcelColumn(name = "缺考人数", index = 5)
+    private Integer absentCount;
+
+    @ExcelColumn(name = "平均分", index = 6)
+    private Double avgScore;
+
+    @ExcelColumn(name = "最高分", index = 7)
+    private Double maxScore;
+
+    @ExcelColumn(name = "最低分", index = 8)
+    private Double minScore;
+
+    @ExcelColumn(name = "及格人数", index = 9)
+    private Integer passCount;
+
+    @ExcelColumn(name = "及格率", index = 10)
+    private String passRate;
+
+    @ExcelColumn(name = "优秀人数", index = 11)
+    private Integer excellentCount;
+
+    @ExcelColumn(name = "优秀率", index = 12)
+    private String excellentRate;
+
+    public String getCourseInfo() {
+        return courseInfo;
+    }
+
+    public void setCourseInfo(String courseInfo) {
+        this.courseInfo = courseInfo;
+    }
+
+    public String getOpenCollege() {
+        return openCollege;
+    }
+
+    public void setOpenCollege(String openCollege) {
+        this.openCollege = openCollege;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public Integer getStudentCount() {
+        return studentCount;
+    }
+
+    public void setStudentCount(Integer studentCount) {
+        this.studentCount = studentCount;
+    }
+
+    public Integer getClassCount() {
+        return classCount;
+    }
+
+    public void setClassCount(Integer classCount) {
+        this.classCount = classCount;
+    }
+
+    public Integer getAbsentCount() {
+        return absentCount;
+    }
+
+    public void setAbsentCount(Integer absentCount) {
+        this.absentCount = absentCount;
+    }
+
+    public Double getAvgScore() {
+        return avgScore;
+    }
+
+    public void setAvgScore(Double avgScore) {
+        this.avgScore = avgScore;
+    }
+
+    public Double getMaxScore() {
+        return maxScore;
+    }
+
+    public void setMaxScore(Double maxScore) {
+        this.maxScore = maxScore;
+    }
+
+    public Double getMinScore() {
+        return minScore;
+    }
+
+    public void setMinScore(Double minScore) {
+        this.minScore = minScore;
+    }
+
+    public Integer getPassCount() {
+        return passCount;
+    }
+
+    public void setPassCount(Integer passCount) {
+        this.passCount = passCount;
+    }
+
+    public String getPassRate() {
+        return passRate;
+    }
+
+    public void setPassRate(String passRate) {
+        this.passRate = passRate;
+    }
+
+    public Integer getExcellentCount() {
+        return excellentCount;
+    }
+
+    public void setExcellentCount(Integer excellentCount) {
+        this.excellentCount = excellentCount;
+    }
+
+    public String getExcellentRate() {
+        return excellentRate;
+    }
+
+    public void setExcellentRate(String excellentRate) {
+        this.excellentRate = excellentRate;
+    }
+}

+ 13 - 3
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkPaperService.java

@@ -17,6 +17,8 @@ import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
 import com.qmth.teachcloud.mark.entity.MarkPaper;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.util.List;
 
 /**
@@ -57,15 +59,15 @@ public interface MarkPaperService extends IService<MarkPaper> {
 
     int getPaperNumberCount(Long id, Long courseId, String coursePaperId, MarkPaperStatus status, DataPermissionRule dpr);
 
-    IPage<CheckScoreListDto> listStudentScoreList(Long examId, Long openCollegeId, Long courseId, String paperNumber, Integer pageNumber,
-                                                  Integer pageSize);
+    IPage<CheckScoreListDto> listStudentScoreList(Long examId, Long openCollegeId, Long courseId, String paperNumber,
+            Integer pageNumber, Integer pageSize);
 
     void updateStatus(Long examId, String paperNumber, MarkPaperStatus newStatus, MarkPaperStatus currentStatus);
 
     void updateUploadCount(Long examId, String paperNumber, int countUploaded);
 
     IPage<MarkPaperPackageDto> listPackage(Long examId, String paperNumber, String packageCode, Integer pageNumber,
-                                           Integer pageSize);
+            Integer pageSize);
 
     MarkPaper getByExamIdAndCoursePaperId(Long examId, String coursePaperId);
 
@@ -98,4 +100,12 @@ public interface MarkPaperService extends IService<MarkPaper> {
     void importCardJsonData(Long examId, MultipartFile file, String md5);
 
     List<MarkPaper> listByExamIdAndCourseIdForModel4(Long examId, Long courseId);
+
+    /**
+     * 总量分析(成绩查询列表导出)
+     *
+     * @param query    查询条件
+     * @param response response
+     */
+    void scoreListExport(ArchiveScoreQuery query, HttpServletResponse response) throws IOException;
 }

+ 41 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkPaperServiceImpl.java

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.tools.excel.ExcelWriter;
+import com.qmth.boot.tools.excel.enums.ExcelType;
 import com.qmth.boot.tools.io.ZipReader;
 import com.qmth.teachcloud.common.bean.dto.DataPermissionRule;
 import com.qmth.teachcloud.common.bean.dto.mark.MarkSettingDto;
@@ -36,10 +38,10 @@ import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreQuery;
 import com.qmth.teachcloud.mark.bean.archivescore.ArchiveScoreVo;
 import com.qmth.teachcloud.mark.bean.cardJson.CourseCard;
 import com.qmth.teachcloud.mark.bean.cardJson.Description;
-import com.qmth.teachcloud.mark.bean.cardJson.DescriptionCode;
 import com.qmth.teachcloud.mark.bean.document.ArchivePaperQuery;
 import com.qmth.teachcloud.mark.bean.document.ArchivePaperVo;
 import com.qmth.teachcloud.mark.bean.vo.parseCard.Struct;
+import com.qmth.teachcloud.mark.dto.ArchiveScoreExportDto;
 import com.qmth.teachcloud.mark.dto.mark.score.CheckScoreListDto;
 import com.qmth.teachcloud.mark.dto.mark.score.MarkPaperPackageDto;
 import com.qmth.teachcloud.mark.dto.mark.score.SettingDto;
@@ -58,12 +60,17 @@ import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.FilenameUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
 import java.io.File;
+import java.io.IOException;
+import java.net.URLEncoder;
 import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -672,4 +679,37 @@ public class MarkPaperServiceImpl extends ServiceImpl<MarkPaperMapper, MarkPaper
                 .eq(MarkPaper::getCourseId, courseId);
         return this.list(queryWrapper);
     }
+
+    @Override
+    public void scoreListExport(ArchiveScoreQuery query, HttpServletResponse response) throws IOException {
+        IPage<ArchiveScoreVo> page = this.scoreList(query);
+        List<ArchiveScoreExportDto> dtoList = new ArrayList<>();
+        for (ArchiveScoreVo record : page.getRecords()) {
+            ArchiveScoreExportDto dto = new ArchiveScoreExportDto();
+            BeanUtils.copyProperties(record, dto);
+            dto.setCourseInfo(record.getCourseName() + "(" + record.getCourseCode() + ")");
+            if (SystemConstant.strNotNull(dto.getPassRate())) {
+                dto.setPassRate(dto.getPassRate() + "%");
+            }
+            if (SystemConstant.strNotNull(dto.getExcellentRate())) {
+                dto.setExcellentRate(dto.getExcellentRate() + "%");
+            }
+            dtoList.add(dto);
+        }
+        try {
+            log.debug("导出Excel开始...");
+            response.setHeader("Content-Disposition",
+                    "inline;filename=" + URLEncoder.encode("成绩导出", SystemConstant.CHARSET_NAME) + ".xlsx");
+            response.setContentType("application/vnd.ms-excel");
+            ServletOutputStream outputStream = response.getOutputStream();
+            ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
+            writer.writeObjects("总量分析", null, ArchiveScoreExportDto.class, dtoList.listIterator());
+            writer.output(response.getOutputStream());
+            outputStream.flush();
+            outputStream.close();
+            log.debug("导出Excel结束");
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
 }