package com.qxueyou.scc.evaluate.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.beanutils.BeanUtils; 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.querydsl.core.QueryResults; import com.querydsl.core.Tuple; import com.querydsl.core.types.Predicate; import com.qxueyou.scc.admin.classes.model.QClsClass; import com.qxueyou.scc.admin.classes.model.QClsClassReSubject; import com.qxueyou.scc.admin.teacher.service.ITeacherService; import com.qxueyou.scc.base.model.Pager; import com.qxueyou.scc.base.model.Result; import com.qxueyou.scc.base.model.ResultJson; 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.QueryDslOptionBuilder; import com.qxueyou.scc.base.util.TraceUtils; import com.qxueyou.scc.evaluate.dao.EvaluateRepository; import com.qxueyou.scc.evaluate.service.IEvaluateService; import com.qxueyou.scc.evaluate.service.IEvaluateTemplateService; import com.qxueyou.scc.exercise.model.ExerciseGroup; import com.qxueyou.scc.exercise.model.ExerciseItem; import com.qxueyou.scc.exercise.model.ExerciseItemAnswerU; import com.qxueyou.scc.exercise.model.ExerciseItemOption; import com.qxueyou.scc.exercise.model.ExerciseItemScore; import com.qxueyou.scc.exercise.model.ExerciseObjectImg; import com.qxueyou.scc.exercise.model.ExerciseRecord; import com.qxueyou.scc.exercise.model.QExerciseGroup; import com.qxueyou.scc.exercise.model.QExerciseItemAnswerU; import com.qxueyou.scc.exercise.model.QExerciseRecord; import com.qxueyou.scc.exercise.service.IExerciseService; import com.qxueyou.scc.exercise.util.ExerciseUtils; import com.qxueyou.scc.msg.model.MsgInfo; import com.qxueyou.scc.msg.service.IMsgInfoService; import com.qxueyou.scc.school.model.EvaluateStuStudentV; import com.qxueyou.scc.school.model.QEvaluateStuStudentV; import com.qxueyou.scc.school.model.QSchEvaRecordRe; import com.qxueyou.scc.school.model.QSchEvaluate; import com.qxueyou.scc.school.model.QSchEvaluateTemplate; import com.qxueyou.scc.school.model.SchEvaRecordRe; import com.qxueyou.scc.school.model.SchEvaluate; import com.qxueyou.scc.school.model.SchEvaluateDetail; import com.qxueyou.scc.school.model.SchEvaluateTemplate; import com.qxueyou.scc.school.model.TeachEvaScoreData; import com.qxueyou.scc.school.model.TeachEvaScoreResult; import com.qxueyou.scc.teach.student.model.QStuStudent; import com.qxueyou.scc.teach.student.model.StuStudent; import com.qxueyou.scc.teach.subject.model.QSubject; import com.qxueyou.scc.teach.subject.model.Subject; import com.qxueyou.scc.user.model.QUser; @Service public class EvaluateService extends CommonAppService implements IEvaluateService { private final Logger log = LogManager.getLogger(EvaluateService.class); @Autowired EvaluateRepository evaRepository; @Autowired IEvaluateTemplateService templateService; @Autowired ITeacherService teacherService; @Autowired IExerciseService exerciseService; @Autowired IMsgInfoService msgInfoService; /** * ²éѯÁбíÊý¾Ý * @param pageNum * @param pageSize * @return */ @Override public ResultJson queryList(Integer pageNum, Integer pageSize, String keyword, String sort) { QSchEvaluate qEva = QSchEvaluate.schEvaluate; QSchEvaluateTemplate template = QSchEvaluateTemplate.schEvaluateTemplate; QExerciseGroup group = QExerciseGroup.exerciseGroup; QSubject subject = QSubject.subject; // ËÑË÷Ãû keyword = StringUtils.isBlank(keyword) ? null : "%"+keyword+"%"; // »ñÈ¡²éѯ½á¹û¼¯ºÏ QueryResults results = this.getQueryFactory() .select(qEva, group,subject) .from(qEva, template, group,subject) .where(new QueryDslOptionBuilder() .and(qEva.evalTemplateId::eq, template.evaluateTemplateId) .and(template.groupId::eq,group.groupId) .and(qEva.evalRangeId::eq,subject.subjectId) .and(qEva.createId::eq,ClientUtils.getUserId()) .and(qEva.evaluateName::like, keyword) .and(qEva.deleteFlag::eq,false) .build() ) .orderBy(qEva.createTime.desc()) .fetchResults(); // ·â×°²ÎÊý List> resultLst = results.getResults() .stream() .map(tuple -> { Map map = new HashMap(2); map.put("evaluateId", tuple.get(qEva).getEvaluateId()); map.put("evaluateName", tuple.get(qEva).getEvaluateName()); map.put("evalRangeId", tuple.get(qEva).getEvalRangeId()); map.put("evalRangeType", tuple.get(qEva).getEvalRangeType()); map.put("evalRangeName", tuple.get(subject).getName()); map.put("evalRangeCount", tuple.get(qEva).getEvalRangeCount()); map.put("evalObjectName", tuple.get(qEva).getEvalObjectName()); map.put("status", tuple.get(qEva).getStatus()); map.put("endTime", tuple.get(qEva).getEndTime()); map.put("createTime", tuple.get(qEva).getCreateTime()); map.put("groupId", tuple.get(group).getGroupId()); map.put("exerCount", tuple.get(group).getAllCount()); map.put("evaluateCount", this.getEvaluateCount(tuple.get(qEva).getEvaluateId()));//ÒÑÆÀ¹ÀÈËÊý map.put("evaluateAllCount", this .queryEvaluateAllCount(tuple.get(qEva).getEvalRangeType(), tuple.get(qEva).getEvalRangeId().split(",")));//Ó¦ÆÀ¹ÀÈËÊý return map; }).collect(Collectors.toList()); return new ResultJson(true, "success", CollectionUtils.newObjectMap("allCount",results.getTotal(),"datas",resultLst)); } /** * »ñÈ¡·¶Î§Ñ¡Ôñ * * type: lesson:¿Î³Ì class:°à¼¶ person:ÈËÔ± * * @return */ @Override public ResultJson queryRangeList(String type,String searchName) { List tupleLst = null; // ËÑË÷Ãû searchName = StringUtils.isBlank(searchName) ? null : "%"+searchName+"%"; if(ClientUtils.isAdmin()){// ¹ÜÀíÔ± tupleLst = getAdminRangeList(type,searchName); }else{// ÀÏʦ tupleLst = getTeacherRangeList(type,searchName); } // ͳһ´¦Àí·µ»ØÊý¾Ý List> resultLst = tupleLst.stream() .map(tuple -> { Map map = new HashMap(2); map.put("name", tuple.get(0, String.class)); map.put("id", tuple.get(1, String.class)); return map; }).collect(Collectors.toList()); return new ResultJson(true, "success", resultLst); } /** * »ñÈ¡¹ÜÀíÔ±·¶Î§Ñ¡Ôñ * @param type * @return */ private List getAdminRangeList(String type,String searchName){ QSubject subject = QSubject.subject; QClsClass cls = QClsClass.clsClass; QUser user = QUser.user; List tupleLst = null; if(SchEvaluate.EVALUATE_RANGE_LESSON.equals(type)){//¿Î³Ì tupleLst = this.getQueryFactory().select(subject.name.as("name"),subject.subjectId.as("id")).distinct() .from(subject) .where(subject.type.eq(Subject.TYPE_ORG_SUBJECT) .and(subject.status.eq(Subject.STATUS_ISSUED)) .and(subject.origSubjectId.isNull()) .and(subject.deleteFlag.isFalse())) .orderBy(subject.createTime.desc()) .fetch(); }else if(SchEvaluate.EVALUATE_RANGE_CLASS.equals(type)){//°à¼¶ tupleLst = this.getQueryFactory().select(cls.name.as("name"),cls.classId.as("id")).distinct() .from(cls) .where( new QueryDslOptionBuilder() .and(cls.name::like, searchName) .and(cls.deleteFlag::eq, false) .build()) .orderBy(cls.createTime.desc()) .fetch(); }else if(SchEvaluate.EVALUATE_RANGE_PERSON.equals(type)){//ÈËÔ± QStuStudent stu = QStuStudent.stuStudent; tupleLst = this.getQueryFactory().select(user.name.as("name"),user.userId.as("id")).distinct() .from(stu, user) .where(new QueryDslOptionBuilder() .and(stu.name::like, searchName) .and(stu.deleteFlag::eq, false).and(user.userId::eq, stu.userId).and(user.deleteFlag::eq, false) .and(stu.status::eq, StuStudent.STATUS_ACTIVE) .build()) .orderBy(stu.createTime.desc()) .fetch(); } return tupleLst; } /** * »ñÈ¡ÀÏʦ·¶Î§Ñ¡Ôñ * @param type * @return */ private List getTeacherRangeList(String type,String searchName){ QSubject subject = QSubject.subject; QClsClassReSubject re = QClsClassReSubject.clsClassReSubject; QClsClass cls = QClsClass.clsClass; List tupleLst = null; String teacherId = teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); if(SchEvaluate.EVALUATE_RANGE_LESSON.equals(type)){//¿Î³Ì tupleLst = this.getQueryFactory().select(subject.name.as("name"),subject.subjectId.as("id")).distinct() .from(subject) .where(subject.createId.eq(ClientUtils.getUserId()) .and(subject.type.eq(Subject.TYPE_ORG_SUBJECT)) .and(subject.status.eq(Subject.STATUS_ISSUED)) .and(subject.origSubjectId.isNull()) .and(subject.deleteFlag.isFalse())) .orderBy(subject.createTime.desc()) .fetch(); }else if(SchEvaluate.EVALUATE_RANGE_CLASS.equals(type)){//°à¼¶ tupleLst = this.getQueryFactory().select(cls.name.as("name"),cls.classId.as("id")).distinct() .from(subject, re, cls) .where(new QueryDslOptionBuilder() .and(subject.subjectId::eq, re.subjectId) .and(re.classId::eq, cls.classId) .and(subject.teacherId::eq, teacherId) .and(subject.name::like, searchName) .and(subject.status::eq, Subject.STATUS_ISSUED) .and(subject.deleteFlag::eq, false) .and(cls.deleteFlag::eq, false) .build()).groupBy(cls.classId) .orderBy(subject.createTime.desc()) .fetch(); }else if(SchEvaluate.EVALUATE_RANGE_PERSON.equals(type)){//ÈËÔ± QStuStudent stu = QStuStudent.stuStudent; tupleLst = this.getQueryFactory().select(stu.name.as("name"),stu.userId.as("id")).distinct() .from(stu,cls,subject, re) .where(new QueryDslOptionBuilder() .and(stu.classId::like, cls.classId) .and(stu.status::eq, StuStudent.STATUS_ACTIVE) .and(stu.name::like, searchName) .and(stu.deleteFlag::eq, false) .and(subject.subjectId::eq, re.subjectId) .and(re.classId::eq, cls.classId) .and(subject.teacherId::eq, teacherId) .and(subject.name::like, searchName) .and(subject.status::eq, Subject.STATUS_ISSUED) .and(subject.deleteFlag::eq, false) .and(cls.deleteFlag::eq, false) .build() ).groupBy(stu.userId) .orderBy(stu.createTime.desc()) .fetch(); } return tupleLst; } /** * ºǫ́ÐÂÔöÆÀ¹À * @param eva * @return */ @Override public ResultJson addOrUpdateEvaluate(SchEvaluate eva) { String evaluateId = eva.getEvaluateId(); String groupId = null; if(StringUtils.isBlank(evaluateId)){// ÐÂÔö //1¡¢²åÈë×é ExerciseGroup obj = this.insertExerciseGroup(eva.getEvaluateName(), ExerciseGroup.TYPE_EXERCISE_TEACH_EVALUATE); //2¡¢²åÈëÆÀ¹ÀÄ£°å SchEvaluateTemplate objTemplate = new SchEvaluateTemplate(); TraceUtils.setCreateTrace(objTemplate); objTemplate.setEvaluateTemplateName(eva.getEvaluateName()); objTemplate.setGroup_name(obj.getName()); objTemplate.setGroupId(obj.getGroupId()); objTemplate.setOrgId(ClientUtils.getOrgId()); objTemplate.setOrgName(ClientUtils.getOrgName()); this.save(objTemplate); // 3¡¢²åÈëÆÀ¹À±í eva.setEvalTemplateId(objTemplate.getEvaluateTemplateId()); eva.setEvalTemplateName(objTemplate.getEvaluateTemplateName()); eva.setEvaluateCount(BigInteger.ZERO); eva.setScore(BigDecimal.ZERO); eva.setStatus((short)0); eva.setDeleteFlag(false); TraceUtils.setCreateTrace(eva); evaRepository.save(eva); evaluateId = eva.getEvaluateId(); groupId = obj.getGroupId(); }else{// ±à¼­ SchEvaluate newEva = this.read(SchEvaluate.class, eva.getEvaluateId()); newEva.setEvaluateName(eva.getEvaluateName()); newEva.setEvalObjectName(eva.getEvalObjectName()); newEva.setEndTime(eva.getEndTime()); newEva.setEvalRangeType(eva.getEvalRangeType()); newEva.setEvalRangeId(eva.getEvalRangeId()); newEva.setEvalRangeName(eva.getEvalRangeName()); TraceUtils.setUpdateTrace(newEva); evaRepository.save(newEva); } return new ResultJson(true, "success", CollectionUtils.newObjectMap("evaluateId", evaluateId, "groupId", groupId)); } /** * £ººǫ́ ²åÈëÆÀ¹ÀÄ£°åʱµ÷Óà * * @param name * @param type * @return */ public ExerciseGroup insertExerciseGroup(String name, short type) { ExerciseGroup obj = new ExerciseGroup(); TraceUtils.setCreateTrace(obj); obj.setName(name); obj.setType(type); obj.setClassId(ClientUtils.getClassId()); obj.setOrgId(ClientUtils.getOrgId()); obj.setAllCount(BigInteger.ZERO); this.save(obj); // ±£´æ return obj; } /** * ²éѯ»ù±¾ÐÅÏ¢ */ @Override public ResultJson queryBaseInfo(String evaluateId) { SchEvaluate eva = evaRepository.getOne(evaluateId); QSchEvaluate qEva = QSchEvaluate.schEvaluate; QSchEvaluateTemplate template = QSchEvaluateTemplate.schEvaluateTemplate; QExerciseGroup group = QExerciseGroup.exerciseGroup; // »ñÈ¡²éѯ½á¹û¼¯ºÏ ExerciseGroup g = this.getQueryFactory() .select(group) .from(qEva, template, group) .where(new QueryDslOptionBuilder() .and(qEva.evalTemplateId::eq, template.evaluateTemplateId) .and(template.groupId::eq,group.groupId) .and(qEva.evaluateId::eq,evaluateId) .and(qEva.deleteFlag::eq,false) .build() ) .fetchOne(); return new ResultJson(true, "success", CollectionUtils.newObjectMap("evaluateName",eva.getEvaluateName(), "evaluateId",eva.getEvaluateId(), "evalObjectName",eva.getEvalObjectName(), "endTime",eva.getEndTime(), "createTime",eva.getCreateTime(), "evalRangeType",eva.getEvalRangeType(), "evaluateCount",g.getAllCount(), "evalRangeId",eva.getEvalRangeId(), "evalRangeName",eva.getEvalRangeName())); } /** * ɾ³ý */ @Override public ResultJson delete(String evaluateIds){ QSchEvaluate qEva = QSchEvaluate.schEvaluate; this.getQueryFactory() .update(qEva) .set(qEva.deleteFlag, true) .where(qEva.evaluateId.in(evaluateIds.split(","))) .execute(); return new ResultJson(true, "success"); } /** * ¼¤»î */ @Override public ResultJson doActive(String evaluateIds){ QSchEvaluate qEva = QSchEvaluate.schEvaluate; this.getQueryFactory() .update(qEva) .set(qEva.status, SchEvaluate.STATUS_EVA) .where(qEva.evaluateId.in(evaluateIds.split(","))) .execute(); if(StringUtils.isNotEmpty(evaluateIds)){ String [] arrIds = evaluateIds.split(","); for(String evaluateId:arrIds){ this.doSendhMsg(evaluateId); } } return new ResultJson(true, "success"); } //·¢²¼ÏûÏ¢ private void doSendhMsg(String evaluateId){ SchEvaluate evaluate = this.read(SchEvaluate.class,evaluateId); List> lst= this.queryNotAnswerEvaLst(evaluateId, new ArrayList(1)); List lstUserIds = null; if(lst!=null && lst.size()>0){ lstUserIds = new ArrayList(lst.size()); for(Map map:lst){ lstUserIds.add((String)map.get("userId")); } Map attrs = CollectionUtils.newStringMap("evaluateId",evaluate.getEvaluateId(),"evaluateName",evaluate.getEvaluateName(), "templateId",evaluate.getEvalTemplateId(),"evalRangeName",evaluate.getEvalRangeName(),"creator",evaluate.getCreator()); msgInfoService.doSendTextMsgToUsersLoop(lstUserIds, MsgInfo.TYPE_EVALUATE, "·¢²¼ÁËÎʾíµ÷²é", attrs); } } /** *»ØÍË */ @Override public ResultJson doWithdraw(String evaluateIds){ QSchEvaluate qEva = QSchEvaluate.schEvaluate; this.getQueryFactory() .update(qEva) .set(qEva.status, SchEvaluate.STATUS_NOT_EVA) .where(qEva.evaluateId.in(evaluateIds.split(","))) .execute(); return new ResultJson(true, "success"); } /** * ¸´ÖÆ */ @Override public ResultJson doCopy(SchEvaluate eva){ try { SchEvaluate schEva = evaRepository.getOne(eva.getEvaluateId()); SchEvaluateTemplate oldTemplate = this.read(SchEvaluateTemplate.class, schEva.getEvalTemplateId()); // 1¡¢Éú³ÉϰÌâ×é String newGroupId = exerciseService.doCopyExerciseByEvaluate(oldTemplate.getGroupId()); // 2¡¢Éú³ÉÄ£°å SchEvaluateTemplate newTemplate = new SchEvaluateTemplate(); BeanUtils.copyProperties(newTemplate, oldTemplate); newTemplate.setEvaluateTemplateId(null); newTemplate.setGroupId(newGroupId); TraceUtils.setCreateTrace(newTemplate); this.save(newTemplate); // 3¡¢Éú³ÉÆÀ¹À±í SchEvaluate newEva = new SchEvaluate(); BeanUtils.copyProperties(newEva, eva); newEva.setEvaluateId(null); newEva.setEvalTemplateId(newTemplate.getEvaluateTemplateId()); newEva.setEvalTemplateName(newTemplate.getEvaluateTemplateName()); newEva.setEvaluateCount(BigInteger.ZERO); newEva.setScore(BigDecimal.ZERO); newEva.setStatus((short)0); newEva.setDeleteFlag(false); TraceUtils.setCreateTrace(newEva); this.save(newEva); return new ResultJson(true, "success", CollectionUtils.newObjectMap("evaluateId", newEva.getEvaluateId(), "groupId", newGroupId)); } catch (Exception e) { log.error("doCopyÆÀ¹À¸´ÖÆ£º¸´ÖÆÁ·Ï°BeanUtils.copyProperties()·½·¨copyʧ°Ü", e); } return new ResultJson(false); } /** * ²é¿´½á¹û ÎʾíÕûÌåÇé¿ö * @param evaluateId * @param groupId * @param evalRangeType * @return */ @Override public ResultJson queryEvaluateDetail(String evaluateId,String groupId){ // 1¡¢²éѯÒÑÌá½»Îʾílist List> answerUserLst = queryAnswerEvaLst(evaluateId); // ÒѾ­´ðÌâ¹ýµÄѧԱid List userAnswerList = new ArrayList(answerUserLst.size()); for(Map map:answerUserLst){ userAnswerList.add(String.valueOf(map.get("userId"))); } // 2¡¢²éѯδÌá½»´ð°¸list List> notAnswerUserLst = this.queryNotAnswerEvaLst(evaluateId, userAnswerList); return new ResultJson(true, "success", CollectionUtils.newObjectMap("answerUserLst",answerUserLst, "notAnswerUserLst",notAnswerUserLst)); } /** * ²éѯÒÑ´ðÌâµÄѧԱlist * @param evaluateId * @return */ private List> queryAnswerEvaLst(String evaluateId) { QExerciseRecord record = QExerciseRecord.exerciseRecord; QSchEvaRecordRe reEva = QSchEvaRecordRe.schEvaRecordRe; List> answerUserLst = this.getQueryFactory() .select(record).from(record, reEva) .where(record.recordId.eq(reEva.exerciseRecordId) .and(reEva.evaluateId.eq(evaluateId)) .and(record.deleteFlag.eq(false))) .orderBy(record.submitTime.desc()) .fetch() .stream() .map(tuple -> { Map map = new HashMap(4); map.put("recordId", tuple.getRecordId()); map.put("userId", tuple.getUserId()); map.put("userName", tuple.getUserName()); map.put("submitTime", tuple.getSubmitTime()); return map; }).collect(Collectors.toList()); return answerUserLst; } /** * ²éѯδ´ðÌâµÄѧԱlist * @param rangeType * @param evalRangeIds * @param userAnswerList * @return */ private List> queryNotAnswerEvaLst(String evaluateId,List userAnswerList ){ SchEvaluate eva = this.read(SchEvaluate.class, evaluateId); String[] evalRangeIds = eva.getEvalRangeId().split(","); String rangeType = eva.getEvalRangeType(); QClsClassReSubject re = QClsClassReSubject.clsClassReSubject; QStuStudent stu = QStuStudent.stuStudent; QSubject qSubject = QSubject.subject; Predicate predicate = null; if(SchEvaluate.EVALUATE_RANGE_LESSON.equals(rangeType)){//¿Î³Ì predicate = stu.classId.in(getQueryFactory().select(re.classId).from(re,qSubject) .where(qSubject.origSubjectId.in(evalRangeIds).and(re.subjectId.eq(qSubject.subjectId)) .and(qSubject.deleteFlag.isFalse()).and(re.deleteFlag.eq(false)))); }else if(SchEvaluate.EVALUATE_RANGE_CLASS.equals(rangeType)){//°à¼¶ predicate = stu.classId.in(evalRangeIds); }else if(SchEvaluate.EVALUATE_RANGE_PERSON.equals(rangeType)){//ÈËÔ± predicate = stu.userId.in(evalRangeIds); } List> notAnswerUserLst = this.getQueryFactory().select(stu.userId, stu.name).distinct() .from(stu) .where(stu.userId.notIn(userAnswerList)// ¹ýÂ˵ôÒѾ­´ðÌâ¹ýµÄѧԱ .and(stu.deleteFlag.eq(false)) .and(predicate)) .orderBy(stu.createTime.desc()) .fetch() .stream() .map(tuple -> { Map map = new HashMap(4); map.put("recordId", null); map.put("userId", tuple.get(0,String.class)); map.put("userName", tuple.get(1,String.class)); map.put("submitTime", null); return map; }).collect(Collectors.toList()); return notAnswerUserLst; } /** ------ǰ¶Ë ---------------------------start------------------------------------------------------------------ */ /** * Ìá½»´ð°¸ * @param score * @return */ @Override public ResultJson doSubmitTeachEvalScoreData(TeachEvaScoreResult scoreResult, String userId) { List lstScore = scoreResult.getItems(); String evaluateId = scoreResult.getEvaluateId(); // 1.²Ù×÷ExerciseRecord×öÌâ¼Ç¼ ExerciseRecord record = this.doOperExerciseRecord(scoreResult); if(null == record){ return new ResultJson(false,"ÄúÒѾ­Ìá½»£¬²»ÄÜÖØ¸´Ìá½»"); } String exerciseRecordId = record.getRecordId(); if(!scoreResult.getItems().isEmpty()){ // 2.¼Ç¼Á·Ï°´ð°¸ ExerciseItemAnswerU this.doOperExerciseItemAnswerUBatch(lstScore, exerciseRecordId); } // 3.²åÈëÆÀ¹À¼Ç¼¹ØÁª±í this.doOperSchEvaRecordRe(exerciseRecordId, evaluateId); // 4.¸üÐÂÆÀ¹À±íµÄÍê³ÉÈËÊý SchEvaluate eval = this.updateEvaluateCount(evaluateId); if(!scoreResult.getItems().isEmpty()){ // 5.²åÈëÆÀ¹ÀÃ÷ϸ±í this.insertEvaluateDetailBatch(lstScore,evaluateId); } return new ResultJson(true, "²Ù×÷³É¹¦", CollectionUtils.newObjectMap("doNumber", eval.getEvaluateCount(), "recordId", exerciseRecordId)); } /** * ²Ù×÷±¾´Î×öÌâ¼Ç¼ * @return */ public ExerciseRecord doOperExerciseRecord(TeachEvaScoreResult scoreResult) { String hql = "select count(r.recordId) from SchEvaRecordRe re, ExerciseRecord r " + " where re.exerciseRecordId=r.recordId and re.evaluateId=? and r.userId=? and r.deleteFlag is false"; int count = this.findCount(hql, CollectionUtils.newList(scoreResult.getEvaluateId(), ClientUtils.getUserId())); if(count > 0){ return null; } String doCount = String.valueOf(scoreResult.getItems().size()); // 2.²éѯ×ÜÌâÄ¿Êý ExerciseGroup group = this.findUnique("select g from ExerciseGroup g,SchEvaluate e,SchEvaluateTemplate t " + "where g.groupId=t.groupId and e.evalTemplateId=t.evaluateTemplateId and e.evaluateId=?" + " and g.deleteFlag is false and e.deleteFlag is false ", CollectionUtils.newList(scoreResult.getEvaluateId()), ExerciseGroup.class); BigInteger allCount = group.getAllCount(); // 3.²éѯ×öÌâ¼Ç¼obj BigDecimal completionRate = ExerciseUtils.parseStrToBigDecimal(doCount, String.valueOf(allCount)); ExerciseRecord record = new ExerciseRecord(); record.setExerciseGroupId(group.getGroupId()); record.setUserId(ClientUtils.getUserId()); record.setDeleteFlag(false); record.setScore(scoreResult.getScore()); record.setTitleMaxNumber(scoreResult.getCurrTitleNum()); record.setStatus(ExerciseRecord.STATUS_SUBMIT); record.setSubmitTime(new Date(System.currentTimeMillis())); record.setCompletionRate(completionRate); record.setDoCount(new BigInteger(doCount)); TraceUtils.setCreateTrace(record); this.save(record); return record; } /** * ÅúÁ¿Ôö¼Ó»òÐÞ¸ÄÁ·Ï°¼Ç¼´ð°¸ * @return */ public Result doOperExerciseItemAnswerUBatch(List lstScore, String exerciseRecordId) { String userId = ClientUtils.getUserId(); List lstNewAnswerU = new ArrayList(lstScore.size()); // ×é×°´ð°¸¼Ç¼ ExerciseItemAnswerU answerU = null; for(TeachEvaScoreData score:lstScore){ if(StringUtils.isBlank(score.getAnswer())){ continue; } answerU = new ExerciseItemAnswerU(); answerU.setExerciseItemId(score.getExerciseId()); answerU.setExerciseRecordId(exerciseRecordId); answerU.setAnswer(score.getAnswer()); answerU.setUserId(userId); answerU.setDeleteFlag(false); TraceUtils.setCreateTrace(answerU); lstNewAnswerU.add(answerU); } // ÅúÁ¿±£´æ this.saveOrUpdateAll(lstNewAnswerU); return new Result(true); } /** * ÅúÁ¿Ôö¼Ó»òÐÞ¸ÄÆÀ¹ÀÃ÷ϸ¼Ç¼ * @return */ public Result insertEvaluateDetailBatch(List lstScore,String evaluateId) { Map argsMap = new HashMap(lstScore.size()); Object[] args = new Object[lstScore.size()]; for(int i=0; i lstscores = this.findByComplexHql(hql_score, argsMap, ExerciseItemScore.class); Map scoreMap = new HashMap(lstscores.size()); for(ExerciseItemScore score:lstscores){ scoreMap.put(score.getExerciseItemId()+score.getExerciseItemAnswer(), score.getScore()); } String userId = ClientUtils.getUserId(); String userName = ClientUtils.getUserName(); List lstDetail = new ArrayList(lstScore.size()); SchEvaluateDetail record = null; for(TeachEvaScoreData score:lstScore){ record = new SchEvaluateDetail(); record.setEvaluateId(evaluateId); if(scoreMap.get(score.getExerciseId()+score.getAnswer()) == null){ record.setScore(BigDecimal.ZERO); }else{ record.setScore(new BigDecimal(scoreMap.get(score.getExerciseId()+score.getAnswer()))); } record.setEvaluaterId(userId); record.setEvaluater(userName); record.setDeleteFlag(false); TraceUtils.setCreateTrace(record); lstDetail.add(record); } // ÅúÁ¿±£´æ this.saveOrUpdateAll(lstDetail); return new Result(true); } /** * ÐÂÔöÆÀ¹ÀÓë¼Ç¼¹ØÁª±í * @param groupId * @return */ public Result doOperSchEvaRecordRe(String recordId, String evaluateId) { String hql = "from SchEvaRecordRe where evaluateId=? and exerciseRecordId=?"; List recordLst = this.find(hql, CollectionUtils.newList(evaluateId, recordId), SchEvaRecordRe.class); if(!recordLst.isEmpty()){ return new Result(true); } SchEvaRecordRe record = new SchEvaRecordRe(); record.setEvaluateId(evaluateId); record.setExerciseRecordId(recordId); //¼Ç¼´ðÌâËùÔڰ༶ if(null != ClientUtils.getUserInfo()){ record.setClassId(ClientUtils.getClassId()); record.setOrgId(ClientUtils.getOrgId()); } this.save(record); return new Result(true); } /** * ¸üÐÂÆÀ¹À±í¼Ç¼ * @return */ public SchEvaluate updateEvaluateCount(String evaluateId) { SchEvaluate record = this.read(SchEvaluate.class, evaluateId); if(record == null){ return null; } record.setEvaluateCount(BigInteger.valueOf(this.getEvaluateCount(evaluateId))); TraceUtils.setUpdateTrace(record); // ±£´æ this.save(record); return record; } /** * ²éѯÎʾíͳ¼Æ * @param groupId * @param evaluateId * @return */ @Override public ResultJson queryEvaluateStatis(String groupId, String evaluateId) { List items = exerciseService.readExerciseItems4Evaluate(groupId); SchEvaluate objSchEvaluate = this.read(SchEvaluate.class, evaluateId); QExerciseRecord record = QExerciseRecord.exerciseRecord; QExerciseItemAnswerU answerU = QExerciseItemAnswerU.exerciseItemAnswerU; QSchEvaRecordRe re = QSchEvaRecordRe.schEvaRecordRe; QUser qUser = QUser.user; for (ExerciseItem objExerciseItem : items) { List lstTuple = this.getQueryFactory().select(answerU, qUser) .from(record,answerU,re,qUser) .where(record.recordId.eq(answerU.exerciseRecordId) .and(record.recordId.eq(re.exerciseRecordId)) .and(re.evaluateId.eq(evaluateId)).and(qUser.userId.eq(record.userId)) .and(answerU.exerciseItemId.eq(objExerciseItem.getExerciseId())) .and(answerU.deleteFlag.eq(false)) .and(record.deleteFlag.eq(false)) ).orderBy(answerU.createTime.desc()).fetch(); if(lstTuple != null && !lstTuple.isEmpty()) { List lstExerciseItemAnswerU = new ArrayList<>(); for(Tuple tuple : lstTuple) { ExerciseItemAnswerU objExerciseItemAnswerU = tuple.get(answerU); objExerciseItemAnswerU.setImgPath(tuple.get(qUser).getImgPath()); lstExerciseItemAnswerU.add(objExerciseItemAnswerU); } // ²éѯ´ð°¸ objExerciseItem.setExerciseItemAnswerU(lstExerciseItemAnswerU); } } objSchEvaluate.setEvaluateCount(BigInteger.valueOf(this.getEvaluateCount(evaluateId))); // ²éѯӦÆÀ¹À×ÜÈËÊý objSchEvaluate.setEvaluateAllCount(BigInteger.valueOf(this .queryEvaluateAllCount(objSchEvaluate.getEvalRangeType(),objSchEvaluate.getEvalRangeId().split(",")))); //ƴװǰ¶ËËùÐèÒªµÄÊý¾Ý Map resultMap = ExerciseUtils.packageExerciseDetail(items, objSchEvaluate); return new ResultJson(true, "success", resultMap); } /** * ²éѯӦÆÀ¹ÀÈËÊý * @param rangeType * @param evalRangeIds * @return */ private long queryEvaluateAllCount(String rangeType, String[] evalRangeIds){ QClsClassReSubject re = QClsClassReSubject.clsClassReSubject; QStuStudent stu = QStuStudent.stuStudent; QSubject qSubject = QSubject.subject; Predicate predicate = null; if(SchEvaluate.EVALUATE_RANGE_LESSON.equals(rangeType)){//¿Î³Ì predicate = stu.classId.in(getQueryFactory().select(re.classId).from(re,qSubject) .where(qSubject.origSubjectId.in(evalRangeIds).and(re.subjectId.eq(qSubject.subjectId)) .and(qSubject.deleteFlag.isFalse()).and(re.deleteFlag.eq(false)))); }else if(SchEvaluate.EVALUATE_RANGE_CLASS.equals(rangeType)){//°à¼¶ predicate = stu.classId.in(evalRangeIds); }else if(SchEvaluate.EVALUATE_RANGE_PERSON.equals(rangeType)){//ÈËÔ± return evalRangeIds.length; } long allCount = this.getQueryFactory() .from(stu) .where(stu.deleteFlag.eq(false).and(predicate).and(stu.status.eq(StuStudent.STATUS_ACTIVE))).groupBy(stu.userId) .fetchCount(); return allCount; } /** * »ñÈ¡Îʾí´ð¾íÈËÊý * * @param schEvaluateId * @param classId * @return */ private long getEvaluateCount(String evaluateId){ QSchEvaRecordRe re = QSchEvaRecordRe.schEvaRecordRe; QExerciseRecord record = QExerciseRecord.exerciseRecord; long count = this.getQueryFactory().from(re,record) .where(re.exerciseRecordId.eq(record.recordId) .and(record.deleteFlag.eq(false)) .and(re.evaluateId.eq(evaluateId)) ).groupBy(record.userId) .fetchCount(); return count; } /** * ²éѯѧÉúÆÀ¹Àlist * @return */ @Override public ResultJson queryStuEvaluateList(Pager pager) { QEvaluateStuStudentV view = QEvaluateStuStudentV.evaluateStuStudentV; List lstView = this.getQueryFactory() .selectFrom(view) .where(view.id.userId.eq(ClientUtils.getUserId())).limit(pager.getPageSize()).offset(pager.getOffset()) .orderBy(view.createTime.desc()) .fetch(); QSchEvaRecordRe re = QSchEvaRecordRe.schEvaRecordRe; QExerciseRecord r= QExerciseRecord.exerciseRecord; ExerciseRecord record = null; for(EvaluateStuStudentV evaV:lstView){ record = this.getQueryFactory().select(r) .from(re,r) .where(re.exerciseRecordId.eq(r.recordId) .and(re.evaluateId.eq(evaV.getId().getEvaluateId())) .and(r.userId.eq(evaV.getId().getUserId())) .and(r.deleteFlag.eq(false)) ).groupBy(r.userId).fetchOne(); if(record != null) { evaV.setExerciseRecordId(record.getRecordId()); evaV.setGroupId(record.getExerciseGroupId()); } evaV.setEvaluateId(evaV.getId().getEvaluateId()); evaV.setUserId(evaV.getId().getUserId()); } return new ResultJson(true,"success",lstView); } /** * ²éѯѧÉúÆÀ¹Àcount * @return */ @Override public Map queryStuEvaluateCount() { QEvaluateStuStudentV view = QEvaluateStuStudentV.evaluateStuStudentV; long allCount = this.getQueryFactory() .selectFrom(view) .where(view.id.userId.eq(ClientUtils.getUserId())) .fetchCount(); QSchEvaRecordRe re = QSchEvaRecordRe.schEvaRecordRe; QExerciseRecord r= QExerciseRecord.exerciseRecord; long doCount = this.getQueryFactory().select(view).distinct() .from(re,r, view) .where(re.exerciseRecordId.eq(r.recordId) .and(re.evaluateId.eq(view.id.evaluateId)) .and(r.userId.eq(ClientUtils.getUserId())).and(view.id.userId.eq(ClientUtils.getUserId())) .and(r.deleteFlag.eq(false)) ).fetchCount(); return CollectionUtils.newObjectMap("allCount", allCount, "doCount", doCount); } /** * »ñÈ¡ÆÀ¹ÀÌâÄ¿ * @param templateId * @param status * @param exerciseRecordId * @return */ @Override public ResultJson doGetEvalExerItemResponseDataNew(String evaluateId) { String groupId = this.findUnique("select t.groupId from SchEvaluateTemplate t,SchEvaluate e " + "where t.evaluateTemplateId=e.evalTemplateId and e.evaluateId=?", CollectionUtils.newList(evaluateId),String.class); // 2.²éÕÒÆÀ¹À×éÏÂËùÓжÔÓ¦µÄÁ·Ï° String hql_item = "select item" + " from ExerciseItem item, ExerciseGroupItemRe re, ExerciseGroup g" + " where item.exerciseId=re.exerciseItemId " + " and re.exerciseGroupId=g.groupId" + " and g.groupId=? " + " and g.deleteFlag is false" + " and re.deleteFlag is false" + " and item.deleteFlag is false" + " order by re.itemOrder"; List lstItems = this.find(hql_item, CollectionUtils.newList(groupId), ExerciseItem.class); if(lstItems.isEmpty()){ return new ResultJson(false,"µ±Ç°ÆÀ¹ÀδÌí¼ÓÌâÄ¿"); } //²éѯÓû§ËùÌî´ð°¸ List lstUserAnswer = null; String exerciseRecordId = this.findUnique("select r.recordId from SchEvaRecordRe re, ExerciseRecord r " + "where re.exerciseRecordId=r.recordId and re.evaluateId=? and r.deleteFlag is false and r.userId = ?", CollectionUtils.newList(evaluateId, ClientUtils.getUserId()), String.class); if(StringUtils.isNoneBlank(exerciseRecordId)){ String hql_options = "select o from ExerciseItemAnswerU o where o.exerciseRecordId = ? and o.deleteFlag is false"; lstUserAnswer = this.find(hql_options, CollectionUtils.newList(exerciseRecordId), ExerciseItemAnswerU.class); } // 2.1.×é×°²ÎÊý ÓÃÓÚ²éѯÎʾíÑ¡ÏîͼƬ Map argsImgMap = new HashMap(); String argImgs = ""; Map argsMap = new HashMap(); Object[] args = new Object[lstItems.size()]; for(int i=0; i options = objExerciseItem.getOptions(); if(options == null || options.isEmpty()){ continue; }else{ for(int j=0; j lstItemImgs = this.findByComplexHql(hql_itemImgs, argsMap, ExerciseObjectImg.class); // 2-3-2²éѯÌâĿѡÏîÊÇ·ñ¹ØÁªÍ¼Æ¬ String hql_optionImgs = "from ExerciseObjectImg where exerciseObjectId in (:optionIds) and deleteFlag is false and objectType=2"; List lstOptionImgs = this.findByComplexHql(hql_optionImgs, argsImgMap, ExerciseObjectImg.class); // ÖØÐÂ×é×°Á·Ï°Ñ¡Ïî ExerciseUtils.packageExerciseItem(lstItems, lstUserAnswer, lstOptionImgs); Map> imgItemMap = ExerciseUtils.packageExerciseItemImg(lstItemImgs); for(ExerciseItem item:lstItems){ // 4.5ÌâÄ¿ÖÐÊÇ·ñÓÐͼƬ if(imgItemMap.get(item.getExerciseId()) != null){ item.setImgs(imgItemMap.get(item.getExerciseId())); } } return new ResultJson(true,"success",lstItems); } }