From 13bfeabaa947bf09f053ea657eeaa5493370894a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=AE=B8=E5=85=81=E6=9E=9E?= <3422692813@qq.com> Date: Tue, 1 Apr 2025 15:57:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../base/constant/SchoolBaseConstants.java | 51 +++++++ .../DlDriveSchoolCoachCourseController.java | 41 +++++ .../controller/admin/ProcessController.java | 16 ++ .../admin/SchoolCourseOrderController.java | 18 ++- .../course/entity/SchoolCourseOrder.java | 4 + .../module/course/service/ProcessService.java | 8 + .../service/SchoolCourseOrderService.java | 9 ++ .../service/impl/ProcessServiceImpl.java | 140 +++++++++++++----- .../impl/SchoolCourseOrderServiceImpl.java | 40 +++++ .../yudao/module/course/vo/ProcessAddVO.java | 23 +++ .../app/AppExamBatchController.java | 26 ++++ ...riveSchoolReservationCourseController.java | 3 +- .../domain/DriveSchoolReservationCourse.java | 14 ++ .../IDriveSchoolReservationCourseService.java | 7 + ...iveSchoolReservationCourseServiceImpl.java | 38 +++++ 15 files changed, 397 insertions(+), 41 deletions(-) create mode 100644 dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java create mode 100644 dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/admin/DlDriveSchoolCoachCourseController.java create mode 100644 dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/vo/ProcessAddVO.java create mode 100644 dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/controller/app/AppExamBatchController.java diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java new file mode 100644 index 00000000..efb9cd91 --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java @@ -0,0 +1,51 @@ +package cn.iocoder.yudao.module.base.constant; + + +/** + * @Description: 驾校常量 + * @Author: 86187 + * @Date: 2025/04/01 14:02 + * @Version: 1.0 + */ +public interface SchoolBaseConstants { + +// ======================== 通用常量 ======================== + /** + * 通用状态(布尔):是 + */ + public static final Boolean COMMON_YES = true; + + /** + * 通用状态(布尔):否 + */ + public static final Boolean COMMON_NO = false; + + +// ======================== 驾校课程报名订单 ======================== + + /** + * 驾校课程报名订单-未分配教练 + */ + public static final Integer SCHOOL_COURSE_ORDER_IS_ASSIGN_COACH = 0; + + /** + * 驾校课程报名订单-已分配教练 + */ + public static final Integer SCHOOL_COURSE_ORDER_IS_NOT_ASSIGN_COACH = 1; + +// ======================== 学员课程进度 ======================== + /** + * 学员课程进度状态:未开始 + */ + public static final String PROCESS_STATUS_NOT_START = "0"; + + /** + * 学员课程进度状态:进行中 + */ + public static final String PROCESS_STATUS_IN_PROGRESS = "1"; + + /** + * 学员课程进度状态:已完成 + */ + public static final String PROCESS_STATUS_COMPLETE = "2"; +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/admin/DlDriveSchoolCoachCourseController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/admin/DlDriveSchoolCoachCourseController.java new file mode 100644 index 00000000..d3fc4354 --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/controller/admin/DlDriveSchoolCoachCourseController.java @@ -0,0 +1,41 @@ +package cn.iocoder.yudao.module.base.controller.admin; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.base.service.DlDriveSchoolCoachCourseService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; + +/** + * @Description: 教练与课程绑定 + * @Author: 86187 + * @Date: 2025/04/01 9:56 + * @Version: 1.0 + */ +@Tag(name = "教练与课程绑定") +@RestController +@RequestMapping("/base/dl-drive-school-coach-course") +@Validated +@RequiredArgsConstructor +public class DlDriveSchoolCoachCourseController { + + private final DlDriveSchoolCoachCourseService coachCourseService; + + /** + * 根据课程id获取教练信息 + * @param courseId 课程id + * @return 教练信息 + */ + @GetMapping("/getCoachByCourseId") + @Operation(summary = "根据课程id获取教练信息") + public CommonResult getCoachByCourseId(@RequestParam("courseId") String courseId) { + return success(coachCourseService.queryByCourseId(courseId)); + } +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java index 05064f95..66fa41a6 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.service.ProcessService; +import cn.iocoder.yudao.module.course.vo.ProcessAddVO; import cn.iocoder.yudao.module.course.vo.ProcessVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -16,6 +17,8 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; +import java.util.List; + import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @Tag(name = "管理后台 - 学员课程进度") @@ -106,4 +109,17 @@ public class ProcessController { return success(true); } + /** + * 保存学员课程进度 + * + * @param request {@link ProcessAddVO} + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult + */ + @PostMapping("/saveProcess") + @Operation(summary = "保存学员课程进度") + public CommonResult saveProcess(@RequestBody ProcessAddVO request) { + processService.saveProcess(request); + return success(true); + } + } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java index 5f1bfb7e..c073dfb3 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java @@ -76,7 +76,23 @@ public class SchoolCourseOrderController { @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page page = new Page<>(pageNo, pageSize); - return success(schoolCourseOrderService.queryPage(page,pageReqVO)); + return success(schoolCourseOrderService.queryPage(page, pageReqVO)); + } + + /** + * 终止订单 + * + * @param pageReqVO {@link SchoolCourseOrderVO} + * @return cn.iocoder.yudao.framework.common.pojo.CommonResult + */ + @PutMapping("/endOrder") + public CommonResult endOrder(@RequestBody SchoolCourseOrderVO pageReqVO) { + // 校验订单号和结束时间 + if (pageReqVO.getOrderNo() == null || pageReqVO.getEndReason() == null || pageReqVO.getEndTime() == null) { + throw new RuntimeException("订单号和结束时间不能为空"); + } + schoolCourseOrderService.endOrder(pageReqVO.getOrderNo(), pageReqVO.getEndReason(), pageReqVO.getEndTime()); + return success(true); } } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java index 95a5aab8..db6430d1 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java @@ -104,6 +104,10 @@ public class SchoolCourseOrder extends TenantBaseDO { * 支付类型 1:定金 2:全款 */ private String payType; + /** + * 是否分配教练 0:否 1:是 + */ + private Integer ifAssignmentCoach; } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java index fdb2ab62..6fe25d8b 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.course.service; import cn.iocoder.yudao.module.course.entity.Process; +import cn.iocoder.yudao.module.course.vo.ProcessAddVO; import cn.iocoder.yudao.module.course.vo.ProcessVO; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -98,4 +99,11 @@ public interface ProcessService extends IService { * @date 15:24 2025/2/18 **/ void checkProcess(Process process); + + /** + * 保存学员课程进度 + * + * @param processes {@link Process} + */ + void saveProcess(ProcessAddVO request); } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java index 2c0f9e36..d087b841 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import javax.validation.Valid; +import java.time.LocalDateTime; /** * 驾照报名订单 Service 接口 @@ -59,4 +60,12 @@ public interface SchoolCourseOrderService extends IService { * @date 10:10 2025/2/25 **/ IPage queryPage(Page page, SchoolCourseOrderVO pageReqVO); + + /** + * 终止订单 + * @param orderNo 订单号 + * @param endReason 终止原因 + * @param endTime 终止时间 + */ + void endOrder(String orderNo, String endReason, LocalDateTime endTime); } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java index 3c1d70ad..b5a9482b 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java @@ -1,13 +1,19 @@ package cn.iocoder.yudao.module.course.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.entity.SchoolCommission; +import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder; import cn.iocoder.yudao.module.course.mapper.ProcessMapper; import cn.iocoder.yudao.module.course.service.ProcessService; import cn.iocoder.yudao.module.course.service.SchoolCommissionService; +import cn.iocoder.yudao.module.course.service.SchoolCourseOrderService; +import cn.iocoder.yudao.module.course.vo.ProcessAddVO; import cn.iocoder.yudao.module.course.vo.ProcessVO; import cn.iocoder.yudao.module.jx.domain.DriveSchoolDeduct; import cn.iocoder.yudao.module.jx.service.IDriveSchoolDeductService; @@ -16,6 +22,7 @@ import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.apache.commons.lang3.StringUtils; @@ -44,6 +51,9 @@ public class ProcessServiceImpl extends ServiceImpl impl @Resource private SchoolCommissionService schoolCommissionService; + @Resource + private SchoolCourseOrderService schoolCourseOrderService; + /** * 教练查自己带教的课程和科目 @@ -57,9 +67,9 @@ public class ProcessServiceImpl extends ServiceImpl impl //当前教练ID Long userId = SecurityFrameworkUtils.getLoginUserId(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(Process::getCoachId,userId) + .eq(Process::getCoachId, userId) //状态不等于2-已完成的科目 - .ne(Process::getStatus,"2") + .ne(Process::getStatus, "2") .groupBy(Process::getCourseId).groupBy(Process::getSubject); return this.list(queryWrapper); } @@ -77,18 +87,18 @@ public class ProcessServiceImpl extends ServiceImpl impl //当前教练ID Long userId = SecurityFrameworkUtils.getLoginUserId(); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(Process::getCoachId,userId) - .eq(Process::getCourseId,process.getCourseId()) - .eq(Process::getSubject,process.getSubject()); - if(StringUtils.isNotEmpty(process.getUserName())){ - queryWrapper.like(Process::getUserName,process.getUserName()); + .eq(Process::getCoachId, userId) + .eq(Process::getCourseId, process.getCourseId()) + .eq(Process::getSubject, process.getSubject()); + if (StringUtils.isNotEmpty(process.getUserName())) { + queryWrapper.like(Process::getUserName, process.getUserName()); } //状态等于1-训练中的 - queryWrapper.eq(Process::getStatus,"1") + queryWrapper.eq(Process::getStatus, "1") .isNull(Process::getExamStatus) .groupBy(Process::getUserId) .orderByDesc(BaseDO::getCreateTime); - return this.page(page,queryWrapper); + return this.page(page, queryWrapper); } /** @@ -103,19 +113,19 @@ public class ProcessServiceImpl extends ServiceImpl impl * @date 18:39 2025/1/16 **/ @Override - public Process getByStudentAndCourse(Long userId, String courseId, Integer subject, Long coachId,String examStatus) { + public Process getByStudentAndCourse(Long userId, String courseId, Integer subject, Long coachId, String examStatus) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(Process::getUserId,userId) - .eq(Process::getCoachId,coachId) - .eq(Process::getCourseId,courseId) - .eq(Process::getSubject,subject) - .eq(Process::getStatus,"1"); - if(null!=examStatus){ - queryWrapper.eq(Process::getExamStatus,examStatus); + .eq(Process::getUserId, userId) + .eq(Process::getCoachId, coachId) + .eq(Process::getCourseId, courseId) + .eq(Process::getSubject, subject) + .eq(Process::getStatus, "1"); + if (null != examStatus) { + queryWrapper.eq(Process::getExamStatus, examStatus); } queryWrapper.orderByDesc(BaseDO::getCreateTime); List processList = this.list(queryWrapper); - return processList.isEmpty()?null:processList.get(0); + return processList.isEmpty() ? null : processList.get(0); } /** @@ -127,8 +137,8 @@ public class ProcessServiceImpl extends ServiceImpl impl * @date 15:18 2025/2/8 **/ @Override - public Process selectByUserId(Long userId,Long coachId) { - return processMapper.selectNewMaxByUserId(userId,coachId); + public Process selectByUserId(Long userId, Long coachId) { + return processMapper.selectNewMaxByUserId(userId, coachId); } /** @@ -142,24 +152,24 @@ public class ProcessServiceImpl extends ServiceImpl impl @Override public Map selectByCoachId(Long coachId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() - .eq(Process::getCoachId,coachId); + .eq(Process::getCoachId, coachId); List allList = this.list(queryWrapper); //所有科目二的记录 - List subject2List = allList.stream().filter(item->2==item.getSubject()).collect(Collectors.toList()); + List subject2List = allList.stream().filter(item -> 2 == item.getSubject()).collect(Collectors.toList()); //所有科目三的记录 - List subject3List = allList.stream().filter(item->3==item.getSubject()).collect(Collectors.toList()); + List subject3List = allList.stream().filter(item -> 3 == item.getSubject()).collect(Collectors.toList()); //科目二未毕业学员id Set subject2No = new HashSet<>(); //科目二已毕业学员id Set subject2Over = new HashSet<>(); - for (Process item:subject2List){ - if("2".equals(item.getStatus())){ + for (Process item : subject2List) { + if ("2".equals(item.getStatus())) { //已完成 - if("1".equals(item.getExamStatus())){ + if ("1".equals(item.getExamStatus())) { //已通过考试 subject2Over.add(item.getUserId()); } - }else{ + } else { //未完成 subject2No.add(item.getUserId()); } @@ -168,23 +178,23 @@ public class ProcessServiceImpl extends ServiceImpl impl Set subject3No = new HashSet<>(); //科目三已毕业学员id Set subject3Over = new HashSet<>(); - for (Process item:subject3List){ - if("2".equals(item.getStatus())){ + for (Process item : subject3List) { + if ("2".equals(item.getStatus())) { //已完成 - if("1".equals(item.getExamStatus())){ + if ("1".equals(item.getExamStatus())) { //已通过考试 subject3Over.add(item.getUserId()); } - }else{ + } else { //未完成 subject3No.add(item.getUserId()); } } - Map rtnMap= new HashMap<>(); - rtnMap.put("subject2No",subject2No.size()); - rtnMap.put("subject2Over",subject2Over.size()); - rtnMap.put("subject3No",subject3No.size()); - rtnMap.put("subject3Over",subject3Over.size()); + Map rtnMap = new HashMap<>(); + rtnMap.put("subject2No", subject2No.size()); + rtnMap.put("subject2Over", subject2Over.size()); + rtnMap.put("subject3No", subject3No.size()); + rtnMap.put("subject3Over", subject3Over.size()); return rtnMap; } @@ -213,7 +223,7 @@ public class ProcessServiceImpl extends ServiceImpl impl **/ @Override public IPage pageProcess(Page page, ProcessVO pageReqVO) { - return processMapper.pageProcess(pageReqVO,page); + return processMapper.pageProcess(pageReqVO, page); } /** @@ -234,7 +244,7 @@ public class ProcessServiceImpl extends ServiceImpl impl //如果是通过审核,需要保存考试记录 if (process.getFinancePass()) { //根据科目查询规则 - if (null != process.getSubject()){ + if (null != process.getSubject()) { DriveSchoolDeduct deduct = deductService.queryBySubject(process.getSubject().toString()); //如果存在提成规则则生成提成记录 if (null != deduct) { @@ -264,4 +274,58 @@ public class ProcessServiceImpl extends ServiceImpl impl updateById(process); } + /** + * 保存学员课程进度 + * + * @param request {@link ProcessAddVO} + */ + @Override + public void saveProcess(ProcessAddVO request) { + List processes = BeanUtil.copyToList(request.getProcessList(), Process.class); + // 校验详细信息 + verify(processes); + // 保存信息 + this.saveBatch(processes); + + // 修改订单信息中的是否分配教练状态 + schoolCourseOrderService.update(Wrappers.lambdaUpdate(SchoolCourseOrder.class) + .eq(SchoolCourseOrder::getId, request.getOrderId()) + .set(SchoolCourseOrder::getIfAssignmentCoach, SchoolBaseConstants.SCHOOL_COURSE_ORDER_IS_NOT_ASSIGN_COACH)); + + } + + private static void verify(List processes) { + for (Process process : processes) { + // 校验状态 + if (StrUtil.isBlank(process.getStatus())) { + throw new RuntimeException("状态不能为空"); + } + // 校验科目 + if (null == process.getSubject()) { + throw new RuntimeException("科目不能为空"); + } + if (StrUtil.isBlank(process.getCourseId())) { + throw new RuntimeException("课程ID不能为空"); + } + if (StrUtil.isBlank(process.getCourseName())) { + throw new RuntimeException("课程名称不能为空"); + } + if (null == process.getUserId()) { + throw new RuntimeException("用户ID不能为空"); + } + if (StrUtil.isBlank(process.getUserName())) { + throw new RuntimeException("用户名称不能为空"); + } + if (StrUtil.isBlank(process.getUserMobile())) { + throw new RuntimeException("用户手机号不能为空"); + } + if (null == process.getCoachId()) { + throw new RuntimeException("教练ID不能为空"); + } + if (StrUtil.isBlank(process.getCoachName())) { + throw new RuntimeException("教练名称不能为空"); + } + } + } + } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCourseOrderServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCourseOrderServiceImpl.java index 348112f6..0e53fff0 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCourseOrderServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCourseOrderServiceImpl.java @@ -2,18 +2,24 @@ package cn.iocoder.yudao.module.course.service.impl; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; +import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder; import cn.iocoder.yudao.module.course.mapper.SchoolCourseOrderMapper; +import cn.iocoder.yudao.module.course.service.ProcessService; import cn.iocoder.yudao.module.course.service.SchoolCourseOrderService; import cn.iocoder.yudao.module.course.vo.SchoolCommissionVO; import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderVO; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; +import java.time.LocalDateTime; /** * 驾照报名订单 Service 实现类 @@ -27,6 +33,9 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl q.eq(Process::getStatus, SchoolBaseConstants.PROCESS_STATUS_NOT_START) + .or() + .eq(Process::getStatus, SchoolBaseConstants.PROCESS_STATUS_IN_PROGRESS)) + ); + + } + } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/vo/ProcessAddVO.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/vo/ProcessAddVO.java new file mode 100644 index 00000000..819e63fe --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/vo/ProcessAddVO.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.course.vo; + +import lombok.Data; + +import java.util.List; + +/** + * @Description: 保存学生进度vo + * @Author: 86187 + * @Date: 2025/04/01 15:15 + * @Version: 1.0 + */ +@Data +public class ProcessAddVO { + /** + * 订单id + */ + private String orderId; + /** + * 进度信息 + */ + private List processList; +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/controller/app/AppExamBatchController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/controller/app/AppExamBatchController.java new file mode 100644 index 00000000..b068d4eb --- /dev/null +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/exam/controller/app/AppExamBatchController.java @@ -0,0 +1,26 @@ +package cn.iocoder.yudao.module.exam.controller.app; + +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.module.exam.service.ExamBatchService; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +/** + * @Description: 小程序-考试批次 + * @Author: 86187 + * @Date: 2025/03/31 10:54 + * @Version: 1.0 + */ +@Tag(name = "小程序 - 考试批次") +@RestController +@RequestMapping("/examBatch") +@Validated +public class AppExamBatchController { + + @Resource + private ExamBatchService examBatchService; +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/app/AppDriveSchoolReservationCourseController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/app/AppDriveSchoolReservationCourseController.java index 0830bf8f..c7e3e332 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/app/AppDriveSchoolReservationCourseController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/controller/app/AppDriveSchoolReservationCourseController.java @@ -78,10 +78,9 @@ public class AppDriveSchoolReservationCourseController extends BaseController /** * 新增预约练车 */ - //@Log(title = "预约练车", businessType = BusinessType.INSERT) @PostMapping public CommonResult add(@RequestBody DriveSchoolReservationCourse driveSchoolReservationCourse) throws Exception { - return CommonResult.success(driveSchoolReservationCourseService.insertDriveSchoolReservationCourse(driveSchoolReservationCourse)); + return CommonResult.success(driveSchoolReservationCourseService.insertAppReservationCourse(driveSchoolReservationCourse)); } /** diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/domain/DriveSchoolReservationCourse.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/domain/DriveSchoolReservationCourse.java index 6a74af07..007e246e 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/domain/DriveSchoolReservationCourse.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/domain/DriveSchoolReservationCourse.java @@ -119,13 +119,27 @@ public class DriveSchoolReservationCourse extends TenantBaDO { //课程名字 private String courseName; + //课程id + private String courseId; + //预约类型 1:正常预约 2:立即练车 private String type; //练车时长 private double driveTime; + //预约日期 + private String reservDay; + + //预约时间段 + private String reservTime; + private String currentDate; + // 科目 + private String subject; + + // 是否取消预约 + private boolean ifCancel; //练车总时长 @TableField(exist = false) private double allDriveTime; diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolReservationCourseService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolReservationCourseService.java index 19e13389..93f5adf6 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolReservationCourseService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/IDriveSchoolReservationCourseService.java @@ -40,6 +40,13 @@ public interface IDriveSchoolReservationCourseService * @return 结果 */ public int insertDriveSchoolReservationCourse(DriveSchoolReservationCourse driveSchoolReservationCourse) throws Exception; + /** + * 小程序新增预约练车 + * + * @param driveSchoolReservationCourse 预约练车 + * @return 结果 + */ + public int insertAppReservationCourse(DriveSchoolReservationCourse driveSchoolReservationCourse) throws Exception; /** * 修改预约练车 diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolReservationCourseServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolReservationCourseServiceImpl.java index 42e6c85f..07de5147 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolReservationCourseServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/service/impl/DriveSchoolReservationCourseServiceImpl.java @@ -1,6 +1,8 @@ package cn.iocoder.yudao.module.jx.service.impl; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.exam.entity.ExamBatchItem; +import cn.iocoder.yudao.module.exam.service.ExamBatchItemService; import cn.iocoder.yudao.module.jx.domain.*; import cn.iocoder.yudao.module.jx.payment.entity.DriveSchoolPay; import cn.iocoder.yudao.module.jx.payment.mapper.DrivePayMapper; @@ -17,6 +19,7 @@ import cn.iocoder.yudao.module.jx.vo.StatisticsVo; import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO; import cn.iocoder.yudao.module.system.service.user.AdminUserService; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.thoughtworks.xstream.core.SecurityUtils; import org.apache.commons.lang3.ObjectUtils; @@ -66,6 +69,9 @@ public class DriveSchoolReservationCourseServiceImpl implements IDriveSchoolRese @Resource private DriveSchoolInfoMapper driveSchoolInfoMapper; + @Resource + private ExamBatchItemService examBatchItemService; + /** * 查询预约练车 * @@ -253,6 +259,38 @@ public class DriveSchoolReservationCourseServiceImpl implements IDriveSchoolRese return 1; } + /** + * 小程序新增预约练车 + * + * @param driveSchoolReservationCourse 预约练车 + * @return 结果 + */ + @Override + public int insertAppReservationCourse(DriveSchoolReservationCourse driveSchoolReservationCourse) throws Exception { + // 查询科目一是否合格 + ExamBatchItem one = examBatchItemService.getOne(Wrappers.lambdaQuery() + .eq(ExamBatchItem::getUserId, driveSchoolReservationCourse.getUserId()) + .eq(ExamBatchItem::getIfPass, true) + .last("limit 1")); + if (ObjectUtils.isNotEmpty(one)) { + throw new Exception("科目一未通过,无法预约"); + } + + // 添加预约记录 + DriveSchoolReservationCourse records = new DriveSchoolReservationCourse(); + records.setUserId(driveSchoolReservationCourse.getUserId()); // 学员id + records.setUserName(driveSchoolReservationCourse.getUserName()); // 学员姓名 + records.setCoachId(driveSchoolReservationCourse.getCoachId()); // 教练id + records.setCoachName(driveSchoolReservationCourse.getCoachName()); // 教练姓名 + records.setCourseId(driveSchoolReservationCourse.getCourseId()); // 课程id + records.setCourseName(driveSchoolReservationCourse.getCourseName()); // 课程名称 + records.setTenantId(driveSchoolReservationCourse.getTenantId()); // 手动设置租户id + records.setReservDay(driveSchoolReservationCourse.getReservDay()); // 预约日期 + records.setReservTime(driveSchoolReservationCourse.getReservTime()); // 预约时间段 + records.setSubject(driveSchoolReservationCourse.getSubject()); // 科目类型 + return 0; + } + /** * 修改预约练车 *