Browse Source

Merge remote-tracking branch 'origin/dev_v3.4.2' into dev_v3.4.2

wangliang 8 months ago
parent
commit
9302b95b62

+ 36 - 12
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/service/impl/ImportLogicServiceImpl.java

@@ -134,7 +134,7 @@ public class ImportLogicServiceImpl implements ImportLogicService {
 
         BasicSchool basicSchool = commonCacheService.schoolCache(schoolId);
         // 学校设置强制校验卷型或者模式4
-        boolean needPaperNumber = (basicSchool.getHasPaperNumber() != null && basicSchool.getHasPaperNumber()) || ExamModelEnum.MODEL4.equals(basicExam.getExamModel());
+        boolean needPaperNumber = (basicSchool.getHasPaperNumber() != null && basicSchool.getHasPaperNumber());
         // 试卷编号->课程
         Map<String, Long> paperNumberCourseIdMap = new HashMap<>();
         // 试卷编号->考试时间
@@ -158,20 +158,44 @@ public class ImportLogicServiceImpl implements ImportLogicService {
             StringJoiner stringJoiner = new StringJoiner(";");
             // 校验excel内容
             basicExamStudentImport.getRequiredFieldList().forEach(m -> {
-                // 通用规则中基础字段默认不可取消的,必填
-                if (m.getDisabled() && StringUtils.isBlank(m.getValue())) {
-                    stringJoiner.add(m.getName() + "必填");
-                }
-                if (m.getCode().equals(RequiredFieldsEnum.PAPER_NUMBER.getCode()) && needPaperNumber) {
-                    if (StringUtils.isBlank(m.getValue())) {
+                // 模式4必填字段校验
+                if(ExamModelEnum.MODEL4.equals(basicExam.getExamModel())){
+                    if(StringUtils.isBlank(basicExamStudentImport.getPaperNumber())){
+                        stringJoiner.add(RequiredFieldsEnum.PAPER_NUMBER.getName() + "必填");
+                    }
+                    if(StringUtils.isBlank(basicExamStudentImport.getStudentCode())){
+                        stringJoiner.add(RequiredFieldsEnum.STUDENT_CODE.getName() + "必填");
+                    }
+                    if(StringUtils.isBlank(basicExamStudentImport.getStudentName())){
+                        stringJoiner.add(RequiredFieldsEnum.STUDENT_NAME.getName() + "必填");
+                    }
+                    if(StringUtils.isBlank(basicExamStudentImport.getCourseCode())){
+                        stringJoiner.add(RequiredFieldsEnum.COURSE_CODE.getName() + "必填");
+                    }
+                    if(StringUtils.isBlank(basicExamStudentImport.getCourseName())){
+                        stringJoiner.add(RequiredFieldsEnum.COURSE_NAME.getName() + "必填");
+                    }
+                    if(StringUtils.isBlank(basicExamStudentImport.getTeachingRoomName())){
+                        stringJoiner.add(RequiredFieldsEnum.TEACHING_ROOM_NAME.getName() + "必填");
+                    }
+                    if(StringUtils.isBlank(basicExamStudent.getTeachClassName())){
+                        stringJoiner.add(RequiredFieldsEnum.TEACH_CLASS_NAME.getName() + "必填");
+                    }
+                } else {
+                    // 通用规则中基础字段默认不可取消的,必填
+                    if (m.getDisabled() && StringUtils.isBlank(m.getValue())) {
                         stringJoiner.add(m.getName() + "必填");
                     }
+                    if (m.getCode().equals(RequiredFieldsEnum.PAPER_NUMBER.getCode()) && needPaperNumber) {
+                        if (StringUtils.isBlank(m.getValue())) {
+                            stringJoiner.add(m.getName() + "必填");
+                        }
+                    }
                 }
-
-                // 试卷编号不为空时,校区(考点)必填
-                if (StringUtils.isNotBlank(basicExamStudent.getPaperNumber()) && m.getCode().equals(RequiredFieldsEnum.EXAM_PLACE.getCode()) && m.getEnable() && StringUtils.isBlank(basicExamStudent.getExamPlace())) {
-                    stringJoiner.add(RequiredFieldsEnum.EXAM_PLACE.getName() + "必填");
-                }
+//                // 试卷编号不为空时,校区(考点)必填
+//                if (StringUtils.isNotBlank(basicExamStudent.getPaperNumber()) && m.getCode().equals(RequiredFieldsEnum.EXAM_PLACE.getCode()) && m.getEnable() && StringUtils.isBlank(basicExamStudent.getExamPlace())) {
+//                    stringJoiner.add(RequiredFieldsEnum.EXAM_PLACE.getName() + "必填");
+//                }
             });
             // 任课老师和任课老师工号都有值或都没值
             if (StringUtils.isNotBlank(basicExamStudentImport.getTeacherCode()) && StringUtils.isBlank(basicExamStudentImport.getTeacherName())) {

+ 2 - 2
distributed-print/install/config.ini

@@ -1,6 +1,6 @@
 [app]
-version=3.4.1
-name=֪ѧ֪��
+version=3.4.2
+name=֪ѧ֪¿¼
 portal=http://localhost:7400/
 module=print
 depend=mysql,nginx,redis

+ 8 - 6
distributed-print/install/nginx/teachcloud.conf

@@ -14,18 +14,20 @@ server {
                 add_header Access-Control-Allow-Origin *;
         }
 
-        location /fss/ {
-                alias ../../teachcloud/static/;
-                add_header Access-Control-Allow-Origin *;
-        }
-
         location /mark/ {
                 alias  ../../teachcloud/web/mark/;
                 index  index.html index.htm;
                 try_files $uri $uri/ /mark/index.html;
         }
 		
-        location ~ ^/(api|fss)/ {
+        location ^~ /api/ {
+                proxy_pass http://127.0.0.1:7410;
+                proxy_set_header Host   $http_host;
+                proxy_set_header X-Real-IP $remote_addr;
+                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+        }
+
+        location ^~ /fss/ {
                 proxy_pass http://127.0.0.1:7410;
                 proxy_set_header Host   $http_host;
                 proxy_set_header X-Real-IP $remote_addr;

+ 1 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkArchiveController.java

@@ -73,8 +73,7 @@ public class MarkArchiveController {
     public void scoreExport(@Validated ArchiveStudentQuery query, HttpServletResponse response) throws IOException {
         response.setHeader("Content-Disposition", "inline;filename=" + URLEncoder.encode("成绩导出", SystemConstant.CHARSET_NAME) + ".xlsx");
         response.setContentType("application/vnd.ms-excel");
-        ServletOutputStream outputStream = response.getOutputStream();
-        markStudentService.scoreExport(query, outputStream);
+        markStudentService.scoreExport(query, response);
     }
 
     @ApiOperation(value = "成绩下载")

+ 1 - 2
distributed-print/src/main/java/com/qmth/distributed/print/api/mark/MarkDocumentController.java

@@ -108,8 +108,7 @@ public class MarkDocumentController {
             response.setHeader("Content-Disposition",
                     "inline;filename=" + URLEncoder.encode("成绩导出", SystemConstant.CHARSET_NAME) + ".xlsx");
             response.setContentType("application/vnd.ms-excel");
-            ServletOutputStream outputStream = response.getOutputStream();
-            markStudentService.scoreExport(query, outputStream);
+            markStudentService.scoreExport(query, response);
         }
         MarkPaper markPaper = markPaperService.getByExamIdAndPaperNumber(document.getExamId(), document.getPaperNumber());
         if (markPaper == null) {

+ 4 - 2
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -1306,12 +1306,14 @@ public class SystemConstant {
     }
 
     public static String readJson(InputStream inputStream) {
+        InputStreamReader reader = null;
         try {
+            reader = new InputStreamReader(inputStream, "UTF-8");
             // 读取目标文件的内容
             StringBuilder content = new StringBuilder();
-            byte[] buffer = new byte[1024];
+            char[] buffer = new char[1024];
             int length;
-            while ((length = inputStream.read(buffer)) > 0) {
+            while ((length = reader.read(buffer)) > 0) {
                 content.append(new String(buffer, 0, length));
             }
             return content.toString();

+ 1 - 1
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/MarkStudentService.java

@@ -159,7 +159,7 @@ public interface MarkStudentService extends IService<MarkStudent> {
 
     IPage<ArchiveStudentVo> studentList(ArchiveStudentQuery query);
 
-    void scoreExport(ArchiveStudentQuery query, OutputStream outputStream);
+    void scoreExport(ArchiveStudentQuery query, HttpServletResponse response);
 
     ScoreReportVo scoreReport(ArchiveStudentQuery query);
 

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

@@ -267,7 +267,7 @@ public class MarkDocumentServiceImpl extends ServiceImpl<MarkDocumentMapper, Mar
                     filePath = tempFile.getPath() + File.separator + name + SystemConstant.EXCEL_PREFIX;
                     File file = new File(filePath);
                     OutputStream outputStream = new FileOutputStream(file);
-                    markStudentService.scoreExport(query, outputStream);
+                    markStudentService.scoreExport(query, response);
                     writer.write(file, file.getName());
                     file.delete();
                     break;

+ 49 - 9
teachcloud-mark/src/main/java/com/qmth/teachcloud/mark/service/impl/MarkStudentServiceImpl.java

@@ -1139,7 +1139,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     }
 
     @Override
-    public void scoreExport(ArchiveStudentQuery query, OutputStream outputStream) {
+    public void scoreExport(ArchiveStudentQuery query, HttpServletResponse response) {
         SysUser sysUser = (SysUser) ServletUtil.getRequestUser();
         //生成表头
         String[] columnName = new String[]{"学生姓名", "学号", "学院", "教学班", "行政班", "课程代码", "课程名称", "状态", "客观分", "主观分", "成绩"};
@@ -1149,9 +1149,11 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         for (MarkQuestion question : oQuestionList) {
             columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "选项");
             columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "得分");
+            columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "满分");
         }
         for (MarkQuestion question : sQuestionList) {
             columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber());
+            columnNameList.add(question.getMainTitle() + " " + question.getMainNumber() + "-" + question.getSubNumber() + "满分");
         }
         String[] columnNames = columnNameList.toArray(new String[0]);
         //生成动态内容
@@ -1159,6 +1161,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         // 使用成绩管理列表请求的数据权限
         DataPermissionRule dpr = basicRoleDataPermissionService.findDataPermission(sysUser.getSchoolId(), sysUser.getId(), "/api/admin/mark/archive/score/list");
         List<ArchiveStudentVo> ret = baseMapper.studentList(sysUser.getSchoolId(), query, dpr);
+
         for (ArchiveStudentVo s : ret) {
             List<String> valueList = new ArrayList<>();
             valueList.add(s.getStudentName());
@@ -1175,23 +1178,60 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
             for (ScoreItem item : s.getScoreList(true, oQuestionList)) {
                 valueList.add(item.getAnswer());
                 valueList.add(item.getScore() == null ? "" : item.getScore().toString());
+                valueList.add(item.getTotalScore() == null ? "" : item.getTotalScore().toString());
             }
             for (ScoreItem item : s.getScoreList(false, sQuestionList)) {
                 valueList.add(item.getScore().toString());
+                valueList.add(item.getTotalScore() == null ? "" : item.getTotalScore().toString());
             }
             String[] columnValue = valueList.toArray(new String[0]);
             columnValues.add(columnValue);
         }
+
+        String rootPath = null;
         try {
+            // 本地保存目录
+            File tempFile = SystemConstant.getFileTempParentDirVar(SystemConstant.TEMP_PREFIX);
+            rootPath = tempFile.getPath() + File.separator + SystemConstant.getNanoId();
+
+            // 下载文件保存目录(用uuid命名)
+            String downloadFilePath = rootPath + File.separator + query.getPaperNumber();
+            File downloadPathFile = new File(downloadFilePath);
+            if (!downloadPathFile.exists()) {
+                downloadPathFile.mkdirs();
+            }
+
             log.debug("导出Excel开始...");
             ExcelWriter writer = ExcelWriter.create(ExcelType.XLSX);
             writer.writeDataArrays("成绩导出", null, columnNames, columnValues.listIterator());
-            writer.output(outputStream);
-            outputStream.flush();
-            outputStream.close();
+            FileOutputStream fileOut = new FileOutputStream(downloadFilePath + File.separator + "成绩导出" + SystemConstant.EXCEL_PREFIX);
+            writer.output(fileOut);
+            fileOut.flush();
+            fileOut.close();
+
+            // 通过教学班聚合
+            Map<String, List<String[]>> listMap = columnValues.stream().collect(Collectors.groupingBy(m -> m[3]));
+            Set<Map.Entry<String, List<String[]>>> entrySet = listMap.entrySet();
+            if (entrySet.size() > 1) {
+                for (Map.Entry<String, List<String[]>> entry : entrySet) {
+                    writer = ExcelWriter.create(ExcelType.XLSX);
+                    writer.writeDataArrays("成绩导出", null, columnNames, entry.getValue().listIterator());
+                    FileOutputStream classFileOut = new FileOutputStream(downloadFilePath + File.separator + "成绩导出-" + entry.getKey() + SystemConstant.EXCEL_PREFIX);
+                    writer.output(classFileOut);
+                    classFileOut.flush();
+                    classFileOut.close();
+                }
+            }
             log.debug("导出Excel结束");
+
+            String zipFileName = downloadPathFile.getName() + SystemConstant.ZIP_PREFIX;
+            FileUtil.downloadEncryptZip(response, downloadPathFile, zipFileName);
         } catch (Exception e) {
             throw new RuntimeException(e);
+        } finally {
+            if (Objects.nonNull(rootPath)) {
+                FileUtil.deleteDirectory(rootPath);
+            }
         }
     }
 
@@ -1486,10 +1526,10 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
     /**
      * 填充大题分析
      *
-     * @param ret           ret
-     * @param studentList   涉及的考生集合
-     * @param examId        考试id
-     * @param paperNumber   试卷编号
+     * @param ret         ret
+     * @param studentList 涉及的考生集合
+     * @param examId      考试id
+     * @param paperNumber 试卷编号
      */
     private void fillMainQuestionAnalysis(ScoreReportVo ret, List<ArchiveStudentVo> studentList, Long examId, String paperNumber) {
         // 试卷结构数据
@@ -1600,7 +1640,7 @@ public class MarkStudentServiceImpl extends ServiceImpl<MarkStudentMapper, MarkS
         ret.setMainQuestionAnalysis(questionVoList);
     }
 
-    private String getMainQuestionMapKey(Integer mainNumber, boolean objective){
+    private String getMainQuestionMapKey(Integer mainNumber, boolean objective) {
         return mainNumber + "-" + objective;
     }
 

+ 1 - 1
teachcloud-mark/src/main/resources/mapper/MarkStudentMapper.xml

@@ -445,7 +445,7 @@
             </choose>
         </if>
         <if test="req.orderType == null or req.orderType == '' or req.orderField == null or req.orderField == ''">
-            order by bes.student_code
+            order by bes.status desc, bes.student_code
         </if>
     </select>
     <sql id="archiveQuery">