puzhibing
2023-11-27 331f26c7c15716ea60d37745235919b201a4c0fa
添加周排课的定时任务
3个文件已修改
196 ■■■■■ 已修改文件
cloud-server-course/src/main/java/com/dsh/course/service/ICoursePackageSchedulingService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageSchedulingServiceImpl.java 177 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/util/TaskUtil.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-course/src/main/java/com/dsh/course/service/ICoursePackageSchedulingService.java
@@ -41,4 +41,11 @@
     * 每周一凌晨定时添加排课数据
     */
    void taskCoursePackageScheduling();
    /**
     * 处理剩余课时已经全部排完课后临时增加课时后添加排课
     * @param coursePackageOrderStudentId
     */
    void addNewCoursePackageScheduling(Integer coursePackageOrderStudentId, Integer classNumber);
}
cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageSchedulingServiceImpl.java
@@ -193,16 +193,18 @@
            List<Integer> week = week(classWeeks);
            //新排课的开始日期
            Calendar start = Calendar.getInstance();
            //需要排课的天数
            Integer num = 14;
            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;
                num = 7;
            }
            //需要排课的天数
            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(",");
@@ -244,7 +246,7 @@
                    }
                    //减少剩余课时数量
                    laveClassHours -= codeTime;
                    //开始组装排课数据
                    CoursePackageScheduling packageScheduling = new CoursePackageScheduling();
                    packageScheduling.setType(1);
                    packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId());
@@ -263,7 +265,7 @@
                        student1.setStudentId(coursePackageOrderStudent.getStudentId());
                        student1.setCoursePackageId(coursePackage.getId());
                        student1.setCoursePackagePaymentId(coursePackageOrderStudent.getId());
                        student1.setCoursePackageSchedulingId(coursePackageScheduling.getId());
                        student1.setCoursePackageSchedulingId(packageScheduling.getId());
                        student1.setSignInOrNot(1);
                        student1.setReservationStatus(1);
                        student1.setInsertTime(new Date());
@@ -276,7 +278,6 @@
                start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1);
            }
        }
    }
@@ -311,4 +312,168 @@
        }
        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);
        }
    }
}
cloud-server-course/src/main/java/com/dsh/course/util/TaskUtil.java
@@ -95,8 +95,16 @@
     */
    @Scheduled(cron = "0 0 23 * * *")
    public void zeroTask() {
        //定时添加排课数据
        coursePackageSchedulingService.taskAddData();
        coursePackageSchedulingService.cancel();
    }
    /**
     * 每周一执行的定时任务
     */
    @Scheduled(cron = "0 0 0 * * 2")
    public void weekTask() {
        //定时添加排课数据
        coursePackageSchedulingService.taskCoursePackageScheduling();
    }
}