package com.qxueyou.scc.exercise.service.impl;
|
|
import java.math.BigDecimal;
|
import java.math.BigInteger;
|
import java.util.ArrayList;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.stream.Collectors;
|
|
import org.apache.commons.lang3.StringUtils;
|
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.Logger;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import com.alibaba.fastjson.JSON;
|
import com.querydsl.core.types.Expression;
|
import com.querydsl.core.types.dsl.CaseBuilder;
|
import com.qxueyou.scc.admin.classes.model.ClsClass;
|
import com.qxueyou.scc.admin.score.model.view.QHomeworkScoreV;
|
import com.qxueyou.scc.base.dao.CommonRedisTemplate;
|
import com.qxueyou.scc.base.model.Pager;
|
import com.qxueyou.scc.base.model.Result;
|
import com.qxueyou.scc.base.service.impl.CommonAppService;
|
import com.qxueyou.scc.base.util.ClientUtils;
|
import com.qxueyou.scc.base.util.CollectionUtils;
|
import com.qxueyou.scc.base.util.DateTimeUtils;
|
import com.qxueyou.scc.base.util.QBeanUtils;
|
import com.qxueyou.scc.base.util.TraceUtils;
|
import com.qxueyou.scc.base.util.UUIDUtils;
|
import com.qxueyou.scc.exercise.model.ExerItemResponseData;
|
import com.qxueyou.scc.exercise.model.ExerciseCompleteInfo;
|
import com.qxueyou.scc.exercise.model.ExerciseDataSubmitLog;
|
import com.qxueyou.scc.exercise.model.ExerciseExamReClass;
|
import com.qxueyou.scc.exercise.model.ExerciseExamReGroup;
|
import com.qxueyou.scc.exercise.model.ExerciseGroup;
|
import com.qxueyou.scc.exercise.model.ExerciseInfo;
|
import com.qxueyou.scc.exercise.model.ExerciseItem;
|
import com.qxueyou.scc.exercise.model.ExerciseItemAnswerData;
|
import com.qxueyou.scc.exercise.model.ExerciseItemSet;
|
import com.qxueyou.scc.exercise.model.ExerciseItemStatistics;
|
import com.qxueyou.scc.exercise.model.ExerciseRecord;
|
import com.qxueyou.scc.exercise.model.ExerciseResultV;
|
import com.qxueyou.scc.exercise.model.ExerciseSubmitAnswerData;
|
import com.qxueyou.scc.exercise.model.QExerciseInfo;
|
import com.qxueyou.scc.exercise.service.IExerciseCompleteService;
|
import com.qxueyou.scc.exercise.service.IExerciseGroupService;
|
import com.qxueyou.scc.exercise.service.IExerciseInfoService;
|
import com.qxueyou.scc.exercise.service.IExerciseVerService;
|
import com.qxueyou.scc.media.model.MediaVideo;
|
import com.qxueyou.scc.media.service.IMediaVideoService;
|
import com.qxueyou.scc.msg.model.MsgInfo;
|
import com.qxueyou.scc.msg.service.IMsgInfoService;
|
import com.qxueyou.scc.org.model.OrgText;
|
import com.qxueyou.scc.org.service.IOrgTextService;
|
import com.qxueyou.scc.school.model.HandoutConverTask;
|
import com.qxueyou.scc.school.model.SchHandout;
|
import com.qxueyou.scc.school.service.IHandoutService;
|
import com.qxueyou.scc.teach.res.model.ResFile;
|
|
/**
|
* ¿¼ÊÔ
|
*
|
* @author lihanqi
|
*
|
*/
|
@Service
|
public class ExerciseInfoService extends CommonAppService implements IExerciseInfoService {
|
private final Logger log = LogManager.getLogger(ExerciseInfoService.class);
|
|
private final String[] EXAM_TYPES = new String[] { "A", "B", "C", "D" };
|
|
/** Á·Ï°V2.0°æ±¾½Ó¿Úservice */
|
@Autowired
|
private IExerciseVerService exerciseVerService;
|
|
@Autowired
|
CommonRedisTemplate commonRedisTemplate;
|
|
@Autowired
|
IOrgTextService orgTextService;
|
|
@Autowired
|
IMediaVideoService mediaVideoService;
|
|
@Autowired
|
IHandoutService handoutService;
|
|
@Autowired
|
IMsgInfoService msgInfoService;
|
|
@Autowired
|
IExerciseCompleteService exerciseCompleteService;
|
|
@Autowired
|
IExerciseGroupService exerciseGroupService;
|
|
@Override
|
public List<ExerciseInfo> list(String keyword,String classId,Short status,Integer pageSize,Integer pageNum) {
|
StringBuffer hql = new StringBuffer(500);
|
hql.append("from ExerciseInfo e where e.name like ? and e.createId =? ");
|
List<Object> params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId());
|
|
if(status!=null){
|
hql.append(" and e.status = ? ");
|
params.add(status);
|
}
|
|
if(StringUtils.isNotEmpty(classId)){
|
hql.append(" and exists(select 1 from ExerciseExamReClass r where e.exerciseInfoId=r.examId and r.classId = ? and r.deleteFlag is false)");
|
params.add(classId);
|
}
|
|
hql.append(" and e.deleteFlag is false order by e.createTime desc");
|
return findList(hql.toString(),new Pager(pageSize, pageNum),params, ExerciseInfo.class);
|
}
|
|
@Override
|
public int listCount(String keyword,String classId, Short status) {
|
StringBuffer hql = new StringBuffer(500);
|
hql.append("from ExerciseInfo e where e.name like ? and e.createId =? ");
|
List<Object> params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId());
|
|
if(status!=null){
|
hql.append(" and e.status = ? ");
|
params.add(status);
|
}
|
|
if(StringUtils.isNotEmpty(classId)){
|
hql.append(" and exists(select 1 from ExerciseExamReClass r where e.exerciseInfoId=r.examId and r.classId = ? and r.deleteFlag is false)");
|
params.add(classId);
|
}
|
|
hql.append(" and e.deleteFlag is false ");
|
return findCount(hql.toString(),params);
|
}
|
|
/**
|
* ±£´æ×÷Òµ
|
*
|
* @return
|
*/
|
public Result insertExerciseInfo(ExerciseInfo exerciseInfo) {
|
String[] classIds = QBeanUtils.listPropertyVal(exerciseInfo.getReClasses(), "classId").toArray(new String[exerciseInfo.getReClasses().size()]);
|
|
String exerciseInfoId = UUIDUtils.generateUUID().replace("-", "");
|
exerciseInfo.setExerciseInfoId(exerciseInfoId);
|
exerciseInfo.setOrgId(ClientUtils.getOrgId());
|
exerciseInfo.setClassCount(classIds == null ? 0 : classIds.length);
|
exerciseInfo.setClassCount(exerciseInfo.getReClasses().size());
|
TraceUtils.setCreateTrace(exerciseInfo);
|
this.save(exerciseInfo);
|
|
if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER) {
|
// ±£´æÌâÄ¿ÀàÐÍ
|
List<ExerciseItemSet> lstExerciseItemSet = exerciseInfo.getExerciseItemSets();
|
this.saveExerciseItemSet(exerciseInfoId,lstExerciseItemSet);
|
|
//Éú³É×÷ÒµÌâÄ¿ÐÅÏ¢
|
String[] sourceGroupIds = QBeanUtils.listPropertyVal(exerciseInfo.getReGroups(), "groupId").toArray(new String[exerciseInfo.getReGroups().size()]);
|
|
String newGroupId = this.exerciseGroupService.doCreateRandomExerciseGroup(
|
exerciseInfo.getName() + "-×÷Òµ",ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM,sourceGroupIds,lstExerciseItemSet);
|
|
if(StringUtils.isEmpty(newGroupId)){
|
return new Result(false, "ÌâÄ¿Êý¾Ý²»¹»£¬ÇëÔö¼ÓÌâ¿âµÄÌâÄ¿»òÕß¼õÉÙÊÔ¾íµÄÌâÊý",exerciseInfoId);
|
}
|
|
this.saveExerciseExamReGroup(exerciseInfoId,new String[]{newGroupId},EXAM_TYPES[0],ExerciseExamReGroup.GROUP_TYPE_EXAM);
|
|
// ±£´æ¹ØÁªÌâ¿âÐÅÏ¢
|
this.saveExerciseExamReGroup(exerciseInfoId,sourceGroupIds,null,ExerciseExamReGroup.GROUP_TYPE_SOURCE);
|
}
|
|
// ±£´æ¹ØÁª°à¼¶
|
this.saveExerciseExamReClass(exerciseInfoId, classIds);
|
|
return new Result(true, "", exerciseInfoId);
|
}
|
|
/**
|
* ÐÞ¸ÄÁ·Ï°
|
*
|
* @return
|
*/
|
public Result updateExerciseInfo(ExerciseInfo exerciseInfo) {
|
String[] classIds = QBeanUtils.listPropertyVal(exerciseInfo.getReClasses(), "classId").toArray(new String[exerciseInfo.getReClasses().size()]);
|
|
String exerciseInfoId = exerciseInfo.getExerciseInfoId();
|
|
ExerciseInfo newExerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId);
|
newExerciseInfo.setScore(exerciseInfo.getScore());
|
newExerciseInfo.setClassCount(classIds == null ? 0 : classIds.length);
|
newExerciseInfo.setEndTime(exerciseInfo.getEndTime());
|
newExerciseInfo.setName(exerciseInfo.getName());
|
newExerciseInfo.setDate(exerciseInfo.getDate());
|
newExerciseInfo.setStartTime(exerciseInfo.getStartTime());
|
newExerciseInfo.setSubjectId(exerciseInfo.getSubjectId());
|
newExerciseInfo.setRemind(exerciseInfo.getRemind());
|
newExerciseInfo.setPassingScore(exerciseInfo.getPassingScore());
|
newExerciseInfo.setCommitUploadType(exerciseInfo.getCommitUploadType());
|
TraceUtils.setUpdateTrace(newExerciseInfo);
|
this.save(newExerciseInfo);
|
|
//ÇåÀí¾É¹ØÏµÊý¾Ý
|
this.doClearExerciseExamReData(exerciseInfoId);
|
|
// ´ðÌâ×÷ҵĬÈϰ´ÕÕͳһ¾íÉú³É×÷ÒµÌâÄ¿
|
|
if (newExerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER) {
|
|
// ±£´æÌâÄ¿ÀàÐÍ
|
List<ExerciseItemSet> lstExerciseItemSet = exerciseInfo.getExerciseItemSets();
|
|
saveExerciseItemSet(exerciseInfoId,lstExerciseItemSet);
|
|
//Éú³É×÷ÒµÌâÄ¿ÐÅÏ¢
|
String[] groupIds = QBeanUtils.listPropertyVal(exerciseInfo.getReGroups(), "groupId").toArray(new String[exerciseInfo.getReGroups().size()]);
|
String newGroupId = this.exerciseGroupService.doCreateRandomExerciseGroup(
|
exerciseInfo.getName() + "-×÷Òµ",ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM,groupIds, lstExerciseItemSet);
|
|
if(StringUtils.isEmpty(newGroupId)){
|
return new Result(false, "ÌâÄ¿Êý¾Ý²»¹»£¬ÇëÔö¼ÓÌâ¿âµÄÌâÄ¿»òÕß¼õÉÙÊÔ¾íµÄÌâÊý");
|
}
|
|
this.saveExerciseExamReGroup(exerciseInfoId,new String[]{newGroupId},EXAM_TYPES[0],ExerciseExamReGroup.GROUP_TYPE_EXAM);
|
|
// ±£´æ¹ØÁªÌâ¿âÐÅÏ¢
|
this.saveExerciseExamReGroup(exerciseInfoId,groupIds,null,ExerciseExamReGroup.GROUP_TYPE_SOURCE);
|
|
|
}
|
|
// ±£´æ¹ØÁª°à¼¶
|
this.saveExerciseExamReClass(exerciseInfoId, classIds);
|
|
return new Result(true, "", exerciseInfoId);
|
}
|
|
//Çå³ý֮ǰµÄÁ·Ï°¹ØÁª¹ØÏµÊý¾Ý
|
private void doClearExerciseExamReData(String exerciseInfoId){
|
this.bulkUpdate("update ExerciseExamReGroup set deleteFlag = 1 where examId = ?",new Object[]{exerciseInfoId});
|
this.bulkUpdate("update ExerciseExamReClass set deleteFlag = 1 where examId = ?",new Object[] {exerciseInfoId});
|
this.bulkUpdate("update ExerciseItemSet set deleteFlag = 1 where exerciseInfoId = ?",new Object[]{exerciseInfoId});
|
}
|
|
private void saveExerciseExamReClass(String exerciseInfoId,String[] classIds){
|
ExerciseExamReClass reClass = null;
|
for (String classId : classIds) {
|
reClass = new ExerciseExamReClass();
|
reClass.setClassId(classId);
|
reClass.setDeleteFlag(false);
|
reClass.setExamId(exerciseInfoId);
|
TraceUtils.setCreateTrace(reClass);
|
this.save(reClass);
|
}
|
}
|
|
private void saveExerciseExamReGroup(String exerciseInfoId, String [] groupIds,String examType,short reType){
|
ExerciseExamReGroup reGroup = null;
|
for (String groupId : groupIds) {
|
reGroup = new ExerciseExamReGroup();
|
reGroup.setGroupId(groupId);
|
reGroup.setDeleteFlag(false);
|
reGroup.setExamType(examType);
|
reGroup.setType(reType);
|
reGroup.setExamId(exerciseInfoId);
|
TraceUtils.setCreateTrace(reGroup);
|
this.save(reGroup);
|
}
|
}
|
|
private void saveExerciseItemSet(String exerciseInfoId,List<ExerciseItemSet> lstExerciseItemSet){
|
for (ExerciseItemSet itemSet : lstExerciseItemSet) {
|
itemSet.setExerciseInfoId(exerciseInfoId);
|
TraceUtils.setCreateTrace(itemSet);
|
this.save(itemSet);
|
}
|
}
|
|
/**
|
* ɾ³ý×÷Òµ
|
*
|
* @param examId
|
* @return
|
*/
|
@Override
|
public Result deleteExerciseInfo(String exerciseInfoIds) {
|
return bulkUpdateInLoop("update ExerciseInfo set deleteFlag = true where exerciseInfoId=?",exerciseInfoIds.split(","));
|
}
|
|
@Override
|
public String queryExerciseInfoRelatedGroupId(String exerciseInfoId) {
|
return this.findUnique("select groupId from ExerciseExamReGroup where examId=? and type=? and deleteFlag is false ",
|
CollectionUtils.newList(exerciseInfoId, ExerciseExamReGroup.GROUP_TYPE_EXAM),String.class);
|
}
|
|
|
@Override
|
public List<ExerciseItemSet> queryExerciseItemSet(String exerciseInfoId){
|
return this.find("from ExerciseItemSet where exerciseInfoId=? and deleteFlag is false order by itemType ASC",
|
CollectionUtils.newList(exerciseInfoId), ExerciseItemSet.class);
|
}
|
|
@Override
|
public List<ExerciseResultV> queryStuExerciselist(String keyword,String exerciseInfoId,String userId,String subjectId,Short status,Integer pageSize,Integer pageNum) {
|
StringBuffer hql = new StringBuffer(500);
|
hql.append("from ExerciseResultV where exerciseStatus=?");
|
List<Object> params = CollectionUtils.newList(ExerciseInfo.EXERCISE_STATUS_PUBLISHED);
|
|
if(!StringUtils.isEmpty(userId)){
|
hql.append(" and userId=? ");
|
params.add(userId);
|
}
|
|
if(!StringUtils.isEmpty(exerciseInfoId)){
|
hql.append(" and id.exerciseInfoId=?");
|
params.add(exerciseInfoId);
|
}
|
|
if(!StringUtils.isEmpty(keyword)){
|
hql.append(" and studentName like ?");
|
params.add("%" + keyword.trim() + "%");
|
}
|
|
if(!StringUtils.isEmpty(subjectId)){
|
hql.append(" and subjectId=?");
|
params.add(subjectId);
|
}
|
|
//ĬÈÏÈ«²¿£¬0´ýÍê³É£¬1ÒÑÌá½» ,2:ÒÑÅúÔÄ,3ÐèÖØÐ´,4:ÓâÆÚδ½»
|
if(status!=null){
|
Date nowTime = new Date();
|
if(status==0){
|
hql.append(" and startTime<=? and endTime>? and (completeStatus=? or completeStatus is null)");
|
params.add(nowTime);
|
params.add(nowTime);
|
params.add(ExerciseCompleteInfo.STATUS_DRAFT);
|
}else if (status==1){
|
hql.append(" and completeStatus=? ");
|
params.add(ExerciseCompleteInfo.STATUS_COMMIT);
|
}else if (status==2){
|
hql.append(" and completeStatus=? ");
|
params.add(ExerciseCompleteInfo.STATUS_CHECKED);
|
}else if (status==3){
|
hql.append(" and completeStatus=? ");
|
params.add(ExerciseCompleteInfo.STATUS_REDO);
|
}else if (status==4){
|
hql.append(" and endTime<=? and (completeStatus=? or completeStatus is null)");
|
params.add(nowTime);
|
params.add(ExerciseCompleteInfo.STATUS_DRAFT);
|
}
|
}
|
|
hql.append(" order by startTime desc");
|
|
return this.findList(hql.toString(),new Pager(pageSize, pageNum),params, ExerciseResultV.class);
|
}
|
|
@Override
|
public int queryStuExerciseListCount(String keyword,String exerciseInfoId,String userId,String subjectId,Short status) {
|
StringBuffer hql = new StringBuffer(500);
|
hql.append("from ExerciseResultV where exerciseStatus=?");
|
List<Object> params = CollectionUtils.newList(ExerciseInfo.EXERCISE_STATUS_PUBLISHED);
|
|
if(!StringUtils.isEmpty(userId)){
|
hql.append(" and userId=? ");
|
params.add(userId);
|
}
|
|
if(!StringUtils.isEmpty(exerciseInfoId)){
|
hql.append(" and id.exerciseInfoId=?");
|
params.add(exerciseInfoId);
|
}
|
|
if(!StringUtils.isEmpty(keyword)){
|
hql.append(" and studentName like ?");
|
params.add("%" + keyword.trim() + "%");
|
}
|
|
if(!StringUtils.isEmpty(subjectId)){
|
hql.append(" and subjectId=?");
|
params.add(subjectId);
|
}
|
|
//ĬÈÏÈ«²¿£¬0´ýÍê³É£¬1ÒÑÌá½» ,2:ÒÑÅúÔÄ,3ÐèÖØÐ´,4:ÓâÆÚδ½»
|
if(status!=null){
|
Date nowTime = new Date();
|
if(status==0){
|
hql.append(" and startTime<=? and endTime>? and (completeStatus=? or completeStatus is null)");
|
params.add(nowTime);
|
params.add(nowTime);
|
params.add(ExerciseCompleteInfo.STATUS_DRAFT);
|
}else if (status==1){
|
hql.append(" and completeStatus=? ");
|
params.add(ExerciseCompleteInfo.STATUS_COMMIT);
|
}else if (status==2){
|
hql.append(" and completeStatus=? ");
|
params.add(ExerciseCompleteInfo.STATUS_CHECKED);
|
}else if (status==3){
|
hql.append(" and completeStatus=? ");
|
params.add(ExerciseCompleteInfo.STATUS_REDO);
|
}else if (status==4){
|
hql.append(" and endTime<=? and (completeStatus=? or completeStatus is null)");
|
params.add(nowTime);
|
params.add(ExerciseCompleteInfo.STATUS_DRAFT);
|
}
|
}
|
|
return this.findCount(hql.toString(), params);
|
}
|
|
/**
|
* ³õʼ»¯Æ½¾ù³É¼¨ºÍ×î¸ß³É¼¨
|
*
|
* @param groupId
|
* @return
|
*/
|
@Override
|
public Map<String, Object> initScore(String exerciseInfoId) {
|
ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId);
|
Map<String, Object> map = new HashMap<String, Object>(1);
|
map.put("groupName", exerciseInfo.getName());
|
return map;
|
}
|
|
/**
|
* ÌâÄ¿µÃ·ÖÏêÇé
|
*
|
* @param groupId
|
* @return
|
*/
|
@Override
|
public List<ExerciseItemStatistics> itemDetailList(String examId) {
|
String hql_itemStatis = "from ExerciseItemStatistics where deleteFlag is false and groupId in "
|
+ "( select c.groupId from ExerciseExamReGroup c where c.examId = ? and c.type = ? and c.deleteFlag is false )";
|
List<ExerciseItemStatistics> itemStatisLst = this.find(hql_itemStatis,
|
CollectionUtils.newList(examId, ExerciseExamReGroup.GROUP_TYPE_EXAM), ExerciseItemStatistics.class);
|
|
if (itemStatisLst.isEmpty()) {
|
return new ArrayList<ExerciseItemStatistics>();
|
}
|
|
// ĬÈÏÕ½ÚÁ·Ï°
|
String hql = "select item from ExerciseItem item,ExerciseGroupItemRe re where re.exerciseGroupId in("
|
+ " select c.groupId from ExerciseExamReGroup c where c.examId = ? and c.type = ? and c.deleteFlag is false)"
|
+ "and re.exerciseItemId=item.exerciseId and item.deleteFlag is false "
|
+ "and re.deleteFlag is false order by re.itemOrder ";
|
|
// ²éѯµ±Ç°×éµÄËùÓÐÌâÄ¿
|
List<ExerciseItem> itemAllLst = this.find(hql,
|
CollectionUtils.newList(examId, ExerciseExamReGroup.GROUP_TYPE_EXAM), ExerciseItem.class);
|
|
if (itemAllLst.isEmpty()) {
|
return new ArrayList<ExerciseItemStatistics>();
|
}
|
|
// ͬ²½±àºÅ
|
List<ExerciseItemStatistics> listResult = new ArrayList<ExerciseItemStatistics>(itemStatisLst.size());
|
ExerciseItemStatistics obj = null;
|
for (int j = 0; j < itemAllLst.size(); j++) {
|
for (int i = 0; i < itemStatisLst.size(); i++) {
|
obj = itemStatisLst.get(i);
|
if (obj.getExerciseItemId().equals(itemAllLst.get(j).getExerciseId())) {
|
|
obj.setItemNo(j + 1);
|
obj.setClassAccuracyShow(obj.getClassAccuracy() + "%");
|
obj.setOrgAccuracyShow(obj.getOrgAccuracy() + "%");
|
|
// ¸øÀàÐ͸³Öµ
|
setExerItemTypeNewName(obj);
|
listResult.add(obj);
|
break;
|
}
|
}
|
}
|
|
return listResult;
|
}
|
|
private void setExerItemTypeNewName(ExerciseItemStatistics obj) {
|
// ÅжÏÀàÐÍÎÄ×ÖÏÔʾ
|
if (obj.getExerciseItemType() == ExerciseItem.TYPE_SINGLE_SELECT) {
|
obj.setItemTypeName("µ¥Ñ¡Ìâ");
|
} else if (obj.getExerciseItemType() == ExerciseItem.TYPE_MULTI_SELECT) {
|
obj.setItemTypeName("¶àÑ¡Ìâ");
|
} else if (obj.getExerciseItemType() == ExerciseItem.TYPE_TRUE_OR_FALSE) {
|
obj.setItemTypeName("ÅжÏÌâ");
|
} else if (obj.getExerciseItemType() == ExerciseItem.TYPE_ESSAY_QUESTION) {
|
obj.setItemTypeName("ÎÊ´ðÌâ");
|
}
|
}
|
|
/**
|
* ¿ªÊ¼ÌâÄ¿×÷Òµ
|
*
|
* @param examId
|
* @return
|
*/
|
public Result doStartExerciseInfo(String exerciseInfoId, String classId, String studentUserId) {
|
ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId);
|
ClsClass clsClass = this.read(ClsClass.class, classId);
|
return exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_ANSWER?
|
this.doStartAnswerExercise(exerciseInfo, clsClass, studentUserId)
|
:
|
this.doStartOtherExercise(exerciseInfo, clsClass, studentUserId);
|
|
}
|
|
/**
|
* ¿ªÊ¼ÌâÄ¿×÷Òµ
|
*
|
* @param examId
|
* @return
|
*/
|
private Result doStartAnswerExercise(ExerciseInfo exerciseInfo, ClsClass clsClass, String studentUserId) {
|
Result result = new Result(true);
|
// ÕýÔÚ×öÌâÊý
|
ExerciseRecord record = this.findUnique(
|
"select r from ExerciseRecord r where r.deleteFlag is false and r.userId = ? and r.exerciseGroupId in"
|
+ " (select g.groupId from ExerciseExamReGroup g where g.examId = ? and g.deleteFlag is false and g.type = ?)",
|
CollectionUtils.newList(StringUtils.isNotEmpty(studentUserId) ? studentUserId : ClientUtils.getUserId(),
|
exerciseInfo.getExerciseInfoId(), ExerciseExamReGroup.GROUP_TYPE_EXAM),ExerciseRecord.class);
|
|
if (record == null) {
|
// »ñÈ¡·Ö×éÁ·Ï°
|
String groupId = this.findUnique(
|
"select g.groupId from ExerciseExamReGroup g where g.examId = ? and g.deleteFlag is false and g.type = ?",
|
CollectionUtils.newList(exerciseInfo.getExerciseInfoId(), ExerciseExamReGroup.GROUP_TYPE_EXAM),
|
String.class);
|
|
if (StringUtils.isEmpty(groupId)) {
|
return new Result(false, "¿ªÊ¼×÷Òµ»ñÈ¡ÌâĿʧ°Ü");
|
}
|
|
Map<String, Object> recordResult = this.insertExerRecord(exerciseInfo,groupId);
|
|
// Éú³É×öÌâ¼Ç¼
|
record = (ExerciseRecord) recordResult.get("record");
|
}
|
|
// »ñÈ¡½á¹û
|
ExerItemResponseData responseData = exerciseVerService.queryExerItemResponseData(record.getExerciseGroupId(),
|
record.getRecordId(), true, true, ExerciseGroup.TYPE_EXERCISE_EXAM_ITEM);
|
responseData.setExerciseRecordId(record.getRecordId());
|
responseData.setExerciseGroupId(record.getExerciseGroupId());
|
responseData.setStatus(record.getStatus());
|
result.addData("exerItem", responseData);
|
|
// Èç¹ûÒÑÌá½»¾Í²éѯÓû§´ð°¸ÐÅÏ¢
|
// if (Integer.valueOf(record.getStatus()) > 0) {
|
result.addData("userAnswers", this.findListWithMapByHql(
|
"select u.answerUId as answerUId, u.exerciseItemId as exerciseId,u.answer as answer,u.correct as correct,i.type as type,u.teacherScore as teacherScore"
|
+ " from ExerciseItemAnswerU u,ExerciseItem i where u.exerciseItemId = i.exerciseId and u.exerciseRecordId=:recordId and u.deleteFlag is false order by u.createTime asc ",
|
CollectionUtils.newObjectMap("recordId", record.getRecordId())));
|
|
// ²éѯѧÉú¿¼ÊÔ×Ü·Ö
|
result.addData("studentScore", record.getScore());
|
result.addData("objStudentScore", record.getObjScore()==null?BigDecimal.ZERO:record.getObjScore());
|
|
ExerciseCompleteInfo completeInfo = doGetOrCreateExerciseCompleteInfo(exerciseInfo.getExerciseInfoId(),clsClass.getClassId() , studentUserId);
|
|
if(completeInfo!=null){
|
result.addData("exerciseCompleteId", completeInfo.getExerciseCompleteId());
|
}
|
|
result.addData("itemSet", exerciseInfo.getExerciseItemSets());
|
|
return result;
|
}
|
|
private ExerciseCompleteInfo doGetOrCreateExerciseCompleteInfo(String exerciseInfoId,String classId,String studentUserId){
|
// ÅжÏÊÇ·ñÒѾ³õʼ»¯
|
ExerciseCompleteInfo completeInfo = exerciseCompleteService.queryCompleteInfo(exerciseInfoId,classId , studentUserId);
|
|
if(completeInfo==null){
|
String hql = " select s.studentId as studentId,s.studentNo as studentNo,s.userId as studentUserId,s.name as studentName,"
|
+ " c.classId as classId,c.name as className from StuStudent s ,ClsClass c,ExerciseExamReClass r "
|
+ " where r.examId=:exerciseInfoId and r.classId =c.classId and c.classId= s.classId and s.userId=:userId"
|
+ " and s.classId=:classId and r.examId=:exerciseInfoId and r.deleteFlag is false and s.deleteFlag is false and c.deleteFlag is false";
|
|
List<Map<String, Object>> resultMap = this.findListWithMapByHql(hql,
|
CollectionUtils.newObjectMap("userId",studentUserId,"classId",classId,"exerciseInfoId",exerciseInfoId));
|
|
if(resultMap!=null && resultMap.get(0)!=null){
|
Map<String, Object> map = resultMap.get(0);
|
|
completeInfo = new ExerciseCompleteInfo();
|
TraceUtils.setCreateTrace(completeInfo);
|
completeInfo.setStudentId((String) map.get("studentId"));
|
completeInfo.setStudentNo((String) map.get("studentNo"));
|
completeInfo.setStudentUserId((String) map.get("studentUserId"));
|
completeInfo.setStudentUserName((String) map.get("studentName"));
|
completeInfo.setClassId((String) map.get("classId"));
|
completeInfo.setClassName((String) map.get("className"));
|
completeInfo.setExerciseInfoId(exerciseInfoId);
|
completeInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_DRAFT);
|
this.save(completeInfo);
|
}
|
}
|
|
return completeInfo;
|
}
|
|
private Map<String,Object> insertExerRecord(ExerciseInfo exerciseInfo,String groupId) {
|
ExerciseRecord record = new ExerciseRecord();
|
record.setDeleteFlag(false);
|
record.setExerciseGroupId(groupId);
|
record.setDoCount(BigInteger.ZERO);
|
record.setCorrectCount(BigInteger.ZERO);
|
record.setTitleMaxNumber("0");
|
record.setStatus("0");
|
record.setScore(BigDecimal.ZERO);
|
record.setUserId(ClientUtils.getUserId());
|
record.setOrgId(ClientUtils.getOrgId());
|
TraceUtils.setCreateTrace(record);
|
|
//»ñÈ¡¿¼ÊÔÌâĿͳ¼ÆÐÅÏ¢£¬²¢±£´æ
|
Map<String,Object> result = this.queryItemStatics(exerciseInfo.getExerciseItemSets());
|
record.setTotalScore(new BigDecimal(exerciseInfo.getScore()));
|
record.setPassingScore(exerciseInfo.getPassingScore());
|
record.setSubTotalScore((BigDecimal)result.get("subTotalScore"));
|
record.setObjTotalScore((BigDecimal)result.get("objTotalScore"));
|
record.setSubItemCount((int)result.get("subItemCount"));
|
record.setObjItemCount((int)result.get("objItemCount"));
|
|
TraceUtils.setCreateTrace(record);
|
this.save(record);
|
|
Map<String,Object> resultMap = new HashMap<String, Object>(3);
|
resultMap.put("exerciseRecordId", record.getRecordId());
|
resultMap.put("updateTime", DateTimeUtils.getCurrDateTime(record.getUpdateTime()));
|
resultMap.put("exerciseGroupId", groupId);
|
resultMap.put("record", record);
|
|
return resultMap;
|
}
|
|
private Map<String,Object> queryItemStatics(List<ExerciseItemSet> itemSets){
|
float subTotalScore = 0,objTotalScore=0;
|
int subItemCount=0,objItemCount=0;
|
|
//Èç¹ûÊÇËæ»ú×é¾í
|
if(itemSets!=null && itemSets.size()>0){
|
for(ExerciseItemSet s:itemSets){
|
if(s.getItemType()==ExerciseItem.TYPE_ESSAY_QUESTION){
|
subTotalScore+= s.getItemCount()*s.getRightScore();
|
subItemCount+=s.getItemCount();
|
}else{
|
objTotalScore += s.getItemCount()*s.getRightScore();
|
objItemCount += s.getItemCount();
|
}
|
}
|
}
|
|
Map<String,Object> result = new HashMap<String,Object>();
|
result.put("subTotalScore", new BigDecimal(subTotalScore));
|
result.put("objTotalScore", new BigDecimal(objTotalScore));
|
result.put("subItemCount", subItemCount);
|
result.put("objItemCount", objItemCount);
|
|
return result;
|
}
|
|
/**
|
* ¿ªÊ¼ÎļþºÍд×÷×÷Òµ
|
*
|
* @param examId
|
* @return
|
*/
|
private Result doStartOtherExercise(ExerciseInfo exerciseInfo, ClsClass clsClass, String studentUserId) {
|
// ²éѯÊÇ·ñÒѾ´æÔÚ×öÌâ¼Ç¼£¬Èç¹û²»´æÔÚÐèҪн¨
|
ExerciseCompleteInfo exerciseCompleteInfo = exerciseCompleteService.doCheckAndCreateExerciseCompleteInfo(
|
exerciseInfo.getExerciseInfoId(), clsClass.getClassId(), studentUserId);
|
|
exerciseCompleteInfo.setCommitUploadType(exerciseInfo.getCommitUploadType());
|
exerciseCompleteInfo.setRemind(exerciseInfo.getRemind());
|
exerciseCompleteInfo.setExerciseType(exerciseInfo.getType());
|
exerciseCompleteInfo.setExerciseName(exerciseInfo.getName());
|
exerciseCompleteInfo.setContent(exerciseCompleteInfo.getUploadDesc());
|
|
if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_VIDEO
|
|| exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) {
|
if (StringUtils.isNotEmpty(exerciseCompleteInfo.getTargetObjectId())) {
|
MediaVideo video = this.read(MediaVideo.class, exerciseCompleteInfo.getTargetObjectId());
|
if (video.getStatus() == MediaVideo.STATUS_DRAFT) {
|
exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_OK);
|
exerciseCompleteInfo
|
.setPreviewPath(StringUtils.isNotEmpty(video.getAndroidHD()) ? video.getAndroidHD()
|
: StringUtils.isNotEmpty(video.getAndroidSD()) ? video.getAndroidSD()
|
: video.getAndroidLD());
|
} else {
|
exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_NO);
|
}
|
}
|
}
|
|
if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_DOC) {
|
if (StringUtils.isNotEmpty(exerciseCompleteInfo.getTargetObjectId())) {
|
SchHandout handout = this.read(SchHandout.class, exerciseCompleteInfo.getTargetObjectId());
|
if (handout.getStatus() == SchHandout.STATUS_DRAFT) {
|
exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_OK);
|
exerciseCompleteInfo.setPreviewPath(handout.getFullPath());
|
} else {
|
exerciseCompleteInfo.setTransStatus(ExerciseCompleteInfo.PREVIEW_STATUS_NO);
|
}
|
}
|
}
|
|
if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_WRITING && StringUtils.isNotEmpty(exerciseCompleteInfo.getTargetObjectId())) {
|
exerciseCompleteInfo.setContent(this.orgTextService
|
.getOrgText(exerciseCompleteInfo.getExerciseCompleteId(), OrgText.TABLE_WRITING_EXERCISE)
|
.getContent());
|
}
|
|
exerciseCompleteInfo.setTotalScore(exerciseInfo.getScore());
|
|
return new Result(true,"",CollectionUtils.newObjectMap("exerciseCompleteInfo", exerciseCompleteInfo));
|
}
|
|
@Override
|
public Result doSubmitOtherExerciseInfo(String exerciseCompleteInfoId, String content, String fileId,
|
String filePath, short submitType) {
|
Result result = new Result(true);
|
ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId);
|
ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseCompleteInfo.getExerciseInfoId());
|
|
if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_WRITING) {
|
result = this.doSubmitWritingExerciseInfo(exerciseCompleteInfoId, content, submitType);
|
} else if (exerciseInfo.getType() == ExerciseInfo.EXERCISE_TYPE_FILE) {
|
result = this.doSubmitFileExerciseInfo(exerciseCompleteInfoId, content, fileId, filePath, submitType);
|
}
|
|
return result;
|
}
|
|
/**
|
* Ìύд×÷×÷Òµ
|
*
|
* @param exerciseInfoId
|
* @param content
|
* @param submitType
|
* @return
|
*/
|
private Result doSubmitWritingExerciseInfo(String exerciseCompleteInfoId, String content, short submitType) {
|
ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId);
|
// ±£´æµ½orgtext
|
if (StringUtils.isEmpty(exerciseCompleteInfo.getTargetObjectId())) {
|
Result result = orgTextService.doInsertOrgText(exerciseCompleteInfoId, OrgText.TABLE_WRITING_EXERCISE, content);
|
exerciseCompleteInfo.setTargetObjectId((String)result.getData("orgTextId"));
|
} else {
|
OrgText orgText = orgTextService.getOrgText(exerciseCompleteInfoId, OrgText.TABLE_WRITING_EXERCISE);
|
orgText.setContent(content);
|
this.save(orgText);
|
}
|
|
if (submitType > 0) {
|
exerciseCompleteInfo.setSubmitTime(new Date());
|
exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_COMMIT);
|
}
|
|
this.save(exerciseCompleteInfo);
|
return new Result(true);
|
}
|
|
/**
|
* Ìá½»Îļþ×÷Òµ
|
*
|
* @param exerciseCompleteInfoId
|
* @param content
|
* @param fileId
|
* @param filePath
|
* @param submitType
|
* @return
|
*/
|
private Result doSubmitFileExerciseInfo(String exerciseCompleteInfoId, String content, String fileId,
|
String filePath, short submitType) {
|
ExerciseCompleteInfo exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteInfoId);
|
ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseCompleteInfo.getExerciseInfoId());
|
|
String targetObjectId = null;
|
|
if (submitType > 0) {
|
exerciseCompleteInfo.setSubmitTime(new Date());
|
exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_COMMIT);
|
}
|
TraceUtils.setUpdateTrace(exerciseCompleteInfo);
|
|
if (StringUtils.isNotEmpty(fileId)) {
|
ResFile resFile = this.read(ResFile.class, fileId);
|
exerciseCompleteInfo.setFileId(fileId);
|
exerciseCompleteInfo.setFilePath(filePath);
|
exerciseCompleteInfo.setOrgiFileName(resFile.getFileName());
|
}
|
|
exerciseCompleteInfo.setUploadDesc(content);
|
|
// ÅжÏ×÷ÒµÌá½»ÀàÐÍ£¬²»Í¬Ìá½»ÀàÐͱ£´æµ½²»Í¬µØ·½
|
if (StringUtils.isNotEmpty(fileId)) {
|
String fileType = filePath.substring(filePath.lastIndexOf("."));
|
String fileName = filePath.substring(filePath.lastIndexOf("/"));
|
|
if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_VIDEO
|
|| exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) {
|
if (!exerciseCompleteInfo.getFilePath().equals("filePath")) {
|
MediaVideo mediaVideo = new MediaVideo();
|
TraceUtils.setCreateTrace(mediaVideo);
|
mediaVideo.setUrl(filePath);
|
mediaVideo.setOrigUrl(filePath);
|
mediaVideo.setName(fileName);
|
mediaVideo.setFormat(fileType);
|
if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_VIDEO) {
|
mediaVideo.setType(MediaVideo.MEDIA_VIDEO);
|
} else if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) {
|
mediaVideo.setType(MediaVideo.MEDIA_AUDIO);
|
}
|
if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_AUDIO) {
|
mediaVideo.setStatus(MediaVideo.STATUS_DRAFT);
|
} else {
|
mediaVideo.setStatus(MediaVideo.STATUS_LINEUP);
|
}
|
this.save(mediaVideo);
|
targetObjectId = mediaVideo.getVideoId();
|
mediaVideoService.insertVideoConverTask(mediaVideo);
|
}
|
|
} else if (exerciseInfo.getCommitUploadType() == ExerciseInfo.EXERCISE_FILE_COMMIT_DOC) {
|
if (!exerciseCompleteInfo.getFilePath().equals("filePath")) {
|
SchHandout handout = new SchHandout();
|
handout.setClassId(exerciseCompleteInfo.getClassId());
|
handout.setName(fileName);
|
handout.setStatus(SchHandout.STATUS_PROCESSING);
|
handout.setFullPath(filePath);
|
handout.setOrigPath(filePath);
|
TraceUtils.setCreateTrace(handout);
|
this.save(handout);
|
targetObjectId = handout.getHandoutId();
|
|
if (!"PDF".equals(fileType.toUpperCase())) {
|
// Ìí¼Óµ½½²ÒåתÂë¶ÓÁбí
|
HandoutConverTask task = new HandoutConverTask();
|
task.setCreateTime(new Date(System.currentTimeMillis()));
|
task.setUpdateTime(new Date(System.currentTimeMillis()));
|
task.setDeleteFlag(false);
|
task.setHandoutId(handout.getHandoutId());
|
task.setHandoutUrl(filePath);
|
task.setStatus(0);
|
this.save(task);
|
}
|
}
|
}
|
}
|
|
if (StringUtils.isNotEmpty(targetObjectId)) {
|
exerciseCompleteInfo.setTargetObjectId(targetObjectId);
|
}
|
this.save(exerciseCompleteInfo);
|
|
return new Result(true);
|
}
|
|
@Override
|
public Result doSubmitAnswerExerciseInfo(ExerciseSubmitAnswerData answerData, String exerciseInfoId, String exerciseCompleteId) {
|
Result result = new Result(true);
|
|
// Óû§±¾´Î×öÌâÌá½»µÄÊý¾Ý
|
List<ExerciseItemAnswerData> lstAnswers = null;
|
String initRecordId = null;
|
ExerciseCompleteInfo exerciseCompleteInfo = null;
|
ExerciseInfo exerciseInfo = this.read(ExerciseInfo.class, exerciseInfoId);
|
|
try {
|
// Ìá½»¼Ç¼id
|
initRecordId = answerData.getExerciseRecordId();
|
lstAnswers = answerData.getItems();
|
|
if (lstAnswers.isEmpty() && !ExerciseRecord.STATUS_SUBMIT.equals(answerData.getStatus())) {
|
exerciseVerService.doSaveExerciseDataSubmitLog(JSON.toJSONString(answerData), initRecordId,
|
ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_FAILED,
|
"/exercise/Exercise/exerAnswers");
|
|
return new Result(false, "Ìá½»Êý¾ÝÒì³£");
|
}
|
|
ExerciseRecord record = this.read(ExerciseRecord.class, initRecordId);
|
|
//¼ÆËãµÃ·Ö
|
double studentScore = this.doCalculateExerciseScores(answerData, exerciseInfo.getExerciseItemSets());
|
|
// Ìá½»ÊÔ¾í´ð°¸
|
answerData.setScore(new BigDecimal(studentScore));
|
Map<String, Object> resultMap = exerciseVerService.doOperExerciseAnswerData(answerData);
|
|
// ¸üе÷ּǼ¼°×´Ì¬
|
exerciseCompleteInfo = this.read(ExerciseCompleteInfo.class, exerciseCompleteId);
|
resultMap.put("studentScore", studentScore);
|
|
|
// ¸üÐÂÍê³ÉµÃ·Ö
|
if (ExerciseRecord.STATUS_SUBMIT.equals(answerData.getStatus())) {
|
resultMap.put("objScore", studentScore);
|
exerciseCompleteInfo.setSubmitTime(new Date());
|
|
if(record.getSubItemCount()==0){
|
exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_CHECKED);
|
}else{
|
exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_COMMIT);
|
}
|
|
this.bulkUpdate(
|
"update ExerciseRecord set status=1 , score=" + studentScore + ",objScore=" + studentScore
|
+ " where deleteFlag is false and recordId=?",
|
new Object[] { resultMap.get("recordId") });
|
}if (ExerciseRecord.STATUS_CHECK.equals(answerData.getStatus())) {
|
exerciseCompleteInfo.setSubmitTime(new Date());
|
exerciseCompleteInfo.setCompleteStatus(ExerciseCompleteInfo.STATUS_CHECKED);
|
this.bulkUpdate(
|
"update ExerciseRecord set status=3 , score=" + studentScore + ",objScore=" + studentScore
|
+ " where deleteFlag is false and recordId=?",
|
new Object[] { resultMap.get("recordId") });
|
} else {
|
this.bulkUpdate(
|
"update ExerciseRecord set score=" + studentScore+ ",objScore=" + studentScore
|
+ " where deleteFlag is false and recordId=? ",
|
new Object[] { resultMap.get("recordId") });
|
}
|
exerciseCompleteInfo.setStudentScore(new BigDecimal(studentScore));
|
|
this.save(exerciseCompleteInfo);
|
|
// ¼Ç¼Ìá½»µÄÊý¾ÝÈÕÖ¾
|
exerciseVerService.doSaveExerciseDataSubmitLog(JSON.toJSONString(answerData), initRecordId,
|
ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_SUCCESS,
|
"/exercise/Exercise/exerAnswers");
|
|
result = new Result(true, "´ð°¸Ìá½»³É¹¦");
|
result.setData(resultMap);
|
|
} catch (Exception e) {
|
log.error("¿¼ÊÔ±£´æ´íÎó", e);
|
|
result = new Result(false, "Ìá½»Á·Ï°´ð°¸ÇëÇóÒì³£");
|
|
exerciseVerService.doSaveExerciseDataSubmitLog(JSON.toJSONString(answerData), initRecordId,
|
ExerciseDataSubmitLog.TYPE_SUBMIT_ANSWER, ExerciseDataSubmitLog.STATUS_FAILED,
|
"/exercise/Exercise/exerAnswers");
|
}
|
|
return result;
|
}
|
|
private double doCalculateExerciseScores(ExerciseSubmitAnswerData answerData, List<ExerciseItemSet> lstItemSet) {
|
//»ñÈ¡Ìî¿ÕÌâ´ð°¸ÐÅÏ¢
|
Map<String,String> exerciseFillItemMap= null;
|
List<Object[]> lstObj = this.find("select i.exerciseId,i.answer from ExerciseGroupItemRe r, ExerciseItem i where r.exerciseItemId=i.exerciseId and r.exerciseGroupId=? and r.deleteFlag is false and i.type=? and i.deleteFlag is false",
|
CollectionUtils.newList(answerData.getExerciseGroupId(),ExerciseItem.TYPE_FILL_BLANKS), Object[].class);
|
if(lstObj!=null && lstObj.size()>0){
|
exerciseFillItemMap = new HashMap<String,String>(lstObj.size());
|
for(Object[] arrObj : lstObj){
|
exerciseFillItemMap.put((String)arrObj[0],(String)arrObj[1]);
|
}
|
}
|
|
Map<String, Double> scoreMap = new HashMap<String, Double>();
|
for (int i = 0; i < lstItemSet.size(); i++) {
|
if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_SINGLE_SELECT) {
|
scoreMap.put("single_right", lstItemSet.get(i).getRightScore());
|
scoreMap.put("single_wrong", lstItemSet.get(i).getWrongScore());
|
scoreMap.put("single_noanswer", lstItemSet.get(i).getBlankScore());
|
} else if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_MULTI_SELECT) {
|
scoreMap.put("multi_right", lstItemSet.get(i).getRightScore());
|
scoreMap.put("multi_wrong", lstItemSet.get(i).getWrongScore());
|
scoreMap.put("multi_noanswer", lstItemSet.get(i).getBlankScore());
|
} else if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_TRUE_OR_FALSE) {
|
scoreMap.put("judge_right", lstItemSet.get(i).getRightScore());
|
scoreMap.put("judge_wrong", lstItemSet.get(i).getWrongScore());
|
scoreMap.put("judeg_noanswer", lstItemSet.get(i).getBlankScore());
|
}else if (lstItemSet.get(i).getItemType() == ExerciseItem.TYPE_FILL_BLANKS) {
|
scoreMap.put("fill_right", lstItemSet.get(i).getRightScore());
|
scoreMap.put("fill_wrong", lstItemSet.get(i).getWrongScore());
|
scoreMap.put("fill_noanswer", lstItemSet.get(i).getBlankScore());
|
}
|
}
|
double totalScore = 0.00;
|
String tempRightAnswer =null;
|
BigDecimal tempScore = BigDecimal.ZERO;
|
if (answerData.getItems() != null && answerData.getItems().size() > 0) {
|
for (ExerciseItemAnswerData data : answerData.getItems()) {
|
if (Integer.valueOf(data.getCorrect()) > 0) {
|
if (data.getType() == ExerciseItem.TYPE_SINGLE_SELECT) {
|
totalScore += scoreMap.get("single_right");
|
} else if (data.getType() == ExerciseItem.TYPE_MULTI_SELECT) {
|
totalScore += scoreMap.get("multi_right");
|
} else if (data.getType() == ExerciseItem.TYPE_TRUE_OR_FALSE) {
|
totalScore += scoreMap.get("judge_right");
|
}else if (data.getType() == ExerciseItem.TYPE_FILL_BLANKS) {
|
if(exerciseFillItemMap!=null && exerciseFillItemMap.size()>0){
|
tempRightAnswer = exerciseFillItemMap.get(data.getExerciseId());
|
}
|
tempScore = this.exerciseVerService.calFillBlanksItemScore(tempRightAnswer,data.getAnswer(), scoreMap.get("fill_right").floatValue());
|
data.setTeacherScore(tempScore.toPlainString());
|
totalScore += tempScore.doubleValue();
|
}else if (data.getType() == ExerciseItem.TYPE_ESSAY_QUESTION) {
|
if(StringUtils.isNotEmpty(data.getTeacherScore())){
|
tempScore = new BigDecimal(data.getTeacherScore());
|
}else{
|
tempScore = BigDecimal.ZERO;
|
}
|
totalScore += tempScore.doubleValue();
|
}
|
} else {
|
if (data.getType() == ExerciseItem.TYPE_SINGLE_SELECT) {
|
totalScore += scoreMap.get("single_wrong");
|
} else if (data.getType() == ExerciseItem.TYPE_MULTI_SELECT) {
|
totalScore += scoreMap.get("multi_wrong");
|
} else if (data.getType() == ExerciseItem.TYPE_TRUE_OR_FALSE) {
|
totalScore += scoreMap.get("judge_wrong");
|
}else if (data.getType() == ExerciseItem.TYPE_FILL_BLANKS) {
|
if(exerciseFillItemMap!=null && exerciseFillItemMap.size()>0){
|
tempRightAnswer = exerciseFillItemMap.get(data.getExerciseId());
|
}
|
tempScore = this.exerciseVerService.calFillBlanksItemScore(tempRightAnswer,data.getAnswer(), scoreMap.get("fill_right").floatValue());
|
data.setTeacherScore(tempScore.toPlainString());
|
totalScore += tempScore.doubleValue();
|
}else if (data.getType() == ExerciseItem.TYPE_ESSAY_QUESTION) {
|
if(StringUtils.isNotEmpty(data.getTeacherScore())){
|
tempScore = new BigDecimal(data.getTeacherScore());
|
}else{
|
tempScore = BigDecimal.ZERO;
|
}
|
totalScore += tempScore.doubleValue();
|
}
|
}
|
}
|
}
|
|
return totalScore;
|
}
|
|
@Override
|
public Result doPublishExercise(String[] exerciseIds) {
|
// ¸üÐÂ×÷ҵ״̬
|
this.bulkUpdateInLoop("update ExerciseInfo set status=" + ExerciseInfo.EXERCISE_STATUS_PUBLISHED + " WHERE exerciseInfoId=?",exerciseIds);
|
|
// ³õʼ»¯×÷ÒµÍê³É¼Ç¼
|
String hql = null;
|
List<Map<String, Object>> students = null;
|
ExerciseCompleteInfo temp = null;
|
List<ExerciseCompleteInfo> lstCompleteInfos = null;
|
for (String exerciseId : exerciseIds) {
|
// ÅжÏÊÇ·ñÒѾ³õʼ»¯£¬Èç¹ûÒѾ³õʼ»¯Ôò¼ÌÐø -> TODO:ÐèÒª´¦ÀíмÓÈë°à¼¶Ñ§Éú
|
int count = this.findCount("from ExerciseCompleteInfo f where f.deleteFlag is false and f.exerciseInfoId=?",CollectionUtils.newList(exerciseId));
|
|
if (count == 0) {
|
hql = " select s.studentId as studentId,s.studentNo as studentNo,s.userId as studentUserId,s.name as studentName,c.classId as classId,c.name as className "
|
+ " from StuStudent s ,ClsClass c,ExerciseExamReClass r where r.examId=:exerciseInfoId "
|
+ " and r.classId =c.classId and c.classId= s.classId and r.deleteFlag is false and s.deleteFlag is false";
|
|
students = this.findListWithMapByHql(hql, CollectionUtils.newObjectMap("exerciseInfoId", exerciseId));
|
if (students != null && students.size() > 0) {
|
lstCompleteInfos = new ArrayList<ExerciseCompleteInfo>();
|
for (Map<String, Object> obj : students) {
|
temp = new ExerciseCompleteInfo();
|
TraceUtils.setCreateTrace(temp);
|
temp.setStudentId((String) obj.get("studentId"));
|
temp.setStudentNo((String) obj.get("studentNo"));
|
temp.setStudentUserId((String) obj.get("studentUserId"));
|
temp.setStudentUserName((String) obj.get("studentName"));
|
temp.setClassId((String) obj.get("classId"));
|
temp.setClassName((String) obj.get("className"));
|
temp.setExerciseInfoId(exerciseId);
|
temp.setCompleteStatus(ExerciseCompleteInfo.STATUS_DRAFT);
|
lstCompleteInfos.add(temp);
|
}
|
this.saveOrUpdateAll(lstCompleteInfos);
|
}
|
}
|
|
//·¢²¼×÷ÒµÏûÏ¢
|
this.doExercisePublishMsg(exerciseId);
|
}
|
|
return new Result(true);
|
}
|
|
private void doExercisePublishMsg(String exerciseInfoId){
|
ExerciseInfo exerciseInfo= this.read(ExerciseInfo.class, exerciseInfoId);
|
|
List<String> lstUserIds = this.find("select userId from ExerciseResultV where id.exerciseInfoId=?",
|
CollectionUtils.newList(exerciseInfoId), String.class);
|
|
if(lstUserIds!=null && lstUserIds.size()>0){
|
Map<String,String> attrs = CollectionUtils.newStringMap("exerciseInfoId",exerciseInfoId,"exerciseName",exerciseInfo.getName(),
|
"subjectId",exerciseInfo.getSubjectId(),"subjectName",exerciseInfo.getSubject().getName());
|
|
msgInfoService.doSendTextMsgToUsers(lstUserIds.toArray(new String[lstUserIds.size()]),
|
MsgInfo.TYPE_EXERCISE," ·¢²¼ÁË×÷Òµ ", attrs);
|
}
|
}
|
|
@Override
|
public Result doRevokeExercise(String[] exerciseIds) {
|
// ¸üÐÂ×÷ҵ״̬
|
this.bulkUpdateInLoop("update ExerciseInfo set status=" + ExerciseInfo.EXERCISE_STATUS_DRAFT + " WHERE exerciseInfoId=?",exerciseIds);
|
// Çå³ý×÷ÒµÍê³ÉÇé¿ö
|
this.bulkUpdateInLoop("update ExerciseCompleteInfo set deleteFlag= true WHERE exerciseInfoId=?", exerciseIds);
|
|
return new Result(true);
|
}
|
|
/**
|
* »ñÈ¡ÓâÆÚδ½»µÄ×÷Òµ
|
*/
|
@Override
|
public int getUnCommitExerciseCount(String classId, String userId) {
|
String sql = "SELECT c.exercise_info_id, c. NAME, c.start_time, c.end_time, c.type,"
|
+ "c.score, d.student_score, d.complete_status, c.class_id, c.className "
|
+ "FROM ( SELECT f.exercise_info_id, f. NAME, f.start_time, f.end_time, "
|
+ "f.create_time, f.type, f.score, s.class_id, s.`NAME` AS className "
|
+ "FROM exercise_info f, exercise_exam_re_class r, cls_class s WHERE "
|
+ "r.exam_id = f.exercise_info_id AND r.class_id = s.class_id AND "
|
+ "r.class_id =:classId AND f. STATUS = 1 AND r.delete_flag = 0 AND "
|
+ "f.delete_flag = 0 ) c LEFT OUTER JOIN ( SELECT e.exercise_info_id,"
|
+ "e.student_score, e.complete_status, e.CLASS_ID FROM exercise_complete_info "
|
+ "e WHERE e.delete_flag IS FALSE AND e.student_user_id =:userId ) d ON "
|
+ "c.exercise_info_id = d.exercise_info_id AND c.class_id = d.class_id "
|
+ "where IFNULL(d.complete_status,0) = 0 and (c.end_Time - CURRENT_TIMESTAMP ()) < 0 ";
|
|
List<Object[]> list = findByComplexSql(sql, CollectionUtils.newObjectMap("classId", classId, "userId", userId),
|
Object[].class);
|
return list.size();
|
}
|
|
/**
|
* »ñÈ¡´ýÍê³ÉµÄ×÷Òµ
|
*/
|
@Override
|
public int getToBeCommitExerciseCount(String classId, String userId) {
|
String sql = "SELECT c.exercise_info_id, c. NAME, c.start_time, c.end_time, c.type,"
|
+ "c.score, d.student_score, d.complete_status, c.class_id, c.className "
|
+ "FROM ( SELECT f.exercise_info_id, f. NAME, f.start_time, f.end_time, "
|
+ "f.create_time, f.type, f.score, s.class_id, s.`NAME` AS className "
|
+ "FROM exercise_info f, exercise_exam_re_class r, cls_class s WHERE "
|
+ "r.exam_id = f.exercise_info_id AND r.class_id = s.class_id AND "
|
+ "r.class_id =:classId AND f. STATUS = 1 AND r.delete_flag = 0 AND "
|
+ "f.delete_flag = 0 ) c LEFT OUTER JOIN ( SELECT e.exercise_info_id,"
|
+ "e.student_score, e.complete_status, e.CLASS_ID FROM exercise_complete_info "
|
+ "e WHERE e.delete_flag IS FALSE AND e.student_user_id =:userId ) d ON "
|
+ "c.exercise_info_id = d.exercise_info_id AND c.class_id = d.class_id "
|
+ "where IFNULL(d.complete_status,0) = 0 and (c.end_Time - CURRENT_TIMESTAMP ()) > 0 ";
|
|
List<Object[]> list = findByComplexSql(sql, CollectionUtils.newObjectMap("classId", classId, "userId", userId),
|
Object[].class);
|
return list.size();
|
}
|
|
/**
|
* »ñÈ¡Íê³ÉµÄ×÷Òµ¸öÊý
|
*
|
* @param classId
|
* @param userId
|
* @return
|
*/
|
@Override
|
public int getCommitExerciseCount(String classId, String userId) {
|
String sql = "SELECT c.exercise_info_id, c. NAME, c.start_time, c.end_time, c.type,"
|
+ "c.score, d.student_score, d.complete_status, c.class_id, c.className "
|
+ "FROM ( SELECT f.exercise_info_id, f. NAME, f.start_time, f.end_time, "
|
+ "f.create_time, f.type, f.score, s.class_id, s.`NAME` AS className "
|
+ "FROM exercise_info f, exercise_exam_re_class r, cls_class s WHERE "
|
+ "r.exam_id = f.exercise_info_id AND r.class_id = s.class_id AND "
|
+ "r.class_id =:classId AND f. STATUS = 1 AND r.delete_flag = 0 AND "
|
+ "f.delete_flag = 0 ) c LEFT OUTER JOIN ( SELECT e.exercise_info_id,"
|
+ "e.student_score, e.complete_status, e.CLASS_ID FROM exercise_complete_info "
|
+ "e WHERE e.delete_flag IS FALSE AND e.student_user_id =:userId ) d ON "
|
+ "c.exercise_info_id = d.exercise_info_id AND c.class_id = d.class_id "
|
+ "where IFNULL(d.complete_status,0) > 0 ";
|
|
List<Object[]> list = findByComplexSql(sql, CollectionUtils.newObjectMap("classId", classId, "userId", userId),
|
Object[].class);
|
return list.size();
|
}
|
|
/**
|
* »ñÈ¡×÷Òµ×ÜÊý
|
*/
|
@Override
|
public int getExerciseCount(String classId, String userId) {
|
String hqlCount = "from ExerciseInfo i,ExerciseExamReClass r WHERE"
|
+ " r.examId=i.exerciseInfoId AND r.classId =:classId AND i.status=:status "
|
+ "AND i.deleteFlag is false AND r.deleteFlag is false";
|
int exerciseCount = findCountByComplexHql(hqlCount,
|
CollectionUtils.newObjectMap("classId", classId, "status", ExerciseInfo.EXERCISE_STATUS_PUBLISHED));
|
return exerciseCount;
|
}
|
|
/**
|
* ²éѯ×÷ÒµÁбí-½Ìʦ¶Ë
|
*
|
* @param pageSize
|
* @param keyword
|
* @param classId
|
* @param pageNum
|
* @return
|
*/
|
public List<Map<String, Object>> teacherExerciseInfoList(Integer pageSize,String keyword,String classId,Integer pageNum) {
|
QHomeworkScoreV qHomeworkScoreV = QHomeworkScoreV.homeworkScoreV;
|
QExerciseInfo qExerciseInfo = QExerciseInfo.exerciseInfo;
|
|
Expression<Integer> cases = new CaseBuilder()
|
.when(qHomeworkScoreV.completeStatus.isNull()).then(1)
|
.otherwise(0).sum().as("homeworkNoSubmitCount");
|
|
Expression<Integer> cases2 = new CaseBuilder()
|
.when(qHomeworkScoreV.completeStatus.eq(String.valueOf(ExerciseCompleteInfo.STATUS_CHECKED))).then(1)
|
.otherwise(0).sum().as("homeworkToAuditCount");
|
|
Expression<Integer> cases3 = new CaseBuilder()
|
.when(qHomeworkScoreV.completeStatus.eq(String.valueOf(ExerciseCompleteInfo.STATUS_COMMIT))).then(1)
|
.otherwise(0).sum().as("homeworkHasAuditCount");
|
|
return this.getQueryFactory().select(cases,cases2,cases3, qExerciseInfo.name.max(),
|
qExerciseInfo.startTime.max(), qExerciseInfo.endTime.max(), qExerciseInfo.type.max()).from(qHomeworkScoreV, qExerciseInfo)
|
.where(qHomeworkScoreV.classId.eq(classId)
|
.and(qHomeworkScoreV.id.homeworkId.eq(qExerciseInfo.exerciseInfoId))
|
.and(qExerciseInfo.deleteFlag.isFalse()))
|
.groupBy(qHomeworkScoreV.id.homeworkId)
|
.orderBy(qExerciseInfo.createTime.desc())
|
.fetch().stream().map(tuple -> {
|
Map<String, Object> map = new HashMap<String, Object>();
|
map.put("name", tuple.get(3, String.class));
|
map.put("startTime", tuple.get(4, String.class));
|
map.put("endTime", tuple.get(5, String.class));
|
map.put("type", tuple.get(6, Integer.class));
|
map.put("homeworkNoSubmitCount", tuple.get(0, Integer.class));
|
map.put("homeworkToAuditCount", tuple.get(1, Integer.class));
|
map.put("homeworkHasAuditCount", tuple.get(2, Integer.class));
|
return map;
|
}).collect(Collectors.toList());
|
}
|
|
@Override
|
public Map<String,Integer> queryResultStatusCount(List<String> lstExerciseIds) {
|
if(lstExerciseIds== null || lstExerciseIds.size()==0){
|
return null;
|
}
|
|
String hql = "select id.exerciseInfoId||'-'||completeStatus ,count(1) from ExerciseResultV "
|
+ "where id.exerciseInfoId in(:exerciseIds) group by id.exerciseInfoId,completeStatus";
|
|
List<Object[]> lstResult = this.findByComplexHql(hql,
|
CollectionUtils.newObjectMap("exerciseIds",lstExerciseIds.toArray(new String[lstExerciseIds.size()])), Object[].class);
|
|
Map<String,Integer> resultMap = new HashMap<String,Integer>(lstResult.size());
|
|
for(Object[] o:lstResult){
|
resultMap.put((String)o[0],((Long)o[1]).intValue());
|
}
|
|
return resultMap;
|
}
|
|
}
|