Browse Source

课程转换

zouxuan 2 years ago
parent
commit
3584b2e572

+ 56 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dao/CourseScheduleConvertDao.java

@@ -0,0 +1,56 @@
+package com.ym.mec.biz.dal.dao;
+
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseConvertSumDto;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+public interface CourseScheduleConvertDao {
+
+    /**
+    * @description: 获取符合课程转换要求的课程数量,用于校验
+     * @param courseIds
+    * @return int
+    * @author zx
+    * @date 2022/9/21 10:33
+    */
+    int countLegalCourse(@Param("courseIds") String courseIds);
+
+    /**
+    * @description: 校验所选课程是否所有学员的课程数量一致
+     * @param courseIds
+     * @param courseNum
+    * @return java.lang.String
+    * @author zx
+    * @date 2022/9/21 11:40
+    */
+    int checkStudentCourseNum(@Param("courseIds") String courseIds, @Param("courseNum") int courseNum);
+
+    /**
+    * @description: 获取可转换课程时长,学员数量,课程数量
+     * @param courseIds
+    * @return com.ym.mec.biz.dal.dto.CourseConvertSumDto
+    * @author zx
+    * @date 2022/9/21 14:48 
+    */
+    CourseConvertSumDto sumCourseConvert(@Param("courseIds") String courseIds);
+
+    /**
+    * @description: 获取课程关联的学员列表
+     * @param courseIds
+    * @return java.util.List<com.ym.mec.biz.dal.dto.BasicUserDto>
+    * @author zx
+    * @date 2022/9/21 15:16
+    */
+    List<BasicUserDto> queryStudents(@Param("courseIds") String courseIds);
+
+    /**
+    * @description: 获取课关联的班级数量
+     * @param courseIds
+    * @return int
+    * @author zx
+    * @date 2022/9/21 16:42
+    */
+    int countClassNum(@Param("courseIds") String courseIds);
+}

+ 18 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertDto.java

@@ -0,0 +1,18 @@
+package com.ym.mec.biz.dal.dto;
+
+import com.ym.mec.biz.dal.entity.ClassGroup;
+
+import java.util.List;
+
+public class CourseConvertDto {
+
+    private List<ClassGroup> classGroups;
+
+    public List<ClassGroup> getClassGroups() {
+        return classGroups;
+    }
+
+    public void setClassGroups(List<ClassGroup> classGroups) {
+        this.classGroups = classGroups;
+    }
+}

+ 43 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/dto/CourseConvertSumDto.java

@@ -0,0 +1,43 @@
+package com.ym.mec.biz.dal.dto;
+
+public class CourseConvertSumDto {
+    private Integer courseNum;
+
+    private String courseType;
+
+    private Integer studentNum;
+
+    private Integer courseMinute;
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public String getCourseType() {
+        return courseType;
+    }
+
+    public void setCourseType(String courseType) {
+        this.courseType = courseType;
+    }
+
+    public Integer getStudentNum() {
+        return studentNum;
+    }
+
+    public void setStudentNum(Integer studentNum) {
+        this.studentNum = studentNum;
+    }
+
+    public Integer getCourseMinute() {
+        return courseMinute;
+    }
+
+    public void setCourseMinute(Integer courseMinute) {
+        this.courseMinute = courseMinute;
+    }
+}

+ 104 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/ClassGroupDto.java

