|
@@ -0,0 +1,276 @@
|
|
|
|
+package cn.com.qmth.stmms.api.controller.admin;
|
|
|
|
+
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+import javax.servlet.http.HttpServletResponse;
|
|
|
|
+
|
|
|
|
+import cn.com.qmth.stmms.biz.exam.bean.RejectHistoryVo;
|
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
|
+import org.slf4j.Logger;
|
|
|
|
+import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
|
+import org.springframework.stereotype.Controller;
|
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestMapping;
|
|
|
|
+import org.springframework.web.bind.annotation.RequestMethod;
|
|
|
|
+import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
|
+
|
|
|
|
+import com.qmth.boot.core.collection.PageResult;
|
|
|
|
+
|
|
|
|
+import cn.com.qmth.stmms.api.controller.BaseApiController;
|
|
|
|
+import cn.com.qmth.stmms.biz.exam.bean.SubjectRejectVo;
|
|
|
|
+import cn.com.qmth.stmms.biz.exam.model.ExamQuestion;
|
|
|
|
+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.query.SubjectQualitySearchQuery;
|
|
|
|
+import cn.com.qmth.stmms.biz.exam.service.ExamQuestionService;
|
|
|
|
+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;
|
|
|
|
+import cn.com.qmth.stmms.biz.exception.StatusException;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.model.RejectHistory;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.query.RejectHistorySearchQuery;
|
|
|
|
+import cn.com.qmth.stmms.biz.mark.service.RejectHistoryService;
|
|
|
|
+import cn.com.qmth.stmms.biz.user.model.User;
|
|
|
|
+import cn.com.qmth.stmms.biz.user.service.UserService;
|
|
|
|
+import cn.com.qmth.stmms.biz.utils.Calculator;
|
|
|
|
+import cn.com.qmth.stmms.biz.utils.PageUtil;
|
|
|
|
+import cn.com.qmth.stmms.common.annotation.Logging;
|
|
|
|
+import cn.com.qmth.stmms.common.domain.ApiUser;
|
|
|
|
+import cn.com.qmth.stmms.common.enums.LogType;
|
|
|
|
+import cn.com.qmth.stmms.common.utils.ExportExcel;
|
|
|
|
+import io.swagger.annotations.Api;
|
|
|
|
+import io.swagger.annotations.ApiOperation;
|
|
|
|
+
|
|
|
|
+@Api(tags = "打回试卷")
|
|
|
|
+@Controller("adminRejectController")
|
|
|
|
+@RequestMapping("/api/admin/exam/reject")
|
|
|
|
+public class RejectController extends BaseApiController {
|
|
|
|
+
|
|
|
|
+ protected static Logger log = LoggerFactory.getLogger(RejectController.class);
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private MarkGroupService groupService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private MarkerService markerService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private ExamSubjectService subjectService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private RejectHistoryService rejectHistoryService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private ExamQuestionService questionService;
|
|
|
|
+
|
|
|
|
+ @Autowired
|
|
|
|
+ private UserService userService;
|
|
|
|
+
|
|
|
|
+ public static final String UN_SELECTIVE_SCORE = "-1";
|
|
|
|
+
|
|
|
|
+ @Logging(menu = "打回统计查询", type = LogType.QUERY)
|
|
|
|
+ @ApiOperation(value = "打回统计按科目查询")
|
|
|
|
+ @RequestMapping(value = "list/subject", method = RequestMethod.POST)
|
|
|
|
+ @ResponseBody
|
|
|
|
+ public PageResult<SubjectRejectVo> listSubject(SubjectQualitySearchQuery query) {
|
|
|
|
+ return pageSubject(query);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private PageResult<SubjectRejectVo> pageSubject(SubjectQualitySearchQuery query) {
|
|
|
|
+ int examId = getSessionExamId();
|
|
|
|
+ ApiUser wu = getApiUser();
|
|
|
|
+ List<ExamSubject> subjectList = getExamSubject(examId, wu);
|
|
|
|
+ query.setTotalCount(subjectList == null ? 0 : subjectList.size());
|
|
|
|
+ List<ExamSubject> pageList = PageUtil.of(subjectList, query).getResult();
|
|
|
|
+ List<SubjectRejectVo> ret = new ArrayList<>();
|
|
|
|
+ for (ExamSubject sub : pageList) {
|
|
|
|
+ SubjectRejectVo vo = new SubjectRejectVo();
|
|
|
|
+ vo.setSubjectCode(sub.getCode());
|
|
|
|
+ vo.setSubjectName(sub.getName());
|
|
|
|
+ vo.setSubjectText(sub.getCode() + "-" + sub.getName());
|
|
|
|
+ ret.add(vo);
|
|
|
|
+ }
|
|
|
|
+ List<MarkGroup> gs = null;
|
|
|
|
+ if (StringUtils.isBlank(query.getSubjectCode())) {
|
|
|
|
+ gs = groupService.findByExam(examId);
|
|
|
|
+ } else {
|
|
|
|
+ gs = groupService.findByExamAndSubject(examId, query.getSubjectCode());
|
|
|
|
+ }
|
|
|
|
+ if (!CollectionUtils.isEmpty(gs)) {
|
|
|
|
+ fillTotalCount(ret, gs);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ return PageUtil.of(ret, query);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @ApiOperation(value = "打回统计按科目导出")
|
|
|
|
+ @RequestMapping(value = "list/subject/export", method = RequestMethod.POST)
|
|
|
|
+ public void exportSubjectFile(SubjectQualitySearchQuery query, HttpServletResponse response) {
|
|
|
|
+ String fileName = "打回统计数据";
|
|
|
|
+ query.setPageNumber(1);
|
|
|
|
+ query.setPageSize(Integer.MAX_VALUE);
|
|
|
|
+ PageResult<SubjectRejectVo> page = pageSubject(query);
|
|
|
|
+ try {
|
|
|
|
+ new ExportExcel("打回统计数据", SubjectRejectVo.class).setDataList(page.getResult()).write(response, fileName)
|
|
|
|
+ .dispose();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new StatusException("打回统计数据导出出错", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void fillTotalCount(List<SubjectRejectVo> ret, List<MarkGroup> gs) {
|
|
|
|
+ Map<String, SubjectRejectVo> map = new HashMap<>();
|
|
|
|
+ for (SubjectRejectVo vo : ret) {
|
|
|
|
+ map.put(vo.getSubjectCode(), vo);
|
|
|
|
+ }
|
|
|
|
+ for (MarkGroup g : gs) {
|
|
|
|
+ SubjectRejectVo vo = map.get(g.getSubjectCode());
|
|
|
|
+ vo.setTotalCount(vo.getTotalCount() + g.getLibraryCount());
|
|
|
|
+ vo.setFinishCount(vo.getFinishCount() + g.getMarkedCount());
|
|
|
|
+ long rejectCount = rejectHistoryService.countDistinctByExamIdAndSubjectCodeAndGroup(g.getExamId(),
|
|
|
|
+ g.getSubjectCode(), g.getNumber());
|
|
|
|
+ vo.setRejectCount(vo.getRejectCount() + rejectCount);
|
|
|
|
+ vo.setRejectRatio(Calculator.percentage(vo.getRejectCount(), vo.getFinishCount(), 2));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Logging(menu = "打回统计按分组查询", type = LogType.QUERY)
|
|
|
|
+ @ApiOperation(value = "打回统计按分组分页查询")
|
|
|
|
+ @RequestMapping(value = "list/group", method = RequestMethod.POST)
|
|
|
|
+ @ResponseBody
|
|
|
|
+ public PageResult<SubjectRejectVo> listGroup(SubjectQualitySearchQuery query) {
|
|
|
|
+ return pageGroup(query);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private PageResult<SubjectRejectVo> pageGroup(SubjectQualitySearchQuery query) {
|
|
|
|
+ int examId = getSessionExamId();
|
|
|
|
+ List<MarkGroup> gs = null;
|
|
|
|
+ if (StringUtils.isBlank(query.getSubjectCode())) {
|
|
|
|
+ gs = groupService.findByExam(examId);
|
|
|
|
+ } else {
|
|
|
|
+ gs = groupService.findByExamAndSubject(examId, query.getSubjectCode());
|
|
|
|
+ }
|
|
|
|
+ List<SubjectRejectVo> ret = new ArrayList<>();
|
|
|
|
+ query.setTotalCount(gs == null ? 0 : gs.size());
|
|
|
|
+ if (!CollectionUtils.isEmpty(gs)) {
|
|
|
|
+ Map<String, String> subjectNames = new HashMap<>();
|
|
|
|
+ List<MarkGroup> pageList = PageUtil.of(gs, query).getResult();
|
|
|
|
+ for (MarkGroup group : pageList) {
|
|
|
|
+ List<ExamQuestion> questions = questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
|
|
|
|
+ group.getSubjectCode(), false, group.getNumber());
|
|
|
|
+ group.setQuestionList(questions);
|
|
|
|
+ SubjectRejectVo vo = new SubjectRejectVo();
|
|
|
|
+ vo.setSubjectCode(group.getSubjectCode());
|
|
|
|
+ vo.setSubjectName(getSubjectName(subjectNames, examId, group.getSubjectCode()));
|
|
|
|
+ vo.setSubjectText(vo.getSubjectCode() + "-" + vo.getSubjectName());
|
|
|
|
+ vo.setGroupNumber(group.getNumber());
|
|
|
|
+ vo.setGroupName(group.getTitle());
|
|
|
|
+ vo.setGroupText(vo.getGroupNumber() + "-" + vo.getGroupName());
|
|
|
|
+ vo.setTotalCount(group.getLibraryCount());
|
|
|
|
+ vo.setFinishCount(group.getMarkedCount());
|
|
|
|
+ long rejectCount = rejectHistoryService.countDistinctByExamIdAndSubjectCodeAndGroup(group.getExamId(),
|
|
|
|
+ group.getSubjectCode(), group.getNumber());
|
|
|
|
+ vo.setRejectCount(rejectCount);
|
|
|
|
+ vo.setRejectRatio(Calculator.percentage(vo.getRejectCount(), vo.getFinishCount(), 2));
|
|
|
|
+ ret.add(vo);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return PageUtil.of(ret, query);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @ApiOperation(value = "打回统计按分组导出")
|
|
|
|
+ @Logging(menu = "打回统计按分组到处", type = LogType.EXPORT)
|
|
|
|
+ @RequestMapping(value = "list/group/export", method = RequestMethod.POST)
|
|
|
|
+ public void exportGroupFile(SubjectQualitySearchQuery query, HttpServletResponse response) {
|
|
|
|
+ String fileName = "分组质量监控数据";
|
|
|
|
+ query.setPageNumber(1);
|
|
|
|
+ query.setPageSize(Integer.MAX_VALUE);
|
|
|
|
+ PageResult<SubjectRejectVo> page = pageGroup(query);
|
|
|
|
+ try {
|
|
|
|
+ new ExportExcel("分组质量监控数据", SubjectRejectVo.class).setDataList(page.getResult()).write(response, fileName)
|
|
|
|
+ .dispose();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new StatusException("分组质量监控数据导出出错", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private String getSubjectName(Map<String, String> subjectNames, int examId, String code) {
|
|
|
|
+ String name = subjectNames.get(code);
|
|
|
|
+ if (name != null) {
|
|
|
|
+ return name;
|
|
|
|
+ }
|
|
|
|
+ ExamSubject es = subjectService.find(examId, code);
|
|
|
|
+ subjectNames.put(code, es.getName());
|
|
|
|
+ return es.getName();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @ApiOperation(value = "打回历史查询")
|
|
|
|
+ @Logging(menu = "打回历史查询", type = LogType.QUERY)
|
|
|
|
+ @RequestMapping(value = "list/history", method = RequestMethod.POST)
|
|
|
|
+ @ResponseBody
|
|
|
|
+ public PageResult<RejectHistoryVo> listHistory(RejectHistorySearchQuery query) {
|
|
|
|
+ return pageHistory(query);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @ApiOperation(value = "打回历史导出")
|
|
|
|
+ @Logging(menu = "打回历史到处", type = LogType.EXPORT)
|
|
|
|
+ @RequestMapping(value = "list/history/export", method = RequestMethod.POST)
|
|
|
|
+ public void exportHistoryFile(RejectHistorySearchQuery query, HttpServletResponse response) {
|
|
|
|
+ String fileName = "打回历史数据";
|
|
|
|
+ query.setPageNumber(1);
|
|
|
|
+ query.setPageSize(Integer.MAX_VALUE);
|
|
|
|
+ List<RejectHistoryVo> page = pageHistory(query).getResult();
|
|
|
|
+ try {
|
|
|
|
+ new ExportExcel("打回历史数据", RejectHistoryVo.class).setDataList(page).write(response, fileName)
|
|
|
|
+ .dispose();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new StatusException("打回历史数据导出出错", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private PageResult<RejectHistoryVo> pageHistory(RejectHistorySearchQuery query) {
|
|
|
|
+ int examId = getSessionExamId();
|
|
|
|
+ ApiUser wu = getApiUser();
|
|
|
|
+ List<ExamSubject> subjectList = getExamSubject(examId, wu);
|
|
|
|
+ if (subjectList.isEmpty()) {
|
|
|
|
+ return PageUtil.emptyPage();
|
|
|
|
+ }
|
|
|
|
+ query.setExamId(examId);
|
|
|
|
+ if (wu.isSubjectHeader() && StringUtils.isBlank(query.getSubjectCode())) {
|
|
|
|
+ String subjectCodeIn = StringUtils.join(wu.getSubjectCodeSet(), ",");
|
|
|
|
+ query.setSubjectCodeIn(subjectCodeIn);
|
|
|
|
+ }
|
|
|
|
+ query = rejectHistoryService.findByQuery(query);
|
|
|
|
+ List<RejectHistoryVo> list =new ArrayList<>();
|
|
|
|
+ Map<String, String> subjectNames = new HashMap<>();
|
|
|
|
+ for (RejectHistory h : query.getResult()) {
|
|
|
|
+ RejectHistoryVo vo = RejectHistoryVo.of(h);
|
|
|
|
+ Marker marker = markerService.findById(h.getMarkerId());
|
|
|
|
+ User user = userService.findById(marker.getUserId());
|
|
|
|
+ vo.setMarkerName(user.getLoginName() + "/" + user.getName());
|
|
|
|
+
|
|
|
|
+ User header = userService.findById(h.getUserId());
|
|
|
|
+ vo.setHeaderName(header.getLoginName() + "/" + header.getName());
|
|
|
|
+
|
|
|
|
+ vo.setSubjectName(getSubjectName(subjectNames, examId, h.getSubjectCode()));
|
|
|
|
+ vo.setSubjectText(vo.getSubjectCode() + "-" + vo.getSubjectName());
|
|
|
|
+ MarkGroup group = groupService.findOne(examId, h.getSubjectCode(), h.getGroupNumber());
|
|
|
|
+ group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
|
|
|
|
+ group.getSubjectCode(), false, group.getNumber()));
|
|
|
|
+ vo.setGroupName(group.getTitle());
|
|
|
|
+ vo.setGroupText(vo.getGroupNumber() + "-" + vo.getGroupName());
|
|
|
|
+
|
|
|
|
+ group.setQuestionList(questionService.findByExamAndSubjectAndObjectiveAndGroupNumber(examId,
|
|
|
|
+ group.getSubjectCode(), false, group.getNumber()));
|
|
|
|
+ h.setTitle(group.getTitle());
|
|
|
|
+ }
|
|
|
|
+ return PageUtil.of(list, query);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+}
|