wangwei пре 7 година
родитељ
комит
5c5d9fec0f

+ 11 - 9
examcloud-core-examwork-api-provider/src/main/java/cn/com/qmth/examcloud/core/examwork/api/controller/ExamStudentController.java

@@ -42,7 +42,6 @@ import com.google.common.collect.Lists;
 import cn.com.qmth.examcloud.common.dto.core.Course;
 import cn.com.qmth.examcloud.common.dto.examwork.CommonExamStudent;
 import cn.com.qmth.examcloud.commons.base.util.ErrorMsg;
-import cn.com.qmth.examcloud.commons.base.util.excel.ExcelError;
 import cn.com.qmth.examcloud.commons.web.helpers.page.PageInfo;
 import cn.com.qmth.examcloud.commons.web.support.ControllerSupport;
 import cn.com.qmth.examcloud.core.basic.api.StudentCloudService;
@@ -57,6 +56,7 @@ import cn.com.qmth.examcloud.core.examwork.dao.bean.ExamStudentDTO;
 import cn.com.qmth.examcloud.core.examwork.dao.bean.OrgExamInfoDTO;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStudent;
 import cn.com.qmth.examcloud.core.examwork.service.ExamStudentImportService;
+import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentImportResult;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentInfo;
 import cn.com.qmth.examcloud.core.examwork.service.impl.ExamStudentServiceImpl;
 import io.swagger.annotations.ApiOperation;
@@ -164,8 +164,8 @@ public class ExamStudentController extends ControllerSupport {
 				predicates.add(cb.like(root.get("infoCollector"),
 						toSqlSearchPattern(examCriteria.getInfoCollector())));
 			}
