ソースを参照

feat:关心包、加油包

Joburgess 4 年 前
コミット
da18003a9c

+ 20 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/PracticeGroupSellPrice.java

@@ -39,6 +39,10 @@ public class PracticeGroupSellPrice {
 
     private BigDecimal highOnlineTenCourseActivityPriceWithOldUser;
 
+    private BigDecimal carePackagePrice;
+
+    private BigDecimal comeOnPackagePrice;
+
     private Date createTime;
 
     private Date updateTime;
@@ -178,4 +182,20 @@ public class PracticeGroupSellPrice {
     public void setHighOnlineTenCourseActivityPriceWithOldUser(BigDecimal highOnlineTenCourseActivityPriceWithOldUser) {
         this.highOnlineTenCourseActivityPriceWithOldUser = highOnlineTenCourseActivityPriceWithOldUser;
     }
+
+    public BigDecimal getCarePackagePrice() {
+        return carePackagePrice;
+    }
+
+    public void setCarePackagePrice(BigDecimal carePackagePrice) {
+        this.carePackagePrice = carePackagePrice;
+    }
+
+    public BigDecimal getComeOnPackagePrice() {
+        return comeOnPackagePrice;
+    }
+
+    public void setComeOnPackagePrice(BigDecimal comeOnPackagePrice) {
+        this.comeOnPackagePrice = comeOnPackagePrice;
+    }
 }

+ 10 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/EduPracticeGroupService.java

@@ -26,6 +26,16 @@ public interface EduPracticeGroupService {
     HttpResponseResult buyPracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo);
 
     /**
+     * @describe 创建关心包、加油包课程
+     * @author Joburgess
+     * @date 2021/1/28 0028
+     * @param practiceGroupBuyParams:
+     * @param operatorInfo:
+     * @return com.ym.mec.common.entity.HttpResponseResult
+     */
+    HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo);
+
+    /**
      * @describe 支付订单回调
      * @author Joburgess
      * @date 2020/2/17

+ 324 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/EduPracticeGroupServiceImpl.java

@@ -27,6 +27,7 @@ import com.ym.mec.util.string.MessageFormatter;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.stereotype.Service;
@@ -183,6 +184,7 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
         Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
         SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+
         SysConfig practiceBuyActivityExpireDateConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_BUY_ACTIVITY_EXPIRE_DATE);
         Date practiceBuyActivityExpireDate= DateUtil.stringToDate(practiceBuyActivityExpireDateConfig.getParanValue(),"yyyy-MM-dd HH:mm:ss");
         SysConfig practicePromotionActivityStartDateConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_PROMOTION_ACTIVITY_START_DATE);
@@ -495,6 +497,328 @@ public class EduPracticeGroupServiceImpl implements EduPracticeGroupService{
         }
     }
 
+
+
+    @Override
+    @Transactional(rollbackFor = Exception.class, isolation = Isolation.READ_COMMITTED)
+    public HttpResponseResult createPackagePracticeGroup(PracticeGroupBuyDto practiceGroupBuyParams, String operatorInfo) {
+        if (Objects.isNull(practiceGroupBuyParams.getUserId())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择教师");
+        }
+        if (Objects.isNull(practiceGroupBuyParams.getSubjectId())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择声部");
+        }
+        if (CollectionUtils.isEmpty(practiceGroupBuyParams.getDrillTimes())) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "请选择训练时间");
+        }
+
+        SysUser sysUser = sysUserFeignService.queryUserById(practiceGroupBuyParams.getStudentId());
+
+        Student student = studentDao.get(practiceGroupBuyParams.getStudentId());
+        if(Objects.isNull(student)){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "学员信息异常");
+        }
+
+        int courseTimes = 0;
+
+        if(PracticeGroupType.CARE_PACKAGE.equals(practiceGroupBuyParams.getType())){
+            if(Objects.isNull(student.getCarePackage())||student.getCarePackage().equals(0)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员暂无关心包排课资格");
+            }else if(student.getCarePackage().equals(2)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员已使用关心包排课资格");
+            }
+            courseTimes = 4;
+        }else if(PracticeGroupType.COME_ON_PACKAGE.equals(practiceGroupBuyParams.getType())){
+            if(Objects.isNull(student.getComeOnPackage())||student.getComeOnPackage().equals(0)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员暂无加油包排课资格");
+            }else if(student.getComeOnPackage().equals(2)){
+                return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "该学员已使用加油包排课资格");
+            }
+            courseTimes = 8;
+        }
+
+        if(courseTimes<=0){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "课程信息错误");
+        }
+
+        Subject subject = subjectDao.get(practiceGroupBuyParams.getSubjectId());
+        if (Objects.isNull(subject)) {
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "预约失败,声部选择错误,请重试。");
+        }
+
+        Teacher teacher = teacherService.getDetail(practiceGroupBuyParams.getUserId());
+        if (Objects.isNull(teacher)) {
+            throw new BizException("老师不存在");
+        }
+
+        //网管课课程时长
+        SysConfig practiceCourseMinutesConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_MINUTES);
+        Integer practiceCourseMinutes = practiceCourseMinutesConfig.getParanValue(Integer.class);
+        //网管课默认课酬
+        SysConfig practiceCourseSalaryConfig = sysConfigService.findByParamName(SysConfigService.PRACTICE_COURSE_SALARY);
+
+        Date now=new Date();
+
+        LocalDate courseStartDay=LocalDate.now();
+
+        practiceGroupBuyParams.setName(subject.getName() + "•" + sysUser.getUsername());
+
+        List<CourseSchedule> practiceCourses = new ArrayList<>();
+
+        while (practiceCourses.size()<=courseTimes){
+            courseStartDay=courseStartDay.plusDays(1);
+            int dayOfWeek = courseStartDay.get(DateUtil.weekFields.dayOfWeek());
+            for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {
+                if(dayOfWeek==drillTime.getWeekNum()){
+                    CourseSchedule courseSchedule=new CourseSchedule();
+                    String courseStartDayStr = DateUtil.dateFormatter.format(courseStartDay);
+                    String courseStartDateTimeStr = courseStartDayStr+" "+drillTime.getTimeStr();
+                    LocalDateTime courseStartDateTime = LocalDateTime.parse(courseStartDateTimeStr,DateUtil.dateTimeFormatter);
+                    LocalDateTime courseEndDateTime = courseStartDateTime.plusMinutes(practiceCourseMinutes);
+                    courseSchedule.setClassDate(Date.from(courseStartDay.atStartOfDay(DateUtil.zoneId).toInstant()));
+                    courseSchedule.setStartClassTime(Date.from(courseStartDateTime.atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule.setEndClassTime(Date.from(courseEndDateTime.atZone(DateUtil.zoneId).toInstant()));
+                    courseSchedule.setName(practiceGroupBuyParams.getName());
+                    courseSchedule.setTeacherId(practiceGroupBuyParams.getUserId());
+                    courseSchedule.setActualTeacherId(practiceGroupBuyParams.getUserId());
+                    courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+                    courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+                    courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+                    practiceCourses.add(courseSchedule);
+
+                    if(practiceCourses.size()==courseTimes){
+                        break;
+                    }
+
+                    CourseSchedule courseSchedule1=new CourseSchedule();
+                    BeanUtils.copyProperties(courseSchedule, courseSchedule1);
+                    courseSchedule1.setStartClassTime(courseSchedule1.getEndClassTime());
+                    courseSchedule1.setStartClassTime(Date.from(courseEndDateTime.plusMinutes(practiceCourseMinutes).atZone(DateUtil.zoneId).toInstant()));
+                    practiceCourses.add(courseSchedule1);
+                }
+            }
+        }
+
+        if(CollectionUtils.isEmpty(practiceCourses)){
+            return BaseController.failed(HttpStatus.EXPECTATION_FAILED, "课程信息错误");
+        }
+
+        practiceCourses.sort(Comparator.comparing(CourseSchedule::getStartClassTime));
+
+        TeacherFreeTime teacherFreeTime = teacherFreeTimeDao.findTeacherFreeTime(practiceGroupBuyParams.getUserId());
+        if (Objects.isNull(teacherFreeTime)) {
+            return BaseController.failed(HttpStatus.MULTIPLE_CHOICES,"抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。");
+        }
+
+        JSONObject drillTimesObject=new JSONObject();
+        for (PracticeDrillTimeDto drillTime : practiceGroupBuyParams.getDrillTimes()) {
+            drillTimesObject.put(String.valueOf(drillTime.getWeekNum()),drillTime.getTimeStr());
+        }
+
+        PracticeGroupSellPrice practiceGroupSellPrice = practiceGroupSellPriceDao.get(sysUser.getOrganId());
+        if(Objects.isNull(practiceGroupSellPrice)){
+            throw new BizException("所在城市暂不参与此活动");
+        }
+
+        BigDecimal unitPrice = PracticeGroupType.CARE_PACKAGE.equals(practiceGroupBuyParams.getType())?practiceGroupSellPrice.getCarePackagePrice():practiceGroupSellPrice.getComeOnPackagePrice();
+
+        BigDecimal originalAmount = unitPrice.multiply(new BigDecimal(courseTimes));
+        BigDecimal amount= unitPrice.multiply(new BigDecimal(courseTimes));
+
+        practiceGroupBuyParams.setCoursesStartDate(practiceCourses.stream().min(Comparator.comparing(CourseSchedule::getStartClassTime)).get().getStartClassTime());
+        practiceGroupBuyParams.setCoursesExpireDate(practiceCourses.stream().max(Comparator.comparing(CourseSchedule::getEndClassTime)).get().getEndClassTime());
+        practiceGroupBuyParams.setDrillTimesJson(drillTimesObject.toJSONString());
+        practiceGroupBuyParams.setOrganId(sysUser.getOrganId());
+        practiceGroupBuyParams.setSingleClassMinutes(practiceCourseMinutes);
+        practiceGroupBuyParams.setGroupStatus(GroupStatusEnum.LOCK);
+        practiceGroupBuyParams.setMemo(operatorInfo+",教务代买");
+        practiceGroupDao.insert(practiceGroupBuyParams);
+
+        //创建班级信息
+        ClassGroup classGroup = new ClassGroup();
+        classGroup.setSubjectIdList(practiceGroupBuyParams.getSubjectId().toString());
+        classGroup.setExpectStudentNum(1);
+        classGroup.setStudentNum(1);
+        classGroup.setName(practiceGroupBuyParams.getName());
+        classGroup.setTotalClassTimes(practiceCourses.size());
+        classGroup.setType(ClassGroupTypeEnum.PRACTICE);
+        classGroup.setDelFlag(0);
+        classGroup.setGroupType(GroupType.PRACTICE);
+        classGroup.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroup.setCreateTime(now);
+        classGroup.setUpdateTime(now);
+        classGroupDao.insert(classGroup);
+
+        //创建班级老师关联记录
+        ClassGroupTeacherMapper classGroupTeacherMapper = new ClassGroupTeacherMapper();
+        classGroupTeacherMapper.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupTeacherMapper.setClassGroupId(classGroup.getId());
+        classGroupTeacherMapper.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherMapper.setUserId(practiceGroupBuyParams.getUserId());
+        classGroupTeacherMapper.setGroupType(GroupType.PRACTICE);
+        classGroupTeacherMapper.setCreateTime(now);
+        classGroupTeacherMapper.setUpdateTime(now);
+        classGroupTeacherMapperDao.insert(classGroupTeacherMapper);
+
+        //创建班级与老师课酬记录
+        ClassGroupTeacherSalary classGroupTeacherSalary = new ClassGroupTeacherSalary();
+        classGroupTeacherSalary.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupTeacherSalary.setClassGroupId(classGroup.getId());
+        classGroupTeacherSalary.setTeacherRole(TeachTypeEnum.BISHOP);
+        classGroupTeacherSalary.setUserId(practiceGroupBuyParams.getUserId());
+        classGroupTeacherSalary.setSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+        classGroupTeacherSalary.setOnlineClassesSalary(new BigDecimal(practiceCourseSalaryConfig.getParanValue()));
+        classGroupTeacherSalary.setGroupType(GroupType.PRACTICE);
+        classGroupTeacherSalary.setCreateTime(now);
+        classGroupTeacherSalary.setUpdateTime(now);
+        classGroupTeacherSalaryDao.insert(classGroupTeacherSalary);
+
+        //班级学生关联表
+        ClassGroupStudentMapper classGroupStudentMapper = new ClassGroupStudentMapper();
+        classGroupStudentMapper.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        classGroupStudentMapper.setClassGroupId(classGroup.getId());
+        classGroupStudentMapper.setUserId(practiceGroupBuyParams.getStudentId());
+        classGroupStudentMapper.setCreateTime(now);
+        classGroupStudentMapper.setStatus(ClassGroupStudentStatusEnum.NORMAL);
+        classGroupStudentMapper.setGroupType(GroupType.PRACTICE);
+        classGroupStudentMapperDao.insert(classGroupStudentMapper);
+
+        List<CourseScheduleTeacherSalary> courseScheduleTeacherSalaries = new ArrayList<>();
+        List<CourseScheduleStudentPayment> courseScheduleStudentPayments = new ArrayList<>();
+        List<TeacherAttendance> teacherAttendances = new ArrayList<>();
+
+        for (CourseSchedule courseSchedule : practiceCourses) {
+            //课表
+            courseSchedule.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseSchedule.setClassGroupId(classGroup.getId());
+            courseSchedule.setStatus(CourseStatusEnum.NOT_START);
+            courseSchedule.setCreateTime(now);
+            courseSchedule.setUpdateTime(now);
+            courseSchedule.setTeachMode(TeachModeEnum.ONLINE);
+            courseSchedule.setType(CourseSchedule.CourseScheduleType.PRACTICE);
+            courseSchedule.setGroupType(GroupType.PRACTICE);
+            courseSchedule.setIsLock(1);
+            courseSchedule.setOrganId(practiceGroupBuyParams.getOrganId());
+        }
+        courseScheduleDao.batchAddCourseSchedules(practiceCourses);
+        TeacherDefaultPracticeGroupSalary teacherDefaultPracticeGroupSalary = teacherDefaultPracticeGroupSalaryDao.findByTeacherAndCourseMinutes(practiceGroupBuyParams.getUserId(),practiceCourseMinutes);
+        BigDecimal teacherDefaultSalary=null;
+        if(Objects.nonNull(teacherDefaultPracticeGroupSalary)){
+            teacherDefaultSalary=teacherDefaultPracticeGroupSalary.getMainTeacherSalary();
+        }
+        if(teacherDefaultSalary == null){
+            throw new BizException("请设置老师课酬");
+        }
+        BigDecimal studentSingleCourseCost=amount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+        BigDecimal studentSingleCourseOriginalCost=originalAmount.divide(new BigDecimal(practiceCourses.size()), CommonConstants.DECIMAL_PLACE, BigDecimal.ROUND_DOWN);
+        for (CourseSchedule courseSchedule : practiceCourses) {
+            //课程与老师薪水表
+            CourseScheduleTeacherSalary courseScheduleTeacherSalary = new CourseScheduleTeacherSalary();
+            courseScheduleTeacherSalary.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleTeacherSalary.setGroupType(GroupType.PRACTICE);
+            courseScheduleTeacherSalary.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseScheduleTeacherSalary.setTeacherRole(classGroupTeacherMapper.getTeacherRole());
+            courseScheduleTeacherSalary.setUserId(practiceGroupBuyParams.getUserId());
+            courseScheduleTeacherSalary.setExpectSalary(teacherDefaultSalary);
+            courseScheduleTeacherSalary.setCreateTime(now);
+            courseScheduleTeacherSalary.setUpdateTime(now);
+            courseScheduleTeacherSalary.setClassGroupId(classGroup.getId());
+            courseScheduleTeacherSalaries.add(courseScheduleTeacherSalary);
+
+            //学生缴费记录
+            CourseScheduleStudentPayment courseScheduleStudentPayment = new CourseScheduleStudentPayment();
+            courseScheduleStudentPayment.setGroupType(GroupType.PRACTICE);
+            courseScheduleStudentPayment.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            courseScheduleStudentPayment.setCourseScheduleId(courseSchedule.getId());
+            courseScheduleStudentPayment.setUserId(practiceGroupBuyParams.getStudentId());
+            courseScheduleStudentPayment.setExpectPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setActualPrice(studentSingleCourseCost);
+            courseScheduleStudentPayment.setOriginalPrice(studentSingleCourseOriginalCost);
+            courseScheduleStudentPayment.setClassGroupId(classGroup.getId());
+            courseScheduleStudentPayment.setCreateTime(now);
+            courseScheduleStudentPayment.setUpdateTime(now);
+            courseScheduleStudentPayments.add(courseScheduleStudentPayment);
+
+            //教师签到记录
+            TeacherAttendance teacherAttendance = new TeacherAttendance();
+            teacherAttendance.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+            teacherAttendance.setTeacherId(practiceGroupBuyParams.getUserId());
+            teacherAttendance.setClassGroupId(classGroup.getId());
+            teacherAttendance.setGroupType(GroupType.PRACTICE);
+            teacherAttendance.setCourseScheduleId(courseSchedule.getId());
+            teacherAttendance.setCreateTime(now);
+            teacherAttendances.add(teacherAttendance);
+        }
+        courseScheduleTeacherSalaryDao.batchInsert(courseScheduleTeacherSalaries);
+        courseScheduleStudentPaymentDao.batchInsert(courseScheduleStudentPayments);
+        teacherAttendanceDao.batchInsert(teacherAttendances);
+
+        try {
+            courseScheduleService.checkNewCourseSchedules(practiceCourses,false,false);
+        } catch (Exception e) {
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            String errMessage=new String();
+            if(e.getMessage().indexOf("主教冲突")!=-1){
+                errMessage="抱歉啦,当前所选时段组合,「" + teacher.getRealName() + "」老师已被预约,请重新选择时段或更换老师后重试。";
+            }else{
+                String courseName=e.getMessage().substring(e.getMessage().indexOf(")-")+2);
+                courseName = courseName.substring(0,courseName.indexOf("("));
+                errMessage="抱歉啦,当前所选时段组合,与您现有课程「";
+                errMessage+=courseName;
+                errMessage+="」时段冲突,请选择其他时段重试。";
+            }
+            return BaseController.failed(HttpStatus.FOUND, errMessage);
+        }
+
+        StudentPaymentOrder studentPaymentOrder=new StudentPaymentOrder();
+        studentPaymentOrder.setUserId(practiceGroupBuyParams.getStudentId());
+        studentPaymentOrder.setGroupType(GroupType.PRACTICE);
+        String orderNo=idGeneratorService.generatorId("payment") + "";
+        studentPaymentOrder.setOrderNo(orderNo);
+        studentPaymentOrder.setStatus(DealStatusEnum.ING);
+        studentPaymentOrder.setType(OrderTypeEnum.PRACTICE_GROUP_BUY);
+
+        studentPaymentOrder.setExpectAmount(amount);
+        studentPaymentOrder.setMusicGroupId(practiceGroupBuyParams.getId().toString());
+        studentPaymentOrder.setActualAmount(studentPaymentOrder.getExpectAmount());
+        studentPaymentOrder.setClassGroupId(classGroup.getId());
+        studentPaymentOrder.setMemo(operatorInfo+",教务代买");
+        studentPaymentOrder.setVersion(0);
+        studentPaymentOrderService.insert(studentPaymentOrder);
+
+        if(practiceGroupBuyParams.isUseBalancePayment() || studentPaymentOrder.getExpectAmount().doubleValue() == 0){
+            SysUserCashAccount userCashAccount = sysUserCashAccountService.getLocked(practiceGroupBuyParams.getStudentId());
+            if(userCashAccount == null){
+                throw new BizException("用户账户找不到");
+            }
+            studentPaymentOrder.setPaymentChannel("BALANCE");
+            if(userCashAccount.getBalance().subtract(studentPaymentOrder.getExpectAmount()).doubleValue() >= 0){
+                studentPaymentRouteOrderService.addRouteOrder(orderNo, practiceGroupBuyParams.getOrganId(), studentPaymentOrder.getExpectAmount());
+                // 更新订单信息
+                studentPaymentOrder.setActualAmount(new BigDecimal(0));
+                studentPaymentOrder.setBalancePaymentAmount(studentPaymentOrder.getExpectAmount());
+                studentPaymentOrder.setStatus(DealStatusEnum.SUCCESS);
+                studentPaymentOrder.setUpdateTime(now);
+                studentPaymentOrder.setOrganId(practiceGroupBuyParams.getOrganId());
+                studentPaymentOrder.setRoutingOrganId(practiceGroupBuyParams.getOrganId());
+
+                sysUserCashAccountService.updateBalance(practiceGroupBuyParams.getStudentId(), studentPaymentOrder.getExpectAmount().negate(),PlatformCashAccountDetailTypeEnum.PAY_FEE,operatorInfo+",教务代买");
+
+                studentPaymentOrder.setPayTime(now);
+                this.orderCallback(studentPaymentOrder);
+
+                Map<String,Object> result=new HashMap<>();
+                result.put("orderNo",studentPaymentOrder.getOrderNo());
+
+                return BaseController.succeed(result);
+            }else{
+                throw new BizException("账户余额不足,请完成账户充值");
+            }
+        }else{
+            throw new BizException("当前购买方式暂时只支持用户余额购买");
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
     public void orderCallback(StudentPaymentOrder order) {

+ 2 - 0
mec-biz/src/main/resources/config/mybatis/PracticeGroupSellPriceMapper.xml

@@ -19,6 +19,8 @@
 		<result column="high_online_ten_course_activity_price_with_new_user" property="highOnlineTenCourseActivityPriceWithNewUser" />
 		<result column="high_online_ten_course_original_price_with_old_user" property="highOnlineTenCourseOriginalPriceWithOldUser" />
 		<result column="high_online_ten_course_activity_price_with_old_user" property="highOnlineTenCourseActivityPriceWithOldUser" />
+		<result column="care_package_price" property="carePackagePrice" />
+		<result column="come_on_package_price" property="comeOnPackagePrice" />
 		<result column="create_time_" property="createTime" />
 		<result column="update_time_" property="updateTime" />
 	</resultMap>

+ 30 - 3
mec-web/src/main/java/com/ym/mec/web/controller/education/EduPracticeGroupController.java

@@ -8,6 +8,7 @@ import com.ym.mec.biz.dal.dao.TeacherDao;
 import com.ym.mec.biz.dal.dto.PracticeGroupBuyDto;
 import com.ym.mec.biz.dal.entity.Employee;
 import com.ym.mec.biz.dal.entity.PracticeGroup;
+import com.ym.mec.biz.dal.enums.PracticeGroupType;
 import com.ym.mec.biz.dal.page.StudentQueryInfo;
 import com.ym.mec.biz.service.EduPracticeGroupService;
 import com.ym.mec.biz.service.PracticeGroupService;
@@ -16,6 +17,7 @@ import com.ym.mec.biz.service.TeacherCourseRewardService;
 import com.ym.mec.common.controller.BaseController;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.date.DateUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
@@ -23,6 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
 import org.springframework.web.bind.annotation.*;
 
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 
 /**
@@ -96,7 +100,7 @@ public class EduPracticeGroupController extends BaseController {
 
     @ApiOperation("获取指定教师的空闲时间——付费")
     @GetMapping(value = "/getPayPracticeTeacherFreeTimes")
-    public Object getPayPracticeTeacherFreeTimes(Integer teacherId,Integer studentId,Integer buyMonths, boolean renew, Long groupId){
+    public Object getPayPracticeTeacherFreeTimes(Integer teacherId, Integer studentId, Integer buyMonths, boolean renew, Long groupId, PracticeGroupType type){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
@@ -104,7 +108,26 @@ public class EduPracticeGroupController extends BaseController {
         if(Objects.isNull(studentId)){
             throw new BizException("请指定学生");
         }
-        return succeed(practiceGroupService.getPayPracticeTeacherFreeTimes(studentId,teacherId, buyMonths,renew,groupId));
+        Map payPracticeTeacherFreeTimes = practiceGroupService.getPayPracticeTeacherFreeTimes(studentId, teacherId, buyMonths, renew, groupId);
+        if(Objects.nonNull(type)&&(PracticeGroupType.CARE_PACKAGE.equals(type)||PracticeGroupType.COME_ON_PACKAGE.equals(type))){
+            Map<Integer, List<String>> weekNumApplyTimesMap = (Map<Integer, List<String>>) payPracticeTeacherFreeTimes.get("teacherFreeDays");
+            for (Map.Entry<Integer, List<String>> weekNumApplyTimesMapEntry : weekNumApplyTimesMap.entrySet()) {
+                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
+                for (String timeStr : weekNumApplyTimesMapEntry.getValue()) {
+                    LocalTime time = LocalTime.parse(timeStr, dtf);
+                    LocalTime nextTime = time.plusMinutes(30);
+                    if(weekNumApplyTimesMapEntry.getValue().contains(nextTime.format(DateUtil.timeFormatter))){
+                        continue;
+                    }
+                    LocalTime preTime = time.plusMinutes(-30);
+                    if(weekNumApplyTimesMapEntry.getValue().contains(preTime.format(DateUtil.timeFormatter))){
+                        continue;
+                    }
+                    weekNumApplyTimesMapEntry.getValue().remove(timeStr);
+                }
+            }
+        }
+        return succeed(payPracticeTeacherFreeTimes);
     }
 
     @ApiOperation("获取学生上一次的购买信息--付费")
@@ -150,7 +173,11 @@ public class EduPracticeGroupController extends BaseController {
             throw new BizException("请指定学生");
         }
         practiceGroupBuyParams.setEducationalTeacherId(sysUser.getId());
-        return eduPracticeGroupService.buyPracticeGroup(practiceGroupBuyParams, sysUser.getRealName()+"("+sysUser.getId()+")");
+        if(Objects.isNull(practiceGroupBuyParams.getType())||PracticeGroupType.CHARGE.equals(practiceGroupBuyParams.getType())){
+            return eduPracticeGroupService.buyPracticeGroup(practiceGroupBuyParams, sysUser.getRealName()+"("+sysUser.getId()+")");
+        }else{
+            return eduPracticeGroupService.createPackagePracticeGroup(practiceGroupBuyParams, sysUser.getRealName()+"("+sysUser.getId()+")");
+        }
     }
 
     @ApiOperation("获取用户历史购买的陪练课")