package com.qxueyou.scc.exercise.service.impl; import java.math.BigDecimal; import java.math.BigInteger; import java.sql.Timestamp; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.alibaba.fastjson.JSONObject; import com.qxueyou.scc.base.model.Constants; 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.DateUtils; import com.qxueyou.scc.base.util.TraceUtils; import com.qxueyou.scc.exercise.model.ExciseExtendReqData; import com.qxueyou.scc.exercise.model.ExerGroupResponseData; import com.qxueyou.scc.exercise.model.ExerItemResponseData; import com.qxueyou.scc.exercise.model.ExerciseDataSubmitLog; import com.qxueyou.scc.exercise.model.ExerciseExtendRecordData; import com.qxueyou.scc.exercise.model.ExerciseFault; import com.qxueyou.scc.exercise.model.ExerciseFaultBook; import com.qxueyou.scc.exercise.model.ExerciseFaultHis; import com.qxueyou.scc.exercise.model.ExerciseFaultRecord; import com.qxueyou.scc.exercise.model.ExerciseFaultStatistics; import com.qxueyou.scc.exercise.model.ExerciseFavorite; import com.qxueyou.scc.exercise.model.ExerciseFavoriteBook; import com.qxueyou.scc.exercise.model.ExerciseFavoriteHis; import com.qxueyou.scc.exercise.model.ExerciseFavoriteRecord; import com.qxueyou.scc.exercise.model.ExerciseGroup; import com.qxueyou.scc.exercise.model.ExerciseItem; import com.qxueyou.scc.exercise.model.ExerciseItemAnalisi; import com.qxueyou.scc.exercise.model.ExerciseItemAnalisiU; import com.qxueyou.scc.exercise.model.ExerciseItemAnswerData; import com.qxueyou.scc.exercise.model.ExerciseItemAnswerU; import com.qxueyou.scc.exercise.model.ExerciseRecord; import com.qxueyou.scc.exercise.model.ExerciseSubmitAnswerData; import com.qxueyou.scc.exercise.model.ExerciseSubmitAnswerDataList; import com.qxueyou.scc.exercise.service.IExerciseExtendService; import com.qxueyou.scc.exercise.service.IExerciseVerService; import com.qxueyou.scc.exercise.util.ExerciseUtils; /** * Á·Ï° ʵÏÖservice * @author zhiyong * */ @Service(value = "exerciseExtendService") public class ExerciseExtendService extends CommonAppService implements IExerciseExtendService { /** ÈÕÖ¾ */ private static final Logger log = LogManager.getLogger(ExerciseExtendService.class); /** Á·Ï°½Ó¿Úservice */ @Autowired private IExerciseVerService exerciseVerService; /** ×öÌâ¼Ç¼id */ private static final String EXERCISE_RECORD_ID = "exerciseRecordId"; /** ¸üÐÂʱ¼ä */ private static final String UPDATE_TIME = "updateTime"; /** * ÐÂÔöÊÕ²Øbook¼Ç¼ * @param groupId * @return */ public String insertExerciseFavorBook(String currTitleNum) { ExerciseFavoriteBook record = new ExerciseFavoriteBook(); record.setUserId(ClientUtils.getUserId()); record.setClassId(ClientUtils.getClassId()); record.setDeleteFlag(false); //record.setTitleMaxNumber(currTitleNum); TraceUtils.setCreateTrace(record); this.save(record); return record.getFavoriteBookId(); } /** * ÐÂÔö´íÌâbook¼Ç¼ * @param groupId * @return */ public String insertExerciseFaultBook() { ExerciseFaultBook record = new ExerciseFaultBook(); record.setUserId(ClientUtils.getUserId()); record.setClassId(ClientUtils.getClassId()); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); this.save(record); return record.getResumeBookId(); } /** * ÐÂÔöÊղؼǼ * @param groupId * @return */ public Result insertExerciseFavor(String favoriteBookId, String exerciseItemId) { ExerciseFavorite record = new ExerciseFavorite(); record.setFavoriteBookId(favoriteBookId); record.setExerciseItemId(exerciseItemId); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); this.save(record); return new Result(true); } /** * ÐÂÔö´íÌâ¼Ç¼ * @param groupId * @return */ public Result insertExerciseFault(String resumeBookId, String exerciseItemId, String repeatFlag) { ExerciseFault record = new ExerciseFault(); record.setExerciseItemId(exerciseItemId); record.setResumeBookId(resumeBookId); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); this.save(record); return new Result(true); } /** -------------------------APP--V2.0- start------------------------------------------- */ /** * ²Ù×÷´íÌâ¼Ç¼ */ public Map doOperExerciseFaultRecordData(String subjectId, ExciseExtendReqData recordResult) { // Á·Ï°×éid String exerciseGroupId = recordResult.getExerciseGroupId(); String exerciseGroupType = recordResult.getExerciseGroupType(); // 1.²Ù×÷Á·Ï°×ܼǼ ExerciseFaultBook resumeBook = doOperExerciseFaultBook(subjectId,recordResult); String resumeBookId = resumeBook.getResumeBookId(); // 2.²Ù×÷Á·Ï°¼Ç¼ ExerciseFaultRecord record = doOperExerciseFaultRecord(resumeBookId, exerciseGroupId, exerciseGroupType, recordResult); String faultRecordId = record.getFaultRecordId(); // 3.×é×°´íÌâ½á¹ûÈë¿â doOperFaultExerciseToDB(resumeBookId, faultRecordId, recordResult); // 4.ÖØÐ¼ÆËã×öÌâ¼Ç¼ÕýÈ·¸öÊý ×öÌâ¸öÊý ÕýÈ·ÂÊ ´íÌâ±¾ record = this.doCalcFaultExericseStatisBySubmitData(record,resumeBook,subjectId); // 5.·µ»Ø½á¹û Map map = new HashMap(3); map.put(EXERCISE_RECORD_ID, faultRecordId); map.put("exerciseGroupId", exerciseGroupId); map.put(UPDATE_TIME, DateTimeUtils.getCurrDateTime(record.getUpdateTime())); return map; } /** * ÖØÐ¼ÆËã´íÌârecordÊý¾Ý½á¹û * @param record * @return */ @SuppressWarnings("unchecked") public Result updateExerciseFaultRecordData(ExerciseFaultRecord record){ String sql = "SELECT"+ " count(1) allCount,"+ " sum(CORRECT = 1) corrCount,"+ " sum(ANSWER IS NOT NULL) doCount,"+ " round(sum(CORRECT = 1) / count(1) * 100,2) accuracy,"+ " round(sum(ANSWER IS NOT NULL) / count(1) * 100,2) rate"+ " FROM exercise_fault"+ " WHERE DELETE_FLAG = 0"+ " AND FAULT_RECORD_ID = ?"; List lstFault = this.findBySql(sql, CollectionUtils.newList(record.getFaultRecordId())); Object[] objs = lstFault.get(0); // ²ð·Ö×ÓÊý¾Ý packagingExerciseFaultRecordData(record, objs); if(record.getAllCount().compareTo(BigInteger.ZERO) == 0){// È«²¿É¾³ýºó Êý¾ÝÇå0 record.setTitleMaxNumber("0"); record.setStatus("0"); }else if(StringUtils.isNotBlank(record.getTitleMaxNumber()) && record.getAllCount().compareTo(new BigInteger(record.getTitleMaxNumber())) < 0){// ×ܸöÊýСÓÚ×î´óÌâºÅÊý record.setTitleMaxNumber(String.valueOf(record.getAllCount())); } TraceUtils.setUpdateTrace(record); this.save(record); return new Result(true); } /** * ÖØÐ¼ÆËã´íÌârecordÊý¾Ý½á¹û ²ð·Ö×ÓÊý¾Ý * @param record * @param objs */ private void packagingExerciseFaultRecordData(ExerciseFaultRecord record, Object[] objs) { record.setAllCount((BigInteger)objs[0]); record.setCorrectCount(new BigInteger(String.valueOf(objs[1]==null ? "0" : objs[1]))); record.setDoCount(new BigInteger(String.valueOf(objs[2]==null ? "0" : objs[2]))); record.setAccuracy(new BigDecimal(String.valueOf(objs[3]==null ? "0" : objs[3]))); record.setCompletionRate(new BigDecimal(String.valueOf(objs[4]==null ? "0" : objs[4]))); record.setScore(record.getAccuracy()); } /** * ÖØÐ¼ÆËã×öÌâ¼Ç¼×ܸöÊý ´íÌâ±¾ ÕýÈ·¸öÊý ×öÌâ¸öÊý ÕýÈ·ÂÊ ´íÌâ±¾ * @return */ public ExerciseFaultRecord doCalcFaultExericseStatisBySubmitData(ExerciseFaultRecord record, ExerciseFaultBook resumeBook, String subjectId){ // 1.¼ÆËã×öÌâ×ܸöÊý record this.updateExerciseFaultRecordData(record); // 2.¼ÆËã¸Ã°à¼¶µÄ×ܸöÊý this.updateExerciseFaultBookInfo(resumeBook); if(resumeBook.getAllCount().compareTo(BigInteger.ZERO) == 0){// È«²¿É¾³ýºó Êý¾ÝÇå0 resumeBook.setTitleMaxNumber("0"); resumeBook.setStatus("0"); }else if(StringUtils.isNotBlank(resumeBook.getTitleMaxNumber()) && resumeBook.getAllCount().compareTo(new BigInteger(resumeBook.getTitleMaxNumber())) < 0){// ×ܸöÊýСÓÚ×î´óÌâºÅÊý resumeBook.setTitleMaxNumber(String.valueOf(resumeBook.getAllCount())); } TraceUtils.setUpdateTrace(resumeBook); this.save(resumeBook); return record; } /** * ×é×°´íÌâ½á¹ûÈë¿â * @param resumeBookId * @param faultRecordId * @param recordResult * @return */ private Result doOperFaultExerciseToDB(String resumeBookId, String faultRecordId, ExciseExtendReqData recordResult){ List lstItems = recordResult.getItems(); Map argsMap = new HashMap(); Object[] args = new Object[lstItems.size()]; for(int i=0; i lstExistfavor = this.findByComplexHql(hql, argsMap, ExerciseFault.class); Map faultMap = new HashMap(); for(ExerciseFault fault:lstExistfavor){ faultMap.put(fault.getExerciseItemId(), fault); } List lstFault = new ArrayList(recordResult.getItems().size()); ExerciseFault fault=null; // Ñ­»·Ã¿Ò»Ìõ¼Ç¼ // ÅжϿͻ§¶ËÌá½»µÄÊý¾ÝÊÇ·ñÖØ¸´map Map repeatMap = new HashMap(lstItems.size()); for(ExerciseExtendRecordData record:lstItems){ if(repeatMap.get(record.getExerciseId()) != null && (boolean)repeatMap.get(record.getExerciseId()) == record.getFlag()){//ÖØ¸´Êý¾Ý continue; } fault=faultMap.get(record.getExerciseId()); if(record.getFlag()){//Ìí¼Ó´íÌâ if(fault == null){ fault = new ExerciseFault(); fault.setFaultRecordId(faultRecordId); fault.setResumeBookId(resumeBookId); fault.setExerciseItemId(record.getExerciseId()); fault.setDeleteFlag(false); TraceUtils.setCreateTrace(fault); }else{// Ô­À´ÒѾ­É¾³ý »Ö¸´ if(fault.getDeleteFlag()){ fault.setDeleteFlag(false); fault.setAnswer(null); fault.setCorrect(Byte.valueOf("0")); TraceUtils.setUpdateTrace(fault); }else{ continue; } } }else{// ɾ³ý´íÌâ if(fault == null){ continue; } fault.setDeleteFlag(true); fault.setAnswer(null); fault.setCorrect(Byte.valueOf("0")); TraceUtils.setUpdateTrace(fault); } lstFault.add(fault); repeatMap.put(record.getExerciseId(), record.getFlag()); } // 2.¼Ç¼´íÌâitemList // ÅúÁ¿Ôö¼Ó this.saveOrUpdateAll(lstFault); this.flush(); return new Result(true); } /** * ²Ù×÷Á·Ï°¼Ç¼ * @param subjectId * @return */ public ExerciseFaultRecord doOperExerciseFaultRecord(String resumeBookId,String exerciseGroupId, String exerciseGroupType, ExciseExtendReqData recordResult){ // ´íÌâ¼Ç¼ µ±Ç°×é String hql = "from ExerciseFaultRecord where resumeBookId=? and exerciseGroupId=? and deleteFlag is false "; ExerciseFaultRecord record = this.findUnique(hql, CollectionUtils.newList(resumeBookId, exerciseGroupId), ExerciseFaultRecord.class); if(null == record){// ¼Ç¼²»´æÔÚ record = new ExerciseFaultRecord(); record.setResumeBookId(resumeBookId); record.setExerciseGroupId(exerciseGroupId); record.setExerciseGroupType(Short.valueOf(exerciseGroupType)); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); this.save(record); } return record; } /** * ²Ù×÷Á·Ï°¼Ç¼ * @param subjectId * @return */ public ExerciseFaultBook doOperExerciseFaultBook(String subjectId,ExciseExtendReqData recordResult){ StringBuffer hql = new StringBuffer(512); hql.append("from ExerciseFaultBook where classId=? and userId=? and deleteFlag is false "); List args = CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId()); if(StringUtils.isNotBlank(subjectId)){// ¸ßУ hql.append(" and subjectId=? "); args.add(subjectId); } // ²éѯ´ËÓû§ÊÇ·ñÓдíÌâ¼Ç¼ List lstFault = this.find(hql.toString(), args, ExerciseFaultBook.class); ExerciseFaultBook book = null; String hql_book; if(lstFault.isEmpty()){// ¼Ç¼Ϊ¿Õ if(StringUtils.isNotBlank(subjectId)){// ¸ßУ // ÏȲéѯÉϼ¶¼Ç¼ÊÇ·ñ´æÔÚ hql_book = "from ExerciseFaultBook where classId=? and userId=? and deleteFlag is false "; lstFault = this.find(hql_book, CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId()), ExerciseFaultBook.class); if(lstFault.isEmpty()){//°à¼¶¼Ç¼²»´æÔÚ book = this.insertExerciseFaultBookNew(ExerciseFaultBook.TYPE_ORGANIZATION, null); } book = this.insertExerciseFaultBookNew(ExerciseFaultBook.TYPE_COLLEGE, lstFault.get(0).getResumeBookId()); }else{ book = this.insertExerciseFaultBookNew(ExerciseFaultBook.TYPE_ORGANIZATION, null); } }else{ book = lstFault.get(0); } return book; } /** * ÐÂÔö´íÌâbook¼Ç¼ * @param groupId * @return */ public ExerciseFaultBook insertExerciseFaultBookNew(short type, String parentId) { ExerciseFaultBook record = new ExerciseFaultBook(); record.setUserId(ClientUtils.getUserId()); record.setClassId(ClientUtils.getClassId()); record.setCollegeCourseId(ClientUtils.getCourseId()); record.setOrgId(ClientUtils.getOrgId()); //record.setSubjectId(); record.setParentId(parentId); record.setType(type); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); this.save(record); return record; } /** * ¸üдíÌâbook¼Ç¼ * @param groupId * @return */ public Result updateExerciseFaultBookNew(ExerciseFaultBook record) { TraceUtils.setUpdateTrace(record); this.save(record); return new Result(true); } /** * ²Ù×÷´íÌâ¼Ç¼ */ public Map doOperExerciseFavorRecordData(String subjectId, ExciseExtendReqData recordResult) { // Á·Ï°×éid String exerciseGroupId = recordResult.getExerciseGroupId(); String exerciseGroupType = recordResult.getExerciseGroupType(); // 1.²Ù×÷Á·Ï°×ܼǼ ExerciseFavoriteBook favorBook = doOperExerciseFavoriteBook(subjectId, recordResult); String favoriteBookId = favorBook.getFavoriteBookId(); // 2.²Ù×÷Á·Ï°¼Ç¼ ExerciseFavoriteRecord record = doOperExerciseFavorRecord(favoriteBookId, exerciseGroupId, exerciseGroupType,recordResult); String favoriteRecordId = record.getFavoriteRecordId(); // 3.×é×°´íÌâ½á¹ûÈë¿â doOperFavorExerciseToDB(favoriteBookId, favoriteRecordId, recordResult); // 4. ÖØÐ¼ÆËã×öÌâ¼Ç¼×ܸöÊý ÊÕ²Ø record = this.doCalcFavorExericseStatisBySubmitData(record, favorBook, subjectId); // 5.·µ»Ø½á¹û Map map = new HashMap(3); map.put(EXERCISE_RECORD_ID, favoriteRecordId); map.put("exerciseGroupId", exerciseGroupId); map.put(UPDATE_TIME, DateTimeUtils.getCurrDateTime(record.getUpdateTime())); return map; } /** * ¸üÐÂExerciseFavoriteRecordÊý¾Ý * @param record * @return */ @SuppressWarnings("unchecked") public Result updateExerciseFavoriteRecordData(ExerciseFavoriteRecord record){ String sql = "SELECT"+ " count(1) allCount,"+ " sum(CORRECT = 1) corrCount,"+ " sum(ANSWER IS NOT NULL) doCount,"+ " round(sum(CORRECT = 1) / count(1) * 100,2) accuracy,"+ " round(sum(ANSWER IS NOT NULL) / count(1) * 100,2) rate"+ " FROM exercise_favorite"+ " WHERE DELETE_FLAG = 0"+ " AND FAVORITE_RECORD_ID = ?"; List lstFault = this.findBySql(sql, CollectionUtils.newList(record.getFavoriteRecordId())); Object[] objs = lstFault.get(0); // ²ð·Ö×ÓÊý¾Ý packagingExerciseFavoriteRecordData(record, objs); if(record.getAllCount().compareTo(BigInteger.ZERO) == 0){// È«²¿É¾³ýºó Êý¾ÝÇå0 record.setTitleMaxNumber("0"); record.setStatus("0"); }else if(StringUtils.isNotBlank(record.getTitleMaxNumber()) && record.getAllCount().compareTo(new BigInteger(record.getTitleMaxNumber())) < 0){// ×ܸöÊýСÓÚ×î´óÌâºÅÊý record.setTitleMaxNumber(String.valueOf(record.getAllCount())); } TraceUtils.setUpdateTrace(record); this.save(record); return new Result(true); } /** * ²ð·Ö×ÓÊý¾Ý * @param record * @param objs */ private void packagingExerciseFavoriteRecordData( ExerciseFavoriteRecord record, Object[] objs) { record.setAllCount((BigInteger)objs[0]); record.setCorrectCount(new BigInteger(String.valueOf(objs[1]==null ? "0" : objs[1]))); record.setDoCount(new BigInteger(String.valueOf(objs[2]==null ? "0" : objs[2]))); record.setAccuracy(new BigDecimal(String.valueOf(objs[3]==null ? "0" : objs[3]))); record.setCompletionRate(new BigDecimal(String.valueOf(objs[4]==null ? "0" : objs[4]))); record.setScore(record.getAccuracy()); } /** * ÖØÐ¼ÆËã×öÌâ¼Ç¼×ܸöÊý ÊÕ²Ø * @param exerciseGroupId * @param exerciseRecordId * @return */ public ExerciseFavoriteRecord doCalcFavorExericseStatisBySubmitData(ExerciseFavoriteRecord record, ExerciseFavoriteBook favorBook,String subjectId){ // 1.¼ÆËã×öÌâ×ܸöÊý record this.updateExerciseFavoriteRecordData(record); // 2.¼ÆËã¸Ã°à¼¶µÄ×ܸöÊý this.updateExerciseFavorBookInfo(favorBook); if(favorBook.getAllCount().compareTo(BigInteger.ZERO) == 0){// È«²¿É¾³ýºó Êý¾ÝÇå0 favorBook.setTitleMaxNumber("0"); favorBook.setStatus("0"); }else if(StringUtils.isNotBlank(favorBook.getTitleMaxNumber()) && favorBook.getAllCount().compareTo(new BigInteger(favorBook.getTitleMaxNumber())) < 0){// ×ܸöÊýСÓÚ×î´óÌâºÅÊý favorBook.setTitleMaxNumber(String.valueOf(favorBook.getAllCount())); } TraceUtils.setUpdateTrace(favorBook); this.save(favorBook); return record; } /** * ×é×°´íÌâ½á¹ûÈë¿â * @param resumeBookId * @param faultRecordId * @param recordResult * @return */ private Result doOperFavorExerciseToDB(String favoriteBookId, String favoriteRecordId, ExciseExtendReqData recordResult){ List lstItems = recordResult.getItems(); Map argsMap = new HashMap(); Object[] args = new Object[lstItems.size()]; for(int i=0; i lstExistfavor = this.findByComplexHql(hql, argsMap, ExerciseFavorite.class); Map favorMap = new HashMap(); for(ExerciseFavorite favor:lstExistfavor){ favorMap.put(favor.getExerciseItemId(), favor); } List lstFavor= new ArrayList(); ExerciseFavorite favor=null; // Ñ­»·Ã¿Ò»Ìõ¼Ç¼ // ÅжϿͻ§¶ËÌá½»µÄÊý¾ÝÊÇ·ñÖØ¸´map Map repeatMap = new HashMap(lstItems.size()); for(ExerciseExtendRecordData record:lstItems){ if(repeatMap.get(record.getExerciseId()) != null && (boolean)repeatMap.get(record.getExerciseId()) == record.getFlag()){//ÖØ¸´Êý¾Ý continue; } favor = favorMap.get(record.getExerciseId()); if(record.getFlag()){//Ìí¼ÓÊղؼǼ if(favor == null){ favor = new ExerciseFavorite(); favor.setFavoriteBookId(favoriteBookId); favor.setFavoriteRecordId(favoriteRecordId); favor.setExerciseItemId(record.getExerciseId()); TraceUtils.setCreateTrace(favor); favor.setDeleteFlag(false); }else{//Ô­À´ÒѾ­É¾³ý ÏÖÔÚ»Ö¸´ if(favor.getDeleteFlag()){ favor.setAnswer(null); favor.setCorrect(Byte.valueOf("0")); favor.setDeleteFlag(false); TraceUtils.setUpdateTrace(favor); }else{ continue; } } }else{// ɾ³ýÊÕ²Ø if(favor == null){ continue; } favor.setDeleteFlag(true); favor.setAnswer(null); favor.setCorrect(Byte.valueOf("0")); favor.setCreateTime(new Date(System.currentTimeMillis())); TraceUtils.setUpdateTrace(favor); } lstFavor.add(favor); repeatMap.put(record.getExerciseId(), record.getFlag()); } // 2.¼Ç¼ÊÕ²ØitemList // ÅúÁ¿Ôö¼Ó»òÕ߸üРthis.saveOrUpdateAll(lstFavor); this.flush(); return new Result(true); } /** * ²Ù×÷Á·Ï°¼Ç¼ * @param subjectId * @return */ public ExerciseFavoriteRecord doOperExerciseFavorRecord(String favoriteBookId,String exerciseGroupId, String exerciseGroupType,ExciseExtendReqData recordResult){ // ´íÌâ¼Ç¼ µ±Ç°×é String hql = "from ExerciseFavoriteRecord where favoriteBookId=? and exerciseGroupId=? and deleteFlag is false "; ExerciseFavoriteRecord record = this.findUnique(hql, CollectionUtils.newList(favoriteBookId, exerciseGroupId), ExerciseFavoriteRecord.class); if(null == record){// ¼Ç¼²»´æÔÚ record = new ExerciseFavoriteRecord(); record.setFavoriteBookId(favoriteBookId); record.setExerciseGroupId(exerciseGroupId); record.setExerciseGroupType(Short.valueOf(exerciseGroupType)); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); this.save(record); } return record; } /** * ²Ù×÷Á·Ï°¼Ç¼ * @param subjectId * @return */ public ExerciseFavoriteBook doOperExerciseFavoriteBook(String subjectId,ExciseExtendReqData recordResult){ StringBuffer hql = new StringBuffer(512); hql.append("from ExerciseFavoriteBook where classId=? and userId=? and deleteFlag is false "); List args = CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId()); if(StringUtils.isNotBlank(subjectId)){// ¸ßУ hql.append(" and subjectId=? "); args.add(subjectId); } // ²éѯ´ËÓû§ÊÇ·ñÓдíÌâ¼Ç¼ List lstFavor = this.find(hql.toString(), args, ExerciseFavoriteBook.class); ExerciseFavoriteBook book = null; String hql_book; if(lstFavor.isEmpty()){// ¼Ç¼Ϊ¿Õ if(StringUtils.isNotBlank(subjectId)){// ¸ßУ // ÏȲéѯÉϼ¶¼Ç¼ÊÇ·ñ´æÔÚ hql_book = "from ExerciseFavoriteBook where classId=? and userId=? and deleteFlag is false "; lstFavor = this.find(hql_book, CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId()), ExerciseFavoriteBook.class); if(lstFavor.isEmpty()){//°à¼¶¼Ç¼²»´æÔÚ book = this.insertExerciseFavorBookNew(ExerciseFavoriteBook.TYPE_ORGANIZATION, null); }else{ book = lstFavor.get(0); } book = this.insertExerciseFavorBookNew(ExerciseFavoriteBook.TYPE_COLLEGE, book.getFavoriteBookId()); }else{ book = this.insertExerciseFavorBookNew(ExerciseFavoriteBook.TYPE_ORGANIZATION, null); } }else{ book = lstFavor.get(0); } return book; } /** * ÐÂÔö´íÌâbook¼Ç¼ * @param groupId * @return */ public Result updateExerciseFavorBookNew(ExerciseFavoriteBook record) { TraceUtils.setUpdateTrace(record); this.save(record); return new Result(true); } /** * ÐÂÔö´íÌâbook¼Ç¼ * @param groupId * @return */ public ExerciseFavoriteBook insertExerciseFavorBookNew(short type, String parentId) { ExerciseFavoriteBook record = new ExerciseFavoriteBook(); record.setUserId(ClientUtils.getUserId()); record.setClassId(ClientUtils.getClassId()); record.setCollegeCourseId(ClientUtils.getCourseId()); record.setOrgId(ClientUtils.getOrgId()); record.setParentId(parentId); record.setType(type); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); this.save(record); return record; } /** * ´íÌâ±¾Ìá½»´ð°¸ */ @Override public Map doSubmitExerFaultAnswerDataNew(ExerciseSubmitAnswerData clientAnswerResult) { // 0.ÖØÐÂÕûÀí´ðÌâÊý¾Ý ExerciseSubmitAnswerData answerResult = exerciseVerService.getExerciseSubmitAnswerDataNew(clientAnswerResult); // 1.¸üдíÌâ¼Ç¼ ExerciseFaultRecord record = this.doOperExerFaultRecord(answerResult); if(null == record){ return null; } String faultRecordId = record.getFaultRecordId(); // ·µ»Ø½á¹û Map map = new HashMap(3); map.put(EXERCISE_RECORD_ID, faultRecordId); map.put("exerciseGroupId", record.getExerciseGroupId()); map.put(UPDATE_TIME, DateTimeUtils.getCurrDateTime(record.getAnswerUpdateTime())); map.put("exerciseBookId", record.getResumeBookId()); map.put("correctCount", answerResult.getCorrectCount()); map.put("doCount", answerResult.getDoCount()); if(answerResult.getItems().isEmpty() && answerResult.getSubmitType() != 1){// submitType:1±íʾ±¾µØÎÞÍøÇé¿öÏÂÖØÐÂ×öÌâ¹ý return map; } // 2.ÅжÏÊÇ·ñ±¾µØÖØÐÂ×ö¹ý submitType:1±íʾ±¾µØÎÞÍøÇé¿öÏÂÖØÐÂ×öÌâ¹ý if(1 == answerResult.getSubmitType()){ doOperExerciseFaultRecordByRedo(faultRecordId); } // 2.¸üд𰸠answerResult.setExerciseRecordId(faultRecordId); Result result = this.doUpdateExerFaultAnswerData(answerResult); if(!result.isSuccess()){ return null; } // 3.ÖØÐ¼ÆËã×öÌâ¼Ç¼ÕýÈ·¸öÊý ×öÌâ¸öÊý ÕýÈ·ÂÊ this.updateExerciseFaultRecordData(record); return map; } /** * ¸üдíÌâ¼Ç¼ * @param answerResult * @return */ public ExerciseFaultRecord doOperExerFaultRecord(ExerciseSubmitAnswerData answerResult) { ExerciseFaultRecord record = null; String exerciseRecordId = answerResult.getExerciseRecordId(); if(StringUtils.isNotBlank(exerciseRecordId)){// Õý³£×öÌâ record = this.read(ExerciseFaultRecord.class, answerResult.getExerciseRecordId()); }else{// ÎÞÍøÇé¿öÏ String hql = "from ExerciseFaultRecord r where r.deleteFlag is false and " + "r.faultBook.userId=? and r.faultBook.classId=? and r.exerciseGroupId=?"; record = this.findUnique(hql, CollectionUtils.newList(ClientUtils.getUserId(), ClientUtils.getClassId(), answerResult.getExerciseGroupId()), ExerciseFaultRecord.class); } if(null == record){ return null; } if(answerResult.getItems().isEmpty() && ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus())){//½ö½ö½»¾í record.setStatus(answerResult.getStatus()); // ¸üдð°¸Ê±¼ä record.setAnswerUpdateTime(new Date(System.currentTimeMillis())); this.save(record); return record; } // ¼ÆËã // if(!"1".equals(record.getStatus())){// ·ÇÌá½»µÄ¾Í¸üР// } record.setStatus(StringUtils.isBlank(answerResult.getStatus()) ? "0" : answerResult.getStatus()); if(!"0".equals(answerResult.getCurrTitleNum())){ record.setTitleMaxNumber(StringUtils.isBlank(answerResult.getCurrTitleNum()) ? "0" : answerResult.getCurrTitleNum()); } // ¸üдð°¸Ê±¼ä record.setAnswerUpdateTime(new Date(System.currentTimeMillis())); this.save(record); return record; } /** *Ìá½» ´íÌâ½á¹ûµ½db * @return */ public Result doUpdateExerFaultAnswerData(ExerciseSubmitAnswerData answerResult) { List lstAnswers = answerResult.getItems(); if(lstAnswers.isEmpty()){ return new Result(true); } // ÅúÁ¿¸üд𰸠List lstResultFault =new ArrayList(lstAnswers.size()); // 2.1.×é×°²ÎÊý ÓÃÓÚ²éѯÁ·Ï°Ñ¡ÏîͼƬ Map argsMap = new HashMap(2); Object[] args = new Object[lstAnswers.size()]; for(int i=0; i lstFault = this.findByComplexHql(hql, argsMap, ExerciseFault.class); // °´Á·Ï°id ¶ÔÓ¦·Åµ½mapÖÐ Map faultMap = new HashMap(lstFault.size()); for(ExerciseFault fault:lstFault){ faultMap.put(fault.getExerciseItemId(), fault); } ExerciseFault fault=null; for(ExerciseItemAnswerData answer:lstAnswers){ fault = faultMap.get(answer.getExerciseId()); if(null == fault){ continue; } if(StringUtils.isBlank(answer.getAnswer())){// ´ð°¸Îª¿Õ continue; } fault.setAnswer(answer.getAnswer()); fault.setCorrect(Byte.valueOf(answer.getCorrect())); TraceUtils.setUpdateTrace(fault); lstResultFault.add(fault); } // 1.±£´æ ´íÌâ ÊÕ¼¯lst this.saveOrUpdateAll(lstResultFault); this.flush(); return new Result(true); } /** * Êղر¾Ìá½»´ð°¸ */ @Override public Map doSubmitExerFavorAnswerDataNew(ExerciseSubmitAnswerData clientAnswerResult) { // 0.ÖØÐÂÕûÀí´ðÌâÊý¾Ý ExerciseSubmitAnswerData answerResult = exerciseVerService.getExerciseSubmitAnswerDataNew(clientAnswerResult); // 1.¸üдíÌâ¼Ç¼ ExerciseFavoriteRecord record = doOperExerFavorRecord(answerResult); if(null == record){ return null; } String favoriteRecordId = record.getFavoriteRecordId(); // ·µ»Ø½á¹û Map map = new HashMap(3); map.put(EXERCISE_RECORD_ID, favoriteRecordId); map.put("exerciseGroupId", record.getExerciseGroupId()); map.put(UPDATE_TIME, DateTimeUtils.getCurrDateTime(record.getAnswerUpdateTime())); map.put("exerciseBookId", record.getFavoriteBookId()); if(answerResult.getItems().isEmpty() && answerResult.getSubmitType() != 1){//½ö½ö½»¾í return map; } // 2.ÅжÏÊÇ·ñ±¾µØÖØÐÂ×ö¹ý submitType:1±íʾ±¾µØÎÞÍøÇé¿öÏÂÖØÐÂ×öÌâ¹ý if(1 == answerResult.getSubmitType()){ doOperExerciseFavorRecordByRedo(favoriteRecordId); } // 2.¸üд𰸠answerResult.setExerciseRecordId(favoriteRecordId); Result result = doUpdateExerFavorAnswerData(answerResult); if(!result.isSuccess()){ return null; } // 3.ÖØÐ¼ÆËã×öÌâ¼Ç¼ÕýÈ·¸öÊý ×öÌâ¸öÊý ÕýÈ·ÂÊ ÊÕ²Ø this.updateExerciseFavoriteRecordData(record); return map; } /** * ¸üдíÌâ¼Ç¼ * @param answerResult * @return */ public ExerciseFavoriteRecord doOperExerFavorRecord(ExerciseSubmitAnswerData answerResult) { ExerciseFavoriteRecord record = null; String exerciseRecordId = answerResult.getExerciseRecordId(); if(StringUtils.isNotBlank(exerciseRecordId)){// Õý³£×öÌâ record = this.read(ExerciseFavoriteRecord.class, exerciseRecordId); }else{// ÎÞÍøÇé¿öÏ String hql = "from ExerciseFavoriteRecord r where r.deleteFlag is false " + " and r.favorBook.userId=? and r.favorBook.classId=? and r.exerciseGroupId=?"; record = this.findUnique(hql, CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId(), answerResult.getExerciseGroupId()), ExerciseFavoriteRecord.class); } if(null == record){ return null; } if(answerResult.getItems().isEmpty() && ExerciseRecord.STATUS_SUBMIT.equals(answerResult.getStatus())){//½ö½ö½»¾í record.setStatus(answerResult.getStatus()); // ¸üдð°¸Ê±¼ä record.setAnswerUpdateTime(new Date(System.currentTimeMillis())); this.save(record); return record; } // // ¼ÆËã // if(!"1".equals(record.getStatus())){// ·ÇÌá½»µÄ¾Í¸üР// } record.setStatus(answerResult.getStatus()); if(!"0".equals(answerResult.getCurrTitleNum())){ record.setTitleMaxNumber(answerResult.getCurrTitleNum()); } // ¸üдð°¸Ê±¼ä record.setAnswerUpdateTime(new Date(System.currentTimeMillis())); this.save(record); return record; } /** *Ìá½» ´íÌâ½á¹ûµ½db * @return */ public Result doUpdateExerFavorAnswerData(ExerciseSubmitAnswerData answerResult) { List lstAnswers = answerResult.getItems(); if(lstAnswers.isEmpty()){ return new Result(true); } // ÅúÁ¿¸üд𰸠List lstResultFavor =new ArrayList(lstAnswers.size()); // 2.1.×é×°²ÎÊý ÓÃÓÚ²éѯÁ·Ï°Ñ¡ÏîͼƬ Map argsMap = new HashMap(2); Map exerItemIdMap = new HashMap(1); Object[] args = new Object[lstAnswers.size()]; for(int i=0; i lstFavor = this.findByComplexHql(hql, argsMap, ExerciseFavorite.class); // °´Á·Ï°id ¶ÔÓ¦·Åµ½mapÖÐ Map favorMap = new HashMap(lstFavor.size()); for(ExerciseFavorite favor:lstFavor){ favorMap.put(favor.getExerciseItemId(), favor); } ExerciseFavorite favor; for(ExerciseItemAnswerData answer:lstAnswers){ favor = favorMap.get(answer.getExerciseId()); if(null == favor){ continue; } if(StringUtils.isBlank(answer.getAnswer())){// ´ð°¸Îª¿Õ continue; } favor.setAnswer(answer.getAnswer()); favor.setCorrect(Byte.valueOf(answer.getCorrect())); TraceUtils.setUpdateTrace(favor); lstResultFavor.add(favor); } this.saveOrUpdateAll(lstResultFavor); this.flush(); return new Result(true); } /** * ²éѯ´íÌâ±¾ÁбíÊý¾Ý * @param exerType * @param subjectId * @param pager * @return */ @Override public List queryExerciseFaultListData( int exerType, String subjectId, Pager pager) { StringBuffer hql = new StringBuffer(512); // 1.²éѯ·Ö×éÁбí hql.append("select r,g from ExerciseFaultRecord r, ExerciseFaultBook b, ExerciseGroup g " + " where r.resumeBookId=b.resumeBookId " + " and r.exerciseGroupId=g.groupId " + " and r.deleteFlag is false " + " and b.deleteFlag is false " + " and b.userId=? and r.allCount>0 "); List args = CollectionUtils.newList(ClientUtils.getUserId()); if(exerType != 0){ //±íʾ²éѯȫ²¿´íÌâ hql.append(" and r.exerciseGroupType=?"); args.add((short)exerType); } if(StringUtils.isNotBlank(subjectId)){// ¸ßУ ͨ¹ý¿Î³Ì¹ýÂË hql.append(" and b.type=? and b.subjectId=? and g.subjectId=? "); args.add(ExerciseFaultBook.TYPE_COLLEGE); args.add(subjectId); args.add(subjectId); }else{// ·Ç¸ßУ hql.append(" and b.type=? and b.classId=? and g.classId=?"); args.add(ExerciseFaultBook.TYPE_ORGANIZATION); args.add(ClientUtils.getClassId()); args.add(ClientUtils.getClassId()); } hql.append(" order by r.updateTime desc "); // ¸ù¾Ý½á¹¹²éѯµÃµ½ËùÐè¼Ç¼ List lstRecord = this.findList(hql.toString(), pager, args, Object[].class); if(lstRecord.isEmpty()){// ²éѯ½á¹û¼Ç¼Ϊ¿Õ return null; } // 3.×é×°²ÎÊý Object[] argss = new Object[lstRecord.size()]; ExerciseGroup groupp=null; for(int i=0; i> favorMap = this.queryFavorRecordByGroup(subjectId, argss); // ½á¹û·µ»Ø²ÎÊý List lstResult = new ArrayList(lstRecord.size()); for(Object[] objs:lstRecord){ // ×é×°Á·Ï°´íÌâ±¾ÁбíÊý¾Ý lstResult.add(packagingExerciseFaultListData( favorMap, objs)); } return lstResult; } /** * ×é×°Á·Ï°´íÌâ±¾ÁбíÊý¾Ý * @param favorMap * @param objs * @return */ private ExerGroupResponseData packagingExerciseFaultListData( Map> favorMap, Object[] objs) { ExerciseFaultRecord record = (ExerciseFaultRecord)objs[0]; ExerciseGroup group = (ExerciseGroup)objs[1]; ExerGroupResponseData resultObj = new ExerGroupResponseData(); // ²ð·Ö·½·¨ packagingExerciseFaultListChildData(record, resultObj); resultObj.setExtendAllCount(record.getAllCount()==null ? BigInteger.ZERO : record.getAllCount()); if(new BigInteger(resultObj.getCurrTitleNumber()).compareTo(resultObj.getExtendAllCount())>0){ resultObj.setCurrTitleNumber(String.valueOf(resultObj.getExtendAllCount())); } BeanUtils.copyProperties(group, resultObj); resultObj.setExerciseTime(group.getAttribute1()); resultObj.setUpdateTime(record.getUpdateTime()); resultObj.setAnswerUpdateTime(record.getAnswerUpdateTime()); resultObj.setFaultUpdateTime(record.getUpdateTime()); resultObj.setFaultCount(resultObj.getAllCount()); if(favorMap != null && favorMap.get(group.getGroupId()) != null){ resultObj.setFavorUpdateTime((Timestamp)favorMap.get(group.getGroupId()).get(UPDATE_TIME));//ÉèÖÃÊղر¾ÌâÄ¿¸üÐÂʱ¼ä resultObj.setFavorCount((BigInteger)favorMap.get(group.getGroupId()).get("allCount")); } if(resultObj.getDoCount().compareTo(resultObj.getExtendAllCount())>0){ resultObj.setDoCount(resultObj.getExtendAllCount()); } return resultObj; } /** * ×é×°Á·Ï°´íÌâ±¾ÁбíÊý¾Ý ²ð·Ö·½·¨ * @param record * @param resultObj */ private void packagingExerciseFaultListChildData( ExerciseFaultRecord record, ExerGroupResponseData resultObj) { resultObj.setStatus(record.getStatus()); resultObj.setGroupId(record.getExerciseGroupId()); resultObj.setExerciseRecordId(record.getFaultRecordId()); resultObj.setAccuracy(record.getAccuracy()==null ? BigDecimal.ZERO : record.getAccuracy()); resultObj.setCorrectCount(record.getCorrectCount()==null ? BigInteger.ZERO : record.getCorrectCount()); resultObj.setDoCount(record.getDoCount()==null ? BigInteger.ZERO : record.getDoCount()); resultObj.setCurrTitleNumber(record.getTitleMaxNumber()==null ? "0" : record.getTitleMaxNumber()); } /** * »ñÈ¡¸öÈËÓû§×é¶ÔÓ¦µÄ´íÌâÌâÄ¿¸üÐÂʱ¼ä * @param subjectId * @param args * @return */ @Override public Map> queryFaultRecordByGroup(String subjectId, Object[] args) { StringBuffer hql = new StringBuffer(512); // 1.²éѯ·Ö×éÁбí hql.append("select r.exerciseGroupId,r.updateTime,r.allCount from ExerciseFaultRecord r, ExerciseFaultBook b " + " where r.resumeBookId=b.resumeBookId " + " and b.userId = :userId and r.exerciseGroupId in (:groupIds) "); Map argsMap = new HashMap(4); argsMap.put("userId", ClientUtils.getUserId()); argsMap.put("groupIds", args); if(StringUtils.isNotBlank(subjectId)){// ¸ßУ ͨ¹ý¿Î³Ì¹ýÂË hql.append(" and b.type=:type and b.subjectId=:subjectId "); argsMap.put("type", ExerciseFaultBook.TYPE_COLLEGE); argsMap.put("subjectId", subjectId); }else{// ·Ç¸ßУ hql.append(" and b.type=:type and b.classId=:classId "); argsMap.put("type", ExerciseFaultBook.TYPE_ORGANIZATION); argsMap.put("classId", ClientUtils.getClassId()); } // ¸ù¾Ý½á¹¹²éѯµÃµ½ËùÐè¼Ç¼ List lstRecord = this.findByComplexHql(hql.toString(), argsMap, Object[].class); Map> resultMap = new HashMap>(lstRecord.size()); Map paramMap = null; for(Object[] obj:lstRecord){ paramMap = new HashMap(2); paramMap.put(UPDATE_TIME, obj[1]); paramMap.put("allCount", obj[2]); resultMap.put(String.valueOf(obj[0]), paramMap); } return resultMap; } /** *»ñÈ¡¸öÈËÓû§×é¶ÔÓ¦µÄÊÕ²ØÌâÄ¿¸üÐÂʱ¼ä * @param subjectId * @param args * @return */ @Override public Map> queryFavorRecordByGroup(String subjectId, Object[] args) { StringBuffer hql = new StringBuffer(512); // 1.²éѯ·Ö×éÁбí hql.append("select r.exerciseGroupId,r.updateTime,r.allCount from ExerciseFavoriteRecord r, ExerciseFavoriteBook b" + " where r.favoriteBookId=b.favoriteBookId " + " and b.userId = :userId and r.exerciseGroupId in (:groupIds) "); Map argsMap = new HashMap(4); argsMap.put("userId", ClientUtils.getUserId()); argsMap.put("groupIds", args); if(StringUtils.isNotBlank(subjectId)){// ¸ßУ ͨ¹ý¿Î³Ì¹ýÂË hql.append(" and b.type=:type and b.subjectId=:subjectId "); argsMap.put("type", ExerciseFaultBook.TYPE_COLLEGE); argsMap.put("subjectId", subjectId); }else{// ·Ç¸ßУ hql.append(" and b.type=:type and b.classId=:classId "); argsMap.put("type", ExerciseFaultBook.TYPE_ORGANIZATION); argsMap.put("classId", ClientUtils.getClassId()); } // ¸ù¾Ý½á¹¹²éѯµÃµ½ËùÐè¼Ç¼ List lstRecord = this.findByComplexHql(hql.toString(), argsMap, Object[].class); Map> resultMap = new HashMap>(lstRecord.size()); Map paramMap = null; for(Object[] obj:lstRecord){ paramMap = new HashMap(2); paramMap.put(UPDATE_TIME, obj[1]); paramMap.put("allCount", obj[2]); resultMap.put(String.valueOf(obj[0]), paramMap); } return resultMap; } /** * ²éѯÊղر¾ÁбíÊý¾Ý * @param exerType 0:±íʾȫ²¿´íÌâ * @param subjectId * @param pager * @return */ @Override public List queryExerciseFavorListData(int exerType, String subjectId, Pager pager) { StringBuffer hql = new StringBuffer(512); // 1.²éѯ·Ö×éÁбí hql.append("select r, g from ExerciseFavoriteRecord r, ExerciseFavoriteBook b, ExerciseGroup g" + " where r.favoriteBookId=b.favoriteBookId " + " and r.exerciseGroupId=g.groupId " + " and r.deleteFlag is false " + " and b.deleteFlag is false " + " and b.userId=? and r.allCount>0 "); List args = CollectionUtils.newList(ClientUtils.getUserId()); if(exerType != 0){ //±íʾ²éѯ·ÇÈ«²¿ÊÕ²Ø exerType=0Ϊ²éѯȫ²¿ÊÕ²Ø hql.append(" and r.exerciseGroupType=?"); args.add((short)exerType); } if(StringUtils.isNotBlank(subjectId)){// ¸ßУ ͨ¹ý¿Î³Ì¹ýÂË hql.append(" and b.type=? and b.subjectId=? and g.subjectId=? "); args.add(ExerciseFaultBook.TYPE_COLLEGE); args.add(subjectId); args.add(subjectId); }else{// ·Ç¸ßУ hql.append(" and b.type=? and b.classId=? and g.classId=?"); args.add(ExerciseFaultBook.TYPE_ORGANIZATION); args.add(ClientUtils.getClassId()); args.add(ClientUtils.getClassId()); } hql.append(" order by r.updateTime desc "); // ¸ù¾Ý½á¹¹²éѯµÃµ½ËùÐè¼Ç¼ List lstRecord = this.findList(hql.toString(), pager, args,Object[].class); if(lstRecord.isEmpty()){// ²éѯ½á¹û¼Ç¼Ϊ¿Õ return null; } Object[] argss = new Object[lstRecord.size()]; ExerciseGroup groupp=null; for(int i=0; i> faultMap = this.queryFaultRecordByGroup(subjectId, argss); // ½á¹û·µ»Ø²ÎÊý List lstResult = new ArrayList(lstRecord.size()); for(Object[] objs:lstRecord){ // ×é×°Á·Ï°ÊÕ²ØÁбíÊý¾Ý lstResult.add(packagingExerciseFavorListData( faultMap, objs)); } return lstResult; } /** * ×é×°Á·Ï°ÊÕ²ØÁбíÊý¾Ý * @param faultMap * @param objs * @return */ private ExerGroupResponseData packagingExerciseFavorListData( Map> faultMap, Object[] objs) { ExerciseFavoriteRecord record = (ExerciseFavoriteRecord)objs[0]; ExerciseGroup group = (ExerciseGroup)objs[1]; ExerGroupResponseData resultObj = new ExerGroupResponseData(); // ²ð·Ö×é×°Êý¾Ý packagingExerciseFavorListChildData(record, resultObj); resultObj.setExtendAllCount(record.getAllCount()==null ? BigInteger.ZERO : record.getAllCount()); if(new BigInteger(resultObj.getCurrTitleNumber()).compareTo(resultObj.getExtendAllCount())>0){ resultObj.setCurrTitleNumber(String.valueOf(resultObj.getExtendAllCount())); } BeanUtils.copyProperties(group, resultObj); resultObj.setExerciseTime(group.getAttribute1()); resultObj.setUpdateTime(record.getUpdateTime()); resultObj.setAnswerUpdateTime(record.getAnswerUpdateTime()); resultObj.setFavorUpdateTime(record.getUpdateTime()); resultObj.setFavorCount(resultObj.getAllCount()); if(faultMap !=null && faultMap.get(group.getGroupId()) !=null){ resultObj.setFaultUpdateTime((Timestamp)faultMap.get(group.getGroupId()).get(UPDATE_TIME));//ÉèÖôíÌâ±¾ÌâÄ¿¸üÐÂʱ¼ä resultObj.setFaultCount((BigInteger)faultMap.get(group.getGroupId()).get("allCount")); } if(resultObj.getDoCount().compareTo(resultObj.getExtendAllCount())>0){ resultObj.setDoCount(resultObj.getExtendAllCount()); } return resultObj; } /** * ×é×°Á·Ï°ÊÕ²ØÁбíÊý¾Ý ²ð·Ö×é×°Êý¾Ý * @param record * @param resultObj */ private void packagingExerciseFavorListChildData( ExerciseFavoriteRecord record, ExerGroupResponseData resultObj) { resultObj.setStatus(record.getStatus()); resultObj.setGroupId(record.getExerciseGroupId()); resultObj.setExerciseRecordId(record.getFavoriteRecordId()); resultObj.setAccuracy(record.getAccuracy()==null ? BigDecimal.ZERO : record.getAccuracy()); resultObj.setCorrectCount(record.getCorrectCount()==null ? BigInteger.ZERO : record.getCorrectCount()); resultObj.setDoCount(record.getDoCount()==null ? BigInteger.ZERO : record.getDoCount()); resultObj.setCurrTitleNumber(record.getTitleMaxNumber()==null ? "0" : record.getTitleMaxNumber()); } /** * »ñȡȫ²¿ÊÕ²ØÁ·Ï°Êý¾Ý * @return */ @Override public ExerItemResponseData queryAllExerciseFavorData(Pager pager) { // 1.²éѯ´ËÓû§ÊÇ·ñÓдíÌâ¼Ç¼ String hql = "select item, favor.favorRecord.exerciseGroupId,favor.favorRecord.favorBook.status " + " from ExerciseItem item, ExerciseFavorite favor " + " where item.exerciseId=favor.exerciseItemId" + " and favor.favorRecord.favorBook.classId=?" + " and favor.favorRecord.favorBook.userId=?" + " and item.deleteFlag is false" + " and favor.deleteFlag is false" + " order by favor.createTime"; List lstResult = this.findList(hql, pager, CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId()), Object[].class); if(lstResult.isEmpty()){ return null; } String status=null; ExerciseItem item = null; List lstItems = new ArrayList(lstResult.size()); for(Object[] objs:lstResult){ if(null != objs[2]) { status = String.valueOf(objs[2]); } item = new ExerciseItem(); BeanUtils.copyProperties((ExerciseItem)objs[0], item);// ·ÀÖ¹itemͬһ¸öÄÚ´æµØÖ· item.setExerciseGroupId(String.valueOf(objs[1]));//ÉèÖÃÿ¸öÌâÄ¿µÄ×éid lstItems.add(item); } // 2.ÖØÐÂ×é×°Á·Ï°Ìâ ¼ÓÈë·ÖÎö½á¹û lstItems = exerciseVerService.getCommonExerItemDetail(lstItems, null); // 3.×é×°´ð°¸ ExerItemResponseData result = new ExerItemResponseData(); result.setItems(lstItems); result.setStatus(status); result.setResult(new Result(true,"²éѯ³É¹¦")); return result; } /** * »ñÈ¡ÊÕ²ØÁ·Ï°Êý¾Ý * @param groupId * @param exerciseRecordId ·ÏÆú * @return */ @Override public ExerItemResponseData queryExerciseFavorData(String groupId) { // 1.²éѯ´ËÓû§ÊÇ·ñÓдíÌâ¼Ç¼ String hql = "select item, favor " + " from ExerciseItem item, ExerciseFavorite favor " + " where item.exerciseId=favor.exerciseItemId" + " and favor.favorRecord.exerciseGroupId=?" + " and favor.favorRecord.favorBook.userId=?" + " and item.deleteFlag is false" + " and favor.deleteFlag is false" + " order by favor.createTime"; List lstResult = this.findwithRawResult(hql, CollectionUtils.newList(groupId,ClientUtils.getUserId())); return goQueryExerciseFavorData(lstResult, groupId); } /** * »ñÈ¡¶àÌ×ÊÕ²ØÁ·Ï°Êý¾Ý * @param groupId * @return */ @Override public Map queryExerciseMutiFavorData(String groupId) { // 1.²éѯ´ËÓû§ÊÇ·ñÓдíÌâ¼Ç¼ String hql = "select item.exerciseId " + " from ExerciseItem item, ExerciseFavorite favor " + " where item.exerciseId=favor.exerciseItemId" + " and favor.favorRecord.favorBook.userId=?" + " and favor.favorRecord.favorBook.classId=?" + " and favor.favorRecord.exerciseGroupId=?" + " and item.deleteFlag is false" + " and favor.deleteFlag is false" + " order by favor.createTime"; List lstFavor = this.find(hql, CollectionUtils.newList(ClientUtils.getUserId(), ClientUtils.getClassId(), groupId),String.class); List> lstResult = new ArrayList>(lstFavor.size()); Map exerciseIdMap = null; for(String exerciseId:lstFavor){ exerciseIdMap = new HashMap(1); exerciseIdMap.put("exerciseId", exerciseId); lstResult.add(exerciseIdMap); } Map resultMap = new HashMap(2); resultMap.put("exerciseGroupId", groupId); resultMap.put("exerciseIds", lstResult); return resultMap; } /** * ²éѯÊÕ²ØÌâÄ¿Ã÷ϸ * @param lstResult * @param groupId * @return */ public ExerItemResponseData goQueryExerciseFavorData(List lstResult, String groupId) { if(lstResult.isEmpty()){ return null; } List lstItems = new ArrayList(lstResult.size()); ExerciseItem item; List lstAnswers = new ArrayList(lstResult.size()); ExerciseItemAnswerU answerU; ExerciseFavorite favor; for(Object[] objs:lstResult){ item = (ExerciseItem)objs[0]; lstItems.add(item); favor = (ExerciseFavorite)objs[1]; if(StringUtils.isNotBlank(favor.getAnswer())){ answerU = new ExerciseItemAnswerU(); answerU.setAnswer(favor.getAnswer()); answerU.setCorrect(favor.getCorrect()); answerU.setAnswerUId(favor.getExerciseFavoriteId()); answerU.setExerciseItemId(favor.getExerciseItemId()); answerU.setExerciseRecordId(favor.getFavoriteRecordId()); lstAnswers.add(answerU); } } // 2.ÖØÐÂ×é×°Á·Ï°Ìâ ¼ÓÈë·ÖÎö½á¹û lstItems = exerciseVerService.getCommonExerItemDetail(lstItems, groupId); // 3.×é×°´ð°¸ ExerItemResponseData result = new ExerItemResponseData(); result.setExerciseGroupId(groupId); result.setItems(lstItems); result.setAnswers(lstAnswers); result.setResult(new Result(true,"²éѯ³É¹¦")); return result; } /** * »ñȡȫ²¿´íÌâÁ·Ï°Êý¾Ý * @return */ @Override public ExerItemResponseData queryAllExerciseFaultData(Pager pager) { // 1.²éѯ´ËÓû§ÊÇ·ñÓдíÌâ¼Ç¼ String hql = "select item, fault.faultRecord.exerciseGroupId,fault.faultRecord.faultBook.status " + " from ExerciseItem item, ExerciseFault fault " + " where item.exerciseId=fault.exerciseItemId" + " and fault.faultRecord.faultBook.userId=?" + " and fault.faultRecord.faultBook.classId=?" + " and item.deleteFlag is false" + " and fault.deleteFlag is false" + " order by fault.createTime"; List lstResult = this.findList(hql, pager, CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId()),Object[].class); if(lstResult.isEmpty()){ return null; } List lstItems = new ArrayList(lstResult.size()); ExerciseItem item = null; String status=null; for(Object[] objs:lstResult){ if(objs[2] !=null) { status=String.valueOf(objs[2]);//»ñȡȫ²¿ÌâÄ¿µÄÌύ״̬ } item = new ExerciseItem(); BeanUtils.copyProperties((ExerciseItem)objs[0], item);// ·ÀÖ¹itemͬһ¸öÄÚ´æµØÖ· item.setExerciseGroupId(String.valueOf(objs[1]));//ÉèÖÃÿ¸öÌâÄ¿µÄ×éid lstItems.add(item); } // 2.ÖØÐÂ×é×°Á·Ï°Ìâ ¼ÓÈë·ÖÎö½á¹û lstItems = exerciseVerService.getCommonExerItemDetail(lstItems, null); // 3.×é×°´ð°¸ ExerItemResponseData result = new ExerItemResponseData(); result.setStatus(status); result.setItems(lstItems); result.setResult(new Result(true,"²éѯ³É¹¦")); return result; } /** * »ñÈ¡µ¥Ì×Ìâ´íÌâÁ·Ï°Êý¾Ý * @param groupId * @return */ @Override public ExerItemResponseData queryExerciseFaultData(String groupId) { // 1.²éѯ´ËÓû§ÊÇ·ñÓдíÌâ¼Ç¼ String hql = "select item, fault " + " from ExerciseItem item, ExerciseFault fault " + " where item.exerciseId=fault.exerciseItemId" + " and fault.faultRecord.faultBook.userId=?" + " and fault.faultRecord.exerciseGroupId=?" + " and item.deleteFlag is false" + " and fault.deleteFlag is false" + " order by fault.createTime"; // 2.²éѯ´ð°¸ List lstResult = this.findwithRawResult(hql, CollectionUtils.newList(ClientUtils.getUserId(), groupId)); return goQueryExerciseFaultData(lstResult, groupId); } /** * »ñÈ¡¶àÌ×Ìâ´íÌâÁ·Ï°Êý¾Ý * @param groupId * @return */ @Override public Map queryExerciseMutiFaultData(String groupId) { // 1.²éѯÌâÄ¿ String hql = "select item.exerciseId " + " from ExerciseItem item, ExerciseFault fault " + " where item.exerciseId=fault.exerciseItemId" + " and fault.faultRecord.faultBook.userId=?" + " and fault.faultRecord.faultBook.classId=?" + " and fault.faultRecord.exerciseGroupId=?" + " and item.deleteFlag is false" + " and fault.deleteFlag is false" + " order by fault.createTime"; List lstFault = this.find(hql, CollectionUtils.newList(ClientUtils.getUserId(), ClientUtils.getClassId(), groupId),String.class); List> lstResult = new ArrayList>(lstFault.size()); Map exerciseIdMap = null; for(String exerciseId:lstFault){ exerciseIdMap = new HashMap(1); exerciseIdMap.put("exerciseId", exerciseId); lstResult.add(exerciseIdMap); } Map resultMap = new HashMap(2); resultMap.put("exerciseGroupId", groupId); resultMap.put("exerciseIds", lstResult); return resultMap; } /** * ²éѯ´íÌâÃ÷ϸÊý¾Ý * @param lstResult * @param groupId * @return */ public ExerItemResponseData goQueryExerciseFaultData(List lstResult, String groupId) { if(lstResult.isEmpty()){ return null; } List lstItems = new ArrayList(lstResult.size()); ExerciseItem item; List lstAnswers = new ArrayList(lstResult.size()); ExerciseItemAnswerU answerU; ExerciseFault fault; for(Object[] objs:lstResult){ item = (ExerciseItem)objs[0]; if(StringUtils.isBlank(groupId)){// ±íʾ²éѯËùÓдíÌâ item.setExerciseGroupId(String.valueOf(objs[2]));//ÉèÖÃÿ¸öÌâÄ¿µÄ×éid } lstItems.add(item); fault = (ExerciseFault)objs[1]; if(StringUtils.isNotBlank(fault.getAnswer())){ answerU = new ExerciseItemAnswerU(); answerU.setAnswer(fault.getAnswer()); answerU.setCorrect(fault.getCorrect()); answerU.setAnswerUId(fault.getExerciseFaultId()); answerU.setExerciseItemId(fault.getExerciseItemId()); answerU.setExerciseRecordId(fault.getFaultRecordId()); lstAnswers.add(answerU); } } // 2.ÖØÐÂ×é×°Á·Ï°Ìâ ¼ÓÈë·ÖÎö½á¹û lstItems = exerciseVerService.getCommonExerItemDetail(lstItems, groupId); // 3.×é×°´ð°¸ ExerItemResponseData result = new ExerItemResponseData(); result.setExerciseGroupId(groupId); result.setItems(lstItems); result.setAnswers(lstAnswers); result.setResult(new Result(true,"²éѯ³É¹¦")); return result; } /** * »ñÈ¡Êղر¾´ð°¸Êý¾Ý */ @Override public ExerItemResponseData queryExerciseFavorAnswerData(String groupId) { String hql = "select f " + " from ExerciseFavorite f " + " where f.favorRecord.exerciseGroupId=?" + " and f.favorRecord.favorBook.userId=?" + " and f.favorRecord.favorBook.classId=?" + " and f.answer is not null and f.deleteFlag is false"; // 1.²éѯ´íÌâ List lstFavors = this.find(hql, CollectionUtils.newList(groupId, ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseFavorite.class); List lstAnswers = new ArrayList(lstFavors.size()); ExerciseItemAnswerU answerU; for(ExerciseFavorite favor:lstFavors){ answerU = new ExerciseItemAnswerU(); answerU.setAnswer(favor.getAnswer()); answerU.setCorrect(favor.getCorrect()); answerU.setExerciseItemId(favor.getExerciseItemId()); lstAnswers.add(answerU); } // 3.×é×°´ð°¸ ExerItemResponseData result = new ExerItemResponseData(); result.setAnswers(lstAnswers); result.setExerciseGroupId(groupId); return result; } /** * »ñÈ¡´íÌâ±¾´ð°¸Êý¾Ý */ @Override public ExerItemResponseData queryExerciseFaultAnswerData(String groupId) { String hql = "select f " + " from ExerciseFault f " + " where f.faultRecord.exerciseGroupId=?" + " and f.faultRecord.faultBook.userId=?" + " and f.faultRecord.faultBook.classId=?" + " and f.answer is not null and f.deleteFlag is false"; // 1.²éѯ´íÌâ List lstFaults = this.find(hql, CollectionUtils.newList(groupId, ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseFault.class); List lstAnswers = new ArrayList(lstFaults.size()); ExerciseItemAnswerU answerU; for(ExerciseFault fault:lstFaults){ answerU = new ExerciseItemAnswerU(); answerU.setAnswer(fault.getAnswer()); answerU.setCorrect(fault.getCorrect()); answerU.setExerciseItemId(fault.getExerciseItemId()); lstAnswers.add(answerU); } // 3.×é×°´ð°¸ ExerItemResponseData result = new ExerItemResponseData(); result.setAnswers(lstAnswers); result.setExerciseGroupId(groupId); return result; } /** * ²Ù×÷±¾´Î×öÌâ¼Ç¼ * groupId ϰÌâ×éID Èç¹ûΪAllʱ£¬±íʾȫ²¿´íÌ⡢ȫ²¿ÊÕ²Ø * @return */ @Override public Map doUpdateFaultExerRecordNew(String groupId) { if("All".equals(groupId)){//±íʾȫ²¿´íÌâÖØ×ö return doCleanAllFaultRecordByRedo(); } String hql="select r from ExerciseFaultRecord r,ExerciseFaultBook b where" + " r.resumeBookId=b.resumeBookId and r.exerciseGroupId=? and b.userId=? and b.classId=? and b.type=?"; ExerciseFaultRecord record = this.findUnique(hql, CollectionUtils.newList(groupId, ClientUtils.getUserId(), ClientUtils.getClassId(),ExerciseFaultBook.TYPE_ORGANIZATION), ExerciseFaultRecord.class); if(null == record){ return null; } record.setScore(BigDecimal.ZERO); record.setCompletionRate(BigDecimal.ZERO); record.setDoCount(BigInteger.ZERO); record.setCorrectCount(BigInteger.ZERO); record.setAccuracy(BigDecimal.ZERO); record.setTitleMaxNumber("0"); record.setStatus("0"); TraceUtils.setUpdateTrace(record); this.save(record); String faultRecordId = record.getFaultRecordId(); // ÖØÐÂ×öÌâ ÇåÀí¾ÉÊý¾Ý doOperExerciseFaultRecordByRedo(faultRecordId); // ¸üÐÂÈ«²¿ÊÕ²ØÌâÄ¿µÄÐÅÏ¢ this.doOperFaultBookBySubmitAllAnswer( null, null, record.getResumeBookId(),null); Map resultMap = new HashMap(3); resultMap.put(EXERCISE_RECORD_ID, faultRecordId); resultMap.put("exerciseGroupId", groupId); resultMap.put(UPDATE_TIME, DateTimeUtils.getCurrDateTime(record.getUpdateTime())); return resultMap; } /** * È«²¿´íÌâÖØ×ö * @return */ private Map doCleanAllFaultRecordByRedo(){ /** 1.¸üдíÌâbook¼Ç¼Ϊ³õʼֵ */ String hql_book = "from ExerciseFaultBook b where b.userId=? and b.classId=? and b.type=? "; ExerciseFaultBook book = this.findUnique(hql_book, CollectionUtils.newList(ClientUtils.getUserId(), ClientUtils.getClassId(),ExerciseFaultBook.TYPE_ORGANIZATION), ExerciseFaultBook.class); if(book == null){ return null; } book.setScore(BigDecimal.ZERO); book.setCompletionRate(BigDecimal.ZERO); book.setDoCount(BigInteger.ZERO); book.setCorrectCount(BigInteger.ZERO); book.setAccuracy(BigDecimal.ZERO); book.setTitleMaxNumber("0"); book.setStatus("0"); TraceUtils.setUpdateTrace(book); this.save(book); String resumeBookId = book.getResumeBookId(); BigDecimal decimalZero = BigDecimal.ZERO; BigInteger integerZero = BigInteger.ZERO; /** 2.¸üÐÂËùÓдíÌârecord¼Ç¼Ϊ³õʼֵ */ String hql_record = "update ExerciseFaultRecord t set t.score="+decimalZero+", t.completionRate="+decimalZero+", t.doCount="+integerZero+"," + " t.correctCount="+integerZero+", t.accuracy="+decimalZero+", t.titleMaxNumber='0', t.status='0'" + " where t.resumeBookId=? and t.deleteFlag is false"; this.bulkUpdateInLoop(hql_record, new String[]{resumeBookId}); /** 3.ÖØÐÂ×öÌâ ÇåÀíËùÓоÉÊý¾Ý */ // 3.1¸´ÖÆ´íÌâÊý¾Ýµ½ÀúÊ·±í String hql_fault = "from ExerciseFault where resumeBookId=? and answer is not null and deleteFlag is false"; doCopyExerciseFaultToHis(hql_fault,resumeBookId); // 3.2Çå¿Õ´íÌâ×öÌâ¼Ç¼ String hql_delFault = "update ExerciseFault t set t.answer=null,t.correct=0" + " where t.resumeBookId=? and t.answer is not null and t.deleteFlag is false"; this.bulkUpdateInLoop(hql_delFault, new String[]{resumeBookId}); /** 4.·µ»Ø½á¹û */ Map resultMap = new HashMap(3); resultMap.put(EXERCISE_RECORD_ID, null); resultMap.put("exerciseGroupId", "All"); resultMap.put(UPDATE_TIME, book.getUpdateTime()); return resultMap; } /** * ÖØÐÂ×öÌâ ÇåÀí¾ÉÊý¾Ý * @param faultRecordId * @return */ public Result doOperExerciseFaultRecordByRedo(String faultRecordId){ // 1.¿½±´×öÌâ¼Ç¼µ½´íÌâ´ð°¸ÀúÊ·±í String hql = "from ExerciseFault where faultRecordId=? and answer is not null and deleteFlag is false"; doCopyExerciseFaultToHis(hql, faultRecordId); // 2.ɾ³ý×öÌâ¼Ç¼ deleteExerciseFaultRecord(faultRecordId); return new Result(true); } /** * ¿½±´×öÌâ¼Ç¼µ½´íÌâ´ð°¸ÀúÊ·±í * @param faultRecordId/resumeBookId * @return */ public Result doCopyExerciseFaultToHis(String hql,String recordId){ List lstFault = this.find(hql, CollectionUtils.newList(recordId), ExerciseFault.class); // ´íÌâÀúÊ·¼Ç¼±í List lstFaultHis = new ArrayList(lstFault.size()); ExerciseFaultHis his = null; for(ExerciseFault fault:lstFault){ his = new ExerciseFaultHis(); BeanUtils.copyProperties(fault, his); his.setUpdateTime(new Date(System.currentTimeMillis())); lstFaultHis.add(his); } this.saveOrUpdateAll(lstFaultHis); return new Result(true); } /** * ÅúÁ¿„h³ý´íÌâ×öÌâ¼Ç¼ * @param faultRecordId * @return */ public Result deleteExerciseFaultRecord(String faultRecordId){ String hql = "update ExerciseFault t set t.answer=null,t.correct=0" + " where t.faultRecordId=? and t.answer is not null and t.deleteFlag is false"; Result result = this.bulkUpdateInLoop(hql, new String[]{faultRecordId}); this.flush(); return result; } /** * ÅúÁ¿„h³ý´íÌâ×öÌâ¼Ç¼ * @param faultRecordId * @return */ public Result deleteExerciseFavorRecord(String favorRecordId){ String hql = "update ExerciseFavorite t set t.answer=null,t.correct=0" + " where t.favoriteRecordId=? and t.deleteFlag is false"; Result result = this.bulkUpdateInLoop(hql, new String[]{favorRecordId}); this.flush(); return result; } /** * ²Ù×÷±¾´Î×öÌâ¼Ç¼ ÊÕ²Ø * @return */ @Override public Map doUpdateFavortExerRecordNew(String groupId) { if("All".equals(groupId)){//±íʾȫ²¿ÊÕ²ØÖØ×ö return doCleanAllFavorRecordByRedo(); } String hql="select r from ExerciseFavoriteRecord r,ExerciseFavoriteBook b where" + " r.favoriteBookId=b.favoriteBookId and r.exerciseGroupId=? and b.userId=? and b.classId=? "; ExerciseFavoriteRecord record = this.findUnique(hql, CollectionUtils.newList(groupId, ClientUtils.getUserId(), ClientUtils.getClassId()), ExerciseFavoriteRecord.class); if(null == record){ return null; } record.setScore(BigDecimal.ZERO); record.setCompletionRate(BigDecimal.ZERO); record.setDoCount(BigInteger.ZERO); record.setCorrectCount(BigInteger.ZERO); record.setAccuracy(BigDecimal.ZERO); record.setTitleMaxNumber("0"); record.setStatus("0"); TraceUtils.setUpdateTrace(record); this.save(record); String favoriteRecordId = record.getFavoriteRecordId(); // ÖØÐ¿ªÊ¼×öÌâ ÇåÀí¾ÉÊý¾Ý doOperExerciseFavorRecordByRedo(favoriteRecordId); // ¸üÐÂÈ«²¿ÊÕ²ØÌâÄ¿µÄͳ¼ÆÐÅÏ¢ this.doOperFavorBookBySubmitAllAnswer(null, null, record.getFavoriteBookId(),null); Map resultMap = new HashMap(3); resultMap.put(EXERCISE_RECORD_ID, favoriteRecordId); resultMap.put(UPDATE_TIME, DateTimeUtils.getCurrDateTime(record.getUpdateTime())); return resultMap; } /** * È«²¿ÊÕ²ØÖØ×ö * @return */ private Map doCleanAllFavorRecordByRedo(){ /** 1.¸üÐÂÊÕ²Øbook¼Ç¼Ϊ³õʼֵ */ String hql_book = "from ExerciseFavoriteBook b where b.userId=? and b.classId=? and b.type=? "; ExerciseFavoriteBook book = this.findUnique(hql_book, CollectionUtils.newList(ClientUtils.getUserId(), ClientUtils.getClassId(),ExerciseFaultBook.TYPE_ORGANIZATION), ExerciseFavoriteBook.class); if(book == null){ return null; } book.setScore(BigDecimal.ZERO); book.setCompletionRate(BigDecimal.ZERO); book.setDoCount(BigInteger.ZERO); book.setCorrectCount(BigInteger.ZERO); book.setAccuracy(BigDecimal.ZERO); book.setTitleMaxNumber("0"); book.setStatus("0"); TraceUtils.setUpdateTrace(book); this.save(book); String favoriteBookId = book.getFavoriteBookId(); BigDecimal decimalZero = BigDecimal.ZERO; BigInteger integerZero = BigInteger.ZERO; /** 2.¸üÐÂËùÓÐÊÕ²Ørecord¼Ç¼Ϊ³õʼֵ */ String hql_record = "update ExerciseFavoriteRecord t set t.score="+decimalZero+", t.completionRate="+decimalZero+", t.doCount="+integerZero+"," + " t.correctCount="+integerZero+", t.accuracy="+decimalZero+", t.titleMaxNumber='0', t.status='0'" + " where t.favoriteBookId=? and t.deleteFlag is false"; this.bulkUpdateInLoop(hql_record, new String[]{favoriteBookId}); /** 3.ÖØÐÂ×öÌâ ÇåÀíËùÓоÉÊý¾Ý */ // 3.1¸´ÖÆÊÕ²ØÊý¾Ýµ½ÀúÊ·±í String hql_favor = "from ExerciseFavorite where favoriteBookId=? and answer is not null and deleteFlag is false"; doCopyExerciseFavorToHis(hql_favor,favoriteBookId); // 3.2Çå¿ÕÊÕ²Ø×öÌâ¼Ç¼ String hql_delFavor = "update ExerciseFavorite t set t.answer=null,t.correct=0" + " where t.favoriteBookId=? and t.answer is not null and t.deleteFlag is false"; this.bulkUpdateInLoop(hql_delFavor, new String[]{favoriteBookId}); /** 4.·µ»Ø½á¹û */ Map resultMap = new HashMap(3); resultMap.put(EXERCISE_RECORD_ID, null); resultMap.put("exerciseGroupId", "All"); resultMap.put(UPDATE_TIME, book.getUpdateTime()); return resultMap; } /** * ÖØÐ¿ªÊ¼×öÌâ ÇåÀí¾ÉÊý¾Ý * @param favoriteRecordId * @return */ public Result doOperExerciseFavorRecordByRedo(String favoriteRecordId){ // 1.¿½±´×öÌâ¼Ç¼µ½Êղشð°¸ÀúÊ·±í String hql = "from ExerciseFavorite where favoriteRecordId=? and answer is not null and deleteFlag is false"; doCopyExerciseFavorToHis(hql, favoriteRecordId); // 2.ɾ³ý×öÌâ¼Ç¼ deleteExerciseFavorRecord(favoriteRecordId); return new Result(true); } /** * ¿½±´×öÌâ¼Ç¼µ½Êղشð°¸ÀúÊ·±í * @param faultRecordId/favoriteBookId * @return */ public Result doCopyExerciseFavorToHis(String hql, String recordId){ List lstFavor = this.find(hql, CollectionUtils.newList(recordId), ExerciseFavorite.class); // ´íÌâÀúÊ·¼Ç¼±í List lstFavorHis = new ArrayList(lstFavor.size()); ExerciseFavoriteHis his = null; for(ExerciseFavorite favor:lstFavor){ his = new ExerciseFavoriteHis(); BeanUtils.copyProperties(favor, his); his.setUpdateTime(new Date(System.currentTimeMillis())); lstFavorHis.add(his); } this.saveOrUpdateAll(lstFavorHis); return new Result(true); } /** * ²éѯÌâĿͳ¼Æ·ÖÎö½á¹û ¸öÈËͳ¼Æ ȫվͳ¼Æ * @param exerciseType * @return */ @Override public List> queryExerciseItemStatisics(String exerciseType) { // ÌâÄ¿¸öÈËͳ¼Æ String hql_analisisU = ""; // ÌâĿȫվͳ¼Æ String hql_analisis = ""; // ÌâÄ¿ String hql_item = ""; if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// ´íÌâ±¾ hql_analisisU = "select a from ExerciseItemAnalisiU a,ExerciseFault re" + " where a.exerciseItemId=re.exerciseItemId " + " and a.userId=? and re.faultBook.userId=? and re.faultBook.classId=?" + " and a.deleteFlag is false and re.deleteFlag is false "; hql_analisis = "select a from ExerciseItemAnalisi a, ExerciseFault re" + " where a.exerciseItemId=re.exerciseItemId " + " and re.faultBook.userId=? and re.faultBook.classId=?" + " and a.deleteFlag is false and re.deleteFlag is false "; hql_item = "select re.exerciseItemId from ExerciseFault re" + " where re.faultBook.userId=? and re.faultBook.classId=? " + " and re.deleteFlag is false order by re.createTime"; }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// ÊÕ²Ø hql_analisisU = "select a from ExerciseItemAnalisiU a,ExerciseFavorite re" + " where a.exerciseItemId=re.exerciseItemId " + " and a.userId=? and re.favorBook.userId=? and re.favorBook.classId=?" + " and a.deleteFlag is false and re.deleteFlag is false "; hql_analisis = "select a from ExerciseItemAnalisi a, ExerciseFavorite re" + " where a.exerciseItemId=re.exerciseItemId " + " and re.favorBook.userId=? and re.favorBook.classId=?" + " and a.deleteFlag is false and re.deleteFlag is false "; hql_item = "select re.exerciseItemId from ExerciseFavorite re" + " where re.favorBook.userId=? and re.favorBook.classId=? " + " and re.deleteFlag is false order by re.createTime"; } List> resultLst = this.doQueryExerciseItemStatisicsData(hql_analisisU, hql_analisis, hql_item); return resultLst; } /** * ²éѯ´íÌâÌâĿͳ¼Æ * @return */ private List> doQueryExerciseItemStatisicsData(String hql_analisisU, String hql_analisis, String hql_item) { // 1.²éѯ¸öÈËͳ¼Æ List lstAnalisiU = this.find(hql_analisisU, CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseItemAnalisiU.class); Map anasisUMap = new HashMap(lstAnalisiU.size()); for(ExerciseItemAnalisiU analisisU:lstAnalisiU){ anasisUMap.put(analisisU.getExerciseItemId(), analisisU); } // 2.²éѯȫվͳ¼Æ List lstAnalisi = this.find(hql_analisis, CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId()), ExerciseItemAnalisi.class); Map anasisMap = new HashMap(lstAnalisi.size()); for(ExerciseItemAnalisi analisi:lstAnalisi){ anasisMap.put(analisi.getExerciseItemId(), analisi); } if(lstAnalisiU.isEmpty() && lstAnalisi.isEmpty()){ return null; } // 3.²éѯ´Ë×éËùÓÐÌâÄ¿ List lstItemIds = this.find(hql_item, CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId()), String.class); List> lstResult = new ArrayList>(lstItemIds.size()); Map resultMap = null; ExerciseItemAnalisi analisis; ExerciseItemAnalisiU analisisU; // 3.×é×°½á¹û // Ñ­»µ×éËùÓÐÌâÄ¿ for(String exerciseItemId:lstItemIds){ // ½á¹ûmap resultMap = new HashMap(10); // 1.¸öÈË·ÖÎö½á¹û analisisU = anasisUMap.get(exerciseItemId); // 2.ȫվ·ÖÎö½á¹û analisis = anasisMap.get(exerciseItemId); resultMap.put("exerciseId", exerciseItemId); // 3.¸öÈËͳ¼Æ if(null == analisisU){// Ϊ¿Õ resultMap.put("doAll_u", 0); resultMap.put("doError_u", 0); resultMap.put("doAccuracy_u", 0); }else{ resultMap.put("doAll_u", analisisU.getSubmitNumber()); resultMap.put("doError_u", analisisU.getSubmitNumber().subtract(analisisU.getSubmitCorrectNumber())); resultMap.put("doAccuracy_u", analisisU.getAccuracy()); } // 4.ȫվͳ¼Æ if(null == analisis){// Ϊ¿Õ resultMap.put("doAll", 0); resultMap.put("doAccuracy", 0); }else{ resultMap.put("doAll", analisis.getSubmitNumber()); resultMap.put("doAccuracy", analisis.getAccuracy()); } lstResult.add(resultMap); } return lstResult; } /** * ¸üдíÌâbookÐÅÏ¢ * @param faultBookId * @return */ @SuppressWarnings("unchecked") private void updateExerciseFaultBookInfo(ExerciseFaultBook book){ String sql = "SELECT"+ " count(1) allCount,"+ " sum(CORRECT = 1) corrCount,"+ " sum(ANSWER IS NOT NULL) doCount,"+ " round(sum(CORRECT = 1) / count(1) * 100,2) accuracy,"+ " round(sum(ANSWER IS NOT NULL) / count(1) * 100,2) rate"+ " FROM exercise_fault"+ " WHERE DELETE_FLAG = 0"+ " AND RESUME_BOOK_ID = ?"; List lstFault = this.findBySql(sql, CollectionUtils.newList(book.getResumeBookId())); Object[] objs = lstFault.get(0); book.setAllCount((BigInteger)objs[0]); book.setCorrectCount(new BigInteger(String.valueOf(objs[1]==null ? "0" : objs[1]))); book.setDoCount(new BigInteger(String.valueOf(objs[2]==null ? "0" : objs[2]))); book.setAccuracy(new BigDecimal(String.valueOf(objs[3]==null ? "0" : objs[3]))); book.setCompletionRate(new BigDecimal(String.valueOf(objs[4]==null ? "0" : objs[4]))); book.setScore(book.getAccuracy()); } /** * ¸üдíÌâbookÐÅÏ¢ byÌύȫ²¿´íÌâ´ð°¸ * @param currTitleNum * @param status * @return */ @Override public Result doOperFaultBookBySubmitAllAnswer(String currTitleNum, String status,String faultBookId, String exerciseType) { ExerciseFaultBook book = null; if(StringUtils.isBlank(faultBookId)){// ÊÇ·ñÈ«²¿´íÌâ ½ö½öÌá½»²Ù×÷ if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType) && ExerciseRecord.STATUS_SUBMIT.equals(status)){// È«²¿´íÌâ½öÌá½»´ð°¸ book = this.findUnique("from ExerciseFaultBook where classId=? and userId=? and type=? and deleteFlag is false ", CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId(),ExerciseFaultBook.TYPE_ORGANIZATION), ExerciseFaultBook.class); }else{ return new Result(false); } }else{// »ìºÏÌá½» book = this.read(ExerciseFaultBook.class, faultBookId); if(book == null){ return new Result(false); } } // ¸üÐÂbookÐÅÏ¢ this.updateExerciseFaultBookInfo(book); if(StringUtils.isNotBlank(currTitleNum)){ book.setTitleMaxNumber(currTitleNum); } if(StringUtils.isNotBlank(status)){ book.setStatus("1".equals(status)?"1":"0");// 1£ºÌá½» 0£ºÎ´Ìá½» if("1".equals(status)){// È«²¿´íÌâÌá½»´ð°¸Ê± ¶ÔÓ¦µÄrecordÒ²¸ÄΪÌύ״̬ /** ¸üÐÂËùÓдíÌârecord¼Ç¼ΪÌύ״̬ */ String hql_record = "update ExerciseFaultRecord t set t.status='1'" + " where t.resumeBookId=? and t.deleteFlag is false"; this.bulkUpdateInLoop(hql_record, new String[]{book.getResumeBookId()}); } } TraceUtils.setUpdateTrace(book); this.save(book); return new Result(true); } /** * ¸üÐÂÊÕ²ØbookÐÅÏ¢ * @param faultBookId * @return */ @SuppressWarnings("unchecked") private void updateExerciseFavorBookInfo(ExerciseFavoriteBook book){ String sql = "SELECT"+ " count(1) allCount,"+ " sum(CORRECT = 1) corrCount,"+ " sum(ANSWER IS NOT NULL) doCount,"+ " round(sum(CORRECT = 1) / count(1) * 100,2) accuracy,"+ " round(sum(ANSWER IS NOT NULL) / count(1) * 100,2) rate"+ " FROM exercise_favorite"+ " WHERE DELETE_FLAG = 0"+ " AND FAVORITE_BOOK_ID = ?"; List lstFault = this.findBySql(sql, CollectionUtils.newList(book.getFavoriteBookId())); Object[] objs = lstFault.get(0); book.setAllCount((BigInteger)objs[0]); book.setCorrectCount(new BigInteger(String.valueOf(objs[1]==null ? "0" : objs[1]))); book.setDoCount(new BigInteger(String.valueOf(objs[2]==null ? "0" : objs[2]))); book.setAccuracy(new BigDecimal(String.valueOf(objs[3]==null ? "0" : objs[3]))); book.setCompletionRate(new BigDecimal(String.valueOf(objs[4]==null ? "0" : objs[4]))); book.setScore(book.getAccuracy()); } /** * ¸üÐÂÊÕ²ØbookÐÅÏ¢ byÌύȫ²¿Êղش𰸠* @param currTitleNum * @param status * @return */ @Override public Result doOperFavorBookBySubmitAllAnswer(String currTitleNum, String status,String favoriteBookId, String exerciseType) { ExerciseFavoriteBook book = null; if(StringUtils.isBlank(favoriteBookId)){// ÊÇ·ñÈ«²¿ÊÕ²Ø ½ö½öÌá½»²Ù×÷ if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType) && ExerciseRecord.STATUS_SUBMIT.equals(status)){// È«²¿´íÌâ½öÌá½»´ð°¸ book = this.findUnique("from ExerciseFavoriteBook where classId=? and userId=? and type=? and deleteFlag is false ", CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId(),ExerciseFaultBook.TYPE_ORGANIZATION), ExerciseFavoriteBook.class); }else{ return new Result(false); } }else{// »ìºÏÌá½» book = this.read(ExerciseFavoriteBook.class, favoriteBookId); if(book == null){ return new Result(false); } } // ¸üÐÂÊÕ²ØbookÐÅÏ¢ this.updateExerciseFavorBookInfo(book); if(StringUtils.isNotBlank(currTitleNum)){ book.setTitleMaxNumber(currTitleNum); } if(StringUtils.isNotBlank(status)){ book.setStatus("1".equals(status)?"1":"0");// 1£ºÌá½» 0£ºÎ´Ìá½» if("1".equals(status)){// È«²¿ÊÕ²ØÌá½»´ð°¸Ê± ¶ÔÓ¦µÄrecordÒ²¸ÄΪÌύ״̬ /** ¸üÐÂËùÓÐÊÕ²Ørecord¼Ç¼ΪÌύ״̬ */ String hql_record = "update ExerciseFavoriteRecord t set t.status='1'" + " where t.favoriteBookId=? and t.deleteFlag is false"; this.bulkUpdateInLoop(hql_record, new String[]{book.getFavoriteBookId()}); } } TraceUtils.setUpdateTrace(book); this.save(book); return new Result(true); } /** * ²éѯ´íÌâ±¾bookÐÅÏ¢ */ @Override public Map queryExerFaultInfo() { String hql = "from ExerciseFaultBook where classId=? and userId=? and type=? and deleteFlag is false "; ExerciseFaultBook book = this.findUnique(hql, CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId(), ExerciseFaultBook.TYPE_ORGANIZATION), ExerciseFaultBook.class); Map map = new HashMap(5); if(book == null){ map.put("allCount", 0); map.put("doCount", 0); map.put(UPDATE_TIME, null); map.put("currTitleNum", "0"); map.put("status", "0"); return map; } map.put("allCount", book.getAllCount()); map.put("doCount", book.getDoCount()); map.put(UPDATE_TIME, book.getUpdateTime()); map.put("currTitleNum", StringUtils.isBlank(book.getTitleMaxNumber()) ? "0" :book.getTitleMaxNumber()); map.put("status", StringUtils.isBlank(book.getStatus()) ? "0" :book.getStatus()); return map; } /** * ²éѯÊղر¾bookÐÅÏ¢ */ @Override public Map queryExerFavorInfo() { String hql = "from ExerciseFavoriteBook where classId=? and userId=? and type=? and deleteFlag is false "; ExerciseFavoriteBook book = this.findUnique(hql, CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId(), ExerciseFavoriteBook.TYPE_ORGANIZATION), ExerciseFavoriteBook.class); Map map = new HashMap(5); if(book == null){ map.put("allCount", 0); map.put("doCount", 0); map.put(UPDATE_TIME, null); map.put("currTitleNum", "0"); map.put("status", "0"); return map; } map.put("allCount", book.getAllCount()); map.put("doCount", book.getDoCount()); map.put(UPDATE_TIME, book.getUpdateTime()); map.put("currTitleNum", StringUtils.isBlank(book.getTitleMaxNumber()) ? "0" :book.getTitleMaxNumber()); map.put("status", StringUtils.isBlank(book.getStatus()) ? "0" :book.getStatus()); return map; } /** * ¼ÆËãÓû§Ã¿Ìì×ö´íÌâµÄͳ¼ÆÐÅÏ¢ */ @SuppressWarnings("unchecked") @Override public Result doCalcExerFaultStatisticsByDay(){ log.info("---------------¶¨Ê±Æ÷ ¿ªÊ¼Í³¼Æ×öÌâ´íÌâͳ¼ÆÐÅÏ¢-----------start ------------------"); // 1.¼ÆËãǰһÌì ¶ÔÓ¦×öÌâÈ˵Ä×öÌâÐÅÏ¢ String sql = "SELECT" + " r.CLASS_ID," + " t.USER_ID," + " count(1) doCount," + " sum(t.CORRECT = 0) faultCount," + " r.ORG_ID," + " r.COLLEGE_COURSE_ID," + " r.SUBJECT_ID" + " FROM" + " exercise_item_answer_u t," + " exercise_record r" + " WHERE" + " t.EXERCISE_RECORD_ID = r.RECORD_ID" + " AND t.UPDATE_TIME >= ?" + " AND t.UPDATE_TIME < ?" + " AND t.DELETE_FLAG = 0" + " AND r.DELETE_FLAG = 0" + " GROUP BY" + " r.CLASS_ID," + " t.USER_ID"; String yesterday = DateUtils.getTheDay(-1); List resultlst = this.findBySql(sql, CollectionUtils.newList(yesterday, DateUtils.getToday())); // 2.´íÌâÐÅÏ¢¼Ç¼±í List statisLst = new ArrayList(resultlst.size()); ExerciseFaultStatistics faultStatis = null; for(Object[] objs:resultlst){ faultStatis = new ExerciseFaultStatistics(); faultStatis.setClassId(String.valueOf(objs[0])); faultStatis.setUserId(String.valueOf(objs[1])); faultStatis.setDoCount(new BigInteger(String.valueOf(objs[2]))); faultStatis.setFaultCount(new BigInteger(String.valueOf(objs[3]))); faultStatis.setFaultRate( ExerciseUtils.parseStrToBigDecimal(String.valueOf(objs[3]), String.valueOf(objs[2]))); faultStatis.setOrgId(String.valueOf(objs[4])); faultStatis.setCollegeCourseId(String.valueOf(objs[5])); faultStatis.setSubjectId(String.valueOf(objs[6])); faultStatis.setExerciseTime(DateTimeUtils.stringConvertTS(yesterday)); TraceUtils.setCreateTrace(faultStatis); statisLst.add(faultStatis); } this.saveOrUpdateAll(statisLst); log.info("---------------¶¨Ê±Æ÷ ¿ªÊ¼Í³¼Æ×öÌâ´íÌâͳ¼ÆÐÅÏ¢-----------end ------------------"); return new Result(true, "²Ù×÷³É¹¦,ͳ¼Æ¼Ç¼×ÜÌõÊý£º"+statisLst.size()); } /** * ²éѯ´íÌâͳ¼ÆÐÅÏ¢ * @param type: week ×î½üÒ»ÖÜ month:×î½üÒ»Ô year£º×î½üÒ»Äê * @return */ @Override public List> doGetFaultStatisInfo(String type) { try { // ¿ªÊ¼Ê±¼ä String startDate = ""; // ½áÊøÊ±¼ä ½ñÌì String endDate = DateUtils.getToday(); if("week".equals(type)){// ×î½üÒ»ÖÜ 7Ììǰµ½½ñÌì ²»°üº¬½ñÌì startDate= DateUtils.getTheDay(-7); }else if("month".equals(type)){// ×î½üÒ»Ô 30Ììǰµ½½ñÌì ²»°üº¬½ñÌì startDate= DateUtils.getTheDay(-30); }else if("year".equals(type)){// ×î½üÒ»Äê 365Ììǰµ½½ñÌì ²»°üº¬½ñÌì startDate= DateUtils.getTheDay(-365); } String hql = "select exerciseTime,doCount,faultCount,faultRate" + " from ExerciseFaultStatistics where deleteFlag is false " + " and userId=? and classId=?" + " and exerciseTime >=? and exerciseTime<=?" + " order by exerciseTime"; // ²éѯ½á¹û List statisLst = this.findwithRawResult(hql, CollectionUtils.newList(ClientUtils.getUserId(),ClientUtils.getClassId(), DateUtils.convertStringToDate(startDate, "yyyy-MM-dd"), DateUtils.convertStringToDate(endDate, "yyyy-MM-dd"))); Map resultMap = null; List> resultLst = new ArrayList>(statisLst.size()); if(statisLst.isEmpty()){ return resultLst; } for(Object[] objs:statisLst){ resultMap = new HashMap(4); resultMap.put("exerciseTime", objs[0]); resultMap.put("doCount", objs[1]); resultMap.put("faultCount", objs[2]); resultMap.put("faultRate", objs[3]); resultLst.add(resultMap); } return resultLst; } catch (ParseException e) { log.error("²éѯ´íÌâÈÝ´íÂʽӿÚÒì³£", e); } return null; } /** * ²Ù×÷±¾´Î×öÌâ¼Ç¼ ´íÌâ * @return */ @Override public Result doUpdateExerciseFaultRecord(ExerciseFaultRecord record) { //TraceUtils.setUpdateTrace(record);²»¸üÐÂupdateTime this.save(record); return new Result(true); } /** * ²Ù×÷±¾´Î×öÌâ¼Ç¼ ÊÕ²Ø * @return */ @Override public Result doUpdateExerciseFavorRecord(ExerciseFavoriteRecord record) { //TraceUtils.setUpdateTrace(record); ²»¸üÐÂupdateTime this.save(record); return new Result(true); } /** * * ±£´æapp¶ËÇëÇó±£´æµÄÊý¾Ý * @return */ @Override public String doSaveExerciseDataSubmitLog(String data, String exerBussinessId, short type, int status, String url) { return exerciseVerService.doSaveExerciseDataSubmitLog(data, exerBussinessId, type, status, url); } @Override public Result doUpdateExerciseFaultBook(String currTitleNum) { // ²éѯ´ËÓû§ÊÇ·ñÓÐÊղؼǼ String hql = "from ExerciseFaultBook where classId=? and userId=? and deleteFlag is false "; List lstFault = this.find(hql, CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId()), ExerciseFaultBook.class); ExerciseFaultBook book = lstFault.get(0); book.setTitleMaxNumber(currTitleNum); this.save(book); return new Result(true); } @Override public Result doUpdateExerciseFavorBook(String currTitleNum) { // ²éѯ´ËÓû§ÊÇ·ñÓÐÊղؼǼ String hql = "from ExerciseFavoriteBook where classId=? and userId=? and deleteFlag is false "; List lstFavor = this.find(hql, CollectionUtils.newList(ClientUtils.getClassId(), ClientUtils.getUserId()), ExerciseFavoriteBook.class); ExerciseFavoriteBook book = lstFavor.get(0); book.setTitleMaxNumber(currTitleNum); this.save(book); return new Result(true); } /** *Ìá½»¶àÌ×Ìâ´ð°¸½á¹ûµ½db */ @Override public Map doSubmitMutiExerciseAnswerData(ExerciseSubmitAnswerDataList answerDataList) { // Óû§±¾´Î×öÌâÌá½»µÄÊý¾Ý List lstRecord = null; ExerciseSubmitAnswerData answerResult= null; List lstAnswers= null; Map resultMap = new HashMap(2); Map returnMap = null; resultMap.put("success", false); resultMap.put("attrs", null); lstRecord = answerDataList.getDatas(); List> resultList = new ArrayList>(lstRecord.size()); // ´íÌâ¡¢Êղر¾bookid String faultBookId = null; String favoriteBookId = null; for(int i=0; i resultMap = null; if(Constants.EXERCISE_TYPE_FAULT.equals(exerciseType)){// ´íÌâ±¾ // ¸üРÌá½»Á·Ï°´ð°¸ resultMap = this.doSubmitExerFaultAnswerDataNew(answerResult); if(null == resultMap){ return new Result(false,"Ìύʧ°Ü"); } // ͳ¼ÆÈ«²¿×öÌâÐÅÏ¢/ this.doOperFaultBookBySubmitAllAnswer(null,null,(String) resultMap.get("exerciseBookId"),null); }else if(Constants.EXERCISE_TYPE_FAVORT.equals(exerciseType)){// ÊÕ²Ø // ¸üРÌá½»Á·Ï°´ð°¸ resultMap = this.doSubmitExerFavorAnswerDataNew(answerResult); if(null == resultMap){ return new Result(false,"Ìύʧ°Ü"); } // ͳ¼ÆÈ«²¿×öÌâÐÅÏ¢/ this.doOperFavorBookBySubmitAllAnswer(null,null, (String) resultMap.get("exerciseBookId"),null); }else{ return new Result(false, "exerciseType´«Öµ´íÎó£ºexerciseType="+exerciseType); } // 3.·¢ËÍ ÌâÄ¿µÄȫվͳ¼Æ ¸öÈËͳ¼ÆÇëÇóÏûÏ¢ List lstAnswers= answerResult.getItems(); if(!lstAnswers.isEmpty()){ exerciseVerService.sendUpdateExerItemStatisticsMsg(answerResult.getExerciseGroupId(), answerResult); } result.setData(resultMap); result.setResult(true); return result; } /** * ³õʼ»¯´íÌâͳ¼ÆÊý¾Ý */ @SuppressWarnings("unchecked") @Override public Result doInitFaultStatisData() { log.info("---------------¶¨Ê±Æ÷ ¿ªÊ¼Í³¼Æ×öÌâ´íÌâͳ¼ÆÐÅÏ¢-----------start ------------------"); // 1.¼ÆËãǰһÌì ¶ÔÓ¦×öÌâÈ˵Ä×öÌâÐÅÏ¢ String sql = "SELECT" + " r.CLASS_ID," + " t.USER_ID," + " count(1) doCount," + " sum(t.CORRECT = 0) faultCount," + " r.ORG_ID," + " r.COLLEGE_COURSE_ID," + " r.SUBJECT_ID," + " r.UPDATE_TIME" + " FROM" + " exercise_item_answer_u t," + " exercise_record r" + " WHERE" + " t.EXERCISE_RECORD_ID = r.RECORD_ID" + " AND t.UPDATE_TIME < ?" + " AND t.DELETE_FLAG = 0" + " AND r.DELETE_FLAG = 0" + " GROUP BY" + " r.CLASS_ID," + " t.USER_ID," + " r.UPDATE_TIME"; String yesterday = DateUtils.getTheDay(-1); List resultlst = this.findBySql(sql, CollectionUtils.newList(yesterday)); // 2.´íÌâÐÅÏ¢¼Ç¼±í List statisLst = new ArrayList(resultlst.size()); ExerciseFaultStatistics faultStatis = null; for(Object[] objs:resultlst){ faultStatis = new ExerciseFaultStatistics(); faultStatis.setClassId(String.valueOf(objs[0])); faultStatis.setUserId(String.valueOf(objs[1])); faultStatis.setDoCount(new BigInteger(String.valueOf(objs[2]))); faultStatis.setFaultCount(new BigInteger(String.valueOf(objs[3]))); faultStatis.setFaultRate( ExerciseUtils.parseStrToBigDecimal(String.valueOf(objs[3]), String.valueOf(objs[2]))); faultStatis.setOrgId(String.valueOf(objs[4])); faultStatis.setCollegeCourseId(String.valueOf(objs[5])); faultStatis.setSubjectId(String.valueOf(objs[6])); faultStatis.setExerciseTime((Date)(objs[7])); TraceUtils.setCreateTrace(faultStatis); statisLst.add(faultStatis); } this.saveOrUpdateAll(statisLst); log.info("---------------¶¨Ê±Æ÷ ¿ªÊ¼Í³¼Æ×öÌâ´íÌâͳ¼ÆÐÅÏ¢-----------end ------------------"); return new Result(true, "²Ù×÷³É¹¦,ͳ¼Æ¼Ç¼×ÜÌõÊý£º"+statisLst.size()); } @Override public Result doUpdateExerciseDataSubmitLog(String exerciseDataLogId, String exerBussinessId) { return exerciseVerService.doUpdateExerciseDataSubmitLog(exerciseDataLogId, exerBussinessId); } /** -----------------------APP----V2.0--end---------------------------------------- */ /*@SuppressWarnings("unchecked") @Override public Result doInitExerRecentRecord() { String sql = " select r.RECORD_ID," +" r.EXERCISE_GROUP_ID," +" r.CLASS_ID," +" r.USER_ID," +" r.COLLEGE_COURSE_ID," +" r.ORG_ID," +" r.SUBJECT_ID," +" r.CREATE_TIME," +" r.CREATE_ID," +" r.CREATOR," +" r.UPDATE_ID," +" r.UPDATE_TIME," +" r.UPDATOR" +" from exercise_record r, " +" (" +" select max(UPDATE_TIME) uptime,t.USER_ID,t.EXERCISE_GROUP_ID " +" from exercise_record t " +" group by t.USER_ID,t.EXERCISE_GROUP_ID) tmp" +" where r.EXERCISE_GROUP_ID=tmp.EXERCISE_GROUP_ID " +" and r.USER_ID=tmp.USER_ID " +" and r.UPDATE_TIME=tmp.uptime" +" and not EXISTS" +" (select 1 from exercise_recent_record re" +" where re.EXERCISE_RECORD_ID=r.RECORD_ID)"; List lstData =this.findBySql(sql, new ArrayList()); if(lstData.isEmpty()){ return new Result(false,"×î½ü×öÌâ¼Ç¼Êý¾ÝΪ¿Õ"); } List lstRecord = new ArrayList(lstData.size()); ExerciseRecentRecord record=null; for(Object[] objs:lstData){ record = new ExerciseRecentRecord(); record.setExerciseRecordId(String.valueOf(objs[0])); record.setExerciseGroupId(String.valueOf(objs[1])); record.setClassId(objs[2]==null?null:String.valueOf(objs[2])); record.setUserId(String.valueOf(objs[3])); record.setCollegeCourseId(objs[4]==null?null:String.valueOf(objs[4])); record.setOrgId(objs[5]==null?null:String.valueOf(objs[5])); record.setSubjectId(objs[6]==null?null:String.valueOf(objs[6])); record.setCreateTime((Date)(objs[7])); record.setCreateId(String.valueOf(objs[8])); record.setCreator(String.valueOf(objs[9])); record.setDeleteFlag(false); TraceUtils.setUpdateTrace(record); lstRecord.add(record); } this.saveOrUpdateAll(lstRecord); return new Result(true,"´Ë´Î²åÈëExerciseRecentRecordÌõÊý£º"+lstRecord.size()); } @SuppressWarnings({ "unchecked" }) @Override public Result doInitFaultRecord() { String sql = "select b.USER_ID,re.EXERCISE_GROUP_ID,g.TYPE,g.ALL_COUNT,count(1),b.RESUME_BOOK_ID,b.TITLE_MAX_NUMBER," +" (select count(1) from exercise_fault t where t.EXERCISE_FAULT_ID=f.EXERCISE_FAULT_ID and t.CORRECT=1 ) correctCount," +" (select count(1) from exercise_fault t where t.EXERCISE_FAULT_ID=f.EXERCISE_FAULT_ID and t.answer is not null ) doCount," + " b.UPDATE_ID,b.UPDATE_TIME,b.UPDATOR,b.CREATE_ID,b.CREATE_TIME,b.CREATOR" +" from exercise_fault f,exercise_group_item_re re,exercise_fault_book b,exercise_group g" +" where f.EXERCISE_ITEM_ID =re.EXERCISE_ITEM_ID" +" and f.RESUME_BOOK_ID=b.RESUME_BOOK_ID" +" and re.EXERCISE_GROUP_ID=g.GROUP_ID" +" and (f.FAULT_RECORD_ID is null or f.FAULT_RECORD_ID='') " +" group by b.USER_ID,re.EXERCISE_GROUP_ID"; List lstData =this.findBySql(sql, new ArrayList()); if(lstData.isEmpty()){ return new Result(false,"´íÌâÊý¾ÝΪ¿Õ,±¾´ÎûÓÐÐèÒª¸üеĴíÌâÊý¾Ý"); } String hql_existRecord = "from ExerciseFaultRecord where resumeBookId=? and exerciseGroupId=? "; List lstRecord = new ArrayList(lstData.size()); ExerciseFaultRecord record=null; BigInteger allCount; for(Object[] objs:lstData){ if(!this.find(hql_existRecord, CollectionUtils.newList(String.valueOf(objs[5]),String.valueOf(objs[1])), ExerciseFaultRecord.class).isEmpty()){ continue; } record = new ExerciseFaultRecord(); allCount = (BigInteger)objs[4]; if(allCount.compareTo(BigInteger.ZERO) == 0){ continue; } record.setResumeBookId(String.valueOf(objs[5])); record.setExerciseGroupId(String.valueOf(objs[1])); record.setExerciseGroupType((short)objs[2]); record.setAllCount(allCount); record.setDoCount(new BigInteger(String.valueOf(objs[8]==null ? 0 :objs[8]))); record.setCorrectCount(new BigInteger(String.valueOf(objs[7]==null ? 0 :objs[7]))); record.setCompletionRate(new BigDecimal(CommonUtils.formatDecimalFormat( record.getDoCount().doubleValue()/allCount.doubleValue()*100, CommonUtils.PARTEN_TWO))); record.setAccuracy(new BigDecimal(CommonUtils.formatDecimalFormat( record.getCorrectCount().doubleValue()/allCount.doubleValue()*100, CommonUtils.PARTEN_TWO))); record.setScore(record.getAccuracy()); record.setStatus("0"); record.setTitleMaxNumber(objs[6]==null?null:String.valueOf(objs[6])); if(StringUtils.isNotBlank(record.getTitleMaxNumber()) && new BigInteger(record.getTitleMaxNumber()).compareTo(record.getAllCount())>0){ record.setTitleMaxNumber(String.valueOf(record.getAllCount())); } record.setCreateId(String.valueOf(objs[12])); record.setCreateTime((Date)(objs[13])); record.setCreator(String.valueOf(objs[14])); TraceUtils.setUpdateTrace(record); lstRecord.add(record); } this.saveOrUpdateAll(lstRecord); return new Result(true, "²åÈëExerciseFaultRecordÌõÊý£º"+lstRecord.size()); } @SuppressWarnings("unchecked") @Override public Result doInitFavorRecord() { String sql = " select b.USER_ID,re.EXERCISE_GROUP_ID,g.TYPE,g.ALL_COUNT,count(1),b.FAVORITE_BOOK_ID,b.TITLE_MAX_NUMBER," +" (select count(1) from exercise_favorite t where t.EXERCISE_FAVORITE_ID=f.EXERCISE_FAVORITE_ID and t.CORRECT=1 ) correctCount," +" (select count(1) from exercise_favorite t where t.EXERCISE_FAVORITE_ID=f.EXERCISE_FAVORITE_ID and t.answer is not null ) doCount," +" + b.UPDATE_ID,b.UPDATE_TIME,b.UPDATOR,b.CREATE_ID,b.CREATE_TIME,b.CREATOR" +" from exercise_favorite f,exercise_group_item_re re,exercise_favorite_book b,exercise_group g" +" where f.EXERCISE_ITEM_ID =re.EXERCISE_ITEM_ID" +" and f.FAVORITE_BOOK_ID=b.FAVORITE_BOOK_ID" +" and re.EXERCISE_GROUP_ID=g.GROUP_ID" +" and (f.FAVORITE_RECORD_ID is null or f.FAVORITE_RECORD_ID = '')" +" group by b.USER_ID,re.EXERCISE_GROUP_ID"; List lstData =this.findBySql(sql, new ArrayList()); if(lstData.isEmpty()){ return new Result(false,"ÊÕ²ØÊý¾ÝΪ¿Õ,±¾´ÎûÓÐÐèÒª¸üеÄÊÕ²ØÊý¾Ý"); } String hql_existRecord = "from ExerciseFavoriteRecord where favoriteBookId=? and exerciseGroupId=? "; List lstRecord = new ArrayList(lstData.size()); ExerciseFavoriteRecord record=null; BigInteger allCount; for(Object[] objs:lstData){ if(!this.find(hql_existRecord, CollectionUtils.newList(String.valueOf(objs[5]),String.valueOf(objs[1])), ExerciseFavoriteRecord.class).isEmpty()){ continue; } record = new ExerciseFavoriteRecord(); allCount = (BigInteger)objs[4]; if(allCount.compareTo(BigInteger.ZERO) == 0){ continue; } record.setFavoriteBookId(String.valueOf(objs[5])); record.setExerciseGroupId(String.valueOf(objs[1])); record.setExerciseGroupType((short)objs[2]); record.setAllCount(allCount); record.setDoCount(new BigInteger(String.valueOf(objs[8]==null ? 0 :objs[8]))); record.setCorrectCount(new BigInteger(String.valueOf(objs[7]==null ? 0 :objs[7]))); record.setCompletionRate(new BigDecimal(CommonUtils.formatDecimalFormat( record.getDoCount().doubleValue()/allCount.doubleValue()*100, CommonUtils.PARTEN_TWO))); record.setAccuracy(new BigDecimal(CommonUtils.formatDecimalFormat( record.getCorrectCount().doubleValue()/allCount.doubleValue()*100, CommonUtils.PARTEN_TWO))); record.setScore(record.getAccuracy()); record.setStatus("0"); record.setTitleMaxNumber(objs[6]==null?null:String.valueOf(objs[6])); if(record.getTitleMaxNumber() != null && new BigInteger(record.getTitleMaxNumber()).compareTo(record.getAllCount())>0){ record.setTitleMaxNumber(String.valueOf(record.getAllCount())); } record.setCreateId(String.valueOf(objs[12])); record.setCreateTime((Date)(objs[13])); record.setCreator(String.valueOf(objs[14])); TraceUtils.setUpdateTrace(record); lstRecord.add(record); } this.saveOrUpdateAll(lstRecord); return new Result(true,"²åÈëExerciseFavoriteRecordÌõÊý£º"+lstRecord.size()); } @Override public Result doInitFaultItem() { // 2. String sql2="select f,re.exerciseGroupId" +" from ExerciseFault f,ExerciseGroupItemRe re" +" where f.exerciseItemId=re.exerciseItemId" +" and (f.faultRecordId is null or f.faultRecordId='') order by f.exerciseFaultId"; List lstData2 =this.findwithRawResult(sql2, new ArrayList()); if(lstData2.isEmpty()){//Å×Òì³£»Ø¹ö return new Result(false,"´íÌâÊý¾ÝΪ¿Õ2222"); } String hql_existRecord = "from ExerciseFaultRecord where resumeBookId=? and exerciseGroupId=? "; List lstFaults = new ArrayList(lstData2.size()); ExerciseFault fault=null; ExerciseFault newFault=null; String exerciseFaultId=""; List lstRecord = null; for(Object[] objs:lstData2){ fault = (ExerciseFault)objs[0]; if(fault.getExerciseFaultId().equals(exerciseFaultId)){ newFault = new ExerciseFault(); BeanUtils.copyProperties(fault, newFault); newFault.setExerciseFaultId(null); lstRecord = this.find(hql_existRecord, CollectionUtils.newList(newFault.getResumeBookId(),String.valueOf(objs[1])), ExerciseFaultRecord.class); if(lstRecord.isEmpty()){ continue; } newFault.setFaultRecordId(lstRecord.get(0).getFaultRecordId()); TraceUtils.setUpdateTrace(newFault); lstFaults.add(newFault); }else{ lstRecord = this.find(hql_existRecord, CollectionUtils.newList(fault.getResumeBookId(),String.valueOf(objs[1])), ExerciseFaultRecord.class); if(lstRecord.isEmpty()){ continue; } fault.setFaultRecordId(lstRecord.get(0).getFaultRecordId()); TraceUtils.setUpdateTrace(fault); lstFaults.add(fault); } exerciseFaultId=fault.getExerciseFaultId(); } this.saveOrUpdateAll(lstFaults); return new Result(true, "¸üÐÂExerciseFaultÌõÊý£º"+lstFaults.size()); } @Override public Result doInitFavorItem() { // 2. String sql2="select f,re.exerciseGroupId" +" from ExerciseFavorite f,ExerciseGroupItemRe re" +" where f.exerciseItemId=re.exerciseItemId" +" and (f.favoriteRecordId is null or f.favoriteRecordId = '') order by f.exerciseFavoriteId"; List lstData2 =this.findwithRawResult(sql2, new ArrayList()); if(lstData2.isEmpty()){//Å×Òì³£»Ø¹ö return new Result(false,"ÊÕ²ØÊý¾ÝΪ¿Õ2222"); } String hql_existRecord = "from ExerciseFavoriteRecord where favoriteBookId=? and exerciseGroupId=? "; List lstRecord = null; List lstFavors = new ArrayList(lstData2.size()); ExerciseFavorite favor=null; ExerciseFavorite newFavor=null; String exerciseFavoriteId=""; for(Object[] objs:lstData2){ favor = (ExerciseFavorite)objs[0]; if(favor.getExerciseFavoriteId().equals(exerciseFavoriteId)){ newFavor = new ExerciseFavorite(); BeanUtils.copyProperties(favor, newFavor); newFavor.setExerciseFavoriteId(null); lstRecord = this.find(hql_existRecord, CollectionUtils.newList(newFavor.getFavoriteBookId(),String.valueOf(objs[1])), ExerciseFavoriteRecord.class); if(lstRecord.isEmpty()){ continue; } newFavor.setFavoriteRecordId(lstRecord.get(0).getFavoriteRecordId()); TraceUtils.setUpdateTrace(newFavor); lstFavors.add(newFavor); }else{ lstRecord = this.find(hql_existRecord, CollectionUtils.newList(favor.getFavoriteBookId(),String.valueOf(objs[1])), ExerciseFavoriteRecord.class); if(lstRecord.isEmpty()){ continue; } favor.setFavoriteRecordId(lstRecord.get(0).getFavoriteRecordId()); TraceUtils.setUpdateTrace(favor); lstFavors.add(favor); } exerciseFavoriteId = favor.getExerciseFavoriteId(); } this.saveOrUpdateAll(lstFavors); return new Result(true,"|¸üÐÂExerciseFavoriteÌõÊý£º"+lstFavors.size()); } @Override public Result doSavetoDB(Object obj) { this.save(obj); return new Result(true); }*/ }