派生自 projectDept/qhighschool

胡仁荣
2023-09-11 8c1ac419031d562152ec86437215193c20c909b7
src/main/java/com/qxueyou/scc/exercise/action/ExerciseController.java
@@ -70,33 +70,33 @@
import com.qxueyou.scc.user.model.ExportUserScore;
/**
 * 练习题目控制
 * 练习题目控制
 * @author zhiyong
 *
 */
@Controller
@RequestMapping(value = "/exercise/Exercise")
public class ExerciseController {
   /** 日志  */
   /** 日志  */
   private static final Logger log = LogManager.getLogger("ExerciseController");
   
   /** commonDAO  */
   @Autowired
   private CommonDAO commonDAO;
   
   /** 练习 service */
   /** 练习 service */
   @Autowired
   private IExerciseService exerciseService;
   
   /** 练习导入 service */
   /** 练习导入 service */
   @Autowired
   private IExercisePyService exercisePyService;
   
   /** 练习V2.0版本接口service */
   /** 练习V2.0版本接口service */
   @Autowired
   private IExerciseVerService exerciseVerService;
   /** 练习V2.0版本接口service */
   /** 练习V2.0版本接口service */
//   @Autowired
//   IConfigService cfg;
   
@@ -104,52 +104,52 @@
   @Autowired
   IOssService ossService;
   
   /** 消息发送 service */
   /** 消息发送 service */
//   @Autowired
//   IMsgVenderService  easemobService;
   
   /** 组id */
   /** 组id */
   private static final String GROUP_ID = "groupId";
   
   /** 做题记录id */
   /** 做题记录id */
   private static final String EXERCISE_RECORD_ID = "exerciseRecordId";
   
