|
@@ -0,0 +1,311 @@
|
|
|
+package cn.com.qmth.stmms.admin.exam;
|
|
|
+
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.HashSet;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Map.Entry;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+import javax.servlet.http.HttpServletRequest;
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
+
|
|
|
+import net.sf.json.JSONArray;
|
|
|
+import net.sf.json.JSONObject;
|
|
|
+
|
|
|
+import org.apache.commons.lang.StringUtils;
|
|
|
+import org.slf4j.Logger;
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Controller;
|
|
|
+import org.springframework.ui.Model;
|
|
|
+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.ResponseBody;
|
|
|
+import org.springframework.web.multipart.MultipartFile;
|
|
|
+import org.springframework.web.servlet.ModelAndView;
|
|
|
+import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
|
|
+
|
|
|
+import cn.com.qmth.stmms.admin.utils.PageUtil;
|
|
|
+import cn.com.qmth.stmms.admin.vo.InspectedStudentVO;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamStudent;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ImportQuery;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.SubjectiveScore;
|
|
|
+import cn.com.qmth.stmms.biz.exam.query.ExamStudentSearchQuery;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamStudentService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ImportQueryService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.SubjectiveScoreService;
|
|
|
+import cn.com.qmth.stmms.biz.file.service.FileService;
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkSpecialTagService;
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
|
|
|
+import cn.com.qmth.stmms.biz.utils.OriginTag;
|
|
|
+import cn.com.qmth.stmms.biz.utils.PictureTag;
|
|
|
+import cn.com.qmth.stmms.common.annotation.Logging;
|
|
|
+import cn.com.qmth.stmms.common.domain.WebUser;
|
|
|
+import cn.com.qmth.stmms.common.enums.ImportType;
|
|
|
+import cn.com.qmth.stmms.common.enums.LogType;
|
|
|
+import cn.com.qmth.stmms.common.utils.ExportExcel;
|
|
|
+import cn.com.qmth.stmms.common.utils.ImportExcel;
|
|
|
+import cn.com.qmth.stmms.common.utils.RequestUtils;
|
|
|
+
|
|
|
+import com.fasterxml.jackson.core.JsonProcessingException;
|
|
|
+import com.fasterxml.jackson.databind.ObjectMapper;
|
|
|
+import com.google.common.collect.Lists;
|
|
|
+
|
|
|
+@Controller("importQueryController")
|
|
|
+@RequestMapping("/admin/exam/inspected/import")
|
|
|
+public class ImportQueryController extends BaseExamController {
|
|
|
+
|
|
|
+ protected static Logger log = LoggerFactory.getLogger(ImportQueryController.class);
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ExamStudentService studentService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ImportQueryService queryService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private FileService fileService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MarkGroupService groupService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SubjectiveScoreService scoreService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ExamQuestionService questionService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MarkTrackService markTrackService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MarkSpecialTagService markSpecialTagService;
|
|
|
+
|
|
|
+ @RequestMapping("/list")
|
|
|
+ public String list(Model model, HttpServletRequest request, ExamStudentSearchQuery query) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ ImportQuery importQuery = queryService.findByExamIdAndUserIdAndType(examId, wu.getId(), ImportType.INSPECTED);
|
|
|
+ int inspectCount = 0;
|
|
|
+ if (importQuery != null) {
|
|
|
+ inspectCount = importQuery.getStudentCodeList().size() > 0 ? 0 : importQuery.getStudentIdList().size();
|
|
|
+ }
|
|
|
+ model.addAttribute("inspectCount", inspectCount);
|
|
|
+ if (inspectCount > 0) {
|
|
|
+ List<?> ids = PageUtil
|
|
|
+ .startPage(importQuery.getStudentIdList(), query.getPageNumber(), query.getPageSize());
|
|
|
+ List<ExamStudent> list = new ArrayList<ExamStudent>();
|
|
|
+ if (ids != null) {
|
|
|
+ for (Object id : ids) {
|
|
|
+ list.add(studentService.findById((int) id));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ query.setTotalPage(PageUtil.pageCount(importQuery.getStudentIdList(), query.getPageNumber(),
|
|
|
+ query.getPageSize()));
|
|
|
+ query.setTotalCount(inspectCount);
|
|
|
+ query.setResult(list);
|
|
|
+ }
|
|
|
+ model.addAttribute("query", query);
|
|
|
+ return "modules/exam/inspectedImportList";
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping(value = "/template")
|
|
|
+ public String template(HttpServletResponse response, RedirectAttributes redirectAttributes) {
|
|
|
+ try {
|
|
|
+ String fileName = "复核名单导入模板.xlsx";
|
|
|
+ List<InspectedStudentVO> list = Lists.newArrayList();
|
|
|
+ list.add(new InspectedStudentVO());
|
|
|
+ new ExportExcel("复核名单", InspectedStudentVO.class, 2).setDataList(list).write(response, fileName).dispose();
|
|
|
+ return null;
|
|
|
+ } catch (Exception e) {
|
|
|
+ addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return "redirect:/admin/exam/inspected";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Logging(menu = "导入复核名单", type = LogType.IMPORT_FILE)
|
|
|
+ @RequestMapping(method = RequestMethod.POST)
|
|
|
+ public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ queryService.deleteByExamIdAndUserIdAndType(examId, wu.getId(), ImportType.INSPECTED);
|
|
|
+ try {
|
|
|
+ int successNum = 0;
|
|
|
+ int failureNum = 0;
|
|
|
+ Set<Integer> successStudent = new HashSet<Integer>();
|
|
|
+ Set<String> failureStudent = new HashSet<String>();
|
|
|
+ ImportExcel ei = new ImportExcel(file, 1, 0);
|
|
|
+ List<InspectedStudentVO> list = ei.getDataList(InspectedStudentVO.class);
|
|
|
+ if (list.size() > 1000) {
|
|
|
+ addMessage(redirectAttributes, "导入考生失败!数据超过1000行");
|
|
|
+ return "redirect:/admin/exam/inspected";
|
|
|
+ }
|
|
|
+ for (InspectedStudentVO studentVO : list) {
|
|
|
+ if (StringUtils.isBlank(studentVO.getStudentCode())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ List<ExamStudent> studentList = studentService.findByExamIdAndStudentCode(examId,
|
|
|
+ studentVO.getStudentCode());
|
|
|
+ if (!studentList.isEmpty()) {
|
|
|
+ for (ExamStudent examStudent : studentList) {
|
|
|
+ successStudent.add(examStudent.getId());
|
|
|
+ }
|
|
|
+ successNum++;
|
|
|
+ } else {
|
|
|
+ failureStudent.add(studentVO.getStudentCode());
|
|
|
+ failureNum++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ImportQuery importQuery = new ImportQuery(examId, wu.getId(), ImportType.INSPECTED, successStudent,
|
|
|
+ failureStudent);
|
|
|
+ queryService.save(importQuery);
|
|
|
+ String message = "已成功导入 " + successNum + " 条,关联考生记录 " + successStudent.size() + " 条";
|
|
|
+ if (failureNum > 0) {
|
|
|
+ message = "失败 " + failureNum + " 条";
|
|
|
+ }
|
|
|
+ addMessage(redirectAttributes, message);
|
|
|
+ RequestUtils.setLog(request, message);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("Batch import inpectedStudent error!", e);
|
|
|
+ addMessage(redirectAttributes, "导入考生失败!失败信息:" + e.getMessage());
|
|
|
+ return "redirect:/admin/exam/inspected";
|
|
|
+ }
|
|
|
+ return "redirect:/admin/exam/inspected/import/list";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Logging(menu = "复核名单重置", type = LogType.UPDATE)
|
|
|
+ @RequestMapping(value = "/reset")
|
|
|
+ public String reset(HttpServletRequest request, Model model, RedirectAttributes redirectAttributes) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ queryService.deleteByExamIdAndUserIdAndType(examId, wu.getId(), ImportType.INSPECTED);
|
|
|
+ addMessage(redirectAttributes, "重置成功");
|
|
|
+ return "redirect:/admin/exam/inspected";
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping(value = "/export")
|
|
|
+ public String export(HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ try {
|
|
|
+ String fileName = "错误信息.xlsx";
|
|
|
+ List<InspectedStudentVO> list = Lists.newArrayList();
|
|
|
+ ImportQuery importQuery = queryService.findByExamIdAndUserIdAndType(examId, wu.getId(),
|
|
|
+ ImportType.INSPECTED);
|
|
|
+ for (String studentCode : importQuery.getStudentCodeList()) {
|
|
|
+ list.add(new InspectedStudentVO(studentCode));
|
|
|
+ }
|
|
|
+ new ExportExcel("错误信息", InspectedStudentVO.class, 2).setDataList(list).write(response, fileName).dispose();
|
|
|
+ return null;
|
|
|
+ } catch (Exception e) {
|
|
|
+ addMessage(redirectAttributes, "错误信息下载失败!失败信息:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return "redirect:/admin/exam/inspected/import/list";
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/start")
|
|
|
+ @ResponseBody
|
|
|
+ public ModelAndView start(HttpServletRequest request) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ WebUser wu = RequestUtils.getWebUser(request);
|
|
|
+ ImportQuery importQuery = queryService.findByExamIdAndUserIdAndType(examId, wu.getId(), ImportType.INSPECTED);
|
|
|
+ int inspectCount = 0;
|
|
|
+ if (importQuery != null) {
|
|
|
+ inspectCount = importQuery.getStudentCodeList().size() > 0 ? 0 : importQuery.getStudentIdList().size();
|
|
|
+ }
|
|
|
+ ModelAndView view = new ModelAndView("modules/exam/inspectedImport");
|
|
|
+ view.addObject("inspectCount", inspectCount);
|
|
|
+ view.addObject("fileServer", fileService.getFileServer());
|
|
|
+ view.addObject("ids", inspectCount > 0 ? importQuery.getStudentIdString() : "");
|
|
|
+ view.addObject("message", inspectCount > 0 ? "" : "没有待复核的任务");
|
|
|
+ return view;
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/startById")
|
|
|
+ public ModelAndView startById(HttpServletRequest request, RedirectAttributes redirectAttributes,
|
|
|
+ @RequestParam Integer studentId) {
|
|
|
+ ModelAndView view = new ModelAndView("modules/exam/inspectedImport");
|
|
|
+ List<Integer> ids = new ArrayList<Integer>();
|
|
|
+ ids.add(studentId);
|
|
|
+ view.addObject("inspectCount", ids.size());
|
|
|
+ view.addObject("fileServer", fileService.getFileServer());
|
|
|
+ view.addObject("ids", StringUtils.join(ids, ","));
|
|
|
+ view.addObject("studentId", studentId);
|
|
|
+ return view;
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping("/info")
|
|
|
+ @ResponseBody
|
|
|
+ public Object info(HttpServletRequest request, @RequestParam Integer studentId) {
|
|
|
+ ExamStudent student = studentService.findById(studentId);
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+ result.accumulate("id", student.getId());
|
|
|
+ result.accumulate("secretNumber", student.getSecretNumber());
|
|
|
+ result.accumulate("studentCode", student.getStudentCode());
|
|
|
+ result.accumulate("name", student.getName());
|
|
|
+ result.accumulate("subjectCode", student.getSubjectCode());
|
|
|
+ result.accumulate("subjectName", student.getSubjectName());
|
|
|
+ result.accumulate("totalScore", student.getTotalScore());
|
|
|
+ result.accumulate("upload", student.isUpload());
|
|
|
+ result.accumulate("absent", student.isAbsent());
|
|
|
+ result.accumulate("breach", student.isBreach());
|
|
|
+ List<MarkGroup> groups = groupService.findByExamAndSubject(student.getExamId(), student.getSubjectCode());
|
|
|
+ JSONArray groupArray = new JSONArray();
|
|
|
+ Map<Integer, String> mainTitleMap = new HashMap<Integer, String>();
|
|
|
+ for (MarkGroup markGroup : groups) {
|
|
|
+ JSONObject group = new JSONObject();
|
|
|
+ group.accumulate("groupNumber", markGroup.getNumber());
|
|
|
+ List<SubjectiveScore> scores = scoreService.findByStudentIdAndGroupNumber(student.getId(),
|
|
|
+ markGroup.getNumber());
|
|
|
+ JSONArray array = new JSONArray();
|
|
|
+ for (SubjectiveScore scoreItem : scores) {
|
|
|
+ JSONObject obj = new JSONObject();
|
|
|
+ String mainTitle = mainTitleMap.get(scoreItem.getMainNumber());
|
|
|
+ if (mainTitle == null) {
|
|
|
+ ExamQuestion q = questionService.findByExamAndSubjectAndObjectiveAndMainNumberAndSubNumber(
|
|
|
+ student.getExamId(), student.getSubjectCode(), false, scoreItem.getMainNumber(),
|
|
|
+ scoreItem.getSubNumber());
|
|
|
+ mainTitleMap.put(scoreItem.getMainNumber(), mainTitle);
|
|
|
+ mainTitle = q.getMainTitle();
|
|
|
+ }
|
|
|
+ obj.accumulate("mainTitle", mainTitle);
|
|
|
+ obj.accumulate("questionNumber", scoreItem.getMainNumber() + "-" + scoreItem.getSubNumber());
|
|
|
+ obj.accumulate("score", scoreItem.getScore());
|
|
|
+ array.add(obj);
|
|
|
+ }
|
|
|
+ group.accumulate("questions", array);
|
|
|
+ groupArray.add(group);
|
|
|
+ }
|
|
|
+ result.accumulate("groups", groupArray);
|
|
|
+ List<String> picUrls = fileService.getSheetUris(student.getExamId(), student.getExamNumber(), 1,
|
|
|
+ student.getSheetCount());
|
|
|
+ result.accumulate("picUrls", picUrls);
|
|
|
+ Map<Integer, List<PictureTag>> maps = studentService.buildSheetTags(student, false);
|
|
|
+ List<OriginTag> tags = new ArrayList<OriginTag>();
|
|
|
+ for (Entry<Integer, List<PictureTag>> entry : maps.entrySet()) {
|
|
|
+ List<PictureTag> pictureTags = entry.getValue();
|
|
|
+ for (PictureTag pictureTag : pictureTags) {
|
|
|
+ if (pictureTag.getContent().length == 1) {
|
|
|
+ tags.add(new OriginTag(pictureTag.getContent()[0], entry.getKey(), pictureTag.getLeft(), pictureTag
|
|
|
+ .getTop()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ObjectMapper mapper = new ObjectMapper();
|
|
|
+ try {
|
|
|
+ result.accumulate("tags", mapper.writeValueAsString(tags));
|
|
|
+ } catch (JsonProcessingException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ log.error("MarkTrackController-轨迹坐标获取出错", e);
|
|
|
+ }
|
|
|
+ result.accumulate("success", true);
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+}
|