package com.dsh.course.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.course.controller.CoursePackagePaymentController; import com.dsh.course.entity.*; import com.dsh.course.feignclient.account.StudentClient; import com.dsh.course.feignclient.account.model.Student; import com.dsh.course.feignclient.account.model.TStudent; import com.dsh.course.mapper.CoursePackageSchedulingMapper; import com.dsh.course.mapper.CoursePackageStudentMapper; import com.dsh.course.model.QueryCoursePackageSchedulingList; import com.dsh.course.model.vo.response.AppUserVideoResponse; import com.dsh.course.service.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author zhibing.pu * @Date 2023/8/11 10:58 */ @Service public class CoursePackageSchedulingServiceImpl extends ServiceImpl implements ICoursePackageSchedulingService { @Autowired private CoursePackageStudentService coursePackageStudentService; @Autowired private TCoursePackageServiceImpl coursePackageService; @Resource private CoursePackageSchedulingMapper coursePackageSchedulingMapper; @Autowired private TCoursePackagePaymentService packagePaymentService; @Autowired private ICoursePackageOrderService coursePackageOrderService; @Autowired private ICoursePackageOrderStudentService coursePackageOrderStudentService; @Resource private CoursePackageStudentMapper coursePackageStudentMapper; @Resource private StudentClient studentClient; @Autowired private CourseCounsumService courseCounsumService; /** * 获取课包排课数据 * * @param page * @param queryCoursePackageSchedulingList * @return */ @Override public List> queryCoursePackageSchedulingList(Page> page, QueryCoursePackageSchedulingList queryCoursePackageSchedulingList) { List> list = this.baseMapper.queryCoursePackageSchedulingList(page, queryCoursePackageSchedulingList); for (Map map : list) { Long id = Long.valueOf(map.get("id").toString()); int count = coursePackageStudentService.count(new QueryWrapper().eq("coursePackageSchedulingId", id).eq("reservationStatus", 1)); // map.put("registered", count); int count1 = coursePackageStudentService.count(new QueryWrapper().eq("coursePackageSchedulingId", id).eq("reservationStatus", 1)); int count2 = coursePackageStudentService.count(new QueryWrapper().eq("coursePackageSchedulingId", id).eq("reservationStatus", 0)); CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingMapper.selectById(id); List coursePackageSchedulings = coursePackageSchedulingMapper.selectList(new QueryWrapper().eq("classDate", coursePackageScheduling.getClassDate()).eq("coursePackageId", coursePackageScheduling.getCoursePackageId())); List scs = new ArrayList<>(); for (CoursePackageScheduling packageScheduling : coursePackageSchedulings) { scs.add(packageScheduling.getId()); } int res = coursePackageStudentService.count(new QueryWrapper().in("coursePackageSchedulingId", scs).eq("signInOrNot", 2)); int act = coursePackageStudentService.count(new QueryWrapper().in("coursePackageSchedulingId", scs).eq("signInOrNot", 1)); int nonArrival = coursePackageStudentService.count(new QueryWrapper().in("coursePackageSchedulingId", scs).eq("signInOrNot", 0)); map.put("registered", res); map.put("actualArrival", act); map.put("nonArrival",nonArrival); // Integer totalClassHours = (Integer) map.get("totalClassHours"); // Integer laveClassHours = (Integer) map.get("laveClassHours"); // map.put("already",totalClassHours-laveClassHours); } return list; } /** * 定时修改状态 */ @Override public void taskSetStatus() { new Thread(new Runnable() { @Override public void run() { //开始数据 List coursePackageSchedulings = coursePackageSchedulingMapper.selectList(new QueryWrapper().eq("status", 1).last(" and now() >= classDate and now() < endDate")); for (CoursePackageScheduling coursePackageScheduling : coursePackageSchedulings) { coursePackageScheduling.setStatus(2); coursePackageScheduling.setCoursePackageId(null); coursePackageSchedulingMapper.updateById(coursePackageScheduling); TCoursePackage coursePackage = coursePackageService.getById(coursePackageScheduling.getCoursePackageId()); if (null != coursePackage && coursePackage.getStatus() == 1) { coursePackage.setStatus(2); coursePackageService.updateById(coursePackage); } } //结束数据 coursePackageSchedulings = coursePackageSchedulingMapper.selectList(new QueryWrapper().eq("status", 2).last(" and now() >= endDate")); for (CoursePackageScheduling coursePackageScheduling : coursePackageSchedulings) { coursePackageScheduling.setStatus(3); coursePackageScheduling.setCoursePackageId(null); coursePackageSchedulingMapper.updateById(coursePackageScheduling); } } }).start(); } @Override public List queryAll(List longs) { if (longs.size() > 0) { List appUserVideoResponses = this.baseMapper.queryAll(longs); for (AppUserVideoResponse appUserVideoRespon : appUserVideoResponses) { if (appUserVideoRespon.getVideoId() != null) { if (this.baseMapper.isHave(appUserVideoRespon.getVideoId()) > 0) { appUserVideoRespon.setStudyStatus(2); } else { appUserVideoRespon.setStudyStatus(1); } } } return appUserVideoResponses; } else return null; } /** * 每周一凌晨定时添加排课数据 */ @Override public void taskCoursePackageScheduling() { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List list2 = coursePackageService.list(new QueryWrapper().eq("status", 2).eq("auditStatus", 2) .eq("state", 1).eq("type", 1)); List collect = list2.stream().map(TCoursePackage::getId).collect(Collectors.toList()); if(collect.size() == 0){ return; } List list = coursePackageOrderStudentService.list(new QueryWrapper() .eq("status", 1) .eq("state", 1) .gt("useTime", "now()") .gt("laveClassHours", 0) .in("coursePackageId", collect) ); for (CoursePackageOrderStudent coursePackageOrderStudent : list) { CoursePackageScheduling coursePackageScheduling = this.getOne(new QueryWrapper() .eq("appUserId", coursePackageOrderStudent.getAppUserId()) .eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()) .eq("status", 1) .orderByDesc("classDate") .last(" limit 0, 1") ); Student student = studentClient.queryStudentById(coursePackageScheduling.getStudentId()); Date validity = student.getValidity(); TCoursePackage coursePackage = coursePackageService.getById(coursePackageScheduling.getCoursePackageId()); //上课星期 String classWeeks = coursePackage.getClassWeeks(); List week = week(classWeeks); //新排课的开始日期 Calendar start = Calendar.getInstance(); if(null != coursePackageScheduling){ Date classDate = coursePackageScheduling.getClassDate(); Calendar calendar = Calendar.getInstance(); calendar.setTime(classDate); calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1); start = calendar; } //需要排课的天数 int day_week = start.get(Calendar.DAY_OF_WEEK); day_week = day_week - 1 == 0 ? 7 : day_week - 1; Integer num = 8 - day_week + 7; String classStartTime = coursePackage.getClassStartTime(); String classEndTime = coursePackage.getClassEndTime(); String[] split = classStartTime.split(","); String[] split1 = classEndTime.split(","); //有效期 Date useTime = coursePackageOrderStudent.getUseTime(); //剩余课时(需要扣除已排课但是还未上课的数据) Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours(); int count = this.count(new QueryWrapper() .eq("appUserId", coursePackageOrderStudent.getAppUserId()) .eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()) .eq("status", 1) .eq("type", 1) ); Integer codeTime = coursePackage.getCodeTime(); laveClassHours -= count; //剩余数量不足以排课 if (laveClassHours.compareTo(codeTime) < 0) { break; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //生成一周的排课数据 for (int i = 0; i < num; i++) { String s = sdf.format(start.getTime()); //判断当天是否在排课星期内 int day = start.get(Calendar.DAY_OF_WEEK); day = day - 1 == 0 ? 7 : day - 1; if (!week.contains(day)) { start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1); continue; } //大于有效期不进行排课 if (start.getTimeInMillis() >= validity.getTime()) { break; } for (int j = 0; j < split.length; j++) { //剩余数量不足以排课 if (laveClassHours.compareTo(codeTime) < 0) { break; } //减少剩余课时数量 laveClassHours -= codeTime; //开始组装排课数据 CoursePackageScheduling packageScheduling = new CoursePackageScheduling(); packageScheduling.setType(1); packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId()); packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId()); packageScheduling.setCoursePackageId(coursePackage.getId()); try { Date parse = format.parse(s + " " + split[j]); Date parse1 = format.parse(s + " " + split1[j]); packageScheduling.setClassDate(parse); packageScheduling.setEndDate(parse1); packageScheduling.setStatus(1); this.save(packageScheduling); CoursePackageStudent student1 = new CoursePackageStudent(); student1.setAppUserId(coursePackageOrderStudent.getAppUserId()); student1.setStudentId(coursePackageOrderStudent.getStudentId()); student1.setCoursePackageId(coursePackage.getId()); student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId()); student1.setCoursePackageSchedulingId(packageScheduling.getId()); student1.setSignInOrNot(1); student1.setReservationStatus(1); student1.setInsertTime(new Date()); student1.setType(1); coursePackageStudentMapper.insert(student1); } catch (Exception e) { e.printStackTrace(); } } start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1); } } } private List week(String week) { String[] split = week.split(";"); ArrayList integers = new ArrayList<>(); for (String s : split) { switch (s) { case "周一": integers.add(1); break; case "周二": integers.add(2); break; case "周三": integers.add(3); break; case "周四": integers.add(4); break; case "周五": integers.add(5); break; case "周六": integers.add(6); break; case "周日": integers.add(7); break; } } return integers; } /** * 处理剩余课时已经全部排完课后临时增加课时后添加排课 * @param coursePackageOrderStudentId */ @Override public void addNewCoursePackageScheduling(Long coursePackageOrderStudentId, Integer classNumber) { try { CoursePackageOrderStudent coursePackageOrderStudent = coursePackageOrderStudentService.getById(coursePackageOrderStudentId); CoursePackageScheduling coursePackageScheduling = this.getOne(new QueryWrapper() .eq("appUserId", coursePackageOrderStudent.getAppUserId()) .eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()) .eq("status", 1) .orderByDesc("classDate") .last(" limit 0, 1") ); TCoursePackage coursePackage = coursePackageService.getById(coursePackageOrderStudent.getCoursePackageId()); Integer codeTime = coursePackage.getCodeTime(); Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours(); Student student = studentClient.queryStudentById(coursePackageOrderStudent.getStudentId()); Date validity = student.getValidity(); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); int day_week = calendar.get(Calendar.DAY_OF_WEEK); day_week = day_week - 1 == 0 ? 7 : day_week - 1; calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 7 - day_week); calendar.set(Calendar.HOUR_OF_DAY, 23); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 59); //新有效期 Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(coursePackageOrderStudent.getUseTime()); calendar1.set(Calendar.DAY_OF_YEAR, calendar1.get(Calendar.DAY_OF_YEAR) + classNumber); Date useTime = calendar1.getTime(); //剩余课时已不足以继续排课,且最后一次的排课时间是在本周(因为定时任务会周一凌晨去继续进行排课处理 // 如果最后一次排课时间不是本周,则直接增加剩余课时,剩余排课逻辑交由定时任务处理) if(0 == laveClassHours){ //从第二天开始 Calendar startTime = Calendar.getInstance(); startTime.setTime(new Date()); startTime.set(Calendar.DAY_OF_YEAR, startTime.get(Calendar.DAY_OF_YEAR) + 1); startTime.set(Calendar.HOUR_OF_DAY, 0); startTime.set(Calendar.MINUTE, 0); startTime.set(Calendar.SECOND, 0); int day_week1 = startTime.get(Calendar.DAY_OF_WEEK); day_week1 = day_week1 - 1 == 0 ? 7 : day_week1 - 1; int num = 8 - day_week1 + 7; //上课星期 String classWeeks = coursePackage.getClassWeeks(); List week = week(classWeeks); //新剩余课时 laveClassHours += classNumber; String classStartTime = coursePackage.getClassStartTime(); String classEndTime = coursePackage.getClassEndTime(); String[] split = classStartTime.split(","); String[] split1 = classEndTime.split(","); for (int i = 0; i < num; i++) { Date time1 = startTime.getTime(); //判断当天是否在排课星期内 int day = startTime.get(Calendar.DAY_OF_WEEK); day = day - 1 == 0 ? 7 : day - 1; if (!week.contains(day)) { startTime.set(Calendar.DAY_OF_YEAR, startTime.get(Calendar.DAY_OF_YEAR) + 1); continue; } //大于有效期不进行排课 if (startTime.getTimeInMillis() >= validity.getTime()) { break; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); for (int j = 0; j < split.length; j++) { //剩余数量不足以排课 if (laveClassHours.compareTo(codeTime) < 0) { break; } laveClassHours -= codeTime; CoursePackageScheduling packageScheduling = new CoursePackageScheduling(); packageScheduling.setType(coursePackage.getType()); packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId()); packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId()); packageScheduling.setCoursePackageId(coursePackage.getId()); Date parse = sdf.parse(sdf1.format(time1) + " " + split[j]); Date parse1 = sdf.parse(sdf1.format(time1) + " " + split1[j]); packageScheduling.setClassDate(parse); packageScheduling.setEndDate(parse1); packageScheduling.setStatus(1); this.save(packageScheduling); CoursePackageStudent student1 = new CoursePackageStudent(); student1.setAppUserId(coursePackageOrderStudent.getAppUserId()); student1.setStudentId(coursePackageOrderStudent.getStudentId()); student1.setCoursePackageId(coursePackage.getId()); student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId()); student1.setCoursePackageSchedulingId(packageScheduling.getId()); student1.setSignInOrNot(1); student1.setReservationStatus(1); student1.setInsertTime(new Date()); coursePackageStudentMapper.insert(student1); } //增加日期,用于判断 startTime.set(Calendar.DAY_OF_YEAR, startTime.get(Calendar.DAY_OF_YEAR) + 1); } }else{ Date classDate = new Date(); if (coursePackageScheduling!=null){ classDate = coursePackageScheduling.getClassDate(); } int count = this.count(new QueryWrapper() .eq("appUserId", coursePackageOrderStudent.getAppUserId()) .eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()) .eq("status", 1) ); Integer number = laveClassHours - count; if((number.compareTo(codeTime) > 0 && calendar.getTimeInMillis() > classDate.getTime())||coursePackageScheduling==null){ //从第二天开始 Calendar startTime = Calendar.getInstance(); // startTime.setTime(coursePackageScheduling.getClassDate()); startTime.setTime(classDate); startTime.set(Calendar.DAY_OF_YEAR, startTime.get(Calendar.DAY_OF_YEAR) + 1); startTime.set(Calendar.HOUR_OF_DAY, 0); startTime.set(Calendar.MINUTE, 0); startTime.set(Calendar.SECOND, 0); int day_week1 = startTime.get(Calendar.DAY_OF_WEEK); day_week1 = day_week1 - 1 == 0 ? 7 : day_week1 - 1; int num = 8 - day_week1 + 7; //上课星期 String classWeeks = coursePackage.getClassWeeks(); List week = week(classWeeks); //新剩余课时 number += classNumber; //判断最后一天是否所有时段都已排完 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format(classDate); String time = format.substring(0,format.indexOf(" ") + 1); String classStartTime = coursePackage.getClassStartTime(); String classEndTime = coursePackage.getClassEndTime(); String[] split = classStartTime.split(","); String[] split1 = classEndTime.split(","); int n = Arrays.asList(split).indexOf(time); if(n != split.length - 1){ //单独处理剩余没排课的时段 n++; for (int i = n; i < split.length; i++) { //剩余数量不足以排课 if (number.compareTo(codeTime) < 0) { break; } number -= codeTime; CoursePackageScheduling packageScheduling = new CoursePackageScheduling(); packageScheduling.setType(coursePackage.getType()); packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId()); packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId()); packageScheduling.setCoursePackageId(coursePackage.getId()); Date parse = sdf.parse(format.format(time) + " " + split[i]); Date parse1 = sdf.parse(format.format(time) + " " + split1[i]); packageScheduling.setClassDate(parse); packageScheduling.setEndDate(parse1); packageScheduling.setStatus(1); this.save(packageScheduling); CoursePackageStudent student1 = new CoursePackageStudent(); student1.setAppUserId(coursePackageOrderStudent.getAppUserId()); student1.setStudentId(coursePackageOrderStudent.getStudentId()); student1.setCoursePackageId(coursePackage.getId()); student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId()); student1.setCoursePackageSchedulingId(packageScheduling.getId()); student1.setSignInOrNot(1); student1.setReservationStatus(1); student1.setInsertTime(new Date()); coursePackageStudentMapper.insert(student1); } } for (int i = 0; i < num; i++) { Date time1 = startTime.getTime(); //判断当天是否在排课星期内 int day = startTime.get(Calendar.DAY_OF_WEEK); day = day - 1 == 0 ? 7 : day - 1; if (!week.contains(day)) { startTime.set(Calendar.DAY_OF_YEAR, startTime.get(Calendar.DAY_OF_YEAR) + 1); continue; } //大于有效期不进行排课 if (startTime.getTimeInMillis() >= validity.getTime()) { break; } for (int j = 0; j < split.length; j++) { //剩余数量不足以排课 if (number.compareTo(codeTime) < 0) { break; } number -= codeTime; CoursePackageScheduling packageScheduling = new CoursePackageScheduling(); packageScheduling.setType(coursePackage.getType()); packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId()); packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId()); packageScheduling.setCoursePackageId(coursePackage.getId()); Date parse = sdf.parse(sdf1.format(time1) + " " + split[j]); Date parse1 = sdf.parse(sdf1.format(time1) + " " + split1[j]); packageScheduling.setClassDate(parse); packageScheduling.setEndDate(parse1); packageScheduling.setStatus(1); this.save(packageScheduling); CoursePackageStudent student1 = new CoursePackageStudent(); student1.setAppUserId(coursePackageOrderStudent.getAppUserId()); student1.setStudentId(coursePackageOrderStudent.getStudentId()); student1.setCoursePackageId(coursePackage.getId()); student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId()); student1.setCoursePackageSchedulingId(packageScheduling.getId()); student1.setSignInOrNot(1); student1.setReservationStatus(1); student1.setInsertTime(new Date()); coursePackageStudentMapper.insert(student1); } //增加日期,用于判断 startTime.set(Calendar.DAY_OF_YEAR, startTime.get(Calendar.DAY_OF_YEAR) + 1); } } } //开始更新剩余课时和有效期 coursePackageOrderStudent.setTotalClassHours(coursePackageOrderStudent.getTotalClassHours() + classNumber); coursePackageOrderStudent.setLaveClassHours(coursePackageOrderStudent.getLaveClassHours() + classNumber); coursePackageOrderStudent.setUseTime(useTime); coursePackageOrderStudent.setStatus(1); coursePackageOrderStudentService.updateById(coursePackageOrderStudent); if(null == student.getValidity()){ student.setValidity(useTime); }else if(student.getValidity().getTime() < useTime.getTime()){ student.setValidity(useTime); } studentClient.frozen(student); }catch (Exception e){ e.printStackTrace(); } } /** * 过时清零排课记录及剩余课时数据 */ @Override public void taskOverdueClearing() { List tStudents = studentClient.queryExpiredList(); for (TStudent tStudent : tStudents) { List list1 = this.list(new QueryWrapper() .eq("type", 1) .eq("studentId", tStudent.getId()) .eq("status", 1) ); if(list1.size() > 0){ List collect = list1.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList()); this.removeByIds(collect); coursePackageStudentMapper.delete(new QueryWrapper() .in("coursePackageSchedulingId", collect) ); } List list = coursePackageOrderStudentService.list(new QueryWrapper() .eq("studentId", tStudent.getId()) .eq("status", 1) .eq("state", 1) ); for (CoursePackageOrderStudent coursePackageOrderStudent : list) { CourseCounsum courseCounsum = new CourseCounsum(); courseCounsum.setChangeType(0); courseCounsum.setNum(coursePackageOrderStudent.getLaveClassHours()); courseCounsum.setReason("有效期结束清楚剩余课时"); courseCounsum.setInsertTime(new Date()); courseCounsum.setAppUserId(coursePackageOrderStudent.getAppUserId()); courseCounsumService.save(courseCounsum); coursePackageOrderStudent.setLaveClassHours(0); } if(list.size() > 0){ coursePackageOrderStudentService.updateBatchById(list); } } } /** * 课程开课后检查排课 */ @Override public void startAndScheduleClasses(Integer coursePackageId) { List list = coursePackageOrderStudentService.list(new QueryWrapper() .eq("status", 1) .eq("state", 1) .gt("useTime", "now()") .gt("laveClassHours", 0) .eq("coursePackageId", coursePackageId) ); for (CoursePackageOrderStudent coursePackageOrderStudent : list) { CoursePackageScheduling coursePackageScheduling = this.getOne(new QueryWrapper() .eq("appUserId", coursePackageOrderStudent.getAppUserId()) .eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()) .eq("status", 1) .orderByDesc("classDate") .last(" limit 0, 1") ); //当前时间小于最后一次排课时间则交由定时任务排课 if(null != coursePackageScheduling && System.currentTimeMillis() <= coursePackageScheduling.getClassDate().getTime()){ continue; } //当前时间大于最后一次排课时间,表明已经断开了定时任务的排课逻辑,需要从第二天手动排课。后续的排课还是让定时任务排课 Student student = studentClient.queryStudentById(coursePackageScheduling.getStudentId()); Date validity = student.getValidity(); TCoursePackage coursePackage = coursePackageService.getById(coursePackageScheduling.getCoursePackageId()); //上课星期 String classWeeks = coursePackage.getClassWeeks(); List week = week(classWeeks); //新排课的开始日期 Calendar start = Calendar.getInstance(); start.setTime(new Date()); start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1); //需要排课的天数 int day_week = start.get(Calendar.DAY_OF_WEEK); day_week = day_week - 1 == 0 ? 7 : day_week - 1; Integer num = 8 - day_week + 7; String classStartTime = coursePackage.getClassStartTime(); String classEndTime = coursePackage.getClassEndTime(); String[] split = classStartTime.split(","); String[] split1 = classEndTime.split(","); //有效期 Date useTime = coursePackageOrderStudent.getUseTime(); //剩余课时(需要扣除已排课但是还未上课的数据) Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours(); int count = this.count(new QueryWrapper() .eq("appUserId", coursePackageOrderStudent.getAppUserId()) .eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()) .eq("status", 1) .eq("type", 1) ); Integer codeTime = coursePackage.getCodeTime(); laveClassHours -= count; //剩余数量不足以排课 if (laveClassHours.compareTo(codeTime) < 0) { break; } SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //生成一周的排课数据 for (int i = 0; i < num; i++) { String s = sdf.format(start.getTime()); //判断当天是否在排课星期内 int day = start.get(Calendar.DAY_OF_WEEK); day = day - 1 == 0 ? 7 : day - 1; if (!week.contains(day)) { start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1); continue; } //大于有效期不进行排课 if (start.getTimeInMillis() >= validity.getTime()) { break; } for (int j = 0; j < split.length; j++) { //剩余数量不足以排课 if (laveClassHours.compareTo(codeTime) < 0) { break; } //减少剩余课时数量 laveClassHours -= codeTime; //开始组装排课数据 CoursePackageScheduling packageScheduling = new CoursePackageScheduling(); packageScheduling.setType(1); packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId()); packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId()); packageScheduling.setCoursePackageId(coursePackage.getId()); try { Date parse = format.parse(s + " " + split[j]); Date parse1 = format.parse(s + " " + split1[j]); packageScheduling.setClassDate(parse); packageScheduling.setEndDate(parse1); packageScheduling.setStatus(1); this.save(packageScheduling); CoursePackageStudent student1 = new CoursePackageStudent(); student1.setAppUserId(coursePackageOrderStudent.getAppUserId()); student1.setStudentId(coursePackageOrderStudent.getStudentId()); student1.setCoursePackageId(coursePackage.getId()); student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId()); student1.setCoursePackageSchedulingId(packageScheduling.getId()); student1.setSignInOrNot(1); student1.setReservationStatus(1); student1.setInsertTime(new Date()); student1.setType(1); coursePackageStudentMapper.insert(student1); } catch (Exception e) { e.printStackTrace(); } } start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1); } } } }