   /** ---------------------------APP V2.0接口 start----------------------*/
   /** ---------------------------APP V2.0接口 start----------------------*/
   /**
    * APP2.0: 获取家庭作业list
    * APP2.0: 获取家庭作业list
    * URL:    /exercise/Exercise/homeWorkListNew
    * 
    * 
    *请求参数={
         subjectId:课程id,//可选,用于高校版
         page:当前页,//必传,大于0
         limit:每页限制条数,//必传,大于0
    *请求参数={
         subjectId:课程id,//可选,用于高校版
         page:当前页,//必传,大于0
         limit:每页限制条数,//必传,大于0
      }
       返回参数=[
       返回参数=[
          {
              GROUP_ID:"组id",
              "classId":班级id,
              "courseId":科目id,
              "orgId":机构id,
              "subjectId":课程id,
              "name":"组名",
              "type":组类型 ,
              "updateTime":更新时间,
              "answerUpdateTime":本套题答题更新时间,
              "allCount":题目总数,
              "exerciseTime":"考试时间",
              EXERCISE_RECORD_ID:"记录id",
              "doCount": 做题个数,
              "correctCount": 正确个数,
              "submitNumber":已提交人数(家庭作业),
              "currTitleNumber":当前做题序号,
              "status":做题状态(0:未提交 1:已提交),
              "completionRate": 完成率,
              "accuracy": 正确率,
              "score": 分数,
              "extendAllCount":错题本、收藏本总数
              GROUP_ID:"组id",
              "classId":班级id,
              "courseId":科目id,
              "orgId":机构id,
              "subjectId":课程id,
              "name":"组名",
              "type":组类型 ,
              "updateTime":更新时间,
              "answerUpdateTime":本套题答题更新时间,
              "allCount":题目总数,
              "exerciseTime":"考试时间",
              EXERCISE_RECORD_ID:"记录id",
              "doCount": 做题个数,
              "correctCount": 正确个数,
              "submitNumber":已提交人数(家庭作业),
              "currTitleNumber":当前做题序号,
              "status":做题状态(0:未提交 1:已提交),
              "completionRate": 完成率,
              "accuracy": 正确率,
              "score": 分数,
              "extendAllCount":错题本、收藏本总数
          },
          ...循环多个
          ...循环多个
      ]
    * 
    * @return
@@ -159,9 +159,9 @@
         @RequestParam(value="subjectId", required = false) String subjectId,
         @RequestParam(value="page") int page,
         @RequestParam(value="limit") int limit,
         @RequestParam(value="selected", required = false) Integer selected)  {// 0:全部  1:未开始 2:做题中 3:已提交
         @RequestParam(value="selected", required = false) Integer selected)  {// 0:全部  1:未开始 2:做题中 3:已提交
      // 获取group data
      // 获取group data
      List<ExerGroupResponseData> lstResult = getExericseListData(ExerciseGroup.TYPE_HOMEWORK, 
            null, page, limit, selected, null);
      
@@ -170,7 +170,7 @@
   
   
   /**
    * APP2.0: 获取章节练习list
    * APP2.0: 获取章节练习list
    * URL:    /exercise/Exercise/chapterListNew
    * 
    * @return
@@ -182,7 +182,7 @@
         @RequestParam(value="limit") int limit,
         @RequestParam(value="selected", required = false) Integer selected, String chapterId)  {
      
      // 获取group data
      // 获取group data
      List<ExerGroupResponseData> lstResult = getExericseListData(ExerciseGroup.TYPE_CHAPTER_ITEM, 
            subjectId, page, limit, selected, chapterId);
      
@@ -190,7 +190,7 @@
   }
   
   /**
    * APP2.0: 获取模拟考试list
    * APP2.0: 获取模拟考试list
    * URL:    /exercise/Exercise/examsListNew
    * 
    * @return
@@ -202,7 +202,7 @@
         @RequestParam(value="limit") int limit,
         @RequestParam(value="selected", required = false) Integer selected)  {
      
      // 获取group data
      // 获取group data
      List<ExerGroupResponseData> lstResult = getExericseListData(ExerciseGroup.TYPE_MOCK_EXAM, 
            null, page, limit, selected, null);
      
@@ -210,7 +210,7 @@
   }
   
   /**
    * APP2.0: 获取专题练习list
    * APP2.0: 获取专题练习list
    * URL:    /exercise/Exercise/topicListNew
    * 
    * @return
@@ -222,7 +222,7 @@
         @RequestParam(value="limit") int limit,
         @RequestParam(value="selected", required = false) Integer selected)  {
      
      // 获取group data
      // 获取group data
      List<ExerGroupResponseData> lstResult = getExericseListData(ExerciseGroup.TYPE_EXERCISE_TOPIC, 
            null, page, limit, selected, null);
      
@@ -230,7 +230,7 @@
   }
   
   /**
    * APP2.0: 获取专题练习list
    * APP2.0: 获取专题练习list
    * URL:    /exercise/Exercise/freeListNew
    * 
    * @return
@@ -242,7 +242,7 @@
         @RequestParam(value="limit") int limit,
         @RequestParam(value="selected", required = false) Integer selected)  {
      
      // 获取group data
      // 获取group data
      List<ExerGroupResponseData> lstResult = getExericseListData(ExerciseGroup.TYPE_EXERCISE_FREE, 
            null, page, limit, selected, null);
      
@@ -250,12 +250,12 @@
   }
   
   /**
    * 获取练习列表数据
    * 获取练习列表数据
    * @param exerType
    * @param subjectId
    * @param page
    * @param limit
    * @param selected // 0:全部  1:未开始 2:做题中 3:已提交
    * @param selected // 0:全部  1:未开始 2:做题中 3:已提交
    * @return
    */
   private List<ExerGroupResponseData> getExericseListData(short exerType, 
@@ -264,24 +264,24 @@
      int pageSize = limit;
      Integer iSelected = selected;
      
      // 1.分页信息
      // 1.分页信息
      if(pageNum < 1){
         pageNum = 1;
      }
      if(pageSize < 1){
         pageSize = 1;
      }
      if(iSelected == null){//为空设置为 全部
      if(iSelected == null){//为空设置为 全部
         iSelected = 0;
      }
      Pager pager = new Pager();
      pager.setPageNum(pageNum);
      pager.setPageSize(limit);
      
      // 2.得到列表数据
      // 2.得到列表数据
      List<ExerGroupResponseData> lstResult = exerciseVerService.queryExericseListData(exerType,subjectId,pager,iSelected, chapterId);
      
      if(null == lstResult){// 结果转换成 []
      if(null == lstResult){// 结果转换成 []
         lstResult = new ArrayList<ExerGroupResponseData>();
      }
      
@@ -289,40 +289,40 @@
   }
   /**
    * APP2.0: 查询做题记录
    * APP2.0: 查询做题记录
    * URL:    /exercise/Exercise/exerRecord
    *  请求参数={
         exerType:练习类型,//必传
         subjectId:课程id,//可选,用于高校版
         page:当前页,//必传,大于0
         limit:每页限制条数,//必传,大于0
    *  请求参数={
         exerType:练习类型,//必传
         subjectId:课程id,//可选,用于高校版
         page:当前页,//必传,大于0
         limit:每页限制条数,//必传,大于0
      }
      
      返回参数=[
      返回参数=[
             {
                 GROUP_ID:"组id",
                 "classId":班级id,
                 "courseId":科目id,
                 "orgId":机构id,
                 "subjectId":课程id,
                 "name":"组名",
                 "type":组类型 ,
                 "updateTime":更新时间,
                 "answerUpdateTime":本套题答题更新时间,
                 "allCount":题目总数,
                 "exerciseTime":"考试时间",
                 EXERCISE_RECORD_ID:"记录id",
                 "doCount": 做题个数,
                 "correctCount": 正确个数,
                 "submitNumber":已提交人数(家庭作业),
                 "currTitleNumber":当前做题序号,
                 "status":做题状态(0:未提交 1:已提交),
                 "completionRate": 完成率,
                 "accuracy": 正确率,
                 "score": 分数,
                 "extendAllCount":错题本、收藏本总数
                 GROUP_ID:"组id",
                 "classId":班级id,
                 "courseId":科目id,
                 "orgId":机构id,
                 "subjectId":课程id,
                 "name":"组名",
                 "type":组类型 ,
                 "updateTime":更新时间,
                 "answerUpdateTime":本套题答题更新时间,
                 "allCount":题目总数,
                 "exerciseTime":"考试时间",
                 EXERCISE_RECORD_ID:"记录id",
                 "doCount": 做题个数,
                 "correctCount": 正确个数,
                 "submitNumber":已提交人数(家庭作业),
                 "currTitleNumber":当前做题序号,
                 "status":做题状态(0:未提交 1:已提交),
                 "completionRate": 完成率,
                 "accuracy": 正确率,
                 "score": 分数,
                 "extendAllCount":错题本、收藏本总数
             },
             ...循环多个
             ...循环多个
         ]
    * @param page
    * @param start
@@ -339,7 +339,7 @@
      int pageNum = page;
      int pageSize = limit;
      
      // 1.分页信息
      // 1.分页信息
      if(pageNum < 1){
         pageNum = 1;
      }
@@ -353,7 +353,7 @@
      
      
      StringBuffer hql = new StringBuffer(512);
      // 2.查询结果
      // 2.查询结果
      hql.append("select g,"
               + "  r.recordId,r.updateTime,r.doCount,r.titleMaxNumber,r.status,"
               + "    r.correctCount,r.completionRate,r.score,r.accuracy,e.repeatFlag,e.classAccuracy, "
@@ -379,10 +379,10 @@
      
      List<ExerGroupResponseData> lstResult = new ArrayList<ExerGroupResponseData>(lstRecord.size());
      
      // 3.重组字段
      // 3.重组字段
      for(Object[] obj:lstRecord){
         
         // 组装练习做题记录列表数据
         // 组装练习做题记录列表数据
         lstResult.add(packagingExerciseRecordListData(exerType, obj));
         
      }
@@ -391,7 +391,7 @@
   }
   /**
    * 组装练习做题记录列表数据
    * 组装练习做题记录列表数据
    * @param exerType
    * @param obj
    * @param group
@@ -403,7 +403,7 @@
      ExerciseGroup group = (ExerciseGroup)obj[0];
      ExerGroupResponseData result =  new ExerGroupResponseData();
      
      // 赋值字段值
      // 赋值字段值
      BeanUtils.copyProperties(group, result);
      
      result.setExerciseRecordId(String.valueOf(obj[1]));
@@ -416,26 +416,26 @@
      result.setCurrTitleNumber(String.valueOf(obj[4]));
      result.setStatus(String.valueOf(obj[5]));
      
      // 组装练习做题记录部分参数
      // 组装练习做题记录部分参数
      packagingExerciseRecordListParam(obj, result);
      
      result.setExtendAllCount(group.getAllCount());
      
      if(obj[10] == null){
         if(exerType == ExerciseGroup.TYPE_HOMEWORK){// 家庭作业
         if(exerType == ExerciseGroup.TYPE_HOMEWORK){// 家庭作业
            result.setRepeatFlag(false);
         }else{
            result.setRepeatFlag(true);
         }
      }else{
         result.setRepeatFlag(!(boolean)obj[10]);// true 可以重做 false不能重做
         result.setRepeatFlag(!(boolean)obj[10]);// true 可以重做 false不能重做
      }
      
      // 班级正确率
      // 班级正确率
      result.setClassAccuracy(obj[11] == null ? "--" :obj[11]+"%");
      
      if(exerType == ExerciseGroup.TYPE_EXERCISE_FREE 
            || exerType == ExerciseGroup.TYPE_MOCK_EXAM ){// 自由练习 模拟考试
            || exerType == ExerciseGroup.TYPE_MOCK_EXAM ){// 自由练习 模拟考试
         result.setExerciseTime(String.valueOf(obj[12]));
         result.setExerciseStrategy(String.valueOf(obj[13]));
         result.setExerciseSource(String.valueOf(obj[14]));
@@ -445,7 +445,7 @@
   }
   /**
    * 组装练习做题记录部分参数 拆分方法
    * 组装练习做题记录部分参数 拆分方法
    * @param obj
    * @param result
    */
@@ -474,88 +474,88 @@
   }
   
   /**
    * APP2.0: 获取家庭作业练习题目数据
    * APP2.0: 获取家庭作业练习题目数据
    * URL:    /exercise/Exercise/homeworkExercise
    * 
    * 请求参数={
         groupId:组id,//必传
         exerciseRecordId:当前页,//必传,没有传""
         getExercise:是否更新题目,//必传,
         boolean值,没有传false
         getAnswer:是否更新答案,//必传,
         boolean值,没有传false
    * 请求参数={
         groupId:组id,//必传
         exerciseRecordId:当前页,//必传,没有传""
         getExercise:是否更新题目,//必传,
         boolean值,没有传false
         getAnswer:是否更新答案,//必传,
         boolean值,没有传false
      }
         
      返回参数={
       "items":[// 题目集合
      返回参数={
       "items":[// 题目集合
           {
               "exerciseId":练习id,
               "exerciseId":练习id,
               "chapterId":null,
               "lessonId":null,
               "title":标题,
               "type":题目类型,
               "answer":正确答案,
               "title":标题,
               "type":题目类型,
               "answer":正确答案,
               "options":[
                   {
                       "optionId":选项id,
                       "optionId":选项id,
                       "checked":true,
                       "content":内容,
                       "optionOrder":题目序号,
                       "exerciseItemId":"练习id",
                       "content":内容,
                       "optionOrder":题目序号,
                       "exerciseItemId":"练习id",
                       "imgs":[
                           {
                               "imgId":"ͼƬid",
                               "imgId":"图片id",
                               "exerciseObjectId":null,
                               "imgPath":图片路径,
                               "imgOrder":排序,
                               "objectType":图片类型 1:题目 2:选项
                               "imgPath":图片路径,
                               "imgOrder":排序,
                               "objectType":图片类型 1:题目 2:选项
                           },
                           ... 循环多个
                           ... 循环多个
                       ]
                   },
                   ... 循环多个
                   ... 循环多个
               ],
               "scores":null,
               "itemNo":null,
               "analisisResult":{
                   "allAccuracy":全站统计 正确率,
                   "analysis":"解析",
                   "submitAllNumber":全站 提交总数,
                   "usualFaultAnswers":易错题,
                   "allAccuracy":全站统计 正确率,
                   "analysis":"解析",
                   "submitAllNumber":全站 提交总数,
                   "usualFaultAnswers":易错题,
                   "exerciseAnalisisUId":null,
                   "accuracy":个人统计 正确率,
                   "submitNumber":个人统计  提交总数,
                   "submitErrorNumber":个人统计  提交错误总数,
                   "accuracy":个人统计 正确率,
                   "submitNumber":个人统计  提交总数,
                   "submitErrorNumber":个人统计  提交错误总数,
               },
               "imgs":[
                   {
                      "imgId":"ͼƬid",
                      "imgId":"图片id",
                       "exerciseObjectId":null,
                       "imgPath":图片路径,
                       "imgOrder":排序,
                       "objectType":图片类型 1:题目 2:选项
                       "imgPath":图片路径,
                       "imgOrder":排序,
                       "objectType":图片类型 1:题目 2:选项
                   },
                   ... 循环多个
                   ... 循环多个
               ],
               "commentFlag": null,
           }
       ],
       "answers":[// 个人答案集合
       "answers":[// 个人答案集合
           {
               "answerUId":"主键id",
               "answer":选择答案  如:多选为(A,B,C),
               "answerUId":"主键id",
               "answer":选择答案  如:多选为(A,B,C),
               "correct":0,
               "exerciseItemId":练习id,
               EXERCISE_RECORD_ID:记录id,
               "userId":用户id
               "exerciseItemId":练习id,
               EXERCISE_RECORD_ID:记录id,
               "userId":用户id
           },
           ... 循环多个
           ... 循环多个
       ]
   }
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @return
    */
   @RequestMapping(value = "homeworkExercise", method = RequestMethod.GET)
@@ -565,7 +565,7 @@
         @RequestParam(value = "getExercise") boolean getExercise,
         @RequestParam(value = "getAnswer") boolean getAnswer)  {
      
      // 获取结果
      // 获取结果
      ExerItemResponseData result = exerciseVerService.queryExerItemResponseData(groupId,
            exerciseRecordId, getExercise, getAnswer, ExerciseGroup.TYPE_HOMEWORK);
      
@@ -573,12 +573,12 @@
   }
   
