package com.qxueyou.scc.exercise.service.impl; import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSON; import com.querydsl.core.types.Expression; import com.querydsl.core.types.dsl.CaseBuilder; import com.qxueyou.scc.admin.classes.model.ClsClass; import com.qxueyou.scc.admin.score.model.view.QHomeworkScoreV; import com.qxueyou.scc.base.dao.CommonRedisTemplate; import com.qxueyou.scc.base.model.Pager; import com.qxueyou.scc.base.model.Result; import com.qxueyou.scc.base.service.impl.CommonAppService; import com.qxueyou.scc.base.util.ClientUtils; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.DateTimeUtils; import com.qxueyou.scc.base.util.QBeanUtils; import com.qxueyou.scc.base.util.TraceUtils; import com.qxueyou.scc.base.util.UUIDUtils; import com.qxueyou.scc.exercise.model.ExerItemResponseData; import com.qxueyou.scc.exercise.model.ExerciseCompleteInfo; import com.qxueyou.scc.exercise.model.ExerciseDataSubmitLog; import com.qxueyou.scc.exercise.model.ExerciseExamReClass; import com.qxueyou.scc.exercise.model.ExerciseExamReGroup; import com.qxueyou.scc.exercise.model.ExerciseGroup; import com.qxueyou.scc.exercise.model.ExerciseInfo; import com.qxueyou.scc.exercise.model.ExerciseItem; import com.qxueyou.scc.exercise.model.ExerciseItemAnswerData; import com.qxueyou.scc.exercise.model.ExerciseItemSet; import com.qxueyou.scc.exercise.model.ExerciseItemStatistics; import com.qxueyou.scc.exercise.model.ExerciseRecord; import com.qxueyou.scc.exercise.model.ExerciseResultV; import com.qxueyou.scc.exercise.model.ExerciseSubmitAnswerData; import com.qxueyou.scc.exercise.model.QExerciseInfo; 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 com.qxueyou.scc.media.model.MediaVideo; import com.qxueyou.scc.media.service.IMediaVideoService; import com.qxueyou.scc.msg.model.MsgInfo; import com.qxueyou.scc.msg.service.IMsgInfoService; import com.qxueyou.scc.org.model.OrgText; import com.qxueyou.scc.org.service.IOrgTextService; import com.qxueyou.scc.school.model.HandoutConverTask; import com.qxueyou.scc.school.model.SchHandout; import com.qxueyou.scc.school.service.IHandoutService; import com.qxueyou.scc.teach.res.model.ResFile; /** * 考试 * * @author lihanqi * */ @Service public class ExerciseInfoService extends CommonAppService implements IExerciseInfoService { private final Logger log = LogManager.getLogger(ExerciseInfoService.class); private final String[] EXAM_TYPES = new String[] { "A", "B", "C", "D" }; /** 练习V2.0版本接口service */ @Autowired private IExerciseVerService exerciseVerService; @Autowired CommonRedisTemplate commonRedisTemplate; @Autowired IOrgTextService orgTextService; @Autowired IMediaVideoService mediaVideoService; @Autowired IHandoutService handoutService; @Autowired IMsgInfoService msgInfoService; @Autowired IExerciseCompleteService exerciseCompleteService; @Autowired IExerciseGroupService exerciseGroupService; @Override public List list(String keyword,String classId,Short status,Integer pageSize,Integer pageNum) { StringBuffer hql = new StringBuffer(500); hql.append("from ExerciseInfo e where e.name like ? and e.createId =? "); List params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId()); if(status!=null){ hql.append(" and e.status = ? "); params.add(status); } if(StringUtils.isNotEmpty(classId)){ hql.append(" and exists(select 1 from ExerciseExamReClass r where e.exerciseInfoId=r.examId and r.classId = ? and r.deleteFlag is false)"); params.add(classId); } hql.append(" and e.deleteFlag is false order by e.createTime desc"); return findList(hql.toString(),new Pager(pageSize, pageNum),params, ExerciseInfo.class); } @Override public int listCount(String keyword,String classId, Short status) { StringBuffer hql = new StringBuffer(500); hql.append("from ExerciseInfo e where e.name like ? and e.createId =? "); List params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId()); if(status!=null){ hql.append(" and e.status = ? "); params.add(status); } if(StringUtils.isNotEmpty(classId)){ hql.append(" and exists(select 1 from ExerciseExamReClass r where e.exerciseInfoId=r.examId and r.classId = ? and r.deleteFlag is false)"); params.add(classId); } hql.append(" and e.deleteFlag is false "); return findCount(hql.toString(),params); } /** * 保存作业 * * @return */ public Result insertExerciseInfo(ExerciseInfo exerciseInfo) { String[] classIds = QBeanUtils.listPropertyVal(exerciseInfo.getReClasses(), "classId").toArray(new String[exerciseInfo.getReClasses().size()]); String exerciseInfoId = UUIDUtils.generateUUID().replace("-", ""); exerciseInfo.setExerciseInfoId(exerciseInfoId); exerciseInfo.setOrgId(ClientUtils.getOrgId()); exerciseInfo.setClassCount(classIds == null ? 0 : classIds.length); exerciseInfo.setClassCount(exerciseInfo.getReClasses().size()); TraceUtils.setCreateTrace(exerciseInfo); this.save(exerciseInfo); if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER) { // 保存题目类型 List lstExerciseItemSet = exerciseInfo.getExerciseItemSets(); this.saveExerciseItemSet(exerciseInfoId,lstExerciseItemSet); //生成作业题目信息 String[] sourceGroupIds = QBeanUtils.listPropertyVal(exerciseInfo.getReGroups(), "groupId").toArray(new String[exerciseInfo.getReGroups().size()]); String newGroupId = this.exerciseGroupService.doCreateRandomExerciseGroup( exerciseInfo.getName() + "-作业",ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM,sourceGroupIds,lstExerciseItemSet); if(StringUtils.isEmpty(newGroupId)){ return new Result(false, "题目数据不够,请增加题库的题目或者减少试卷的题数",exerciseInfoId); } this.saveExerciseExamReGroup(exerciseInfoId,new String[]{newGroupId},EXAM_TYPES[0],ExerciseExamReGroup.GROUP_TYPE_EXAM); // 保存关联题库信息 this.saveExerciseExamReGroup(exerciseInfoId,sourceGroupIds,null,ExerciseExamReGroup.GROUP_TYPE_SOURCE); } // 保存关联班级 this.saveExerciseExamReClass(exerciseInfoId, classIds); return new Result(true, "", exerciseInfoId); } /** * 修改练习 * * @return */ public Result updateExerciseInfo(ExerciseInfo exerciseInfo) { String[] classIds = QBeanUtils.listPropertyVal(exerciseInfo.getReClasses(), "classId").toArray(new String[exerciseInfo.getReClasses().size()]); String exerciseInfoId = exerciseInfo.getExerciseInfoId(); ExerciseInfo newExerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId); newExerciseInfo.setScore(exerciseInfo.getScore()); newExerciseInfo.setClassCount(classIds == null ? 0 : classIds.length); newExerciseInfo.setEndTime(exerciseInfo.getEndTime()); newExerciseInfo.setName(exerciseInfo.getName()); newExerciseInfo.setDate(exerciseInfo.getDate()); newExerciseInfo.setStartTime(exerciseInfo.getStartTime()); newExerciseInfo.setSubjectId(exerciseInfo.getSubjectId()); newExerciseInfo.setRemind(exerciseInfo.getRemind()); newExerciseInfo.setPassingScore(exerciseInfo.getPassingScore()); newExerciseInfo.setCommitUploadType(exerciseInfo.getCommitUploadType()); TraceUtils.setUpdateTrace(newExerciseInfo); this.save(newExerciseInfo); //清理旧关系数据 this.doClearExerciseExamReData(exerciseInfoId); // 答题作业默认按照统一卷生成作业题目 if (newExerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER) { // 保存题目类型 List lstExerciseItemSet = exerciseInfo.getExerciseItemSets(); saveExerciseItemSet(exerciseInfoId,lstExerciseItemSet); //生成作业题目信息 String[] groupIds = QBeanUtils.listPropertyVal(exerciseInfo.getReGroups(), "groupId").toArray(new String[exerciseInfo.getReGroups().size()]); String newGroupId = this.exerciseGroupService.doCreateRandomExerciseGroup( exerciseInfo.getName() + "-作业",ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM,groupIds, lstExerciseItemSet); if(StringUtils.isEmpty(newGroupId)){ return new Result(false, "题目数据不够,请增加题库的题目或者减少试卷的题数"); } this.saveExerciseExamReGroup(exerciseInfoId,new String[]{newGroupId},EXAM_TYPES[0],ExerciseExamReGroup.GROUP_TYPE_EXAM); // 保存关联题库信息 this.saveExerciseExamReGroup(exerciseInfoId,groupIds,null,ExerciseExamReGroup.GROUP_TYPE_SOURCE); } // 保存关联班级 this.saveExerciseExamReClass(exerciseInfoId, classIds); return new Result(true, "", exerciseInfoId); } //清除之前的练习关联关系数据 private void doClearExerciseExamReData(String exerciseInfoId){ this.bulkUpdate("update ExerciseExamReGroup set deleteFlag = 1 where examId = ?",new Object[]{exerciseInfoId}); this.bulkUpdate("update ExerciseExamReClass set deleteFlag = 1 where examId = ?",new Object[] {exerciseInfoId}); this.bulkUpdate("update ExerciseItemSet set deleteFlag = 1 where exerciseInfoId = ?",new Object[]{exerciseInfoId}); } private void saveExerciseExamReClass(String exerciseInfoId,String[] classIds){ ExerciseExamReClass reClass = null; for (String classId : classIds) { reClass = new ExerciseExamReClass(); reClass.setClassId(classId); reClass.setDeleteFlag(false); reClass.setExamId(exerciseInfoId); TraceUtils.setCreateTrace(reClass); this.save(reClass); } } private void saveExerciseExamReGroup(String exerciseInfoId, String [] groupIds,String examType,short reType){ ExerciseExamReGroup reGroup = null; for (String groupId : groupIds) { reGroup = new ExerciseExamReGroup(); reGroup.setGroupId(groupId); reGroup.setDeleteFlag(false); reGroup.setExamType(examType); reGroup.setType(reType); reGroup.setExamId(exerciseInfoId); TraceUtils.setCreateTrace(reGroup); this.save(reGroup); } } private void saveExerciseItemSet(String exerciseInfoId,List lstExerciseItemSet){ for (ExerciseItemSet itemSet : lstExerciseItemSet) { itemSet.setExerciseInfoId(exerciseInfoId); TraceUtils.setCreateTrace(itemSet); this.save(itemSet); } } /** * 删除作业 * * @param examId * @return */ @Override public Result deleteExerciseInfo(String exerciseInfoIds) { return bulkUpdateInLoop("update ExerciseInfo set deleteFlag = true where exerciseInfoId=?",exerciseInfoIds.split(",")); } @Override public String queryExerciseInfoRelatedGroupId(String exerciseInfoId) { return this.findUnique("select groupId from ExerciseExamReGroup where examId=? and type=? and deleteFlag is false ", CollectionUtils.newList(exerciseInfoId, ExerciseExamReGroup.GROUP_TYPE_EXAM),String.class); } @Override public List queryExerciseItemSet(String exerciseInfoId){ return this.find("from ExerciseItemSet where exerciseInfoId=? and deleteFlag is false order by itemType ASC", CollectionUtils.newList(exerciseInfoId), ExerciseItemSet.class); } @Override public List queryStuExerciselist(String keyword,String exerciseInfoId,String userId,String subjectId,Short status,Integer pageSize,Integer pageNum) { StringBuffer hql = new StringBuffer(500); hql.append("from ExerciseResultV where exerciseStatus=?"); List params = CollectionUtils.newList(ExerciseInfo.EXERCISE_STATUS_PUBLISHED); if(!StringUtils.isEmpty(userId)){ hql.append(" and userId=? "); params.add(userId); } if(!StringUtils.isEmpty(exerciseInfoId)){ hql.append(" and id.exerciseInfoId=?"); params.add(exerciseInfoId); } if(!StringUtils.isEmpty(keyword)){ hql.append(" and studentName like ?"); params.add("%" + keyword.trim() + "%"); } if(!StringUtils.isEmpty(subjectId)){ hql.append(" and subjectId=?"); params.add(subjectId); } //默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交 if(status!=null){ Date nowTime = new Date(); if(status==0){ hql.append(" and startTime<=? and endTime>? and (completeStatus=? or completeStatus is null)"); params.add(nowTime); params.add(nowTime); params.add(ExerciseCompleteInfo.STATUS_DRAFT); }else if (status==1){ hql.append(" and completeStatus=? "); params.add(ExerciseCompleteInfo.STATUS_COMMIT); }else if (status==2){ hql.append(" and completeStatus=? "); params.add(ExerciseCompleteInfo.STATUS_CHECKED); }else if (status==3){ hql.append(" and completeStatus=? "); params.add(ExerciseCompleteInfo.STATUS_REDO); }else if (status==4){ hql.append(" and endTime<=? and (completeStatus=? or completeStatus is null)"); params.add(nowTime); params.add(ExerciseCompleteInfo.STATUS_DRAFT); } } hql.append(" order by startTime desc"); return this.findList(hql.toString(),new Pager(pageSize, pageNum),params, ExerciseResultV.class); } @Override public int queryStuExerciseListCount(String keyword,String exerciseInfoId,String userId,String subjectId,Short status) { StringBuffer hql = new StringBuffer(500); hql.append("from ExerciseResultV where exerciseStatus=?"); List params = CollectionUtils.newList(ExerciseInfo.EXERCISE_STATUS_PUBLISHED); if(!StringUtils.isEmpty(userId)){ hql.append(" and userId=? "); params.add(userId); } if(!StringUtils.isEmpty(exerciseInfoId)){ hql.append(" and id.exerciseInfoId=?"); params.add(exerciseInfoId); } if(!StringUtils.isEmpty(keyword)){ hql.append(" and studentName like ?"); params.add("%" + keyword.trim() + "%"); } if(!StringUtils.isEmpty(subjectId)){ hql.append(" and subjectId=?"); params.add(subjectId); } //默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交 if(status!=null){ Date nowTime = new Date(); if(status==0){ hql.append(" and startTime<=? and endTime>? and (completeStatus=? or completeStatus is null)"); params.add(nowTime); params.add(nowTime); params.add(ExerciseCompleteInfo.STATUS_DRAFT); }else if (status==1){ hql.append(" and completeStatus=? "); params.add(ExerciseCompleteInfo.STATUS_COMMIT); }else if (status==2){ hql.append(" and completeStatus=? "); params.add(ExerciseCompleteInfo.STATUS_CHECKED); }else if (status==3){ hql.append(" and completeStatus=? "); params.add(ExerciseCompleteInfo.STATUS_REDO); }else if (status==4){ hql.append(" and endTime<=? and (completeStatus=? or completeStatus is null)"); params.add(nowTime); params.add(ExerciseCompleteInfo.STATUS_DRAFT); } } return this.findCount(hql.toString(), params); } /** * 初始化平均成绩和最高成绩 * * @param groupId * @return */ @Override public Map initScore(String exerciseInfoId) { ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId); Map map = new HashMap(1); map.put("groupName", exerciseInfo.getName()); return map; } /** * 题目得分详情 * * @param groupId * @return */ @Override public List itemDetailList(String examId) { String hql_itemStatis = "from ExerciseItemStatistics where deleteFlag is false and groupId in " + "( select c.groupId from ExerciseExamReGroup c where c.examId = ? and c.type = ? and c.deleteFlag is false )"; List itemStatisLst = this.find(hql_itemStatis, CollectionUtils.newList(examId, ExerciseExamReGroup.GROUP_TYPE_EXAM), ExerciseItemStatistics.class); if (itemStatisLst.isEmpty()) { return new ArrayList(); } // 默认章节练习 String hql = "select item from ExerciseItem item,ExerciseGroupItemRe re where re.exerciseGroupId in(" + " select c.groupId from ExerciseExamReGroup c where c.examId = ? and c.type = ? and c.deleteFlag is false)" + "and re.exerciseItemId=item.exerciseId and item.deleteFlag is false " + "and re.deleteFlag is false order by re.itemOrder "; // 查询当前组的所有题目 List itemAllLst = this.find(hql, CollectionUtils.newList(examId, ExerciseExamReGroup.GROUP_TYPE_EXAM), ExerciseItem.class); if (itemAllLst.isEmpty()) { return new ArrayList(); } // 同步编号 List listResult = new ArrayList(itemStatisLst.size()); ExerciseItemStatistics obj = null; for (int j = 0; j < itemAllLst.size(); j++) { for (int i = 0; i < itemStatisLst.size(); i++) { obj = itemStatisLst.get(i); if (obj.getExerciseItemId().equals(itemAllLst.get(j).getExerciseId())) { obj.setItemNo(j + 1); obj.setClassAccuracyShow(obj.getClassAccuracy() + "%"); obj.setOrgAccuracyShow(obj.getOrgAccuracy() + "%"); // 给类型赋值 setExerItemTypeNewName(obj); listResult.add(obj); break; } } } return listResult; } private void setExerItemTypeNewName(ExerciseItemStatistics obj) { // 判断类型文字显示 if (obj.getExerciseItemType() == ExerciseItem.TYPE_SINGLE_SELECT) { obj.setItemTypeName("单选题"); } else if (obj.getExerciseItemType() == ExerciseItem.TYPE_MULTI_SELECT) { obj.setItemTypeName("多选题"); } else if (obj.getExerciseItemType() == ExerciseItem.TYPE_TRUE_OR_FALSE) { obj.setItemTypeName("判断题"); } else if (obj.getExerciseItemType() == ExerciseItem.TYPE_ESSAY_QUESTION) { obj.setItemTypeName("问答题"); } } /** * 开始题目作业 * * @param examId * @return */ public Result doStartExerciseInfo(String exerciseInfoId, String classId, String studentUserId) { ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId); ClsClass clsClass = this.read(ClsClass.class, classId); return exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER? this.doStartAnswerExercise(exerciseInfo, clsClass, studentUserId) : this.doStartOtherExercise(exerciseInfo, clsClass, studentUserId); } /** * 开始题目作业 * * @param examId * @return */ private Result doStartAnswerExercise(ExerciseInfo exerciseInfo, ClsClass clsClass, String studentUserId) { Result result = new Result(true); // 正在做题数 ExerciseRecord record = this.findUnique( "select r from ExerciseRecord r where r.deleteFlag is false and r.userId = ? and r.exerciseGroupId in" + " (select g.groupId from ExerciseExamReGroup g where g.examId = ? and g.deleteFlag is false and g.type = ?)", CollectionUtils.newList(StringUtils.isNotEmpty(studentUserId) ? studentUserId : ClientUtils.getUserId(), exerciseInfo.getExerciseInfoId(), ExerciseExamReGroup.GROUP_TYPE_EXAM),ExerciseRecord.class); if (record == null) { // 获取分组练习 String groupId = this.findUnique( "select g.groupId from ExerciseExamReGroup g where g.examId = ? and g.deleteFlag is false and g.type = ?", CollectionUtils.newList(exerciseInfo.getExerciseInfoId(), ExerciseExamReGroup.GROUP_TYPE_EXAM), String.class); if (StringUtils.isEmpty(groupId)) { return new Result(false, "开始作业获取题目失败"); } Map recordResult = this.insertExerRecord(exerciseInfo,groupId); // 生成做题记录 record = (ExerciseRecord) recordResult.get("record"); } // 获取结果 ExerItemResponseData responseData = exerciseVerService.queryExerItemResponseData(record.getExerciseGroupId(), record.getRecordId(), true, true, ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM); responseData.setExerciseRecordId(record.getRecordId()); responseData.setExerciseGroupId(record.getExerciseGroupId()); responseData.setStatus(record.getStatus()); result.addData("exerItem", responseData); // 如果已提交就查询用户答案信息 // if (Integer.valueOf(record.getStatus()) > 0) { result.addData("userAnswers", this.findListWithMapByHql( "select u.answerUId as answerUId, u.exerciseItemId as exerciseId,u.answer as answer,u.correct as correct,i.type as type,u.teacherScore as teacherScore" + " from ExerciseItemAnswerU u,ExerciseItem i where u.exerciseItemId = i.exerciseId and u.exerciseRecordId=:recordId and u.deleteFlag is false order by u.createTime asc ", CollectionUtils.newObjectMap("recordId", record.getRecordId()))); // 查询学生考试总分 result.addData("studentScore", record.getScore()); result.addData("objStudentScore", record.getObjScore()==null?BigDecimal.ZERO:record.getObjScore()); ExerciseCompleteInfo completeInfo = doGetOrCreateExerciseCompleteInfo(exerciseInfo.getExerciseInfoId(),clsClass.getClassId() , studentUserId); if(completeInfo!=null){ result.addData("exerciseCompleteId", completeInfo.getExerciseCompleteId()); } result.addData("itemSet", exerciseInfo.getExerciseItemSets()); return result; } private ExerciseCompleteInfo doGetOrCreateExerciseCompleteInfo(String exerciseInfoId,String classId,String studentUserId){ // 判断是否已经初始化 ExerciseCompleteInfo completeInfo = exerciseCompleteService.queryCompleteInfo(exerciseInfoId,classId , studentUserId); if(completeInfo==null){ String hql = " select s.studentId as studentId,s.studentNo as studentNo,s.userId as studentUserId,s.name as studentName," + " c.classId as classId,c.name as className from StuStudent s ,ClsClass c,ExerciseExamReClass r " + " where r.examId=:exerciseInfoId and r.classId =c.classId and c.classId= s.classId and s.userId=:userId" + " and s.classId=:classId and r.examId=:exerciseInfoId and r.deleteFlag is false and s.deleteFlag is false and c.deleteFlag is false"; List> resultMap = this.findListWithMapByHql(hql, CollectionUtils.newObjectMap("userId",studentUserId,"classId",classId,"exerciseInfoId",exerciseInfoId)); if(resultMap!=null && resultMap.get(0)!=null){ Map map = resultMap.get(0); completeInfo = new ExerciseCompleteInfo(); TraceUtils.setCreateTrace(completeInfo); completeInfo.setStudentId((String) map.get("studentId")); completeInfo.setStudentNo((String) map.get("studentNo")); completeInfo.setStudentUserId((String) map.get("studentUserId")); completeInfo.setStudentUserName((String) map.get("studentName")); completeInfo.setClassId((String) map.get("classId")); completeInfo.setClassName((String) map.get("className")); completeInfo.setExerciseInfoId(exerciseInfoId); completeInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_DRAFT); this.save(completeInfo); } } return completeInfo; } private Map insertExerRecord(ExerciseInfo exerciseInfo,String groupId) { ExerciseRecord record = new ExerciseRecord(); record.setDeleteFlag(false); record.setExerciseGroupId(groupId); record.setDoCount(BigInteger.ZERO); record.setCorrectCount(BigInteger.ZERO); record.setTitleMaxNumber("0"); record.setStatus("0"); record.setScore(BigDecimal.ZERO); record.setUserId(ClientUtils.getUserId()); record.setOrgId(ClientUtils.getOrgId()); TraceUtils.setCreateTrace(record); //获取考试题目统计信息,并保存 Map result = this.queryItemStatics(exerciseInfo.getExerciseItemSets()); record.setTotalScore(new BigDecimal(exerciseInfo.getScore())); record.setPassingScore(exerciseInfo.getPassingScore()); record.setSubTotalScore((BigDecimal)result.get("subTotalScore")); record.setObjTotalScore((BigDecimal)result.get("objTotalScore")); record.setSubItemCount((int)result.get("subItemCount")); record.setObjItemCount((int)result.get("objItemCount")); TraceUtils.setCreateTrace(record); this.save(record); Map resultMap = new HashMap(3); resultMap.put("exerciseRecordId", record.getRecordId()); resultMap.put("updateTime", DateTimeUtils.getCurrDateTime(record.getUpdateTime())); resultMap.put("exerciseGroupId", groupId); resultMap.put("record", record); return resultMap; } private Map queryItemStatics(List itemSets){ float subTotalScore = 0,objTotalScore=0; int subItemCount=0,objItemCount=0; //如果是随机组卷 if(itemSets!=null && itemSets.size()>0){ for(ExerciseItemSet s:itemSets){ if(s.getItemType()==ExerciseItem.TYPE_ESSAY_QUESTION){ subTotalScore+= s.getItemCount()*s.getRightScore(); subItemCount+=s.getItemCount(); }else{ objTotalScore += s.getItemCount()*s.getRightScore(); objItemCount += s.getItemCount(); } } } Map result = new HashMap(); result.put("subTotalScore", new BigDecimal(subTotalScore)); result.put("objTotalScore", new BigDecimal(objTotalScore)); result.put("subItemCount", subItemCount); result.put("objItemCount", objItemCount); return result; } /** * 开始文件和写作作业 * * @param examId * @return */ private Result doStartOtherExercise(ExerciseInfo exerciseInfo, ClsClass clsClass, String studentUserId) { // 查询是否已经存在做题记录,如果不存在需要新建 ExerciseCompleteInfo exerciseCompleteInfo = exerciseCompleteService.doCheckAndCreateExerciseCompleteInfo( exerciseInfo.getExerciseInfoId(), clsClass.getClassId(), studentUserId); exerciseCompleteInfo.setCommitUploadType(exerciseInfo.getCommitUploadType()); exerciseCompleteInfo.setRemind(exerciseInfo.getRemind()); exerciseCompleteInfo.setExerciseType(exerciseInfo.getType()); exerciseCompleteInfo.setExerciseName(exerciseInfo.getName()); exerciseCompleteInfo.setContent(exerciseCompleteInfo.getUploadDesc()); if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_VIDEO || exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) { if (StringUtils.isNotEmpty(exerciseCompleteInfo.getTargetObjectId())) { MediaVideo video = this.read(MediaVideo.class, exerciseCompleteInfo.getTargetObjectId()); if (video.getStatus() == MediaVideo.STATUS_DRAFT) { exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_OK); exerciseCompleteInfo .setPreviewPath(StringUtils.isNotEmpty(video.getAndroidHD()) ? video.getAndroidHD() : StringUtils.isNotEmpty(video.getAndroidSD()) ? video.getAndroidSD() : video.getAndroidLD()); } else { exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_NO); } } } if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_DOC) { if (StringUtils.isNotEmpty(exerciseCompleteInfo.getTargetObjectId())) { SchHandout handout = this.read(SchHandout.class, exerciseCompleteInfo.getTargetObjectId()); if (handout.getStatus() == SchHandout.STATUS_DRAFT) { exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_OK); exerciseCompleteInfo.setPreviewPath(handout.getFullPath()); } else { exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_NO); } } } if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_WRITING && StringUtils.isNotEmpty(exerciseCompleteInfo.getTargetObjectId())) { exerciseCompleteInfo.setContent(this.orgTextService .getOrgText(exerciseCompleteInfo.getExerciseCompleteId(), OrgText.TABLE_WRITING_EXERCISE) .getContent()); } exerciseCompleteInfo.setTotalScore(exerciseInfo.getScore()); return new Result(true,"",CollectionUtils.newObjectMap("exerciseCompleteInfo", exerciseCompleteInfo)); } @Override public Result doSubmitOtherExerciseInfo(String exerciseCompleteInfoId, String content, String fileId, String filePath, short submitType) { Result result = new Result(true); ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId); ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseCompleteInfo.getExerciseInfoId()); if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_WRITING) { result = this.doSubmitWritingExerciseInfo(exerciseCompleteInfoId, content, submitType); } else if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_FILE) { result = this.doSubmitFileExerciseInfo(exerciseCompleteInfoId, content, fileId, filePath, submitType); } return result; } /** * 提交写作作业 * * @param exerciseInfoId * @param content * @param submitType * @return */ private Result doSubmitWritingExerciseInfo(String exerciseCompleteInfoId, String content, short submitType) { ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId); // 保存到orgtext if (StringUtils.isEmpty(exerciseCompleteInfo.getTargetObjectId())) { Result result = orgTextService.doInsertOrgText(exerciseCompleteInfoId, OrgText.TABLE_WRITING_EXERCISE, content); exerciseCompleteInfo.setTargetObjectId((String)result.getData("orgTextId")); } else { OrgText orgText = orgTextService.getOrgText(exerciseCompleteInfoId, OrgText.TABLE_WRITING_EXERCISE); orgText.setContent(content); orgText.setCreator(ClientUtils.getUserName()); this.save(orgText); } if (submitType > 0) { exerciseCompleteInfo.setSubmitTime(new Date()); exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_COMMIT); exerciseCompleteInfo.setCreator(ClientUtils.getUserName()); } this.save(exerciseCompleteInfo); return new Result(true); } /** * 提交文件作业 * * @param exerciseCompleteInfoId * @param content * @param fileId * @param filePath * @param submitType * @return */ private Result doSubmitFileExerciseInfo(String exerciseCompleteInfoId, String content, String fileId, String filePath, short submitType) { ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId); ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseCompleteInfo.getExerciseInfoId()); String targetObjectId = null; if (submitType > 0) { exerciseCompleteInfo.setSubmitTime(new Date()); exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_COMMIT); } TraceUtils.setUpdateTrace(exerciseCompleteInfo); if (StringUtils.isNotEmpty(fileId)) { ResFile resFile = this.read(ResFile.class, fileId); exerciseCompleteInfo.setFileId(fileId); exerciseCompleteInfo.setFilePath(filePath); exerciseCompleteInfo.setOrgiFileName(resFile.getFileName()); } exerciseCompleteInfo.setUploadDesc(content); // 判断作业提交类型,不同提交类型保存到不同地方 if (StringUtils.isNotEmpty(fileId)) { String fileType = filePath.substring(filePath.lastIndexOf(".")); String fileName = filePath.substring(filePath.lastIndexOf("/")); if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_VIDEO || exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) { if (!exerciseCompleteInfo.getFilePath().equals("filePath")) { MediaVideo mediaVideo = new MediaVideo(); TraceUtils.setCreateTrace(mediaVideo); mediaVideo.setUrl(filePath); mediaVideo.setOrigUrl(filePath); mediaVideo.setName(fileName); mediaVideo.setFormat(fileType); if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_VIDEO) { mediaVideo.setType(MediaVideo.MEDIA_VIDEO); } else if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) { mediaVideo.setType(MediaVideo.MEDIA_AUDIO); } if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) { mediaVideo.setStatus(MediaVideo.STATUS_DRAFT); } else { mediaVideo.setStatus(MediaVideo.STATUS_LINEUP); } this.save(mediaVideo); targetObjectId = mediaVideo.getVideoId(); mediaVideoService.insertVideoConverTask(mediaVideo); } } else if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_DOC) { if (!exerciseCompleteInfo.getFilePath().equals("filePath")) { SchHandout handout = new SchHandout(); handout.setClassId(exerciseCompleteInfo.getClassId()); handout.setName(fileName); handout.setStatus(SchHandout.STATUS_PROCESSING); handout.setFullPath(filePath); handout.setOrigPath(filePath); TraceUtils.setCreateTrace(handout); this.save(handout); targetObjectId = handout.getHandoutId(); if (!"PDF".equals(fileType.toUpperCase())) { // 添加到讲义转码队列表 HandoutConverTask task = new HandoutConverTask(); task.setCreateTime(new Date(System.currentTimeMillis())); task.setUpdateTime(new Date(System.currentTimeMillis())); task.setDeleteFlag(false); task.setHandoutId(handout.getHandoutId()); task.setHandoutUrl(filePath); task.setStatus(0); this.save(task); } } } } if (StringUtils.isNotEmpty(targetObjectId)) { exerciseCompleteInfo.setTargetObjectId(targetObjectId); } this.save(exerciseCompleteInfo); return new Result(true); } @Override public Result doSubmitAnswerExerciseInfo(ExerciseSubmitAnswerData answerData, String exerciseInfoId, String exerciseCompleteId) { Result result = new Result(true); // 用户本次做题提交的数据 List lstAnswers = null; String initRecordId = null; ExerciseCompleteInfo exerciseCompleteInfo = null; ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId); try { // 提交记录id initRecordId = answerData.getExerciseRecordId(); lstAnswers = answerData.getItems(); if (lstAnswers.isEmpty() && !ExerciseRecord.STATUS_SUBMIT.equals(answerData.getStatus())) { exerciseVerService.doSaveExerciseDataSubmitLog(JSON.toJSONString(answerData), initRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_FAILED, "/exercise/Exercise/exerAnswers"); return new Result(false, "提交数据异常"); } ExerciseRecord record = this.read(ExerciseRecord.class, initRecordId); //计算得分 double studentScore = this.doCalculateExerciseScores(answerData, exerciseInfo.getExerciseItemSets()); // 提交试卷答案 answerData.setScore(new BigDecimal(studentScore)); Map resultMap = exerciseVerService.doOperExerciseAnswerData(answerData); // 更新得分记录及状态 exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteId); resultMap.put("studentScore", studentScore); // 更新完成得分 if (ExerciseRecord.STATUS_SUBMIT.equals(answerData.getStatus())) { resultMap.put("objScore", studentScore); exerciseCompleteInfo.setSubmitTime(new Date()); if(record.getSubItemCount()==0){ exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_CHECKED); }else{ exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_COMMIT); } this.bulkUpdate( "update ExerciseRecord set status=1 , score=" + studentScore + ",objScore=" + studentScore + " where deleteFlag is false and recordId=?", new Object[] { resultMap.get("recordId") }); }if (ExerciseRecord.STATUS_CHECK.equals(answerData.getStatus())) { exerciseCompleteInfo.setSubmitTime(new Date()); exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_CHECKED); this.bulkUpdate( "update ExerciseRecord set status=3 , score=" + studentScore + ",objScore=" + studentScore + " where deleteFlag is false and recordId=?", new Object[] { resultMap.get("recordId") }); } else { this.bulkUpdate( "update ExerciseRecord set score=" + studentScore+ ",objScore=" + studentScore + " where deleteFlag is false and recordId=? ", new Object[] { resultMap.get("recordId") }); } exerciseCompleteInfo.setStudentScore(new BigDecimal(studentScore)); this.save(exerciseCompleteInfo); // 记录提交的数据日志 exerciseVerService.doSaveExerciseDataSubmitLog(JSON.toJSONString(answerData), initRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_SUCCESS, "/exercise/Exercise/exerAnswers"); result = new Result(true, "答案提交成功"); result.setData(resultMap); } catch (Exception e) { log.error("考试保存错误", e); result = new Result(false, "提交练习答案请求异常"); exerciseVerService.doSaveExerciseDataSubmitLog(JSON.toJSONString(answerData), initRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_FAILED, "/exercise/Exercise/exerAnswers"); } return result; } private double doCalculateExerciseScores(ExerciseSubmitAnswerData answerData, List lstItemSet) { //获取填空题答案信息 Map exerciseFillItemMap= null; List lstObj = this.find("select i.exerciseId,i.answer from ExerciseGroupItemRe r, ExerciseItem i where r.exerciseItemId=i.exerciseId and r.exerciseGroupId=? and r.deleteFlag is false and i.type=? and i.deleteFlag is false", CollectionUtils.newList(answerData.getExerciseGroupId(),ExerciseItem.TYPE_FILL_BLANKS), Object[].class); if(lstObj!=null && lstObj.size()>0){ exerciseFillItemMap = new HashMap(lstObj.size()); for(Object[] arrObj : lstObj){ exerciseFillItemMap.put((String)arrObj[0],(String)arrObj[1]); } } Map scoreMap = new HashMap(); for (int i = 0; i < lstItemSet.size(); i++) { if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_SINGLE_SELECT) { scoreMap.put("single_right", lstItemSet.get(i).getRightScore()); scoreMap.put("single_wrong", lstItemSet.get(i).getWrongScore()); scoreMap.put("single_noanswer", lstItemSet.get(i).getBlankScore()); } else if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_MULTI_SELECT) { scoreMap.put("multi_right", lstItemSet.get(i).getRightScore()); scoreMap.put("multi_wrong", lstItemSet.get(i).getWrongScore()); scoreMap.put("multi_noanswer", lstItemSet.get(i).getBlankScore()); } else if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_TRUE_OR_FALSE) { scoreMap.put("judge_right", lstItemSet.get(i).getRightScore()); scoreMap.put("judge_wrong", lstItemSet.get(i).getWrongScore()); scoreMap.put("judeg_noanswer", lstItemSet.get(i).getBlankScore()); }else if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_FILL_BLANKS) { scoreMap.put("fill_right", lstItemSet.get(i).getRightScore()); scoreMap.put("fill_wrong", lstItemSet.get(i).getWrongScore()); scoreMap.put("fill_noanswer", lstItemSet.get(i).getBlankScore()); } } double totalScore = 0.00; String tempRightAnswer =null; BigDecimal tempScore = BigDecimal.ZERO; if (answerData.getItems() != null && answerData.getItems().size() > 0) { for (ExerciseItemAnswerData data : answerData.getItems()) { if (Integer.valueOf(data.getCorrect()) > 0) { if (data.getType() == ExerciseItem.TYPE_SINGLE_SELECT) { totalScore += scoreMap.get("single_right"); } else if (data.getType() == ExerciseItem.TYPE_MULTI_SELECT) { totalScore += scoreMap.get("multi_right"); } else if (data.getType() == ExerciseItem.TYPE_TRUE_OR_FALSE) { totalScore += scoreMap.get("judge_right"); }else if (data.getType() == ExerciseItem.TYPE_FILL_BLANKS) { if(exerciseFillItemMap!=null && exerciseFillItemMap.size()>0){ tempRightAnswer = exerciseFillItemMap.get(data.getExerciseId()); } tempScore = this.exerciseVerService.calFillBlanksItemScore(tempRightAnswer,data.getAnswer(), scoreMap.get("fill_right").floatValue()); data.setTeacherScore(tempScore.toPlainString()); totalScore += tempScore.doubleValue(); }else if (data.getType() == ExerciseItem.TYPE_ESSAY_QUESTION) { if(StringUtils.isNotEmpty(data.getTeacherScore())){ tempScore = new BigDecimal(data.getTeacherScore()); }else{ tempScore = BigDecimal.ZERO; } totalScore += tempScore.doubleValue(); } } else { if (data.getType() == ExerciseItem.TYPE_SINGLE_SELECT) { totalScore += scoreMap.get("single_wrong"); } else if (data.getType() == ExerciseItem.TYPE_MULTI_SELECT) { totalScore += scoreMap.get("multi_wrong"); } else if (data.getType() == ExerciseItem.TYPE_TRUE_OR_FALSE) { totalScore += scoreMap.get("judge_wrong"); }else if (data.getType() == ExerciseItem.TYPE_FILL_BLANKS) { if(exerciseFillItemMap!=null && exerciseFillItemMap.size()>0){ tempRightAnswer = exerciseFillItemMap.get(data.getExerciseId()); } tempScore = this.exerciseVerService.calFillBlanksItemScore(tempRightAnswer,data.getAnswer(), scoreMap.get("fill_right").floatValue()); data.setTeacherScore(tempScore.toPlainString()); totalScore += tempScore.doubleValue(); }else if (data.getType() == ExerciseItem.TYPE_ESSAY_QUESTION) { if(StringUtils.isNotEmpty(data.getTeacherScore())){ tempScore = new BigDecimal(data.getTeacherScore()); }else{ tempScore = BigDecimal.ZERO; } totalScore += tempScore.doubleValue(); } } } } return totalScore; } @Override public Result doPublishExercise(String[] exerciseIds) { // 更新作业状态 this.bulkUpdateInLoop("update ExerciseInfo set status=" + ExerciseInfo.EXERCISE_STATUS_PUBLISHED + " WHERE exerciseInfoId=?",exerciseIds); // 初始化作业完成记录 String hql = null; List> students = null; ExerciseCompleteInfo temp = null; List lstCompleteInfos = null; for (String exerciseId : exerciseIds) { // 判断是否已经初始化,如果已经初始化则继续 -> TODO:需要处理新加入班级学生 int count = this.findCount("from ExerciseCompleteInfo f where f.deleteFlag is false and f.exerciseInfoId=?",CollectionUtils.newList(exerciseId)); if (count == 0) { hql = " select s.studentId as studentId,s.studentNo as studentNo,s.userId as studentUserId,s.name as studentName,c.classId as classId,c.name as className " + " from StuStudent s ,ClsClass c,ExerciseExamReClass r where r.examId=:exerciseInfoId " + " and r.classId =c.classId and c.classId= s.classId and r.deleteFlag is false and s.deleteFlag is false"; students = this.findListWithMapByHql(hql, CollectionUtils.newObjectMap("exerciseInfoId", exerciseId)); if (students != null && students.size() > 0) { lstCompleteInfos = new ArrayList(); for (Map obj : students) { temp = new ExerciseCompleteInfo(); TraceUtils.setCreateTrace(temp); temp.setStudentId((String) obj.get("studentId")); temp.setStudentNo((String) obj.get("studentNo")); temp.setStudentUserId((String) obj.get("studentUserId")); temp.setStudentUserName((String) obj.get("studentName")); temp.setClassId((String) obj.get("classId")); temp.setClassName((String) obj.get("className")); temp.setExerciseInfoId(exerciseId); temp.setCompleteStatus(ExerciseCompleteInfo.STATUS_DRAFT); lstCompleteInfos.add(temp); } this.saveOrUpdateAll(lstCompleteInfos); } } //发布作业消息 this.doExercisePublishMsg(exerciseId); } return new Result(true); } private void doExercisePublishMsg(String exerciseInfoId){ ExerciseInfo exerciseInfo= this.read(ExerciseInfo.class, exerciseInfoId); List lstUserIds = this.find("select userId from ExerciseResultV where id.exerciseInfoId=?", CollectionUtils.newList(exerciseInfoId), String.class); if(lstUserIds!=null && lstUserIds.size()>0){ Map attrs = CollectionUtils.newStringMap("exerciseInfoId",exerciseInfoId,"exerciseName",exerciseInfo.getName(), "subjectId",exerciseInfo.getSubjectId(),"subjectName",exerciseInfo.getSubject().getName()); msgInfoService.doSendTextMsgToUsers(lstUserIds.toArray(new String[lstUserIds.size()]), MsgInfo.TYPE_EXERCISE," 发布了作业 ", attrs); } } @Override public Result doRevokeExercise(String[] exerciseIds) { // 更新作业状态 this.bulkUpdateInLoop("update ExerciseInfo set status=" + ExerciseInfo.EXERCISE_STATUS_DRAFT + " WHERE exerciseInfoId=?",exerciseIds); // 清除作业完成情况 this.bulkUpdateInLoop("update ExerciseCompleteInfo set deleteFlag= true WHERE exerciseInfoId=?", exerciseIds); return new Result(true); } /** * 获取逾期未交的作业 */ @Override public int getUnCommitExerciseCount(String classId, String userId) { String sql = "SELECT c.exercise_info_id, c. NAME, c.start_time, c.end_time, c.type," + "c.score, d.student_score, d.complete_status, c.class_id, c.className " + "FROM ( SELECT f.exercise_info_id, f. NAME, f.start_time, f.end_time, " + "f.create_time, f.type, f.score, s.class_id, s.`NAME` AS className " + "FROM exercise_info f, exercise_exam_re_class r, cls_class s WHERE " + "r.exam_id = f.exercise_info_id AND r.class_id = s.class_id AND " + "r.class_id =:classId AND f. STATUS = 1 AND r.delete_flag = 0 AND " + "f.delete_flag = 0 ) c LEFT OUTER JOIN ( SELECT e.exercise_info_id," + "e.student_score, e.complete_status, e.CLASS_ID FROM exercise_complete_info " + "e WHERE e.delete_flag IS FALSE AND e.student_user_id =:userId ) d ON " + "c.exercise_info_id = d.exercise_info_id AND c.class_id = d.class_id " + "where IFNULL(d.complete_status,0) = 0 and (c.end_Time - CURRENT_TIMESTAMP ()) < 0 "; List list = findByComplexSql(sql, CollectionUtils.newObjectMap("classId", classId, "userId", userId), Object[].class); return list.size(); } /** * 获取待完成的作业 */ @Override public int getToBeCommitExerciseCount(String classId, String userId) { String sql = "SELECT c.exercise_info_id, c. NAME, c.start_time, c.end_time, c.type," + "c.score, d.student_score, d.complete_status, c.class_id, c.className " + "FROM ( SELECT f.exercise_info_id, f. NAME, f.start_time, f.end_time, " + "f.create_time, f.type, f.score, s.class_id, s.`NAME` AS className " + "FROM exercise_info f, exercise_exam_re_class r, cls_class s WHERE " + "r.exam_id = f.exercise_info_id AND r.class_id = s.class_id AND " + "r.class_id =:classId AND f. STATUS = 1 AND r.delete_flag = 0 AND " + "f.delete_flag = 0 ) c LEFT OUTER JOIN ( SELECT e.exercise_info_id," + "e.student_score, e.complete_status, e.CLASS_ID FROM exercise_complete_info " + "e WHERE e.delete_flag IS FALSE AND e.student_user_id =:userId ) d ON " + "c.exercise_info_id = d.exercise_info_id AND c.class_id = d.class_id " + "where IFNULL(d.complete_status,0) = 0 and (c.end_Time - CURRENT_TIMESTAMP ()) > 0 "; List list = findByComplexSql(sql, CollectionUtils.newObjectMap("classId", classId, "userId", userId), Object[].class); return list.size(); } /** * 获取完成的作业个数 * * @param classId * @param userId * @return */ @Override public int getCommitExerciseCount(String classId, String userId) { String sql = "SELECT c.exercise_info_id, c. NAME, c.start_time, c.end_time, c.type," + "c.score, d.student_score, d.complete_status, c.class_id, c.className " + "FROM ( SELECT f.exercise_info_id, f. NAME, f.start_time, f.end_time, " + "f.create_time, f.type, f.score, s.class_id, s.`NAME` AS className " + "FROM exercise_info f, exercise_exam_re_class r, cls_class s WHERE " + "r.exam_id = f.exercise_info_id AND r.class_id = s.class_id AND " + "r.class_id =:classId AND f. STATUS = 1 AND r.delete_flag = 0 AND " + "f.delete_flag = 0 ) c LEFT OUTER JOIN ( SELECT e.exercise_info_id," + "e.student_score, e.complete_status, e.CLASS_ID FROM exercise_complete_info " + "e WHERE e.delete_flag IS FALSE AND e.student_user_id =:userId ) d ON " + "c.exercise_info_id = d.exercise_info_id AND c.class_id = d.class_id " + "where IFNULL(d.complete_status,0) > 0 "; List list = findByComplexSql(sql, CollectionUtils.newObjectMap("classId", classId, "userId", userId), Object[].class); return list.size(); } /** * 获取作业总数 */ @Override public int getExerciseCount(String classId, String userId) { String hqlCount = "from ExerciseInfo i,ExerciseExamReClass r WHERE" + " r.examId=i.exerciseInfoId AND r.classId =:classId AND i.status=:status " + "AND i.deleteFlag is false AND r.deleteFlag is false"; int exerciseCount = findCountByComplexHql(hqlCount, CollectionUtils.newObjectMap("classId", classId, "status", ExerciseInfo.EXERCISE_STATUS_PUBLISHED)); return exerciseCount; } /** * 查询作业列表-教师端 * * @param pageSize * @param keyword * @param classId * @param pageNum * @return */ public List> teacherExerciseInfoList(Integer pageSize,String keyword,String classId,Integer pageNum) { QHomeworkScoreV qHomeworkScoreV = QHomeworkScoreV.homeworkScoreV; QExerciseInfo qExerciseInfo = QExerciseInfo.exerciseInfo; Expression cases = new CaseBuilder() .when(qHomeworkScoreV.completeStatus.isNull()).then(1) .otherwise(0).sum().as("homeworkNoSubmitCount"); Expression cases2 = new CaseBuilder() .when(qHomeworkScoreV.completeStatus.eq(String.valueOf(ExerciseCompleteInfo.STATUS_CHECKED))).then(1) .otherwise(0).sum().as("homeworkToAuditCount"); Expression cases3 = new CaseBuilder() .when(qHomeworkScoreV.completeStatus.eq(String.valueOf(ExerciseCompleteInfo.STATUS_COMMIT))).then(1) .otherwise(0).sum().as("homeworkHasAuditCount"); return this.getQueryFactory().select(cases,cases2,cases3, qExerciseInfo.name.max(), qExerciseInfo.startTime.max(), qExerciseInfo.endTime.max(), qExerciseInfo.type.max()).from(qHomeworkScoreV, qExerciseInfo) .where(qHomeworkScoreV.classId.eq(classId) .and(qHomeworkScoreV.id.homeworkId.eq(qExerciseInfo.exerciseInfoId)) .and(qExerciseInfo.deleteFlag.isFalse())) .groupBy(qHomeworkScoreV.id.homeworkId) .orderBy(qExerciseInfo.createTime.desc()) .fetch().stream().map(tuple -> { Map map = new HashMap(); map.put("name", tuple.get(3, String.class)); map.put("startTime", tuple.get(4, String.class)); map.put("endTime", tuple.get(5, String.class)); map.put("type", tuple.get(6, Integer.class)); map.put("homeworkNoSubmitCount", tuple.get(0, Integer.class)); map.put("homeworkToAuditCount", tuple.get(1, Integer.class)); map.put("homeworkHasAuditCount", tuple.get(2, Integer.class)); return map; }).collect(Collectors.toList()); } @Override public Map queryResultStatusCount(List lstExerciseIds) { if(lstExerciseIds== null || lstExerciseIds.size()==0){ return null; } String hql = "select id.exerciseInfoId||'-'||completeStatus ,count(1) from ExerciseResultV " + "where id.exerciseInfoId in(:exerciseIds) group by id.exerciseInfoId,completeStatus"; List lstResult = this.findByComplexHql(hql, CollectionUtils.newObjectMap("exerciseIds",lstExerciseIds.toArray(new String[lstExerciseIds.size()])), Object[].class); Map resultMap = new HashMap(lstResult.size()); for(Object[] o:lstResult){ resultMap.put((String)o[0],((Long)o[1]).intValue()); } return resultMap; } }