Jelajahi Sumber

Merge branch 'dev_v1.3.5_20220929'

Eric 3 tahun lalu
induk
melakukan
b1a7d543aa

+ 45 - 1
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java

@@ -1,5 +1,9 @@
 package com.yonge.cooleshow.admin.controller;
 
+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;
+import com.yonge.toolset.base.page.QueryInfo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -9,6 +13,8 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 import javax.servlet.http.HttpServletResponse;
@@ -17,6 +23,7 @@ import javax.validation.Valid;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.util.CollectionUtils;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -81,7 +88,9 @@ public class TeacherController extends BaseController {
     })
     @PreAuthorize("@pcs.hasPermissions('teacher/detail')")
     public HttpResponseResult<TeacherVo> detail(@PathVariable("id") Long userId) {
-        TeacherVo detail = teacherService.detail(userId);
+        //TeacherVo detail = teacherService.detail(userId);
+
+        TeacherVo detail = teacherService.findTeacherDetailInfo(userId);
         if (null != detail && !CollectionUtils.isEmpty(detail.getStyleVideo())) {
             List<TeacherStyleVideo> styleVideo = detail.getStyleVideo();
             List<TeacherStyleVideo> collect = styleVideo.stream().filter(o -> AuthStatusEnum.PASS.equals(o.getAuthStatus())).collect(Collectors.toList());
@@ -244,4 +253,39 @@ public class TeacherController extends BaseController {
         teacherService.updateStyleVideo(teacherDto.getUserId(), teacherDto.getStyleVideo(), teacherDto.getMessage());
         return succeed();
     }
+
+    /**
+     * 查询老师统计指标
+     * @param userId 老师ID
+     * @return HttpResponseResult<TeacherVO.TeacherStat>
+     */
+    @ApiOperation(value = "详情", notes = "传入id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "id", paramType = "path", dataType = "long", required = true),
+    })
+    @GetMapping("/stat/{id}")
+    public HttpResponseResult<TeacherVO.TeacherStat> teacherStatInfo(@PathVariable("id") Long userId) {
+
+        // 老师统计指标
+        TeacherWrapper.TeacherStatInfo statInfo = teacherService.findTeacherStatInfoById(userId);
+
+        return succeed(TeacherVO.TeacherStat.from(statInfo.jsonString()));
+    }
+
+    /**
+     * 老师粉丝信息查询
+     * @param query TeacherVO.TeacherFansQuery
+     * @return HttpResponseResult<PageInfo<MyFens>>
+     */
+    @ApiOperation(value = "我的粉丝")
+    @PostMapping(value = "/myFans")
+    public HttpResponseResult<PageInfo<MyFens>> queryMyFans(@RequestBody TeacherVO.TeacherFansQuery query) {
+
+        if (Optional.ofNullable(query.getTeacherId()).orElse(0L) <= 0) {
+            return failed("无效的请求参数");
+        }
+
+        IPage<MyFens> pages = teacherService.queryMyFans(PageUtil.getPage(query), query.getTeacherId());
+        return succeed(PageUtil.pageInfo(pages));
+    }
 }

+ 58 - 0
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/io/request/teacher/TeacherVO.java

@@ -0,0 +1,58 @@
+package com.yonge.cooleshow.admin.io.request.teacher;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 老师端统计信息
+ * Created by Eric.Shang on 2022/10/8.
+ */
+public class TeacherVO {
+
+    /**
+     * 老师统计指标信息
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TeacherStat implements Serializable {
+
+        @ApiModelProperty("星级")
+        private Integer starGrade;
+        @ApiModelProperty("粉丝数")
+        private Integer fansNum;
+        @ApiModelProperty("已上课时")
+        private Integer expTime;
+        @ApiModelProperty("未上课时")
+        private Integer unExpTime;
+        @ApiModelProperty("专辑数 ")
+        private Integer musicAlbumNum;
+        @ApiModelProperty("曲谱数 ")
+        private Integer musicSheetNum;
+        @ApiModelProperty("学生数")
+        private Integer studentNums;
+
+        public static TeacherStat from(String recv) {
+
+            return JSON.parseObject(recv, TeacherStat.class);
+        }
+    }
+
+    /**
+     * 老师粉丝数
+     */
+    @Data
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TeacherFansQuery extends QueryInfo {
+
+        @ApiModelProperty("老师ID")
+        private Long teacherId;
+    }
+}

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/TeacherDao.java