   /**
    * APP2.0: 获取模拟考试练习题目数据
    * APP2.0: 获取模拟考试练习题目数据
    * URL:    /exercise/Exercise/examExercise
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @return
    */
   @RequestMapping(value = "examExercise", method = RequestMethod.GET)
@@ -588,7 +588,7 @@
         @RequestParam(value = "getExercise") boolean getExercise,
         @RequestParam(value = "getAnswer") boolean getAnswer)  {
      
      // 获取结果
      // 获取结果
      ExerItemResponseData result = exerciseVerService.queryExerItemResponseData(groupId,
            exerciseRecordId, getExercise, getAnswer, ExerciseGroup.TYPE_MOCK_EXAM);
      
@@ -597,12 +597,12 @@
   
   
   /**
    * APP2.0: 获取章节练习题目数据
    * APP2.0: 获取章节练习题目数据
    * URL:    /exercise/Exercise/chapterExercise
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @return
    */
   @RequestMapping(value = "chapterExercise", method = RequestMethod.GET)
@@ -612,7 +612,7 @@
         @RequestParam(value = "getExercise") boolean getExercise,
         @RequestParam(value = "getAnswer") boolean getAnswer)  {
      
      // 获取结果
      // 获取结果
      ExerItemResponseData result = exerciseVerService.queryExerItemResponseData(groupId,
            exerciseRecordId, getExercise, getAnswer, ExerciseGroup.TYPE_CHAPTER_ITEM);
      
@@ -620,12 +620,12 @@
   }
   
   /**
    * APP2.0: 获取专题练习题目数据
    * APP2.0: 获取专题练习题目数据
    * URL:    /exercise/Exercise/topicExercise
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @return
    */
   @RequestMapping(value = "topicExercise", method = RequestMethod.GET)
