|
@@ -1,13 +1,22 @@
|
|
|
package cn.iselab.mooctest.site.web.logic.impl;
|
|
|
+import java.awt.Transparency;
|
|
|
+import java.util.Queue;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.CompletableFuture;
|
|
|
+import java.io.IOException;
|
|
|
|
|
|
import cn.iselab.mooctest.site.common.event.AddTask2CompetitionEvent;
|
|
|
import cn.iselab.mooctest.site.common.event.EnterCompetitionEvent;
|
|
|
import cn.iselab.mooctest.site.common.event.EventUtil;
|
|
|
import cn.iselab.mooctest.site.common.event.QuitCompetitionEvent;
|
|
|
+import cn.iselab.mooctest.site.dao.Competition2ExamDao;
|
|
|
import cn.iselab.mooctest.site.dao.ConfigDao;
|
|
|
import cn.iselab.mooctest.site.dao.ContestMentorSubmitRecordDao;
|
|
|
+import cn.iselab.mooctest.site.dao.QualificationDao;
|
|
|
+import cn.iselab.mooctest.site.data.UserDTOForMT;
|
|
|
import cn.iselab.mooctest.site.models.*;
|
|
|
import cn.iselab.mooctest.site.service.CompetitionService;
|
|
|
+import cn.iselab.mooctest.site.service.ExamService;
|
|
|
import cn.iselab.mooctest.site.service.GroupService;
|
|
|
import cn.iselab.mooctest.site.service.UserService;
|
|
|
import cn.iselab.mooctest.site.web.data.*;
|
|
@@ -16,15 +25,18 @@ import cn.iselab.mooctest.site.web.exception.HttpBadRequestException;
|
|
|
import cn.iselab.mooctest.site.web.logic.CompetitionLogic;
|
|
|
import cn.iselab.mooctest.site.web.logic.ExamLogic;
|
|
|
import cn.iselab.mooctest.site.util.data.Converter;
|
|
|
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.data.domain.Page;
|
|
|
import org.springframework.data.domain.Pageable;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
-import java.util.Iterator;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import javax.management.Query;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
/**
|
|
@@ -244,6 +256,177 @@ public class CompetitionLogicImpl implements CompetitionLogic {
|
|
|
competitionService.createOrUpdateQualification(qualification);
|
|
|
}
|
|
|
}
|
|
|
+ private Logger LOG = LoggerFactory.getLogger(getClass());
|
|
|
+ @Autowired
|
|
|
+ QualificationDao qualificationDao;
|
|
|
+ @Override
|
|
|
+ public void removeQualification4Task(QualificationRule qualificationRule) {
|
|
|
+ if (null != qualificationRule.getUserIds() && qualificationRule.getUserIds().size() > 0){
|
|
|
+ for(Long userId: qualificationRule.getUserIds()) {
|
|
|
+ Qualification qualification = competitionService.getQualification(qualificationRule.getCompetitionId(), userId);
|
|
|
+ //
|
|
|
+ if (qualification != null && !qualification.getStatus().equals(qualificationRule.getIndex())){
|
|
|
+ qualificationDao.delete(qualification);
|
|
|
+ }
|
|
|
+ qualification = competitionService.getQualificationByCompetitionAndUserIdAndStatus(qualificationRule.getCompetitionId(),userId,qualificationRule.getIndex());
|
|
|
+ if(qualification != null) {
|
|
|
+ competitionService.removeOrUpdateQualification(qualification);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果已经点了确认晋级,则还需要从班级中删除
|
|
|
+ Competition2Exam competition2Exam = competitionService.getCompetition2TaskbyCompetitionIdAndIndex(qualificationRule.getCompetitionId(), qualificationRule.getIndex());
|
|
|
+ Competition2Exam nextCompetition2Exam = competitionService.getCompetition2TaskbyCompetitionIdAndIndex(qualificationRule.getCompetitionId(), competition2Exam.getNextIndex());
|
|
|
+ if (null != nextCompetition2Exam){
|
|
|
+ //如果下一场比赛已添加
|
|
|
+ List<Long> groupList = examLogic.getExamById(nextCompetition2Exam.getExamId()).getGroupIds();
|
|
|
+ //如果已经为下一场比赛创建班级
|
|
|
+ if (null != groupList && groupList.size() > 0){
|
|
|
+ Long groupId = groupList.get(0);
|
|
|
+ //如果该选手已在班级中则删除
|
|
|
+ if (groupService.isUserInGroup(qualificationRule.getUserIds().get(0),groupId)){
|
|
|
+ groupService.deleteUserFromGroup(qualificationRule.getUserIds().get(0),groupId);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过Excel表格批量导入出线学生 预插入
|
|
|
+ * @param qualificationRule 大赛信息等,此处不存放学生信息
|
|
|
+ * @param file excel文件
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<QualificationVO> batchExcelAddQualificationPre(QualificationRule qualificationRule, MultipartFile file) throws Exception{
|
|
|
+ List<QualificationVO> qualificationVOList = transferExcel2Qualifications(file);
|
|
|
+ List<QualificationVO> retQualificationVOList = new LinkedList<>();
|
|
|
+ HashSet<String> set = new HashSet<>();
|
|
|
+ for (QualificationVO qualificationVO : qualificationVOList){
|
|
|
+ if (set.contains(qualificationVO.getUserEmail())){
|
|
|
+ continue;
|
|
|
+ }else{
|
|
|
+ set.add(qualificationVO.getUserEmail());
|
|
|
+ }
|
|
|
+ UserDTOForMT user = userService.getUserByEmail(qualificationVO.getUserEmail());
|
|
|
+ if (null == user){
|
|
|
+ throw new Exception("未找到邮箱为:"+qualificationVO.getUserName()+",姓名为:"+qualificationVO.getUserName()+" 的用户");
|
|
|
+ }else{
|
|
|
+ //构建返回列表
|
|
|
+ qualificationVO.setUserTelephone(user.getMobile());
|
|
|
+ qualificationVO.setUserId(user.getId());
|
|
|
+ qualificationVO.setCompetitionId(qualificationRule.getCompetitionId());
|
|
|
+ qualificationVO.setStatus(qualificationRule.getIndex());
|
|
|
+ qualificationVO.setNextRound(true);
|
|
|
+ retQualificationVOList.add(qualificationVO);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ LOG.info("file:"+transferExcel2Qualifications(file));
|
|
|
+ return qualificationVOList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 通过Excel表格批量导入出线学生 确认插入
|
|
|
+ * @param qualificationVOList 学生信息
|
|
|
+ * @return 学生信息
|
|
|
+ * @throws Exception 异常信息
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<QualificationVO> batchExcelAddQualificationConfirm(List<QualificationVO> qualificationVOList) throws Exception {
|
|
|
+ List<Qualification> qualificationList = new LinkedList<>();
|
|
|
+ HashSet<String> set = new HashSet<>();
|
|
|
+ for (QualificationVO qualificationVO : qualificationVOList){
|
|
|
+ if (set.contains(qualificationVO.getUserEmail())){
|
|
|
+ continue;
|
|
|
+ }else{
|
|
|
+ set.add(qualificationVO.getUserEmail());
|
|
|
+ }
|
|
|
+ UserDTOForMT user = userService.getUserByEmail(qualificationVO.getUserEmail());
|
|
|
+ if (null == user){
|
|
|
+ throw new Exception("未找到邮箱为:"+qualificationVO.getUserName()+",姓名为:"+qualificationVO.getUserName()+" 的用户");
|
|
|
+ }else{
|
|
|
+ //如果已有qualification则update
|
|
|
+ Qualification qualification = competitionService.getQualificationByCompetitionAndUserIdAndStatus(qualificationVO.getCompetitionId(),qualificationVO.getUserId(),qualificationVO.getStatus());
|
|
|
+ if (null != qualification){
|
|
|
+ qualification.setNextRound(true);
|
|
|
+ }else{
|
|
|
+ //如果没有qualification则new
|
|
|
+ qualification = new Qualification();
|
|
|
+ qualification.setCompetitionId(qualificationVO.getCompetitionId());
|
|
|
+ qualification.setUserId(user.getId());
|
|
|
+ qualification.setNextRound(true);
|
|
|
+ qualification.setStatus(qualificationVO.getStatus());
|
|
|
+ }
|
|
|
+ qualificationList.add(qualification);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ qualificationDao.save(qualificationList);
|
|
|
+ return qualificationVOList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 从excel表格中读取选手信息
|
|
|
+ * @param file excel文件
|
|
|
+ * @return 选手信息列表
|
|
|
+ */
|
|
|
+ private List<QualificationVO> transferExcel2Qualifications(MultipartFile file) throws Exception {
|
|
|
+ List<String> logList = new ArrayList<>();
|
|
|
+ List<QualificationVO> qualifications = new ArrayList<>();
|
|
|
+ Workbook workbook = null;
|
|
|
+ try {
|
|
|
+ if (file.getOriginalFilename().endsWith("xlsx")) {
|
|
|
+ workbook = new XSSFWorkbook(file.getInputStream());
|
|
|
+ } else if(file.getOriginalFilename().endsWith("xls")) {
|
|
|
+ workbook = new HSSFWorkbook(file.getInputStream());
|
|
|
+ } else {
|
|
|
+ throw new Exception("不是合法的Excel文件");
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ throw new Exception("Excel读取出错,无法生成workbook");
|
|
|
+ }
|
|
|
+ Sheet sheet = workbook.getSheetAt(0);
|
|
|
+ if(sheet == null) {
|
|
|
+ throw new Exception("找不到标签页");
|
|
|
+ }
|
|
|
+ if(sheet.getPhysicalNumberOfRows() < 2) {
|
|
|
+ throw new Exception("数据内容为空,请重新编辑");
|
|
|
+ }
|
|
|
+ Row keyRow = sheet.getRow(0);
|
|
|
+ int cellCount = keyRow.getPhysicalNumberOfCells();
|
|
|
+ for (int i = 1; i < sheet.getPhysicalNumberOfRows(); i++ ){
|
|
|
+ QualificationVO qualificationVO = new QualificationVO();
|
|
|
+ Row row = sheet.getRow(i);
|
|
|
+ if (row == null){
|
|
|
+ logList.add("表中存在错误的单元格,请把与内容无关的单元格置空");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ for (int j = 0; j < cellCount; j++){
|
|
|
+ Cell cell = row.getCell(j);
|
|
|
+ if (cell == null ) {
|
|
|
+ logList.add("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "单元格为空");
|
|
|
+ //log.error("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "单元格为空");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ cell.setCellType(CellType.STRING);
|
|
|
+ //log.info("ROW: "+i+", COL: "+j +", DATA: "+ cell.getStringCellValue());
|
|
|
+ if (cell.getStringCellValue().trim().equals("")){
|
|
|
+ logList.add("错误 - 行: " + (i + 1) + "; 列: " + (j + 1) + "; 原因: " + "单元格为空");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ switch (j){
|
|
|
+ case 0:
|
|
|
+ qualificationVO.setUserEmail(cell.getStringCellValue().trim());
|
|
|
+ break;
|
|
|
+ case 1:
|
|
|
+ qualificationVO.setUserName(cell.getStringCellValue().trim());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ qualifications.add(qualificationVO);
|
|
|
+ LOG.info("quli:"+qualifications);
|
|
|
+ }
|
|
|
+ return qualifications;
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public List<QualificationVO> getAllQualification4Task(Long competitionId, Integer index) {
|