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<String> 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<String> 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<String> 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<CourseSchedule> 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<CourseSchedule> 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<CourseSchedule> 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<Object> 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<Object> 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<CourseSchedule> 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<Object> 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<Object> 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<CourseSchedule> 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<Object> 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<Object> 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<String> 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<Integer> 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<Object> 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);
|
}
|
|
|
}
|