package com.qxueyou.scc.admin.classes.service.impl; import java.util.*; import java.util.stream.Collectors; import com.qxueyou.scc.teach.subject.model.view.MyLectureV; import com.qxueyou.scc.teach.subject.model.view.MySubjectV; import com.qxueyou.scc.teach.subject.service.ILectureService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.querydsl.core.Tuple; import com.querydsl.jpa.impl.JPAQuery; import com.qxueyou.scc.admin.classes.dao.ClassDAO; import com.qxueyou.scc.admin.classes.model.ClsClass; import com.qxueyou.scc.admin.classes.model.QClsClass; import com.qxueyou.scc.admin.classes.model.QClsClassReSubject; import com.qxueyou.scc.admin.classes.service.IClassService; import com.qxueyou.scc.admin.progress.model.Progress; import com.qxueyou.scc.admin.progress.model.view.QSubjectProgressTreeV; import com.qxueyou.scc.admin.score.service.IScoreService; 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.service.ICacheService; 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.TraceUtils; import com.qxueyou.scc.teach.student.model.StuStudent; import com.qxueyou.scc.teach.subject.model.QSubject; import com.qxueyou.scc.teach.subject.model.Subject; /** * 班级服务类 * * @author xiadehu */ @Service public class ClsClassService extends CommonAppService implements IClassService { @Autowired ClassDAO clsDao; @Autowired IScoreService scoreService; @Autowired ICacheService cache; @Autowired ITeacherService teacherService; @Autowired ILectureService lectureService; /** * 添加班级 */ @Override public Result insertClass(String className, String classNumber, Date startTime, Date endTime, String subjectId, String teacherId) { ClsClass cls = new ClsClass(); TraceUtils.setCreateTrace(cls); cls.setClassNumber(classNumber); cls.setName(className); cls.setStartTime(startTime); cls.setEndTime(endTime); cls.setTeacherId(teacherId); cls.setOrgId(ClientUtils.getOrgId()); save(cls); return new Result(true, "success",CollectionUtils.newStringMap("classId",cls.getClassId())); } /** * 添加补考班级班级 */ @Override public Result insertReClass(String className, String classNumber, Date startTime, Date endTime, String subjectId, String teacherId,String classTypes) { ClsClass cls = new ClsClass(); TraceUtils.setCreateTrace(cls); cls.setClassNumber(classNumber); cls.setName(className); cls.setStartTime(startTime); cls.setEndTime(endTime); cls.setTeacherId(teacherId); cls.setOrgId(ClientUtils.getOrgId()); cls.setClassTypes(classTypes); save(cls); return new Result(true, "success",CollectionUtils.newStringMap("classId",cls.getClassId())); } @Override public ClsClass getReClass(String classTypes) { String hql = "select c from ClsClass c where c.deleteFlag is false and c.classTypes=? "; ClsClass cls = findUnique(hql, CollectionUtils.newList(classTypes), ClsClass.class); return cls; } @Override public Result updateClass(String classId, String className, String classNumber, Date startTime, Date endTime, String subjectId, boolean needJoinAudit, boolean needQuitAudit, boolean showAnalysisAfterExer, boolean canMultiExer, boolean needForum, String teacherId) { ClsClass cls = read(ClsClass.class, classId); TraceUtils.setUpdateTrace(cls); cls.setClassNumber(classNumber); cls.setName(className); cls.setStartTime(startTime); cls.setEndTime(endTime); cls.setNeedJoinAudit(needJoinAudit); cls.setNeedQuitAudit(needQuitAudit); cls.setShowAnalysisAfterExer(showAnalysisAfterExer); cls.setCanMultiExer(canMultiExer); cls.setNeedForum(needForum); cls.setTeacherId(teacherId); save(cls); return new Result(true, "success"); } @Override public ClsClass read(String classId) { return read(ClsClass.class, classId); } // // /** // * 原始:获取班级列表 // */ // @Override // public List getClassLst(String keyword, String teacherId, Integer pageSize, Integer pageNum, Integer pageType) { // String keyword_ = StringUtils.isBlank(keyword) ? "" : keyword; //// System.out.println(keyword_); // StringBuffer hql = new StringBuffer("from ClsClass c where c.deleteFlag is false and c.orgId=? and c.name like ? and c.createId=?"); // // if (pageType == 1) { // hql.append(" and c.endTime >= sysdate() "); // }else if(pageType == 2) { // hql.append(" and c.endTime < sysdate() "); // } //// System.out.println("vvvvv"+ClientUtils.getOrgId()+"333333333"+ClientUtils.getUserId()); // List args = CollectionUtils.newList(ClientUtils.getOrgId(),keyword_ + "%",ClientUtils.getUserId()); //// System.out.println(args); // if (!StringUtils.isEmpty(teacherId)) { // hql.append(" and exists( select 1 from ClsClassReSubject r,Subject t where r.subjectId=t.subjectId and c.classId= r.classId and t.teacherId=? and r.deleteFlag is false and t.deleteFlag is false)"); // args.add(teacherId); // } // // hql.append(" order by c.createTime desc"); //// System.out.println(hql.toString()); //// System.out.println(findList(hql.toString(), new Pager(pageSize, pageNum), args, ClsClass.class)); // return findList(hql.toString(), new Pager(pageSize, pageNum), args, ClsClass.class); // } /** * 优化获取班级列表 * @param keyword * @param teacherId * @param pageSize * @param pageNum * @param pageType * @return */ public List getClassLst(String keyword, String teacherId, Integer pageSize, Integer pageNum, Integer pageType) { String keyword_ = StringUtils.isBlank(keyword) ? "" : keyword; // System.out.println(keyword_); StringBuffer hql = new StringBuffer("from ClsClass c where c.deleteFlag is false and c.orgId=? and c.name like ? "); if (pageType == 1) { hql.append(" and c.endTime >= sysdate() "); }else if(pageType == 2) { hql.append(" and c.endTime < sysdate() "); } // if (!StringUtils.isEmpty(teacherId)) { // hql.append("and c.createId=?)"); // } // System.out.println("vvvvv"+ClientUtils.getOrgId()+"333333333"+ClientUtils.getUserId()); ,ClientUtils.getUserId() List args = CollectionUtils.newList(ClientUtils.getOrgId(),keyword_ + "%"); // System.out.println(args); if (!StringUtils.isEmpty(teacherId)) { hql.append(" and exists( select 1 from ClsClassReSubject r,Subject t where r.subjectId=t.subjectId and c.classId= r.classId and t.teacherId=? and r.deleteFlag is false and t.deleteFlag is false)"); args.add(teacherId); } hql.append(" order by c.createTime desc"); // System.out.println(hql.toString()); // System.out.println(findList(hql.toString(), new Pager(pageSize, pageNum), args, ClsClass.class)); return findList(hql.toString(), new Pager(pageSize, pageNum), args, ClsClass.class); } @Override public int getClassLstCount(String keyword, String teacherId, Integer pageType) { StringBuffer hql = new StringBuffer("from ClsClass c where c.deleteFlag is false and c.orgId=? and c.name like ?"); if (pageType == 1) { hql.append(" and c.endTime >= sysdate() "); }else if(pageType == 2) { hql.append(" and c.endTime < sysdate() "); } List args = CollectionUtils.newList(ClientUtils.getOrgId(),keyword + "%"); if (!StringUtils.isEmpty(teacherId)) { hql.append(" and exists( select 1 from ClsClassReSubject r,Subject t where r.subjectId=t.subjectId and c.classId= r.classId and t.teacherId=? and r.deleteFlag is false and t.deleteFlag is false)"); args.add(teacherId); } return findCount(hql.toString(), args); } @Override public List listMyClass() { String hql = "select c from ClsClass c,StuStudent s where c.classId=s.classId and s.userId=? and s.status=?"; System.out.println(ClientUtils.getUserId()); List result = find(hql, CollectionUtils.newList(ClientUtils.getUserId(), StuStudent.STATUS_ACTIVE), ClsClass.class); return result; } /** * 删除班级 */ @Override public Result deleteClass(String[] classIds) { for (String classId : classIds) { deleteClass(classId); //删除班级学员 this.deleteStudent(classId); //删除班级课程 this.deleteClassSubject(classId); } return new Result(true, "success"); } /** * 删除班级学员 */ private void deleteStudent(String classId) { this.bulkUpdate("update StuStudent set deleteFlag = 1 where classId = ?", new Object[] {classId}); } /** * 删除班级课程 */ private void deleteClassSubject(String classId) { this.bulkUpdate("delete from ClsClassReSubject where classId=?", new Object[] {classId}); } /** * @param classId 班级id * @return */ private Result deleteClass(String classId) { ClsClass cls = read(ClsClass.class, classId); TraceUtils.setUpdateTrace(cls); cls.setDeleteFlag(true); save(cls); return new Result(true, "success"); } @Override public List> getSubjectLstByClsId(String classId) { String hql = "from MySubjectV where classId = ?"; List mySubjectVList = find(hql,CollectionUtils.newList(classId),MySubjectV.class); List> maps = new ArrayList<>(); for(MySubjectV mySubjectV : mySubjectVList){ List myLectureVList = lectureService.listLectureVBySubjectId(mySubjectV.getId().getUserId(),mySubjectV.getId().getSubjectId(), "", 1000, 1, null); Double percent = 0.0; Double progressValue = 0.0; Double percentAvg = 0.0; if(!myLectureVList.isEmpty()) { for (MyLectureV myLectureV : myLectureVList) { if (myLectureV.getPercent() != null && myLectureV.getProgressValue() != null) { percent += myLectureV.getPercent(); progressValue += myLectureV.getProgressValue().intValue(); } } percentAvg = percent / myLectureVList.size(); if (percentAvg.isNaN()) { percentAvg = 0.0; } } } return null; } @Override public Result addStudent(String classId, int count) { clsDao.addStudent(classId, count); return new Result(true); } @Cacheable(value = "ClsClassService_ClassActivityInfo") @Override public Map getClassActivityInfo(String classId) { Map result = scoreService.queryClassHomeworkScoreInfo(classId); result.putAll(scoreService.queryClassExamScoreInfo(classId)); ClsClass cls = read(classId); result.put("classId", cls.getClassId()); result.put("className", cls.getName()); result.put("coverPageUrl", cls.getImgPath()); result.put("status", cls.getProgress()); result.put("studentCount", cls.getStudentCount()); result.put("startTime", cls.getStartTime()); return result; } @Override public Result getAllClassLst() { String hql = "select c.name as className, c.teacherId as teacherId ,c.classId as classId ,c.classNumber as classNumber from ClsClass c where c.deleteFlag is false "; List> classLst = findListWithMapByHql(hql, null); int classCount = findCountByComplexHql("from ClsClass where deleteFlag is false", null); return new Result(true, "success", CollectionUtils.newObjectMap("classLst", classLst, "classCount", classCount)); } @Override public List getClassLstByTeacherId() { String hql = "select c from ClsClass c,UserTeacher t where " + " EXISTS(select 1 from ClsClassReSubject r ,Subject s where r.subjectId=s.subjectId and r.classId =c.classId and r.deleteFlag is false and s.teacherId = t.teacherId) and t.userId= ? order by c.createTime desc "; return find(hql, CollectionUtils.newList(ClientUtils.getUserId()), ClsClass.class); } @Override public List> queryAvailableClassIdAndName(String teacherId,String subjectId) { StringBuffer hql = new StringBuffer(1000); // and c.endTime>=sysdate() 增加条件过滤掉历史班级 hql.append("select c.classId as classId ,c.name as className from ClsClass c where c.deleteFlag is false and c.orgId=:orgId and c.createId=:createId " ); Map queryParam = new HashMap(); queryParam.put("orgId", ClientUtils.getOrgId()); queryParam.put("createId", ClientUtils.getUserId()); if(StringUtils.isNotEmpty(teacherId)||StringUtils.isNotEmpty(subjectId)){ hql.append(" and exists (select 1 from ClsClassReSubject r ,Subject s where r.subjectId=s.subjectId and r.classId =c.classId and r.deleteFlag is false "); } if(!StringUtils.isEmpty(teacherId)){ hql.append(" and s.teacherId=:teacherId "); queryParam.put("teacherId", teacherId); } if(!StringUtils.isEmpty(subjectId)){ hql.append(" and s.origSubjectId=:subjectId "); queryParam.put("subjectId", subjectId); } if(StringUtils.isNotEmpty(teacherId)||StringUtils.isNotEmpty(subjectId)){ hql.append(")"); } return this.findListWithMapByHql(hql.toString(), queryParam); } @Override public List> queryAllClassIdAndName() { StringBuffer hql = new StringBuffer(500); // c.deleteFlag is false and hql.append("select c.classId as classId ,c.name as className from ClsClass c where c.endTime>=:endTime and deleteFlag is false and c.orgId=:orgId " ); return this.findListWithMapByHql(hql.toString(), CollectionUtils.newObjectMap("endTime",new Date(),"orgId",ClientUtils.getOrgId())); } /** * 查询班级 * * type 1正常班級,2历史班級 */ public Result classList(String keyword, Pager pager, int type) { //获取老师id String teacherId = teacherService.getTeacherIdByUserId(ClientUtils.getUserId()); if (StringUtils.isEmpty(teacherId)) { return new Result(false, "非老师角色无法查看班级"); } QClsClass qClsClass = QClsClass.clsClass; QSubject qSubject = QSubject.subject; QClsClassReSubject qClsClassReSubject = QClsClassReSubject.clsClassReSubject; QSubjectProgressTreeV qSubjectProgressTreeV = QSubjectProgressTreeV.subjectProgressTreeV; //查询脚本 JPAQuery queryDsl = this.getQueryFactory() .select(qClsClass.name, qClsClass.classId, qClsClass.classNumber, qClsClass.studentCount, qClsClass.createTime, qClsClass.startTime, qClsClass.endTime, qSubject) .from(qClsClass, qSubject, qClsClassReSubject) .where(qClsClass.deleteFlag.isFalse().and((type == 2 ? qClsClass.endTime.lt(new Date()) : qClsClass.endTime.gt(new Date()))).and(qClsClass.name.like("%" + keyword + "%")) .and(qSubject.teacherId.eq(teacherId)).and(qSubject.deleteFlag.isFalse()) .and(qClsClassReSubject.deleteFlag.isFalse()) .and(qClsClassReSubject.classId.eq(qClsClass.classId)) .and(qClsClassReSubject.subjectId.eq(qSubject.subjectId))) .groupBy(qClsClass.classId); //总数 long count = queryDsl.fetchCount(); //listData List> listData = queryDsl.limit(pager.getPageSize()).offset(pager.getOffset()) .orderBy(qClsClass.createTime.desc(), qSubject.createTime.desc()).fetch().stream().map(tuple -> { Map map = new HashMap(); Subject subject = tuple.get(qSubject); map.put("className", tuple.get(qClsClass.name)); map.put("classId", tuple.get(qClsClass.classId)); map.put("classNumber", tuple.get(qClsClass.classNumber)); map.put("studentCount", tuple.get(qClsClass.studentCount)); map.put("createTime", tuple.get(qClsClass.createTime)); map.put("startTime", tuple.get(qClsClass.startTime)); map.put("endTime", tuple.get(qClsClass.endTime)); if (subject != null) { map.put("subjectName", subject.getName()); map.put("progressPercent", this.getQueryFactory().select(qSubjectProgressTreeV.percent.avg()) .from(qSubjectProgressTreeV) .where(qSubjectProgressTreeV.id.nodeId.eq(subject.getSubjectId()) .and(qSubjectProgressTreeV.nodeType.eq(Progress.PROGRESS_TYPE_SUBJECT))) .groupBy(qSubjectProgressTreeV.id.nodeId).fetchOne()); } else { map.put("subjectName", "暂无开班课程"); map.put("progressPercent", 0); } return map; }).collect(Collectors.toList()); return new Result(true, "success", CollectionUtils.newObjectMap("count", count, "listData", listData)); } @Override public String [] queryClassNamesByIds(String[] classIds){ if(classIds!=null && classIds.length==0){ return null; } String [] classNames = null; List> lstResult= this.findListWithMapByHql("select c.classId as classId ,c.name as className from ClsClass c where c.classId in (:classIds) ", CollectionUtils.newObjectMap("classIds",classIds)); if(lstResult!=null && lstResult.size()==classIds.length){ Map map= new HashMap(lstResult.size()); classNames =new String [classIds.length]; for(Map item:lstResult){ map.put((String)item.get("classId"), (String)item.get("className")); } for(int i=0;i queryStudentClassesByUserId(String userId) { return this.find("from ClsClass c where c.deleteFlag is false and exists( select 1 from StuStudent t where t.classId = c.classId and t.userId=? and t.status=? ) ", CollectionUtils.newList(userId,StuStudent.STATUS_ACTIVE),ClsClass.class); } }