Bläddra i källkod

Merge branch 'dev_v1.3.5_20220929' of http://git.dayaedu.com/yonge/cooleshow into dev_v1.3.5_20220929

Eric 2 år sedan
förälder
incheckning
78e6491ecb
14 ändrade filer med 1089 tillägg och 2 borttagningar
  1. 38 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  2. 326 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TeacherBindingUserVo.java
  3. 15 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java
  4. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBindingTeacherDao.java
  5. 29 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CourseScheduleMapper.java
  6. 19 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/StudentMapper.java
  7. 13 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SubjectMapper.java
  8. 102 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherBindingUserQueryInfo.java
  9. 18 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserBindingTeacherService.java
  10. 139 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserBindingTeacherServiceImpl.java
  11. 125 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingCourseWrapper.java
  12. 179 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingTeacherWrapper.java
  13. 43 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml
  14. 31 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml

+ 38 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -1,6 +1,12 @@
 package com.yonge.cooleshow.admin.controller;
 
 import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.admin.io.request.TeacherBindingUserVo;
+import com.yonge.cooleshow.admin.io.request.coupon.CouponIssueVo;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 import com.yonge.cooleshow.admin.io.request.teacher.TeacherVO;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
@@ -62,6 +68,8 @@ import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.excel.POIUtil;
 
+import static com.yonge.cooleshow.common.entity.HttpResponseResult.succeed;
+
 @RestController
 @RequestMapping("/teacher")
 @Api(value = "教师表", tags = "教师表")
