无关风月
2024-07-11 eb6b6dbb35a9f029e0b7d269773685c19fd40976
cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageSchedulingServiceImpl.java
@@ -7,6 +7,7 @@
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;
@@ -18,6 +19,7 @@
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author zhibing.pu
@@ -49,6 +51,9 @@
    @Resource
    private StudentClient studentClient;
    @Autowired
    private CourseCounsumService courseCounsumService;
    /**
@@ -111,7 +116,7 @@
                    coursePackageSchedulingMapper.updateById(coursePackageScheduling);
                    TCoursePackage coursePackage = coursePackageService.getById(coursePackageScheduling.getCoursePackageId());
                    if (coursePackage.getStatus() == 1) {
                    if (null != coursePackage && coursePackage.getStatus() == 1) {
                        coursePackage.setStatus(2);
                        coursePackageService.updateById(coursePackage);
                    }
@@ -157,21 +162,19 @@
    @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)
        );
        List<CoursePackageOrder> list1 = coursePackageOrderService.list(new QueryWrapper<CoursePackageOrder>()
                .eq("payStatus", 2)
                .eq("status", 1)
                .eq("state", 1)
                .gt("laveClassHours", 0)
                .orderByAsc("insertTime")
        );
        for (CoursePackageOrderStudent coursePackageOrderStudent : list) {
            CoursePackageScheduling coursePackageScheduling = this.getOne(new QueryWrapper<CoursePackageScheduling>()
                    .eq("appUserId", coursePackageOrderStudent.getAppUserId())
@@ -568,6 +571,170 @@
        }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);
            }
        }
    }
}