From 1d9f7b0cf4251f3058badb07dd7a2bc06b6bc09a Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期五, 11 四月 2025 10:05:32 +0800 Subject: [PATCH] bug修改 --- cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageOrderStudentServiceImpl.java | 469 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 467 insertions(+), 2 deletions(-) diff --git a/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageOrderStudentServiceImpl.java b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageOrderStudentServiceImpl.java index c8f143b..691b95e 100644 --- a/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageOrderStudentServiceImpl.java +++ b/cloud-server-course/src/main/java/com/dsh/course/service/impl/CoursePackageOrderStudentServiceImpl.java @@ -1,10 +1,35 @@ 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.CoursePackageOrderStudent; -import com.dsh.course.mapper.CoursePackageOrderStudentMapper; +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 @@ -12,4 +37,444 @@ */ @Service public class CoursePackageOrderStudentServiceImpl extends ServiceImpl<CoursePackageOrderStudentMapper, CoursePackageOrderStudent> 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<RecordAppoint> obtainStuClassDetails(Integer stuId, Integer appUserId, Integer pageNum) { + List<RecordAppoint> recordVoList = new ArrayList<>(); + List<CoursePackageOrderStudent> tCoursePackagePayments = this.baseMapper.selectList(new QueryWrapper<CoursePackageOrderStudent>() + .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<CoursePackageScheduling> list = coursePackageSchedulingService.list(new QueryWrapper<CoursePackageScheduling>() + .eq("appUserId", appUserId) + .eq("studentId", stuId) + .orderByAsc("classDate") + ); + List<Long> 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<CoursePackageStudent> page = new Page<>(pageNum, pageSize); + IPage<CoursePackageStudent> coursePackageStudentPage = cpsMapper.selectPage(page, new QueryWrapper<CoursePackageStudent>() + .in("coursePackageSchedulingId", ids) + .eq("reservationStatus", 1)); + List<CoursePackageStudent> 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<Integer> rid = stoClient.querySiteId(coursePackage.getStoreId()); + recordVo.setRid(rid); + recordVo.setUserId(appUserId); + recordVo.setSiteId(coursePackage.getSiteId()); + List<Integer> 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<String> 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<CancelledClasses>() + .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<Integer> 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<Integer> 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<DeductionClassHour> 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<CoursePackageScheduling> packageSchedulings = coursePackageSchedulingService.list(new QueryWrapper<CoursePackageScheduling>().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<CoursePackageScheduling> coursePackageSchedulings = packageSchedulings.subList(0, num); + List<Long> collect = coursePackageSchedulings.stream().map(CoursePackageScheduling::getId).collect(Collectors.toList()); + if(collect.size() > 0){ + coursePackageSchedulingService.removeByIds(collect); + coursePackageStudentMapper.delete(new QueryWrapper<CoursePackageStudent>().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<DeductionClassHour> 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<CoursePackageScheduling>().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<Integer> 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<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; + } } -- Gitblit v1.7.1