派生自 projectDept/qhighschool

EricsHu
2022-12-05 068fc7f2e81178e55fa191a13709af64b1a163f6
src/main/java/com/qxueyou/scc/exercise/service/impl/ExerciseExtendService.java
@@ -57,27 +57,27 @@
/**
 * 练习  实现service
 * 练习  实现service
 * @author zhiyong
 *
 */
@Service(value = "exerciseExtendService")
public class ExerciseExtendService extends CommonAppService implements IExerciseExtendService {
   /** 日志 */
   /** 日志 */
   private static final Logger log = LogManager.getLogger(ExerciseExtendService.class);
   
   /** 练习接口service  */
   /** 练习接口service  */
   @Autowired
   private IExerciseVerService exerciseVerService;
   
   /** 做题记录id */
   /** 做题记录id */
   private static final String EXERCISE_RECORD_ID = "exerciseRecordId";
   
   /** 更新时间 */
   /** 更新时间 */
   private static final String UPDATE_TIME = "updateTime";
   
   /**
    * 新增收藏book记录
    * 新增收藏book记录
    * @param groupId
    * @return 
    */
@@ -96,7 +96,7 @@
   }
   
   /**
    * 新增错题book记录
    * 新增错题book记录
    * @param groupId
    * @return 
    */
@@ -114,7 +114,7 @@
   }
   
   /**
    * 新增收藏记录
    * 新增收藏记录
    * @param groupId
    * @return 
    */
@@ -131,7 +131,7 @@
   }
   
   /**
    * 新增错题记录
    * 新增错题记录
    * @param groupId
    * @return 
    */
@@ -149,30 +149,30 @@
   
   /** -------------------------APP--V2.0- start------------------------------------------- */
   /**
    * 操作错题记录
    * 操作错题记录
    */
   public Map<String,Object> doOperExerciseFaultRecordData(String subjectId, ExciseExtendReqData recordResult) {
      // 练习组id
      // 练习组id
      String exerciseGroupId = recordResult.getExerciseGroupId();
      String exerciseGroupType = recordResult.getExerciseGroupType();
      
      // 1.操作练习总记录
      // 1.操作练习总记录
      ExerciseFaultBook resumeBook = doOperExerciseFaultBook(subjectId,recordResult);
      String resumeBookId = resumeBook.getResumeBookId();
      
      // 2.操作练习记录
      // 2.操作练习记录
      ExerciseFaultRecord record = doOperExerciseFaultRecord(resumeBookId,
            exerciseGroupId, exerciseGroupType, recordResult);
      
      String faultRecordId = record.getFaultRecordId();
      
      // 3.组装错题结果入库
      // 3.组装错题结果入库
      doOperFaultExerciseToDB(resumeBookId, faultRecordId, recordResult);
      
      // 4.重新计算做题记录正确个数 做题个数  正确率  错题本
      // 4.重新计算做题记录正确个数 做题个数  正确率  错题本
      record = this.doCalcFaultExericseStatisBySubmitData(record,resumeBook,subjectId);
      
      // 5.返回结果
      // 5.返回结果
      Map<String,Object> map = new HashMap<String, Object>(3);
      map.put(EXERCISE_RECORD_ID, faultRecordId);
      map.put("exerciseGroupId", exerciseGroupId);
@@ -182,7 +182,7 @@
   }
   
   /**
    * 重新计算错题record数据结果
    * 重新计算错题record数据结果
    * @param record
    * @return
    */
