From 0e62c15e4b010ffa2d5cff9474f3fd389e369338 Mon Sep 17 00:00:00 2001 From: EricsHu <hrr145632> Date: 星期五, 24 十一月 2023 14:31:46 +0800 Subject: [PATCH] 优化作业、考试、试卷、题库 --- src/main/java/com/qxueyou/scc/exercise/service/impl/ExerciseInfoService.java | 522 +++++++++++++++++++++++++++++---------------------------- 1 files changed, 267 insertions(+), 255 deletions(-) diff --git a/src/main/java/com/qxueyou/scc/exercise/service/impl/ExerciseInfoService.java b/src/main/java/com/qxueyou/scc/exercise/service/impl/ExerciseInfoService.java index 0a0a36e..ffec783 100644 --- a/src/main/java/com/qxueyou/scc/exercise/service/impl/ExerciseInfoService.java +++ b/src/main/java/com/qxueyou/scc/exercise/service/impl/ExerciseInfoService.java @@ -61,8 +61,8 @@ import com.qxueyou.scc.teach.res.model.ResFile; /** - * 考试 - * + * 鑰冭瘯 + * * @author lihanqi * */ @@ -72,7 +72,7 @@ private final String[] EXAM_TYPES = new String[] { "A", "B", "C", "D" }; - /** 练习V2.0版本接口service */ + /** 缁冧範V2.0鐗堟湰鎺ュ彛service */ @Autowired private IExerciseVerService exerciseVerService; @@ -87,64 +87,74 @@ @Autowired IHandoutService handoutService; - + @Autowired IMsgInfoService msgInfoService; - + @Autowired IExerciseCompleteService exerciseCompleteService; - + @Autowired IExerciseGroupService exerciseGroupService; - + @Override public List<ExerciseInfo> 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<Object> params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId()); - + //鍒ゆ柇鏄惁鏄暀甯� + String teacherId = ClientUtils.isAdmin() ? null : ClientUtils.getUserId(); + hql.append("from ExerciseInfo e where e.name like ? "); + List<Object> params = CollectionUtils.newList('%' + keyword.trim() + '%'); + if (StringUtils.isNotBlank(teacherId)) { + hql.append(" and e.createId =?"); + params.add(teacherId); + } 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<Object> params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId()); - + //鍒ゆ柇鏄惁鏄暀甯� + String teacherId = ClientUtils.isAdmin() ? null : ClientUtils.getUserId(); + hql.append("from ExerciseInfo e where e.name like ? "); + List<Object> params = CollectionUtils.newList('%' + keyword.trim() + '%'); + if (StringUtils.isNotBlank(teacherId)) { + hql.append(" and e.createId =?"); + params.add(teacherId); + } 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()); @@ -154,42 +164,42 @@ this.save(exerciseInfo); if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER) { - // 保存题目类型 + // 淇濆瓨棰樼洰绫诲瀷 List<ExerciseItemSet> 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); - + exerciseInfo.getName() + "-浣滀笟",ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM,sourceGroupIds,lstExerciseItemSet); + if(StringUtils.isEmpty(newGroupId)){ - return new Result(false, "题目数据不够,请增加题库的题目或者减少试卷的题数",exerciseInfoId); + 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); @@ -203,49 +213,49 @@ newExerciseInfo.setCommitUploadType(exerciseInfo.getCommitUploadType()); TraceUtils.setUpdateTrace(newExerciseInfo); this.save(newExerciseInfo); - - //清理旧关系数据 + + //娓呯悊鏃у叧绯绘暟鎹� this.doClearExerciseExamReData(exerciseInfoId); - - // 答题作业默认按照统一卷生成作业题目 - + + // 绛旈浣滀笟榛樿鎸夌収缁熶竴鍗风敓鎴愪綔涓氶鐩� + if (newExerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER) { - - // 保存题目类型 + + // 淇濆瓨棰樼洰绫诲瀷 List<ExerciseItemSet> 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); - + exerciseInfo.getName() + "-浣滀笟",ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM,groupIds, lstExerciseItemSet); + if(StringUtils.isEmpty(newGroupId)){ - return new Result(false, "题目数据不够,请增加题库的题目或者减少试卷的题数"); + 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) { @@ -254,10 +264,10 @@ reClass.setDeleteFlag(false); reClass.setExamId(exerciseInfoId); TraceUtils.setCreateTrace(reClass); - this.save(reClass); + this.save(reClass); } } - + private void saveExerciseExamReGroup(String exerciseInfoId, String [] groupIds,String examType,short reType){ ExerciseExamReGroup reGroup = null; for (String groupId : groupIds) { @@ -269,9 +279,9 @@ reGroup.setExamId(exerciseInfoId); TraceUtils.setCreateTrace(reGroup); this.save(reGroup); - } + } } - + private void saveExerciseItemSet(String exerciseInfoId,List<ExerciseItemSet> lstExerciseItemSet){ for (ExerciseItemSet itemSet : lstExerciseItemSet) { itemSet.setExerciseInfoId(exerciseInfoId); @@ -281,8 +291,8 @@ } /** - * 删除作业 - * + * 鍒犻櫎浣滀笟 + * * @param examId * @return */ @@ -293,44 +303,44 @@ @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); + 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<ExerciseItemSet> queryExerciseItemSet(String exerciseInfoId){ - return this.find("from ExerciseItemSet where exerciseInfoId=? and deleteFlag is false order by itemType ASC", + return this.find("from ExerciseItemSet where exerciseInfoId=? and deleteFlag is false order by itemType ASC", CollectionUtils.newList(exerciseInfoId), ExerciseItemSet.class); } - + @Override public List<ExerciseResultV> 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<Object> params = CollectionUtils.newList(ExerciseInfo.EXERCISE_STATUS_PUBLISHED); - + if(!StringUtils.isEmpty(userId)){ hql.append(" and userId=? "); - params.add(userId); + params.add(userId); } - + if(!StringUtils.isEmpty(exerciseInfoId)){ hql.append(" and id.exerciseInfoId=?"); - params.add(exerciseInfoId); + params.add(exerciseInfoId); } - + if(!StringUtils.isEmpty(keyword)){ hql.append(" and studentName like ?"); - params.add("%" + keyword.trim() + "%"); + params.add("%" + keyword.trim() + "%"); } - + if(!StringUtils.isEmpty(subjectId)){ hql.append(" and subjectId=?"); params.add(subjectId); } - - //默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交 + + //榛樿鍏ㄩ儴锛�0寰呭畬鎴愶紝1宸叉彁浜� ,2:宸叉壒闃�,3闇�閲嶅啓,4:閫炬湡鏈氦 if(status!=null){ Date nowTime = new Date(); if(status==0){ @@ -353,39 +363,39 @@ 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<Object> params = CollectionUtils.newList(ExerciseInfo.EXERCISE_STATUS_PUBLISHED); - + if(!StringUtils.isEmpty(userId)){ hql.append(" and userId=? "); - params.add(userId); + params.add(userId); } - + if(!StringUtils.isEmpty(exerciseInfoId)){ hql.append(" and id.exerciseInfoId=?"); - params.add(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:逾期未交 + + //榛樿鍏ㄩ儴锛�0寰呭畬鎴愶紝1宸叉彁浜� ,2:宸叉壒闃�,3闇�閲嶅啓,4:閫炬湡鏈氦 if(status!=null){ Date nowTime = new Date(); if(status==0){ @@ -408,13 +418,13 @@ params.add(ExerciseCompleteInfo.STATUS_DRAFT); } } - - return this.findCount(hql.toString(), params); + + return this.findCount(hql.toString(), params); } - + /** - * 初始化平均成绩和最高成绩 - * + * 鍒濆鍖栧钩鍧囨垚缁╁拰鏈�楂樻垚缁� + * * @param groupId * @return */ @@ -427,8 +437,8 @@ } /** - * 题目得分详情 - * + * 棰樼洰寰楀垎璇︽儏 + * * @param groupId * @return */ @@ -443,13 +453,13 @@ return new ArrayList<ExerciseItemStatistics>(); } - // 默认章节练习 + // 榛樿绔犺妭缁冧範 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<ExerciseItem> itemAllLst = this.find(hql, CollectionUtils.newList(examId, ExerciseExamReGroup.GROUP_TYPE_EXAM), ExerciseItem.class); @@ -457,7 +467,7 @@ return new ArrayList<ExerciseItemStatistics>(); } - // 同步编号 + // 鍚屾缂栧彿 List<ExerciseItemStatistics> listResult = new ArrayList<ExerciseItemStatistics>(itemStatisLst.size()); ExerciseItemStatistics obj = null; for (int j = 0; j < itemAllLst.size(); j++) { @@ -469,7 +479,7 @@ obj.setClassAccuracyShow(obj.getClassAccuracy() + "%"); obj.setOrgAccuracyShow(obj.getOrgAccuracy() + "%"); - // 给类型赋值 + // 缁欑被鍨嬭祴鍊� setExerItemTypeNewName(obj); listResult.add(obj); break; @@ -481,21 +491,21 @@ } private void setExerItemTypeNewName(ExerciseItemStatistics obj) { - // 判断类型文字显示 + // 鍒ゆ柇绫诲瀷鏂囧瓧鏄剧ず if (obj.getExerciseItemType() == ExerciseItem.TYPE_SINGLE_SELECT) { - obj.setItemTypeName("单选题"); + obj.setItemTypeName("鍗曢�夐"); } else if (obj.getExerciseItemType() == ExerciseItem.TYPE_MULTI_SELECT) { - obj.setItemTypeName("多选题"); + obj.setItemTypeName("澶氶�夐"); } else if (obj.getExerciseItemType() == ExerciseItem.TYPE_TRUE_OR_FALSE) { - obj.setItemTypeName("判断题"); + obj.setItemTypeName("鍒ゆ柇棰�"); } else if (obj.getExerciseItemType() == ExerciseItem.TYPE_ESSAY_QUESTION) { - obj.setItemTypeName("问答题"); + obj.setItemTypeName("闂瓟棰�"); } } /** - * 开始题目作业 - * + * 寮�濮嬮鐩綔涓� + * * @param examId * @return */ @@ -506,18 +516,18 @@ 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); - // 正在做题数 + // 姝e湪鍋氶鏁� 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 = ?)", @@ -525,23 +535,23 @@ 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, "开始作业获取题目失败"); + return new Result(false, "寮�濮嬩綔涓氳幏鍙栭鐩け璐�"); } Map<String, Object> 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()); @@ -549,61 +559,61 @@ 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<Map<String, Object>> resultMap = this.findListWithMapByHql(hql, + // 鍒ゆ柇鏄惁宸茬粡鍒濆鍖� + 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<Map<String, Object>> resultMap = this.findListWithMapByHql(hql, CollectionUtils.newObjectMap("userId",studentUserId,"classId",classId,"exerciseInfoId",exerciseInfoId)); - - if(resultMap!=null && resultMap.get(0)!=null){ - Map<String, Object> 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); - } + + if(resultMap!=null && resultMap.get(0)!=null){ + Map<String, Object> 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; + } + + return completeInfo; } - + private Map<String,Object> insertExerRecord(ExerciseInfo exerciseInfo,String groupId) { ExerciseRecord record = new ExerciseRecord(); record.setDeleteFlag(false); @@ -616,8 +626,8 @@ record.setUserId(ClientUtils.getUserId()); record.setOrgId(ClientUtils.getOrgId()); TraceUtils.setCreateTrace(record); - - //获取考试题目统计信息,并保存 + + //鑾峰彇鑰冭瘯棰樼洰缁熻淇℃伅锛屽苟淇濆瓨 Map<String,Object> result = this.queryItemStatics(exerciseInfo.getExerciseItemSets()); record.setTotalScore(new BigDecimal(exerciseInfo.getScore())); record.setPassingScore(exerciseInfo.getPassingScore()); @@ -625,24 +635,24 @@ 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<String,Object> resultMap = new HashMap<String, Object>(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<String,Object> queryItemStatics(List<ExerciseItemSet> 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){ @@ -654,27 +664,27 @@ } } } - + Map<String,Object> result = new HashMap<String,Object>(); 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()); @@ -690,7 +700,7 @@ exerciseCompleteInfo .setPreviewPath(StringUtils.isNotEmpty(video.getAndroidHD()) ? video.getAndroidHD() : StringUtils.isNotEmpty(video.getAndroidSD()) ? video.getAndroidSD() - : video.getAndroidLD()); + : video.getAndroidLD()); } else { exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_NO); } @@ -714,7 +724,7 @@ .getOrgText(exerciseCompleteInfo.getExerciseCompleteId(), OrgText.TABLE_WRITING_EXERCISE) .getContent()); } - + exerciseCompleteInfo.setTotalScore(exerciseInfo.getScore()); return new Result(true,"",CollectionUtils.newObjectMap("exerciseCompleteInfo", exerciseCompleteInfo)); @@ -722,11 +732,11 @@ @Override public Result doSubmitOtherExerciseInfo(String exerciseCompleteInfoId, String content, String fileId, - String filePath, short submitType) { + 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) { @@ -737,8 +747,8 @@ } /** - * 提交写作作业 - * + * 鎻愪氦鍐欎綔浣滀笟 + * * @param exerciseInfoId * @param content * @param submitType @@ -746,28 +756,30 @@ */ private Result doSubmitWritingExerciseInfo(String exerciseCompleteInfoId, String content, short submitType) { ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId); - // 保存到orgtext + // 淇濆瓨鍒皁rgtext 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 @@ -776,7 +788,7 @@ * @return */ private Result doSubmitFileExerciseInfo(String exerciseCompleteInfoId, String content, String fileId, - String filePath, short submitType) { + String filePath, short submitType) { ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId); ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseCompleteInfo.getExerciseInfoId()); @@ -792,12 +804,12 @@ ResFile resFile = this.read(ResFile.class, fileId); exerciseCompleteInfo.setFileId(fileId); exerciseCompleteInfo.setFilePath(filePath); - exerciseCompleteInfo.setOrgiFileName(resFile.getFileName()); + exerciseCompleteInfo.setOrgiFileName(ClientUtils.getUserName()+"鐨勪綔涓�"); } exerciseCompleteInfo.setUploadDesc(content); - // 判断作业提交类型,不同提交类型保存到不同地方 + // 鍒ゆ柇浣滀笟鎻愪氦绫诲瀷锛屼笉鍚屾彁浜ょ被鍨嬩繚瀛樺埌涓嶅悓鍦版柟 if (StringUtils.isNotEmpty(fileId)) { String fileType = filePath.substring(filePath.lastIndexOf(".")); String fileName = filePath.substring(filePath.lastIndexOf("/")); @@ -839,7 +851,7 @@ targetObjectId = handout.getHandoutId(); if (!"PDF".equals(fileType.toUpperCase())) { - // 添加到讲义转码队列表 + // 娣诲姞鍒拌涔夎浆鐮侀槦鍒楄〃 HandoutConverTask task = new HandoutConverTask(); task.setCreateTime(new Date(System.currentTimeMillis())); task.setUpdateTime(new Date(System.currentTimeMillis())); @@ -865,14 +877,14 @@ public Result doSubmitAnswerExerciseInfo(ExerciseSubmitAnswerData answerData, String exerciseInfoId, String exerciseCompleteId) { Result result = new Result(true); - // 用户本次做题提交的数据 + // 鐢ㄦ埛鏈鍋氶鎻愪氦鐨勬暟鎹� List<ExerciseItemAnswerData> lstAnswers = null; String initRecordId = null; ExerciseCompleteInfo exerciseCompleteInfo = null; ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId); try { - // 提交记录id + // 鎻愪氦璁板綍id initRecordId = answerData.getExerciseRecordId(); lstAnswers = answerData.getItems(); @@ -881,34 +893,34 @@ ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_FAILED, "/exercise/Exercise/exerAnswers"); - return new Result(false, "提交数据异常"); + return new Result(false, "鎻愪氦鏁版嵁寮傚父"); } - + ExerciseRecord record = this.read(ExerciseRecord.class, initRecordId); - //计算得分 + //璁$畻寰楀垎 double studentScore = this.doCalculateExerciseScores(answerData, exerciseInfo.getExerciseItemSets()); - - // 提交试卷答案 + + // 鎻愪氦璇曞嵎绛旀 answerData.setScore(new BigDecimal(studentScore)); Map<String, Object> 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=?", @@ -926,22 +938,22 @@ + " where deleteFlag is false and recordId=? ", new Object[] { resultMap.get("recordId") }); } - exerciseCompleteInfo.setStudentScore(new BigDecimal(studentScore)); - + 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 = new Result(true, "绛旀鎻愪氦鎴愬姛"); result.setData(resultMap); } catch (Exception e) { - log.error("考试保存错误", e); + log.error("鑰冭瘯淇濆瓨閿欒", e); - result = new Result(false, "提交练习答案请求异常"); + result = new Result(false, "鎻愪氦缁冧範绛旀璇锋眰寮傚父"); exerciseVerService.doSaveExerciseDataSubmitLog(JSON.toJSONString(answerData), initRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_FAILED, @@ -952,17 +964,17 @@ } private double doCalculateExerciseScores(ExerciseSubmitAnswerData answerData, List<ExerciseItemSet> lstItemSet) { - //获取填空题答案信息 + //鑾峰彇濉┖棰樼瓟妗堜俊鎭� Map<String,String> exerciseFillItemMap= null; - List<Object[]> 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", + List<Object[]> 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<String,String>(lstObj.size()); for(Object[] arrObj : lstObj){ exerciseFillItemMap.put((String)arrObj[0],(String)arrObj[1]); - } + } } - + Map<String, Double> scoreMap = new HashMap<String, Double>(); for (int i = 0; i < lstItemSet.size(); i++) { if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_SINGLE_SELECT) { @@ -981,7 +993,7 @@ 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; @@ -1038,21 +1050,21 @@ 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<Map<String, Object>> students = null; ExerciseCompleteInfo temp = null; List<ExerciseCompleteInfo> lstCompleteInfos = null; for (String exerciseId : exerciseIds) { - // 判断是否已经初始化,如果已经初始化则继续 -> TODO:需要处理新加入班级学生 + // 鍒ゆ柇鏄惁宸茬粡鍒濆鍖栵紝濡傛灉宸茬粡鍒濆鍖栧垯缁х画 -> 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 " @@ -1077,41 +1089,41 @@ this.saveOrUpdateAll(lstCompleteInfos); } } - - //发布作业消息 + + //鍙戝竷浣滀笟娑堟伅 this.doExercisePublishMsg(exerciseId); } - + return new Result(true); } - + private void doExercisePublishMsg(String exerciseInfoId){ ExerciseInfo exerciseInfo= this.read(ExerciseInfo.class, exerciseInfoId); - - List<String> lstUserIds = this.find("select userId from ExerciseResultV where id.exerciseInfoId=?", - CollectionUtils.newList(exerciseInfoId), String.class); - + + List<String> lstUserIds = this.find("select userId from ExerciseResultV where id.exerciseInfoId=?", + CollectionUtils.newList(exerciseInfoId), String.class); + if(lstUserIds!=null && lstUserIds.size()>0){ Map<String,String> 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); + "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) { @@ -1134,7 +1146,7 @@ } /** - * 获取待完成的作业 + * 鑾峰彇寰呭畬鎴愮殑浣滀笟 */ @Override public int getToBeCommitExerciseCount(String classId, String userId) { @@ -1157,8 +1169,8 @@ } /** - * 获取完成的作业个数 - * + * 鑾峰彇瀹屾垚鐨勪綔涓氫釜鏁� + * * @param classId * @param userId * @return @@ -1184,7 +1196,7 @@ } /** - * 获取作业总数 + * 鑾峰彇浣滀笟鎬绘暟 */ @Override public int getExerciseCount(String classId, String userId) { @@ -1195,10 +1207,10 @@ CollectionUtils.newObjectMap("classId", classId, "status", ExerciseInfo.EXERCISE_STATUS_PUBLISHED)); return exerciseCount; } - + /** - * 查询作业列表-教师端 - * + * 鏌ヨ浣滀笟鍒楄〃-鏁欏笀绔� + * * @param pageSize * @param keyword * @param classId @@ -1208,19 +1220,19 @@ public List<Map<String, Object>> teacherExerciseInfoList(Integer pageSize,String keyword,String classId,Integer pageNum) { QHomeworkScoreV qHomeworkScoreV = QHomeworkScoreV.homeworkScoreV; QExerciseInfo qExerciseInfo = QExerciseInfo.exerciseInfo; - + Expression<Integer> cases = new CaseBuilder() - .when(qHomeworkScoreV.completeStatus.isNull()).then(1) - .otherwise(0).sum().as("homeworkNoSubmitCount"); - + .when(qHomeworkScoreV.completeStatus.isNull()).then(1) + .otherwise(0).sum().as("homeworkNoSubmitCount"); + Expression<Integer> cases2 = new CaseBuilder() - .when(qHomeworkScoreV.completeStatus.eq(String.valueOf(ExerciseCompleteInfo.STATUS_CHECKED))).then(1) - .otherwise(0).sum().as("homeworkToAuditCount"); - + .when(qHomeworkScoreV.completeStatus.eq(String.valueOf(ExerciseCompleteInfo.STATUS_CHECKED))).then(1) + .otherwise(0).sum().as("homeworkToAuditCount"); + Expression<Integer> cases3 = new CaseBuilder() - .when(qHomeworkScoreV.completeStatus.eq(String.valueOf(ExerciseCompleteInfo.STATUS_COMMIT))).then(1) - .otherwise(0).sum().as("homeworkHasAuditCount"); - + .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) @@ -1240,21 +1252,21 @@ return map; }).collect(Collectors.toList()); } - + @Override public Map<String,Integer> queryResultStatusCount(List<String> 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<Object[]> lstResult = this.findByComplexHql(hql, + + "where id.exerciseInfoId in(:exerciseIds) group by id.exerciseInfoId,completeStatus"; + + List<Object[]> lstResult = this.findByComplexHql(hql, CollectionUtils.newObjectMap("exerciseIds",lstExerciseIds.toArray(new String[lstExerciseIds.size()])), Object[].class); - - Map<String,Integer> resultMap = new HashMap<String,Integer>(lstResult.size()); - + + Map<String,Integer> resultMap = new HashMap<String,Integer>(lstResult.size()); + for(Object[] o:lstResult){ resultMap.put((String)o[0],((Long)o[1]).intValue()); } -- Gitblit v1.8.0