@@ -13,6 +13,7 @@ import com.yonge.cooleshow.biz.dal.vo.HotTeacherVo;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import org.apache.ibatis.annotations.Param;
 
 public interface TeacherDao extends BaseMapper<Teacher> {
@@ -98,4 +99,11 @@ public interface TeacherDao extends BaseMapper<Teacher> {
      * @return
      */
     List<HotTeacherVo> queryHotTeacherList(Long subjectId);
+
+    /**
+     * 老师学生人数统计
+     * @param teacherIds 老师ID
+     * @return List<StatGroupWrapper>
+     */
+    List<StatGroupWrapper> selectTeacherStudentNumberStatInfo(@Param("teacherIds") List<Long> teacherIds);
 }

+ 15 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java

@@ -10,6 +10,7 @@ import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.vo.*;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 
 import java.util.List;
@@ -151,4 +152,18 @@ public interface TeacherService extends IService<Teacher> {
      * @return
      */
     List<HotTeacherVo> queryHotTeacherList(Long userId);
+
+    /**
+     * 老师详情信息
+     * @param teacherId 用户ID
+     * @return TeacherVo
+     */
+    TeacherVo findTeacherDetailInfo(Long teacherId);
+
+    /**
+     * 老师统计指标信息
+     * @param userId 用户ID
+     * @return TeacherWrapper.TeacherStatInfo
+     */
+    TeacherWrapper.TeacherStatInfo findTeacherStatInfoById(Long userId);
 }

+ 102 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java

@@ -7,11 +7,15 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
+import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -205,6 +209,13 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         teacherHomeVo.setMusicAlbumNum(null == total.getMusicAlbumNum() ? 0 : total.getMusicAlbumNum());
         teacherHomeVo.setMusicSheetNum(null == total.getMusicSheetNum() ? 0 : total.getMusicSheetNum());
 
+        // 老师学生人数统计
+        List<Long> teacherIds = Lists.newArrayList(userId);
+        Map<Long, Integer> studentNumsMap = getBaseMapper().selectTeacherStudentNumberStatInfo(teacherIds).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        teacherHomeVo.setStudentNums(studentNumsMap.getOrDefault(userId, 0));
+
         //取直播缓存
         RMap<Long, String> liveMap = redissonClient.getMap(TEACHER_TEMP_LIVE_ROOM);
         String roomUid = liveMap.get(userId);
@@ -651,7 +662,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 		return hotTeacherList;
 	}
 
