Ver Fonte

txt导入

xiatian há 9 meses atrás
pai
commit
dfa30d4b71

+ 2 - 2
src/main/java/cn/com/qmth/scancentral/controller/admin/StudentController.java

@@ -76,7 +76,7 @@ public class StudentController extends BaseController {
     @ApiOperation(value = "违纪导入模版下载")
     @PostMapping("breach/template")
     public void breachTemplate(HttpServletResponse response) {
-        exportFile("违纪导入模板.xlsx", ResouceUtil.getStream("templates/breachImport.xlsx"));
+        exportFile("违纪导入模板.txt", ResouceUtil.getStream("templates/breachImport.txt"));
     }
 
     @ApiOperation(value = "违纪导入")
@@ -89,7 +89,7 @@ public class StudentController extends BaseController {
     @ApiOperation(value = "考生状态导入模版下载")
     @PostMapping("cust-status/template")
     public void custStatusTemplate(HttpServletResponse response) {
-        exportFile("考生状态导入模板.xlsx", ResouceUtil.getStream("templates/custStatusImport.xlsx"));
+        exportFile("考生状态导入模板.txt", ResouceUtil.getStream("templates/custStatusImport.txt"));
     }
 
     @ApiOperation(value = "违纪导入")

+ 2 - 2
src/main/java/cn/com/qmth/scancentral/enums/FileType.java

@@ -9,9 +9,9 @@ public enum FileType {
             "%d/card/package.%s"), CARD("题卡", "%d/card/answer/%d.%s"), ADMIN_SLICE("管理员上传裁切图",
                     "%d/upload/%s/%d-%d-%d/%s.%s"), ADMIN_SHEET("管理员上传裁原图", "%d/upload/%s/%d-%d/%s.%s"), ADAPTE_FILE(
                             "适配题卡", "%d/card/answer/%d/%s.%s"), BREACH_FILE("违纪文件",
-                                    "%d/breach/%s/breach.xlsx"), BREACH_INFO_FILE("违纪信息文件",
+                                    "%d/breach/%s/breach.txt"), BREACH_INFO_FILE("违纪信息文件",
                                             "%d/breach-info/%s/breach-info.txt"), CUST_STATUS_FILE("考生状态文件",
-                                                    "%d/cust-status/%s/cust-status.xlsx"), CUST_STATUS_INFO_FILE(
+                                                    "%d/cust-status/%s/cust-status.txt"), CUST_STATUS_INFO_FILE(
                                                             "考生状态信息文件", "%d/cust-status-info/%s/cust-status-info.txt"),;
 
     private String name;

+ 79 - 76
src/main/java/cn/com/qmth/scancentral/service/impl/StudentServiceImpl.java

@@ -56,11 +56,11 @@ import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.core.retrofit.utils.SignatureInfo;
 import com.qmth.boot.tools.excel.ExcelReader;
 import com.qmth.boot.tools.excel.enums.ExcelType;
-import com.qmth.boot.tools.io.IOUtils;
 import com.qmth.boot.tools.signature.SignatureType;
 import com.qmth.boot.tools.uuid.FastUUID;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -79,9 +79,9 @@ import java.util.stream.Collectors;
 @Service
 public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> implements StudentService {
 
-    private static final String[] BREACH_EXCEL_HEADER = new String[]{"准考证号", "违纪码"};
+    private static final String[] BREACH_EXCEL_HEADER = new String[] { "准考证号", "违纪码" };
 
-    private static final String[] CUST_STATUS_EXCEL_HEADER = new String[]{"准考证号", "考生状态"};
+    private static final String[] CUST_STATUS_EXCEL_HEADER = new String[] { "准考证号", "考生状态" };
 
     private static final Logger log = LoggerFactory.getLogger(StudentService.class);
 
@@ -149,7 +149,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     @Transactional
     // @Lockable(name = LockType.STUDENT, key = "#id")
     public void updateStudentAndPaper(@NotNull User user, @NotNull Long id,
-                                      @NotNull List<StudentPaperEntity> studentPaperList) {
+            @NotNull List<StudentPaperEntity> studentPaperList) {
         for (StudentPaperEntity studentPaper : studentPaperList) {
             studentPaper.setStudentId(id);
         }
@@ -696,7 +696,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     @Transactional
     @Override
     public void updateUploadStatus(@NotNull Long id, @NotNull UploadStatus fileUploadStatus,
-                                   @NotNull UploadStatus dataUploadStatus) {
+            @NotNull UploadStatus dataUploadStatus) {
         LambdaUpdateWrapper<StudentEntity> lw = new LambdaUpdateWrapper<>();
         lw.set(StudentEntity::getDataUploadStatus, dataUploadStatus);
         lw.set(StudentEntity::getFileUploadStatus, fileUploadStatus);
@@ -1223,8 +1223,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void disposeStudent(ExportCetVo student, ExamEntity exam, List<PaperPageCetVo> pages,
-                                List<PaperCetVo> papers, String imageTransferDir, Map<String, List<QuestionEntity>> structs,
-                                Map<Integer, AnswerCardEntity> cardMap) {
+            List<PaperCetVo> papers, String imageTransferDir, Map<String, List<QuestionEntity>> structs,
+            Map<Integer, AnswerCardEntity> cardMap) {
         int subject = Integer.valueOf(student.getSubjectCode());
         if (subject > 2) {
             if (student.getExamStatus().equals(ExamStatus.ABSENT)) {
@@ -1305,7 +1305,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void setCardStatus(ExportCetVo student, AnswerCardEntity card, List<PaperPageCetVo> pages,
-                               Map<Long, PaperCetVo> pmap) {
+            Map<Long, PaperCetVo> pmap) {
         int subject = Integer.valueOf(student.getSubjectCode());
         if (subject > 2) {
             setCardStatusSmall(student, card, pages, pmap);
@@ -1315,7 +1315,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void setCardStatusSmall(ExportCetVo student, AnswerCardEntity card, List<PaperPageCetVo> pages,
-                                    Map<Long, PaperCetVo> pmap) {
+            Map<Long, PaperCetVo> pmap) {
         PaperPageCetVo p = pages.get(0);
         if (ExamStatus.ABSENT.equals(student.getExamStatus())) {
             if (pmap.get(p.getPaperId()).getQuestionFilled()) {
@@ -1330,7 +1330,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private void setCardStatusCet(ExportCetVo student, AnswerCardEntity card, List<PaperPageCetVo> pages,
-                                  Map<Long, PaperCetVo> pmap) {
+            Map<Long, PaperCetVo> pmap) {
         if (card.getPaperCount() == 1) {
             PaperPageCetVo p = pages.get(0);
             if (ExamStatus.ABSENT.equals(student.getExamStatus())) {
@@ -1423,7 +1423,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private String getCetAnswer(Map<String, List<QuestionEntity>> structs, List<PaperPageCetVo> pages, Long examId,
-                                String subjectCode) {
+            String subjectCode) {
         List<String> answers = new ArrayList<String>();
         List<QuestionEntity> struct = structs.get(examId + "-" + subjectCode);
         if (struct == null) {
@@ -1870,7 +1870,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
             }
             return ret;
         } finally {
-            IOUtils.closeQuietly(inputStream);
+            if (inputStream != null) {
+                inputStream.close();
+            }
         }
     }
 
@@ -2321,7 +2323,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         File temDir = new File("temp/" + FastUUID.get() + "/");
         try {
             temDir.mkdirs();
-            File excel = new File(temDir.getAbsolutePath() + "/breach.xlsx");
+            File excel = new File(temDir.getAbsolutePath() + "/breach.txt");
             try {
                 file.transferTo(excel);
             } catch (Exception e) {
@@ -2389,52 +2391,50 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private ImportBreachResult breachImportCheck(Long examId, String subjectCode, InputStream in) {
-        List<String[]> lineList = null;
-        ExcelReader reader = ExcelReader.create(ExcelType.XLSX, in, 0);
+        List<String> lineList = null;
         try {
-            lineList = reader.getDataArrayList();
-        } catch (Exception e) {
-            throw new ParameterException("Excel 解析失败");
-        }
-        if (!Arrays.equals(BREACH_EXCEL_HEADER, reader.getColumnNames())) {
-            throw new ParameterException("Excel表头错误");
-        }
-        if (CollectionUtils.isEmpty(lineList)) {
-            throw new ParameterException("Excel无内容");
-        }
-        if (500001 < lineList.size()) {
-            throw new ParameterException("数据行数不能超过500000");
+            lineList = IOUtils.readLines(in, "UTF-8");
+        } catch (IOException e) {
+            throw new StatusException("读取文件出错", e);
         }
         ImportBreachResult ret = new ImportBreachResult();
         List<String> failRecords = new ArrayList<>();
         ret.setErrMsg(failRecords);
         Set<String> examNumberSet = new HashSet<>();
         for (int i = 0; i < lineList.size(); i++) {
-            String[] line = lineList.get(i);
-
+            String lineString = lineList.get(i);
+            if (StringUtils.isBlank(lineString)) {
+                continue;
+            }
             StringBuilder msg = new StringBuilder();
-
-            String examNumber = trimAndNullIfBlank(line[0]);
-            if (StringUtils.isBlank(examNumber)) {
-                msg.append("  准考证号不能为空");
+            String[] line = lineString.split(",");
+            if (line.length != 3) {
+                msg.append("  格式错误");
             } else {
-                StudentEntity s = findByExamAndSubjectCodeAndExamNumber(examId, subjectCode, examNumber);
-                if (s == null) {
-                    msg.append("  准考证号未找到");
+                String examNumber = trimAndNullIfBlank(line[0]);
+                if (StringUtils.isBlank(examNumber)) {
+                    msg.append("  准考证号不能为空");
                 } else {
-                    if (examNumberSet.contains(examNumber)) {
-                        msg.append("  准考证号重复");
+                    StudentEntity s = findByExamAndSubjectCodeAndExamNumber(examId, subjectCode, examNumber);
+                    if (s == null) {
+                        msg.append("  准考证号未找到");
                     } else {
-                        examNumberSet.add(examNumber);
+                        if (examNumberSet.contains(examNumber)) {
+                            msg.append("  准考证号重复");
+                        } else {
+                            examNumberSet.add(examNumber);
+                        }
                     }
                 }
-            }
 
-            String breach = trimAndNullIfBlank(line[1]);
-            if (StringUtils.isNotBlank(breach)) {
-                ret.setBreachCount(ret.getBreachCount() + 1);
+                String breach = trimAndNullIfBlank(line[1]);
+                if (StringUtils.isNotBlank(breach)) {
+                    ret.setBreachCount(ret.getBreachCount() + 1);
+                }
+            }
+            if (msg.length() > 0) {
+                failRecords.add(errorMsg(i + 2, msg.toString()));
             }
-
         }
 
         if (CollectionUtils.isNotEmpty(failRecords)) {
@@ -2445,13 +2445,17 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
         return ret;
     }
 
+    private String errorMsg(int lineNum, String msg) {
+        return "第" + lineNum + "行 " + msg;
+    }
+
     @Override
     public ImportBreachResult custStatusImport(Long examId, String subjectCode, MultipartFile file) {
         // 暂存临时文件
         File temDir = new File("temp/" + FastUUID.get() + "/");
         try {
             temDir.mkdirs();
-            File excel = new File(temDir.getAbsolutePath() + "/cust-status.xlsx");
+            File excel = new File(temDir.getAbsolutePath() + "/cust-status.txt");
             try {
                 file.transferTo(excel);
             } catch (Exception e) {
@@ -2519,52 +2523,51 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
     }
 
     private ImportBreachResult custStatusImportCheck(Long examId, String subjectCode, InputStream in) {
-        List<String[]> lineList = null;
-        ExcelReader reader = ExcelReader.create(ExcelType.XLSX, in, 0);
+        List<String> lineList = null;
         try {
-            lineList = reader.getDataArrayList();
-        } catch (Exception e) {
-            throw new ParameterException("Excel 解析失败");
-        }
-        if (!Arrays.equals(CUST_STATUS_EXCEL_HEADER, reader.getColumnNames())) {
-            throw new ParameterException("Excel表头错误");
-        }
-        if (CollectionUtils.isEmpty(lineList)) {
-            throw new ParameterException("Excel无内容");
-        }
-        if (500001 < lineList.size()) {
-            throw new ParameterException("数据行数不能超过500000");
+            lineList = IOUtils.readLines(in, "UTF-8");
+        } catch (IOException e) {
+            throw new StatusException("读取文件出错", e);
         }
         ImportBreachResult ret = new ImportBreachResult();
         List<String> failRecords = new ArrayList<>();
         ret.setErrMsg(failRecords);
         Set<String> examNumberSet = new HashSet<>();
         for (int i = 0; i < lineList.size(); i++) {
-            String[] line = lineList.get(i);
-
+            String lineString = lineList.get(i);
+            if (StringUtils.isBlank(lineString)) {
+                continue;
+            }
             StringBuilder msg = new StringBuilder();
-
-            String examNumber = trimAndNullIfBlank(line[0]);
-            if (StringUtils.isBlank(examNumber)) {
-                msg.append("  准考证号不能为空");
+            String[] line = lineString.split(",");
+            if (line.length != 3) {
+                msg.append("  格式错误");
             } else {
-                StudentEntity s = findByExamAndSubjectCodeAndExamNumber(examId, subjectCode, examNumber);
-                if (s == null) {
-                    msg.append("  准考证号未找到");
+
+                String examNumber = trimAndNullIfBlank(line[0]);
+                if (StringUtils.isBlank(examNumber)) {
+                    msg.append("  准考证号不能为空");
                 } else {
-                    if (examNumberSet.contains(examNumber)) {
-                        msg.append("  准考证号重复");
+                    StudentEntity s = findByExamAndSubjectCodeAndExamNumber(examId, subjectCode, examNumber);
+                    if (s == null) {
+                        msg.append("  准考证号未找到");
                     } else {
-                        examNumberSet.add(examNumber);
+                        if (examNumberSet.contains(examNumber)) {
+                            msg.append("  准考证号重复");
+                        } else {
+                            examNumberSet.add(examNumber);
+                        }
                     }
                 }
-            }
 
-            String breach = trimAndNullIfBlank(line[1]);
-            if (StringUtils.isNotBlank(breach)) {
-                ret.setBreachCount(ret.getBreachCount() + 1);
+                String breach = trimAndNullIfBlank(line[1]);
+                if (StringUtils.isNotBlank(breach)) {
+                    ret.setBreachCount(ret.getBreachCount() + 1);
+                }
+            }
+            if (msg.length() > 0) {
+                failRecords.add(errorMsg(i + 2, msg.toString()));
             }
-
         }
 
         if (CollectionUtils.isNotEmpty(failRecords)) {

+ 1 - 0
src/main/resources/templates/breachImport.txt

@@ -0,0 +1 @@
+准考证号,姓名,违纪(标题行,数据从第二行读取)

BIN
src/main/resources/templates/breachImport.xlsx


+ 1 - 0
src/main/resources/templates/custStatusImport.txt

@@ -0,0 +1 @@
+准考证号,姓名,考生状态(标题行,数据从第二行读取)

BIN
src/main/resources/templates/custStatusImport.xlsx