@@ -79,6 +87,9 @@ public class TeacherController extends BaseController {
     @Autowired
     private VipCardRecordService vipCardRecordService;
 
+    @Autowired
+    private UserBindingTeacherService userBindingTeacherService;
+
     /**
      * 查询单条
      */
@@ -255,6 +266,33 @@ public class TeacherController extends BaseController {
         return succeed();
     }
 
+
+    @ApiOperation(value = "老师琴房课绑定学员列表")
+    @PostMapping("/bindingUserList")
+    // @PreAuthorize("@pcs.hasPermissions('teacher/bindingUserList')")
+    public HttpResponseResult<PageInfo<TeacherBindingUserVo.BindingUserList>> bindingUserList(@RequestBody TeacherBindingUserVo.BindingUserQuery query) {
+        IPage<UserBindingTeacherWrapper> wrapperIPage = userBindingTeacherService.selectBindingUserPage(PageUtil.getPage(query),
+                                                        TeacherBindingUserQueryInfo.BindingUserQuery.from(query.jsonString()));
+        // 数据转换
+        List<TeacherBindingUserVo.BindingUserList> pageInfos = JSON.parseArray(JSON.toJSONString(wrapperIPage.getRecords()),
+                                                                               TeacherBindingUserVo.BindingUserList.class);
+
+        return succeed(PageUtil.getPageInfo(wrapperIPage,pageInfos));
+    }
+
+
+    @ApiOperation(value = "查看课表")
+    @PostMapping("/selectBindingUserCourse")
+    // @PreAuthorize("@pcs.hasPermissions('teacher/selectBindingUserCourse')")
+    public HttpResponseResult<PageInfo<TeacherBindingUserVo.BindingStudentCourseList>> selectBindingUserCourse(@RequestBody TeacherBindingUserVo.BindingStudentCourseQuery query) {
+        IPage<UserBindingCourseWrapper> wrapperIPage = userBindingTeacherService.selectBindingUserCoursePage(PageUtil.getPage(query),
+                                                                                                             TeacherBindingUserQueryInfo.BindingStudentCourseQuery.from(query.jsonString()));
+        // 数据转换
+        List<TeacherBindingUserVo.BindingStudentCourseList> pageInfos = JSON.parseArray(JSON.toJSONString(wrapperIPage.getRecords()),
+                                                                                        TeacherBindingUserVo.BindingStudentCourseList.class);
+
+        return succeed(PageUtil.getPageInfo(wrapperIPage, pageInfos));
+    }
     /**
      * 查询老师统计指标
      * @param userId 老师ID

+ 326 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/TeacherBindingUserVo.java

@@ -0,0 +1,326 @@
+package com.yonge.cooleshow.admin.io.request;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class TeacherBindingUserVo {
+
+    @ApiModel("BindingUserQuery-老师绑定的学生列表查询")
+    public static class BindingUserQuery extends QueryInfo {
+
+        @ApiModelProperty("老师id")
+        @NotNull(message = "老师id不能为空")
+        private Long teacherId;
+
+        @ApiModelProperty("查询条件 昵称、编号、手机号")
+        private String search;
+
+        @ApiModelProperty("绑定开始时间")
+        private Date startTime;
+
+        @ApiModelProperty("绑定结束时间")
+        private Date endTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        @Override
+        public String getSearch() {
+            return search;
+        }
+
+        @Override
+        public void setSearch(String search) {
+            this.search = search;
+        }
+
+        public Date getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(Date startTime) {
+            this.startTime = startTime;
+        }
+
+        public Date getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(Date endTime) {
+            this.endTime = endTime;
+        }
+    }
+
+
+    @ApiModel("BindingUserList-老师绑定的学生列表")
+    public static class BindingUserList  {
+
+        @ApiModelProperty("学生编号")
+        private Long userId;
+
+        @ApiModelProperty("昵称")
+        private String username;
+
+
+        @ApiModelProperty(value = "性别0女1男")
+        private Integer gender;
+
+        @ApiModelProperty(value = "年龄")
+        private Integer age;
+
+
+        // 声部
+        @ApiModelProperty(value = "声部")
+        private String subjectName;
+
+        @ApiModelProperty(value = "手机号")
+        private String phone;
+
+        @ApiModelProperty(value = "是否会员 0否 1是")
+        private YesOrNoEnum isVip;
+
+
+        @ApiModelProperty("课程数")
+        private Long courseNum;
+
+        @ApiModelProperty("已结束课时数")
+        private Integer endCourseNum;
+
+        @ApiModelProperty("未开始课程数")
+        private Integer noStartCourseNum;
+
+        @ApiModelProperty("绑定时间")
+        private Date bindingTime;
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+
+        public Long getUserId() {
+            return userId;
+        }
+
+        public void setUserId(Long userId) {
+            this.userId = userId;
+        }
+
+        public String getUsername() {
+            return username;
+        }
+
+        public void setUsername(String username) {
+            this.username = username;
+        }
+
+        public Integer getGender() {
+            return gender;
+        }
+
+        public void setGender(Integer gender) {
+            this.gender = gender;
+        }
+
+        public Integer getAge() {
+            return age;
+        }
+
+        public void setAge(Integer age) {
+            this.age = age;
+        }
+
+        public String getPhone() {
+            return phone;
+        }
+
+        public void setPhone(String phone) {
+            this.phone = phone;
+        }
+
+        public YesOrNoEnum getIsVip() {
+            return isVip;
+        }
+
+        public void setIsVip(YesOrNoEnum isVip) {
+            this.isVip = isVip;
+        }
+
+        public Long getCourseNum() {
+            return courseNum;
+        }
+
+        public void setCourseNum(Long courseNum) {
+            this.courseNum = courseNum;
+        }
+
+        public Integer getEndCourseNum() {
+            return endCourseNum;
+        }
+
+        public void setEndCourseNum(Integer endCourseNum) {
+            this.endCourseNum = endCourseNum;
+        }
+
+        public Integer getNoStartCourseNum() {
+            return noStartCourseNum;
+        }
+
+        public void setNoStartCourseNum(Integer noStartCourseNum) {
+            this.noStartCourseNum = noStartCourseNum;
+        }
+
+        public Date getBindingTime() {
+            return bindingTime;
+        }
+
+        public void setBindingTime(Date bindingTime) {
+            this.bindingTime = bindingTime;
+        }
+    }
+
+    @ApiModel("BindingStudentCourseQuery-绑定学生课程列表查询")
+    public static class BindingStudentCourseQuery extends QueryInfo{
+
+        @ApiModelProperty("老师id")
+        @NotNull(message = "老师id不能为空")
+        private Long teacherId;
+
+        @NotNull(message = "学员id不能为空")
+        @ApiModelProperty("学员id")
+        private Long studentId;
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        public Long getStudentId() {
+            return studentId;
+        }
+
+        public void setStudentId(Long studentId) {
+            this.studentId = studentId;
+        }
+    }
+
+
+
+    @ApiModel("BindingStudentCourseList-绑定学生课程列表")
+    public static class BindingStudentCourseList{
+
+        @ApiModelProperty("课程编号")
+        private Long courseId;
+
+        @ApiModelProperty("课程声部")
+        private String subjectName;
+
+        @ApiModelProperty("学员考勤 TRUANT:旷课 ATTENDCLASS:到课 NOTSTART:未开始")
+        private String status;
+
+        @ApiModelProperty(value = "课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消  CourseScheduleEnum")
+        private String courseStatus;
+
+        @ApiModelProperty("上课时间")
+        private Date classDate;
+
+        // 课程开始时间
+        @ApiModelProperty("课程开始时间")
+        private Date startTime;
+
+        //课程结束时间
+        @ApiModelProperty("课程结束时间")
+        private Date endTime;
+
+        public Date getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(Date startTime) {
+            this.startTime = startTime;
+        }
+
+        public Date getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(Date endTime) {
+            this.endTime = endTime;
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+        public Long getCourseId() {
+            return courseId;
+        }
+
+        public void setCourseId(Long courseId) {
+            this.courseId = courseId;
+        }
+
+        public String getSubjectName() {
+            return subjectName;
+        }
+
+        public void setSubjectName(String subjectName) {
+            this.subjectName = subjectName;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+
+        public String getCourseStatus() {
+            return courseStatus;
+        }
+
+        public void setCourseStatus(String courseStatus) {
+            this.courseStatus = courseStatus;
+        }
+
+        public Date getClassDate() {
+            return classDate;
+        }
+
+        public void setClassDate(Date classDate) {
+            this.classDate = classDate;
+        }
+    }
+}

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/CourseScheduleDao.java

@@ -10,7 +10,10 @@ import com.yonge.cooleshow.biz.dal.dto.search.HomeworkSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.MyCourseSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.PracticeTeacherSearch;
 import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import org.apache.ibatis.annotations.Param;
 
@@ -235,4 +238,16 @@ public interface CourseScheduleDao extends BaseMapper<CourseSchedule> {
 
     //查询待结算课程
     List<UserAccountRecordDto> selectWaitCourse(String day);
+
+    /**
+     * 查询课程数
+     */
+    List<UserBindingTeacherWrapper.CourseNum> selectStudentPianoCourse(@Param("teacherId") Long teacherId, @Param(
+            "studentIdList") List<Long> studentIdList);
+
+    /**
+     * 查询琴房课
+     */
+    IPage<UserBindingCourseWrapper> selectBindingUserCoursePage(@Param(
+            "page") IPage<UserBindingCourseWrapper> page, @Param("query") TeacherBindingUserQueryInfo.BindingStudentCourseQuery query);
 }

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/UserBindingTeacherDao.java