@@ -635,7 +635,7 @@
         @RequestParam(value = "getExercise") boolean getExercise,
         @RequestParam(value = "getAnswer") boolean getAnswer)  {
      
      // 获取结果
      // 获取结果
      ExerItemResponseData result = exerciseVerService.queryExerItemResponseData(groupId,
            exerciseRecordId, getExercise, getAnswer, ExerciseGroup.TYPE_EXERCISE_TOPIC);
      
@@ -644,12 +644,12 @@
   
   
   /**
    * APP2.0: 获取专题练习题目数据
    * APP2.0: 获取专题练习题目数据
    * URL:    /exercise/Exercise/freeExercise
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @param groupId 组id
    * @param exerciseRecordId 练习记录id
    * @param getExercise 是否获取练习题
    * @param getAnswer 是否获取答案
    * @return
    */
   @RequestMapping(value = "freeExercise", method = RequestMethod.GET)
@@ -659,7 +659,7 @@
         @RequestParam(value = "getExercise") boolean getExercise,
         @RequestParam(value = "getAnswer") boolean getAnswer)  {
      
      // 获取结果
      // 获取结果
      ExerItemResponseData result = exerciseVerService.queryExerItemResponseData(groupId,
            exerciseRecordId, getExercise, getAnswer, ExerciseGroup.TYPE_EXERCISE_FREE);
      
@@ -668,15 +668,15 @@
   }
   
   /**
    * APP2.0: 获取专题练习题目数据
    * APP2.0: 获取专题练习题目数据
    * URL:    /exercise/Exercise/newFreeExercise
    * 
    * {
    *    source: 练习来源(1:练习题库 2:考试题库  3:家庭作业)   多个以逗号分开
      strategy:做题方式(1:未做题优先  2:错题优先)
      mode:做题模式(1:练习模式 2:考试模式)
      count:数量(30 50 100 200)
      exerciseTime:练习时间
    *    source: 练习来源(1:练习题库 2:考试题库  3:家庭作业)   多个以逗号分开
      strategy:做题方式(1:未做题优先  2:错题优先)
      mode:做题模式(1:练习模式 2:考试模式)
      count:数量(30 50 100 200)
      exerciseTime:练习时间
    * }
    * 
    * @return
@@ -697,7 +697,7 @@
         return null;
      }
      
      // 根据条件获取自由练习
      // 根据条件获取自由练习
      ExerItemResponseData result = exerciseVerService.doGetFreeExercise(
            null, source, strategy, mode, count, exerciseTime);
      
@@ -706,41 +706,41 @@
   
   
   /**
    * APP2.0: 提交练习答案
    * APP2.0: 提交练习答案
    * URL:    /exercise/Exercise/exerAnswers
    * 
    * 请求参数={
       "exerciseGroupId": 组id,
       EXERCISE_RECORD_ID: 记录id,
    * 请求参数={
       "exerciseGroupId": 组id,
       EXERCISE_RECORD_ID: 记录id,
       "exerciseExtendId": null, 
       "currTitleNum": "当前题号",
       "status": ״̬,
       "type": 练习类型,// 整型
       "doCount": 练习类型,
       "correctCount": 正确个数,
       "allCount":题目总数,
       "currTitleNum": "当前题号",
       "status": 状态,
       "type": 练习类型,// 整型
       "doCount": 练习类型,
       "correctCount": 正确个数,
       "allCount":题目总数,
       "items": [
           {
               "exerciseId": "练习id",
               "type": 练习类型,// 整数型
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
               "exerciseId": "练习id",
               "type": 练习类型,// 整数型
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
           }, 
           {
               "exerciseId": "练习id",
               "type": 练习类型,
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
               "exerciseId": "练习id",
               "type": 练习类型,
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
           }
       ]
      }
      
      返回参数={
         "success":true,//true:成功 false:失败
         "attrs":{EXERCISE_RECORD_ID:练习记录id,
               "updateTime":修改时间
      返回参数={
         "success":true,//true:成功 false:失败
         "attrs":{EXERCISE_RECORD_ID:练习记录id,
               "updateTime":修改时间
          },
         "msg":"提交成功",//结果信息
         "msg":"提交成功",//结果信息
         }
    * 
@@ -751,7 +751,7 @@
   public @ResponseBody Object doSubmitExerAnswer(
         @RequestParam(value = "answers")  String answers)  {
      
      // 用户本次做题提交的数据
      // 用户本次做题提交的数据
      List<ExerciseItemAnswerData> lstAnswers = null;
      
      Result result = new Result(false);
@@ -759,12 +759,12 @@
      try {
         ObjectMapper mapper = new ObjectMapper();
         
         // 装换json到对象
         // 装换json到对象
         ExerciseSubmitAnswerData answerData = mapper.readValue(answers, ExerciseSubmitAnswerData.class);
         
         lstAnswers = answerData.getItems();
         
         // 记录id
         // 记录id
         String initExerciseRecordId = answerData.getExerciseRecordId();
                  
         if(lstAnswers.isEmpty() 
@@ -775,38 +775,38 @@
                  initExerciseRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER,
                  ExerciseDataSubmitLog.STATUS_FAILED, "/exercise/Exercise/exerAnswers");
            
            return new Result(false,"提交数据异常");
            return new Result(false,"提交数据异常");
         }
            
         // 1.---------记录提交的数据日志
         // 记录提交的数据日志
         // 1.---------记录提交的数据日志
         // 记录提交的数据日志
         String exerciseDataLogId = exerciseVerService.doSaveExerciseDataSubmitLog(answers,
               initExerciseRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, 
               ExerciseDataSubmitLog.STATUS_SUCCESS,"/exercise/Exercise/exerAnswers");
         
         // 2.-------- 提交答案
         // 操作练习数据
         // 2.-------- 提交答案
         // 操作练习数据
         Map<String,Object> resultMap = exerciseVerService.doOperExerciseAnswerData(answerData);
         
         result = new Result(true, "答案提交成功");
         result = new Result(true, "答案提交成功");
         result.setData(resultMap);
         
         // 3.-------- 班级统计数据
         // 3.-------- 班级统计数据
         if(resultMap.get("exerciseGroupId") != null){
            
            String exerciseGroupId = String.valueOf(resultMap.get("exerciseGroupId"));
            
            // 2.发送班级排名请求
            // 2.发送班级排名请求
            exerciseVerService.sendUpdateClassRankMsg(exerciseGroupId);
            
            // 3.发送 题目的全站统计 、个人统计、班级正确率请求消息
            // 3.发送 题目的全站统计 、个人统计、班级正确率请求消息
            exerciseVerService.sendUpdateExerItemStatisticsMsg(exerciseGroupId, answerData);
            //exerciseVerService.doStatisUserExerciseItemData(ClientUtils.getUserId(), ClientUtils.getUserName(), answerData);
         }
         
         // 4.---------更新本次提交的数据日志exerciseRecordId
         // 4.---------更新本次提交的数据日志exerciseRecordId
         if(StringUtils.isBlank(initExerciseRecordId) 
               && resultMap.get(EXERCISE_RECORD_ID) != null){// 为空 说明第一次提交  更新日志记录id
               && resultMap.get(EXERCISE_RECORD_ID) != null){// 为空 说明第一次提交  更新日志记录id
            
            exerciseRecordId = String.valueOf(resultMap.get(EXERCISE_RECORD_ID));
            
@@ -815,8 +815,8 @@
         
      } catch (Exception e) {
         
         result = new Result(false, "提交练习答案请求异常");
         log.error("提交练习答案请求异常===",e);
         result = new Result(false, "提交练习答案请求异常");
         log.error("提交练习答案请求异常===",e);
         
         exerciseVerService.doSaveExerciseDataSubmitLog(answers,
               exerciseRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, 
@@ -828,44 +828,44 @@
   
   
   /**
    * APP2.0: 提交练习答案
    * APP2.0: 提交练习答案
    * URL:    /exercise/Exercise/exerAnswers
    * 
    * 请求参数=[{
       "exerciseGroupId": 组id,
       EXERCISE_RECORD_ID: 记录id,
    * 请求参数=[{
       "exerciseGroupId": 组id,
       EXERCISE_RECORD_ID: 记录id,
       "exerciseExtendId": null, 
       "currTitleNum": "当前题号",
       "status": ״̬,
       "type": 练习类型,// 整型
       "doCount": 练习类型,
       "correctCount": 正确个数,
       "allCount":题目总数,
       "currTitleNum": "当前题号",
       "status": 状态,
       "type": 练习类型,// 整型
       "doCount": 练习类型,
       "correctCount": 正确个数,
       "allCount":题目总数,
       "items": [
           {
               "exerciseId": "练习id",
               "type": 练习类型,// 整数型
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
               "exerciseId": "练习id",
               "type": 练习类型,// 整数型
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
           }, 
           {
               "exerciseId": "练习id",
               "type": 练习类型,
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
               "exerciseId": "练习id",
               "type": 练习类型,
               "answer": "选择答案",
               "correct": 是否正确(0:错误 1:正确 2:未知)
           }
       ]
      },
         ...
      ]
      
      返回参数={"success":true,//true:成功 false:失败
         "attrs":[{EXERCISE_RECORD_ID:练习记录id,
         exerciseGroupId:练习组id,
         isNewRecord:是否为新增的record(true:是 false:否)
         "updateTime":修改时间
      返回参数={"success":true,//true:成功 false:失败
         "attrs":[{EXERCISE_RECORD_ID:练习记录id,
         exerciseGroupId:练习组id,
         isNewRecord:是否为新增的record(true:是 false:否)
         "updateTime":修改时间
         },...],
         "msg":"提交成功",//结果信息
         "msg":"提交成功",//结果信息
         }
    * 
@@ -876,7 +876,7 @@
   public @ResponseBody Object doSubmitMutiExerAnswer(
         @RequestParam(value = "answers")  String answers)  {
      
      // 用户本次做题提交的数据
      // 用户本次做题提交的数据
      List<ExerciseSubmitAnswerData> lstRecord = null;
      List<ExerciseItemAnswerData> lstAnswers= null;
      String exerciseRecordId = null;
@@ -890,7 +890,7 @@
      try {
         ObjectMapper mapper = new ObjectMapper();
         
         // 装换json到对象
         // 装换json到对象
         ExerciseSubmitAnswerDataList answerDataList = mapper.readValue(answers, ExerciseSubmitAnswerDataList.class);
         
         lstRecord = answerDataList.getDatas();
@@ -903,17 +903,17 @@
               continue;
            }
            
            // 记录id
            // 记录id
            String initExerciseRecordId = answerData.getExerciseRecordId();
                     
            // 记录提交的数据日志
            // 记录提交的数据日志
            String recordData = JSONObject.toJSONString(answerData);
            
            lstAnswers = answerData.getItems();
                  
            if(lstAnswers.isEmpty() 
                  && !ExerciseRecord.STATUS_SUBMIT.equals(answerData.getStatus())
                  && answerData.getSubmitType() != 1){// 仅提交 或仅仅本地无网重做
                  && answerData.getSubmitType() != 1){// 仅提交 或仅仅本地无网重做
               
               exerciseVerService.doSaveExerciseDataSubmitLog(recordData,
                     initExerciseRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER,
@@ -922,36 +922,36 @@
               continue;
            }
            
            // 1.---------记录提交的数据日志
            // 1.---------记录提交的数据日志
            String exerciseDataLogId = exerciseVerService.doSaveExerciseDataSubmitLog(recordData,
                  initExerciseRecordId, ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER,
                  ExerciseDataSubmitLog.STATUS_SUCCESS,"/exercise/Exercise/exerMutiAnswers");
            
            // 2.-------- 提交答案
            // 操作练习数据
            // 2.-------- 提交答案
            // 操作练习数据
            returnMap = exerciseVerService.doOperExerciseAnswerData(answerData);
            if(StringUtils.isBlank(initExerciseRecordId)){// 表示recordId为新增
            if(StringUtils.isBlank(initExerciseRecordId)){// 表示recordId为新增
               returnMap.put("isNewRecord", true);
            }else{
               returnMap.put("isNewRecord", false);
            }
            
            resultList.add(returnMap);
            // 3.-------- 班级统计数据;
            // 3.-------- 班级统计数据;
            if(returnMap.get("exerciseGroupId") != null){
               
               String exerciseGroupId = String.valueOf(returnMap.get("exerciseGroupId"));
               
               // 2.发送班级排名请求
               // 2.发送班级排名请求
               exerciseVerService.sendUpdateClassRankMsg(exerciseGroupId);
               
               // 3.发送 题目的全站统计  个人统计请求消息
               // 3.发送 题目的全站统计  个人统计请求消息
               exerciseVerService.sendUpdateExerItemStatisticsMsg(exerciseGroupId, answerData);
            }
            
            // 4.---------更新本次提交的数据日志exerciseRecordId
            // 4.---------更新本次提交的数据日志exerciseRecordId
            if(StringUtils.isBlank(initExerciseRecordId) 
                  && returnMap.get(EXERCISE_RECORD_ID) != null){// 为空 说明第一次提交  更新日志记录id
                  && returnMap.get(EXERCISE_RECORD_ID) != null){// 为空 说明第一次提交  更新日志记录id
               
               exerciseRecordId = String.valueOf(returnMap.get(EXERCISE_RECORD_ID));
               
@@ -962,12 +962,12 @@
         
         resultMap.put("success", true);
         resultMap.put("attrs", resultList);
         resultMap.put("msg", "提交成功");
         resultMap.put("msg", "提交成功");
         
      } catch (Exception e) {
         
         log.error("提交练习答案请求异常===",e);
         resultMap.put("msg", "提交练习答案请求异常");
         log.error("提交练习答案请求异常===",e);
         resultMap.put("msg", "提交练习答案请求异常");
         
         exerciseVerService.doSaveExerciseDataSubmitLog(answers,
               "exerMutiAnswers", ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER,
@@ -978,10 +978,10 @@
   }
   
   /**
    * APP2.0: 更新练习家庭作业、模拟考试是否提交
    * APP2.0: 更新练习家庭作业、模拟考试是否提交
    * URL:    /exercise/Exercise/updateHomeExerSubmitNew
    * 
    * @param exerciseRecordId     练习记录ID
    * @param exerciseRecordId     练习记录ID
    * @return
    */
   @RequestMapping(value = "updateHomeExerSubmitNew", method = RequestMethod.GET)