@@ -0,0 +1,104 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.ym.mec.biz.dal.enums.ClassGroupTypeEnum;
+import com.ym.mec.biz.dal.enums.GroupType;
+import com.ym.mec.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ClassGroupDto extends BaseEntity {
+
+	private GroupType groupType;
+
+	/**  */
+	@ApiModelProperty(value = "乐团编号", required = true)
+	private String musicGroupId;
+
+	/**  */
+	@ApiModelProperty(value = "科目编号(多个,号分割)", required = true)
+	private String subjectIdList;
+
+	@ApiModelProperty(value = "学生编号(多个,号分割)", required = true)
+	private String userIds;
+
+	/** 班级名称 */
+	@ApiModelProperty(value = "班级名称", required = true)
+	private String name;
+
+	/** 预计招生人数 */
+	@ApiModelProperty(value = "预计招生人数", required = true)
+	private Integer expectStudentNum;
+
+	/** 班级类型(普通班级、合奏班级) */
+	@ApiModelProperty(value = "班级类型(普通班级、合奏班级、提高课班级、VIP班级、试听课)", required = true)
+	private ClassGroupTypeEnum type;
+
+	private List<ClassGroupTeacherMapper> teacherMapperList = new ArrayList<ClassGroupTeacherMapper>();
+
+	public GroupType getGroupType() {
+		return groupType;
+	}
+
+	public void setGroupType(GroupType groupType) {
+		this.groupType = groupType;
+	}
+
+	public String getMusicGroupId() {
+		return musicGroupId;
+	}
+
+	public void setMusicGroupId(String musicGroupId) {
+		this.musicGroupId = musicGroupId;
+	}
+
+	public String getSubjectIdList() {
+		return subjectIdList;
+	}
+
+	public void setSubjectIdList(String subjectIdList) {
+		this.subjectIdList = subjectIdList;
+	}
+
+	public String getUserIds() {
+		return userIds;
+	}
+
+	public void setUserIds(String userIds) {
+		this.userIds = userIds;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public void setName(String name) {
+		this.name = name;
+	}
+
+	public Integer getExpectStudentNum() {
+		return expectStudentNum;
+	}
+
+	public void setExpectStudentNum(Integer expectStudentNum) {
+		this.expectStudentNum = expectStudentNum;
+	}
+
+	public ClassGroupTypeEnum getType() {
+		return type;
+	}
+
+	public void setType(ClassGroupTypeEnum type) {
+		this.type = type;
+	}
+
+	public List<ClassGroupTeacherMapper> getTeacherMapperList() {
+		return teacherMapperList;
+	}
+
+	public void setTeacherMapperList(List<ClassGroupTeacherMapper> teacherMapperList) {
+		this.teacherMapperList = teacherMapperList;
+	}
+}

+ 2 - 2
mec-biz/src/main/java/com/ym/mec/biz/service/ClassGroupService.java

@@ -21,8 +21,8 @@ import java.util.Map;
 public interface ClassGroupService extends BaseService<Integer, ClassGroup> {
 	
 	PageInfo<ClassGroup> queryPage(ClassGroupQueryInfo queryInfo);
-	
-	boolean create(ClassGroup classGroup);
+
+    Integer create(ClassGroup classGroup);
 
     /**
      * 查询老师乐团课课程

+ 32 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/CourseScheduleConvertService.java

@@ -0,0 +1,32 @@
+package com.ym.mec.biz.service;
+
+import com.ym.mec.biz.dal.dto.CourseConvertDto;
+
+import java.util.HashMap;
+
+public interface CourseScheduleConvertService{
+
+    /**
+    * @description: 根据用户所选课程编号,查询出需要进行课程转换的学员列表,
+     * 并计算可转换课程时长,
+     * 1、校验学员剩余时长是否一致
+     * 2、所选课程是否未开始
+     * 3、课程类似是否一致
+     * 4、目前只能转换声部和集训声部为线上基础技能课。或者将线上基础技能课还原
+     * 5、老师课酬总额和原课酬总额一致,平铺到所有课程
+     * @param courseIds
+    * @return java.util.List<com.ym.mec.biz.dal.dto.BasicUserDto>
+    * @author zx
+    * @date 2022/9/21 10:15
+    */
+    HashMap<String, Object> queryConvertStudent(String courseIds);
+
+    /**
+    * @description: 课程转换
+     * @param convertDto
+    * @return java.lang.Boolean
+    * @author zx
+    * @date 2022/9/21 18:01
+    */
+    Boolean action(CourseConvertDto convertDto);
+}

+ 3 - 4
mec-biz/src/main/java/com/ym/mec/biz/service/impl/ClassGroupServiceImpl.java

@@ -195,9 +195,8 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
     }
 
     @Override
-    @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
-    public boolean create(ClassGroup classGroup) {
-
+    @Transactional(rollbackFor = Exception.class)
+    public Integer create(ClassGroup classGroup) {
         if (classGroup.getType() == null) {
             throw new BizException("班级类型不能为空");
         }
@@ -303,7 +302,7 @@ public class ClassGroupServiceImpl extends BaseServiceImpl<Integer, ClassGroup>
                     musicGroup.getName(), musicGroup.getName(), null, "MUSIC", ImGroup.GroupTypeEnum.valueOf(classGroup.getType().getCode()));
             imGroupMemberService.join(classGroup.getId().toString(), userRoleMap);
         }