@@ -4,8 +4,10 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
 import com.yonge.cooleshow.biz.dal.vo.CourseStudentVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 import io.swagger.models.auth.In;
 import org.apache.ibatis.annotations.Param;
 
@@ -25,4 +27,14 @@ public interface UserBindingTeacherDao extends BaseMapper<UserBindingTeacher> {
 
     //查询超过days天数没有排课的绑定学院
     List<UserBindingTeacher> queryUnbindList(@Param("days") Integer days);
+
+    /**
+     * 查询绑定的学员信息
+     *
+     * @param page
+     * @param query
+     * @return
+     */
+    IPage<UserBindingTeacherWrapper> selectBindingUserPage(@Param("page") IPage<UserBindingTeacherWrapper> page,
+                                                           @Param("query") TeacherBindingUserQueryInfo.BindingUserQuery query);
 }

+ 29 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/CourseScheduleMapper.java

@@ -0,0 +1,29 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.CourseSchedule;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户表 Mapper 接口
+ * </p>
+ *
+ * @author Eric
+ * @since 2022-09-02
+ */
+@Repository
+public interface CourseScheduleMapper extends BaseMapper<CourseSchedule> {
+
+
+    /**
+     * 查询课程数
+     */
+    List<UserBindingTeacherWrapper.CourseNum> selectStudentPianoCourse(@Param("teacherId") Long teacherId, @Param(
+            "studentIdList") List<Long> studentIdList);
+}