@@ -992,7 +992,7 @@
      ExerciseRecord record = commonDAO.read(ExerciseRecord.class, exerciseRecordId);
      if(record == null 
            || !ClientUtils.getUserId().equals(record.getUserId())){
         return new Result(false, "非法操作,不是当前用户操作");
         return new Result(false, "非法操作,不是当前用户操作");
      }
      
      record.setStatus(ExerciseRecord.STATUS_SUBMIT);
@@ -1002,10 +1002,10 @@
   } 
   
   /**
    * APP2.0: 更新练习家庭作业、模拟考试是否提交
    * APP2.0: 更新练习家庭作业、模拟考试是否提交
    * URL:    /exercise/Exercise/updateExerciseRecord
    * 
    * @param exerciseRecordId     练习记录ID
    * @param exerciseRecordId     练习记录ID
    * @return
    */
   @RequestMapping(value = "updateExerciseRecord", method = RequestMethod.GET)
@@ -1020,10 +1020,10 @@
   } 
   
   /**
    * APP2.0: 更新练习作业题号 app端重新开始做题
    * APP2.0: 更新练习作业题号 app端重新开始做题
    * URL:    /exercise/Exercise/updateNewExerRecordNew
    * 
    * @param groupId         习题组ID
    * @param groupId         习题组ID
    * @return
    */
   @RequestMapping(value = "updateNewExerRecordNew", method = RequestMethod.GET)
@@ -1032,26 +1032,26 @@
      
      Map<String,Object> map = exerciseVerService.doInsertExerRecord(groupId);
      Result result = new Result(true, "状态更新成功");
      Result result = new Result(true, "状态更新成功");
      result.setData(map);
      
      return result;
   } 
   
   /**
    * APP2.0: 题目答案分析
    * APP2.0: 题目答案分析
    * URL:    /exercise/Exercise/itemstatisics
    * 
    * 
    * 
    * @param groupId         习题组ID
    * @param groupId         习题组ID
    * @return
    */
   @RequestMapping(value = "itemStatisics", method = RequestMethod.GET)
   public @ResponseBody List<Map<String, Object>> doQueryExerciseItemStatisics(
         @RequestParam(value = GROUP_ID)  String groupId)  {
      
      // 查询结果
      // 查询结果
      List<Map<String, Object>> resultLst = exerciseVerService.queryExerciseItemStatisics(groupId);
      
      return resultLst;
@@ -1059,13 +1059,13 @@
   
   
   
   /** -----------------------------------------------APP V2.0接口 end--------------------------------------------------------*/
   /** -----------------------------------------------APP V2.0接口 end--------------------------------------------------------*/
   
   
   /**------------------------------  web 后端------------------------------------------------------------------------*/
   /**------------------------------  web 后端------------------------------------------------------------------------*/
   
   /**
    * 练习管理主页
    * 练习管理主页
    * 
    * @return
    */
@@ -1075,7 +1075,7 @@
   }
   
   /**
    * 机构练习管理主页
    * 机构练习管理主页
    * 
    * @return
    */
@@ -1085,9 +1085,9 @@
   }
   
   /**
    * (后台管理系统)
    * (后台管理系统)
    * 
    * 练习管理列表,获取列表数据
    * 练习管理列表,获取列表数据
    * 
    * @return
    */
@@ -1111,7 +1111,7 @@
      }
      sql = sql.concat(" order by g.order_num asc");
      
      //剔除互动及教学评估
      //剔除互动及教学评估
      List<ExerciseGroup> result = new ArrayList<ExerciseGroup>();
      if(StringUtils.isNotBlank(tid)){
         result = exerciseService.queryExerciceGroupList(sql, CollectionUtils.newList(ExerciseGroup.TYPE_EXERCISE_FREE,
@@ -1135,9 +1135,9 @@
   }
   
   /**
    * (后台管理系统)
    * (后台管理系统)
    * 
    * 机构练习管理列表,获取列表数据
    * 机构练习管理列表,获取列表数据
    * 
    * @return
    */
@@ -1183,7 +1183,7 @@
   }
   
   /**
    * 查看练习已经指定的机构和班级
    * 查看练习已经指定的机构和班级
    * @param groupId
    * @return
    */
@@ -1233,7 +1233,7 @@
      return result;
   }
   /**
    * 获取练习组数据
    * 获取练习组数据
    * 
    * @return
    */
@@ -1250,7 +1250,7 @@
   }
   
   /**
    * 获取练习数据
    * 获取练习数据
    * 
    * @return
    */
@@ -1265,7 +1265,7 @@
   }
   
   /**
    * 获取练习数据
    * 获取练习数据
    * 
    * @return
    */
@@ -1316,10 +1316,10 @@
   
   
   /**
    * (后台管理系统)
    * 删除练习组(优化)
    * (后台管理系统)
    * 删除练习组(优化)
    * 
    * 更新20150907:更新习题组最后修改时间
    * 更新20150907:更新习题组最后修改时间
    * @return
    */
   @RequestMapping(value = "deleteNew", method = RequestMethod.POST)