-			if(examCriteria.getFinished()!=null){
-				predicates.add(cb.equal(root.get("finished"),examCriteria.getFinished()));
+			if (examCriteria.getFinished() != null) {
+				predicates.add(cb.equal(root.get("finished"), examCriteria.getFinished()));
 			}
 
 			return cb.and(predicates.toArray(new Predicate[predicates.size()]));
@@ -409,13 +409,13 @@ public class ExamStudentController extends ControllerSupport {
 	 */
 	@ApiOperation(value = "导入考试学生", notes = "导入")
 	@PostMapping("/import")
-	public List<ExcelError> importExamStudent(@RequestParam Long examId,
+	public ExamStudentImportResult importExamStudent(@RequestParam Long examId,
 			@RequestParam CommonsMultipartFile file) throws Exception {
 
 		DiskFileItem item = (DiskFileItem) file.getFileItem();
-		examStudentImportService.importExamStudent(item.getStoreLocation(),
-				file.getOriginalFilename(), getRootOrgId(), examId);
-		return null;
+		ExamStudentImportResult result = examStudentImportService.importExamStudent(
+				item.getStoreLocation(), file.getOriginalFilename(), getRootOrgId(), examId);
+		return result;
 	}
 
 	@ApiOperation(value = "下载导入模板", notes = "下载导入模板")
@@ -518,11 +518,13 @@ public class ExamStudentController extends ControllerSupport {
 	@GetMapping("/findOrgExamInfos")
 	public ResponseEntity<Object> findOrgExamInfos(String examId, Long orgId) {
 		try {
-			List<OrgExamInfoDTO> orgExamInfoDTOs = examStudentService.findOrgExamInfos(examId,orgId);
+			List<OrgExamInfoDTO> orgExamInfoDTOs = examStudentService.findOrgExamInfos(examId,
+					orgId);
 			return new ResponseEntity<Object>(orgExamInfoDTOs, HttpStatus.OK);
 		} catch (Exception e) {
 			e.printStackTrace();
-			return new ResponseEntity(new ErrorMsg(e.getMessage()),HttpStatus.INTERNAL_SERVER_ERROR);
+			return new ResponseEntity(new ErrorMsg(e.getMessage()),
+					HttpStatus.INTERNAL_SERVER_ERROR);
 		}
 	}
 

+ 6 - 0
examcloud-core-examwork-dao/src/main/java/cn/com/qmth/examcloud/core/examwork/dao/ExamStudentTempRepo.java

@@ -1,7 +1,10 @@
 package cn.com.qmth.examcloud.core.examwork.dao;
 
+import java.util.List;
+
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
 import org.springframework.data.jpa.repository.query.Procedure;
 import org.springframework.data.repository.query.Param;
 import org.springframework.data.repository.query.QueryByExampleExecutor;
@@ -26,4 +29,7 @@ public interface ExamStudentTempRepo
 
 	void deleteByBatchId(Long batchId);
 
+	@Query("select s from ExamStudentTempEntity s where s.batchId=:batchId and (s.orgId is null or s.courseId is null) order by s.lineNum")
+	List<ExamStudentTempEntity> findError(@Param("batchId") Long batchId);
+
 }

+ 13 - 0
examcloud-core-examwork-dao/src/main/java/cn/com/qmth/examcloud/core/examwork/dao/entity/ExamStudentTempEntity.java

@@ -132,6 +132,11 @@ public class ExamStudentTempEntity extends JpaEntity {
 	 */
 	private String phone;
 
+	/**
+	 * excel行号
+	 */
+	private Long lineNum;
+
 	public Long getId() {
 		return id;
 	}
@@ -308,4 +313,12 @@ public class ExamStudentTempEntity extends JpaEntity {
 		this.phone = phone;
 	}
 
+	public Long getLineNum() {
+		return lineNum;
+	}
+
+	public void setLineNum(Long lineNum) {
+		this.lineNum = lineNum;
+	}
+
 }

+ 4 - 1
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/ExamStudentImportService.java

@@ -2,6 +2,8 @@ package cn.com.qmth.examcloud.core.examwork.service;
 
 import java.io.File;
 
+import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentImportResult;
+
 /**
  * 类注释
  *
@@ -11,6 +13,7 @@ import java.io.File;
  */
 public interface ExamStudentImportService {
 
-	void importExamStudent(File file, String fileName, Long rootOrgId, Long examId);
+	ExamStudentImportResult importExamStudent(File file, String fileName, Long rootOrgId,
+			Long examId);
 
 }

+ 41 - 0
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/bean/ExamStudentImportResult.java

@@ -0,0 +1,41 @@
+package cn.com.qmth.examcloud.core.examwork.service.bean;
+
+import java.util.List;
+
+import cn.com.qmth.examcloud.commons.web.cloud.api.JsonSerializable;
+
+public class ExamStudentImportResult implements JsonSerializable {
+
+	private static final long serialVersionUID = 4154957784355466807L;
+
+	private Integer successNum;
+
+	private Integer failNum;
+
+	private List<String> failRecords;
+
+	public Integer getSuccessNum() {
+		return successNum;
+	}
+
+	public void setSuccessNum(Integer successNum) {
+		this.successNum = successNum;
+	}
+
+	public Integer getFailNum() {
+		return failNum;
+	}
+
+	public void setFailNum(Integer failNum) {
+		this.failNum = failNum;
+	}
+
+	public List<String> getFailRecords() {
+		return failRecords;
+	}
+
+	public void setFailRecords(List<String> failRecords) {
+		this.failRecords = failRecords;
+	}
+
+}

+ 110 - 1
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/impl/ExamStudentImportServiceImpl.java

@@ -32,6 +32,7 @@ import cn.com.qmth.examcloud.core.basic.api.response.InsertOrUpdateStudentResp;
 import cn.com.qmth.examcloud.core.examwork.dao.ExamStudentTempRepo;
 import cn.com.qmth.examcloud.core.examwork.dao.entity.ExamStudentTempEntity;
 import cn.com.qmth.examcloud.core.examwork.service.ExamStudentImportService;
+import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentImportResult;
 import cn.com.qmth.examcloud.core.examwork.service.bean.ExamStudentInfo;
 
 /**
@@ -62,7 +63,8 @@ public class ExamStudentImportServiceImpl implements ExamStudentImportService {
 	private EntityManagerFactory entityManagerFactory;
 
 	@Override
-	public void importExamStudent(File file, String fileName, Long rootOrgId, Long examId) {
+	public ExamStudentImportResult importExamStudent(File file, String fileName, Long rootOrgId,
+			Long examId) {
 		Workbook workBook = ExcelParser.getWorkBook(file, fileName);
 
 		Sheet sheet = workBook.getSheetAt(0);
@@ -77,6 +79,10 @@ public class ExamStudentImportServiceImpl implements ExamStudentImportService {
 		List<ExamStudentTempEntity> list = Lists.newArrayList();
 		long batchId = System.currentTimeMillis();
 
+		ExamStudentImportResult result = new ExamStudentImportResult();
+		List<String> failRecords = Lists.newArrayList();
+		result.setFailRecords(failRecords);
+
 		for (int i = 0; i < lineList.size(); i++) {
 			String[] line = lineList.get(i);
 			if (0 == i) {
@@ -85,6 +91,7 @@ public class ExamStudentImportServiceImpl implements ExamStudentImportService {
 			}
 
 			ExamStudentTempEntity es = new ExamStudentTempEntity();
+			es.setLineNum((long) 1 + i);
 			es.setRootOrgId(rootOrgId);
 			es.setExamId(examId);
 			es.setBatchId(batchId);
@@ -102,6 +109,10 @@ public class ExamStudentImportServiceImpl implements ExamStudentImportService {
 			es.setPhone(trimAndNullIfBlank(line[11]));
 			es.setGrade(trimAndNullIfBlank(line[12]));
 
+			if (hasError(failRecords, es)) {
+				continue;
+			}
+
 			list.add(es);
 			if (0 == i % 100) {
 				examStudentTempRepo.save(list);
@@ -117,6 +128,104 @@ public class ExamStudentImportServiceImpl implements ExamStudentImportService {
 		saveExamStudents(batchId);
 
 		delete(batchId);
+
+		findError(failRecords, batchId);
+
+		result.setFailNum(failRecords.size());
+		return result;
+	}
+
+	private void findError(List<String> failRecords, long batchId) {
+		EntityManager em = entityManagerFactory.createEntityManager();
+		Query query = em.createQuery("select s from ExamStudentTempEntity s where "
+				+ "s.batchId=:batchId and (s.orgId is null or s.courseId is null) order by s.lineNum",
+				ExamStudentTempEntity.class);
+		query.setHint("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);
+		query.setParameter("batchId", batchId);
+
+		@SuppressWarnings("unchecked")
+		List<ExamStudentTempEntity> errorList = query.getResultList();
+
+		for (ExamStudentTempEntity cur : errorList) {
+			boolean hasError = false;
+			StringBuilder sb = new StringBuilder();
+			sb.append("第" + cur.getLineNum() + "行");
+			if (null == cur.getOrgId()) {
+				sb.append("  学习中心代码错误");
+				hasError = true;
+			}
+			if (null == cur.getCourseId()) {
+				sb.append("  课程代码错误");
+				hasError = true;
+			}
+
+			if (hasError) {
+				failRecords.add(sb.toString());
+			}
+		}
+
+	}
+
+	public boolean hasError(List<String> failRecords, ExamStudentTempEntity entity) {
+		boolean hasError = false;
+		StringBuilder sb = new StringBuilder();
+		sb.append("第" + entity.getLineNum() + "行");
+
+		String name = entity.getName();
+		if (StringUtils.isBlank(name)) {
+			sb.append("  姓名不能为空");
+			hasError = true;
+		} else if (20 < name.length()) {
+			sb.append("  姓名不能超过20个字符");
+			hasError = true;
+		}
+
+		String identityNumber = entity.getIdentityNumber();
+		if (StringUtils.isBlank(identityNumber)) {
+			sb.append("  身份证号不能为空");
+			hasError = true;
+		} else if (identityNumber.length() < 6) {
+			sb.append("  身份证号至少为6个字符");
+			hasError = true;
+		} else if (identityNumber.length() > 30) {
+			sb.append("  身份证号不能超过30个字符");
+			hasError = true;
+		}
+
+		String studentCode = entity.getStudentCode();
+		if (StringUtils.isNotBlank(studentCode)) {
+			if (studentCode.length() < 6) {
+				sb.append("  学号至少为6个字符");
+				hasError = true;
+			} else if (studentCode.length() > 30) {
+				sb.append("  学号不能超过30个字符");
+				hasError = true;
+			}
+		}
+
+		String courseCode = entity.getCourseCode();
+		if (StringUtils.isBlank(courseCode)) {
+			sb.append("  课程代码不能为空");
+			hasError = true;
+		} else if (courseCode.length() > 30) {
+			sb.append("  课程代码不能超过30个字符");
+			hasError = true;
+		}
+
+		String orgCode = entity.getOrgCode();
+		if (StringUtils.isBlank(orgCode)) {
+			sb.append("  学习中心代码不能为空");
+			hasError = true;
+		} else if (orgCode.length() > 30) {
+			sb.append("  学习中心代码不能超过30个字符");
+			hasError = true;
+		}
+
+		if (hasError) {
+			failRecords.add(sb.toString());
+		}
+
+		return hasError;
 	}
 
 	private void delete(Long batchId) {

+ 2 - 5
examcloud-core-examwork-service/src/main/java/cn/com/qmth/examcloud/core/examwork/service/impl/ExamStudentServiceImpl.java

@@ -755,14 +755,12 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 			return null;
 		}
 		StringBuilder sql = new StringBuilder();
-		sql.append("select t.org_id orgid," 
-				+ " t.org_code orgcode," 
-				+ " t.org_name orgname,"
+		sql.append("select t.org_id orgid," + " t.org_code orgcode," + " t.org_name orgname,"
 				+ " count(t.id) allNum,"
 				+ " sum(case when t.finished = 1 then 1 else  0 end) completedNum "
 				+ " from ecs_exam_student  t" + " where t.exam_id = ?");
 		if (orgId != null) {
-			sql.append(" and t.org_id = "+orgId);
+			sql.append(" and t.org_id = " + orgId);
 		}
 		sql.append(" group by t.org_id, t.org_name order by t.org_id");
 		return jdbcTemplate.query(sql.toString(), new Object[]{examId},
@@ -1003,7 +1001,6 @@ public class ExamStudentServiceImpl implements ExamStudentService {
 		examStudent.setSpecialtyName(examStudentInfo.getSpecialtyName());
 		examStudent.setExamSite(examStudentInfo.getExamSite());
 
-		System.out.println(examStudent.getCourseLevel());
 		ExamStudent saved = examStudentRepo.save(examStudent);
 
 		ExamStudentInfo ret = new ExamStudentInfo();