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.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.*;
|
|
/**
|
* @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;
|
|
|
/**
|
* 获取课包排课数据
|
*
|
* @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));
|
|
|
map.put("registered", count2);
|
map.put("actualArrival", count1);
|
map.put("nonArrival", count - count1);
|
// Integer totalClassHours = (Integer) map.get("totalClassHours");
|
// Integer laveClassHours = (Integer) map.get("laveClassHours");
|
// map.put("already",totalClassHours-laveClassHours);
|
|
|
}
|
return list;
|
}
|
|
|
|
|
|
/**
|
* 定时修改状态
|
*/
|
@Override
|
public void cancel() {
|
new Thread(new Runnable() {
|
@Override
|
public void run() {
|
List<TCoursePackagePayment> list = packagePaymentService.list();
|
Date now = new Date();
|
List<Long> pays = new ArrayList<>();
|
for (TCoursePackagePayment coursePackagePayment : list) {
|
if (now.before(coursePackagePayment.getUseTime())) {
|
pays.add(coursePackagePayment.getId());
|
}
|
}
|
|
List<CoursePackageStudent> coursePackagePaymentId = coursePackageStudentService.list(new QueryWrapper<CoursePackageStudent>().in("coursePackagePaymentId", pays));
|
List<Long> scs = new ArrayList<>();
|
for (CoursePackageStudent coursePackageStudent : coursePackagePaymentId) {
|
scs.add(coursePackageStudent.getCoursePackageSchedulingId());
|
}
|
coursePackageStudentService.remove(new QueryWrapper<CoursePackageStudent>().in("coursePackagePaymentId", pays));
|
coursePackageSchedulingMapper.delete(new QueryWrapper<CoursePackageScheduling>().in("id", scs));
|
|
|
}
|
}).start();
|
}
|
|
/**
|
* 定时修改状态
|
*/
|
@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 (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<CoursePackageOrderStudent> list = coursePackageOrderStudentService.list(new QueryWrapper<CoursePackageOrderStudent>()
|
.eq("status", 1)
|
.eq("state", 1)
|
.gt("useTime", "now()")
|
.gt("laveClassHours", 0)
|
);
|
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")
|
);
|
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)
|
);
|
laveClassHours -= count;
|
|
Integer codeTime = coursePackage.getCodeTime();
|
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() >= useTime.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(Integer coursePackageOrderStudentId, Integer classNumber) {
|
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();
|
Date classDate = coursePackageScheduling.getClassDate();
|
|
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);
|
|
//剩余课时已不足以继续排课,且最后一次的排课时间是在本周(因为定时任务会周一凌晨去继续进行排课处理
|
// 如果最后一次排课时间不是本周,则直接增加剩余课时,剩余排课逻辑交由定时任务处理)
|
if(codeTime.compareTo(laveClassHours) > 0 && calendar.getTimeInMillis() > classDate.getTime()){
|
//从第二天开始
|
Calendar startTime = Calendar.getInstance();
|
startTime.setTime(new Date());
|
startTime.set(Calendar.DAY_OF_YEAR, calendar.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;
|
//新有效期
|
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();
|
|
//判断最后一天是否所有时段都已排完
|
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");
|
String format = sdf.format(coursePackageScheduling.getClassDate());
|
String time = format.substring(format.indexOf(" "));
|
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 (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());
|
try {
|
Date parse = sdf.parse(format.format(time) + " " + split[i]);
|
Date parse1 = sdf.parse(format.format(time) + " " + split1[i]);
|
packageScheduling.setClassDate(parse);
|
packageScheduling.setEndDate(parse1);
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
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() >= useTime.getTime()) {
|
break;
|
}
|
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());
|
try {
|
Date parse = sdf.parse(sdf1.format(time1) + " " + split[j]);
|
Date parse1 = sdf.parse(sdf1.format(time1) + " " + split1[j]);
|
packageScheduling.setClassDate(parse);
|
packageScheduling.setEndDate(parse1);
|
}catch (Exception e){
|
e.printStackTrace();
|
}
|
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);
|
coursePackageOrderStudentService.updateById(coursePackageOrderStudent);
|
}
|
|
}
|
}
|