+ 19 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/StudentMapper.java

@@ -0,0 +1,19 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.vo.CouponIssueUserVo;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+
+@Repository
+public interface StudentMapper extends BaseMapper<Student> {
+
+
+}

+ 13 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/SubjectMapper.java

@@ -0,0 +1,13 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import org.springframework.stereotype.Repository;
+
+
+@Repository
+public interface SubjectMapper extends BaseMapper<Subject> {
+
+
+}

+ 102 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/TeacherBindingUserQueryInfo.java

@@ -0,0 +1,102 @@
+package com.yonge.cooleshow.biz.dal.queryInfo;
+
+import com.alibaba.fastjson.JSON;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class TeacherBindingUserQueryInfo {
+
+    // 老师绑定的学生列表查询
+    public static class BindingUserQuery{
+
+        // 老师id
+        private Long teacherId;
+
+        // 查询条件 昵称、编号、手机号
+        private String search;
+
+        // 绑定开始时间
+        private Date startTime;
+
+        // 绑定结束时间
+        private Date endTime;
+
+
+        public static BindingUserQuery from(String recv) {
+
+            return JSON.parseObject(recv, BindingUserQuery.class);
+        }
+
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        public String getSearch() {
+            return search;
+        }
+
+        public void setSearch(String search) {
+            this.search = search;
+        }
+
+        public Date getStartTime() {
+            return startTime;
+        }
+
+        public void setStartTime(Date startTime) {
+            this.startTime = startTime;
+        }
+
+        public Date getEndTime() {
+            return endTime;
+        }
+
+        public void setEndTime(Date endTime) {
+            this.endTime = endTime;
+        }
+    }
+    // 绑定学生课程列表查询
+    public static class BindingStudentCourseQuery{
+
+        // 老师id
+        private Long teacherId;
+
+        // 学员id
+        private Long studentId;
+
+
+        public static BindingStudentCourseQuery from(String recv) {
+
+            return JSON.parseObject(recv, BindingStudentCourseQuery.class);
+        }
+
+        public Long getTeacherId() {
+            return teacherId;
+        }
+
+        public void setTeacherId(Long teacherId) {
+            this.teacherId = teacherId;
+        }
+
+        public Long getStudentId() {
+            return studentId;
+        }
+
+        public void setStudentId(Long studentId) {
+            this.studentId = studentId;
+        }
+    }
+
+
+
+}

+ 18 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserBindingTeacherService.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.biz.dal.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 
 /**
  * @Author: cy
@@ -12,5 +16,19 @@ public interface UserBindingTeacherService extends IService<UserBindingTeacher>
      * 超过天数无琴房课的解除绑定关系
      */
     void unbindTask();
+
+    /**
+     * 查询老师绑定学生数据
+     *
+     * @param page
+     * @param query
+     * @return
+     */
+    IPage<UserBindingTeacherWrapper> selectBindingUserPage(IPage<UserBindingTeacherWrapper> page, TeacherBindingUserQueryInfo.BindingUserQuery query);
+
+    /**
+     * 查询老师绑定的学生课程信息
+     */
+    IPage<UserBindingCourseWrapper> selectBindingUserCoursePage(IPage<UserBindingCourseWrapper> page, TeacherBindingUserQueryInfo.BindingStudentCourseQuery query);
 }
 

+ 139 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserBindingTeacherServiceImpl.java

@@ -1,18 +1,43 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.biz.dal.dao.CourseScheduleDao;
+import com.yonge.cooleshow.biz.dal.dao.StudentDao;
+import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.enums.CourseScheduleEnum;
+import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
+import com.yonge.cooleshow.biz.dal.mapper.CourseScheduleMapper;
+import com.yonge.cooleshow.biz.dal.mapper.StudentMapper;
+import com.yonge.cooleshow.biz.dal.mapper.SubjectMapper;
+import com.yonge.cooleshow.biz.dal.queryInfo.TeacherBindingUserQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.CourseScheduleService;
+import com.yonge.cooleshow.biz.dal.service.SubjectService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.UserBindingTeacherService;
+import com.yonge.cooleshow.biz.dal.vo.LiveCourseGroupStudentCourseVo;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper;
+import com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.exception.BizException;
+import com.yonge.toolset.base.util.StringUtil;
+import com.yonge.toolset.utils.date.DateUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -20,20 +45,132 @@ import java.util.stream.Collectors;
  * @Date: 2022/5/26
  */
 @Service("userBindingTeacherService")
-public class UserBindingTeacherServiceImpl extends ServiceImpl<UserBindingTeacherDao, UserBindingTeacher> implements UserBindingTeacherService {
+public class UserBindingTeacherServiceImpl extends ServiceImpl<UserBindingTeacherDao, UserBindingTeacher>
+        implements UserBindingTeacherService {
     private final static Logger log = LoggerFactory.getLogger(UserBindingTeacherServiceImpl.class);
 
     @Autowired
     private SysConfigService sysConfigService;
 
+    @Autowired
+    private StudentDao studentDao;
+
+    @Autowired
+    private SubjectDao subjectDao;
+
+    @Autowired
+    private CourseScheduleDao courseScheduleDao;
+
+
     @Override
     public void unbindTask() {
         String days = sysConfigService.findConfigValue(SysConfigConstant.PIANO_ROOM_UNBIND_DAYS);
         int i = Integer.parseInt(days);
         List<UserBindingTeacher> userBindingTeachers = baseMapper.queryUnbindList(i);
-        if(!CollectionUtils.isEmpty(userBindingTeachers)){
+        if (!CollectionUtils.isEmpty(userBindingTeachers)) {
             removeByIds(userBindingTeachers.stream().map(UserBindingTeacher::getId).collect(Collectors.toList()));
         }
     }
+
+    @Override
+    public IPage<UserBindingTeacherWrapper> selectBindingUserPage(IPage<UserBindingTeacherWrapper> page, TeacherBindingUserQueryInfo.BindingUserQuery query) {
+        if (query.getTeacherId() == null) {
+            throw new BizException("老师id不能为空");
+        }
+
+        IPage<UserBindingTeacherWrapper> bindingUserPage = baseMapper.selectBindingUserPage(page, query);
+
+        List<UserBindingTeacherWrapper> records = bindingUserPage.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return bindingUserPage;
+        }
+
+        // 学生id集合
+        List<Long> studentIdList = records.stream()
+                                          .map(UserBindingTeacherWrapper::getUserId)
+                                          .collect(Collectors.toList());
+
+
+        // 生日
+        records.forEach(userBindingTeacherWrapper -> {
+            Integer age = null;
+            if (userBindingTeacherWrapper.getBirthdate() != null) {
+                age = DateUtil.yearsBetween(userBindingTeacherWrapper.getBirthdate(), new Date());
+            }
+            userBindingTeacherWrapper.setAge(age);
+        });
+
+        // vip
+        List<Student> students = studentDao.selectBatchIds(studentIdList);
+
+        Map<Long, YesOrNoEnum> userIdVipMap = students.stream()
+                                                      .collect(Collectors.toMap(Student::getUserId,
+                                           student -> student.getMembershipEndTime() != null && student.getMembershipEndTime()
+                                           .compareTo(new Date()) > 0?YesOrNoEnum.YES:YesOrNoEnum.NO, (o, n) -> n));
+
+        // 声部
+        List<Long> subjectIdList = new ArrayList<>();
+        for (Student student1 : students) {
+            if (!StringUtil.isEmpty(student1.getSubjectId())) {
+                Long aLong = Long.valueOf(student1.getSubjectId());
+                subjectIdList.add(aLong);
+            }
+        }
+        List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIdList);
+        Map<Long, String> userIdSubjectMap = students.stream()
+                      .collect(Collectors.toMap(Student::getUserId,student -> subjectList.stream()
+                                 .filter(subject -> student.getSubjectId().equals(subject.getId().toString())).findFirst().get().getName(), (o, n) -> n));
+
+        // 课程数
+        List<UserBindingTeacherWrapper.CourseNum> courseNumList = courseScheduleDao.selectStudentPianoCourse(query.getTeacherId(),studentIdList);
+        Map<Long, List<UserBindingTeacherWrapper.CourseNum>> userIdCourseStatusMap = courseNumList.stream()
+                                                                                    .collect(Collectors.groupingBy(
+                                                                                            UserBindingTeacherWrapper.CourseNum::getStudentId));
+
+        for (UserBindingTeacherWrapper record : records) {
+            record.setIsVip(userIdVipMap.get(record.getUserId()));
+            record.setSubjectName(userIdSubjectMap.get(record.getUserId()));
+
+            List<UserBindingTeacherWrapper.CourseNum> courseNums = userIdCourseStatusMap.get(record.getUserId());
+            record.setCourseNum(courseNums.size());
+            Integer endCourseNum = 0;
+            Integer noStartCourseNum = 0;
+            for (UserBindingTeacherWrapper.CourseNum courseNum : courseNums) {
+                if (courseNum.getStatus().equals("COMPLETE")) {
+                    endCourseNum ++;
+                } else {
+                    noStartCourseNum ++;
+                }
+            }
+            record.setEndCourseNum(endCourseNum);
+            record.setNoStartCourseNum(noStartCourseNum);
+        }
+        bindingUserPage.setRecords(records);
+        return bindingUserPage;
+    }
+
+    @Override
+    public IPage<UserBindingCourseWrapper> selectBindingUserCoursePage(IPage<UserBindingCourseWrapper> page, TeacherBindingUserQueryInfo.BindingStudentCourseQuery query) {
+        IPage<UserBindingCourseWrapper> userBindingCourseWrapperIPage = courseScheduleDao.selectBindingUserCoursePage(
+                page, query);
+        List<UserBindingCourseWrapper> records = userBindingCourseWrapperIPage.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return  userBindingCourseWrapperIPage;
+        }
+
+        // 设置学生上课状态
+        for (UserBindingCourseWrapper record : records) {
+            if (CourseScheduleEnum.NOT_START.getCode().equals(record.getCourseStatus())) {
+                record.setStatus(StudentCourseEnum.NOTSTART);
+            } else {
+                if (record.getStudentAttendanceId() != null) {
+                    record.setStatus(StudentCourseEnum.ATTENDCLASS);
+                } else {
+                    record.setStatus(StudentCourseEnum.TRUANT);
+                }
+            }
+        }
+        return userBindingCourseWrapperIPage;
+    }
 }
 

