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<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://try.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;
|
}
|
}
|