-	private void setTagTime(TeacherTagEnum teacherTagEnum, TeacherVo teacherVo) {
+    private void setTagTime(TeacherTagEnum teacherTagEnum, TeacherVo teacherVo) {
         if (teacherTagEnum.equals(TeacherTagEnum.LIVE)) {
             teacherVo.setLiveDate(new Date());
         } else if (teacherTagEnum.equals(TeacherTagEnum.MUSIC)) {
@@ -663,4 +674,94 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         }
     }
 
+
+    /**
+     * 老师详情信息
+     *
+     * @param teacherId 用户ID
+     * @return TeacherVo
+     */
+    @Override
+    public TeacherVo findTeacherDetailInfo(Long teacherId) {
+
+        // 用户详情基本信息
+        TeacherVo teacherInfo = detail(teacherId);
+
+        if (Objects.nonNull(teacherInfo)) {
+
+            // 设置默认数据
+            teacherInfo
+                    .starGrade(0)
+                    .fansNum(0)
+                    .expTime(0)
+                    .unExpTime(0)
+                    .musicSheetNum(0)
+                    .musicAlbumNum(0)
+                    .studentNums(0);
+
+            // 老师相关统计信息
+            TeacherTotal total = totalService.getTotalById(teacherId);
+
+            if (Objects.nonNull(total)) {
+
+                teacherInfo
+                        .starGrade(total.getStarGrade().intValue())
+                        .fansNum(total.getFansNum())
+                        .expTime(total.getExpTime())
+                        .unExpTime(total.getUnExpTime())
+                        .musicAlbumNum(total.getMusicAlbumNum())
+                        .musicSheetNum(total.getMusicSheetNum());
+            }
+
+            // 老师学生人数统计
+            Map<Long, Integer> studentNumsMap = getBaseMapper().selectTeacherStudentNumberStatInfo(Lists.newArrayList(teacherId)).stream()
+                    .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+            teacherInfo.setStudentNums(studentNumsMap.getOrDefault(teacherId, 0));
+        }
+
+        return teacherInfo;
+    }
+
+    /**
+     * 老师统计指标信息
+     *
+     * @param userId 用户ID
+     * @return TeacherWrapper.TeacherStatInfo
+     */
+    @Override
+    public TeacherWrapper.TeacherStatInfo findTeacherStatInfoById(Long userId) {
+
+        TeacherWrapper.TeacherStatInfo wrapper = TeacherWrapper.TeacherStatInfo.builder()
+                .fansNum(0)
+                .studentNums(0)
+                .starGrade(0)
+                .expTime(0)
+                .unExpTime(0)
+                .musicAlbumNum(0)
+                .musicSheetNum(0)
+                .build();
+
+        // 查询老师统计指标
+        TeacherTotal total = totalService.getTotalById(userId);
+        if (Objects.nonNull(total)) {
+
+            wrapper.starGrade(total.getStarGrade().intValue())
+                    .fansNum(total.getFansNum())
+                    .expTime(total.getExpTime())
+                    .unExpTime(total.getUnExpTime())
+                    .musicAlbumNum(total.getMusicAlbumNum())
+                    .musicSheetNum(total.getMusicSheetNum());
+        }
+
+        // 老师学生端人数统计
+        List<Long> teacherIds = Lists.newArrayList(userId);
+        Map<Long, Integer> studentNumsMap = getBaseMapper().selectTeacherStudentNumberStatInfo(teacherIds).stream()
+                .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+
+        wrapper.setStudentNums(studentNumsMap.getOrDefault(userId, 0));
+
+        return wrapper;
+    }
+
 }

+ 63 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/MyFens.java

@@ -1,16 +1,25 @@
 package com.yonge.cooleshow.biz.dal.vo;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.yonge.cooleshow.biz.dal.enums.GenderEnum;
+import com.yonge.cooleshow.biz.dal.enums.MK;
 import com.yonge.cooleshow.common.entity.BaseEntity;
 import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModelProperty;
