package com.dsh.course.service.impl; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpResponse; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dsh.course.entity.*; import com.dsh.course.feignclient.model.RecordAppoint; import com.dsh.course.feignclient.other.StoreClient; import com.dsh.course.feignclient.other.model.Store; import com.dsh.course.mapper.*; import com.dsh.course.model.DeductionClassHour; import com.dsh.course.model.DeductionClassHourList; import com.dsh.course.service.CourseCounsumService; import com.dsh.course.service.ICoursePackageOrderStudentService; import com.dsh.course.service.ICoursePackageSchedulingService; import com.dsh.course.service.TCoursePackageService; import com.dsh.course.util.DateTimeHelper; import com.dsh.course.util.DateUtil; import com.dsh.course.util.ToolUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * @author zhibing.pu * @Date 2023/11/25 14:06 */ @Service public class CoursePackageOrderStudentServiceImpl extends ServiceImpl implements ICoursePackageOrderStudentService { @Resource private CoursePackageStudentMapper cpsMapper; @Resource private CancelledClassesMapper cacMapper; @Autowired private ICoursePackageSchedulingService coursePackageSchedulingService; @Autowired private CourseCounsumService courseCounsumService; @Resource private TCoursePackageMapper tcpmapper; @Resource private StoreClient stoClient; @Autowired private TCoursePackageService coursePackageService; @Resource private CoursePackageStudentMapper coursePackageStudentMapper; @Override public List obtainStuClassDetails(Integer stuId, Integer appUserId, Integer pageNum) { List recordVoList = new ArrayList<>(); List tCoursePackagePayments = this.baseMapper.selectList(new QueryWrapper() .eq("studentId", stuId) .eq("appUserId", appUserId) .eq("status", 1) .orderByDesc("insertTime")); Calendar calendar = Calendar.getInstance(); calendar.setTime(new Date()); calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List list = coursePackageSchedulingService.list(new QueryWrapper() .eq("appUserId", appUserId) .eq("studentId", stuId) .orderByAsc("classDate") ); List ids = list.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList()); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy.MM.dd"); SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm"); if (list.size() > 0) { int pageSize = 10; // 每页记录数 Page page = new Page<>(pageNum, pageSize); IPage coursePackageStudentPage = cpsMapper.selectPage(page, new QueryWrapper() .in("coursePackageSchedulingId", ids) .eq("reservationStatus", 1)); List coursePackageStudent1 = coursePackageStudentPage.getRecords(); if (ToolUtil.isNotEmpty(coursePackageStudent1) && coursePackageStudent1.size() > 0) { TCoursePackage coursePackage = new TCoursePackage(); Integer coursePackageId = -1; for (CoursePackageStudent coursePackageStudent : coursePackageStudent1) { RecordAppoint recordVo = new RecordAppoint(); recordVo.setCoursePackageId(coursePackageStudent.getCoursePackageId()); if (!coursePackageStudent.getCoursePackageId().equals(coursePackageId)) { coursePackage = tcpmapper.selectById(coursePackageStudent.getCoursePackageId()); coursePackageId = coursePackageStudent.getCoursePackageId(); } recordVo.setSid(Arrays.asList(coursePackage.getStoreId())); List rid = stoClient.querySiteId(coursePackage.getStoreId()); recordVo.setRid(rid); recordVo.setUserId(appUserId); recordVo.setSiteId(coursePackage.getSiteId()); List ids1 = getIds(coursePackage.getSiteId()); recordVo.setIds(ids1); recordVo.setCoursePackageName(coursePackage.getName()); for (CoursePackageOrderStudent tCoursePackagePayment : tCoursePackagePayments) { if (Objects.equals(coursePackageStudent.getCoursePackageId(), tCoursePackagePayment.getCoursePackageId())) { recordVo.setCourseHours(tCoursePackagePayment.getTotalClassHours()); } } CoursePackageScheduling coursePackageScheduling = coursePackageSchedulingService.getById(coursePackageStudent.getCoursePackageSchedulingId()); if (coursePackageScheduling == null) { continue; } String dateString1 = sdf.format(coursePackageScheduling.getClassDate()); String dateString2 = sdf.format(coursePackageScheduling.getEndDate()); recordVo.setTimeFrame(dateString1 + "-" + dateString2.substring(11)); Store store = stoClient.queryStoreById(coursePackage.getStoreId()); recordVo.setStoreNameAddr(store.getName() + store.getAddress()); recordVo.setCourseStuRecordId(coursePackageStudent.getId()); String classWeeks = coursePackage.getClassWeeks(); String[] split = classWeeks.split(";"); List integerList = Arrays.asList(split); String weekOfDate = DateTimeHelper.getWeekOfDate(new Date()); String dat = simpleDateFormat.format(coursePackageScheduling.getClassDate()) + " " + dateString1.substring(11); String ed = simpleDateFormat.format(coursePackageScheduling.getEndDate()) + " " + dateString2.substring(11); Date start = null; Date end = null; try { start = format.parse(dat); end = format.parse(ed); } catch (ParseException e) { throw new RuntimeException(e); } CancelledClasses cancelledClasses = cacMapper.selectOne(new QueryWrapper() .eq("coursePackageSchedulingId", coursePackageScheduling.getId()).last("limit 1")); if (new Date().after(start)&&new Date().before(end)){ recordVo.setStatus(2); } //待上课 if (start.after(new Date())) { recordVo.setStatus(1); } //已取消 if (coursePackageScheduling.getStatus() == 4) { recordVo.setStatus(4); } //已请假 if (coursePackageStudent.getSignInOrNot() == 2) { recordVo.setStatus(5); } //已完成 if (ToolUtil.isNotEmpty(cancelledClasses)) { recordVo.setStatus(3); // 消课 到课状态0 旷课 if (coursePackageStudent.getSignInOrNot() == 0) { recordVo.setStatus(6); } } recordVoList.add(recordVo); } } else { } } return recordVoList; } public List getIds(Integer siteId) { HttpRequest httpRequest = HttpRequest.get("https://port.daowepark.com/v7/user_api/general/get_space_area?space_id=" + siteId); HttpResponse execute = httpRequest.execute(); String body = execute.body(); JSONObject jsonObject = JSONObject.parseObject(body); Object data = jsonObject.get("data"); JSONArray array = JSONArray.parseArray(data.toString()); List ids = new ArrayList<>(); for (Object o : array) { JSONObject jsonObject1 = JSONObject.parseObject(o.toString()); Object id = jsonObject1.get("id"); Integer integer = Integer.valueOf(id.toString()); ids.add(integer); } return ids; } /** * 扣除学员课时 * @param deductionClassHourList * @return */ @Override public DeductionClassHourList deductionClassHour(DeductionClassHourList deductionClassHourList) { try { List list = deductionClassHourList.getDeductionClassHourList(); for (DeductionClassHour deductionClassHour : list) { CoursePackageOrderStudent coursePackageOrderStudent = this.getById(deductionClassHour.getId()); Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours(); coursePackageOrderStudent.setLaveClassHours(coursePackageOrderStudent.getLaveClassHours() - deductionClassHour.getClassHour()); //计算需要删除几个排课记录 TCoursePackage coursePackage = coursePackageService.getById(coursePackageOrderStudent.getCoursePackageId()); Integer codeTime = coursePackage.getCodeTime(); //未上的排课数据 List packageSchedulings = coursePackageSchedulingService.list(new QueryWrapper().eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("type", 1).eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()).eq("status", 1).orderByDesc("classDate")); //已经排课的总课时 int classHour = packageSchedulings.size() * codeTime; //未排课的课时 int notClass = laveClassHours - classHour; /** * 1、查询剩余已经排课的数据 * 2、判断 剩余课时- 未上排课 = 可扣减 -->是否满足扣减 * --->满足扣减,直接减去剩余课时 * --->不满足扣减,需要计算出删除的排课节数(注意每节消耗的课时数),然后减去剩余课时 */ //判断是否需要删除排课数据 if(notClass < deductionClassHour.getClassHour()){ //计算需要删除的排课数量 int clss = deductionClassHour.getClassHour() - notClass; int n = clss % codeTime; int num = clss / codeTime; //不整除的情况,需要多删除一节排课,回加差额课时。 if(n != 0){ num += 1; } //删除已排的课程 List coursePackageSchedulings = packageSchedulings.subList(0, num); List collect = coursePackageSchedulings.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList()); if(collect.size() > 0){ coursePackageSchedulingService.removeByIds(collect); coursePackageStudentMapper.delete(new QueryWrapper().in("coursePackageSchedulingId", collect)); } deductionClassHour.setScheduledCourses(num); }else{ deductionClassHour.setScheduledCourses(0); } this.updateById(coursePackageOrderStudent); CourseCounsum courseCounsum = new CourseCounsum(); courseCounsum.setPaymentId(coursePackageOrderStudent.getId()); courseCounsum.setChangeType(0); courseCounsum.setNum(deductionClassHour.getClassHour()); courseCounsum.setInsertTime(new Date()); courseCounsum.setReason("社区世界杯报名"); courseCounsum.setAppUserId(coursePackageOrderStudent.getAppUserId()); courseCounsumService.save(courseCounsum); } return deductionClassHourList; }catch (Exception e){ e.printStackTrace(); } return null; } /** * 回退课时和回退排课数据 * @param deductionClassHourList */ @Override public void backspaceClassHour(DeductionClassHourList deductionClassHourList) { List list = deductionClassHourList.getDeductionClassHourList(); for (DeductionClassHour deductionClassHour : list) { CoursePackageOrderStudent coursePackageOrderStudent = this.getById(deductionClassHour.getId()); Integer laveClassHours = coursePackageOrderStudent.getLaveClassHours(); coursePackageOrderStudent.setLaveClassHours(coursePackageOrderStudent.getLaveClassHours() + deductionClassHour.getClassHour()); this.updateById(coursePackageOrderStudent); CourseCounsum courseCounsum = new CourseCounsum(); courseCounsum.setPaymentId(coursePackageOrderStudent.getId()); courseCounsum.setChangeType(1); courseCounsum.setNum(deductionClassHour.getClassHour()); courseCounsum.setInsertTime(new Date()); courseCounsum.setReason("取消社区世界杯报名"); courseCounsum.setAppUserId(coursePackageOrderStudent.getAppUserId()); courseCounsumService.save(courseCounsum); //需要排课的节数 Integer scheduledCourses = deductionClassHour.getScheduledCourses(); if(scheduledCourses > 0){ TCoursePackage coursePackage = coursePackageService.getById(coursePackageOrderStudent.getCoursePackageId()); Integer codeTime = coursePackage.getCodeTime(); CoursePackageScheduling one = coursePackageSchedulingService.getOne(new QueryWrapper().eq("studentId", coursePackageOrderStudent.getStudentId()) .eq("type", 1).eq("coursePackageId", coursePackageOrderStudent.getCoursePackageId()).eq("status", 1) .orderByDesc("classDate").last(" limit 0, 1")); //上课星期 String classWeeks = coursePackage.getClassWeeks(); List week = week(classWeeks); //新排课的开始日期 Calendar start = Calendar.getInstance(); String classStartTime = coursePackage.getClassStartTime(); String classEndTime = coursePackage.getClassEndTime(); String[] split = classStartTime.split(","); String[] split1 = classEndTime.split(","); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //计算剩余课时最大排课节数 int num = laveClassHours / codeTime; //比较除哪个最小以哪个来确定排课节数 num = num > scheduledCourses ? scheduledCourses : num; //先检查当前是都还有需要排课的 if(null != one){ Date classDate = one.getClassDate(); Calendar calendar = Calendar.getInstance(); calendar.setTime(classDate); String s = sdf.format(calendar.getTime()); for (int j = 0; j < split.length; j++) { Date parse = null; Date parse1 = null; try { parse = format.parse(s + " " + split[j]); parse1 = format.parse(s + " " + split1[j]); } catch (ParseException e) { throw new RuntimeException(e); } if(classDate.getTime() >= parse.getTime()){ continue; } //开始组装排课数据 CoursePackageScheduling packageScheduling = new CoursePackageScheduling(); packageScheduling.setType(1); packageScheduling.setAppUserId(coursePackageOrderStudent.getAppUserId()); packageScheduling.setStudentId(coursePackageOrderStudent.getStudentId()); packageScheduling.setCoursePackageId(coursePackage.getId()); packageScheduling.setClassDate(parse); packageScheduling.setEndDate(parse1); packageScheduling.setStatus(1); coursePackageSchedulingService.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); num--; if(num <= 0){ return; } } calendar.set(Calendar.DAY_OF_YEAR, calendar.get(Calendar.DAY_OF_YEAR) + 1); start = calendar; } if(num <= 0){ return; } //继续排后面的数据 while (true) { 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; } for (int j = 0; j < split.length; j++) { //开始组装排课数据 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); coursePackageSchedulingService.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(); } num--; if(num <= 0){ return; } } 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; } }