xiatian 1 an în urmă
părinte
comite
4c22651368

+ 0 - 12
src/main/java/cn/com/qmth/am/config/InitData.java

@@ -47,18 +47,6 @@ public class InitData implements CommandLineRunner {
 		if(!dataDir.exists()) {
 		if(!dataDir.exists()) {
 			dataDir.mkdir();
 			dataDir.mkdir();
 		}
 		}
-		File stuImpDir=new File(sysProperty.getDataDir()+"/student-import");
-		if(!stuImpDir.exists()) {
-			stuImpDir.mkdir();
-		}
-		File quesImpDir=new File(sysProperty.getDataDir()+"/question-import");
-		if(!quesImpDir.exists()) {
-			quesImpDir.mkdir();
-		}
-		File mscoreImpDir=new File(sysProperty.getDataDir()+"/score-import");
-		if(!mscoreImpDir.exists()) {
-			mscoreImpDir.mkdir();
-		}
 		resetTaskStatus();
 		resetTaskStatus();
 	}
 	}
 	
 	

+ 127 - 0
src/main/java/cn/com/qmth/am/controller/AdminController.java

@@ -0,0 +1,127 @@
+package cn.com.qmth.am.controller;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintWriter;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.io.FileUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import com.alibaba.fastjson.util.IOUtils;
+import com.qmth.boot.api.annotation.Aac;
+import com.qmth.boot.api.constant.ApiConstant;
+
+import cn.com.qmth.am.config.SysProperty;
+import cn.com.qmth.am.entity.QuestionEntity;
+import cn.com.qmth.am.enums.DataStatus;
+import cn.com.qmth.am.enums.ImportFileName;
+import cn.com.qmth.am.service.QuestionService;
+import cn.com.qmth.am.service.StudentScoreService;
+import cn.com.qmth.am.service.StudentService;
+import io.swagger.annotations.ApiOperation;
+
+@RestController
+@RequestMapping(ApiConstant.DEFAULT_URI_PREFIX + "/admin")
+@Aac(strict = false, auth = false)
+public class AdminController{
+	@Autowired
+	private QuestionService questionService;
+	@Autowired
+	private StudentService studentService;
+	@Autowired
+	private StudentScoreService studentScoreService;
+	@Autowired
+	private SysProperty sysProperty;
+    @ApiOperation(value = "进度详情")
+    @RequestMapping(value = "info", method = RequestMethod.GET)
+    public void info(HttpServletResponse response,@RequestParam Long examId) {
+    	StringBuilder sb=new StringBuilder();
+    	List<QuestionEntity> qs=questionService.findByExamId(examId);
+    	int qstotal=0;
+    	int qsCourse=0;
+    	if(CollectionUtils.isNotEmpty(qs)) {
+    		Set<String> cset=new HashSet<>();
+    		qstotal=qs.size();
+    		for(QuestionEntity q:qs) {
+    			cset.add(q.getSubjectCode());
+    		}
+    		qsCourse=cset.size();
+    	}
+    	sb.append("试卷科目总数:"+qsCourse+"\r\n");
+    	sb.append("试卷小题总数:"+qstotal+"\r\n");
+    	int total=studentService.countBy(examId,null);
+    	if(total==0) {
+    		sb.append("考生总数:0");
+    		returnJson(sb.toString(), response);
+    		return;
+    	}
+    	sb.append("考生总数:"+total+"\r\n");
+    	int suc=studentService.countBy(examId,DataStatus.SUCCESS);
+    	sb.append("考生处理成功总数:"+suc+"\r\n");
+    	int failed=studentService.countBy(examId,DataStatus.FAILED);
+    	sb.append("考生处理失败总数:"+failed+"\r\n");
+    	int qtotal=studentScoreService.countBy(examId,null);
+    	if(qtotal==0) {
+    		sb.append("试题总数:0");
+    		returnJson(sb.toString(), response);
+    		return;
+    	}
+    	sb.append("考生试题总数:"+qtotal+"\r\n");
+    	int qsuc=studentScoreService.countBy(examId,DataStatus.SUCCESS);
+    	sb.append("考生试题处理成功总数:"+qsuc+"\r\n");
+    	int qfailed=studentScoreService.countBy(examId,DataStatus.FAILED);
+    	sb.append("考生试题处理失败总数:"+qfailed+"\r\n");
+    	returnJson(sb.toString(), response);
+    }
+    
+    @ApiOperation(value = "上传导入文件")
+    @RequestMapping(value = "upload", method = RequestMethod.POST)
+    public String upload(@RequestParam MultipartFile file) {
+    	if(ImportFileName.getByName(file.getOriginalFilename())==null) {
+    		return "上传失败,文件名错误";
+    	}
+    	File old=new File(sysProperty.getDataDir()+"/"+file.getOriginalFilename());
+    	if(old.exists()) {
+    		return "上传失败,有正在处理的文件";
+    	}
+    	InputStream in=null;
+    	try {
+    		in=file.getInputStream();
+			FileUtils.copyInputStreamToFile(file.getInputStream(), old);
+		} catch (IOException e) {
+			return "上传失败,"+e.getMessage();
+		}finally {
+			if(in!=null) {
+				try {
+					in.close();
+				} catch (IOException e) {
+				}
+			}
+		}
+    	return "上传成功";
+    }
+    
+    private void returnJson(String body, HttpServletResponse response) {
+        response.setContentType("application/json;charset=utf-8");
+        PrintWriter writer = null;
+        try {
+            writer = response.getWriter();
+            writer.write(body);
+        } catch (IOException e) {
+        } finally {
+            IOUtils.close(writer);
+        }
+    }
+}