+import org.joda.time.DateTime;
+import org.joda.time.Period;
+import org.joda.time.PeriodType;
+
+import java.util.Date;
+import java.util.Objects;
 
 /**
  * @Author: cy
  * @Date: 2022/5/12
  */
 public class MyFens extends BaseEntity {
-    @ApiModelProperty("昵称")
+
+    @ApiModelProperty("用户编号")
     private String userId;
     @ApiModelProperty("昵称")
     private String userName;
@@ -25,6 +34,19 @@ public class MyFens extends BaseEntity {
     @ApiModelProperty(value = "是否会员 0否 1是")
     private YesOrNoEnum isVip;
 
+    @ApiModelProperty("手机号")
+    private String phone;
+
+    @ApiModelProperty("关注时间")
+    @JsonFormat(pattern = MK.TIME_PATTERN, timezone = MK.TIME_ZONE)
+    private Date starTime;
+
+    @ApiModelProperty("出生日期")
+    private Date birthdate;
+
+    @ApiModelProperty("出生日期")
+    private Integer age;
+
     public String getSubjectName() {
         return subjectName;
     }
@@ -84,4 +106,44 @@ public class MyFens extends BaseEntity {
     public void setIsVip(YesOrNoEnum isVip) {
         this.isVip = isVip;
     }
+
+    public String getPhone() {
+        return phone;
+    }
+
+    public void setPhone(String phone) {
+        this.phone = phone;
+    }
+
+    public Date getStarTime() {
+        return starTime;
+    }
+
+    public void setStarTime(Date starTime) {
+        this.starTime = starTime;
+    }
+
+    public void setGender(GenderEnum gender) {
+        this.gender = gender;
+    }
+
+    public Date getBirthdate() {
+        return birthdate;
+    }
+
+    public void setBirthdate(Date birthdate) {
+        this.birthdate = birthdate;
+    }
+
+    public Integer getAge() {
+        if (Objects.nonNull(getBirthdate())) {
+
+            return new Period(new DateTime(getBirthdate()), DateTime.now(), PeriodType.years()).getYears();
+        }
+        return age;
+    }
+
+    public void setAge(Integer age) {
+        this.age = age;
+    }
 }

+ 11 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherHomeVo.java

@@ -40,6 +40,9 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     @ApiModelProperty("曲谱数 ")
     private Integer musicSheetNum;
 
+    @ApiModelProperty("学生数")
+    private Integer studentNums;
+
     @ApiModelProperty(value = "声部名称(支持多个,用逗号分隔) ")
     private String subjectName;
     @ApiModelProperty(value = "性别 0女 1男")
@@ -295,4 +298,12 @@ public class TeacherHomeVo extends Teacher implements Serializable {
     public void setMusicSheetNum(Integer musicSheetNum) {
         this.musicSheetNum = musicSheetNum;
     }
+
+    public Integer getStudentNums() {
+        return studentNums;
+    }
+
+    public void setStudentNums(Integer studentNums) {
+        this.studentNums = studentNums;
+    }
 }

+ 107 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/TeacherVo.java

@@ -68,6 +68,21 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty(value = "用户状态 NORMAL-正常   LOCKED-冻结  CLOSED-关闭")
     private UserStatusEnum userStatus;
 
+    @ApiModelProperty("星级")
+    private Integer starGrade;
+    @ApiModelProperty("粉丝数")
+    private Integer fansNum;
+    @ApiModelProperty("已上课时")
+    private Integer expTime;
+    @ApiModelProperty("未上课时")
+    private Integer unExpTime;
+    @ApiModelProperty("专辑数 ")
+    private Integer musicAlbumNum;
+    @ApiModelProperty("曲谱数 ")
+    private Integer musicSheetNum;
+    @ApiModelProperty("学生数")
+    private Integer studentNums;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }
@@ -237,4 +252,96 @@ public class TeacherVo extends Teacher {
 	public void setUserStatus(UserStatusEnum userStatus) {
 		this.userStatus = userStatus;
 	}
+
+    public Integer getStarGrade() {
+        return starGrade;
+    }
+
+    public void setStarGrade(Integer starGrade) {
+        this.starGrade = starGrade;
+    }
+
+    public Integer getFansNum() {
+        return fansNum;
+    }
+
+    public void setFansNum(Integer fansNum) {
+        this.fansNum = fansNum;
+    }
+
+    public Integer getExpTime() {
+        return expTime;
+    }
+
+    public void setExpTime(Integer expTime) {
+        this.expTime = expTime;
+    }
+
+    public Integer getUnExpTime() {
+        return unExpTime;
+    }
+
+    public void setUnExpTime(Integer unExpTime) {
+        this.unExpTime = unExpTime;
+    }
+
+    public Integer getMusicAlbumNum() {
+        return musicAlbumNum;
+    }
+
+    public void setMusicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+    }
+
+    public Integer getMusicSheetNum() {
+        return musicSheetNum;
+    }
+
+    public void setMusicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+    }
+
+    public Integer getStudentNums() {
+        return studentNums;
+    }
+
+    public void setStudentNums(Integer studentNums) {
+        this.studentNums = studentNums;
+    }
+
+
+    public TeacherVo starGrade(Integer starGrade) {
+        this.starGrade = starGrade;
+        return this;
+    }
+
+    public TeacherVo fansNum(Integer fansNum) {
+        this.fansNum = fansNum;
+        return this;
+    }
+
+    public TeacherVo expTime(Integer expTime) {
+        this.expTime = expTime;
+        return this;
+    }
+
+    public TeacherVo unExpTime(Integer unExpTime) {
+        this.unExpTime = unExpTime;
+        return this;
+    }
+
+    public TeacherVo musicAlbumNum(Integer musicAlbumNum) {
+        this.musicAlbumNum = musicAlbumNum;
+        return this;
+    }
+
+    public TeacherVo musicSheetNum(Integer musicSheetNum) {
+        this.musicSheetNum = musicSheetNum;
+        return this;
+    }
+
+    public TeacherVo studentNums(Integer studentNums) {
+        this.studentNums = studentNums;
+        return this;
+    }
 }

