no message

This commit is contained in:
Vinjor 2025-02-11 10:15:55 +08:00
parent 2f4ad45d4c
commit 4a9e99f69e
19 changed files with 285 additions and 34 deletions

View File

@ -31,8 +31,8 @@ public class DataViewController {
**/
@GetMapping("/getStudentInfo")
@Operation(summary = "查询学员详情")
public CommonResult<?> selectStudentInfo(@RequestParam("id") Long id) {
return success(dataViewService.selectStudentInfo(id));
public CommonResult<?> selectStudentInfo(@RequestParam("id") Long id,@RequestParam(value = "coachId",required = false)Long coachId) {
return success(dataViewService.selectStudentInfo(id,coachId));
}
}

View File

@ -15,6 +15,6 @@ public interface DataViewService {
* @param id 学生id
* @return cn.iocoder.yudao.module.base.vo.StudentInfoVO
**/
StudentInfoVO selectStudentInfo(Long id);
StudentInfoVO selectStudentInfo(Long id,Long coachId);
}

View File

@ -81,5 +81,13 @@ public interface DlDriveSchoolCoachService extends IService<DlDriveSchoolCoach>
*/
DlDriveSchoolCoachRespVO getDlDriveSchoolCoach(String id);
/**
* 获得驾校教练---通过user_id查
*
* @param userId 用户表id
* @return 驾校教练
*/
DlDriveSchoolCoachRespVO getDlDriveSchoolCoachByUserId(Long userId);
}

View File

@ -2,10 +2,14 @@ package cn.iocoder.yudao.module.base.service.impl;
import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.base.service.DataViewService;
import cn.iocoder.yudao.module.base.service.DlDriveSchoolCoachService;
import cn.iocoder.yudao.module.base.service.DlDriveSchoolStudentService;
import cn.iocoder.yudao.module.base.vo.DlDriveSchoolCoachRespVO;
import cn.iocoder.yudao.module.base.vo.StudentInfoVO;
import cn.iocoder.yudao.module.course.entity.Process;
import cn.iocoder.yudao.module.course.service.ProcessService;
import cn.iocoder.yudao.module.exam.service.ExamBatchItemService;
import cn.iocoder.yudao.module.train.service.TrainService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
@ -16,7 +20,13 @@ public class DataViewServiceImpl implements DataViewService {
@Autowired
private DlDriveSchoolStudentService studentService;
@Autowired
private DlDriveSchoolCoachService coachService;
@Autowired
private ProcessService processService;
@Autowired
private TrainService trainService;
@Autowired
private ExamBatchItemService examBatchItemService;
/**
* 查询学员详情
@ -27,11 +37,25 @@ public class DataViewServiceImpl implements DataViewService {
* @date 14:37 2025/2/8
**/
@Override
public StudentInfoVO selectStudentInfo(Long id) {
public StudentInfoVO selectStudentInfo(Long id,Long coachId) {
StudentInfoVO studentInfoVO = new StudentInfoVO();
//学员主信息
DlDriveSchoolStudent student = studentService.getStudentByUserId(id);
studentInfoVO.setStudentInfo(student);
//当前学习进度
Process process = processService.selectByUserId(id);
return null;
Process process = processService.selectByUserId(id,coachId);
studentInfoVO.setProcess(process);
//查归属教练信息
DlDriveSchoolCoachRespVO coachRespVO = coachService.getDlDriveSchoolCoachByUserId(process.getCoachId());
if(null!=coachRespVO){
//有教练查未毕业学员已毕业学员区分科目
coachRespVO.setDataMap(processService.selectByCoachId(coachRespVO.getUserId()));
studentInfoVO.setCoachInfo(coachRespVO);
}
//查该学生的培训记录
studentInfoVO.setTrainList(trainService.selectByUserIdAndCoachId(id,coachId));
//查该学生的考试记录
studentInfoVO.setExamList(examBatchItemService.selectByUserIdAndCoachId(id, coachId));
return studentInfoVO;
}
}

View File

@ -180,5 +180,23 @@ public class DlDriveSchoolCoachServiceImpl extends ServiceImpl<DlDriveSchoolCoac
return result;
}
/**
* 获得驾校教练---通过user_id查
*
* @param userId 用户表id
* @return 驾校教练
*/
@Override
public DlDriveSchoolCoachRespVO getDlDriveSchoolCoachByUserId(Long userId) {
LambdaQueryWrapper<DlDriveSchoolCoach> queryWrapper = new LambdaQueryWrapper<DlDriveSchoolCoach>()
.eq(DlDriveSchoolCoach::getUserId,userId);
List<DlDriveSchoolCoach> list = this.list(queryWrapper);
DlDriveSchoolCoachRespVO schoolCoach = null;
if(!list.isEmpty()){
schoolCoach = BeanUtils.toBean(list.get(0), DlDriveSchoolCoachRespVO.class);
}
return schoolCoach;
}
}