@@ -1330,10 +1330,10 @@
   }
   
   /**
    * (后台管理系统)
    * 删除练习组(优化)
    * (后台管理系统)
    * 删除练习组(优化)
    * 
    * 更新20150907:更新习题组最后修改时间
    * 更新20150907:更新习题组最后修改时间
    * @return
    */
   @RequestMapping(value = "deleteOrg", method = RequestMethod.POST)
@@ -1346,7 +1346,7 @@
   
   
   /**
    * 获取习题列表
    * 获取习题列表
    * 
    * @return
    */
@@ -1361,8 +1361,8 @@
   }
   
   /**
    * (后台管理系统)
    *  管理员同步习题到班级
    * (后台管理系统)
    *  管理员同步习题到班级
    * 
    * @param exerciseItemId
    * @return
@@ -1376,10 +1376,10 @@
   }
   
   /**
    * (后台管理系统)
    * 增加习题
    * (后台管理系统)
    * 增加习题
    * 
    * 更新20150617:更新习题组最后修改时间
    * 更新20150617:更新习题组最后修改时间
    * @return
    */
   @RequestMapping(value = "item/addOrUpdate", method = RequestMethod.POST)
@@ -1422,7 +1422,7 @@
         createItemOption(getOptionOrder(type,'N'),params.getOptionN(), checkN, params.getOptionN_Id(), params.getOptionN_imgIds(), lstOptions);
         createItemOption(getOptionOrder(type,'O'),params.getOptionO(), checkO, params.getOptionO_Id(), params.getOptionO_imgIds(), lstOptions);
         
         // 得到正确答案
         // 得到正确答案
         if(StringUtils.isBlank(params.getOptionE())){
            checkE=false;
         }
@@ -1438,10 +1438,10 @@
            item.setTitle(params.getTitle());
            item.setType(type);
            item.setImgs(getExerciseTitleImgs(params.getTitle_imgsIds()));
            if(groupId.contains("#")){// groupid结尾多#
            if(groupId.contains("#")){// groupid结尾多#
               groupId = groupId.substring(0, groupId.indexOf('#'));
            }
            // 练习不发系统通知
            // 练习不发系统通知
            //sendSysNotice(0, groupId);
            return exerciseService.insertExerciseItem(groupId, item, lstOptions,params.getAnalysis());   
         }else{
@@ -1449,7 +1449,7 @@
            item.setAnswer(answer);
            item.setTitle(params.getTitle());
            item.setType(type);
            // 练习不发系统通知
            // 练习不发系统通知
            //sendSysNotice(1, groupId);
            return exerciseService.updateExerciseItem(item, lstOptions,params.getAnalysis());   
         }
@@ -1458,7 +1458,7 @@
   
   
   /**
    * 得到正确答案
    * 得到正确答案
    * @param checkA
    * @param checkB
    * @param checkC
@@ -1470,7 +1470,7 @@
   private String getCorrectAnswer(ExerciseAddItemParams params,short type){
      StringBuffer answer = new StringBuffer(64);
      
      if(ExerciseItem.TYPE_TRUE_OR_FALSE==type){//判断
      if(ExerciseItem.TYPE_TRUE_OR_FALSE==type){//判断
         return params.getCheckA()?"True":params.getCheckB()?"False":null;
      }
      
@@ -1481,7 +1481,7 @@
         answer.append(',').append('B');
      }
      
      // 组装余下正确答案
      // 组装余下正确答案
      packagingCorrectAnswer(params, answer);
      
      String answers = answer.toString();
@@ -1494,7 +1494,7 @@
   }
   /**
    * 组装正确答案
    * 组装正确答案
    * @param checkC
    * @param checkD
    * @param checkE
@@ -1524,7 +1524,7 @@
   }
   
   /**
    * 组装正确答案
    * 组装正确答案
    * @param checkC
    * @param checkD
    * @param checkE
@@ -1556,12 +1556,12 @@
   }
   
   /**
    * 得到练习题目图片list
    * 得到练习题目图片list
    * @param title_imgsIds
    * @return
    */
   private List<ExerciseObjectImg> getExerciseTitleImgs(String title_imgsIds){
      if(StringUtils.isBlank(title_imgsIds)){//新增图片
      if(StringUtils.isBlank(title_imgsIds)){//新增图片
         return null;
      }
      String[] strImgsId = title_imgsIds.split(",");
@@ -1576,7 +1576,7 @@
   }
   
   /**
    * 创建习题选项
    * 创建习题选项
    * @param option
    * @param check
    * @param lstOptions
@@ -1590,7 +1590,7 @@
      }
      
      ExerciseItemOption a = new ExerciseItemOption();
      if(StringUtils.isNotBlank(optionId)){// 更新
      if(StringUtils.isNotBlank(optionId)){// 更新
         a.setOptionId(optionId);
      }else{
         if(StringUtils.isEmpty(option)){
@@ -1598,7 +1598,7 @@
         }
      }
      
      if(StringUtils.isNotBlank(imgsId)){//新增图片
      if(StringUtils.isNotBlank(imgsId)){//新增图片
         String[] strImgsId = imgsId.split(",");
         List<ExerciseObjectImg> imgs = new ArrayList<ExerciseObjectImg>(strImgsId.length);
         ExerciseObjectImg objImg = null;
@@ -1627,7 +1627,7 @@
   }
   
   /**
    * 更新习题
    * 更新习题
    * 
    * @return
    */
@@ -1638,9 +1638,9 @@
   }
   
   /**
    * (后台管理)
    * 删除习题
    * 更新20150617:更新习题组最后修改时间
    * (后台管理)
    * 删除习题
    * 更新20150617:更新习题组最后修改时间
    * 
    * @return
    */
@@ -1651,7 +1651,7 @@
   }
   
   /**
    * 根据classID获取所有课程
    * 根据classID获取所有课程
    * 
    * @return
    */ 
@@ -1666,7 +1666,7 @@
   }
   
   /**
    * 获取组名称
    * 获取组名称
    * 
    * @return
    */ 
@@ -1677,7 +1677,7 @@
      List<Map<String,Object>> lstMap = new ArrayList<Map<String,Object>>(1);
      Map<String,Object> map = null;
      
      if(group.getType() == ExerciseGroup.TYPE_CHAPTER_ITEM || group.getType() == ExerciseGroup.TYPE_EXERCISE_TOPIC || group.getType() == ExerciseGroup.TYPE_EXERCISE_EXAM){ // 章节练习 、 专项练习
      if(group.getType() == ExerciseGroup.TYPE_CHAPTER_ITEM || group.getType() == ExerciseGroup.TYPE_EXERCISE_TOPIC || group.getType() == ExerciseGroup.TYPE_EXERCISE_EXAM){ // 章节练习 、 专项练习
         map = new HashMap<String, Object>(7);
         map.put("groupId", group.getGroupId());
         map.put("name", group.getName());
@@ -1710,7 +1710,7 @@
   }
   
   /**
    * 编辑练习保存
    * 编辑练习保存
    * 
    * @return
    */ 
@@ -1721,7 +1721,7 @@
   }
   
   /**
    * 根据lessionId获取所有章节,排除掉当前班级
    * 根据lessionId获取所有章节,排除掉当前班级
    * 
    * @return
    */ 
@@ -1743,7 +1743,7 @@
   }
   
   /**
    * 根据classID获取顺序练习
    * 根据classID获取顺序练习
    * 
    * @return
    */ 
@@ -1754,7 +1754,7 @@
      
      int result = commonDAO.findCount(hql, CollectionUtils.newList(ClientUtils.getClassId(),ExerciseGroup.TYPE_EXERCISE_SEQUENCE));
      List<ClsClass> lstResult = new ArrayList<ClsClass>();
      //存在顺序练习,将班级信息传回
      //存在顺序练习,将班级信息传回
      if( result > 0){
         hql = "from ClsClass where classId = ? ";
         lstResult = commonDAO.find(hql, CollectionUtils.newList(ClientUtils.getClassId()), ClsClass.class);
@@ -1764,7 +1764,7 @@
   }
   
   /**
    * 根据classID获取顺序练习
    * 根据classID获取顺序练习
    * 
    * @return
    */ 
