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<CoursePackageSchedulingMapper, CoursePackageScheduling> 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<Map<String, Object>> queryCoursePackageSchedulingList(Page<Map<String, Object>> page, QueryCoursePackageSchedulingList queryCoursePackageSchedulingList) {
|
List<Map<String, Object>> list = this.baseMapper.queryCoursePackageSchedulingList(page, queryCoursePackageSchedulingList);
|
for (Map<String, Object> map : list) {
|
Long id = Long.valueOf(map.get("id").toString());
|
int count = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", id).eq("reservationStatus", 1));
|
// map.put("registered", count);
|
int count1 = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", id).eq("reservationStatus", 1));
|
int count2 = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().eq("coursePackageSchedulingId", id).eq("reservationStatus", 0));
|
|
CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingMapper.selectById(id);
|
|
List<CoursePackageScheduling> coursePackageSchedulings = coursePackageSchedulingMapper.selectList(new QueryWrapper<CoursePackageScheduling>().eq("classDate", coursePackageScheduling.getClassDate()).eq("coursePackageId", coursePackageScheduling.getCoursePackageId()));
|
List<Long> scs = new ArrayList<>();
|
for (CoursePackageScheduling packageScheduling : coursePackageSchedulings) {
|
scs.add(packageScheduling.getId());
|
}
|
int res = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().in("coursePackageSchedulingId", scs).eq("signInOrNot", 2));
|
int act = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().in("coursePackageSchedulingId", scs).eq("signInOrNot", 1));
|
int nonArrival = coursePackageStudentService.count(new QueryWrapper<CoursePackageStudent>().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<CoursePackageScheduling> coursePackageSchedulings = coursePackageSchedulingMapper.selectList(new QueryWrapper<CoursePackageScheduling>().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<CoursePackageScheduling>().eq("status", 2).last(" and now() >= endDate"));
|
for (CoursePackageScheduling coursePackageScheduling : coursePackageSchedulings) {
|
coursePackageScheduling.setStatus(3);
|
coursePackageScheduling.setCoursePackageId(null);
|
coursePackageSchedulingMapper.updateById(coursePackageScheduling);
|
}
|
}
|
}).start();
|
}
|
|
@Override
|
public List<AppUserVideoResponse> queryAll(List<Long> longs) {
|
|
if (longs.size() > 0) {
|
List<AppUserVideoResponse> 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<TCoursePackage> list2 = coursePackageService.list(new QueryWrapper<TCoursePackage>().eq("status", 2).eq("auditStatus", 2)
|
.eq("state", 1).eq("type", 1));
|
List<Integer> collect = list2.stream().map(TCoursePackage::getId).collect(Collectors.toList());
|
if(collect.size() == 0){
|
return;
|
}
|
List<CoursePackageOrderStudent> list = coursePackageOrderStudentService.list(new QueryWrapper<CoursePackageOrderStudent>()
|
.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<CoursePackageScheduling>()
|
.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<Integer> 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<CoursePackageScheduling>()
|
.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<Integer> week(String week) {
|
String[] split = week.split(";");
|
ArrayList<Integer> 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<CoursePackageScheduling>()
|
.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<Integer> 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<CoursePackageScheduling>()
|
.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<Integer> 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<TStudent> tStudents = studentClient.queryExpiredList();
|
for (TStudent tStudent : tStudents) {
|
List<CoursePackageScheduling> list1 = this.list(new QueryWrapper<CoursePackageScheduling>()
|
.eq("type", 1)
|
.eq("studentId", tStudent.getId())
|
.eq("status", 1)
|
);
|
if(list1.size() > 0){
|
List<Long> collect = list1.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList());
|
this.removeByIds(collect);
|
coursePackageStudentMapper.delete(new QueryWrapper<CoursePackageStudent>()
|
.in("coursePackageSchedulingId", collect)
|
);
|
}
|
|
List<CoursePackageOrderStudent> list = coursePackageOrderStudentService.list(new QueryWrapper<CoursePackageOrderStudent>()
|
.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<CoursePackageOrderStudent> list = coursePackageOrderStudentService.list(new QueryWrapper<CoursePackageOrderStudent>()
|
.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<CoursePackageScheduling>()
|
.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<Integer> 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<CoursePackageScheduling>()
|
.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);
|
}
|
}
|
}
|
}
|