package com.qxueyou.scc.exercise.action; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.qxueyou.scc.admin.classes.service.IClassService; import com.qxueyou.scc.base.dao.CommonDAO; import com.qxueyou.scc.base.model.Pager; import com.qxueyou.scc.base.model.Result; import com.qxueyou.scc.base.util.ClientUtils; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.QBeanUtils; import com.qxueyou.scc.exercise.model.ExerItemResponseData; import com.qxueyou.scc.exercise.model.ExerciseCompleteInfo; import com.qxueyou.scc.exercise.model.ExerciseExamReClass; import com.qxueyou.scc.exercise.model.ExerciseInfo; import com.qxueyou.scc.exercise.model.ExerciseItem; import com.qxueyou.scc.exercise.model.ExerciseItemStatistics; import com.qxueyou.scc.exercise.model.ExerciseResultV; import com.qxueyou.scc.exercise.model.ExerciseSubmitAnswerData; import com.qxueyou.scc.exercise.service.IExerciseCompleteService; import com.qxueyou.scc.exercise.service.IExerciseGroupService; import com.qxueyou.scc.exercise.service.IExerciseInfoService; import com.qxueyou.scc.exercise.service.IExerciseVerService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import javax.servlet.http.HttpServletRequest; /** * 作业管理 * * @author kevin * */ @Api(tags = "作业管理接口") @Controller @CrossOrigin(origins="*",maxAge=3600) @RequestMapping(value = "/exercise/info") public class ExerciseInfoController { private static final int DEFAULT_PAGE_SIZE = 10; private static final int DEFAULT_PAGE_NUM = 1; /** commonDAO */ @Autowired private CommonDAO commonDAO; @Autowired private IExerciseInfoService exerciseInfoService; @Autowired private IExerciseGroupService exerciseGroupService; @Autowired IClassService classService; @Autowired private IExerciseCompleteService exerciseCompleteService; /** 练习V2.0版本接口service */ @Autowired private IExerciseVerService exerciseVerService; //------------------------------------------------app接口------------------------------------------- /** * 获取作业详情 * * @param examId * @return */ @ApiOperation(value = "获取作业详情", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "exerciseInfoId", value = "作业id", required = true, paramType="query", dataType = "String"), }) @RequestMapping(value = "/app/detail", method = RequestMethod.GET) public @ResponseBody Result queryDetail(String exerciseInfoId) { if (StringUtils.isEmpty(exerciseInfoId)) { return new Result(false, "参数错误"); } ExerciseInfo exerciseInfo = this.commonDAO.read(ExerciseInfo.class, exerciseInfoId); Map data = QBeanUtils.copyPropertiesToMap(exerciseInfo, CollectionUtils.newStringMap( "exerciseInfoId","exerciseInfoId","name","name","type","type","remind","remind","score","score", "startTime","startTime","endTime","endTime","passingScore","passingScore")); data.put("subjectName", exerciseInfo.getSubject().getName()); if(exerciseInfo.getReClasses()!=null && exerciseInfo.getReClasses().size()>0){ List lstClassIds = QBeanUtils.listPropertyVal(exerciseInfo.getReClasses(), "classId"); String [] classIds = lstClassIds.toArray(new String[lstClassIds.size()]); String [] classNames = classService.queryClassNamesByIds(classIds); data.put("classIds", classIds); data.put("classNames",classNames); } if(exerciseInfo.getReGroups()!=null && exerciseInfo.getReGroups().size()>0){ List lstGroupIds = QBeanUtils.listPropertyVal(exerciseInfo.getReGroups(), "groupId"); String [] groupIds = lstGroupIds.toArray(new String[lstGroupIds.size()]); String [] groupNames = exerciseGroupService.queryGroupNamesByIds(groupIds); data.put("groupIds", groupIds); data.put("groupNames", groupNames); } return new Result(true,"",data); } //-------------------------------------------------后台端接口----------------------------------------- /** * 作业列表 * * @return */ @RequestMapping(value = "/list", method = RequestMethod.GET) public @ResponseBody Result list(String keyword, String classId, Short status, Integer pageSize,Integer pageNum) { pageSize = pageSize != null && pageSize > 0 ? pageSize : DEFAULT_PAGE_SIZE; pageNum = pageNum != null && pageNum > 0 ? pageNum : DEFAULT_PAGE_NUM; //作业数量 int totalCount = exerciseInfoService.listCount(keyword == null ? "" : keyword.trim(),classId,status); Pager pager = new Pager(pageSize,pageNum); pager.setTotalCount(totalCount); List list = exerciseInfoService.list(keyword == null ? "" : keyword.trim(),classId,status,pageSize, pageNum); List> listResult =QBeanUtils.listBean2ListMap(list, CollectionUtils.newStringMap("exerciseInfoId","exerciseInfoId","name","name","passingScore","passingScore","type","type", "status","status","updateTime","updateTime","startTime","startTime","endTime","endTime","creator","creator","subject.name","subjectName")); if(listResult!=null && listResult.size()>0){ Map countMap = exerciseInfoService.queryResultStatusCount(QBeanUtils.listPropertyVal(list, "exerciseInfoId")); countMap = countMap==null?new HashMap(1):countMap; Integer tempCount = null; for (Map item : listResult) { tempCount = countMap.get(item.get("exerciseInfoId") + "-" + ExerciseCompleteInfo.STATUS_CHECKED); item.put("checkedCount", tempCount==null?0:tempCount); tempCount = countMap.get(item.get("exerciseInfoId") + "-" + ExerciseCompleteInfo.STATUS_COMMIT); item.put("toCheckCount",tempCount==null?0:tempCount); tempCount = countMap.get(item.get("exerciseInfoId") + "-" + ExerciseCompleteInfo.STATUS_DRAFT); item.put("unCommitCount",tempCount==null?0:tempCount); tempCount = countMap.get(item.get("exerciseInfoId") + "-" + ExerciseCompleteInfo.STATUS_REDO); item.put("reDoCount",tempCount==null?0:tempCount); } } return new Result(true,"",CollectionUtils.newObjectMap("list",listResult,"pager",pager)); } /** * 保存作业基础信息 * * @return */ @RequestMapping(value = "/save", method = RequestMethod.POST) public @ResponseBody Result save(@RequestBody ExerciseInfo exerciseInfo) { return StringUtils.isEmpty(exerciseInfo.getExerciseInfoId())? this.exerciseInfoService.insertExerciseInfo(exerciseInfo):this.exerciseInfoService.updateExerciseInfo(exerciseInfo); } /** * 删除作业 * * @param examId * @return */ @RequestMapping(value = "/delete", method = RequestMethod.GET) public @ResponseBody Result deleteExercise(String exerciseInfoId) { if (StringUtils.isEmpty(exerciseInfoId)) { return new Result(false, "参数错误"); } return this.exerciseInfoService.deleteExerciseInfo(exerciseInfoId); } /** * 发布作业 * * @param exerciseIds * @return */ @RequestMapping(value = "/publish", method = RequestMethod.GET) public @ResponseBody Result publishExerciseInfo(String exerciseIds) { if (StringUtils.isEmpty(exerciseIds)) { return new Result(false, "参数错误"); } return this.exerciseInfoService.doPublishExercise(exerciseIds.split(",")); } /** * 撤回作业 * * @param exerciseIds * @return */ @RequestMapping(value = "/revoke", method = RequestMethod.GET) public @ResponseBody Result revokeExerciseInfo(String exerciseIds) { if (StringUtils.isEmpty(exerciseIds)) { return new Result(false, "参数错误"); } return this.exerciseInfoService.doRevokeExercise(exerciseIds.split(",")); } /** * 撤回作业校验 * * @param exerciseIds * @return */ @RequestMapping(value = "/checkRevoke", method = RequestMethod.GET) public @ResponseBody Result checkRevokeExerciseInfo(String exerciseIds) { int count= this.commonDAO.findCountByComplexHql("from ExerciseInfo f where f.startTime<=:startTime and f.exerciseInfoId in (:exerciseIds)", CollectionUtils.newObjectMap("startTime",new Date(),"exerciseIds",exerciseIds)); return count>0?new Result(false,"已开始的作业不能撤回"):new Result(true); } /** * 获取作业详情 * * @param examId * @return */ @ApiOperation(value = "获取作业详情", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "exerciseInfoId", value = "作业id", required = true, paramType="query", dataType = "String"), }) @RequestMapping(value = "/detail", method = RequestMethod.GET) public @ResponseBody Result initExerciseInfo(String exerciseInfoId) { Result result = new Result(true); if (StringUtils.isEmpty(exerciseInfoId)) { new Result(false, "参数错误"); } ExerciseInfo exerciseInfo = this.commonDAO.read(ExerciseInfo.class, exerciseInfoId); exerciseInfo.setSubjectName(exerciseInfo.getSubject().getName()); // 获取关联班机信息 if (exerciseInfo.getReClasses() != null) { List reClasses = new ArrayList( exerciseInfo.getReClasses().size()); List lstObj = this.commonDAO.find( "select r,c.name from ExerciseExamReClass r,ClsClass c where r.examId=? and r.classId=c.classId and r.deleteFlag is false", CollectionUtils.newList(exerciseInfoId), Object[].class); for (int i = 0; i < exerciseInfo.getReClasses().size(); i++) { ((ExerciseExamReClass) lstObj.get(i)[0]).setClassName((String) lstObj.get(i)[1]); reClasses.add((ExerciseExamReClass) lstObj.get(i)[0]); } exerciseInfo.setReClasses(reClasses); } //答题作业取题目信息 if(exerciseInfo.getType()== ExerciseInfo.EXERCISE_TYPE_ANSWER){ String groupId = exerciseInfoService.queryExerciseInfoRelatedGroupId(exerciseInfoId); @SuppressWarnings("deprecation") List lstItem = exerciseVerService.queryExerciseItemList(groupId); // 3.组装返回参数 ExerItemResponseData responseData = new ExerItemResponseData(); responseData.setExerciseGroupId(groupId); responseData.setItems(lstItem); result.addData("exerItem", responseData); } result.addData("exerciseInfo", exerciseInfo); return result; } /** * 作业题型配置 * * @param examId * @return */ @ApiOperation(value = "作业题型配置查询") @RequestMapping(value = "/itemset/list", method = RequestMethod.GET) public @ResponseBody List> examItemTypeList(String exerciseInfoId) { return this.commonDAO.findListWithMapByHql("select blankScore as blankScore,halfRightScore as halfRightScore," + " itemType as itemType,rightScore as rightScore,wrongScore as wrongScore, itemCount as itemCount, itemCount*rightScore as totalScore" + " from ExerciseItemSet where exerciseInfoId = :exerciseInfoId and deleteFlag is false", CollectionUtils.newObjectMap("exerciseInfoId", exerciseInfoId)); } /** * 作业布置班级列表 * * @param examId * @return */ @RequestMapping(value = "/relatedclass/list", method = RequestMethod.GET) public @ResponseBody List> classList(String exerciseInfoId) { // TODO 作业布置查询班级需要修改 return this.commonDAO.findListWithMapByHql( "select s.classId as classId,s.name as className from ExerciseExamReClass c,ClsClass s where c.deleteFlag is false and s.deleteFlag is false" + " and s.classId = c.classId and c.examId = :exerciseInfoId", CollectionUtils.newObjectMap("exerciseInfoId", exerciseInfoId)); } /** * 作业题库来源列表 * * @param examId * @return */ @RequestMapping(value = "/relatedgroup/list", method = RequestMethod.GET) public @ResponseBody List> itemSourceList(String exerciseInfoId) { return this.commonDAO.findListWithMapByHql( "select s.name as groupName from ExerciseExamReGroup c,ExerciseGroup s where c.deleteFlag is false and s.deleteFlag is false" + " and s.groupId = c.groupId and c.examId = :exerciseInfoId", CollectionUtils.newObjectMap("exerciseInfoId", exerciseInfoId)); } /** * 学员得分详情列表 * * @param groupId * @return */ @ApiOperation(value = "学员得分详情列表", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "exerciseInfoId", value = "作业id", required = false, paramType="query", dataType = "String"), @ApiImplicitParam(name = "subjectId", value = "课程id", required = false, paramType="query", dataType = "String"), }) @RequestMapping(value = "/teacher/answerresultlist", method = RequestMethod.GET) public @ResponseBody Result resultList(String keyword,String exerciseInfoId,String subjectId, Short status,Integer pageSize, Integer pageNum) { pageSize = pageSize != null && pageSize > 0 ? pageSize : DEFAULT_PAGE_SIZE; pageNum = pageNum != null && pageNum > 0 ? pageNum : DEFAULT_PAGE_NUM; //作业数量 int totalCount = exerciseInfoService.queryStuExerciseListCount(keyword,exerciseInfoId,null,subjectId,status); Pager pager = new Pager(pageSize,pageNum); pager.setTotalCount(totalCount); List list = exerciseInfoService.queryStuExerciselist(keyword,exerciseInfoId,null,subjectId,status,pageSize, pageNum); List> listResult =QBeanUtils.listBean2ListMap(list, CollectionUtils.newStringMap("id.exerciseInfoId","exerciseInfoId","exerciseName","exerciseName","startTime","startTime","score","score", "endTime","endTime","id.studentId","studentId","id.classId","classId","submitTime","submitTime","userId","studentUserId", "studentName","studentUserName","exerciseCompleteId","exerciseCompleteId","studentScore","studentScore","subjectName","subjectName", "studentNo","studentNo","completeStatus","completeStatus","className","className","sex","sex","mobilePhone","mobilePhone")); return new Result(true,"",CollectionUtils.newObjectMap("list", listResult,"pager", pager)); } //查询个人需要做的作业 @ApiOperation(value = "查询个人需要做的作业列表", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "classId", value = "班级id", required = true, paramType="query", dataType = "String"), @ApiImplicitParam(name = "subjectId", value = "课程id", required = true, paramType="query", dataType = "String"), @ApiImplicitParam(name = "status", value = "作业状态查询(默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交)", required = true, paramType="query", dataType = "Short"), }) @RequestMapping(value = "/student/list", method = RequestMethod.GET) public @ResponseBody Result queryStudentExerciseList(String keyword, String subjectId, Short status, Integer pageSize, Integer pageNum, HttpServletRequest request) { pageSize = pageSize != null && pageSize > 0 ? pageSize : DEFAULT_PAGE_SIZE; pageNum = pageNum != null && pageNum > 0 ? pageNum : DEFAULT_PAGE_NUM; //作业数量 int totalCount = exerciseInfoService.queryStuExerciseListCount(keyword,null,ClientUtils.getUserId(),subjectId,status); List list = exerciseInfoService.queryStuExerciselist(keyword,null,ClientUtils.getUserId(),subjectId,status,pageSize, pageNum); List> listResult =QBeanUtils.listBean2ListMap(list, CollectionUtils.newStringMap("id.exerciseInfoId","exerciseInfoId","exerciseName","name","startTime","startTime", "endTime","endTime","type","type","subjectName","subjectName","score","score","studentScore","studentScore", "completeStatus","completeStatus","id.classId","classId","className","className")); return new Result(true,"",CollectionUtils.newObjectMap("stuExercises", listResult,"exerciseCount", totalCount)); } /** * 开始做作业 * * @param examId * @return */ @ApiOperation(value = "开始做作业", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "exerciseInfoId", value = "作业id", required = false, paramType="query", dataType = "String"), @ApiImplicitParam(name = "classId", value = "班级id", required = true, paramType="query", dataType = "String"), @ApiImplicitParam(name = "studentUserId", value = "userId", required = true, paramType="query", dataType = "String"), }) @RequestMapping(value = "/student/startexercise", method = RequestMethod.GET) public @ResponseBody Result doStartExercise(String exerciseInfoId, String classId,String studentUserId) { System.out.println(ClientUtils.getUserId()+"做作业"+ClientUtils.getClassName()+"aaa"+ClientUtils.getClassId()); if (StringUtils.isEmpty(exerciseInfoId)) { return new Result(false, "参数错误"); } if(StringUtils.isEmpty(studentUserId)){ studentUserId = ClientUtils.getUserId(); } return this.exerciseInfoService.doStartExerciseInfo(exerciseInfoId, StringUtils.isEmpty(classId)?ClientUtils.getClassId():classId,studentUserId); } /** * 提交文件和写作作业 * * @param examId * @return */ @ApiOperation(value = "提交文件和写作作业", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "exerciseCompleteInfoId", value = "提交记录id", required = false, paramType="query", dataType = "String"), @ApiImplicitParam(name = "content", value = "内容", required = true, paramType="query", dataType = "String"), @ApiImplicitParam(name = "fileId", value = "文件id", required = true, paramType="query", dataType = "String"), @ApiImplicitParam(name = "filePath", value = "文件路径", required = true, paramType="query", dataType = "String"), @ApiImplicitParam(name = "submitType", value = "提交方式(1:已提交作业,待批阅 2:已批阅 3:需重写 重写完后重新提交状态变为 1)", required = true, paramType="query", dataType = "short"), }) @RequestMapping(value = "/student/submitexercise", method = RequestMethod.POST) public @ResponseBody Result doSubmitFileExercise( @RequestParam(value = "exerciseCompleteInfoId") String completeInfoId, @RequestParam(value = "content") String content, @RequestParam(value = "fileId") String fileId, @RequestParam(value = "filePath") String filePath, @RequestParam(value = "submitType") short submitType) { if (StringUtils.isEmpty(completeInfoId)) { return new Result(false, "参数错误"); } return this.exerciseInfoService.doSubmitOtherExerciseInfo(completeInfoId, content, fileId, filePath,submitType); } /** * 提交答题作业 * * @param examId * @return * @throws IOException * @throws JsonMappingException * @throws JsonParseException */ @ApiOperation(value = "提交答题作业", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "exerciseCompleteInfoId", value = "提交记录id", required = false, paramType="query", dataType = "String"), @ApiImplicitParam(name = "exerciseInfoId", value = "作业id", required = false, paramType="query", dataType = "String"), @ApiImplicitParam(name = "answers", value = "答题内容", required = true, paramType="query", dataType = "String"), }) @RequestMapping(value = "/student/submitanswer", method = RequestMethod.POST) public @ResponseBody Result doSubmitAnswerExercise(@RequestParam(value = "answers") String answers, @RequestParam(value = "exerciseInfoId") String exerciseInfoId, @RequestParam(value = "exerciseCompleteId") String exerciseCompleteId) throws Exception { if (StringUtils.isEmpty(answers)) { return new Result(false, "参数错误"); } ExerciseSubmitAnswerData answerData = new ObjectMapper().readValue(answers, ExerciseSubmitAnswerData.class); return this.exerciseInfoService.doSubmitAnswerExerciseInfo(answerData, exerciseInfoId, exerciseCompleteId); } @ApiOperation(value = "老师阅卷") @ApiImplicitParams({@ApiImplicitParam(name="answerData", dataType="String", paramType="query", value="提交答案", required=true)}) @RequestMapping(value = "/teacher/check", method = RequestMethod.POST) public @ResponseBody Object doCheck(@RequestBody ExerciseSubmitAnswerData answerData) { return this.exerciseInfoService.doSubmitAnswerExerciseInfo(answerData, answerData.getExerciseInfoId(), answerData.getExerciseCompleteId()); } /** * 前端查看作业详情 * * @param examId * @return */ @ApiOperation(value = "查看学生作业详情", notes = "") @ApiImplicitParams({ @ApiImplicitParam(name = "exerciseCompleteInfoId", value = "提交记录id", required = false, paramType="query", dataType = "String"), @ApiImplicitParam(name = "classId", value = "班级id", required = false, paramType="query", dataType = "String"), @ApiImplicitParam(name = "studentUserId", value = "userId", required = true, paramType="query", dataType = "String"), }) @RequestMapping(value = "/student/detail", method = RequestMethod.GET) public @ResponseBody Result queryStudentExerciseDetail(String exerciseInfoId, String classId,String studentUserId) { if (StringUtils.isEmpty(exerciseInfoId)) { return new Result(false, "参数错误"); } Map detailMap = new HashMap(30); ExerciseInfo exerciseInfo = this.commonDAO.read(ExerciseInfo.class, exerciseInfoId); detailMap.putAll(QBeanUtils.bean2Map(exerciseInfo, CollectionUtils.newStringMap( "exerciseInfoId","exerciseInfoId", "score","totalScore","passingScore","passingScore","remind","remind","type","exerciseType", "creator","teacherName","name","exerciseName","startTime","startTime","endTime","endTime","subject.name","subjectName" ))); ExerciseCompleteInfo completeInfo = exerciseCompleteService.doCheckAndCreateExerciseCompleteInfo(exerciseInfoId, classId, studentUserId); if(completeInfo!=null){ detailMap.putAll(QBeanUtils.bean2Map(completeInfo,CollectionUtils.newStringMap( "exerciseCompleteId","exerciseCompleteId","studentScore","studentScore","submitTime", "submitTime","completeStatus","completeStatus","completeStatus","teacherComment","teacherComment" ))); } List> lstItemSet = null; if (((short) detailMap.get("exerciseType")) == ExerciseInfo.EXERCISE_TYPE_ANSWER) { lstItemSet = QBeanUtils.listBean2ListMap(exerciseInfoService.queryExerciseItemSet(exerciseInfoId), CollectionUtils.newStringMap("itemType","itemType","itemCount","itemCount")); int itemCount = 0; for (Map map : lstItemSet) { itemCount += (int) map.get("itemCount"); } detailMap.put("itemCount", itemCount); } return new Result(true,"",CollectionUtils.newObjectMap("detail", detailMap,"itemType", lstItemSet)); } /** * 初始化平均成绩和最高成绩 * * @param groupId * @return */ @RequestMapping(value = "initScore/{examId}", method = RequestMethod.GET) public @ResponseBody Map initScore(@PathVariable String exerciseInfoId) { Map map = this.exerciseInfoService.initScore(exerciseInfoId); return map; } /** * 每道题得分详情 * * @param groupId * @return */ @RequestMapping(value = "itemDetailList/{exerciseInfoId}", method = RequestMethod.GET) public @ResponseBody List scoreDetail(@PathVariable String exerciseInfoId) { List itemStatisLst = this.exerciseInfoService.itemDetailList(exerciseInfoId); return itemStatisLst; } }