|
@@ -37,6 +37,10 @@ import com.qmth.teachcloud.common.enums.*;
|
|
|
import com.qmth.teachcloud.common.service.*;
|
|
|
import com.qmth.teachcloud.common.util.*;
|
|
|
import com.qmth.teachcloud.common.util.excel.ExcelError;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkPaper;
|
|
|
+import com.qmth.teachcloud.mark.entity.MarkStudent;
|
|
|
+import com.qmth.teachcloud.mark.service.MarkPaperService;
|
|
|
+import com.qmth.teachcloud.mark.service.MarkStudentService;
|
|
|
import org.apache.commons.codec.digest.DigestUtils;
|
|
|
import org.apache.commons.collections4.CollectionUtils;
|
|
|
import org.apache.commons.io.FileUtils;
|
|
@@ -65,6 +69,7 @@ import java.nio.charset.StandardCharsets;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.stream.Collectors;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
/**
|
|
|
* @Description: 任务处理逻辑impl
|
|
@@ -141,6 +146,10 @@ public class TaskLogicServiceImpl implements TaskLogicService {
|
|
|
FileUploadService fileUploadService;
|
|
|
@Resource
|
|
|
BasicExamStudentService basicExamStudentService;
|
|
|
+ @Resource
|
|
|
+ MarkPaperService markPaperService;
|
|
|
+ @Resource
|
|
|
+ MarkStudentService markStudentService;
|
|
|
|
|
|
/**
|
|
|
* 创建pdf前置条件
|
|
@@ -2076,14 +2085,18 @@ public class TaskLogicServiceImpl implements TaskLogicService {
|
|
|
|
|
|
SysUser requestUser = (SysUser) map.get(SystemConstant.USER);
|
|
|
InputStream inputStream = (InputStream) map.get("inputStream");
|
|
|
- Long semesterId = SystemConstant.convertIdToLong(String.valueOf(map.get("semesterId")));
|
|
|
Long examId = SystemConstant.convertIdToLong(String.valueOf(map.get("examId")));
|
|
|
Long schoolId = requestUser.getSchoolId();
|
|
|
+ BasicExam basicExam = basicExamService.getById(examId);
|
|
|
+ if (Objects.isNull(basicExam)){
|
|
|
+ throw ExceptionResultEnum.ERROR.exception("考试不存在");
|
|
|
+ }
|
|
|
+ Long semesterId = SystemConstant.convertIdToLong(basicExam.getSemesterId());
|
|
|
|
|
|
List<BasicExamStudent> dbData = basicExamStudentService.list(new QueryWrapper<BasicExamStudent>().lambda()
|
|
|
.select(BasicExamStudent::getId, BasicExamStudent::getExamId, BasicExamStudent::getCourseCode,
|
|
|
BasicExamStudent::getStudentCode).eq(BasicExamStudent::getSchoolId, schoolId)
|
|
|
- .eq(BasicExamStudent::getSemesterId, semesterId).eq(BasicExamStudent::getExamId, examId));
|
|
|
+ .eq(BasicExamStudent::getExamId, examId));
|
|
|
|
|
|
// 数据库中学生学号和id对应关系
|
|
|
Map<String, Long> studentCodeIdMap = dbData.stream().collect(Collectors.toMap(
|
|
@@ -2198,6 +2211,181 @@ public class TaskLogicServiceImpl implements TaskLogicService {
|
|
|
return map;
|
|
|
}
|
|
|
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> executeImportMarkStudentLogic(Map<String, Object> map) throws Exception {
|
|
|
+ SysUser requestUser = (SysUser) map.get(SystemConstant.USER);
|
|
|
+ InputStream inputStream = (InputStream) map.get("inputStream");
|
|
|
+ Long examId = SystemConstant.convertIdToLong(String.valueOf(map.get("examId")));
|
|
|
+ // 检验课程编号和课程名称对应
|
|
|
+ Map<String, String> courseCodeNameCheckMap = new HashMap<>();
|
|
|
+ // 检验学号在课程下唯一
|
|
|
+ Map<String, List<String>> checkStudentCodeMap = new HashMap<>();
|
|
|
+ // 检验同一个课程、试卷下的班级信息要么全填要么全不填
|
|
|
+ Map<String, Boolean> checkClazzMap = new HashMap<>();
|
|
|
+
|
|
|
+ List<MarkStudentImportDto> datasource = new ArrayList<>();
|
|
|
+ AtomicInteger successInteger = new AtomicInteger(0);
|
|
|
+ AtomicInteger exceptionInteger = new AtomicInteger(0);
|
|
|
+
|
|
|
+ ExcelUtil.excelReader(inputStream, Lists.newArrayList(MarkStudentImportDto.class),
|
|
|
+ (finalExcelList, finalColumnNameList, finalExcelErrorList) -> {
|
|
|
+
|
|
|
+ for (int i = 0; i < finalExcelList.size(); i++) {
|
|
|
+ LinkedMultiValueMap<Integer, Object> excelMap = finalExcelList.get(i);
|
|
|
+ List<Object> MarkStudentImportDtoList = excelMap.get(i);
|
|
|
+ // 无数据,跳过
|
|
|
+ if (CollectionUtils.isEmpty(MarkStudentImportDtoList)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ for (int y = 0; y < Objects.requireNonNull(MarkStudentImportDtoList).size(); y++) {
|
|
|
+ List<String> errorMsgList = new ArrayList<>();
|
|
|
+ // 行索引
|
|
|
+ MarkStudentImportDto markStudentImportDto = (MarkStudentImportDto) MarkStudentImportDtoList.get(
|
|
|
+ y);
|
|
|
+ String courseName = StringUtils.trimToNull(markStudentImportDto.getCourseName());
|
|
|
+ String courseCode = StringUtils.trimToNull(markStudentImportDto.getCourseCode());
|
|
|
+ String paperNumber = StringUtils.trimToNull(markStudentImportDto.getPaperNumber());
|
|
|
+ String studentName = StringUtils.trimToNull(markStudentImportDto.getStudentName());
|
|
|
+ String studentCode = StringUtils.trimToNull(markStudentImportDto.getStudentCode());
|
|
|
+ String college = StringUtils.trimToNull(markStudentImportDto.getCollege());
|
|
|
+ String major = StringUtils.trimToNull(markStudentImportDto.getMajor());
|
|
|
+ String clazz = StringUtils.trimToNull(markStudentImportDto.getClazz());
|
|
|
+ String examDate = StringUtils.trimToNull(markStudentImportDto.getExamDate());
|
|
|
+ String examTime = StringUtils.trimToNull(markStudentImportDto.getExamTime());
|
|
|
+ String examPlace = StringUtils.trimToNull(markStudentImportDto.getExamPlace());
|
|
|
+ String examRoom = StringUtils.trimToNull(markStudentImportDto.getExamRoom());
|
|
|
+
|
|
|
+ // 本行全部列为空,跳过
|
|
|
+ if (StringUtils.isAllBlank(courseName, courseCode, paperNumber, studentName, studentCode,
|
|
|
+ college, major, clazz, examDate, examTime, examDate, examPlace, examRoom)) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 课程编号和课程名称一致
|
|
|
+ if (courseCodeNameCheckMap.containsKey(courseCode)) {
|
|
|
+ if (!courseCodeNameCheckMap.get(courseCode).equals(courseName)) {
|
|
|
+ errorMsgList.add("同一个课程编号对应了多个课程名称");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ courseCodeNameCheckMap.put(courseCode, courseName);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 学号在课程下唯一
|
|
|
+ if (checkStudentCodeMap.containsKey(courseCode)) {
|
|
|
+ List<String> studentCodeList = checkStudentCodeMap.get(courseCode);
|
|
|
+ if (studentCodeList.contains(studentCode)) {
|
|
|
+ errorMsgList.add("学号重复(学号需要在课程下唯一)");
|
|
|
+ } else {
|
|
|
+ studentCodeList.add(studentCode);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ List<String> studentCodeList = new ArrayList<>();
|
|
|
+ studentCodeList.add(studentCode);
|
|
|
+ checkStudentCodeMap.put(courseCode, studentCodeList);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 同一个课程、试卷下的班级信息要么全填要么全不填
|
|
|
+ String clazzCheckKey = courseCode + SystemConstant.HYPHEN + paperNumber;
|
|
|
+ if (checkClazzMap.containsKey(clazzCheckKey)) {
|
|
|
+ Boolean hasData = checkClazzMap.get(clazzCheckKey);
|
|
|
+ if (SystemConstant.strNotNull(clazz) != hasData) {
|
|
|
+ errorMsgList.add("班级信息异常(同一个课程、试卷下的班级信息要么全填要么全不填)");
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ checkClazzMap.put(clazzCheckKey, SystemConstant.strNotNull(clazz));
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (SystemConstant.strNotNull(examDate) && SystemConstant.strNotNull(examTime)) {
|
|
|
+ ConvertUtil.analyzeStartAndEndTime(examDate, examTime);
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ errorMsgList.add(e.getMessage());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isNotEmpty(errorMsgList)) {
|
|
|
+ markStudentImportDto.setErrorMsg(String.join(";", errorMsgList));
|
|
|
+ exceptionInteger.getAndIncrement();
|
|
|
+ } else {
|
|
|
+ successInteger.getAndIncrement();
|
|
|
+ }
|
|
|
+ datasource.add(markStudentImportDto);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (datasource.stream().anyMatch(e -> SystemConstant.strNotNull(e.getErrorMsg()))) {
|
|
|
+ map.put(SystemConstant.ERROR_DATA_LIST, datasource);
|
|
|
+ } else {
|
|
|
+ map.put(SystemConstant.DATASOURCE, datasource);
|
|
|
+ }
|
|
|
+ map.put(SystemConstant.DATA_COUNT, datasource.size());
|
|
|
+ map.put(SystemConstant.SUCCESS_DATA_COUNT, successInteger.get());
|
|
|
+ map.put(SystemConstant.ERROR_DATA_COUNT, exceptionInteger.get());
|
|
|
+ return finalExcelList;
|
|
|
+ }, 2);
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public void saveMarkStudent(Long examId, List<MarkStudentImportDto> markStudentImportDtoList) {
|
|
|
+ SysUser requestUser = (SysUser) ServletUtil.getRequestUser();
|
|
|
+ Long requestUserId = requestUser.getId();
|
|
|
+ final String paperType = "A";
|
|
|
+
|
|
|
+ markPaperService.remove(new QueryWrapper<MarkPaper>().lambda().eq(MarkPaper::getExamId, examId));
|
|
|
+ markStudentService.remove(new QueryWrapper<MarkStudent>().lambda().eq(MarkStudent::getExamId, examId));
|
|
|
+
|
|
|
+ List<Map<String, String>> paperInfo = markStudentImportDtoList.stream().flatMap(e -> {
|
|
|
+ Map<String, String> map = new HashMap<>();
|
|
|
+ map.put("courseCode", e.getCourseCode());
|
|
|
+ map.put("courseName", e.getCourseName());
|
|
|
+ map.put("paperNumber", e.getPaperNumber());
|
|
|
+ return Stream.of(map);
|
|
|
+ }).distinct().collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 新增mark_paper信息
|
|
|
+ for (Map<String, String> paperMap : paperInfo) {
|
|
|
+ String courseCode = paperMap.get("courseCode");
|
|
|
+ String courseName = paperMap.get("courseName");
|
|
|
+ String paperNumber = paperMap.get("paperNumber");
|
|
|
+
|
|
|
+ MarkPaper markPaper = new MarkPaper(examId, courseCode, courseName, paperNumber, null, requestUserId,
|
|
|
+ paperType);
|
|
|
+ markPaperService.save(markPaper);
|
|
|
+ }
|
|
|
+ // 新增mark_student信息
|
|
|
+ Map<String, Map<String, Object>> examTimeMap = new HashMap<>();
|
|
|
+ List<MarkStudent> markStudentList = markStudentImportDtoList.stream().flatMap(e -> {
|
|
|
+ String examDate = e.getExamDate();
|
|
|
+ String examTime = e.getExamTime();
|
|
|
+ Long examStartTime = null;
|
|
|
+ Long examEndTime = null;
|
|
|
+ if (SystemConstant.strNotNull(examDate) && SystemConstant.strNotNull(examTime)) {
|
|
|
+ String key = examDate + SystemConstant.HYPHEN + examTime;
|
|
|
+ Map<String, Object> timeMap = new HashMap<>();
|
|
|
+ if (examTimeMap.containsKey(key)) {
|
|
|
+ timeMap = examTimeMap.get(key);
|
|
|
+ } else {
|
|
|
+ timeMap = ConvertUtil.analyzeStartAndEndTime(examDate, examTime);
|
|
|
+ examTimeMap.put(key, timeMap);
|
|
|
+ }
|
|
|
+ examStartTime = SystemConstant.convertIdToLong(String.valueOf(timeMap.get("startTime")));
|
|
|
+ examEndTime = SystemConstant.convertIdToLong(String.valueOf(timeMap.get("endTime")));
|
|
|
+ }
|
|
|
+ MarkStudent markStudent = new MarkStudent(null, examId, e.getCourseCode(), e.getCourseName(), e.getPaperNumber(),
|
|
|
+ null, paperType, e.getStudentCode(), e.getStudentName(), null, e.getExamPlace(), e.getExamRoom(), e.getCollege(),
|
|
|
+ e.getMajor(), e.getClazz(), examStartTime, examEndTime, requestUserId);
|
|
|
+ return Stream.of(markStudent);
|
|
|
+ }).collect(Collectors.toList());
|
|
|
+
|
|
|
+ if (CollectionUtils.isNotEmpty(markStudentList)) {
|
|
|
+ markStudentService.saveBatch(markStudentList);
|
|
|
+ // 更新mark_paper表student_count字段
|
|
|
+ paperInfo.stream().map(e -> e.get("paperNumber")).forEach(e -> markPaperService.updateStudentCountByExamIdAndPaperNumberAndPaperType(examId, e, paperType));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 验证机构是否存在
|
|
|
*
|