-        return true;
+        return classGroup.getId();
     }
 
     @Override

+ 74 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/CourseScheduleConvertServiceImpl.java

@@ -0,0 +1,74 @@
+package com.ym.mec.biz.service.impl;
+
+import com.ym.mec.biz.dal.dao.CourseScheduleConvertDao;
+import com.ym.mec.biz.dal.dao.StudentDao;
+import com.ym.mec.biz.dal.dao.SubjectDao;
+import com.ym.mec.biz.dal.dao.TeacherDao;
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseConvertDto;
+import com.ym.mec.biz.dal.dto.CourseConvertSumDto;
+import com.ym.mec.biz.dal.entity.ClassGroup;
+import com.ym.mec.biz.service.CourseScheduleConvertService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.util.collection.MapUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Service
+public class CourseScheduleConvertServiceImpl implements CourseScheduleConvertService {
+
+    @Autowired
+    private CourseScheduleConvertDao courseScheduleConvertDao;
+    @Autowired
+    private StudentDao studentDao;
+
+    @Override
+    public HashMap<String, Object> queryConvertStudent(String courseIds) {
+        //校验课程是否可以进行转换
+        this.checkConvertCourseIds(courseIds);
+        //获取可转换课程时长,学员数量,课程数量
+        CourseConvertSumDto courseConvertSumDto = courseScheduleConvertDao.sumCourseConvert(courseIds);
+        //获取学员列表
+        List<BasicUserDto> basicUserDtos = Optional.ofNullable(courseScheduleConvertDao.queryStudents(courseIds)).
+                orElseThrow(()->new BizException("操作失败:所选课程没有学员"));
+        List<Integer> userIds = basicUserDtos.stream().map(e -> e.getUserId()).collect(Collectors.toList());
+        Map<Integer,String> subjectMap = MapUtil.convertIntegerMap(studentDao.getStudentSubjectMapList(userIds));
+        basicUserDtos.stream().forEach(e->e.setSubjectName(subjectMap.get(e.getUserId())));
+        HashMap<String, Object> resultMap = new HashMap<>(2);
+        resultMap.put("courseConvertSum",courseConvertSumDto);
+        resultMap.put("students",basicUserDtos);
+        return resultMap;
+    }
+
+    @Override
+    public Boolean action(CourseConvertDto convertDto) {
+        List<ClassGroup> classGroups = convertDto.getClassGroups();
+
+        return null;
+    }
+
+    private void checkConvertCourseIds(String courseIds){
+        //是否同一个班级
+        int classNum = courseScheduleConvertDao.countClassNum(courseIds);
+        if(classNum > 1){
+            throw new BizException("操作失败:请选择同一个班级的课程");
+        }
+        //获取合法的课程列表
+        int num = courseScheduleConvertDao.countLegalCourse(courseIds);
+        String[] split = courseIds.split(",");
+        if(num < split.length){
+            throw new BizException("操作失败:所选课程不支持课程转换");
+        }
+        //校验学员时长是否一致
+        int errorNum = courseScheduleConvertDao.checkStudentCourseNum(courseIds,split.length);
+        if (errorNum > 0){
+            throw new BizException("操作失败: 课程关联学员不一致");
+        }
+    }
+}

