派生自 projectDept/qhighschool

EricsHu
2022-12-05 068fc7f2e81178e55fa191a13709af64b1a163f6
src/main/java/com/qxueyou/scc/exercise/service/impl/ExerciseInfoService.java
@@ -61,7 +61,7 @@
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;
@@ -138,7 +138,7 @@
   }
   
   /**
    * 保存作业
    * 保存作业
    * 
    * @return
    */
@@ -154,34 +154,34 @@
      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
    */
@@ -204,42 +204,42 @@
      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});
@@ -281,7 +281,7 @@
   }
   /**
    * 删除作业
    * 删除作业
    * 
    * @param examId
    * @return
@@ -330,7 +330,7 @@
         params.add(subjectId);
      }
      
      //默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交
      //默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交
      if(status!=null){
         Date nowTime = new Date();
         if(status==0){
@@ -385,7 +385,7 @@
         params.add(subjectId);
      }
      
      //默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交
      //默认全部,0待完成,1已提交 ,2:已批阅,3需重写,4:逾期未交
      if(status!=null){
         Date nowTime = new Date();
         if(status==0){
@@ -413,7 +413,7 @@
   }
   
   /**
    * 初始化平均成绩和最高成绩
    * 初始化平均成绩和最高成绩
    * 
    * @param groupId
    * @return
@@ -427,7 +427,7 @@
   }
   /**
    * 题目得分详情
    * 题目得分详情
    * 
    * @param groupId
    * @return
@@ -443,13 +443,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 +457,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 +469,7 @@
               obj.setClassAccuracyShow(obj.getClassAccuracy() + "%");
               obj.setOrgAccuracyShow(obj.getOrgAccuracy() + "%");
               // 给类型赋值
               // 给类型赋值
               setExerItemTypeNewName(obj);
               listResult.add(obj);
               break;
@@ -481,20 +481,20 @@
   }
   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
@@ -510,14 +510,14 @@
   }
   /**
    * 开始题目作业
    * 开始题目作业
    * 
    * @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 = ?)",
@@ -525,23 +525,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,14 +549,14 @@
      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());
      
@@ -572,7 +572,7 @@
   }
   
   private ExerciseCompleteInfo doGetOrCreateExerciseCompleteInfo(String exerciseInfoId,String classId,String studentUserId){
        // 判断是否已经初始化
        // 判断是否已经初始化
         ExerciseCompleteInfo completeInfo = exerciseCompleteService.queryCompleteInfo(exerciseInfoId,classId , studentUserId);
         
         if(completeInfo==null){
@@ -617,7 +617,7 @@
      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());
@@ -642,7 +642,7 @@
      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){
@@ -665,13 +665,13 @@
   }   
   /**
    * 开始文件和写作作业
    * 开始文件和写作作业
    * 
    * @param examId
    * @return
    */
   private Result doStartOtherExercise(ExerciseInfo exerciseInfo, ClsClass clsClass, String studentUserId) {
      // 查询是否已经存在做题记录,如果不存在需要新建
      // 查询是否已经存在做题记录,如果不存在需要新建
      ExerciseCompleteInfo exerciseCompleteInfo = exerciseCompleteService.doCheckAndCreateExerciseCompleteInfo(
            exerciseInfo.getExerciseInfoId(), clsClass.getClassId(), studentUserId);
      
@@ -737,7 +737,7 @@
   }
   /**
    * 提交写作作业
    * 提交写作作业
    * 
    * @param exerciseInfoId
    * @param content
@@ -746,7 +746,7 @@
    */
   private Result doSubmitWritingExerciseInfo(String exerciseCompleteInfoId, String content, short submitType) {
      ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId);
      // 保存到orgtext
      // 保存到orgtext
      if (StringUtils.isEmpty(exerciseCompleteInfo.getTargetObjectId())) {
         Result result =  orgTextService.doInsertOrgText(exerciseCompleteInfoId, OrgText.TABLE_WRITING_EXERCISE, content);
         exerciseCompleteInfo.setTargetObjectId((String)result.getData("orgTextId"));
@@ -768,7 +768,7 @@
   }
   /**
    * 提交文件作业
    * 提交文件作业
    * 
    * @param exerciseCompleteInfoId
    * @param content
@@ -799,7 +799,7 @@
      exerciseCompleteInfo.setUploadDesc(content);
      // 判断作业提交类型,不同提交类型保存到不同地方
      // 判断作业提交类型,不同提交类型保存到不同地方
      if (StringUtils.isNotEmpty(fileId)) {
         String fileType = filePath.substring(filePath.lastIndexOf("."));
         String fileName = filePath.substring(filePath.lastIndexOf("/"));
@@ -841,7 +841,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()));
@@ -867,14 +867,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();
@@ -883,24 +883,24 @@
                  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());
@@ -932,18 +932,18 @@
         
         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,
@@ -954,7 +954,7 @@
   }
   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", 
            CollectionUtils.newList(answerData.getExerciseGroupId(),ExerciseItem.TYPE_FILL_BLANKS), Object[].class);
@@ -1043,16 +1043,16 @@
   
   @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) {
@@ -1080,7 +1080,7 @@
            }
         }
         
         //发布作业消息
         //发布作业消息
         this.doExercisePublishMsg(exerciseId);
      }
      
@@ -1098,22 +1098,22 @@
               "subjectId",exerciseInfo.getSubjectId(),"subjectName",exerciseInfo.getSubject().getName()); 
         
         msgInfoService.doSendTextMsgToUsers(lstUserIds.toArray(new String[lstUserIds.size()]), 
                              MsgInfo.TYPE_EXERCISE," 发布了作业 ", attrs);
                              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) {
@@ -1136,7 +1136,7 @@
   }
   /**
    * 获取待完成的作业
    * 获取待完成的作业
    */
   @Override
   public int getToBeCommitExerciseCount(String classId, String userId) {
@@ -1159,7 +1159,7 @@
   }
   /**
    * 获取完成的作业个数
    * 获取完成的作业个数
    * 
    * @param classId
    * @param userId
@@ -1186,7 +1186,7 @@
   }
   /**
    * 获取作业总数
    * 获取作业总数
    */
   @Override
   public int getExerciseCount(String classId, String userId) {
@@ -1199,7 +1199,7 @@
   }
   
   /**
    * 查询作业列表-教师端
    * 查询作业列表-教师端
    * 
    * @param pageSize
    * @param keyword