+ 125 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingCourseWrapper.java

@@ -0,0 +1,125 @@
+package com.yonge.cooleshow.biz.dal.vo.userBindingTeacher;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.enums.StudentCourseEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class UserBindingCourseWrapper {
+
+    //("课程编号")
+    private Long courseId;
+
+    // 声部id
+    private Long subjectId;
+
+    //("课程声部")
+    private String subjectName;
+
+    //("学员考勤")
+    private StudentCourseEnum status;
+    //(value = "课程状态 NOT_START未开始 ING进行中 COMPLETE已完成 CANCEL已取消  CourseScheduleEnum")
+    private String courseStatus;
+
+    // ("上课时间")
+    private Date classDate;
+    // 课程开始时间
+    private Date startTime;
+
+    //课程结束时间
+    private Date endTime;
+
+    // 学生id
+    private Long studentId;
+
+    // 考勤id
+    private Long studentAttendanceId;
+
+    public Long getStudentAttendanceId() {
+        return studentAttendanceId;
+    }
+
+    public void setStudentAttendanceId(Long studentAttendanceId) {
+        this.studentAttendanceId = studentAttendanceId;
+    }
+
+    public Date getStartTime() {
+        return startTime;
+    }
+
+    public void setStartTime(Date startTime) {
+        this.startTime = startTime;
+    }
+
+    public Date getEndTime() {
+        return endTime;
+    }
+
+    public void setEndTime(Date endTime) {
+        this.endTime = endTime;
+    }
+
+    public Long getSubjectId() {
+        return subjectId;
+    }
+
+    public void setSubjectId(Long subjectId) {
+        this.subjectId = subjectId;
+    }
+
+    public Long getStudentId() {
+        return studentId;
+    }
+
+    public void setStudentId(Long studentId) {
+        this.studentId = studentId;
+    }
+
+    public Long getCourseId() {
+        return courseId;
+    }
+
+    public void setCourseId(Long courseId) {
+        this.courseId = courseId;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public StudentCourseEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(StudentCourseEnum status) {
+        this.status = status;
+    }
+
+    public String getCourseStatus() {
+        return courseStatus;
+    }
+
+    public void setCourseStatus(String courseStatus) {
+        this.courseStatus = courseStatus;
+    }
+
+    public Date getClassDate() {
+        return classDate;
+    }
+
+    public void setClassDate(Date classDate) {
+        this.classDate = classDate;
+    }
+}

+ 179 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/userBindingTeacher/UserBindingTeacherWrapper.java

@@ -0,0 +1,179 @@
+package com.yonge.cooleshow.biz.dal.vo.userBindingTeacher;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * Description
+ *
+ * @author liujunchi
+ * @date 2022-10-08
+ */
+public class UserBindingTeacherWrapper {
+
+    // 学生编号
+    private Long userId;
+
+    // 昵称
+    private String username;
+
+
+    // 性别0女1男
+    private Integer gender;
+
+    // 年龄
+    private Integer age;
+
+    // 生日
+    private Date birthdate;
+
+    // 声部
+    private String subjectName;
+
+    // 手机号
+    private String phone;
+
+    // 是否会员 0否 1是
+    private YesOrNoEnum isVip;
+
+
+    // 课程数
+    private Integer courseNum;
+
+    // 已结束课时数
+    private Integer endCourseNum;
+
+    // 未开始课程数
+    private Integer noStartCourseNum;
+
+    // 绑定时间
+    private Date bindingTime;
+
+    public String jsonString() {
+        return JSON.toJSONString(this);
+    }
+    public Long getUserId() {
+        return userId;
+    }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
+
+    public String getSubjectName() {
+        return subjectName;
+    }
+
+    public void setSubjectName(String subjectName) {
+        this.subjectName = subjectName;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public String getUsername() {
+        return username;
+    }
+
+    public void setUsername(String username) {
+        this.username = username;
+    }
+
+    public Integer getGender() {
+        return gender;
+    }
+
+    public void setGender(Integer gender) {
+        this.gender = gender;
+    }
+
+    public Integer getAge() {
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public YesOrNoEnum getIsVip() {
+        return isVip;
+    }
+
+    public void setIsVip(YesOrNoEnum isVip) {
+        this.isVip = isVip;
+    }
+
+    public Integer getCourseNum() {
+        return courseNum;
+    }
+
+    public void setCourseNum(Integer courseNum) {
+        this.courseNum = courseNum;
+    }
+
+    public Integer getEndCourseNum() {
+        return endCourseNum;
+    }
+
+    public void setEndCourseNum(Integer endCourseNum) {
+        this.endCourseNum = endCourseNum;
+    }
+
+    public Integer getNoStartCourseNum() {
+        return noStartCourseNum;
+    }
+
+    public void setNoStartCourseNum(Integer noStartCourseNum) {
+        this.noStartCourseNum = noStartCourseNum;
+    }
+
+    public Date getBindingTime() {
+        return bindingTime;
+    }
+
+    public void setBindingTime(Date bindingTime) {
+        this.bindingTime = bindingTime;
+    }
+
+    public static class CourseNum {
+
+        // 学生id
+        private Long studentId;
+
+        // 课程数
+        private String status;
+
+
+        public Long getStudentId() {
+            return studentId;
+        }
+
+        public void setStudentId(Long studentId) {
+            this.studentId = studentId;
+        }
+
+        public String getStatus() {
+            return status;
+        }
+
+        public void setStatus(String status) {
+            this.status = status;
+        }
+    }
+}

+ 43 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/CourseScheduleMapper.xml

@@ -946,4 +946,47 @@
         AND ts.status_ = 'WAIT'
         <![CDATA[ AND DATE_FORMAT(ts.update_time_,'%Y-%m-%d') <= #{day}]]>
     </select>
+
+    <select id="selectStudentPianoCourse"
+            resultType="com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper$CourseNum">
+        select cssp.user_id_ as studentId
+            ,cs.status_ as status
+        from course_schedule_student_payment cssp
+        left join course_group cg on cg.id_ = cssp.course_group_id_
+        left join course_schedule cs on cs.id_ = cssp.course_id_
+        <where>
+            cssp.course_type_ = 'PIANO_ROOM_CLASS'
+            and #{teacherId} = cg.teacher_id_
+            and cs.status_ in ('NOT_START','ING','COMPLETE')
+            and cssp.user_id_ in
+            <foreach collection="studentIdList" close=")" open="(" item="item" separator=",">
+                #{item}
+            </foreach>
+        </where>
+    </select>
+
+    <select id="selectBindingUserCoursePage"
+            resultType="com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingCourseWrapper">
+        select distinct cssp.user_id_ as studentId
+        ,cs.status_ as courseStatus
+        ,cs.id_ as courseId
+        ,cg.subject_id_ as subjectId
+        ,cs.class_date_ as classDate
+        ,cs.start_time_ as startTime
+        ,cs.end_time_ as endTime
+        ,sa.id_ as studentAttendanceId
+        ,s.name_ as subjectName
+        from course_schedule_student_payment cssp
+        left join course_group cg on cg.id_ = cssp.course_group_id_
+        left join course_schedule cs on cs.id_ = cssp.course_id_
+        left join student_attendance sa on cssp.course_id_ = sa.course_schedule_id_
+        left join subject s on s.id_ = cg.subject_id_
+        <where>
+            cssp.course_type_ = 'PIANO_ROOM_CLASS'
+            and #{query.teacherId} = cg.teacher_id_
+            and cs.status_ in ('NOT_START','ING','COMPLETE')
+            and cssp.user_id_ =#{query.studentId}
+
+        </where>
+    </select>
 </mapper>

+ 31 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserBindingTeacherMapper.xml

@@ -98,4 +98,35 @@
         ) v on t.teacher_id_ = v.teacher_id_ and t.student_id_ = v.user_id_
         where v.user_id_ is null and t.created_time_ &lt;= DATE_SUB(NOW(),INTERVAL #{days} DAY)
     </select>
+
+    <select id="selectBindingUserPage"
+            resultType="com.yonge.cooleshow.biz.dal.vo.userBindingTeacher.UserBindingTeacherWrapper">
+        select
+            su.id_ as userId,
+            su.username_ as username,
+            su.gender_ as gender,
+            su.birthdate_ as birthdate,
+            su.phone_ as phone,
+            ubt.created_time_ as bindingTime
+        from user_binding_teacher ubt
+        left join sys_user su on su.id_ = ubt.student_id_
+        <where>
+            <if test="query.teacherId != null">
+                and #{query.teacherId} = ubt.teacher_id_
+            </if>
+            <if test="query.search != null and query.search != ''">
+                and ( su.id_ like ('%${query.search}%')
+                    or su.username_ like  ('%${query.search}%')
+                    or su.phone_  like  ('%${query.search}%')
+                )
+            </if>
+            <if test="query.startTime != null">
+                and ubt.created_time_ &gt;= #{query.startTime}
+            </if>
+            <if test="query.endTime != null">
+                and ubt.created_time_ &lt;= #{query.endTime}
+            </if>
+        </where>
+        order by ubt.id_ desc
+    </select>
 </mapper>