View File

@ -5,9 +5,12 @@ import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Map;
@Schema(description = "管理后台 - 驾校教练 Response VO")
@Data
@ExcelIgnoreUnannotated
public class DlDriveSchoolCoachRespVO extends DlDriveSchoolCoach {
/**教练带教学员数量情况-细分科目2、3未毕业、已毕业数量*/
Map<String,Integer> dataMap;
}

View File

@ -1,10 +1,23 @@
package cn.iocoder.yudao.module.base.vo;
import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.course.entity.Process;
import cn.iocoder.yudao.module.exam.vo.ExamBatchItemVO;
import cn.iocoder.yudao.module.train.entity.Train;
import lombok.Data;
import java.util.List;
@Data
public class StudentInfoVO {
/**学生基本信息*/
private DlDriveSchoolStudent studentInfo;
/**学习进度*/
private Process process;
/**教练信息*/
private DlDriveSchoolCoachRespVO coachInfo;
/**训练记录*/
private List<Train> trainList;
/**考试记录*/
private List<ExamBatchItemVO> examList;
}

View File

@ -38,7 +38,7 @@ public class Process extends TenantBaseDO {
/**
* 用户学员ID
*/
private Integer userId;
private Long userId;
/**
* 用户学员姓名
*/
@ -50,7 +50,7 @@ public class Process extends TenantBaseDO {
/**
* 教练ID
*/
private Integer coachId;
private Long coachId;
/**
* 教练姓名
*/

View File

@ -53,5 +53,5 @@ public interface ProcessMapper extends BaseMapper<Process> {
* @param userId 用户id
* @return cn.iocoder.yudao.module.course.entity.Process
**/
Process selectNewMaxByUserId(@Param("userId") Long userId);
Process selectNewMaxByUserId(@Param("userId") Long userId,@Param("coachId") Long coachId);
}

View File

@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* 学员课程进度 Service 接口
@ -46,9 +47,19 @@ public interface ProcessService extends IService<Process> {
* 查学生当下正在学习中的学习进度
* @author vinjor-M
* @date 16:39 2025/2/8
* @param userId TODO
* @param userId 用户id
* @param coachId 教练id
* @return cn.iocoder.yudao.module.course.entity.Process
**/
Process selectByUserId(Long userId);
Process selectByUserId(Long userId,Long coachId);
/**
* 查询教练 每个科目已毕未毕业学生数量
* @author vinjor-M
* @date 13:52 2025/2/10
* @param coachId 教练id
* @return java.util.Map<java.lang.String,java.lang.Integer>
**/
Map<String,Integer> selectByCoachId(Long coachId);
}

View File

@ -13,7 +13,8 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -108,9 +109,65 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
* @date 15:18 2025/2/8
**/
@Override
public Process selectByUserId(Long userId) {
public Process selectByUserId(Long userId,Long coachId) {
return processMapper.selectNewMaxByUserId(userId,coachId);
}
return null;
/**
* 查询教练 每个科目已毕未毕业学生数量
*
* @param coachId 教练id
* @return java.util.Map<java.lang.String, java.lang.Integer>
* @author vinjor-M
* @date 13:52 2025/2/10
**/
@Override
public Map<String, Integer> selectByCoachId(Long coachId) {
LambdaQueryWrapper<Process> queryWrapper = new LambdaQueryWrapper<Process>()
.eq(Process::getCoachId,coachId);
List<Process> allList = this.list(queryWrapper);
//所有科目二的记录
List<Process> subject2List = allList.stream().filter(item->2==item.getSubject()).collect(Collectors.toList());
//所有科目三的记录
List<Process> subject3List = allList.stream().filter(item->3==item.getSubject()).collect(Collectors.toList());
//科目二未毕业学员id
Set<Long> subject2No = new HashSet<>();
//科目二已毕业学员id
Set<Long> subject2Over = new HashSet<>();
for (Process item:subject2List){
if("2".equals(item.getStatus())){
//已完成
if("1".equals(item.getExamStatus())){
//已通过考试
subject2Over.add(item.getUserId());
}
}else{
//未完成
subject2No.add(item.getUserId());
}
}
//科目三未毕业学员id
Set<Long> subject3No = new HashSet<>();
//科目三已毕业学员id
Set<Long> subject3Over = new HashSet<>();
for (Process item:subject3List){
if("2".equals(item.getStatus())){
//已完成
if("1".equals(item.getExamStatus())){
//已通过考试
subject3Over.add(item.getUserId());
}
}else{
//未完成
subject3No.add(item.getUserId());
}
}
Map<String, Integer> 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;
}
}

View File

@ -22,4 +22,6 @@ public interface ExamBatchItemMapper extends BaseMapper<ExamBatchItem> {
IPage<ExamBatchItemVO> queryListPage(@Param("entity") ExamBatchVO pageReqVO, Page<ExamBatchItemVO> page);
List<ExamBatchItemVO> selectByBatchId(@Param("batchId")String batchId);
List<ExamBatchItemVO> selectByUserIdAndCoachId(@Param("userId")Long userId,@Param("coachId")Long coachId);
}

View File

@ -40,4 +40,14 @@ public interface ExamBatchItemService extends IService<ExamBatchItem> {
* @date 13:48 2025/1/21
**/
void updateObj(ExamBatchItemVO examBatchVO);
/**
* 根据学生id和教练ID查询考试记录
* @author vinjor-M
* @date 16:38 2025/2/10
* @param userId 学生ID
* @param coachId 教练ID可能为空
* @return java.util.List<cn.iocoder.yudao.module.exam.vo.ExamBatchItemVO>
**/
List<ExamBatchItemVO> selectByUserIdAndCoachId(Long userId,Long coachId);
}

View File

@ -110,23 +110,39 @@ public class ExamBatchItemServiceImpl extends ServiceImpl<ExamBatchItemMapper, E
if(examBatchVO.getIfPass()){
//考试通过
if(process.getSubject()<3){
//科目一二插入一条下一个科目的学习进度
Process nextProcess = new Process();
nextProcess.setCourseId(process.getCourseId());
nextProcess.setCourseName(process.getCourseName());
nextProcess.setUserId(process.getUserId());
nextProcess.setUserName(process.getUserName());
nextProcess.setUserMobile(process.getUserMobile());
nextProcess.setCoachId(process.getCoachId());
nextProcess.setCoachName(process.getCoachName());
nextProcess.setSubject(process.getSubject()+1);
nextProcess.setExamNum(process.getExamNum()+1);
nextProcess.setStatus("1");
nextProcess.setTrainTime((double) 0);
processService.save(nextProcess);
//科目一二插入一条需要查出下一个的学习进度如果不存在手动插入一个
Integer nextSubject = process.getSubject()+1;
LambdaQueryWrapper<Process> queryWrapper = new LambdaQueryWrapper<Process>()
.eq(Process::getCourseId,process.getCourseId())
.eq(Process::getUserId,process.getUserId())
.eq(Process::getCoachId,process.getCoachId())
.eq(Process::getSubject,nextSubject)
.eq(Process::getStatus,"0");
List<Process> list = processService.list(queryWrapper);
if(list.isEmpty()){
//插入
Process nextProcess = new Process();
nextProcess.setCourseId(process.getCourseId());
nextProcess.setCourseName(process.getCourseName());
nextProcess.setUserId(process.getUserId());
nextProcess.setUserName(process.getUserName());
nextProcess.setUserMobile(process.getUserMobile());
nextProcess.setCoachId(process.getCoachId());
nextProcess.setCoachName(process.getCoachName());
nextProcess.setSubject(process.getSubject()+1);
nextProcess.setExamNum(process.getExamNum()+1);
nextProcess.setStatus("1");
nextProcess.setTrainTime((double) 0);
processService.save(nextProcess);
}else{
//更新状态为进行中
Process nextProcess = list.get(0);
nextProcess.setStatus("1");
processService.updateById(nextProcess);
}
}
}else{
//考试不通过,重新插入一条本科目的学习记录
//考试不通过,重新插入一条本科目的学习记录-并改为进行中
Process thisProcess = new Process();
thisProcess.setCourseId(process.getCourseId());
thisProcess.setCourseName(process.getCourseName());
@ -164,4 +180,18 @@ public class ExamBatchItemServiceImpl extends ServiceImpl<ExamBatchItemMapper, E
}
}
}
/**
* 根据学生id和教练ID查询考试记录
*
* @param userId 学生ID
* @param coachId 教练ID可能为空
* @return java.util.List<cn.iocoder.yudao.module.exam.vo.ExamBatchItemVO>
* @author vinjor-M
* @date 16:38 2025/2/10
**/
@Override
public List<ExamBatchItemVO> selectByUserIdAndCoachId(Long userId, Long coachId) {
return examBatchItemMapper.selectByUserIdAndCoachId(userId, coachId);
}
}

