|
@@ -1,15 +1,23 @@
|
|
|
package cn.com.qmth.stmms.admin.exam;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.LinkedList;
|
|
|
import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Random;
|
|
|
|
|
|
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.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Controller;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
import org.springframework.ui.Model;
|
|
@@ -17,13 +25,16 @@ 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.biz.exam.model.ExamSubject;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.MarkGroup;
|
|
|
import cn.com.qmth.stmms.biz.exam.model.Marker;
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.MarkerDTO;
|
|
|
import cn.com.qmth.stmms.biz.exam.query.MarkerSearchQuery;
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamService;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.ExamSubjectService;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.MarkGroupService;
|
|
|
import cn.com.qmth.stmms.biz.exam.service.MarkerService;
|
|
@@ -32,11 +43,13 @@ import cn.com.qmth.stmms.biz.mark.service.MarkTrackService;
|
|
|
import cn.com.qmth.stmms.biz.mark.service.TaskService;
|
|
|
import cn.com.qmth.stmms.common.auth.annotation.RoleRequire;
|
|
|
import cn.com.qmth.stmms.common.domain.WebUser;
|
|
|
+import cn.com.qmth.stmms.common.enums.MarkerExcelError;
|
|
|
import cn.com.qmth.stmms.common.enums.Role;
|
|
|
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 net.sf.json.JSONArray;
|
|
|
-import net.sf.json.JSONObject;
|
|
|
+
|
|
|
+import com.google.common.collect.Lists;
|
|
|
|
|
|
@Controller("examMarkerController")
|
|
|
@RequestMapping("/admin/exam/marker")
|
|
@@ -63,6 +76,12 @@ public class MarkerController extends BaseExamController {
|
|
|
|
|
|
@Autowired
|
|
|
private TaskService taskService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private ExamService examService;
|
|
|
+
|
|
|
+ @Value("${marker.showBtnImportAndBtnUpdateImport}")
|
|
|
+ private String showBtnImport;
|
|
|
|
|
|
@RequestMapping
|
|
|
public String list(Model model, HttpServletRequest request, MarkerSearchQuery query) {
|
|
@@ -80,6 +99,7 @@ public class MarkerController extends BaseExamController {
|
|
|
}
|
|
|
model.addAttribute("query", query);
|
|
|
model.addAttribute("subjectList", getExamSubject(examId, wu));
|
|
|
+ model.addAttribute("showBtnImport",showBtnImport);
|
|
|
return "modules/exam/markerList";
|
|
|
}
|
|
|
|
|
@@ -137,11 +157,11 @@ public class MarkerController extends BaseExamController {
|
|
|
@RequestMapping(value = "/batch-create", method = RequestMethod.POST)
|
|
|
@RoleRequire(Role.SCHOOL_ADMIN)
|
|
|
public ModelAndView create(HttpServletRequest request, @RequestParam String subjectCode,
|
|
|
- @RequestParam Integer groupNumber, @RequestParam Integer count, @RequestParam String password) {
|
|
|
+ @RequestParam Integer groupNumber, @RequestParam Integer count, @RequestParam(required = false) String password) {
|
|
|
int examId = getSessionExamId(request);
|
|
|
ExamSubject subject = subjectService.find(examId, subjectCode);
|
|
|
ModelAndView view = new ModelAndView("redirect:/admin/exam/marker");
|
|
|
- if (subject != null && count > 0 && StringUtils.isNotBlank(password)) {
|
|
|
+ if (subject != null && count > 0 ) {
|
|
|
markerService.batchCreate(subject, groupNumber, count, password);
|
|
|
}
|
|
|
view.addObject("subjectCode", subjectCode);
|
|
@@ -273,4 +293,196 @@ public class MarkerController extends BaseExamController {
|
|
|
}
|
|
|
return obj;
|
|
|
}
|
|
|
+
|
|
|
+ @RequestMapping(value = "/template")
|
|
|
+ public String importFileTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
|
|
|
+ try {
|
|
|
+ String fileName = "评卷员数据导入模板.xlsx";
|
|
|
+ List<Marker> list = Lists.newArrayList();
|
|
|
+ list.add(new Marker());
|
|
|
+ new ExportExcel("评卷员数据", Marker.class, 2).setDataList(list).write(response, fileName).dispose();
|
|
|
+ return null;
|
|
|
+ } catch (Exception e) {
|
|
|
+ addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return "redirect:" + "/admin/exam/marker";
|
|
|
+ }
|
|
|
+
|
|
|
+ @RequestMapping(value = "/updateLoginNameTemplate")
|
|
|
+ public String updateLoginNameTemplate(HttpServletResponse response, RedirectAttributes redirectAttributes) {
|
|
|
+ try {
|
|
|
+ String fileName = "评卷员账号修改导入模板.xlsx";
|
|
|
+ List<MarkerDTO> list = Lists.newArrayList();
|
|
|
+ list.add(new MarkerDTO());
|
|
|
+ new ExportExcel("评卷员账号修改数据", MarkerDTO.class, 2).setDataList(list).write(response, fileName).dispose();
|
|
|
+ return null;
|
|
|
+ } catch (Exception e) {
|
|
|
+ addMessage(redirectAttributes, "导入模板下载失败!失败信息:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return "redirect:" + "/admin/exam/marker";
|
|
|
+ }
|
|
|
+ @RequestMapping(value = "/import", method = RequestMethod.POST)
|
|
|
+ public String importFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
|
|
|
+ int examId = getSessionExamId(request);
|
|
|
+ try {
|
|
|
+ int successNum = 0;
|
|
|
+ int failureNum = 0;
|
|
|
+ StringBuilder failureMsg = new StringBuilder();
|
|
|
+ ImportExcel ei = new ImportExcel(file, 1, 0);
|
|
|
+ List<Marker> list = ei.getDataList(Marker.class);
|
|
|
+ List<Marker> saveList = new LinkedList<Marker>();
|
|
|
+ Map<String, Marker> saveMap = new HashMap<String, Marker>();
|
|
|
+ Map<String, ExamSubject> current = null;
|
|
|
+ current = new HashMap<String, ExamSubject>();
|
|
|
+ List<ExamSubject> list2 = subjectService.list(examId);
|
|
|
+ for (ExamSubject s : list2) {
|
|
|
+ current.put(s.getCode(), s);
|
|
|
+ }
|
|
|
+ for (Marker marker : list) {
|
|
|
+ String password = "";
|
|
|
+ if (StringUtils.isBlank(marker.getSubjectCode()) || StringUtils.isBlank(marker.getLoginName())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ marker.setExamId(examId);
|
|
|
+ marker.setName(marker.getLoginName());
|
|
|
+ marker.setEnable(true);
|
|
|
+ if(StringUtils.isBlank(marker.getPassword())){
|
|
|
+ Random random = new Random();
|
|
|
+ for (int i=0;i<6;i++)
|
|
|
+ {
|
|
|
+ password+=random.nextInt(10);
|
|
|
+ }
|
|
|
+ marker.setPassword(password);
|
|
|
+ }
|
|
|
+ MarkerExcelError markerExcelError = checkLongNameAndPassword(marker,current,saveMap);
|
|
|
+ if (markerExcelError.equals(MarkerExcelError.MARKER)) {
|
|
|
+ saveList.add(marker);
|
|
|
+ saveMap.put(marker.getLoginName(), marker);
|
|
|
+ } else {
|
|
|
+ failureMsg.append("<br/>评卷员 " + marker.getLoginName() + ","+markerExcelError.getName());
|
|
|
+ failureNum++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ successNum = markerService.batchSave(saveList);
|
|
|
+ if (failureNum > 0) {
|
|
|
+ failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
|
|
|
+ }
|
|
|
+ addMessage(redirectAttributes, "已成功导入 " + successNum + " 条评卷员" + failureMsg);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("Batch import marker error!", e);
|
|
|
+ addMessage(redirectAttributes, "导入评卷员失败!失败信息:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return "redirect:" + "/admin/exam/marker";
|
|
|
+ }
|
|
|
+ @RequestMapping(value = "/importUpdate", method = RequestMethod.POST)
|
|
|
+ public String importUpdateFile(HttpServletRequest request, MultipartFile file, RedirectAttributes redirectAttributes) {
|
|
|
+ try {
|
|
|
+ int successNum = 0;
|
|
|
+ int failureNum = 0;
|
|
|
+ StringBuilder failureMsg = new StringBuilder();
|
|
|
+ ImportExcel ei = new ImportExcel(file, 1, 0);
|
|
|
+ List<MarkerDTO> list = ei.getDataList(MarkerDTO.class);
|
|
|
+ List<Marker> saveList = new LinkedList<Marker>();
|
|
|
+ Map<String, Marker> current = null;
|
|
|
+ List<Marker> list2 = markerService.findMode("common");
|
|
|
+ if(list2.size()<10000){
|
|
|
+ current = new HashMap<String, Marker>();
|
|
|
+ for (Marker s : list2) {
|
|
|
+ current.put(s.getLoginName(), s);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for (MarkerDTO markerDTO : list) {
|
|
|
+ if (StringUtils.isBlank(markerDTO.getSubjectCode()) || StringUtils.isBlank(markerDTO.getLoginName())
|
|
|
+ || StringUtils.isBlank(markerDTO.getNewLoginName()) || StringUtils.isBlank(markerDTO.getPassword())) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ MarkerExcelError markerExcelError = checkExcelData(markerDTO,current);
|
|
|
+ if (markerExcelError.equals(MarkerExcelError.MARKER)) {
|
|
|
+ Marker marker = null;
|
|
|
+ if(current != null){
|
|
|
+ marker = current.get(markerDTO.getLoginName());
|
|
|
+ }else {
|
|
|
+ marker = markerService.findByLoginName(markerDTO.getLoginName());
|
|
|
+ }
|
|
|
+ marker.setLoginName(markerDTO.getNewLoginName());
|
|
|
+ marker.setPassword(markerDTO.getPassword());
|
|
|
+ saveList.add(marker);
|
|
|
+ } else {
|
|
|
+ failureMsg.append("<br/>科目代码(" + markerDTO.getSubjectCode()+")原评卷员("+markerDTO.getLoginName() +")更换新评卷员为("+markerDTO.getNewLoginName()+ ")失败!");
|
|
|
+ failureMsg.append("---->失败原因:("+markerExcelError.getName()+")");
|
|
|
+ failureNum++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ successNum = markerService.batchSave(saveList);
|
|
|
+ if (failureNum > 0) {
|
|
|
+ failureMsg.insert(0, ",失败 " + failureNum + " 条记录!");
|
|
|
+ }
|
|
|
+ addMessage(redirectAttributes, "已成功导入 " + successNum + " 条" + failureMsg);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("Batch import marker error!", e);
|
|
|
+ addMessage(redirectAttributes, "导入修改评卷员账号失败!失败信息:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return "redirect:" + "/admin/exam/marker";
|
|
|
+ }
|
|
|
+ private MarkerExcelError checkLongNameAndPassword(Marker marker, Map<String, ExamSubject> current,Map<String, Marker> saveMap) {
|
|
|
+ Marker previous = null;
|
|
|
+
|
|
|
+ if(current != null && current.get(marker.getSubjectCode()) == null){
|
|
|
+ return MarkerExcelError.MARKERNOTCODE;
|
|
|
+ }
|
|
|
+ MarkGroup group = groupService.findOne(marker.getExamId(), marker.getSubjectCode(), Integer.valueOf(marker.getGroupName()));
|
|
|
+ if(group==null){
|
|
|
+ return MarkerExcelError.MARKERNOTGROUP;
|
|
|
+ }else{
|
|
|
+ marker.setGroupNumber(Integer.valueOf(marker.getGroupName()));
|
|
|
+ }
|
|
|
+ if (saveMap != null) {
|
|
|
+ previous = saveMap.get(marker.getLoginName());
|
|
|
+ }
|
|
|
+
|
|
|
+ if (previous != null) {
|
|
|
+ return MarkerExcelError.MARKERED;
|
|
|
+ }
|
|
|
+
|
|
|
+ previous = markerService.findByLoginName(marker.getLoginName());
|
|
|
+
|
|
|
+ if(marker.getPassword().length()>0 && marker.getPassword().length()<4){
|
|
|
+ return MarkerExcelError.MARKERPWERROR;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (previous == null) {
|
|
|
+ return MarkerExcelError.MARKER;
|
|
|
+ }
|
|
|
+ return MarkerExcelError.MARKERED;
|
|
|
+ }
|
|
|
+
|
|
|
+ //校验excel中数据
|
|
|
+ public MarkerExcelError checkExcelData(MarkerDTO markerDTO,Map<String, Marker> current ){
|
|
|
+ if(markerDTO != null){
|
|
|
+ Marker marker = null;
|
|
|
+ if(current == null){
|
|
|
+ marker = markerService.findByLoginName(markerDTO.getLoginName());
|
|
|
+ }else {
|
|
|
+ marker = current.get(markerDTO.getLoginName());
|
|
|
+ }
|
|
|
+ if(markerDTO.getPassword().length() < 4){
|
|
|
+ return MarkerExcelError.MARKERPWERROR;
|
|
|
+ }
|
|
|
+ if(marker != null){
|
|
|
+ if(marker.getSubjectCode().equals(markerDTO.getSubjectCode())){
|
|
|
+ if(markerService.countByLoginName(markerDTO.getNewLoginName()) > 0){
|
|
|
+ return MarkerExcelError.MARKERNEWMISS;
|
|
|
+ }else {
|
|
|
+ return MarkerExcelError.MARKER;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ return MarkerExcelError.MARKERCODEMISS;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return MarkerExcelError.MARKERMISS;
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return MarkerExcelError.MARKERNOTINFO;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|