@@ -1780,7 +1780,7 @@
   }
   
   /**
    * 新增练习
    * 新增练习
    * 
    * @return
    */
@@ -1791,7 +1791,7 @@
   }
   
   /**
    * 机构新增练习
    * 机构新增练习
    * 
    * @return
    */
@@ -1802,7 +1802,7 @@
   }
   
   /**
    * 机构指定练习
    * 机构指定练习
    * 
    * @return
    */
@@ -1813,7 +1813,7 @@
   }
   
   /**
    * ORG 获取机构科目列表
    * ORG 获取机构科目列表
    * 
    * @return
    */
@@ -1832,7 +1832,7 @@
   }
   
   /**
    * 新增图片路径到数据库
    * 新增图片路径到数据库
    * @param fullPaths
    * @param imgObjId
    * @param imgObjType
@@ -1849,13 +1849,13 @@
      }
      String[] imgPaths = fullPaths.split(";");
      
      // 更新路径到数据库
      // 更新路径到数据库
      List<Map<String,Object>> lstResult = exerciseService.doAddExerciseObjImg(imgPaths, imgObjId, imgObjType);
      
      return lstResult;
   }
   
   /** 新增图片路径到数据库 */
   /** 新增图片路径到数据库 */
   @RequestMapping(value = "delExerObjImg",method = RequestMethod.POST)
   public @ResponseBody Result dodelExerciseObjImg(
         @RequestParam("imgId") String imgId){
@@ -1865,7 +1865,7 @@
      return result;
   }
   
   /** 查询图片路径 */
   /** 查询图片路径 */
   @RequestMapping(value = "queryExerObjImg",method = RequestMethod.POST)
   public @ResponseBody List<Map<String,Object>> doQueryExerciseObjImg(
         @RequestParam("imgObjId") String imgObjId,
@@ -1874,7 +1874,7 @@
         return null;
      }
      String hql = "from ExerciseObjectImg where deleteFlag is false and exerciseObjectId=? and objectType=? order by imgOrder";
      // 查询此练习是否已经存在记录
      // 查询此练习是否已经存在记录
      List<ExerciseObjectImg> lstObjImg = commonDAO.find(hql,
            CollectionUtils.newList(imgObjId,imgObjType), ExerciseObjectImg.class);
      
@@ -1894,12 +1894,12 @@
   }
   
   /**
    * (后台管理系统:导入习题模块)
    *  导入习题-习题导入深度解析
    * (后台管理系统:导入习题模块)
    *  导入习题-习题导入深度解析
    * 
    * @param groupId 习题组ID
    * @param groupId 习题组ID
    * @param uuid uuid
    * @param fileName 文件名称
    * @param fileName 文件名称
    * @return
    */
   @RequestMapping(value = "/item/deepAnalysisDoc", method = RequestMethod.POST)
@@ -1912,12 +1912,12 @@
   
   
   /**
    * (后台管理系统:导入习题模块)
    *  导入习题-第一次将word解析结果返回给前台,并不保存到数据库
    * (后台管理系统:导入习题模块)
    *  导入习题-第一次将word解析结果返回给前台,并不保存到数据库
    *  
    * @param groupId 习题组ID
    * @param groupId 习题组ID
    * @param uuid uuid
    * @param fileName 文件名称
    * @param fileName 文件名称
    * @return
    */
   @RequestMapping(value = "/item/import/parser/{groupId}", method = RequestMethod.POST)
@@ -1929,10 +1929,10 @@
   }
   
   /**
    * (后台管理系统:导入习题模块)
    *  校验内容,返回解析结果
    * (后台管理系统:导入习题模块)
    *  校验内容,返回解析结果
    * 
    * @param content 文本内容
    * @param content 文本内容
    * @return
    */
   @RequestMapping(value = "/item/import/validateExercise", method = RequestMethod.POST)
@@ -1943,7 +1943,7 @@
   }
   
   /**
    * 获取所有班级,当前班级除外,增加过滤没有习题的班级
    * 获取所有班级,当前班级除外,增加过滤没有习题的班级
    * @return
    */
   @RequestMapping(value = "loadClasses", method = RequestMethod.GET)
@@ -1969,7 +1969,7 @@
   }
   
   /**
    * 复制习题
    * 复制习题
    * @param fromClassId
    * @return
    */
@@ -1981,7 +1981,7 @@
   }
   
   /**
    * 学员得分详情列表
    * 学员得分详情列表
    * @param groupId
    * @return
    */
@@ -1995,7 +1995,7 @@
   }
   
   /**
    * 初始化平均成绩和最高成绩
    * 初始化平均成绩和最高成绩
    * @param groupId
    * @return
    */
@@ -2008,7 +2008,7 @@
   }
   
   /**
    * 每道题得分详情
    * 每道题得分详情
    * @param groupId
    * @return
    */
@@ -2021,7 +2021,7 @@
   }
   
   /**
    * 加载题目选项详情 - 班级、机构
    * 加载题目选项详情 - 班级、机构
    * @param groupId
    * @return
    */
@@ -2034,7 +2034,7 @@
   }
   
   /**
    * 刷新更新统计
    * 刷新更新统计
    * @param groupId
    * @return
    */
