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 index 15630795..837950ad 100644 --- 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 @@ -74,4 +74,34 @@ public interface SchoolBaseConstants { * 驾校消息模板:分配教练通知 */ public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_ASSIGN_COACH= "已为您分配教练,科目一教练:%s,科目二教练:%s,科目三教练:%s,科目四教练:%s"; + + /** + * 驾校消息模板:课程终止 + */ + public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_COURSE_END= "您的课程%s已终止"; + + /** + * 驾校消息模板:学员预约训练 + */ + public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_RESERVE_TRAIN= "学员%s预约了%s %s %s%s的训练"; + + /** + * 驾校消息模板:教练审核预约结果 + */ + public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_COACH_RESERVE_RESULT= "您预约的%s %s %s%s的训练教练已%s"; + + /** + * 驾校消息模板:学员到场打卡发送消息 + */ + public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_ATTENDANCE= "您在%s已到达%s打卡%s%s的训练"; + + /** + * 驾校消息模板:学员结束打卡发送消息 + */ + public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_END_ATTENDANCE= "您在%s已结束%s%s的训练,本次训练时长%s分钟,累计训练时长%s分钟"; + + /** + * 驾校消息模板:学员拿出驾驶证祝福语 + */ + public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_DRIVER_LICENSE= "恭喜您在%s已领取驾驶证,祝您驾得愉快"; } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java index 79c1002d..7414b1f2 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java @@ -148,7 +148,8 @@ public interface DlDriveSchoolStudentService extends IService impl processes.get(3).getCoachName()); // 发送消息给学员 - schoolNotifyMessageSendService.sendMessage(userId, message, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_MEMBER); + schoolNotifyMessageSendService.sendMessage(userId, message, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_MEMBER, null); } @@ -363,7 +363,7 @@ public class ProcessServiceImpl extends ServiceImpl impl .set(Process::getStatus, 2)); } - if(process.getSubject() == 1 && process.getExamStatus().equals("1")){ + if (process.getSubject() == 1 && process.getExamStatus().equals("1")) { update(Wrappers.lambdaUpdate(Process.class) .eq(Process::getUserId, process.getUserId()) .eq(Process::getSubject, 2) @@ -371,8 +371,8 @@ public class ProcessServiceImpl extends ServiceImpl impl .eq(Process::getDeleted, SchoolBaseConstants.COMMON_NO) .set(Process::getStatus, SchoolBaseConstants.PROCESS_STATUS_IN_PROGRESS)); } - if(process.getSubject() == 4 && process.getExamStatus().equals("1")){ - dlDriveSchoolStudentService.updateStudentPassAndGradTime(process.getExamTime(),process.getUserId(),process.getTenantId()); + if (process.getSubject() == 4 && process.getExamStatus().equals("1")) { + dlDriveSchoolStudentService.updateStudentPassAndGradTime(process.getExamTime(), process.getUserId(), process.getCourseId(), process.getTenantId()); } } @@ -397,6 +397,7 @@ public class ProcessServiceImpl extends ServiceImpl impl /** * 根据userId查询考试列表 + * * @param userId 用户id */ @Override @@ -416,6 +417,7 @@ public class ProcessServiceImpl extends ServiceImpl impl /** * 根据userId查询考试列表 + * * @param userId 用户id */ @Override 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 185ef80c..309fade2 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 @@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil; 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.base.service.SchoolNotifyMessageSendService; import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder; import cn.iocoder.yudao.module.course.mapper.SchoolCourseOrderMapper; @@ -15,6 +16,7 @@ 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.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; @@ -39,6 +41,9 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl queryPage(Page page, SchoolCourseOrderVO pageReqVO) { - return schoolCourseOrderMapper.queryPage(pageReqVO,page); + return schoolCourseOrderMapper.queryPage(pageReqVO, page); } @Override public IPage queryPageNew(Page page, SchoolCourseOrderVO pageReqVO) { @@ -110,11 +115,18 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl q.eq(Process::getStatus, SchoolBaseConstants.PROCESS_STATUS_NOT_START) .or() .eq(Process::getStatus, SchoolBaseConstants.PROCESS_STATUS_IN_PROGRESS)) ); + // 准备消息内容 + String message = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_COURSE_END, schoolCourseOrder.getCourseName()); + + // 发送消息给学员 + schoolNotifyMessageSendService.sendMessage(Long.valueOf(schoolCourseOrder.getUserId()), message, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_MEMBER, null); + } /** diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/ReservationCourseController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/ReservationCourseController.java index 0572cd6f..e658a2f3 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/ReservationCourseController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/admin/ReservationCourseController.java @@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.train.controller.admin; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; +import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService; import cn.iocoder.yudao.module.train.entity.ReservationCourse; import cn.iocoder.yudao.module.train.service.ReservationCourseService; import cn.iocoder.yudao.module.train.vo.ReservationCourseVO; @@ -18,6 +20,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; +import static cn.iocoder.yudao.module.train.controller.app.AppReservationCourseController.getSubjectStr; @Tag(name = "管理后台 - 预约练车") @RestController @@ -28,28 +31,40 @@ public class ReservationCourseController { @Resource private ReservationCourseService reservationCourseService; + @Resource + private SchoolNotifyMessageSendService schoolNotifyMessageSendService; + @GetMapping("/page") @Operation(summary = "获得预约练车分页") public CommonResult> getPage(ReservationCourseVO pageReqVO, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - Page page = new Page<>(pageNo,pageSize); - if("my".equals(pageReqVO.getSelectType())){ + Page page = new Page<>(pageNo, pageSize); + if ("my".equals(pageReqVO.getSelectType())) { //查自己的 Long userId = SecurityFrameworkUtils.getLoginUserId(); pageReqVO.setCoachId(userId); } //查未取消的 pageReqVO.setIfCancel(false); - return success(reservationCourseService.queryListPage(pageReqVO,page)); + return success(reservationCourseService.queryListPage(pageReqVO, page)); } @PutMapping("/update") @Operation(summary = "审核预约练车") - public CommonResult updateReservationCourse(@Valid @RequestBody ReservationCourseVO updateReqVO) { + public CommonResult updateReservationCourse(@RequestBody ReservationCourseVO updateReqVO) { reservationCourseService.updateById(updateReqVO); + + //通过id查询预约记录 + ReservationCourse createObj = reservationCourseService.getById(updateReqVO.getId()); + + // 准备内容 + String message = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_COACH_RESERVE_RESULT, createObj.getReservDay(), createObj.getReservTime(), createObj.getCourseName(), getSubjectStr(createObj.getSubject()), reservatStatusStr(updateReqVO.getStatus())); + + // 发送消息 + schoolNotifyMessageSendService.sendMessage(createObj.getUserId(), message, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_MEMBER, createObj.getTenantId()); return success(true); } @@ -72,11 +87,12 @@ public class ReservationCourseController { /** * 根据学生userId查询学生信息及当天的预约记录 - * @author vinjor-M - * @date 17:25 2025/1/16 + * * @param userId 学生userId * @return cn.iocoder.yudao.framework.common.pojo.CommonResult - **/ + * @author vinjor-M + * @date 17:25 2025/1/16 + **/ @GetMapping("/getUserInfoAndReservation") @Operation(summary = "根据学生userId查询学生信息及当天的预约记录") @Parameter(name = "id", description = "学生userId", required = true, example = "1024") @@ -84,7 +100,15 @@ public class ReservationCourseController { @RequestParam("courseId") String courseId, @RequestParam("type") String type, @RequestParam("subject") Integer subject) { - return success(reservationCourseService.getUserInfoAndReservation(userId,courseId,subject,type)); + return success(reservationCourseService.getUserInfoAndReservation(userId, courseId, subject, type)); + } + + public String reservatStatusStr(Boolean status) { + if (!status) { + return "拒绝"; + } else{ + return "通过"; + } } } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/app/AppReservationCourseController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/app/AppReservationCourseController.java index fbd714cd..cd35e7ed 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/app/AppReservationCourseController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/controller/app/AppReservationCourseController.java @@ -2,6 +2,12 @@ package cn.iocoder.yudao.module.train.controller.app; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; +import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; +import cn.iocoder.yudao.module.base.service.DlDriveSchoolCoachService; +import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService; +import cn.iocoder.yudao.module.base.vo.DlDriveSchoolCoachRespVO; +import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.train.entity.ReservationCourse; import cn.iocoder.yudao.module.train.service.ReservationCourseService; import cn.iocoder.yudao.module.train.vo.ReservationCourseVO; @@ -10,6 +16,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -26,22 +34,34 @@ public class AppReservationCourseController { @Resource private ReservationCourseService reservationCourseService; + @Resource + private SchoolNotifyMessageSendService schoolNotifyMessageSendService; + @GetMapping("/page") @Operation(summary = "获得预约练车分页") + @TenantIgnore public CommonResult> getPage(ReservationCourseVO pageReqVO, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { - Page page = new Page<>(pageNo,pageSize); + Page page = new Page<>(pageNo, pageSize); Long userId = SecurityFrameworkUtils.getLoginUserId(); pageReqVO.setUserId(userId); - return success(reservationCourseService.queryListPage(pageReqVO,page)); + return success(reservationCourseService.queryListPage(pageReqVO, page)); } @PutMapping("/create") @Operation(summary = "预约练车") - public CommonResult createReservationCourse( @RequestBody ReservationCourse createObj) { + @TenantIgnore + @Transactional + public CommonResult createReservationCourse(@RequestBody @Validated ReservationCourse createObj) { reservationCourseService.save(createObj); + + // 准备消息内容 + String message = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_RESERVE_TRAIN, createObj.getUserName(), createObj.getReservDay(), createObj.getReservTime(), createObj.getCourseName(), getSubjectStr(createObj.getSubject())); + + // 发送消息 + schoolNotifyMessageSendService.sendMessage(createObj.getCoachId(), message, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_ADMIN, createObj.getTenantId()); return success(true); } @@ -71,4 +91,26 @@ public class AppReservationCourseController { } + /** + * 获取科目 + * + * @param subject 科目 + * @return 科目 + */ + public static String getSubjectStr(Integer subject) { + switch (subject) { + case 1: + return "科目一"; + case 2: + return "科目二"; + case 3: + return "科目三"; + case 4: + return "科目四"; + default: + return ""; + } + } + + } \ No newline at end of file diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/entity/ReservationCourse.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/entity/ReservationCourse.java index 66a675a0..d02f81fa 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/entity/ReservationCourse.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/entity/ReservationCourse.java @@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; +import javax.validation.constraints.NotBlank; + /** * 预约练车 DO * @@ -51,10 +53,12 @@ public class ReservationCourse extends TenantBaseDO { /** * 预约日期 yyyy-MM-dd */ + @NotBlank(message = "预约日期不能为空") private String reservDay; /** * 时间段(字典:school_reserv_time)09:00-10:00 */ + @NotBlank(message = "预约时间不能为空") private String reservTime; /** * 科目(1-科目一;2-科目二;3科目三;4科目四) diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/ReservationCourseService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/ReservationCourseService.java index 7e8022bd..d87b4553 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/ReservationCourseService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/ReservationCourseService.java @@ -17,21 +17,23 @@ public interface ReservationCourseService extends IService { /** * 分页查询 + * + * @param pageReqVO TODO + * @param page TODO + * @return com.baomidou.mybatisplus.core.metadata.IPage * @author vinjor-M * @date 15:05 2025/1/14 - * @param pageReqVO TODO - * @param page TODO - * @return com.baomidou.mybatisplus.core.metadata.IPage - **/ + **/ IPage queryListPage(ReservationCourseVO pageReqVO, Page page); /** * 根据学生userId查询学生信息及当天的预约记录 + * + * @param userId + * @return java.util.Map * @author vinjor-M * @date 17:27 2025/1/16 - * @param userId - * @return java.util.Map - **/ - Map getUserInfoAndReservation(Long userId,String courseId,Integer subject,String type); + **/ + Map getUserInfoAndReservation(Long userId, String courseId, Integer subject, String type); } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java index d2e8ac8f..e422f7a0 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/service/impl/TrainServiceImpl.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.train.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; +import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; +import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService; import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.service.ProcessService; import cn.iocoder.yudao.module.train.entity.Train; @@ -17,9 +19,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; +import javax.annotation.Resource; import java.util.Date; import java.util.List; +import static cn.iocoder.yudao.module.train.controller.app.AppReservationCourseController.getSubjectStr; + /** * 预约练车 Service 实现类 @@ -33,6 +38,8 @@ public class TrainServiceImpl extends ServiceImpl implements @Autowired @Lazy private ProcessService processService; + @Resource + private SchoolNotifyMessageSendService schoolNotifyMessageSendService; /** * 分页查询 @@ -72,6 +79,11 @@ public class TrainServiceImpl extends ServiceImpl implements public void createObj(TrainVO trainVO) { trainVO.setTrainDay(DateUtil.format(new Date(), "yyyy-MM-dd")); this.save(trainVO); + + // 准备消息内容 + String message = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_ATTENDANCE, DateUtil.format(trainVO.getStartTime(), "yyyy-MM-dd HH:mm:ss"), trainVO.getAddr(), trainVO.getCourseName(), getSubjectStr(trainVO.getSubject())); + + schoolNotifyMessageSendService.sendMessage(trainVO.getUserId(), message, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_MEMBER, null); } /** @@ -92,6 +104,11 @@ public class TrainServiceImpl extends ServiceImpl implements process.setId(trainVO.getProcessId()); process.setTrainTime(allTrainTime); processService.updateById(process); + + // 准备消息内容 + String message = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_END_ATTENDANCE, DateUtil.format(trainVO.getEndTime(), "yyyy-MM-dd HH:mm:ss"), trainVO.getCourseName(), getSubjectStr(trainVO.getSubject()), trainVO.getTrainTime(), trainVO.getAllTrainTime()); + + schoolNotifyMessageSendService.sendMessage(trainVO.getUserId(), message, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_MEMBER, null); } /** diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/ReservationCourseVO.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/ReservationCourseVO.java index c6032dda..7076965d 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/ReservationCourseVO.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/train/vo/ReservationCourseVO.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.train.vo; import cn.iocoder.yudao.module.train.entity.ReservationCourse; +import com.baomidou.mybatisplus.annotation.TableField; import lombok.Data; @Data @@ -26,4 +27,16 @@ public class ReservationCourseVO extends ReservationCourse { * 用户性别-学员 */ private String userSex; + /** + * 状态字符串 + */ + private String statusStr; + /** + * 科目字符串 + */ + private String subjectStr; + /** + * 课程类型 + */ + private String courseType; } diff --git a/dl-module-jx/src/main/resources/mapper/train/ReservationCourseMapper.xml b/dl-module-jx/src/main/resources/mapper/train/ReservationCourseMapper.xml index f3eda1dc..aaa4156f 100644 --- a/dl-module-jx/src/main/resources/mapper/train/ReservationCourseMapper.xml +++ b/dl-module-jx/src/main/resources/mapper/train/ReservationCourseMapper.xml @@ -6,7 +6,19 @@