+ 77 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java

@@ -0,0 +1,77 @@
+package com.yonge.cooleshow.biz.dal.wrapper.teacher;
+
+import com.alibaba.fastjson.JSON;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * Created by Eric.Shang on 2022/10/8.
+ */
+public class TeacherWrapper {
+
+    /**
+     * 老师统计指标信息
+     */
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    public static class TeacherStatInfo implements Serializable {
+
+        // 星级
+        private Integer starGrade;
+        // 粉丝数
+        private Integer fansNum;
+        // 已上课时
+        private Integer expTime;
+        // 未上课时
+        private Integer unExpTime;
+        // 专辑数
+        private Integer musicAlbumNum;
+        // 曲谱数
+        private Integer musicSheetNum;
+        // 学生数
+        private Integer studentNums;
+
+        public String jsonString() {
+
+            return JSON.toJSONString(this);
+        }
+
+
+        public TeacherStatInfo starGrade(Integer starGrade) {
+            this.starGrade = starGrade;
+            return this;
+        }
+
+        public TeacherStatInfo fansNum(Integer fansNum) {
+            this.fansNum = fansNum;
+            return this;
+        }
+
+        public TeacherStatInfo expTime(Integer expTime) {
+            this.expTime = expTime;
+            return this;
+        }
+
+        public TeacherStatInfo unExpTime(Integer unExpTime) {
+            this.unExpTime = unExpTime;
+            return this;
+        }
+
+        public TeacherStatInfo musicAlbumNum(Integer musicAlbumNum) {
+            this.musicAlbumNum = musicAlbumNum;
+            return this;
+        }
+
+        public TeacherStatInfo musicSheetNum(Integer musicSheetNum) {
+            this.musicSheetNum = musicSheetNum;
+            return this;
+        }
+
+    }
+}

+ 17 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -250,10 +250,13 @@
     <select id="queryMyFans" resultType="com.yonge.cooleshow.biz.dal.vo.MyFens">
         SELECT
             s.student_id_ AS userId,
+            s.create_time_ AS starTime,
             u.avatar_ AS avatar,
             u.username_ AS userName,
             u.real_name_ AS realName,
             u.gender_ AS gender,
+            u.phone_ AS phone,
+            u.birthdate_ AS birthdate,
             (SELECT group_concat(name_) FROM `subject` WHERE find_in_set(id_,sr.subject_id_)) AS subjectName,
             if(sr.membership_start_time_ &lt;= now() and sr.membership_end_time_ &gt;= now(),1,0) AS isVip
         FROM student_star s
@@ -271,4 +274,18 @@
 		where t.entry_flag_ = 1 and t.is_test_user_ = 0 and find_in_set(#{subjectId},t.subject_id_)
 		order by tt.fans_num_ desc limit 10
     </select>
+
+    <!--老师学生人数统计-->
+    <select id="selectTeacherStudentNumberStatInfo"
+            resultType="com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper">
+        SELECT t1.teacher_id_ AS id, COUNT(DISTINCT t1.id_) AS total FROM user_binding_teacher t1
+        <where>
+            <if test="teacherIds != null">
+                AND t1.teacher_id_ IN (<foreach collection="teacherIds" separator="," item="item">#{item}</foreach>)
+            </if>
+        </where>
+        GROUP BY t1.teacher_id_
+    </select>
+    <!--老师学生人数统计-->
+
 </mapper>