View File

@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.exam.vo;
import cn.iocoder.yudao.module.exam.entity.ExamBatchItem;
import lombok.Data;
import java.util.Date;
@Data
public class ExamBatchItemVO extends ExamBatchItem {
/**
@ -29,4 +31,21 @@ public class ExamBatchItemVO extends ExamBatchItem {
* 本科目累计训练时长
*/
private Double trainTime;
/**
* 考试开始时间
*/
private Date startTime;
/**
* 考试结束时间
*/
private Date endTime;
/**
* 考试地址
*/
private String addr;
/**
* 考试交通方式
*/
private String transWay;
}

View File

@ -6,6 +6,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* 预约练车 Service 接口
*
@ -49,4 +51,14 @@ public interface TrainService extends IService<Train> {
* @return cn.iocoder.yudao.module.train.entity.Train
**/
Train getUserTrainData(Long userId,String courseId,Integer subject,String dayStr);
/**
* 查某学生所有培训记录
* @author vinjor-M
* @date 16:26 2025/2/10
* @param userId 学生id
* @param coachId 教练id可能为空
* @return java.util.List<cn.iocoder.yudao.module.train.entity.Train>
**/
List<Train> selectByUserIdAndCoachId(Long userId,Long coachId);
}

View File

@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.train.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.course.entity.Process;
import cn.iocoder.yudao.module.course.service.ProcessService;
import cn.iocoder.yudao.module.train.entity.Train;
@ -101,4 +102,24 @@ public class TrainServiceImpl extends ServiceImpl<TrainMapper, Train> implements
List<Train> list = this.list(queryWrapper);
return list.isEmpty()?null:list.get(0);
}
/**
* 查某学生所有培训记录
*
* @param userId 学生id
* @param coachId 教练id可能为空
* @return java.util.List<cn.iocoder.yudao.module.train.entity.Train>
* @author vinjor-M
* @date 16:26 2025/2/10
**/
@Override
public List<Train> selectByUserIdAndCoachId(Long userId, Long coachId) {
LambdaQueryWrapper<Train> queryWrapper = new LambdaQueryWrapper<Train>()
.eq(Train::getUserId,userId);
if(null!=coachId){
queryWrapper.eq(Train::getCoachId,coachId);
}
queryWrapper.orderByDesc(BaseDO::getCreateTime);
return this.list(queryWrapper);
}
}

