package com.qxueyou.scc.admin.course.service.impl; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.qxueyou.scc.admin.classroom.model.ClassRoom; import com.qxueyou.scc.admin.course.model.CourseSchedule; import com.qxueyou.scc.admin.course.model.CourseScheduleDetail; import com.qxueyou.scc.admin.course.model.CourseScheduleReCls; import com.qxueyou.scc.admin.course.service.ICourseScheduleService; 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.impl.CommonAppService; import com.qxueyou.scc.base.util.ClientUtils; import com.qxueyou.scc.base.util.CollectionUtils; import com.qxueyou.scc.base.util.QBeanUtils; import com.qxueyou.scc.base.util.TraceUtils; import com.qxueyou.scc.exam.model.ExamInfo; import com.qxueyou.scc.teach.subject.model.Subject; import com.qxueyou.scc.user.model.UserTeacher; @Service public class CourseScheduleService extends CommonAppService implements ICourseScheduleService { public final static String FULL_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"; public final static String SHORT_DATE_FORMAT = "yyyy-MM-dd"; public final static String SHORT_TIME_FORMAT = "HH:mm:ss"; public final static String TIME_SPLIT = "-"; @Autowired private ITeacherService teacherService; @Override public String add(CourseSchedule courseSchedule) throws Exception { TraceUtils.setCreateTrace(courseSchedule); courseSchedule.setOrgId(ClientUtils.getOrgId()); courseSchedule.setStatus(CourseSchedule.STATUS_DRAFT); //保存教师信息 UserTeacher teacher= teacherService.getTeacherByUserId(ClientUtils.getUserId()); if(teacher!=null){ courseSchedule.setTeacherId(teacher.getTeacherId()); courseSchedule.setTeacherName(teacher.getName()); }else{ courseSchedule.setTeacherId(ClientUtils.getUserId()); courseSchedule.setTeacherName(ClientUtils.getUserName()); } Subject subject = this.read(Subject.class, courseSchedule.getSubjectId()); if(subject.getType()==Subject.TYPE_PUBLIC_SUBJECT){ courseSchedule.setOpenFlag(CourseSchedule.OPEN_TRUE); }else{ courseSchedule.setOpenFlag(CourseSchedule.OPEN_FALSE); } this.insert(courseSchedule); //生成关联关系 List lstClassIds= QBeanUtils.listPropertyVal(courseSchedule.getReClasses(), "classId"); this.doClearAndAddReClass(courseSchedule.getScheduleId(),lstClassIds==null?null:lstClassIds.toArray(new String[lstClassIds.size()])); //生成明细 this.doCreateScheduleDetail(courseSchedule); return courseSchedule.getScheduleId(); } @Override public Result update(CourseSchedule courseSchedule) throws Exception { CourseSchedule newCourseSchedule = read(CourseSchedule.class, courseSchedule.getScheduleId()); if (newCourseSchedule == null) { return new Result(false, "课表不存在"); } TraceUtils.setUpdateTrace(newCourseSchedule); newCourseSchedule.setSubjectId(courseSchedule.getSubjectId()); newCourseSchedule.setRoomId(courseSchedule.getRoomId()); newCourseSchedule.setMark(courseSchedule.getMark()); newCourseSchedule.setBeginTime(courseSchedule.getBeginTime()); newCourseSchedule.setEndTime(courseSchedule.getEndTime()); newCourseSchedule.setMonTime(courseSchedule.getMonTime()); newCourseSchedule.setTueTime(courseSchedule.getTueTime()); newCourseSchedule.setWedTime(courseSchedule.getWedTime()); newCourseSchedule.setThuTime(courseSchedule.getThuTime()); newCourseSchedule.setFriTime(courseSchedule.getFriTime()); newCourseSchedule.setSatTime(courseSchedule.getSatTime()); newCourseSchedule.setSumTime(courseSchedule.getSumTime()); //保存教师信息 UserTeacher teacher= teacherService.getTeacherByUserId(ClientUtils.getUserId()); if(teacher!=null){ courseSchedule.setTeacherId(teacher.getTeacherId()); courseSchedule.setTeacherName(teacher.getName()); }else{ courseSchedule.setTeacherId(ClientUtils.getUserId()); courseSchedule.setTeacherName(ClientUtils.getUserName()); } Subject subject = this.read(Subject.class, courseSchedule.getSubjectId()); if(subject.getType()==Subject.TYPE_PUBLIC_SUBJECT){ courseSchedule.setOpenFlag(CourseSchedule.OPEN_TRUE); }else{ courseSchedule.setOpenFlag(CourseSchedule.OPEN_FALSE); } this.save(newCourseSchedule); List lstClassIds= QBeanUtils.listPropertyVal(newCourseSchedule.getReClasses(), "classId"); //更新关联关系 this.doClearAndAddReClass(courseSchedule.getScheduleId(),lstClassIds==null?null:lstClassIds.toArray(new String[lstClassIds.size()])); //生成明细 this.doCreateScheduleDetail(courseSchedule); // 保存课程班级信息 return new Result(true); } /** * 清理并添加直播权限班级 * @param liveId * @param classIds */ private void doClearAndAddReClass(String scheduleId, String [] classIds) { List reIdLst = this.find("select r.reId from CourseScheduleReCls r where r.scheduleId=?", CollectionUtils.newList(scheduleId), String.class); //删除关联关系 if(reIdLst!=null && reIdLst.size()>0){ this.bulkUpdateInLoop("delete from CourseScheduleReCls where reId=?", reIdLst.toArray()); } if(classIds != null && classIds.length > 0){ for(String classId:classIds){ CourseScheduleReCls re = new CourseScheduleReCls(); TraceUtils.setCreateTrace(re); re.setClassId(classId); re.setScheduleId(scheduleId); save(re); } } } @Override public Result delete(String[] scheduleIds) { Result result = new Result(true); if (scheduleIds != null && scheduleIds.length > 0) { String hql = "update CourseSchedule set deleteFlag = true where scheduleId=?"; result = bulkUpdateInLoop(hql, scheduleIds); } return result; } @Override public Result doRelease(String[] scheduleIds) { if(scheduleIds==null || scheduleIds.length==0){ return new Result(false, "没有选择要发布的课表"); } List lstCourseSchedule = this.findByComplexHql("from CourseSchedule where scheduleId in (:scheduleIds)", CollectionUtils.newObjectMap("scheduleIds",scheduleIds), CourseSchedule.class); for (CourseSchedule schedule : lstCourseSchedule) { if (CourseSchedule.STATUS_DRAFT != schedule.getStatus()) { return new Result(false, "只有草稿状态的课表,才能发布。"); } schedule.setStatus(ClassRoom.STATUS_PUBLISH); TraceUtils.setUpdateTrace(schedule); save(schedule); } return new Result(true); } @Override public Result doCancel(String[] scheduleIds) { if(scheduleIds==null || scheduleIds.length==0){ return new Result(false, "没有选择要撤回的课表"); } List lstCourseSchedule = this.findByComplexHql("from CourseSchedule where scheduleId in (:scheduleIds)", CollectionUtils.newObjectMap("scheduleIds",scheduleIds), CourseSchedule.class); for (CourseSchedule schedule : lstCourseSchedule) { if (CourseSchedule.STATUS_PUBLISH != schedule.getStatus()) { return new Result(false, "只有发布状态的课表,才能撤回"); } schedule.setStatus(ExamInfo.STATUS_DRAFT); TraceUtils.setUpdateTrace(schedule); save(schedule); } return new Result(true); } @Override public List list(String keyword, Short status, Integer pageSize, Integer pageNum) { StringBuffer hql = new StringBuffer(500); hql.append(" from CourseSchedule c left join fetch c.subject s left join fetch c.classes where s.name like ? and c.createId=? "); List params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId()); if(status!=null){ hql.append(" and c.status = ? "); params.add(status); } hql.append(" and c.deleteFlag is false order by c.createTime desc"); return findList(hql.toString(),new Pager(pageSize, pageNum),params, CourseSchedule.class); } @Override public int listCount(String keyword,Short status) { StringBuffer hql = new StringBuffer(500); hql.append(" from CourseSchedule c left join c.subject s where s.name like ? and c.createId=? "); List params = CollectionUtils.newList('%' + keyword.trim() + '%',ClientUtils.getUserId()); if(status!=null){ hql.append(" and c.status = ? "); params.add(status); } hql.append(" and c.deleteFlag is false "); return findCount(hql.toString(),params); } @Override public CourseSchedule detail(String courseScheduleId) { return this.read(CourseSchedule.class, courseScheduleId); } //查询当前的课表明细信息, @Override public List listTeacherOfSchedule(String date,Integer pageSize, Integer pageNum) throws Exception{ SimpleDateFormat sdfFull = new SimpleDateFormat(FULL_DATE_FORMAT); StringBuffer hql = new StringBuffer(1000); hql.append("from CourseScheduleDetail d left join fetch d.courseSchedule s left join fetch s.subject j left join fetch s.classRoom m left join fetch s.classes c "); hql.append(" where d.deleteFlag is false and d.beginTime>=? and d.endTime<=? "); hql.append(" and s.status=? and s.deleteFlag is false"); List params = CollectionUtils.newList(); params.add(sdfFull.parse(date+" 00:00:00")); params.add(sdfFull.parse(date+" 23:59:59")); params.add(CourseSchedule.STATUS_PUBLISH); UserTeacher teacher = ClientUtils.isAdmin() ? null : teacherService.getTeacherByUserId(ClientUtils.getUserId()); if(teacher!=null){ hql.append(" and s.teacherId =?"); params.add(teacher.getTeacherId()); } hql.append(" and d.deleteFlag is false order by d.beginTime asc"); return findList(hql.toString(),new Pager(pageSize, pageNum),params, CourseSchedule.class); } //查询当前的课表明细信息 @Override public int listTeacherOfScheduleCount(String date,Integer pageSize, Integer pageNum) throws ParseException{ SimpleDateFormat sdf = new SimpleDateFormat(FULL_DATE_FORMAT); StringBuffer hql = new StringBuffer(1000); hql.append(" from CourseScheduleDetail d left join d.courseSchedule s where "); hql.append(" d.deleteFlag is false and d.beginTime>=? and d.endTime<=? "); hql.append(" and s.status=? and s.deleteFlag is false and d.deleteFlag is false "); List params = CollectionUtils.newList(); params.add(sdf.parse(date + " 00:00:00")); params.add(sdf.parse(date + " 23:59:59")); params.add(CourseSchedule.STATUS_PUBLISH); UserTeacher teacher = ClientUtils.isAdmin() ? null : teacherService.getTeacherByUserId(ClientUtils.getUserId()); if(teacher!=null){ hql.append(" and s.teacherId =?"); params.add(teacher.getTeacherId()); } return findCount(hql.toString(),params); } //查询当前的课表明细信息 @Override public List listStudentSchedule(String date,Integer pageSize, Integer pageNum) throws Exception{ StringBuffer hql = new StringBuffer(1000); hql.append("from CourseScheduleDetail d left join fetch d.courseSchedule s left join fetch s.subject j left join fetch s.classRoom m left join fetch s.classes c "); hql.append(" where d.beginTime>=? and d.endTime<=? "); hql.append(" and (c.classId=? or s.openFlag=?) and s.status=? "); SimpleDateFormat sdf = new SimpleDateFormat(FULL_DATE_FORMAT); List params = CollectionUtils.newList(); params.add(sdf.parse(date+" 00:00:00")); params.add(sdf.parse(date+" 23:59:59")); params.add(ClientUtils.getClassId()); params.add(CourseSchedule.OPEN_TRUE); params.add(CourseSchedule.STATUS_PUBLISH); hql.append(" and d.deleteFlag is false and s.deleteFlag is false order by d.beginTime asc"); return findList(hql.toString(),new Pager(pageSize, pageNum),params, CourseSchedule.class); } //查询当前的课表明细信息 @Override public int listStudentScheduleCount(String date,Integer pageSize, Integer pageNum) throws Exception{ StringBuffer hql = new StringBuffer(1000); hql.append(" from CourseScheduleDetail d left join d.courseSchedule s left join s.classes c "); hql.append(" where d.beginTime>=? and d.endTime<=? "); hql.append(" and (c.classId=? or s.openFlag=?) and s.status=? "); hql.append(" and d.deleteFlag is false and s.deleteFlag is false"); SimpleDateFormat sdfFull = new SimpleDateFormat(FULL_DATE_FORMAT); List params = CollectionUtils.newList(); params.add(sdfFull.parse(date+" 00:00:00")); params.add(sdfFull.parse(date+" 23:59:59")); params.add(ClientUtils.getClassId()); params.add(CourseSchedule.OPEN_TRUE); params.add(CourseSchedule.STATUS_PUBLISH); return findCount(hql.toString(),params); } //生成明细数据 private void doCreateScheduleDetail(CourseSchedule courseSchedule) throws Exception{ SimpleDateFormat sdf = new SimpleDateFormat(SHORT_DATE_FORMAT); String scheduleId = courseSchedule.getScheduleId(); //清理旧的关联关系 List detailIdLst = this.find("select d.detailId from CourseScheduleDetail d where d.scheduleId=?", CollectionUtils.newList(scheduleId), String.class); if(detailIdLst!=null && detailIdLst.size()>0){ this.bulkUpdateInLoop("delete from CourseScheduleDetail where detailId=?", detailIdLst.toArray()); } //重新生成新的明细 Calendar cal = Calendar.getInstance(); cal.setTime(courseSchedule.getBeginTime()); cal.set(Calendar.HOUR, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); int dayOfWeek = -1; String courseTime = null,strDate = null; String [] arrTime = null; do{ dayOfWeek = cal.get(Calendar.DAY_OF_WEEK); switch(dayOfWeek){ case 1 : courseTime =courseSchedule.getSumTime();break; case 2 : courseTime =courseSchedule.getMonTime();break; case 3 : courseTime =courseSchedule.getTueTime();break; case 4 : courseTime =courseSchedule.getWedTime();break; case 5 : courseTime =courseSchedule.getThuTime();break; case 6 : courseTime =courseSchedule.getFriTime();break; case 7 : courseTime =courseSchedule.getSatTime();break; default: break; } if(StringUtils.isNotEmpty(courseTime)){ arrTime = courseTime.split(TIME_SPLIT); strDate = sdf.format(cal.getTime()); this.insertScheduleDetail(strDate.concat(" ").concat(arrTime[0]).concat(":00"),strDate.concat(" ").concat(arrTime[1]).concat(":00"),courseSchedule.getScheduleId()); } cal.add(Calendar.DATE, 1); //+1 }while(cal.getTime().getTime()<=courseSchedule.getEndTime().getTime()); } private void insertScheduleDetail(String beginTime,String endTime, String scheduleId) throws ParseException{ CourseScheduleDetail detail = new CourseScheduleDetail(); SimpleDateFormat sdf = new SimpleDateFormat(FULL_DATE_FORMAT); detail.setBeginTime(sdf.parse(beginTime)); detail.setEndTime(sdf.parse(endTime)); detail.setScheduleId(scheduleId); detail.setDeleteFlag(false); TraceUtils.setCreateTrace(detail); this.save(detail); } @Override public List queryDateFlag(int year ,int month){ StringBuffer hql = new StringBuffer(1000); hql.append(" select day(d.beginTime) from CourseScheduleDetail d left join d.courseSchedule s "); hql.append(" where d.deleteFlag is false and d.beginTime >= ? and d.endTime <= ? "); hql.append(" and s.status=? and s.deleteFlag is false "); Date beginDate=null,endDate=null; Calendar cal = Calendar.getInstance(); cal.set(year, month-1, 1, 0 ,0 ,0); beginDate = cal.getTime(); cal.clear(); cal.set(Calendar.YEAR,year); cal.set(Calendar.MONTH,month-1); cal.set(Calendar.DATE,cal.getActualMaximum(Calendar.DATE)); cal.set(Calendar.HOUR, 23); cal.set(Calendar.MINUTE, 59); cal.set(Calendar.SECOND, 59); endDate = cal.getTime(); List params = CollectionUtils.newList(); params.add(beginDate); params.add(endDate); params.add(CourseSchedule.STATUS_PUBLISH); UserTeacher teacher = ClientUtils.isAdmin() ? null : teacherService.getTeacherByUserId(ClientUtils.getUserId()); if(teacher!=null){ hql.append(" and s.teacherId =?"); params.add(teacher.getTeacherId()); } hql.append(" group by day(d.beginTime)"); return this.find(hql.toString(), params, Integer.class); } }