@@ -2047,7 +2047,7 @@
   }
   
   /**
    * 导出练习每道题得分详情
    * 导出练习每道题得分详情
    * 
    * @return
    * @throws IOException 
@@ -2056,13 +2056,13 @@
   public String exportItemStatis(@PathVariable String groupId,HttpServletResponse response) throws IOException {
      ExerciseGroup exeGroup= this.commonDAO.read(ExerciseGroup.class, groupId);
      
      //获取每道题得分详情列表
      //获取每道题得分详情列表
      List<ExerciseItemStatistics> itemStatisLst = exerciseService.itemDetailList(groupId);
      
      ExcelExportUtils<ExerciseItemStatistics> ex = new ExcelExportUtils<ExerciseItemStatistics>();
      ExcelExportParam<ExerciseItemStatistics> obj = new ExcelExportParam<ExerciseItemStatistics>();
      obj.setColData(itemStatisLst);
      String[] headers = { "序号","题号","题目", "类型", "正确答案","班级正确率","全站正确率"};
      String[] headers = { "序号","题号","题目", "类型", "正确答案","班级正确率","全站正确率"};
      
      obj.setHeaders(headers);
      obj.setLstColumn(new ArrayList<String>(Arrays.asList("itemNo","exerciseItemTitel","itemTypeName","correctAnswer","classAccuracyShow","orgAccuracyShow")));
@@ -2070,7 +2070,7 @@
      
      response.reset();
      response.setContentType("application/vnd.ms-excel;charset=utf-8");
      response.setHeader("Content-Disposition", "attachment;filename="+ new String((ClientUtils.getClassName()+ "_" + exeGroup.getName() + "_详情.xls").getBytes(), "iso-8859-1"));
      response.setHeader("Content-Disposition", "attachment;filename="+ new String((ClientUtils.getClassName()+ "_" + exeGroup.getName() + "_详情.xls").getBytes(), "iso-8859-1"));
      response.setCharacterEncoding("utf-8");
      OutputStream ouputStream = response.getOutputStream();
      obj.setOut(ouputStream);
@@ -2082,23 +2082,23 @@
   }
   
   /**
    * 导出练习学员得分详情
    * 导出练习学员得分详情
    * 
    * @return
    * @throws IOException 
    */
   @RequestMapping(value = "userScoreStatis/data/{groupId}", method = RequestMethod.GET)
   public String exportUserScore(@PathVariable String groupId,HttpServletResponse response) throws IOException {
      // 获取组名称
      // 获取组名称
      ExerciseGroup exeGroup= this.commonDAO.read(ExerciseGroup.class, groupId);
      
      // 获取之前组装的排名List<Map<String, Object>>列表
      // 获取之前组装的排名List<Map<String, Object>>列表
      List<Map<String, Object>> userScoreMap = exerciseService.resultList(groupId);
      List<ExportUserScore> userLst = new ArrayList<ExportUserScore>(userScoreMap.size());
      ExportUserScore user = null;
      
      if(userScoreMap != null){
         // 将获取的Map列表转换为List列表
         // 将获取的Map列表转换为List列表
         for(Map<String, Object> userScore:userScoreMap){
            user = new ExportUserScore();
            user.setName(String.valueOf(userScore.get("name")));
@@ -2113,7 +2113,7 @@
         ExcelExportUtils<ExportUserScore> ex = new ExcelExportUtils<ExportUserScore>();
         ExcelExportParam<ExportUserScore> obj = new ExcelExportParam<ExportUserScore>();
         obj.setColData(userLst);
         String[] headers = { "排名","学员姓名","报名码","报名时间","手机号码", "提交时间", "成绩"};
         String[] headers = { "排名","学员姓名","报名码","报名时间","手机号码", "提交时间", "成绩"};
         
         obj.setHeaders(headers);
         obj.setLstColumn(new ArrayList<String>(Arrays.asList("name","salesCode","createTime","mobilePhone","submitTime","score")));
@@ -2121,7 +2121,7 @@
         
         response.reset();
         response.setContentType("application/vnd.ms-excel;charset=utf-8");
         response.setHeader("Content-Disposition", "attachment;filename="+ new String((ClientUtils.getClassName() + "_" + exeGroup.getName() + "_成绩.xls").getBytes(), "iso-8859-1"));
         response.setHeader("Content-Disposition", "attachment;filename="+ new String((ClientUtils.getClassName() + "_" + exeGroup.getName() + "_成绩.xls").getBytes(), "iso-8859-1"));
         response.setCharacterEncoding("utf-8");
         OutputStream ouputStream = response.getOutputStream();
         obj.setOut(ouputStream);
@@ -2136,7 +2136,7 @@
   
   
   /**
    * 习题组排序
    * 习题组排序
    * 
    * @param key
    * @return
@@ -2148,7 +2148,7 @@
   }
   
   /**
    * 习题排序
    * 习题排序
    * 
    * @param key
    * @return
@@ -2161,14 +2161,14 @@
   
   
   
   /******************************************py导入******************************************************************/
   /******************************************py导入******************************************************************/
   /**
    * (后台管理系统:导入习题模块)
    *  导入习题-第一次将word解析结果返回给前台,并不保存到数据库
    * (后台管理系统:导入习题模块)
    *  导入习题-第一次将word解析结果返回给前台,并不保存到数据库
    *  
    * @param groupId 习题组ID
    * @param groupId 习题组ID
    * @param uuid uuid
    * @param fileName 文件名称
    * @param fileName 文件名称
    * @return
    */
   @RequestMapping(value = "/item/importpy/parse/{groupId}", method = RequestMethod.POST)
@@ -2179,10 +2179,10 @@
   }
   
   /**
    * (后台管理系统:导入习题模块)
    *  校验内容,返回解析结果
    * (后台管理系统:导入习题模块)
    *  校验内容,返回解析结果
    * 
    * @param content 文本内容
    * @param content 文本内容
    * @return
    */
   @RequestMapping(value = "/item/importpy/validate", method = RequestMethod.POST)
@@ -2192,10 +2192,10 @@
   }
   
   /**
    * (后台管理系统:导入习题模块)
    *  导入内容,返回解析结果
    * (后台管理系统:导入习题模块)
    *  导入内容,返回解析结果
    * 
    * @param content 文本内容
    * @param content 文本内容
    * @return
    */
   @SuppressWarnings("unchecked")
@@ -2211,18 +2211,18 @@
         return exercisePyService.doImportPyExercise(lst,groupId);
         
      } catch (Exception e) {
         log.error("提交数据有误" + e );
         log.error("提交数据有误" + e );
      }
      
      return new Result(false,"解析json失败");
      return new Result(false,"解析json失败");
   }
   
   
   
   
   /**-----------------  问卷调查----start-----------------------------------*/
   /**-----------------  问卷调查----start-----------------------------------*/
   /**
    * 评估模块添加问答
    * 评估模块添加问答
    * 
    * @param jsonExerciseItemDTO
    * @return
@@ -2237,19 +2237,19 @@
      boolean mustAnswer = jsonObject.getBooleanValue("mustAnswer");
      short type = jsonObject.getShort("type");
      String analysis = jsonObject.getString("analysis");
      JSONArray titleImgs = jsonObject.getJSONArray("imags");// 题目的图片路径
      JSONArray titleImgs = jsonObject.getJSONArray("imags");// 题目的图片路径
      
      //获取选项
      //获取选项
      List<ExerciseItemOption> lstOptions = JSONArray.parseArray(jsonObject.getString("lstOptions"), ExerciseItemOption.class);
      ExerciseItem item = null;
      
      if(StringUtils.isEmpty(exerciseId)){// 新增
      if(StringUtils.isEmpty(exerciseId)){// 新增
         item = new ExerciseItem();
         item.setTitle(title);
         item.setType(type);
         item.setMustAnswer(mustAnswer);
         exerciseService.insertExerciseItem4Evaluate(groupId, item, lstOptions,analysis,titleImgs);
      }else{// 编辑
      }else{// 编辑
         item = this.commonDAO.read(ExerciseItem.class, exerciseId);
         item.setTitle(title);
         item.setType(type);
@@ -2264,7 +2264,7 @@
   
   
   /**
    * 获取问卷习题列表
    * 获取问卷习题列表
    * 
    * @return
    */
@@ -2277,9 +2277,9 @@
   }
   
   /**
    * 查看学员答卷情况
    * 查看学员答卷情况
    * 
    * @param recordId 答题记录id
    * @param recordId 答题记录id
    * @param schEvaluateId
    * @return
    */
@@ -2289,14 +2289,14 @@
      return exerciseService.queryUserEvaExerciseDetail(recordId, evaluateId);
   }
   
   /** 查询图片路径 */
   /** 查询图片路径 */
   @RequestMapping(value = "evaluate/queryExerObjImg",method = RequestMethod.GET)
   public @ResponseBody ResultJson queryEvaExerciseObjImg(
         @RequestParam("imgObjId") String imgObjId,
         @RequestParam("imgObjType") int imgObjType){
      
      if(StringUtils.isBlank(imgObjId)){
         return new ResultJson(false,"参数为空");
         return new ResultJson(false,"参数为空");
      }
      
      List<Map<String,Object>> lstResult =  exerciseService.queryEvaExerciseObjImg(imgObjId, imgObjType);
@@ -2305,7 +2305,7 @@
   }
   
   /**
    * 新增图片路径到数据库
    * 新增图片路径到数据库
    * @param fullPaths
    * @param imgObjId
    * @param imgObjType
@@ -2322,13 +2322,13 @@
      }
      String[] imgPaths = fullPaths.split(";");
      
      // 更新路径到数据库
      // 更新路径到数据库
      List<Map<String,Object>> lstResult = exerciseService.doAddEvaExerciseObjImg(imgPaths, imgObjId, imgObjType);
      
      return new ResultJson(true,"success",lstResult);
   }
   
   /** 删除图片路径到数据库 */
   /** 删除图片路径到数据库 */
   @RequestMapping(value = "evaluate/delExerObjImg",method = RequestMethod.POST)
   public @ResponseBody ResultJson dodelEvaExerciseObjImg(
         @RequestParam("imgId") String imgId){
@@ -2337,9 +2337,9 @@
      
      return result;
   }
   /**------------------  问卷调查----end------------------------------------*/
   /**------------------  问卷调查----end------------------------------------*/
   
   
   /**------------------------------  web 后端----end--------------------------------------------------------------------*/
   /**------------------------------  web 后端----end--------------------------------------------------------------------*/
   
}