+ 42 - 0
mec-biz/src/main/resources/config/mybatis/CourseScheduleConvert.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<!--
+这个文件是自动生成的。
+不要修改此文件。所有改动将在下次重新自动生成时丢失。
+-->
+<mapper namespace="com.ym.mec.biz.dal.dao.CourseScheduleConvertDao">
+
+    <select id="countLegalCourse" resultType="java.lang.Integer">
+        SELECT COUNT(cs.id_) FROM course_schedule cs
+        WHERE status_ = 'NOT_START' AND (cs.type_ IN ('SINGLE','TRAINING_SINGLE') OR cs.convert_flag_ = 1)
+        AND cs.is_lock_ = 0 AND cs.del_flag_ = 0 AND cs.pre_course_flag_ = 0 AND (cs.new_course_id_ IS NULL OR cs.new_course_id_ = cs.id_)
+        AND FIND_IN_SET(cs.id_,#{courseIds})
+    </select>
+    <select id="checkStudentCourseNum" resultType="java.lang.Integer">
+        select COUNT(cssp.id_) from course_schedule_student_payment cssp
+        where cssp.user_id_ NOT IN (select distinct cssp.user_id_ from course_schedule_student_payment cssp
+        where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds}))
+        and FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})
+    </select>
+    <resultMap id="CourseConvertSumDto" type="com.ym.mec.biz.dal.dto.CourseConvertSumDto">
+        <result property="courseType" column="courseType"/>
+        <result property="courseNum" column="courseNum"/>
+        <result property="studentNum" column="num_"/>
+        <result property="courseMinute" column="minute_"/>
+    </resultMap>
+    <select id="sumCourseConvert" resultMap="CourseConvertSumDto">
+        select COUNT(distinct cs.id_) courseNum,cs.type_ courseType,cssp.num_,SUM(TIMESTAMPDIFF(MINUTE,cs.start_class_time_,cs.end_class_time_)) minute_ from course_schedule cs,
+        (select COUNT(distinct cssp.user_id_) num_ from course_schedule_student_payment cssp
+        where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})) cssp
+        where FIND_IN_SET(cs.id_,#{courseIds})
+    </select>
+    <select id="queryStudents" resultType="com.ym.mec.biz.dal.dto.BasicUserDto">
+        select cssp.user_id_ userId,su.username_ name,su.phone_ phone from course_schedule_student_payment cssp
+        LEFT JOIN sys_user su ON su.id_ = cssp.user_id_
+        where FIND_IN_SET(cssp.course_schedule_id_,#{courseIds})
+        group by cssp.user_id_
+    </select>
+    <select id="countClassNum" resultType="java.lang.Integer">
+        select COUNT(distinct cs.class_group_id_) from course_schedule cs where FIND_IN_SET(cs.id_,#{courseIds})
+    </select>
+</mapper>

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/controller/ClassGroupController.java

@@ -58,7 +58,7 @@ public class ClassGroupController extends BaseController {
     @ApiOperation(value = "创建班级")
     @PostMapping("/create")
     @PreAuthorize("@pcs.hasPermissions('classGroup/create')")
-    public HttpResponseResult<Boolean> create(@RequestBody ClassGroup classGroup) throws Exception {
+    public HttpResponseResult<Integer> create(@RequestBody ClassGroup classGroup) throws Exception {
         return succeed(classGroupService.create(classGroup));
     }
 

+ 58 - 0
mec-web/src/main/java/com/ym/mec/web/controller/CourseScheduleConvertController.java

@@ -0,0 +1,58 @@
+package com.ym.mec.web.controller;
+
+import com.ym.mec.biz.dal.dto.BasicUserDto;
+import com.ym.mec.biz.dal.dto.CourseConvertDto;
+import com.ym.mec.biz.dal.dto.SimpleUserDto;
+import com.ym.mec.biz.dal.entity.CourseSchedule;
+import com.ym.mec.biz.dal.page.UserBasicQueryInfo;
+import com.ym.mec.biz.service.CourseScheduleConvertService;
+import com.ym.mec.biz.service.CourseScheduleService;
+import com.ym.mec.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+
+/**
+* @author zx
+* @date 2022/9/21 09:55
+*/
+@RequestMapping("courseScheduleConvert")
+@Api(tags = "课程转换服务")
+@RestController
+public class CourseScheduleConvertController extends BaseController {
+
+    @Autowired
+    private CourseScheduleConvertService courseScheduleConvertService;
+
+    @ApiOperation(value = "获取需要转换的学员列表")
+    @GetMapping("/queryStudent")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/queryStudent')")
+    public HttpResponseResult<HashMap<String, Object>> queryStudent(String courseIds){
+        if (StringUtils.isEmpty(courseIds)){
+            throw new BizException("参数校验失败");
+        }
+        return succeed(courseScheduleConvertService.queryConvertStudent(courseIds));
+    }
+
+    @ApiOperation(value = "课程转换")
+    @GetMapping("/action")
+    @PreAuthorize("@pcs.hasPermissions('courseScheduleConvert/action')")
+    public HttpResponseResult<Boolean> action(@RequestBody CourseConvertDto convertDto){
+        return succeed(courseScheduleConvertService.action(convertDto));
+    }
+
+
+
+}
+