View File

@ -26,6 +26,9 @@
dsp.* FROM drive_school_process dsp
WHERE
dsp.user_id = #{userId}
<if test="coachId != null and coachId != ''">
AND dsp.coach_id=#{coachId}
</if>
ORDER BY dsp.`subject` DESC, dsp.create_time DESC LIMIT 1
</select>
</mapper>

View File

@ -25,11 +25,31 @@
</select>
<select id="selectByBatchId" resultType="cn.iocoder.yudao.module.exam.vo.ExamBatchItemVO">
SELECT
*
dseb.*,dss.phone AS userMobile
FROM
drive_school_exam_batch_item
drive_school_exam_batch_item dseb
left join drive_school_student dss ON dseb.user_id = dss.user_id AND dss.deleted=0
WHERE
deleted = 0
AND batch_id = #{batchId}
dseb.deleted = 0
AND dseb.batch_id = #{batchId}
</select>
<select id="selectByUserIdAndCoachId" resultType="cn.iocoder.yudao.module.exam.vo.ExamBatchItemVO">
SELECT
dsebi.*,
dseb.batch_name,
dseb.start_time,
dseb.end_time,
dseb.`subject`,
dseb.addr,
dseb.trans_way
FROM
drive_school_exam_batch_item dsebi
LEFT JOIN drive_school_exam_batch dseb ON dsebi.batch_id = dseb.id
WHERE
dsebi.user_id = #{userId}
<if test="coachId != null and coachId != ''">
AND dseb.coach_id=#{coachId}
</if>
ORDER BY dseb.create_time DESC
</select>
</mapper>