+ 30 - 0
src/main/java/cn/com/qmth/am/enums/ImportFileName.java

@@ -0,0 +1,30 @@
+package cn.com.qmth.am.enums;
+
+public enum ImportFileName {
+
+	QUESTION_IMPORT("question-import.xlsx"),
+	STUDENT_IMPORT("student-import.xlsx"),
+	SCORE_IMPORT("score-import.xlsx"),
+	;
+
+	private ImportFileName(String name){
+		this.name = name;
+	}
+
+	private String name;
+
+	public String getName() {
+		return name;
+	}
+
+	
+	public static ImportFileName getByName(String name) {
+    	for(ImportFileName r:ImportFileName.values()) {
+    		if(r.getName().equals(name)) {
+    			return r;
+    		}
+    	}
+    	return null;
+    }
+
+}

+ 3 - 0
src/main/java/cn/com/qmth/am/service/QuestionService.java

@@ -1,6 +1,7 @@
 package cn.com.qmth.am.service;
 package cn.com.qmth.am.service;
 
 
 import java.io.InputStream;
 import java.io.InputStream;
+import java.util.List;
 
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.baomidou.mybatisplus.extension.service.IService;
 
 
@@ -15,4 +16,6 @@ public interface QuestionService  extends IService<QuestionEntity> {
 	void importQuestion();
 	void importQuestion();
 
 
 	public ImportResult disposeFile(InputStream inputStream);
 	public ImportResult disposeFile(InputStream inputStream);
+
+	List<QuestionEntity> findByExamId(Long examId);
 }
 }

+ 3 - 0
src/main/java/cn/com/qmth/am/service/StudentScoreService.java

@@ -10,6 +10,7 @@ import cn.com.qmth.am.bean.StudentScoreImageDto;
 import cn.com.qmth.am.entity.QuestionEntity;
 import cn.com.qmth.am.entity.QuestionEntity;
 import cn.com.qmth.am.entity.StudentEntity;
 import cn.com.qmth.am.entity.StudentEntity;
 import cn.com.qmth.am.entity.StudentScoreEntity;
 import cn.com.qmth.am.entity.StudentScoreEntity;