@@ -202,14 +202,14 @@
      
      Object[] objs = lstFault.get(0);
      
      // 拆分子数据
      // 拆分子数据
      packagingExerciseFaultRecordData(record, objs);
      
      if(record.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
      if(record.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
         record.setTitleMaxNumber("0");
         record.setStatus("0");
      }else if(StringUtils.isNotBlank(record.getTitleMaxNumber()) && 
            record.getAllCount().compareTo(new BigInteger(record.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
            record.getAllCount().compareTo(new BigInteger(record.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
         record.setTitleMaxNumber(String.valueOf(record.getAllCount()));
      }
      TraceUtils.setUpdateTrace(record);
@@ -219,7 +219,7 @@
   }
   
   /**
    * 重新计算错题record数据结果   拆分子数据
    * 重新计算错题record数据结果   拆分子数据
    * @param record
    * @param objs
    */
@@ -234,21 +234,21 @@
   }
   
   /**
    * 重新计算做题记录总个数    错题本 正确个数 做题个数  正确率  错题本
    * 重新计算做题记录总个数    错题本 正确个数 做题个数  正确率  错题本
    * @return
    */
   public ExerciseFaultRecord doCalcFaultExericseStatisBySubmitData(ExerciseFaultRecord record,
         ExerciseFaultBook resumeBook, String subjectId){
      // 1.计算做题总个数 record
      // 1.计算做题总个数 record
      this.updateExerciseFaultRecordData(record);
      
      // 2.计算该班级的总个数
      // 2.计算该班级的总个数
      this.updateExerciseFaultBookInfo(resumeBook);
      if(resumeBook.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
      if(resumeBook.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
         resumeBook.setTitleMaxNumber("0");
         resumeBook.setStatus("0");
      }else if(StringUtils.isNotBlank(resumeBook.getTitleMaxNumber()) && 
            resumeBook.getAllCount().compareTo(new BigInteger(resumeBook.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
            resumeBook.getAllCount().compareTo(new BigInteger(resumeBook.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
         resumeBook.setTitleMaxNumber(String.valueOf(resumeBook.getAllCount()));
      }
      TraceUtils.setUpdateTrace(resumeBook);
@@ -258,7 +258,7 @@
   }
   
   /**
    * 组装错题结果入库
    * 组装错题结果入库
    * @param resumeBookId
    * @param faultRecordId
    * @param recordResult
@@ -275,7 +275,7 @@
      argsMap.put("exerciseIds", args);
      argsMap.put("resumeBookId", resumeBookId);
      
      //  查询此用户是否有错题记录
      //  查询此用户是否有错题记录
      String hql = "from ExerciseFault where exerciseItemId in (:exerciseIds) and resumeBookId=:resumeBookId and deleteFlag is false ";
      List<ExerciseFault> lstExistfavor = this.findByComplexHql(hql, argsMap, ExerciseFault.class);
      
@@ -287,18 +287,18 @@
      List<ExerciseFault> lstFault = new ArrayList<ExerciseFault>(recordResult.getItems().size());
      ExerciseFault fault=null;
      
      // 循环每一条记录
      // 判断客户端提交的数据是否重复map
      // 循环每一条记录
      // 判断客户端提交的数据是否重复map
      Map<String,Object> repeatMap = new HashMap<String,Object>(lstItems.size());
      
      for(ExerciseExtendRecordData record:lstItems){
            if(repeatMap.get(record.getExerciseId()) != null && 
                  (boolean)repeatMap.get(record.getExerciseId()) == record.getFlag()){//重复数据
                  (boolean)repeatMap.get(record.getExerciseId()) == record.getFlag()){//重复数据
               continue;
            }
         
            fault=faultMap.get(record.getExerciseId());
            if(record.getFlag()){//添加错题
            if(record.getFlag()){//添加错题
               if(fault == null){
                  fault = new ExerciseFault();
                  fault.setFaultRecordId(faultRecordId);
@@ -306,7 +306,7 @@
                  fault.setExerciseItemId(record.getExerciseId());
                  fault.setDeleteFlag(false);
                  TraceUtils.setCreateTrace(fault);
               }else{// 原来已经删除  恢复
               }else{// 原来已经删除  恢复
                  if(fault.getDeleteFlag()){
                     fault.setDeleteFlag(false);
                     fault.setAnswer(null);
@@ -317,7 +317,7 @@
                  }
               }
               
            }else{// 删除错题
            }else{// 删除错题
               if(fault == null){
                  continue;
               }
@@ -331,8 +331,8 @@
            repeatMap.put(record.getExerciseId(), record.getFlag());
      }
      
      // 2.记录错题itemList
      // 批量增加
      // 2.记录错题itemList
      // 批量增加
      this.saveOrUpdateAll(lstFault);
      this.flush();
      
@@ -340,19 +340,19 @@
   }
   
   /**
    * 操作练习记录
    * 操作练习记录
    * @param subjectId
    * @return
    */
   public ExerciseFaultRecord doOperExerciseFaultRecord(String resumeBookId,String exerciseGroupId,
         String exerciseGroupType, ExciseExtendReqData recordResult){
      // 错题记录 当前组
      // 错题记录 当前组
      String hql = "from ExerciseFaultRecord where resumeBookId=? and exerciseGroupId=? and deleteFlag is false ";
      
      ExerciseFaultRecord record = this.findUnique(hql, 
            CollectionUtils.newList(resumeBookId, exerciseGroupId), ExerciseFaultRecord.class);
      
      if(null == record){// 记录不存在
      if(null == record){// 记录不存在
         
         record = new ExerciseFaultRecord();
         record.setResumeBookId(resumeBookId);
@@ -370,7 +370,7 @@
   
   
   /**
    * 操作练习记录
    * 操作练习记录
    * @param subjectId
    * @return
    */
@@ -380,27 +380,27 @@
      
      List<Object> args = CollectionUtils.newList(ClientUtils.getClassId(), 
               ClientUtils.getUserId());
      if(StringUtils.isNotBlank(subjectId)){// 高校
      if(StringUtils.isNotBlank(subjectId)){// 高校
         hql.append(" and subjectId=? ");
          args.add(subjectId);
      }
      
      //  查询此用户是否有错题记录
      //  查询此用户是否有错题记录
      List<ExerciseFaultBook> lstFault = this.find(hql.toString(), args, ExerciseFaultBook.class);
      
      ExerciseFaultBook book = null;
      String hql_book;
      if(lstFault.isEmpty()){// 记录为空
      if(lstFault.isEmpty()){// 记录为空
         
         if(StringUtils.isNotBlank(subjectId)){// 高校
         if(StringUtils.isNotBlank(subjectId)){// 高校
            
            // 先查询上级记录是否存在
            // 先查询上级记录是否存在
            hql_book = "from ExerciseFaultBook where classId=? and userId=? and deleteFlag is false ";
            
            lstFault = this.find(hql_book, CollectionUtils.newList(ClientUtils.getClassId(), 
                  ClientUtils.getUserId()), ExerciseFaultBook.class);
            
            if(lstFault.isEmpty()){//班级记录不存在
            if(lstFault.isEmpty()){//班级记录不存在
               book = this.insertExerciseFaultBookNew(ExerciseFaultBook.TYPE_ORGANIZATION, null);
            }
            
@@ -420,7 +420,7 @@
   
   
   /**
    * 新增错题book记录
    * 新增错题book记录
    * @param groupId
    * @return 
    */
@@ -443,7 +443,7 @@
   }
   
   /**
    * 更新错题book记录
    * 更新错题book记录
    * @param groupId
    * @return 
    */
@@ -458,30 +458,30 @@
   
   
   /**
    * 操作错题记录
    * 操作错题记录
    */
   public Map<String,Object> doOperExerciseFavorRecordData(String subjectId, ExciseExtendReqData recordResult) {
      // 练习组id
      // 练习组id
      String exerciseGroupId = recordResult.getExerciseGroupId();
      String exerciseGroupType = recordResult.getExerciseGroupType();
      
      // 1.操作练习总记录
      // 1.操作练习总记录
      ExerciseFavoriteBook  favorBook = doOperExerciseFavoriteBook(subjectId, recordResult);
      String favoriteBookId = favorBook.getFavoriteBookId();
      
      // 2.操作练习记录
      // 2.操作练习记录
      ExerciseFavoriteRecord record = doOperExerciseFavorRecord(favoriteBookId,
            exerciseGroupId, exerciseGroupType,recordResult);
      String favoriteRecordId = record.getFavoriteRecordId();
      
      // 3.组装错题结果入库
      // 3.组装错题结果入库
      doOperFavorExerciseToDB(favoriteBookId, favoriteRecordId, recordResult);
      
      
      // 4. 重新计算做题记录总个数  收藏
      // 4. 重新计算做题记录总个数  收藏
      record = this.doCalcFavorExericseStatisBySubmitData(record, favorBook, subjectId);
      
      // 5.返回结果
      // 5.返回结果
      Map<String,Object> map = new HashMap<String, Object>(3);
      map.put(EXERCISE_RECORD_ID, favoriteRecordId);
      map.put("exerciseGroupId", exerciseGroupId);
@@ -491,7 +491,7 @@
   }
   
   /**
    * 更新ExerciseFavoriteRecord数据
    * 更新ExerciseFavoriteRecord数据
    * @param record
    * @return
    */
@@ -511,14 +511,14 @@
      
      Object[] objs = lstFault.get(0);
      
      //  拆分子数据
      //  拆分子数据
      packagingExerciseFavoriteRecordData(record, objs);
      
      if(record.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
      if(record.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
         record.setTitleMaxNumber("0");
         record.setStatus("0");
      }else if(StringUtils.isNotBlank(record.getTitleMaxNumber()) && 
            record.getAllCount().compareTo(new BigInteger(record.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
            record.getAllCount().compareTo(new BigInteger(record.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
         record.setTitleMaxNumber(String.valueOf(record.getAllCount()));
      }
      TraceUtils.setUpdateTrace(record);
@@ -528,7 +528,7 @@
   }
   
   /**
    * 拆分子数据
    * 拆分子数据
    * @param record
    * @param objs
    */
@@ -543,23 +543,23 @@
   }
   
   /**
    * 重新计算做题记录总个数  收藏
    * 重新计算做题记录总个数  收藏
    * @param exerciseGroupId
    * @param exerciseRecordId
    * @return
    */
   public ExerciseFavoriteRecord doCalcFavorExericseStatisBySubmitData(ExerciseFavoriteRecord record,
         ExerciseFavoriteBook favorBook,String subjectId){
      // 1.计算做题总个数 record
      // 1.计算做题总个数 record
      this.updateExerciseFavoriteRecordData(record);
            
      // 2.计算该班级的总个数
      // 2.计算该班级的总个数
      this.updateExerciseFavorBookInfo(favorBook);
      if(favorBook.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
      if(favorBook.getAllCount().compareTo(BigInteger.ZERO) == 0){// 全部删除后 数据清0
         favorBook.setTitleMaxNumber("0");
         favorBook.setStatus("0");
      }else if(StringUtils.isNotBlank(favorBook.getTitleMaxNumber()) 
            && favorBook.getAllCount().compareTo(new BigInteger(favorBook.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
            && favorBook.getAllCount().compareTo(new BigInteger(favorBook.getTitleMaxNumber())) < 0){// 总个数小于最大题号数
         favorBook.setTitleMaxNumber(String.valueOf(favorBook.getAllCount()));
      }
      TraceUtils.setUpdateTrace(favorBook);
@@ -569,7 +569,7 @@
   }
   
   /**
    * 组装错题结果入库
    * 组装错题结果入库
    * @param resumeBookId
    * @param faultRecordId
    * @param recordResult
@@ -585,7 +585,7 @@
      argsMap.put("exerciseIds", args);
      argsMap.put("favoriteRecordId", favoriteRecordId);
      
      //  查询此用户是否有收藏记录
      //  查询此用户是否有收藏记录
      String hql = "from ExerciseFavorite where exerciseItemId in (:exerciseIds) and favoriteRecordId=:favoriteRecordId and deleteFlag is false";
      List<ExerciseFavorite>  lstExistfavor =  this.findByComplexHql(hql, argsMap, ExerciseFavorite.class);
      Map<String, ExerciseFavorite> favorMap = new HashMap<String, ExerciseFavorite>();
@@ -595,18 +595,18 @@
      
      List<ExerciseFavorite> lstFavor= new ArrayList<ExerciseFavorite>();
      ExerciseFavorite favor=null;
      // 循环每一条记录
      // 判断客户端提交的数据是否重复map
      // 循环每一条记录
      // 判断客户端提交的数据是否重复map
      Map<String,Object> repeatMap = new HashMap<String,Object>(lstItems.size());
      
      for(ExerciseExtendRecordData record:lstItems){
         if(repeatMap.get(record.getExerciseId()) != null && 
               (boolean)repeatMap.get(record.getExerciseId()) == record.getFlag()){//重复数据
               (boolean)repeatMap.get(record.getExerciseId()) == record.getFlag()){//重复数据
            continue;
         }
            
         favor = favorMap.get(record.getExerciseId());
         if(record.getFlag()){//添加收藏记录
         if(record.getFlag()){//添加收藏记录
            if(favor == null){
               favor = new ExerciseFavorite();
               favor.setFavoriteBookId(favoriteBookId);
@@ -614,7 +614,7 @@
               favor.setExerciseItemId(record.getExerciseId());
               TraceUtils.setCreateTrace(favor);
               favor.setDeleteFlag(false);
            }else{//原来已经删除 现在恢复
            }else{//原来已经删除 现在恢复
               if(favor.getDeleteFlag()){
                  favor.setAnswer(null);
                  favor.setCorrect(Byte.valueOf("0"));
@@ -625,7 +625,7 @@
               }
            }
            
         }else{// 删除收藏
         }else{// 删除收藏
            if(favor == null){
               continue;
            }
@@ -640,27 +640,27 @@
         repeatMap.put(record.getExerciseId(), record.getFlag());
      }
      
      // 2.记录收藏itemList
      // 批量增加或者更新
      // 2.记录收藏itemList
      // 批量增加或者更新
      this.saveOrUpdateAll(lstFavor);
      this.flush();
      
      return new Result(true);
   }
   /**
    * 操作练习记录
    * 操作练习记录
    * @param subjectId
    * @return
    */
   public ExerciseFavoriteRecord doOperExerciseFavorRecord(String favoriteBookId,String exerciseGroupId,
         String exerciseGroupType,ExciseExtendReqData recordResult){
      // 错题记录 当前组
      // 错题记录 当前组
      String hql = "from ExerciseFavoriteRecord where favoriteBookId=? and exerciseGroupId=? and deleteFlag is false ";
      
      ExerciseFavoriteRecord record = this.findUnique(hql, 
            CollectionUtils.newList(favoriteBookId, exerciseGroupId), ExerciseFavoriteRecord.class);
      
      if(null == record){// 记录不存在
      if(null == record){// 记录不存在
         
         record = new ExerciseFavoriteRecord();
         record.setFavoriteBookId(favoriteBookId);
@@ -677,7 +677,7 @@
   
   
   /**
    * 操作练习记录
    * 操作练习记录
    * @param subjectId
    * @return
    */
@@ -687,27 +687,27 @@
      
      List<Object> args = CollectionUtils.newList(ClientUtils.getClassId(), 
               ClientUtils.getUserId());
      if(StringUtils.isNotBlank(subjectId)){// 高校
      if(StringUtils.isNotBlank(subjectId)){// 高校
         hql.append(" and subjectId=? ");
         args.add(subjectId);
      }
      
      //  查询此用户是否有错题记录
      //  查询此用户是否有错题记录
      List<ExerciseFavoriteBook> lstFavor = this.find(hql.toString(), args, ExerciseFavoriteBook.class);
      
      ExerciseFavoriteBook book = null;
      String hql_book;
      if(lstFavor.isEmpty()){// 记录为空
      if(lstFavor.isEmpty()){// 记录为空
         
         if(StringUtils.isNotBlank(subjectId)){// 高校
         if(StringUtils.isNotBlank(subjectId)){// 高校
            
            // 先查询上级记录是否存在
            // 先查询上级记录是否存在
            hql_book = "from ExerciseFavoriteBook where classId=? and userId=? and deleteFlag is false ";
            
            lstFavor = this.find(hql_book, CollectionUtils.newList(ClientUtils.getClassId(), 
                  ClientUtils.getUserId()), ExerciseFavoriteBook.class);
            
            if(lstFavor.isEmpty()){//班级记录不存在
            if(lstFavor.isEmpty()){//班级记录不存在
               book = this.insertExerciseFavorBookNew(ExerciseFavoriteBook.TYPE_ORGANIZATION, null);
            }else{
               book = lstFavor.get(0);
@@ -727,7 +727,7 @@
   }
   
   /**
    * 新增错题book记录
    * 新增错题book记录
    * @param groupId
    * @return 
    */
@@ -741,7 +741,7 @@
   }
   
   /**
    * 新增错题book记录
    * 新增错题book记录
    * @param groupId
    * @return 
    */
@@ -763,15 +763,15 @@
   }
   
   /**
    * 错题本提交答案
    * 错题本提交答案
    */
   @Override
   public Map<String,Object> doSubmitExerFaultAnswerDataNew(ExerciseSubmitAnswerData clientAnswerResult) {
      
      // 0.重新整理答题数据
      // 0.重新整理答题数据
      ExerciseSubmitAnswerData answerResult = exerciseVerService.getExerciseSubmitAnswerDataNew(clientAnswerResult);
      
      // 1.更新错题记录
      // 1.更新错题记录
      ExerciseFaultRecord record = this.doOperExerFaultRecord(answerResult);
      
      if(null == record){
@@ -780,7 +780,7 @@
      
      String faultRecordId = record.getFaultRecordId();
      
      // 返回结果
      // 返回结果
      Map<String,Object> map = new HashMap<String, Object>(3);
      map.put(EXERCISE_RECORD_ID, faultRecordId);
      map.put("exerciseGroupId", record.getExerciseGroupId());
@@ -790,16 +790,16 @@
      map.put("doCount", answerResult.getDoCount());
            
      if(answerResult.getItems().isEmpty() 
            && answerResult.getSubmitType() != 1){//  submitType:1表示本地无网情况下重新做题过
            && answerResult.getSubmitType() != 1){//  submitType:1表示本地无网情况下重新做题过
         return map;
      }
      
      // 2.判断是否本地重新做过 submitType:1表示本地无网情况下重新做题过
      // 2.判断是否本地重新做过 submitType:1表示本地无网情况下重新做题过
      if(1 == answerResult.getSubmitType()){
         doOperExerciseFaultRecordByRedo(faultRecordId);
      }
      
      // 2.更新答案
      // 2.更新答案
      answerResult.setExerciseRecordId(faultRecordId);
      Result result = this.doUpdateExerFaultAnswerData(answerResult);
      
@@ -807,14 +807,14 @@
         return null;
      }
      
      // 3.重新计算做题记录正确个数 做题个数  正确率
      // 3.重新计算做题记录正确个数 做题个数  正确率
      this.updateExerciseFaultRecordData(record);
      
      return map;
   }
   
   /**
    * 更新错题记录
    * 更新错题记录
    * @param answerResult
    * @return 
    */
@@ -822,11 +822,11 @@
      
      ExerciseFaultRecord record = null;
      String exerciseRecordId = answerResult.getExerciseRecordId();
      if(StringUtils.isNotBlank(exerciseRecordId)){// 正常做题
      if(StringUtils.isNotBlank(exerciseRecordId)){// 正常做题
         
         record = this.read(ExerciseFaultRecord.class, answerResult.getExerciseRecordId());
         
      }else{// 无网情况下
      }else{// 无网情况下
         String hql = "from ExerciseFaultRecord r where r.deleteFlag is false and "
               + "r.faultBook.userId=? and r.faultBook.classId=? and r.exerciseGroupId=?";
         
@@ -839,9 +839,9 @@
      }
      
      if(answerResult.getItems().isEmpty() 
            && ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus())){//仅仅交卷
            && ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus())){//仅仅交卷
         record.setStatus(answerResult.getStatus());
         // 更新答案时间
         // 更新答案时间
         record.setAnswerUpdateTime(new Date(System.currentTimeMillis()));
         
         this.save(record);
@@ -850,14 +850,14 @@
      }
      
      
      // 计算
//      if(!"1".equals(record.getStatus())){// 非提交的就更新
      // 计算
//      if(!"1".equals(record.getStatus())){// 非提交的就更新
//      }
      record.setStatus(StringUtils.isBlank(answerResult.getStatus()) ? "0" : answerResult.getStatus());
      if(!"0".equals(answerResult.getCurrTitleNum())){
         record.setTitleMaxNumber(StringUtils.isBlank(answerResult.getCurrTitleNum()) ? "0" : answerResult.getCurrTitleNum());
      }
      // 更新答案时间
      // 更新答案时间
      record.setAnswerUpdateTime(new Date(System.currentTimeMillis()));
      
      this.save(record);
@@ -866,7 +866,7 @@
   }
   
   /**
    *提交 错题结果到db
    *提交 错题结果到db
    * @return
    */
   public Result doUpdateExerFaultAnswerData(ExerciseSubmitAnswerData answerResult) {
@@ -875,10 +875,10 @@
         return new Result(true);
      }
      
      // 批量更新答案
      // 批量更新答案
      List<ExerciseFault> lstResultFault =new ArrayList<ExerciseFault>(lstAnswers.size());
      
      // 2.1.组装参数 用于查询练习选项图片
      // 2.1.组装参数 用于查询练习选项图片
      Map<String, Object> argsMap = new HashMap<String, Object>(2);
      Object[] args = new Object[lstAnswers.size()];
      for(int i=0; i<lstAnswers.size(); i++){
@@ -890,7 +890,7 @@
      String hql = "from ExerciseFault where deleteFlag is false and exerciseItemId in (:exerciseIds) and faultRecordId =:exerciseRecordId ";
      List<ExerciseFault> lstFault = this.findByComplexHql(hql, argsMap, ExerciseFault.class);
      
      // 按练习id 对应放到map中
      // 按练习id 对应放到map中
      Map<String, ExerciseFault> faultMap = new HashMap<String, ExerciseFault>(lstFault.size());
      for(ExerciseFault fault:lstFault){
         faultMap.put(fault.getExerciseItemId(), fault);
@@ -902,7 +902,7 @@
         if(null == fault){
            continue;
         }
         if(StringUtils.isBlank(answer.getAnswer())){// 答案为空
         if(StringUtils.isBlank(answer.getAnswer())){// 答案为空
            continue;
         }
         
@@ -912,7 +912,7 @@
         lstResultFault.add(fault);
      }
      
      // 1.保存 错题 收集lst
      // 1.保存 错题 收集lst
      this.saveOrUpdateAll(lstResultFault);
      this.flush();
      
@@ -920,38 +920,38 @@
   }
   
   /**
    *  收藏本提交答案
    *  收藏本提交答案
    */
   @Override
   public Map<String,Object> doSubmitExerFavorAnswerDataNew(ExerciseSubmitAnswerData clientAnswerResult) {
      
      // 0.重新整理答题数据
      // 0.重新整理答题数据
      ExerciseSubmitAnswerData answerResult = exerciseVerService.getExerciseSubmitAnswerDataNew(clientAnswerResult);
      
      // 1.更新错题记录
      // 1.更新错题记录
      ExerciseFavoriteRecord record = doOperExerFavorRecord(answerResult);
      if(null == record){
         return null;
      }
      String favoriteRecordId = record.getFavoriteRecordId();
      
      // 返回结果
      // 返回结果
      Map<String,Object> map = new HashMap<String, Object>(3);
      map.put(EXERCISE_RECORD_ID, favoriteRecordId);
      map.put("exerciseGroupId", record.getExerciseGroupId());
      map.put(UPDATE_TIME,   DateTimeUtils.getCurrDateTime(record.getAnswerUpdateTime()));
      map.put("exerciseBookId", record.getFavoriteBookId());
      
      if(answerResult.getItems().isEmpty() && answerResult.getSubmitType() != 1){//仅仅交卷
      if(answerResult.getItems().isEmpty() && answerResult.getSubmitType() != 1){//仅仅交卷
         return map;
      }
      
      // 2.判断是否本地重新做过 submitType:1表示本地无网情况下重新做题过
      // 2.判断是否本地重新做过 submitType:1表示本地无网情况下重新做题过
      if(1 == answerResult.getSubmitType()){
         doOperExerciseFavorRecordByRedo(favoriteRecordId);
      }
            
      // 2.更新答案
      // 2.更新答案
      answerResult.setExerciseRecordId(favoriteRecordId);
      Result result = doUpdateExerFavorAnswerData(answerResult);
      
@@ -959,14 +959,14 @@
         return null;
      }
      
      //  3.重新计算做题记录正确个数 做题个数  正确率  收藏
      //  3.重新计算做题记录正确个数 做题个数  正确率  收藏
      this.updateExerciseFavoriteRecordData(record);
      
      return map;
   }
   
   /**
    * 更新错题记录
    * 更新错题记录
    * @param answerResult
    * @return 
    */
@@ -974,11 +974,11 @@
      
      ExerciseFavoriteRecord record = null;
      String exerciseRecordId = answerResult.getExerciseRecordId();
      if(StringUtils.isNotBlank(exerciseRecordId)){// 正常做题
      if(StringUtils.isNotBlank(exerciseRecordId)){// 正常做题
         
         record = this.read(ExerciseFavoriteRecord.class, exerciseRecordId);
         
      }else{// 无网情况下
      }else{// 无网情况下
         String hql = "from ExerciseFavoriteRecord r where r.deleteFlag is false "
               + " and r.favorBook.userId=? and r.favorBook.classId=? and r.exerciseGroupId=?";
         
@@ -991,9 +991,9 @@
      }
      
      if(answerResult.getItems().isEmpty() 
            && ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus())){//仅仅交卷
            && ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus())){//仅仅交卷
         record.setStatus(answerResult.getStatus());
         // 更新答案时间
         // 更新答案时间
         record.setAnswerUpdateTime(new Date(System.currentTimeMillis()));
         
         this.save(record);
@@ -1001,15 +1001,15 @@
         return record;
      }
      
//      // 计算
//      if(!"1".equals(record.getStatus())){// 非提交的就更新
//      // 计算
//      if(!"1".equals(record.getStatus())){// 非提交的就更新
//      }
      record.setStatus(answerResult.getStatus());
      if(!"0".equals(answerResult.getCurrTitleNum())){
         record.setTitleMaxNumber(answerResult.getCurrTitleNum());
      }
      
      // 更新答案时间
      // 更新答案时间
      record.setAnswerUpdateTime(new Date(System.currentTimeMillis()));
      
      this.save(record);
@@ -1019,7 +1019,7 @@
   
   
   /**
    *提交 错题结果到db
    *提交 错题结果到db
    * @return
    */
   public Result doUpdateExerFavorAnswerData(ExerciseSubmitAnswerData answerResult) {
@@ -1028,10 +1028,10 @@
      if(lstAnswers.isEmpty()){
         return new Result(true);
      }
      // 批量更新答案
      // 批量更新答案
      List<ExerciseFavorite> lstResultFavor =new ArrayList<ExerciseFavorite>(lstAnswers.size());
      
      // 2.1.组装参数 用于查询练习选项图片
      // 2.1.组装参数 用于查询练习选项图片
      Map<String, Object> argsMap = new HashMap<String, Object>(2);
      Map<String, Object> exerItemIdMap = new HashMap<String, Object>(1);
      Object[] args = new Object[lstAnswers.size()];
@@ -1045,7 +1045,7 @@
      String hql = "from ExerciseFavorite where deleteFlag is false and exerciseItemId in (:exerciseIds) and favoriteRecordId =:exerciseRecordId ";
      List<ExerciseFavorite> lstFavor = this.findByComplexHql(hql, argsMap, ExerciseFavorite.class);
      
      // 按练习id 对应放到map中
      // 按练习id 对应放到map中
      Map<String, ExerciseFavorite> favorMap = new HashMap<String, ExerciseFavorite>(lstFavor.size());
      for(ExerciseFavorite favor:lstFavor){
         favorMap.put(favor.getExerciseItemId(), favor);
@@ -1057,7 +1057,7 @@
         if(null == favor){
            continue;
         }
         if(StringUtils.isBlank(answer.getAnswer())){// 答案为空
         if(StringUtils.isBlank(answer.getAnswer())){// 答案为空
            continue;
         }
         favor.setAnswer(answer.getAnswer());
@@ -1073,7 +1073,7 @@
   }
   
   /**
    * 查询错题本列表数据
    * 查询错题本列表数据
    * @param exerType
    * @param subjectId
    * @param pager
@@ -1083,7 +1083,7 @@
   public List<ExerGroupResponseData> queryExerciseFaultListData(
         int exerType, String subjectId, Pager pager) {
      StringBuffer hql = new StringBuffer(512);
      //  1.查询分组列表
      //  1.查询分组列表
      hql.append("select r,g from ExerciseFaultRecord r, ExerciseFaultBook b, ExerciseGroup g "
            + " where r.resumeBookId=b.resumeBookId "
            + " and r.exerciseGroupId=g.groupId "
@@ -1092,18 +1092,18 @@
            + "   and b.userId=?  and r.allCount>0 ");
      
      List<Object> args = CollectionUtils.newList(ClientUtils.getUserId());
      if(exerType != 0){ //表示查询全部错题
      if(exerType != 0){ //表示查询全部错题
         hql.append(" and r.exerciseGroupType=?");
         args.add((short)exerType);
      }
            
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
         
         hql.append(" and b.type=? and b.subjectId=? and g.subjectId=? ");
         args.add(ExerciseFaultBook.TYPE_COLLEGE);
         args.add(subjectId);
         args.add(subjectId);
      }else{// 非高校
      }else{// 非高校
         
         hql.append(" and b.type=? and b.classId=? and g.classId=?");
         args.add(ExerciseFaultBook.TYPE_ORGANIZATION);
@@ -1112,14 +1112,14 @@
      }
      hql.append(" order by r.updateTime desc ");
      
      // 根据结构查询得到所需记录
      // 根据结构查询得到所需记录
      List<Object[]> lstRecord = this.findList(hql.toString(), pager, args, Object[].class);
      
      if(lstRecord.isEmpty()){// 查询结果记录为空
      if(lstRecord.isEmpty()){// 查询结果记录为空
         return null;
      }
      
      // 3.组装参数
      // 3.组装参数
      Object[] argss = new Object[lstRecord.size()];
      ExerciseGroup groupp=null;
      for(int i=0; i<lstRecord.size(); i++){
@@ -1127,15 +1127,15 @@
         argss[i] = groupp.getGroupId();
      }
      
      // 获取个人用户组对应的收藏记录 题目更新时间
      // 获取个人用户组对应的收藏记录 题目更新时间
      Map<String, Map<String, Object>> favorMap = this.queryFavorRecordByGroup(subjectId, argss);
            
      // 结果返回参数
      // 结果返回参数
      List<ExerGroupResponseData> lstResult = new ArrayList<ExerGroupResponseData>(lstRecord.size());
      
      for(Object[] objs:lstRecord){
         
         // 组装练习错题本列表数据
         // 组装练习错题本列表数据
         lstResult.add(packagingExerciseFaultListData(
               favorMap, objs));
      }
@@ -1144,7 +1144,7 @@
   }
   /**
    * 组装练习错题本列表数据
    * 组装练习错题本列表数据
    * @param favorMap
    * @param objs
    * @return
@@ -1156,7 +1156,7 @@
      
      ExerGroupResponseData resultObj = new ExerGroupResponseData();
      
      // 拆分方法
      // 拆分方法
      packagingExerciseFaultListChildData(record, resultObj);
      
      resultObj.setExtendAllCount(record.getAllCount()==null ? BigInteger.ZERO  : record.getAllCount());
@@ -1170,7 +1170,7 @@
      resultObj.setFaultUpdateTime(record.getUpdateTime());
      resultObj.setFaultCount(resultObj.getAllCount());
      if(favorMap != null && favorMap.get(group.getGroupId()) != null){
         resultObj.setFavorUpdateTime((Timestamp)favorMap.get(group.getGroupId()).get(UPDATE_TIME));//设置收藏本题目更新时间
         resultObj.setFavorUpdateTime((Timestamp)favorMap.get(group.getGroupId()).get(UPDATE_TIME));//设置收藏本题目更新时间
         resultObj.setFavorCount((BigInteger)favorMap.get(group.getGroupId()).get("allCount"));
      }
      
@@ -1181,7 +1181,7 @@
   }
   
   /**
    * 组装练习错题本列表数据 拆分方法
    * 组装练习错题本列表数据 拆分方法
    * @param record
    * @param resultObj
    */
@@ -1197,7 +1197,7 @@
   }
   
   /**
    * 获取个人用户组对应的错题题目更新时间
    * 获取个人用户组对应的错题题目更新时间
    * @param subjectId
    * @param args
    * @return
@@ -1205,7 +1205,7 @@
   @Override
   public Map<String, Map<String, Object>> queryFaultRecordByGroup(String subjectId, Object[] args) {
      StringBuffer hql = new StringBuffer(512);
      //  1.查询分组列表
      //  1.查询分组列表
      hql.append("select r.exerciseGroupId,r.updateTime,r.allCount from ExerciseFaultRecord r, ExerciseFaultBook b "
            + " where r.resumeBookId=b.resumeBookId "
            + "   and b.userId = :userId and r.exerciseGroupId in (:groupIds)  ");
@@ -1215,19 +1215,19 @@
      argsMap.put("userId", ClientUtils.getUserId());
      argsMap.put("groupIds", args);
      
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
         
         hql.append(" and b.type=:type and b.subjectId=:subjectId ");
         argsMap.put("type", ExerciseFaultBook.TYPE_COLLEGE);
         argsMap.put("subjectId", subjectId);
      }else{// 非高校
      }else{// 非高校
         
         hql.append(" and b.type=:type and b.classId=:classId ");
         argsMap.put("type", ExerciseFaultBook.TYPE_ORGANIZATION);
         argsMap.put("classId", ClientUtils.getClassId());
      }
      
      // 根据结构查询得到所需记录
      // 根据结构查询得到所需记录
      List<Object[]> lstRecord = this.findByComplexHql(hql.toString(), argsMap, Object[].class);
      
      Map<String, Map<String, Object>> resultMap = new HashMap<String, Map<String, Object>>(lstRecord.size());
@@ -1243,7 +1243,7 @@
   }
   
   /**
    *获取个人用户组对应的收藏题目更新时间
    *获取个人用户组对应的收藏题目更新时间
    * @param subjectId
    * @param args
    * @return
@@ -1251,7 +1251,7 @@
   @Override
   public Map<String, Map<String, Object>> queryFavorRecordByGroup(String subjectId, Object[] args) {
      StringBuffer hql = new StringBuffer(512);
      //  1.查询分组列表
      //  1.查询分组列表
      hql.append("select r.exerciseGroupId,r.updateTime,r.allCount from ExerciseFavoriteRecord r, ExerciseFavoriteBook b"
            + " where r.favoriteBookId=b.favoriteBookId "
            + "   and b.userId = :userId and r.exerciseGroupId in (:groupIds)  ");
@@ -1261,19 +1261,19 @@
      argsMap.put("userId", ClientUtils.getUserId());
      argsMap.put("groupIds", args);
      
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
         
         hql.append(" and b.type=:type and b.subjectId=:subjectId ");
         argsMap.put("type", ExerciseFaultBook.TYPE_COLLEGE);
         argsMap.put("subjectId", subjectId);
      }else{// 非高校
      }else{// 非高校
         
         hql.append(" and b.type=:type and b.classId=:classId ");
         argsMap.put("type", ExerciseFaultBook.TYPE_ORGANIZATION);
         argsMap.put("classId", ClientUtils.getClassId());
      }
      
      // 根据结构查询得到所需记录
      // 根据结构查询得到所需记录
      List<Object[]> lstRecord = this.findByComplexHql(hql.toString(), argsMap, Object[].class);
      Map<String, Map<String, Object>> resultMap = new HashMap<String, Map<String, Object>>(lstRecord.size());
      Map<String, Object> paramMap = null;
@@ -1288,8 +1288,8 @@
   }
   
   /**
    * 查询收藏本列表数据
    * @param exerType 0:表示全部错题
    * 查询收藏本列表数据
    * @param exerType 0:表示全部错题
    * @param subjectId
    * @param pager
    * @return
@@ -1298,7 +1298,7 @@
   public List<ExerGroupResponseData> queryExerciseFavorListData(int exerType,
         String subjectId, Pager pager) {
      StringBuffer hql = new StringBuffer(512);
      //  1.查询分组列表
      //  1.查询分组列表
      hql.append("select r, g from ExerciseFavoriteRecord r, ExerciseFavoriteBook b, ExerciseGroup g"
            + " where r.favoriteBookId=b.favoriteBookId "
            + " and r.exerciseGroupId=g.groupId "
@@ -1307,18 +1307,18 @@
            + " and b.userId=? and r.allCount>0 ");
      
      List<Object> args = CollectionUtils.newList(ClientUtils.getUserId());
      if(exerType != 0){ //表示查询非全部收藏  exerType=0为查询全部收藏
      if(exerType != 0){ //表示查询非全部收藏  exerType=0为查询全部收藏
         hql.append(" and r.exerciseGroupType=?");
         args.add((short)exerType);
      }
      
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
      if(StringUtils.isNotBlank(subjectId)){// 高校  通过课程过滤
         
         hql.append(" and b.type=? and b.subjectId=? and g.subjectId=? ");
         args.add(ExerciseFaultBook.TYPE_COLLEGE);
         args.add(subjectId);
         args.add(subjectId);
      }else{// 非高校
      }else{// 非高校
         
         hql.append(" and b.type=? and b.classId=? and g.classId=?");
         args.add(ExerciseFaultBook.TYPE_ORGANIZATION);
@@ -1327,10 +1327,10 @@
      }
      hql.append(" order by r.updateTime desc ");
      
      // 根据结构查询得到所需记录
      // 根据结构查询得到所需记录
      List<Object[]> lstRecord = this.findList(hql.toString(), pager, args,Object[].class);
      
      if(lstRecord.isEmpty()){// 查询结果记录为空
      if(lstRecord.isEmpty()){// 查询结果记录为空
         return null;
      }
      
@@ -1341,15 +1341,15 @@
         argss[i] = groupp.getGroupId();
      }
      
      // 获取个人用户组对应的错题记录 题目更新时间
      // 获取个人用户组对应的错题记录 题目更新时间
      Map<String, Map<String, Object>> faultMap = this.queryFaultRecordByGroup(subjectId, argss);
      
      // 结果返回参数
      // 结果返回参数
      List<ExerGroupResponseData> lstResult = new ArrayList<ExerGroupResponseData>(lstRecord.size());
      
      for(Object[] objs:lstRecord){
         
         // 组装练习收藏列表数据
         // 组装练习收藏列表数据
         lstResult.add(packagingExerciseFavorListData(
               faultMap, objs));
         
@@ -1359,7 +1359,7 @@
   }
   
   /**
    * 组装练习收藏列表数据
    * 组装练习收藏列表数据
    * @param faultMap
    * @param objs
    * @return
@@ -1371,7 +1371,7 @@
      
      ExerGroupResponseData resultObj = new ExerGroupResponseData();
      
      // 拆分组装数据
      // 拆分组装数据
      packagingExerciseFavorListChildData(record, resultObj);
      
      resultObj.setExtendAllCount(record.getAllCount()==null ? BigInteger.ZERO  : record.getAllCount());
@@ -1386,7 +1386,7 @@
      resultObj.setFavorUpdateTime(record.getUpdateTime());
      resultObj.setFavorCount(resultObj.getAllCount());
      if(faultMap !=null && faultMap.get(group.getGroupId()) !=null){
         resultObj.setFaultUpdateTime((Timestamp)faultMap.get(group.getGroupId()).get(UPDATE_TIME));//设置错题本题目更新时间
         resultObj.setFaultUpdateTime((Timestamp)faultMap.get(group.getGroupId()).get(UPDATE_TIME));//设置错题本题目更新时间
         resultObj.setFaultCount((BigInteger)faultMap.get(group.getGroupId()).get("allCount"));
      }
      
@@ -1397,7 +1397,7 @@
   }
   
   /**
    * 组装练习收藏列表数据 拆分组装数据
    * 组装练习收藏列表数据 拆分组装数据
    * @param record
    * @param resultObj
    */
@@ -1414,12 +1414,12 @@
   
   /**
    * 获取全部收藏练习数据
    * 获取全部收藏练习数据
    * @return
    */
   @Override
   public ExerItemResponseData queryAllExerciseFavorData(Pager pager) {
      //  1.查询此用户是否有错题记录
      //  1.查询此用户是否有错题记录
      String hql = "select item, favor.favorRecord.exerciseGroupId,favor.favorRecord.favorBook.status "
            + " from ExerciseItem item, ExerciseFavorite favor "
            + " where item.exerciseId=favor.exerciseItemId"
@@ -1445,34 +1445,34 @@
            status = String.valueOf(objs[2]);
         }
         item = new ExerciseItem();
         BeanUtils.copyProperties((ExerciseItem)objs[0], item);// 防止item同一个内存地址
         item.setExerciseGroupId(String.valueOf(objs[1]));//设置每个题目的组id
         BeanUtils.copyProperties((ExerciseItem)objs[0], item);// 防止item同一个内存地址
         item.setExerciseGroupId(String.valueOf(objs[1]));//设置每个题目的组id
         lstItems.add(item);
      }
      
      // 2.重新组装练习题 加入分析结果
      // 2.重新组装练习题 加入分析结果
      lstItems =  exerciseVerService.getCommonExerItemDetail(lstItems, null);
      
      // 3.组装答案
      // 3.组装答案
      ExerItemResponseData result = new ExerItemResponseData();
            
      result.setItems(lstItems);
      result.setStatus(status);
      
      result.setResult(new Result(true,"查询成功"));
      result.setResult(new Result(true,"查询成功"));
      
      return result; 
   }
   
   /**
    * 获取收藏练习数据
    * 获取收藏练习数据
    * @param groupId
    * @param exerciseRecordId 废弃
    * @param exerciseRecordId 废弃
    * @return
    */
   @Override
   public ExerItemResponseData queryExerciseFavorData(String groupId) {
      //  1.查询此用户是否有错题记录
      //  1.查询此用户是否有错题记录
      String hql = "select item, favor "
            + " from ExerciseItem item, ExerciseFavorite favor "
            + " where item.exerciseId=favor.exerciseItemId"
@@ -1489,13 +1489,13 @@
   }
   
   /**
    * 获取多套收藏练习数据
    * 获取多套收藏练习数据
    * @param groupId
    * @return
    */
   @Override
   public Map<String,Object> queryExerciseMutiFavorData(String groupId) {
      //  1.查询此用户是否有错题记录
      //  1.查询此用户是否有错题记录
      String hql = "select item.exerciseId "
            + " from ExerciseItem item, ExerciseFavorite favor "
            + " where item.exerciseId=favor.exerciseItemId"
@@ -1525,7 +1525,7 @@
   }
   
   /**
    * 查询收藏题目明细
    * 查询收藏题目明细
    * @param lstResult
    * @param groupId
    * @return
@@ -1560,11 +1560,11 @@
         
      }
      
      // 2.重新组装练习题 加入分析结果
      // 2.重新组装练习题 加入分析结果
      lstItems =  exerciseVerService.getCommonExerItemDetail(lstItems, groupId);
      
      
      // 3.组装答案
      // 3.组装答案
      ExerItemResponseData result = new ExerItemResponseData();
            
      result.setExerciseGroupId(groupId);
@@ -1573,18 +1573,18 @@
      
      result.setAnswers(lstAnswers);
      
      result.setResult(new Result(true,"查询成功"));
      result.setResult(new Result(true,"查询成功"));
      
      return result; 
   }
   
   /**
    * 获取全部错题练习数据
    * 获取全部错题练习数据
    * @return
    */
   @Override
   public ExerItemResponseData queryAllExerciseFaultData(Pager pager) {
      //  1.查询此用户是否有错题记录
      //  1.查询此用户是否有错题记录
      String hql = "select item, fault.faultRecord.exerciseGroupId,fault.faultRecord.faultBook.status "
            + " from ExerciseItem item, ExerciseFault fault "
            + " where item.exerciseId=fault.exerciseItemId"
@@ -1606,37 +1606,37 @@
      String status=null;
      for(Object[] objs:lstResult){
         if(objs[2] !=null) {
            status=String.valueOf(objs[2]);//获取全部题目的提交状态
            status=String.valueOf(objs[2]);//获取全部题目的提交状态
         }
         item = new ExerciseItem();
         BeanUtils.copyProperties((ExerciseItem)objs[0], item);// 防止item同一个内存地址
         item.setExerciseGroupId(String.valueOf(objs[1]));//设置每个题目的组id
         BeanUtils.copyProperties((ExerciseItem)objs[0], item);// 防止item同一个内存地址
         item.setExerciseGroupId(String.valueOf(objs[1]));//设置每个题目的组id
         lstItems.add(item);
      }
      
      // 2.重新组装练习题 加入分析结果
      // 2.重新组装练习题 加入分析结果
      lstItems = exerciseVerService.getCommonExerItemDetail(lstItems, null);
      
      
      // 3.组装答案
      // 3.组装答案
      ExerItemResponseData result = new ExerItemResponseData();
      
      result.setStatus(status);
      result.setItems(lstItems);
      
      result.setResult(new Result(true,"查询成功"));
      result.setResult(new Result(true,"查询成功"));
      
      return result; 
   }
   
   /**
    * 获取单套题错题练习数据
    * 获取单套题错题练习数据
    * @param groupId
    * @return
    */
   @Override
   public ExerItemResponseData queryExerciseFaultData(String groupId) {
      //  1.查询此用户是否有错题记录
      //  1.查询此用户是否有错题记录
      String hql = "select item, fault "
            + " from ExerciseItem item, ExerciseFault fault "
            + " where item.exerciseId=fault.exerciseItemId"
@@ -1645,7 +1645,7 @@
            + " and item.deleteFlag is false"
            + " and fault.deleteFlag is false"
            + " order by fault.createTime";
      // 2.查询答案
      // 2.查询答案
      
      List<Object[]> lstResult = this.findwithRawResult(hql, CollectionUtils.newList(ClientUtils.getUserId(), groupId));
      
@@ -1653,14 +1653,14 @@
   }
   
   /**
    * 获取多套题错题练习数据
    * 获取多套题错题练习数据
    * @param groupId
    * @return
    */
   @Override
   public Map<String,Object> queryExerciseMutiFaultData(String groupId) {
      
      //  1.查询题目
      //  1.查询题目
      String hql = "select item.exerciseId "
            + " from ExerciseItem item, ExerciseFault fault "
            + " where item.exerciseId=fault.exerciseItemId"
@@ -1691,7 +1691,7 @@
   
   
   /**
    * 查询错题明细数据
    * 查询错题明细数据
    * @param lstResult
    * @param groupId
    * @return
@@ -1710,8 +1710,8 @@
      for(Object[] objs:lstResult){
         
         item = (ExerciseItem)objs[0];
         if(StringUtils.isBlank(groupId)){// 表示查询所有错题
            item.setExerciseGroupId(String.valueOf(objs[2]));//设置每个题目的组id
         if(StringUtils.isBlank(groupId)){// 表示查询所有错题
            item.setExerciseGroupId(String.valueOf(objs[2]));//设置每个题目的组id
         }
         lstItems.add(item);
         
@@ -1729,11 +1729,11 @@
         }
      }
      
      // 2.重新组装练习题 加入分析结果
      // 2.重新组装练习题 加入分析结果
      lstItems = exerciseVerService.getCommonExerItemDetail(lstItems, groupId);
      
      
      // 3.组装答案
      // 3.组装答案
      ExerItemResponseData result = new ExerItemResponseData();
      
      result.setExerciseGroupId(groupId);
@@ -1742,13 +1742,13 @@
      
      result.setAnswers(lstAnswers);
      
      result.setResult(new Result(true,"查询成功"));
      result.setResult(new Result(true,"查询成功"));
      
      return result; 
   }
   
   /**
    * 获取收藏本答案数据
    * 获取收藏本答案数据
    */
   @Override
   public ExerItemResponseData queryExerciseFavorAnswerData(String groupId) {
@@ -1760,7 +1760,7 @@
            + " and f.favorRecord.favorBook.classId=?"
            + " and f.answer is not null and f.deleteFlag is false";
      
      //  1.查询错题
      //  1.查询错题
      List<ExerciseFavorite> lstFavors = this.find(hql, CollectionUtils.newList(groupId,
            ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseFavorite.class);
      
@@ -1775,7 +1775,7 @@
         lstAnswers.add(answerU);
      }
         
      // 3.组装答案
      // 3.组装答案
      ExerItemResponseData result = new ExerItemResponseData();
            
      result.setAnswers(lstAnswers);
@@ -1785,7 +1785,7 @@
   }
   
   /**
    * 获取错题本答案数据
    * 获取错题本答案数据
    */
   @Override
   public ExerItemResponseData queryExerciseFaultAnswerData(String groupId) {
@@ -1797,7 +1797,7 @@
            + " and f.faultRecord.faultBook.classId=?"
            + " and f.answer is not null and f.deleteFlag is false";
      
      //  1.查询错题
      //  1.查询错题
      List<ExerciseFault> lstFaults = this.find(hql, CollectionUtils.newList(groupId, 
            ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseFault.class);
      
@@ -1812,7 +1812,7 @@
         lstAnswers.add(answerU);
      }
         
      // 3.组装答案
      // 3.组装答案
      ExerItemResponseData result = new ExerItemResponseData();
            
      result.setAnswers(lstAnswers);
@@ -1822,14 +1822,14 @@
   }
   /**
    * 操作本次做题记录
    * groupId 习题组ID  如果为All时,表示全部错题、全部收藏
    * 操作本次做题记录
    * groupId 习题组ID  如果为All时,表示全部错题、全部收藏
    * @return
    */
   @Override
   public Map<String, Object> doUpdateFaultExerRecordNew(String groupId) {
      
      if("All".equals(groupId)){//表示全部错题重做
      if("All".equals(groupId)){//表示全部错题重做
         return doCleanAllFaultRecordByRedo();
      }
      
@@ -1857,11 +1857,11 @@
      
      String faultRecordId = record.getFaultRecordId();
      
      //  重新做题 清理旧数据
      //  重新做题 清理旧数据
      doOperExerciseFaultRecordByRedo(faultRecordId);
      
      
      // 更新全部收藏题目的信息
      // 更新全部收藏题目的信息
      this.doOperFaultBookBySubmitAllAnswer(
            null, null, record.getResumeBookId(),null);
      
@@ -1875,12 +1875,12 @@
   }
   
   /**
    * 全部错题重做
    * 全部错题重做
    * @return
    */
   private Map<String,Object> doCleanAllFaultRecordByRedo(){
      
      /** 1.更新错题book记录为初始值 */
      /** 1.更新错题book记录为初始值 */
      String hql_book = "from ExerciseFaultBook b where b.userId=? and b.classId=? and b.type=? ";
      
      ExerciseFaultBook book = this.findUnique(hql_book, CollectionUtils.newList(ClientUtils.getUserId(),
@@ -1904,7 +1904,7 @@
      BigDecimal decimalZero = BigDecimal.ZERO;
      BigInteger integerZero = BigInteger.ZERO;
      
      /** 2.更新所有错题record记录为初始值 */
      /** 2.更新所有错题record记录为初始值 */
      String hql_record = "update ExerciseFaultRecord t set t.score="+decimalZero+", t.completionRate="+decimalZero+", t.doCount="+integerZero+","
            + "  t.correctCount="+integerZero+", t.accuracy="+decimalZero+", t.titleMaxNumber='0', t.status='0'"
            + "  where t.resumeBookId=? and t.deleteFlag is false";
@@ -1912,17 +1912,17 @@
      this.bulkUpdateInLoop(hql_record, new String[]{resumeBookId});
      
      
      /** 3.重新做题 清理所有旧数据    */
      // 3.1复制错题数据到历史表
      /** 3.重新做题 清理所有旧数据    */
      // 3.1复制错题数据到历史表
      String hql_fault = "from ExerciseFault where resumeBookId=? and answer is not null and deleteFlag is false";
      doCopyExerciseFaultToHis(hql_fault,resumeBookId);
      
      // 3.2清空错题做题记录
      // 3.2清空错题做题记录
      String hql_delFault = "update ExerciseFault t set t.answer=null,t.correct=0"
            + " where t.resumeBookId=? and t.answer is not null and t.deleteFlag is false";
      this.bulkUpdateInLoop(hql_delFault, new String[]{resumeBookId});
      
      /** 4.返回结果    */
      /** 4.返回结果    */
      Map<String,Object> resultMap = new HashMap<String, Object>(3);
      resultMap.put(EXERCISE_RECORD_ID, null);
      resultMap.put("exerciseGroupId", "All");
@@ -1932,31 +1932,31 @@
   }
   
   /**
    * 重新做题 清理旧数据
    * 重新做题 清理旧数据
    * @param faultRecordId
    * @return
    */
   public Result doOperExerciseFaultRecordByRedo(String faultRecordId){
      
      // 1.拷贝做题记录到错题答案历史表
      // 1.拷贝做题记录到错题答案历史表
      String hql = "from ExerciseFault where faultRecordId=? and answer is not null and deleteFlag is false";
      doCopyExerciseFaultToHis(hql, faultRecordId);
      
      // 2.删除做题记录
      // 2.删除做题记录
      deleteExerciseFaultRecord(faultRecordId);
            
      return new Result(true);
   }
   
   /**
    * 拷贝做题记录到错题答案历史表
    * 拷贝做题记录到错题答案历史表
    * @param faultRecordId/resumeBookId
    * @return
    */
   public Result doCopyExerciseFaultToHis(String hql,String recordId){
      List<ExerciseFault> lstFault = this.find(hql, CollectionUtils.newList(recordId), ExerciseFault.class);
      
      // 错题历史记录表
      // 错题历史记录表
      List<ExerciseFaultHis> lstFaultHis = new ArrayList<ExerciseFaultHis>(lstFault.size());
      ExerciseFaultHis his = null;
      for(ExerciseFault fault:lstFault){
@@ -1973,7 +1973,7 @@
   }
   
   /**
    * 批量刪除错题做题记录
    * 批量刪除错题做题记录
    * @param faultRecordId
    * @return
    */
@@ -1988,7 +1988,7 @@
   }
   
   /**
    * 批量刪除错题做题记录
    * 批量刪除错题做题记录
    * @param faultRecordId
    * @return
    */
@@ -2003,13 +2003,13 @@
   }
   
   /**
    * 操作本次做题记录 收藏
    * 操作本次做题记录 收藏
    * @return
    */
   @Override
   public Map<String, Object> doUpdateFavortExerRecordNew(String groupId) {
      
      if("All".equals(groupId)){//表示全部收藏重做
      if("All".equals(groupId)){//表示全部收藏重做
         return doCleanAllFavorRecordByRedo();
      }
      
@@ -2038,10 +2038,10 @@
      
      String favoriteRecordId = record.getFavoriteRecordId();
   
      //  重新开始做题 清理旧数据
      //  重新开始做题 清理旧数据
      doOperExerciseFavorRecordByRedo(favoriteRecordId);
      
      // 更新全部收藏题目的统计信息
      // 更新全部收藏题目的统计信息
      this.doOperFavorBookBySubmitAllAnswer(null, null, record.getFavoriteBookId(),null);
      
      Map<String,Object> resultMap = new HashMap<String, Object>(3);
@@ -2051,12 +2051,12 @@
   }
   
   /**
    * 全部收藏重做
    * 全部收藏重做
    * @return
    */
   private Map<String,Object> doCleanAllFavorRecordByRedo(){
      
      /** 1.更新收藏book记录为初始值 */
      /** 1.更新收藏book记录为初始值 */
      String hql_book = "from ExerciseFavoriteBook b where b.userId=? and b.classId=? and b.type=? ";
      
      ExerciseFavoriteBook book = this.findUnique(hql_book, CollectionUtils.newList(ClientUtils.getUserId(),
@@ -2080,7 +2080,7 @@
      BigDecimal decimalZero = BigDecimal.ZERO;
      BigInteger integerZero = BigInteger.ZERO;
      
      /** 2.更新所有收藏record记录为初始值 */
      /** 2.更新所有收藏record记录为初始值 */
      String hql_record = "update ExerciseFavoriteRecord t set t.score="+decimalZero+", t.completionRate="+decimalZero+", t.doCount="+integerZero+","
            + "  t.correctCount="+integerZero+", t.accuracy="+decimalZero+", t.titleMaxNumber='0', t.status='0'"
            + "  where t.favoriteBookId=? and t.deleteFlag is false";
@@ -2088,17 +2088,17 @@
      this.bulkUpdateInLoop(hql_record, new String[]{favoriteBookId});
      
      
      /** 3.重新做题 清理所有旧数据    */
      // 3.1复制收藏数据到历史表
      /** 3.重新做题 清理所有旧数据    */
      // 3.1复制收藏数据到历史表
      String hql_favor = "from ExerciseFavorite where favoriteBookId=? and answer is not null and deleteFlag is false";
      doCopyExerciseFavorToHis(hql_favor,favoriteBookId);
      
      // 3.2清空收藏做题记录
      // 3.2清空收藏做题记录
      String hql_delFavor = "update ExerciseFavorite t set t.answer=null,t.correct=0"
            + " where t.favoriteBookId=? and t.answer is not null and t.deleteFlag is false";
      this.bulkUpdateInLoop(hql_delFavor, new String[]{favoriteBookId});
      
      /** 4.返回结果    */
      /** 4.返回结果    */
      Map<String,Object> resultMap = new HashMap<String, Object>(3);
      resultMap.put(EXERCISE_RECORD_ID, null);
      resultMap.put("exerciseGroupId", "All");
@@ -2108,31 +2108,31 @@
   }
   
   /**
    * 重新开始做题 清理旧数据
    * 重新开始做题 清理旧数据
    * @param favoriteRecordId
    * @return
    */
   public Result doOperExerciseFavorRecordByRedo(String favoriteRecordId){
      
      // 1.拷贝做题记录到收藏答案历史表
      // 1.拷贝做题记录到收藏答案历史表
      String hql = "from ExerciseFavorite where favoriteRecordId=? and answer is not null and deleteFlag is false";
      doCopyExerciseFavorToHis(hql, favoriteRecordId);
      
      // 2.删除做题记录
      // 2.删除做题记录
      deleteExerciseFavorRecord(favoriteRecordId);
      
      return new Result(true);
   }
   
   /**
    * 拷贝做题记录到收藏答案历史表
    * 拷贝做题记录到收藏答案历史表
    * @param faultRecordId/favoriteBookId
    * @return
    */
   public Result doCopyExerciseFavorToHis(String hql, String recordId){
      List<ExerciseFavorite> lstFavor = this.find(hql, CollectionUtils.newList(recordId), ExerciseFavorite.class);
      
      // 错题历史记录表
      // 错题历史记录表
      List<ExerciseFavoriteHis> lstFavorHis = new ArrayList<ExerciseFavoriteHis>(lstFavor.size());
      ExerciseFavoriteHis his = null;
      for(ExerciseFavorite favor:lstFavor){
@@ -2149,20 +2149,20 @@
   }
   
   /**
    * 查询题目统计分析结果 个人统计 全站统计
    * 查询题目统计分析结果 个人统计 全站统计
    * @param exerciseType
    * @return
    */
   @Override
   public List<Map<String, Object>> queryExerciseItemStatisics(String exerciseType) {
      // 题目个人统计
      // 题目个人统计
      String hql_analisisU = "";
      // 题目全站统计
      // 题目全站统计
      String hql_analisis = "";
      // 题目
      // 题目
      String hql_item = "";
      
      if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// 错题本
      if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// 错题本
         
         hql_analisisU = "select a from ExerciseItemAnalisiU a,ExerciseFault re"
               + " where a.exerciseItemId=re.exerciseItemId "
@@ -2178,7 +2178,7 @@
               + " where re.faultBook.userId=? and re.faultBook.classId=? "
               + " and re.deleteFlag is false order by re.createTime";
         
      }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// 收藏
      }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// 收藏
         
         hql_analisisU =  "select a from ExerciseItemAnalisiU a,ExerciseFavorite re"
               + " where a.exerciseItemId=re.exerciseItemId "
@@ -2201,12 +2201,12 @@
   }
   
   /**
    * 查询错题题目统计
    * 查询错题题目统计
    * @return
    */
   private List<Map<String, Object>> doQueryExerciseItemStatisicsData(String hql_analisisU,
         String hql_analisis, String hql_item) {
      // 1.查询个人统计
      // 1.查询个人统计
      List<ExerciseItemAnalisiU> lstAnalisiU = this.find(hql_analisisU,
            CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseItemAnalisiU.class);
      
@@ -2215,7 +2215,7 @@
         anasisUMap.put(analisisU.getExerciseItemId(), analisisU);
      }
      
      // 2.查询全站统计
      // 2.查询全站统计
      List<ExerciseItemAnalisi> lstAnalisi = this.find(hql_analisis,
            CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseItemAnalisi.class);
      Map<String, ExerciseItemAnalisi> anasisMap = new HashMap<String, ExerciseItemAnalisi>(lstAnalisi.size());
@@ -2227,7 +2227,7 @@
         return null;
      }
      
      // 3.查询此组所有题目
      // 3.查询此组所有题目
      List<String> lstItemIds = this.find(hql_item,
            CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId()), String.class);
      
@@ -2236,22 +2236,22 @@
      ExerciseItemAnalisi analisis;
      ExerciseItemAnalisiU analisisU;
      
      // 3.组装结果
      // 3.组装结果
      
      // 循坏组所有题目
      // 循坏组所有题目
      for(String  exerciseItemId:lstItemIds){
         // 结果map
         // 结果map
         resultMap = new HashMap<String, Object>(10);
         
         // 1.个人分析结果
         // 1.个人分析结果
         analisisU = anasisUMap.get(exerciseItemId);
         // 2.全站分析结果
         // 2.全站分析结果
         analisis = anasisMap.get(exerciseItemId);
         
         resultMap.put("exerciseId", exerciseItemId);
         
         // 3.个人统计
         if(null == analisisU){// 为空
         // 3.个人统计
         if(null == analisisU){// 为空
            resultMap.put("doAll_u", 0);
            resultMap.put("doError_u", 0);
            resultMap.put("doAccuracy_u", 0);
@@ -2261,8 +2261,8 @@
            resultMap.put("doAccuracy_u", analisisU.getAccuracy());
         }
         
         // 4.全站统计
         if(null == analisis){// 为空
         // 4.全站统计
         if(null == analisis){// 为空
            resultMap.put("doAll", 0);
            resultMap.put("doAccuracy", 0);
         }else{
@@ -2278,7 +2278,7 @@
   }
   
   /**
    * 更新错题book信息
    * 更新错题book信息
    * @param faultBookId
    * @return
    */
@@ -2307,7 +2307,7 @@
   }
   
   /**
    * 更新错题book信息 by提交全部错题答案
    * 更新错题book信息 by提交全部错题答案
    * @param currTitleNum
    * @param status
    * @return
@@ -2316,9 +2316,9 @@
   public Result doOperFaultBookBySubmitAllAnswer(String currTitleNum,
         String status,String faultBookId, String exerciseType) {
      ExerciseFaultBook book = null;
      if(StringUtils.isBlank(faultBookId)){// 是否全部错题  仅仅提交操作
      if(StringUtils.isBlank(faultBookId)){// 是否全部错题  仅仅提交操作
         if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)
            && ExerciseRecord.STATUS_SUBMIT.equals(status)){// 全部错题仅提交答案
            && ExerciseRecord.STATUS_SUBMIT.equals(status)){// 全部错题仅提交答案
            
            book = this.findUnique("from ExerciseFaultBook where classId=? and userId=? and type=? and deleteFlag is false ",
                  CollectionUtils.newList(ClientUtils.getClassId(), 
@@ -2328,25 +2328,25 @@
            return new Result(false);
         }
         
      }else{// 混合提交
      }else{// 混合提交
         book = this.read(ExerciseFaultBook.class, faultBookId);
         if(book == null){
            return new Result(false);
         }
      }
      
      // 更新book信息
      // 更新book信息
      this.updateExerciseFaultBookInfo(book);
      
      if(StringUtils.isNotBlank(currTitleNum)){
         book.setTitleMaxNumber(currTitleNum);
      }
      if(StringUtils.isNotBlank(status)){
         book.setStatus("1".equals(status)?"1":"0");// 1:提交 0:未提交
         book.setStatus("1".equals(status)?"1":"0");// 1:提交 0:未提交
         
         if("1".equals(status)){// 全部错题提交答案时  对应的record也改为提交状态
         if("1".equals(status)){// 全部错题提交答案时  对应的record也改为提交状态
            
            /** 更新所有错题record记录为提交状态 */
            /** 更新所有错题record记录为提交状态 */
            String hql_record = "update ExerciseFaultRecord t set t.status='1'"
                  + "  where t.resumeBookId=? and t.deleteFlag is false";
            
@@ -2361,7 +2361,7 @@
   }
   /**
    * 更新收藏book信息
    * 更新收藏book信息
    * @param faultBookId
    * @return
    */
@@ -2389,7 +2389,7 @@
   }
   
   /**
    * 更新收藏book信息 by提交全部收藏答案
    * 更新收藏book信息 by提交全部收藏答案
    * @param currTitleNum
    * @param status
    * @return
@@ -2399,9 +2399,9 @@
         String status,String favoriteBookId, String exerciseType) {
      
      ExerciseFavoriteBook book = null;
      if(StringUtils.isBlank(favoriteBookId)){// 是否全部收藏  仅仅提交操作
      if(StringUtils.isBlank(favoriteBookId)){// 是否全部收藏  仅仅提交操作
         if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)
            && ExerciseRecord.STATUS_SUBMIT.equals(status)){// 全部错题仅提交答案
            && ExerciseRecord.STATUS_SUBMIT.equals(status)){// 全部错题仅提交答案
            
            book = this.findUnique("from ExerciseFavoriteBook where classId=? and userId=? and type=? and deleteFlag is false ",
                  CollectionUtils.newList(ClientUtils.getClassId(), 
@@ -2411,14 +2411,14 @@
            return new Result(false);
         }
         
      }else{// 混合提交
      }else{// 混合提交
         book = this.read(ExerciseFavoriteBook.class, favoriteBookId);
         if(book == null){
            return new Result(false);
         }
      }
      
      // 更新收藏book信息
      // 更新收藏book信息
      this.updateExerciseFavorBookInfo(book);
      
      if(StringUtils.isNotBlank(currTitleNum)){
@@ -2426,11 +2426,11 @@
      }
      
      if(StringUtils.isNotBlank(status)){
         book.setStatus("1".equals(status)?"1":"0");// 1:提交 0:未提交
         book.setStatus("1".equals(status)?"1":"0");// 1:提交 0:未提交
         
         if("1".equals(status)){// 全部收藏提交答案时  对应的record也改为提交状态
         if("1".equals(status)){// 全部收藏提交答案时  对应的record也改为提交状态
            
            /** 更新所有收藏record记录为提交状态 */
            /** 更新所有收藏record记录为提交状态 */
            String hql_record = "update ExerciseFavoriteRecord t set t.status='1'"
                  + "  where t.favoriteBookId=? and t.deleteFlag is false";
            
@@ -2445,7 +2445,7 @@
   }
   
   /**
    * 查询错题本book信息
    * 查询错题本book信息
    */
   @Override
   public Map<String, Object> queryExerFaultInfo() {
@@ -2475,7 +2475,7 @@
   }
   /**
    * 查询收藏本book信息
    * 查询收藏本book信息
    */
   @Override
   public Map<String, Object> queryExerFavorInfo() {
@@ -2505,13 +2505,13 @@
   }
   
   /**
    * 计算用户每天做错题的统计信息
    * 计算用户每天做错题的统计信息
    */
   @SuppressWarnings("unchecked")
   @Override
   public Result doCalcExerFaultStatisticsByDay(){
      log.info("---------------定时器 开始统计做题错题统计信息-----------start ------------------");
      // 1.计算前一天 对应做题人的做题信息
      log.info("---------------定时器 开始统计做题错题统计信息-----------start ------------------");
      // 1.计算前一天 对应做题人的做题信息
      String sql = "SELECT"
            + "    r.CLASS_ID,"
            + "    t.USER_ID,"
@@ -2537,7 +2537,7 @@
      List<Object[]> resultlst = this.findBySql(sql, CollectionUtils.newList(yesterday, DateUtils.getToday()));
      
      
      // 2.错题信息记录表
      // 2.错题信息记录表
      List<ExerciseFaultStatistics> statisLst = new ArrayList<ExerciseFaultStatistics>(resultlst.size());
      ExerciseFaultStatistics faultStatis = null;
      for(Object[] objs:resultlst){
@@ -2559,30 +2559,30 @@
      
      this.saveOrUpdateAll(statisLst);
      
      log.info("---------------定时器 开始统计做题错题统计信息-----------end ------------------");
      return new Result(true, "操作成功,统计记录总条数:"+statisLst.size());
      log.info("---------------定时器 开始统计做题错题统计信息-----------end ------------------");
      return new Result(true, "操作成功,统计记录总条数:"+statisLst.size());
   }
   
   /**
    * 查询错题统计信息
    * @param type:  week 最近一周   month:最近一月  year:最近一年
    * 查询错题统计信息
    * @param type:  week 最近一周   month:最近一月  year:最近一年
    * @return
    */
   @Override
   public List<Map<String,Object>> doGetFaultStatisInfo(String type) {
      try {
         // 开始时间
         // 开始时间
         String startDate = "";
         // 结束时间  今天
         // 结束时间  今天
         String endDate = DateUtils.getToday();
            
         if("week".equals(type)){// 最近一周     7天前到今天 不包含今天
         if("week".equals(type)){// 最近一周     7天前到今天 不包含今天
            
            startDate= DateUtils.getTheDay(-7);
         }else if("month".equals(type)){// 最近一月   30天前到今天  不包含今天
         }else if("month".equals(type)){// 最近一月   30天前到今天  不包含今天
            
            startDate= DateUtils.getTheDay(-30);
         }else if("year".equals(type)){// 最近一年 365天前到今天  不包含今天
         }else if("year".equals(type)){// 最近一年 365天前到今天  不包含今天
            
            startDate= DateUtils.getTheDay(-365);
         }
@@ -2593,7 +2593,7 @@
               + " and exerciseTime >=? and exerciseTime<=?"
               + " order by exerciseTime";
         
         // 查询结果
         // 查询结果
         List<Object[]> statisLst = this.findwithRawResult(hql, 
                  CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId(), 
                        DateUtils.convertStringToDate(startDate, "yyyy-MM-dd"), 
@@ -2620,37 +2620,37 @@
         return resultLst;
         
      } catch (ParseException e) {
         log.error("查询错题容错率接口异常", e);
         log.error("查询错题容错率接口异常", e);
      }
      
      return null;
   }
   
   /**
    * 操作本次做题记录 错题
    * 操作本次做题记录 错题
    * @return
    */
   @Override
   public Result doUpdateExerciseFaultRecord(ExerciseFaultRecord record) {
      //TraceUtils.setUpdateTrace(record);不更新updateTime
      //TraceUtils.setUpdateTrace(record);不更新updateTime
      this.save(record);
      return new Result(true);
   }
   /**
    * 操作本次做题记录 收藏
    * 操作本次做题记录 收藏
    * @return
    */
   @Override
   public Result doUpdateExerciseFavorRecord(ExerciseFavoriteRecord record) {
      //TraceUtils.setUpdateTrace(record); 不更新updateTime
      //TraceUtils.setUpdateTrace(record); 不更新updateTime
      this.save(record);
      return new Result(true);
   }
   
   /**
    * 
    * 保存app端请求保存的数据
    * 保存app端请求保存的数据
    * @return
    */
   @Override
@@ -2663,7 +2663,7 @@
   
   @Override
   public Result doUpdateExerciseFaultBook(String currTitleNum) {
      //  查询此用户是否有收藏记录
      //  查询此用户是否有收藏记录
      String hql = "from ExerciseFaultBook where classId=? and userId=? and deleteFlag is false ";
      
      List<ExerciseFaultBook> lstFault = this.find(hql,
@@ -2681,7 +2681,7 @@
   @Override
   public Result doUpdateExerciseFavorBook(String currTitleNum) {
      //  查询此用户是否有收藏记录
      //  查询此用户是否有收藏记录
      String hql = "from ExerciseFavoriteBook where classId=? and userId=? and deleteFlag is false ";
      
      List<ExerciseFavoriteBook> lstFavor = this.find(hql,
@@ -2698,11 +2698,11 @@
   }
   /**
    *提交多套题答案结果到db
    *提交多套题答案结果到db
    */
   @Override
   public Map<String, Object> doSubmitMutiExerciseAnswerData(ExerciseSubmitAnswerDataList answerDataList) {
      // 用户本次做题提交的数据
      // 用户本次做题提交的数据
      List<ExerciseSubmitAnswerData> lstRecord = null;
      ExerciseSubmitAnswerData answerResult= null;
      List<ExerciseItemAnswerData> lstAnswers= null;
@@ -2715,7 +2715,7 @@
      
      List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>(lstRecord.size());
      
      // 错题、收藏本bookid
      // 错题、收藏本bookid
      String faultBookId = null;
      String favoriteBookId = null;
      for(int i=0; i<lstRecord.size(); i++){
@@ -2727,30 +2727,30 @@
         
         lstAnswers = answerResult.getItems();
         
         // 记录id
         // 记录id
         String initExerciseRecordId = answerResult.getExerciseRecordId();
                  
         String recordData = JSONObject.toJSONString(answerResult);
         
         if(lstAnswers.isEmpty() 
               && !ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus()) 
               && answerResult.getSubmitType() != 1){// 提交状态
               && answerResult.getSubmitType() != 1){// 提交状态
            this.doSaveExerciseDataSubmitLog(recordData,
                  initExerciseRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_EXTEND_ANSWER,
                  ExerciseDataSubmitLog.STATUS_FAILED, "/exercise/Extend/exerExtendMutiAnswers");
            continue;
         }
         
         /**  1.---------记录提交的数据日志 */
         // 记录提交的数据日志
         /**  1.---------记录提交的数据日志 */
         // 记录提交的数据日志
         String exerciseDataLogId = this.doSaveExerciseDataSubmitLog(recordData,
               initExerciseRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_EXTEND_ANSWER, 
               ExerciseDataSubmitLog.STATUS_SUCCESS, "/exercise/Extend/exerExtendMutiAnswers");
                  
         /** 2.提交答案  */
         /** 2.提交答案  */
         String exerciseType = answerResult.getType();
         if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// 错题本
            // 更新 提交练习答案
         if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// 错题本
            // 更新 提交练习答案
            returnMap = this.doSubmitExerFaultAnswerDataNew(answerResult);
            
            if(null == returnMap){
@@ -2758,8 +2758,8 @@
            }
            
            faultBookId = (String) returnMap.get("exerciseBookId");
         }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// 收藏
            // 更新 提交练习答案
         }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// 收藏
            // 更新 提交练习答案
            returnMap = this.doSubmitExerFavorAnswerDataNew(answerResult);
            
            if(null == returnMap){
@@ -2771,15 +2771,15 @@
            continue;
         }
         
         /** 3.发送 题目的全站统计  个人统计请求消息  */
         /** 3.发送 题目的全站统计  个人统计请求消息  */
         exerciseVerService.sendUpdateExerItemStatisticsMsg(answerResult.getExerciseGroupId(), answerResult);
         
         returnMap.put("type", exerciseType);
         resultList.add(returnMap);
         
         // 4.---------更新本次提交的数据日志exerciseRecordId
         // 4.---------更新本次提交的数据日志exerciseRecordId
         if(StringUtils.isBlank(initExerciseRecordId) 
               && returnMap.get(EXERCISE_RECORD_ID) != null){// 为空 说明第一次提交  更新日志记录id
               && returnMap.get(EXERCISE_RECORD_ID) != null){// 为空 说明第一次提交  更新日志记录id
            exerciseVerService.doUpdateExerciseDataSubmitLog(exerciseDataLogId, 
                  String.valueOf(returnMap.get(EXERCISE_RECORD_ID)));
            
@@ -2787,66 +2787,66 @@
                  
      }
      
      /** 4.判断是否全部做题时 统计全部做题信息  */
      /** 4.判断是否全部做题时 统计全部做题信息  */
      this.doOperFaultBookBySubmitAllAnswer(
            answerDataList.getCurrTitleNum(), answerDataList.getStatus(),faultBookId, answerDataList.getExerciseType());
      
      this.doOperFavorBookBySubmitAllAnswer(
            answerDataList.getCurrTitleNum(), answerDataList.getStatus(),favoriteBookId, answerDataList.getExerciseType());
      
      /**  5.返回结果 */
      /**  5.返回结果 */
      resultMap.put("success", true);
      resultMap.put("attrs", resultList);
      resultMap.put("msg", "提交成功");
      resultMap.put("msg", "提交成功");
      
      return resultMap;
   }
   
   /**
    * 提交单套题答案结果到db
    * 提交单套题答案结果到db
    */
   @Override
   public Result doSubmitExerciseAnswerData(ExerciseSubmitAnswerData answerResult) {
      // 用户本次做题提交的数据
      // 用户本次做题提交的数据
      Result result = new Result(false);
               
      if(answerResult.getItems().isEmpty() 
            && !ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus()) 
            && answerResult.getSubmitType() != 1){// 提交状态
            && answerResult.getSubmitType() != 1){// 提交状态
         return result;
      }
      
      String exerciseType = answerResult.getType();
      
      Map<String,Object> resultMap = null;
      if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// 错题本
         // 更新 提交练习答案
      if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// 错题本
         // 更新 提交练习答案
         resultMap = this.doSubmitExerFaultAnswerDataNew(answerResult);
         
         if(null == resultMap){
            return new Result(false,"提交失败");
            return new Result(false,"提交失败");
         }
         
         // 统计全部做题信息/
         // 统计全部做题信息/
         this.doOperFaultBookBySubmitAllAnswer(null,null,(String) resultMap.get("exerciseBookId"),null);
         
      }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// 收藏
         // 更新 提交练习答案
      }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// 收藏
         // 更新 提交练习答案
         resultMap = this.doSubmitExerFavorAnswerDataNew(answerResult);
         
         if(null == resultMap){
            return new Result(false,"提交失败");
            return new Result(false,"提交失败");
         }
         
         // 统计全部做题信息/
         // 统计全部做题信息/
         this.doOperFavorBookBySubmitAllAnswer(null,null, (String) resultMap.get("exerciseBookId"),null);
      }else{
         
         return new Result(false, "exerciseType传值错误:exerciseType="+exerciseType);
         return new Result(false, "exerciseType传值错误:exerciseType="+exerciseType);
      }
      
      
      // 3.发送 题目的全站统计  个人统计请求消息
      // 3.发送 题目的全站统计  个人统计请求消息
      List<ExerciseItemAnswerData> lstAnswers= answerResult.getItems();
      if(!lstAnswers.isEmpty()){
         exerciseVerService.sendUpdateExerItemStatisticsMsg(answerResult.getExerciseGroupId(), answerResult);
@@ -2859,13 +2859,13 @@
   }
   
   /**
    * 初始化错题统计数据
    * 初始化错题统计数据
    */
   @SuppressWarnings("unchecked")
   @Override
   public Result doInitFaultStatisData() {
      log.info("---------------定时器 开始统计做题错题统计信息-----------start ------------------");
      // 1.计算前一天 对应做题人的做题信息
      log.info("---------------定时器 开始统计做题错题统计信息-----------start ------------------");
      // 1.计算前一天 对应做题人的做题信息
      String sql = "SELECT"
            + "    r.CLASS_ID,"
            + "    t.USER_ID,"
@@ -2892,7 +2892,7 @@
      List<Object[]> resultlst = this.findBySql(sql, CollectionUtils.newList(yesterday));
      
      
      // 2.错题信息记录表
      // 2.错题信息记录表
      List<ExerciseFaultStatistics> statisLst = new ArrayList<ExerciseFaultStatistics>(resultlst.size());
      ExerciseFaultStatistics faultStatis = null;
      for(Object[] objs:resultlst){
@@ -2914,8 +2914,8 @@
      
      this.saveOrUpdateAll(statisLst);
      
      log.info("---------------定时器 开始统计做题错题统计信息-----------end ------------------");
      return new Result(true, "操作成功,统计记录总条数:"+statisLst.size());
      log.info("---------------定时器 开始统计做题错题统计信息-----------end ------------------");
      return new Result(true, "操作成功,统计记录总条数:"+statisLst.size());
   }
   @Override
@@ -2958,7 +2958,7 @@
      List<Object[]> lstData =this.findBySql(sql, new ArrayList<Object>());
      
      if(lstData.isEmpty()){
         return new Result(false,"最近做题记录数据为空");
         return new Result(false,"最近做题记录数据为空");
      }
      
      List<ExerciseRecentRecord> lstRecord = new ArrayList<ExerciseRecentRecord>(lstData.size());
@@ -2983,7 +2983,7 @@
      
      this.saveOrUpdateAll(lstRecord);
      
      return new Result(true,"此次插入ExerciseRecentRecord条数:"+lstRecord.size());
      return new Result(true,"此次插入ExerciseRecentRecord条数:"+lstRecord.size());
   }
   @SuppressWarnings({ "unchecked" })
@@ -3003,7 +3003,7 @@
      List<Object[]> lstData =this.findBySql(sql, new ArrayList<Object>());
      
      if(lstData.isEmpty()){
         return new Result(false,"错题数据为空,本次没有需要更新的错题数据");
         return new Result(false,"错题数据为空,本次没有需要更新的错题数据");
      }
      
      
@@ -3056,7 +3056,7 @@
      
      this.saveOrUpdateAll(lstRecord);
      
      return new Result(true, "插入ExerciseFaultRecord条数:"+lstRecord.size());
      return new Result(true, "插入ExerciseFaultRecord条数:"+lstRecord.size());
   }
   @SuppressWarnings("unchecked")
@@ -3077,7 +3077,7 @@
            List<Object[]> lstData =this.findBySql(sql, new ArrayList<Object>());
            
            if(lstData.isEmpty()){
               return new Result(false,"收藏数据为空,本次没有需要更新的收藏数据");
               return new Result(false,"收藏数据为空,本次没有需要更新的收藏数据");
            }
            
            String hql_existRecord = "from ExerciseFavoriteRecord where  favoriteBookId=? and exerciseGroupId=? ";
@@ -3130,7 +3130,7 @@
            this.saveOrUpdateAll(lstRecord);
            
            
            return new Result(true,"插入ExerciseFavoriteRecord条数:"+lstRecord.size());
            return new Result(true,"插入ExerciseFavoriteRecord条数:"+lstRecord.size());
   }
   @Override
@@ -3143,8 +3143,8 @@
      
      List<Object[]> lstData2 =this.findwithRawResult(sql2, new ArrayList<Object>());
      
      if(lstData2.isEmpty()){//抛异常回滚
         return new Result(false,"错题数据为空2222");
      if(lstData2.isEmpty()){//抛异常回滚
         return new Result(false,"错题数据为空2222");
      }
      
      String hql_existRecord = "from ExerciseFaultRecord where  resumeBookId=? and exerciseGroupId=? ";
@@ -3184,7 +3184,7 @@
      
      this.saveOrUpdateAll(lstFaults);
      
      return new Result(true, "更新ExerciseFault条数:"+lstFaults.size());
      return new Result(true, "更新ExerciseFault条数:"+lstFaults.size());
   }
   @Override
@@ -3197,8 +3197,8 @@
      
      List<Object[]> lstData2 =this.findwithRawResult(sql2, new ArrayList<Object>());
      
      if(lstData2.isEmpty()){//抛异常回滚
         return new Result(false,"收藏数据为空2222");
      if(lstData2.isEmpty()){//抛异常回滚
         return new Result(false,"收藏数据为空2222");
      }
      
      String hql_existRecord = "from ExerciseFavoriteRecord where  favoriteBookId=? and exerciseGroupId=? ";
@@ -3239,7 +3239,7 @@
      
      this.saveOrUpdateAll(lstFavors);
      
      return new Result(true,"|更新ExerciseFavorite条数:"+lstFavors.size());
      return new Result(true,"|更新ExerciseFavorite条数:"+lstFavors.size());
   }
   @Override