+import cn.com.qmth.am.enums.DataStatus;
 
 
 /**
 /**
  * 类注释
  * 类注释
@@ -36,4 +37,6 @@ public interface StudentScoreService  extends IService<StudentScoreEntity> {
 
 
 	List<StudentScoreEntity> findAllToAiMarking();
 	List<StudentScoreEntity> findAllToAiMarking();
 
 
+	int countBy(Long examId, DataStatus success);
+
 }
 }

+ 2 - 0
src/main/java/cn/com/qmth/am/service/StudentService.java

@@ -34,5 +34,7 @@ public interface StudentService  extends IService<StudentEntity> {
 
 
 	void resetStatus();
 	void resetStatus();
 
 
+	int countBy(Long examId, DataStatus success);
+
 
 
 }
 }

+ 15 - 3
src/main/java/cn/com/qmth/am/service/impl/QuestionServiceImpl.java

@@ -5,6 +5,7 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.Comparator;
 import java.util.Comparator;
@@ -19,6 +20,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.annotation.Transactional;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.core.exception.StatusException;
 import com.qmth.boot.tools.excel.ExcelReader;
 import com.qmth.boot.tools.excel.ExcelReader;
@@ -30,6 +33,7 @@ import cn.com.qmth.am.bean.ImportResult;
 import cn.com.qmth.am.config.SysProperty;
 import cn.com.qmth.am.config.SysProperty;
 import cn.com.qmth.am.dao.QuestionDao;
 import cn.com.qmth.am.dao.QuestionDao;
 import cn.com.qmth.am.entity.QuestionEntity;
 import cn.com.qmth.am.entity.QuestionEntity;
+import cn.com.qmth.am.enums.ImportFileName;
 import cn.com.qmth.am.service.QuestionService;
 import cn.com.qmth.am.service.QuestionService;
 
 
 @Service
 @Service
@@ -43,13 +47,13 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 
 
 	@Override
 	@Override
 	public void importQuestion() {
 	public void importQuestion() {
-		File dir = new File(sysProperty.getDataDir() + "/question-import");
+		File dir = new File(sysProperty.getDataDir());
 		File[] fs = dir.listFiles();
 		File[] fs = dir.listFiles();
 		if (fs == null || fs.length == 0) {
 		if (fs == null || fs.length == 0) {
 			return;
 			return;
 		}
 		}
 		for (File file : fs) {
 		for (File file : fs) {
-			if (!file.isFile() || !file.getName().endsWith(".xlsx")) {
+			if (!file.isFile() || !file.getName().equals(ImportFileName.QUESTION_IMPORT.getName())) {
 				continue;
 				continue;
 			}
 			}
 			InputStream inputStream = null;
 			InputStream inputStream = null;
@@ -113,7 +117,7 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 				if (msgFile.exists()) {
 				if (msgFile.exists()) {
 					msgFile.delete();
 					msgFile.delete();
 				}
 				}
-				FileUtils.writeLines(msgFile, ret.getErrMsg(), "utf-8");
+				FileUtils.writeLines(msgFile, StandardCharsets.UTF_8.name(), ret.getErrMsg());
 			}
 			}
 		} catch (IOException e) {
 		} catch (IOException e) {
 			throw new StatusException("文件处理出错", e);
 			throw new StatusException("文件处理出错", e);
@@ -386,4 +390,12 @@ public class QuestionServiceImpl extends ServiceImpl<QuestionDao, QuestionEntity
 		ret.setCountInfo("新增数量:"+adds.size()+",更新数量:"+updates.size());
 		ret.setCountInfo("新增数量:"+adds.size()+",更新数量:"+updates.size());
 	}
 	}
 
 
+	@Override
+	public List<QuestionEntity> findByExamId(Long examId) {
+		QueryWrapper<QuestionEntity> wrapper = new QueryWrapper<>();
+		LambdaQueryWrapper<QuestionEntity> lw = wrapper.lambda();
+		lw.eq(QuestionEntity::getExamId, examId);
+		return this.list(wrapper);
+	}
+
 }
 }

+ 16 - 3
src/main/java/cn/com/qmth/am/service/impl/StudentScoreServiceImpl.java

@@ -5,6 +5,7 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.List;
 import java.util.List;
@@ -54,6 +55,7 @@ import cn.com.qmth.am.entity.StudentEntity;
 import cn.com.qmth.am.entity.StudentScoreEntity;
 import cn.com.qmth.am.entity.StudentScoreEntity;
 import cn.com.qmth.am.enums.DataStatus;
 import cn.com.qmth.am.enums.DataStatus;
 import cn.com.qmth.am.enums.DataType;
 import cn.com.qmth.am.enums.DataType;
+import cn.com.qmth.am.enums.ImportFileName;
 import cn.com.qmth.am.service.QuestionService;
 import cn.com.qmth.am.service.QuestionService;
 import cn.com.qmth.am.service.StudentScoreService;
 import cn.com.qmth.am.service.StudentScoreService;
 import cn.com.qmth.am.service.StudentService;
 import cn.com.qmth.am.service.StudentService;
@@ -85,13 +87,13 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
 
 
 	@Override
 	@Override
 	public void importScore() {
 	public void importScore() {
-		File dir = new File(sysProperty.getDataDir() + "/score-import");
+		File dir = new File(sysProperty.getDataDir());
 		File[] fs = dir.listFiles();
 		File[] fs = dir.listFiles();
 		if (fs == null || fs.length == 0) {
 		if (fs == null || fs.length == 0) {
 			return;
 			return;
 		}
 		}
 		for (File file : fs) {
 		for (File file : fs) {
-			if (!file.isFile() || !file.getName().endsWith(".xlsx")) {
+			if (!file.isFile() || !file.getName().equals(ImportFileName.SCORE_IMPORT.getName())) {
 				continue;
 				continue;
 			}
 			}
 			InputStream inputStream = null;
 			InputStream inputStream = null;
@@ -155,7 +157,7 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
 				if (msgFile.exists()) {
 				if (msgFile.exists()) {
 					msgFile.delete();
 					msgFile.delete();
 				}
 				}
-				FileUtils.writeLines(msgFile, ret.getErrMsg(), "utf-8");
+				FileUtils.writeLines(msgFile, StandardCharsets.UTF_8.name(), ret.getErrMsg());
 			}
 			}
 		} catch (IOException e) {
 		} catch (IOException e) {
 			throw new StatusException("文件处理出错", e);
 			throw new StatusException("文件处理出错", e);
@@ -627,4 +629,15 @@ public class StudentScoreServiceImpl extends ServiceImpl<StudentScoreDao, Studen
 		resetAnswerStatus();
 		resetAnswerStatus();
 		resetScoreStatus();
 		resetScoreStatus();
 	}
 	}
+	
+	@Override
+	public int countBy(Long examId, DataStatus status) {
+		QueryWrapper<StudentScoreEntity> wrapper = new QueryWrapper<>();
+		LambdaQueryWrapper<StudentScoreEntity> lw = wrapper.lambda();
+		if(status!=null) {
+			lw.eq(StudentScoreEntity::getScoreStatus, status);
+		}
+		lw.eq(StudentScoreEntity::getExamId, examId);
+		return this.count(wrapper);
+	}
 }
 }

+ 16 - 3
src/main/java/cn/com/qmth/am/service/impl/StudentServiceImpl.java

@@ -5,6 +5,7 @@ import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStream;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashMap;
@@ -40,6 +41,7 @@ import cn.com.qmth.am.entity.QuestionEntity;
 import cn.com.qmth.am.entity.StudentEntity;
 import cn.com.qmth.am.entity.StudentEntity;
 import cn.com.qmth.am.entity.StudentScoreEntity;
 import cn.com.qmth.am.entity.StudentScoreEntity;
 import cn.com.qmth.am.enums.DataStatus;
 import cn.com.qmth.am.enums.DataStatus;
+import cn.com.qmth.am.enums.ImportFileName;
 import cn.com.qmth.am.service.StudentScoreService;
 import cn.com.qmth.am.service.StudentScoreService;
 import cn.com.qmth.am.service.StudentService;
 import cn.com.qmth.am.service.StudentService;
 
 
@@ -56,13 +58,13 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
 
 
 	@Override
 	@Override
 	public void importStudent() {
 	public void importStudent() {
-		File dir = new File(sysProperty.getDataDir() + "/student-import");
+		File dir = new File(sysProperty.getDataDir());
 		File[] fs = dir.listFiles();
 		File[] fs = dir.listFiles();
 		if (fs == null || fs.length == 0) {
 		if (fs == null || fs.length == 0) {
 			return;
 			return;
 		}
 		}
 		for (File file : fs) {
 		for (File file : fs) {
-			if (!file.isFile() || !file.getName().endsWith(".xlsx")) {
+			if (!file.isFile() || !file.getName().equals(ImportFileName.STUDENT_IMPORT.getName())) {
 				continue;
 				continue;
 			}
 			}
 			InputStream inputStream = null;
 			InputStream inputStream = null;
@@ -126,7 +128,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
 				if(msgFile.exists()) {
 				if(msgFile.exists()) {
 					msgFile.delete();
 					msgFile.delete();
 				}
 				}
-				FileUtils.writeLines(msgFile, ret.getErrMsg(), "utf-8");
+				FileUtils.writeLines(msgFile, StandardCharsets.UTF_8.name(), ret.getErrMsg());
 			}
 			}
 		} catch (IOException e) {
 		} catch (IOException e) {
 			throw new StatusException("文件处理出错", e);
 			throw new StatusException("文件处理出错", e);
@@ -325,4 +327,15 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, StudentEntity> i
 		lw.eq(StudentEntity::getDataStatus, DataStatus.PROCESSING);
 		lw.eq(StudentEntity::getDataStatus, DataStatus.PROCESSING);
 		this.update(wrapper);
 		this.update(wrapper);
 	}
 	}
+
+	@Override
+	public int countBy(Long examId, DataStatus status) {
+		QueryWrapper<StudentEntity> wrapper = new QueryWrapper<>();
+		LambdaQueryWrapper<StudentEntity> lw = wrapper.lambda();
+		if(status!=null) {
+			lw.eq(StudentEntity::getDataStatus, status);
+		}
+		lw.eq(StudentEntity::getExamId, examId);
+		return this.count(wrapper);
+	}
 }
 }

+ 2 - 2
src/main/resources/application.properties

@@ -22,7 +22,7 @@ com.qmth.datasource.url=jdbc:mysql://${db.host}:${db.port}/${db.database}?useUni
 # ********** sys config **********
 # ********** sys config **********
 #
 #
 com.qmth.logging.root-level=info
 com.qmth.logging.root-level=info
-com.qmth.logging.file-path=/home/admin/project/ai-marking/log/ai-marking.log
+com.qmth.logging.file-path=../log/ai-marking.log
 
 
 
 
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
 spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
@@ -34,7 +34,7 @@ com.qmth.solar.app-version=@project.version@
 com.qmth.solar.access-key=7bbdc11570bc474dbf50e0d4a5dff328
 com.qmth.solar.access-key=7bbdc11570bc474dbf50e0d4a5dff328
 com.qmth.solar.access-secret=IOodRvbp2LspJTHOScgB7Yx8MRloMpyl
 com.qmth.solar.access-secret=IOodRvbp2LspJTHOScgB7Yx8MRloMpyl
 
 
-am.image-server=https://file.markingcloud.com/
 am.data-type=MARKING_CLOUD
 am.data-type=MARKING_CLOUD
+am.image-server=https://file.markingcloud.com/
 am.data-dir=../data
 am.data-dir=../data
 ##################################setting##########################################
 ##################################setting##########################################