Przeglądaj źródła

Merge branch 'feature/0721-tenant' of http://git.dayaedu.com/yonge/cooleshow into feature/0721-tenant

liujc 2 lat temu
rodzic
commit
a8ea7b36d8
26 zmienionych plików z 777 dodań i 570 usunięć
  1. 4 203
      cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/SysUser.java
  2. 4 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/entity/BaseEntity.java
  3. 10 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareRecordDao.java
  4. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherSubmitReq.java
  5. 4 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java
  6. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java
  7. 3 209
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareRecord.java
  8. 65 90
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java
  9. 6 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java
  10. 8 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareRecordService.java
  11. 37 33
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java
  12. 117 7
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  13. 26 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysMusicCompareRecordServiceImpl.java
  14. 5 18
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  15. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java
  16. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml
  17. 8 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  18. 56 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml
  19. 8 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  20. 1 1
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysMusicCompareRecordController.java
  21. 1 1
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysMusicCompareRecordController.java
  22. 99 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java
  23. 55 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysMusicCompareRecordController.java
  24. 131 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java
  25. 47 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java
  26. 45 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/StudentVo.java

+ 4 - 203
cooleshow-auth/auth-api/src/main/java/com/yonge/cooleshow/auth/api/entity/SysUser.java

@@ -6,12 +6,14 @@ import java.io.Serializable;
 import java.util.Date;
 import java.util.List;
 
+import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 /**
  * 对应数据库表(sys_user):
  */
+@Data
 public class SysUser implements Serializable{
 
 	/**
@@ -103,137 +105,8 @@ public class SysUser implements Serializable{
 
 	private String certificateType = "IDENTITY";
 
-	public String getCertificateType() {
-		return certificateType;
-	}
-
-	public void setCertificateType(String certificateType) {
-		this.certificateType = certificateType;
-	}
-
-	public String getRealName() {
-		return realName;
-	}
-
-	public void setRealName(String realName) {
-		this.realName = realName;
-	}
-
-	public String getImToken() {
-		return imToken;
-	}
-
-	public void setImToken(String imToken) {
-		this.imToken = imToken;
-	}
-
-	public Long getId() {
-		return id;
-	}
-
-	public void setId(Long id) {
-		this.id = id;
-	}
-
-	public void setUsername(String username) {
-		this.username = username;
-	}
-
-	public String getUsername() {
-		return this.username;
-	}
-
-	public void setPassword(String password) {
-		this.password = password;
-	}
-
-	public String getPassword() {
-		return this.password;
-	}
-
-	public void setSalt(String salt) {
-		this.salt = salt;
-	}
-
-	public String getSalt() {
-		return this.salt;
-	}
-
-	public void setPhone(String phone) {
-		this.phone = phone;
-	}
-
-	public String getPhone() {
-		return this.phone;
-	}
-
-	public void setAvatar(String avatar) {
-		this.avatar = avatar;
-	}
-
-	public String getAvatar() {
-		return this.avatar;
-	}
-
-	public void setCreateTime(java.util.Date createTime) {
-		this.createTime = createTime;
-	}
-
-	public java.util.Date getCreateTime() {
-		return this.createTime;
-	}
-
-	public void setUpdateTime(java.util.Date updateTime) {
-		this.updateTime = updateTime;
-	}
-
-	public java.util.Date getUpdateTime() {
-		return this.updateTime;
-	}
-
-	public Integer getLockFlag() {
-		return lockFlag;
-	}
-
-	public void setLockFlag(Integer lockFlag) {
-		this.lockFlag = lockFlag;
-	}
-
-	public Boolean getSuperAdmin() {
-		return isSuperAdmin;
-	}
-
-	public void setSuperAdmin(Boolean superAdmin) {
-		isSuperAdmin = superAdmin;
-	}
-
-	public Boolean getDelFlag() {
-		return delFlag;
-	}
-
-	public void setDelFlag(Boolean delFlag) {
-		this.delFlag = delFlag;
-	}
-
-	public void setWxOpenid(String wxOpenid) {
-		this.wxOpenid = wxOpenid;
-	}
-
-	public String getWxOpenid() {
-		return this.wxOpenid;
-	}
-
-	public void setQqOpenid(String qqOpenid) {
-		this.qqOpenid = qqOpenid;
-	}
-
-	public String getQqOpenid() {
-		return this.qqOpenid;
-	}
-
-	public String getUserType() {
-		return userType;
-	}
+	@ApiModelProperty(value = "机构编号")
+	private Long tenantId;
 
 	public void setUserType(String userType) {
 		if(StringUtils.isNotEmpty(userType) && userType.startsWith(",")){
@@ -242,78 +115,6 @@ public class SysUser implements Serializable{
 		this.userType = userType;
 	}
 
-	public Integer getGender() {
-		return gender;
-	}
-
-	public void setGender(Integer gender) {
-		this.gender = gender;
-	}
-
-	public String getNation() {
-		return nation;
-	}
-
-	public void setNation(String nation) {
-		this.nation = nation;
-	}
-
-	public Date getBirthdate() {
-		return birthdate;
-	}
-
-	public void setBirthdate(Date birthdate) {
-		this.birthdate = birthdate;
-	}
-
-	public String getEmail() {
-		return email;
-	}
-
-	public void setEmail(String email) {
-		this.email = email;
-	}
-
-	public String getIdCardNo() {
-		return idCardNo;
-	}
-
-	public void setIdCardNo(String idCardNo) {
-		this.idCardNo = idCardNo;
-	}
-
-	public String getWechatId() {
-		return wechatId;
-	}
-
-	public void setWechatId(String wechatId) {
-		this.wechatId = wechatId;
-	}
-
-	public Boolean getIsSuperAdmin() {
-		return isSuperAdmin;
-	}
-
-	public void setIsSuperAdmin(Boolean isSuperAdmin) {
-		this.isSuperAdmin = isSuperAdmin;
-	}
-
-	public List<Long> getRoles() {
-		return roles;
-	}
-
-	public void setRoles(List<Long> roles) {
-		this.roles = roles;
-	}
-
-	public Date getLastUsernameTime() {
-		return lastUsernameTime;
-	}
-
-	public void setLastUsernameTime(Date lastUsernameTime) {
-		this.lastUsernameTime = lastUsernameTime;
-	}
-
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 4 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/entity/BaseEntity.java

@@ -1,7 +1,11 @@
 package com.yonge.cooleshow.common.entity;
 
+import lombok.Data;
+
 import java.io.Serializable;
 
+@Data
 public class BaseEntity implements Serializable {
 
+    private Long tenantId = -1l;
 }

+ 10 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/SysMusicCompareRecordDao.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.dao;
 import java.util.List;
 import java.util.Map;
 
+import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.music.MusicCompareWrapper;
 import org.apache.ibatis.annotations.Param;
@@ -79,4 +80,13 @@ public interface SysMusicCompareRecordDao extends BaseDAO<Long, SysMusicCompareR
 	 * @return List<StatGroupWrapper>
 	 */
 	List<StatGroupWrapper> selectMusicCompareRecordStatInfo(@Param("record") MusicCompareWrapper.RecordQueryInfo queryInfo);
+
+	//小程序学员训练统计列表
+    int countWeChatStudentTrainData(Map<String, Object> params);
+
+	//小程序学员训练统计列表
+	List<SysMusicCompareRecordQueryInfo.WechatCompareRecordPageDto> queryWeChatStudentTrainData(Map<String, Object> params);
+
+	//小程序学员训练统计
+	SysMusicCompareRecordQueryInfo.WechatCompareRecordSumDto wechatCompareRecordSum(@Param("queryInfo") SysMusicCompareRecordQueryInfo.WechatCompareRecordQueryInfo queryInfo);
 }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/req/TeacherSubmitReq.java

@@ -53,6 +53,9 @@ public class TeacherSubmitReq implements Serializable {
     @ApiModelProperty("结算方式")
     private ESettlementFrom settlementFrom;
 
+    @ApiModelProperty("是否解绑")
+    private Boolean bindTenant;
+
     public Long getUserId() {
         return userId;
     }

+ 4 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/StudentSearch.java

@@ -64,11 +64,14 @@ public class StudentSearch extends QueryInfo{
     private Integer hideFlag;
 
     @ApiModelProperty("机构ID")
-    private String tenantId;
+    private Long tenantId;
 
     @ApiModelProperty("机构名称")
     private String tenantName;
 
+    @ApiModelProperty(value = "排序方式",hidden = true)
+    private String orderBy;
+
     public Date getVipStartTime() {
         return vipStartTime;
     }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dto/search/TeacherSearch.java

@@ -68,6 +68,8 @@ public class TeacherSearch extends QueryInfo{
 	@ApiModelProperty("结算方式")
 	private String settlementFrom;
 
+	@ApiModelProperty(value = "排序方式, 默认 create_time_ desc", hidden = true)
+	private String orderBy;
 	public YesOrNoEnum getTrainFlag() {
 		if (YesOrNoEnum.YES == trainFlag) {
 			return trainFlag;

+ 3 - 209
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/SysMusicCompareRecord.java

@@ -5,6 +5,7 @@ import java.time.DayOfWeek;
 import java.time.LocalDate;
 
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 
 import com.yonge.cooleshow.biz.dal.enums.DeviceTypeEnum;
@@ -16,6 +17,7 @@ import com.yonge.toolset.utils.date.DateUtil;
 /**
  * 对应数据库表(sys_music_compare_record):
  */
+@Data
 public class SysMusicCompareRecord extends BaseEntity {
 
 	/**  */
@@ -86,219 +88,11 @@ public class SysMusicCompareRecord extends BaseEntity {
 	@ApiModelProperty("活动项目id")
 	private Long evaluationId;
 
-	public Long getEvaluationId() {
-		return evaluationId;
-	}
-
-	public void setEvaluationId(Long evaluationId) {
-		this.evaluationId = evaluationId;
-	}
-
-	public String getCustomConfiguration() {
-		return customConfiguration;
-	}
-
-	public void setCustomConfiguration(String customConfiguration) {
-		this.customConfiguration = customConfiguration;
-	}
-
-	public Integer getExpire() {
-		return expire;
-	}
-
-	public void setExpire(Integer expire) {
-		this.expire = expire;
-	}
-
-	public SysMusicCompareRecord() {
-	}
-
 	public SysMusicCompareRecord(FeatureType feature) {
 		this.feature = feature;
 	}
 
-	public void setId(Long id){
-		this.id = id;
-	}
-	
-	public Long getId(){
-		return this.id;
-	}
-
-	public String getBehaviorId() {
-		return behaviorId;
-	}
-
-	public void setBehaviorId(String behaviorId) {
-		this.behaviorId = behaviorId;
-	}
-
-	public void setUserId(Long userId){
-		this.userId = userId;
-	}
-	
-	public Long getUserId(){
-		return this.userId;
-	}
-
-	public String getClientId() {
-		return clientId;
-	}
-
-	public void setClientId(String clientId) {
-		this.clientId = clientId;
-	}
-
-	public HeardLevelEnum getHeardLevel() {
-		return heardLevel;
-	}
-
-	public void setHeardLevel(HeardLevelEnum heardLevel) {
-		this.heardLevel = heardLevel;
-	}
-
-	public Long getMusicSheetId() {
-		return musicSheetId;
-	}
-
-	public void setMusicSheetId(Long musicSheetId) {
-		this.musicSheetId = musicSheetId;
-	}
-
-	public String getSysMusicScoreName() {
-		return sysMusicScoreName;
-	}
-
-	public void setSysMusicScoreName(String sysMusicScoreName) {
-		this.sysMusicScoreName = sysMusicScoreName;
-	}
-
-	public void setScoreData(String scoreData){
-		this.scoreData = scoreData;
-	}
-	
-	public String getScoreData(){
-		return this.scoreData;
-	}
-
-	public int getNotesDataIndex() {
-		return notesDataIndex;
-	}
-
-	public void setNotesDataIndex(int notesDataIndex) {
-		this.notesDataIndex = notesDataIndex;
-	}
-
-	public BigDecimal getScore() {
-		return score;
-	}
-
-	public void setScore(BigDecimal score) {
-		this.score = score;
-	}
-
-	public BigDecimal getIntonation() {
-		return intonation;
-	}
-
-	public void setIntonation(BigDecimal intonation) {
-		this.intonation = intonation;
-	}
-
-	public BigDecimal getCadence() {
-		return cadence;
-	}
-
-	public void setCadence(BigDecimal cadence) {
-		this.cadence = cadence;
-	}
-
-	public BigDecimal getIntegrity() {
-		return integrity;
-	}
-
-	public void setIntegrity(BigDecimal integrity) {
-		this.integrity = integrity;
-	}
-
-	public String getRecordFilePath() {
-		return recordFilePath;
-	}
-
-	public void setRecordFilePath(String recordFilePath) {
-		this.recordFilePath = recordFilePath;
-	}
-
-	public String getVideoFilePath() {
-		return videoFilePath;
-	}
-
-	public void setVideoFilePath(String videoFilePath) {
-		this.videoFilePath = videoFilePath;
-	}
-
-	public DeviceTypeEnum getDeviceType() {
-		return deviceType;
-	}
-
-	public void setDeviceType(DeviceTypeEnum deviceType) {
-		this.deviceType = deviceType;
-	}
-
-	public float getSourceTime() {
-		return sourceTime;
-	}
-
-	public void setSourceTime(float sourceTime) {
-		this.sourceTime = sourceTime;
-	}
-
-	public float getPlayTime() {
-		return playTime;
-	}
-
-	public void setPlayTime(float playTime) {
-		this.playTime = playTime;
-	}
-
-	public int getSpeed() {
-		return speed;
-	}
-
-	public void setSpeed(int speed) {
-		this.speed = speed;
-	}
-
-	public String getMonday() {
-		return monday;
-	}
-
-	public void setMonday(String monday) {
-		this.monday = monday;
-	}
-
-	public FeatureType getFeature() {
-		return feature;
-	}
-
-	public void setFeature(FeatureType feature) {
-		this.feature = feature;
-	}
-
-	public void setCreateTime(java.util.Date createTime){
-		this.createTime = createTime;
-	}
-	
-	public java.util.Date getCreateTime(){
-		return this.createTime;
-	}
-			
-	public String getPartIndex() {
-		return partIndex;
-	}
-
-	public void setPartIndex(String partIndex) {
-		this.partIndex = partIndex;
+	public SysMusicCompareRecord() {
 	}
 
 	@Override

+ 65 - 90
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/queryInfo/SysMusicCompareRecordQueryInfo.java

@@ -1,135 +1,110 @@
 package com.yonge.cooleshow.biz.dal.queryInfo;
 
-import io.swagger.annotations.ApiModelProperty;
-
 import com.yonge.cooleshow.biz.dal.enums.FeatureType;
 import com.yonge.cooleshow.biz.dal.enums.HeardLevelEnum;
 import com.yonge.toolset.base.page.QueryInfo;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
-/**
- * @Author Joburgess
- * @Date 2021/8/11 0011
- */
-public class SysMusicCompareRecordQueryInfo extends QueryInfo {
+import java.util.List;
 
-    private Long userId;
+public class SysMusicCompareRecordQueryInfo {
 
-    private Long teacherId;
+    @Data
+    public static class TeacherCompareRecordQueryInfo extends QueryInfo{
+        private Long userId;
 
-    private String startTime;
+        private Long teacherId;
 
-    private String endTime;
+        private String startTime;
 
-    private String musicGroupId;
+        private String endTime;
 
-    private int orderType;
+        private String musicGroupId;
 
-    @ApiModelProperty("排序字段:TRAINDAYS(训练天数);TRAINTIME(训练时长);TRAINNUM(训练次数)")
-    private String sortField = "TRAINDAYS";
+        private int orderType;
 
-    private FeatureType featureType;
+        @ApiModelProperty("排序字段:TRAINDAYS(训练天数);TRAINTIME(训练时长);TRAINNUM(训练次数)")
+        private String sortField = "TRAINDAYS";
 
-    private HeardLevelEnum heardLevel;
+        private FeatureType featureType;
 
-    private Boolean visitFlag;
+        private HeardLevelEnum heardLevel;
 
-    private Integer organId;
+        private Boolean visitFlag;
 
-    private String clientId;
+        private Integer organId;
 
-    public String getClientId() {
-        return clientId;
+        private String clientId;
     }
 
-    public void setClientId(String clientId) {
-        this.clientId = clientId;
-    }
+    @Data
+    public static class WechatCompareRecordQueryInfo extends QueryInfo{
+        @ApiModelProperty(name = "训练开始时间")
+        private String startTime;
 
-    public Integer getOrganId() {
-        return organId;
-    }
+        @ApiModelProperty(name = "训练结束时间")
+        private String endTime;
 
-    public void setOrganId(Integer organId) {
-        this.organId = organId;
-    }
+        @ApiModelProperty(name = "机构编号")
+        private Long tenantId;
 
-    public Boolean getVisitFlag() {
-        return visitFlag;
-    }
+        @ApiModelProperty(name = "排序字段")
+        private String sortField = "trainTimes";
 
-    public void setVisitFlag(Boolean visitFlag) {
-        this.visitFlag = visitFlag;
+        @ApiModelProperty(name = "排序方式")
+        private String sortType = "DESC";
     }
 
-    public FeatureType getFeatureType() {
-        return featureType;
-    }
+    @Data
+    public static class WechatCompareRecordPageDto{
+        @ApiModelProperty(name = "用户编号")
+        private Long userId;
 
-    public void setFeatureType(FeatureType featureType) {
-        this.featureType = featureType;
-    }
+        @ApiModelProperty(name = "头像")
+        private String avatar;
 
-    public Long getTeacherId() {
-        return teacherId;
-    }
+        @ApiModelProperty(name = "姓名")
+        private String username;
 
-    public void setTeacherId(Long teacherId) {
-        this.teacherId = teacherId;
-    }
+        @ApiModelProperty(name = "声部")
+        private String subjectName;
 
-    public int getOrderType() {
-        return orderType;
-    }
+        @ApiModelProperty(name = "训练总时长")
+        private Integer trainTimes;
 
-    public void setOrderType(int orderType) {
-        this.orderType = orderType;
-    }
+        @ApiModelProperty(name = "训练天数")
+        private Integer trainDays;
 
-    public Long getUserId() {
-        return userId;
-    }
-
-    public void setUserId(Long userId) {
-        this.userId = userId;
-    }
-
-    public String getStartTime() {
-        return startTime;
-    }
-
-    public void setStartTime(String startTime) {
-        this.startTime = startTime;
-    }
+        @ApiModelProperty(name = "平均训练时长")
+        private Integer avgTrainTimes;
 
-    public String getEndTime() {
-        return endTime;
     }
 
-    public void setEndTime(String endTime) {
-        this.endTime = endTime;
-    }
+    @Data
+    public static class WechatCompareRecordDto{
 
-    public String getMusicGroupId() {
-        return musicGroupId;
-    }
+        @ApiModelProperty(name = "列表数据")
+        private List<WechatCompareRecordPageDto> page;
 
-    public void setMusicGroupId(String musicGroupId) {
-        this.musicGroupId = musicGroupId;
+        @ApiModelProperty(name = "汇总")
+        private WechatCompareRecordSumDto sumDto;
     }
+    @Data
+    public static class WechatCompareRecordSumDto{
+        @ApiModelProperty(name = "总人数")
+        private Integer studentNum;
 
-    public String getSortField() {
-        return sortField;
-    }
+        @ApiModelProperty(name = "训练天数")
+        private Integer trainDays;
 
-    public void setSortField(String sortField) {
-        this.sortField = sortField;
-    }
+        @ApiModelProperty(name = "训练时长")
+        private Integer trainTimes;
 
-    public HeardLevelEnum getHeardLevel() {
-        return heardLevel;
-    }
+        @ApiModelProperty(name = "平均训练天数")
+        private Integer avgTrainDays;
 
-    public void setHeardLevel(HeardLevelEnum heardLevel) {
-        this.heardLevel = heardLevel;
+        @ApiModelProperty(name = "平均训练时长")
+        private Integer avgTrainTimes;
     }
 }

+ 6 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/StudentService.java

@@ -104,4 +104,10 @@ public interface StudentService extends IService<Student> {
      * @return StudentWrapper.UnionStudentResp
      */
     StudentWrapper.UnionStudentResp unionStudent(StudentWrapper.UnionStudent info);
+
+    /**
+     * 添加学生
+     * @param studentInfo 学生信息
+     */
+    Boolean save(StudentWrapper.Student studentInfo);
 }

+ 8 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysMusicCompareRecordService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import java.util.Map;
 
+import com.yonge.cooleshow.biz.dal.dao.SysMusicCompareRecordDao;
 import com.yonge.cooleshow.biz.dal.entity.SysMusicCompareRecord;
 import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
 import com.yonge.toolset.base.page.PageInfo;
@@ -9,6 +10,8 @@ import com.yonge.toolset.mybatis.service.BaseService;
 
 public interface SysMusicCompareRecordService extends BaseService<Long, SysMusicCompareRecord> {
 
+    SysMusicCompareRecordDao getDao();
+
     /**
      * @describe 保存用户评测记录
      * @param sysMusicCompareRecord
@@ -32,7 +35,10 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      * @param queryInfo:
      * @return java.util.Map<java.lang.String,java.lang.Object>
      */
-    Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo queryInfo);
+    Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo);
+
+    //微信小程序学员训练数据统计
+    PageInfo<SysMusicCompareRecordQueryInfo.WechatCompareRecordPageDto> weChatStudentTrainData(SysMusicCompareRecordQueryInfo.WechatCompareRecordQueryInfo queryInfo);
 
     /**
      * @describe 学员训练数据
@@ -41,6 +47,6 @@ public interface SysMusicCompareRecordService extends BaseService<Long, SysMusic
      * @param queryInfo:
      * @return com.ym.mec.common.page.PageInfo<com.ym.mec.biz.dal.entity.SysMusicCompareRecord>
      */
-    PageInfo<SysMusicCompareRecord> queryStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo);
+    PageInfo<SysMusicCompareRecord> queryStudentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo);
 
 }

+ 37 - 33
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImUserFriendServiceImpl.java

@@ -81,14 +81,15 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
         BasicUserInfo teacherInfo = teacherDao.getBasicUserInfo(teacherId);
         List<BasicUserInfo> studentInfos = teacherDao.findBasicUserInfo(studentIds);
         studentInfos.add(teacherInfo);
-        Map<Long, List<BasicUserInfo>> basicUserInfoMap = studentInfos.stream().collect(Collectors.groupingBy(BasicUserInfo::getUserId));
-        for(Long studentId : studentIds){
+        Map<Long, List<BasicUserInfo>> basicUserInfoMap =
+                studentInfos.stream().collect(Collectors.groupingBy(BasicUserInfo::getUserId));
+        for (Long studentId : studentIds) {
             //老师关联学员
             ImUserFriend teacherFriend = new ImUserFriend();
             //学员关联老师
             ImUserFriend studentFriend = new ImUserFriend();
             List<BasicUserInfo> basicUserInfos = basicUserInfoMap.get(studentId);
-            if(CollectionUtils.isNotEmpty(basicUserInfos)){
+            if (CollectionUtils.isNotEmpty(basicUserInfos)) {
                 BasicUserInfo info = basicUserInfos.get(0);
                 teacherFriend.setFriendAvatar(info.getAvatar());
                 teacherFriend.setFriendNickname(info.getUsername());
@@ -125,14 +126,14 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         BasicUserInfo basicUserInfo = teacherDao.getBasicUserInfo(userId);
-        if(sysUser != null && sysUser.getId() != null){
+        if (sysUser != null && sysUser.getId() != null) {
 
             ImUserFriend imUserFriend = lambdaQuery()
                     .eq(ImUserFriend::getUserId, sysUser.getId())
                     .eq(ImUserFriend::getClientType, clientType)
                     .eq(ImUserFriend::getFriendId, userId)
                     .one();
-            if(Objects.nonNull(imUserFriend)){
+            if (Objects.nonNull(imUserFriend)) {
                 //更新当前用户关联的该用户的详情信息
                 imUserFriend.setFriendAvatar(basicUserInfo.getAvatar());
                 imUserFriend.setFriendNickname(basicUserInfo.getUsername());
@@ -166,8 +167,8 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     /**
      * 新用户自动添加客服
      *
-     * @param userId    新用户ID
-     * @param friendIds 好友ID
+     * @param userId     新用户ID
+     * @param friendIds  好友ID
      * @param clientType 客户端类型
      * @return Integer
      */
@@ -256,7 +257,8 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     public void sendCustomerServiceNotifyMessage(String sender, CustomerService.NotifyMessage info) {
 
         // 发送者信息
-        com.yonge.cooleshow.biz.dal.entity.SysUser senderUser = sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+        com.yonge.cooleshow.biz.dal.entity.SysUser senderUser =
+                sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
                 .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, sender));
 
         if (Objects.isNull(senderUser)) {
@@ -276,7 +278,8 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
             }
         } else {
 
-            LambdaQueryWrapper<com.yonge.cooleshow.biz.dal.entity.SysUser> wrapper = Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+            LambdaQueryWrapper<com.yonge.cooleshow.biz.dal.entity.SysUser> wrapper =
+                    Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
                     .select(com.yonge.cooleshow.biz.dal.entity.SysUser::getId,
                             com.yonge.cooleshow.biz.dal.entity.SysUser::getUsername)
                     .in(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getReceives());
@@ -337,17 +340,17 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
     }
 
 
-
     /**
      * 用户IM好友列表
      *
      * @param clientType 客户端类型
-     * @param userId 用户ID
+     * @param userId     用户ID
      * @param paramMap   Map<String, Object>
      * @return List<ImUserWrapper.ImUserFriend>
      */
     @Override
-    public List<ImUserWrapper.ImUserFriend> findUserAllImFriendInfo(ClientEnum clientType, Long userId, Map<String, Object> paramMap) {
+    public List<ImUserWrapper.ImUserFriend> findUserAllImFriendInfo(ClientEnum clientType, Long userId, Map<String,
+            Object> paramMap) {
 
         // 用户好友匹配条件
         Object search = paramMap.get("search");
@@ -360,30 +363,30 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
                         e -> e.eq(ImUserFriend::getFriendId, search).or().like(ImUserFriend::getFriendNickname, search))
                 .orderByDesc(ImUserFriend::getId).list();
 
-        List<ImUserWrapper.ImUserFriend> userFriends = JSON.parseArray(JSON.toJSONString(records), ImUserWrapper.ImUserFriend.class);
+        List<ImUserWrapper.ImUserFriend> userFriends = JSON.parseArray(JSON.toJSONString(records),
+                ImUserWrapper.ImUserFriend.class);
 
         for (ImUserWrapper.ImUserFriend item : userFriends) {
 
             switch (clientType) {
-                case TEACHER:
-                    {
-                        // 老师查询学生好友
-                        if (item.getFriendType() == ClientEnum.TEACHER) {
-                            item.setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
-                        } else {
-                            item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.STUDENT))
-                                    .setImFriendId(MessageFormat.format("{0}:{1}", String.valueOf(item.getFriendId()), ClientEnum.STUDENT.name()));
-                        }
-
+                case TEACHER: {
+                    // 老师查询学生好友
+                    if (item.getFriendType() == ClientEnum.TEACHER) {
+                        item.setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
+                    } else {
+                        item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.STUDENT))
+                                .setImFriendId(MessageFormat.format("{0}:{1}", String.valueOf(item.getFriendId()),
+                                        ClientEnum.STUDENT.name()));
                     }
-                    break;
-                case STUDENT:
-                    {
-                        // 查询学生老师好友
-                        item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.TEACHER))
-                                .setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
-                    }
-                    break;
+
+                }
+                break;
+                case STUDENT: {
+                    // 查询学生老师好友
+                    item.friendType(Optional.ofNullable(item.getFriendType()).orElse(ClientEnum.TEACHER))
+                            .setImFriendId(MessageFormat.format("{0}", String.valueOf(item.getFriendId())));
+                }
+                break;
                 default:
                     break;
             }
@@ -394,8 +397,9 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
     /**
      * 删除机构下的好友
-     * @param tenantId 机构ID
-     * @param userId 用户ID
+     *
+     * @param tenantId   机构ID
+     * @param userId     用户ID
      */
     @Override
     public void delFriendByTenantId(Long tenantId, Long userId) {

+ 117 - 7
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java

@@ -1,9 +1,12 @@
 package com.yonge.cooleshow.biz.dal.service.impl;
 
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.StudentDao;
 import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
@@ -11,15 +14,27 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dao.UserBindingTeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.search.QueryMyFollowSearch;
 import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
-import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.StudentTotal;
+import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.UserBindingTeacher;
+import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.StudentTotalService;
+import com.yonge.cooleshow.biz.dal.service.SysConfigService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
 import com.yonge.cooleshow.biz.dal.vo.StudentHomeVo;
 import com.yonge.cooleshow.biz.dal.vo.StudentVo;
 import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.CacheNameEnum;
 import com.yonge.cooleshow.common.enums.UserLockFlag;
@@ -72,6 +87,12 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private UserTenantAlbumRecordService userTenantAlbumRecordService;
 
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
     @Override
     public StudentVo detail(Long userId) {
         return baseMapper.detail(userId);
@@ -257,8 +278,9 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         StudentVo studentVo = detailByPhone(info.getMobile());
 
 
-        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
-                                                                                             .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getMobile()));
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser =
+                sysUserMapper.selectOne(Wrappers.<com.yonge.cooleshow.biz.dal.entity.SysUser>lambdaQuery()
+                        .eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, info.getMobile()));
 
         studentResp.setSysUser(sysUser);
         if (Objects.isNull(studentVo)) {
@@ -281,7 +303,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 studentResp.setUpdateFlag(true);
             } else {
 
-                com.yonge.cooleshow.biz.dal.entity.SysUser updateEntity = new com.yonge.cooleshow.biz.dal.entity.SysUser();
+                com.yonge.cooleshow.biz.dal.entity.SysUser updateEntity =
+                        new com.yonge.cooleshow.biz.dal.entity.SysUser();
                 updateEntity.setId(sysUser.getId());
                 updateEntity.setUpdateTime(LocalDateTime.now());
                 //updateEntity.setDelFlag(Optional.ofNullable(info.getLockFlag()).orElse(0)); // 激活帐号
@@ -337,11 +360,98 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         return studentResp;
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public Boolean save(StudentWrapper.Student studentInfo) {
+        if (studentInfo.getId() != null) {
+            return createStudent(studentInfo);
+        } else {
+            return updateStudent(studentInfo);
+        }
+    }
+
+    private Boolean updateStudent(StudentWrapper.Student studentInfo) {
+        StudentVo student = detail(studentInfo.getId());
+        if (student == null) {
+            throw new BizException("学生信息不存在");
+        }
+        // 解绑
+        if (!studentInfo.getBindTenant()) {
+            studentInfo.setTenantId(-1L);
+            // 退群,删除好友
+            imUserFriendService.delFriendByTenantId(student.getTenantId(), student.getUserId());
+        }
+        // 手机号码修改
+        if (!student.getPhone().equals(studentInfo.getPhone())) {
+            com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = getOrCreateAccount(studentInfo);
+            this.lambdaUpdate().set(Student::getSubjectId, studentInfo.getSubjectId())
+                    .set(Student::getTenantId, studentInfo.getTenantId())
+                    .set(Student::getUserId, sysUser.getId())
+                    .set(Student::getUpdateTime, new Date())
+                    .eq(Student::getUserId, studentInfo.getId())
+                    .update();
+        } else {
+            Student newStudent = new Student();
+            newStudent.setUserId(studentInfo.getId());
+            newStudent.setSubjectId(studentInfo.getSubjectId());
+            newStudent.setUpdateTime(new Date());
+            newStudent.setTenantId(studentInfo.getTenantId());
+            this.getBaseMapper().updateById(newStudent);
+        }
+        return true;
+    }
+
+    private Boolean createStudent(StudentWrapper.Student studentInfo) {
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser = getOrCreateAccount(studentInfo);
+        Student student = new Student();
+        student.setUserId(sysUser.getId());
+        student.setTenantId(studentInfo.getTenantId());
+        student.setSubjectId(studentInfo.getSubjectId());
+        student.setCreateTime(new Date());
+        student.setLockFlag(UserLockFlag.NORMAL);
+        save(student);
+        return true;
+    }
+
+    private com.yonge.cooleshow.biz.dal.entity.SysUser getOrCreateAccount(StudentWrapper.Student studentInfo) {
+        QueryWrapper<com.yonge.cooleshow.biz.dal.entity.SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(com.yonge.cooleshow.biz.dal.entity.SysUser::getPhone, studentInfo.getPhone());
+        List<com.yonge.cooleshow.biz.dal.entity.SysUser> sysUsers = sysUserMapper.selectList(sysUserQueryWrapper);
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser;
+        if (!sysUsers.isEmpty()) {
+            sysUser = sysUsers.get(0);
+            if (this.getBaseMapper().selectById(sysUser.getId()) != null) {
+                throw new BizException("手机号已经注册学生账号");
+            }
+            sysUser.setGender(studentInfo.getGender());
+            sysUser.setBirthdate(studentInfo.getBirthdate());
+            String userType = sysUser.getUserType();
+            String studentUserType = "STUDENT";
+            if (StringUtils.isEmpty(userType)) {
+                sysUser.setUserType(studentUserType);
+            } else if (!userType.contains(studentUserType)) {
+                sysUser.setUserType(userType + "," + studentUserType);
+            }
+            sysUserMapper.updateById(sysUser);
+        } else {
+            sysUser = JSON.parseObject(JSON.toJSONString(studentInfo),
+                    com.yonge.cooleshow.biz.dal.entity.SysUser.class);
+            sysUser.setPhone(studentInfo.getPhone());
+            sysUser.setAvatar(sysConfigService.findConfigValue(SysConfigConstant.DEFAULT_HEARD));
+            sysUser.setGender(studentInfo.getGender());
+            sysUser.setUserType("STUDENT");
+            sysUser.setBirthdate(studentInfo.getBirthdate());
+            sysUserMapper.insert(sysUser);
+        }
+        return sysUser;
+    }
+
     /**
      * 更新学生关联帐号
-     * @param info StudentWrapper.UnionStudent
+     *
+     * @param info        StudentWrapper.UnionStudent
      * @param studentResp StudentWrapper.UnionStudentResp
-     * @param student Student
+     * @param student     Student
      */
     private void updateStudentUnionStatus(StudentWrapper.UnionStudent info,
                                           StudentWrapper.UnionStudentResp studentResp, Student student) {

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

@@ -241,6 +241,11 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	}
 
 	@Override
+	public SysMusicCompareRecordDao getDao() {
+		return sysMusicCompareRecordDao;
+	}
+
+	@Override
 	@Transactional
 	public void saveMusicCompareData(SysMusicCompareRecord sysMusicCompareRecord) {
 
@@ -304,7 +309,7 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	}
 
 	@Override
-	public Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo queryInfo) {
+	public Map<String, Object> studentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo) {
 		StudentTrainOverviewDto userTrainOverView = new StudentTrainOverviewDto();
 
 		List<StudentTrainChartDto> userTrainChartData = new ArrayList<>();
@@ -368,7 +373,26 @@ public class SysMusicCompareRecordServiceImpl extends BaseServiceImpl<Long, SysM
 	}
 
 	@Override
-	public PageInfo<SysMusicCompareRecord> queryStudentTrainData(SysMusicCompareRecordQueryInfo queryInfo) {
+	public PageInfo<SysMusicCompareRecordQueryInfo.WechatCompareRecordPageDto> weChatStudentTrainData(SysMusicCompareRecordQueryInfo.WechatCompareRecordQueryInfo queryInfo) {
+		PageInfo<SysMusicCompareRecordQueryInfo.WechatCompareRecordPageDto> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
+		Map<String, Object> params = new HashMap<>();
+		MapUtil.populateMap(params, queryInfo);
+		List<SysMusicCompareRecordQueryInfo.WechatCompareRecordPageDto> dataList = null;
+		int count = sysMusicCompareRecordDao.countWeChatStudentTrainData(params);
+		if (count > 0) {
+			pageInfo.setTotal(count);
+			params.put("offset", pageInfo.getOffset());
+			dataList = sysMusicCompareRecordDao.queryWeChatStudentTrainData(params);
+		}
+		if (count == 0) {
+			dataList = new ArrayList<>();
+		}
+		pageInfo.setRows(dataList);
+		return pageInfo;
+	}
+
+	@Override
+	public PageInfo<SysMusicCompareRecord> queryStudentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo) {
 		PageInfo<SysMusicCompareRecord> pageInfo = new PageInfo<>(queryInfo.getPage(), queryInfo.getRows());
 		Map<String, Object> params = new HashMap<>();
 		MapUtil.populateMap(params, queryInfo);

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

@@ -161,20 +161,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             }).filter(Objects::nonNull).collect(Collectors.joining(","));
             teacherVo.setSubjectName(subjectNames);
         }
-
-        // 设置机构名称
-        List<Long> tenantIdList = teacherVos.stream().map(TeacherVo::getTenantId)
-                .filter(next -> next != null && !next.equals(-1L)).distinct()
-                .collect(Collectors.toList());
-        if (!tenantIdList.isEmpty()) {
-            Map<Long, String> tenantIdNameMap = tenantInfoService.lambdaQuery().in(TenantInfo::getId, tenantIdList)
-                    .list().stream().collect(Collectors.toMap(TenantInfo::getId, TenantInfo::getName));
-            tenantIdNameMap.put(-1L, "平台老师");
-            for (TeacherVo next : teacherVos) {
-                next.setTenantName(tenantIdNameMap.getOrDefault(next.getTenantId(), ""));
-            }
-        }
-
         return page.setRecords(teacherVos);
     }
 
@@ -383,8 +369,6 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         } else {
             teacher.setUpdateTime(new Date());
             teacher = getTeacherDetil(teacher, teacherSubmitReq);
-            baseMapper.updateById(teacher);
-
             if (null == teacher.getEntryAuthDate() || null == teacher.getMusicianDate()) {
                 baseMapper.update(teacher, Wrappers.<Teacher>lambdaUpdate()
                         .set(Teacher::getEntryAuthDate, teacher.getEntryAuthDate())
@@ -393,8 +377,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 );
             }
 
-            // 机构发生变化
-            if (!teacher.getTenantId().equals(teacherSubmitReq.getTenantId())) {
+            // 机构解绑
+            if (teacher.getTenantId() != -1 && !teacherSubmitReq.getBindTenant()) {
                 // 老师建立的班级群解散,并解除好友关系
                 List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
                         .eq(ImGroupMember::getIsAdmin,true)
@@ -411,7 +395,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                     });
                     imUserFriendService.delFriendByTenantId(teacher.getTenantId(), teacher.getUserId());
                 }
+                // 机构解绑后,归属为平台老师
+                teacher.setTenantId(-1L);
             }
+            baseMapper.updateById(teacher);
         }
 
         return teacher;

+ 31 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/StudentWrapper.java

@@ -9,6 +9,7 @@ import lombok.Data;
 import lombok.NoArgsConstructor;
 
 import java.io.Serializable;
+import java.time.LocalDate;
 
 /**
  * 学生封装类
@@ -82,4 +83,34 @@ public class StudentWrapper {
             return this;
         }
     }
+
+    @Data
+    @ApiModel("学生基础信息")
+    public static class Student{
+
+        @ApiModelProperty("id")
+        private Long id;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        @ApiModelProperty("姓名")
+        private String name;
+
+        @ApiModelProperty("性别。0:女 1:男")
+        private Integer gender;
+
+        @ApiModelProperty("生日")
+        private LocalDate birthdate;
+
+        @ApiModelProperty("手机号码")
+        private String phone;
+
+        @ApiModelProperty("声部,多个用逗号隔开")
+        private String subjectId;
+
+        @ApiModelProperty("是否绑定机构,0:解绑,1:不解绑")
+        private Boolean bindTenant;
+
+    }
 }

+ 1 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/ImUserFriendMapper.xml

@@ -36,6 +36,6 @@
                     (t1.user_id_ = t2.user_id_ OR t1.friend_id_ = t2.user_id_)
             )
         WHERE t1.user_id_ = #{userId}
-           OR t1.friend_id_ = #{userId}
+        OR t1.friend_id_ = #{userId}
     </delete>
 </mapper>

+ 8 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -159,7 +159,14 @@
                 and te.name_ like concat('%',#{param.tenantName},'%')
             </if>
         </where>
-        order by t.create_time_ desc
+        <choose>
+            <when test="param.orderBy != null and param.orderBy.trim() != ''">
+                order by #{param.orderBy}
+            </when>
+            <otherwise>
+                order by t.create_time_ desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="querySubject" resultMap="com.yonge.cooleshow.biz.dal.dao.SubjectDao.Subject">

+ 56 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/SysMusicCompareRecordMapper.xml

@@ -31,6 +31,7 @@
 		<result column="create_time_" property="createTime" />
 		<result column="part_index_" property="partIndex" />
 		<result column="custom_configuration_" property="customConfiguration" />
+		<result column="tenant_id_" property="tenantId" />
 	</resultMap>
 
 	<!-- 根据主键查询一条记录 -->
@@ -342,6 +343,61 @@
 		</choose>
 
 	</select>
+    <select id="queryWeChatStudentTrainData"
+            resultType="com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo$WechatCompareRecordPageDto">
+		select su.id_ userId,su.avatar_ avatar,su.username_ username,GROUP_CONCAT(DISTINCT sb.name_) subjectName,
+			   SUM(mprs.playTime) trainTimes,COUNT(DISTINCT mprs.create_time_) trainDays,
+			   SUM(mprs.playTime) / COUNT(DISTINCT mprs.create_time_) avgTrainTimes
+		from (select st.user_id_,DATE_FORMAT(smcr.create_time_,'%Y-%m-%d') create_time_,SUM(smcr.play_time_) playTime,st.subject_id_
+			  from student st
+					   LEFT JOIN sys_music_compare_record smcr ON smcr.user_id_ = st.user_id_
+			  where st.membership_end_time_ >= NOW()
+			  <if test="startTime != null and startTime != ''">
+				  AND smcr.create_time_ BETWEEN #{startTime} AND #{endTime}
+			  </if>
+			<if test="queryInfo.tenantId != null">
+				AND smcr.tenant_id_ = #{queryInfo.tenantId}
+			</if>
+			  group by st.user_id_,DATE_FORMAT(create_time_,'%Y-%m-%d')) mprs
+				 left join sys_user su ON mprs.user_id_ = su.id_
+				 left join subject sb ON FIND_IN_SET(sb.id_,mprs.subject_id_)
+		<where>
+			<if test="search != null and search != ''">
+				AND su.username_ LIKE CONCAT('%',#{keyword},'%')
+			</if>
+		</where>
+		group by mprs.user_id_
+		ORDER BY ${sortField} ${sortType}
+	</select>
+	<select id="countWeChatStudentTrainData" resultType="java.lang.Integer">
+		select COUNT(DISTINCT st.user_id_)
+		from student st
+		left join sys_user su ON st.user_id_ = su.id_
+		LEFT JOIN sys_music_compare_record smcr ON smcr.user_id_ = st.user_id_
+		where st.membership_end_time_ >= NOW()
+		<if test="queryInfo.tenantId != null">
+			AND smcr.tenant_id_ = #{queryInfo.tenantId}
+		</if>
+		<if test="startTime != null and startTime != ''">
+			AND smcr.create_time_ BETWEEN #{startTime} AND #{endTime}
+		</if>
+		<if test="search != null and search != ''">
+			AND su.username_ LIKE CONCAT('%',#{keyword},'%')
+		</if>
+	</select>
+	<select id="wechatCompareRecordSum"
+			resultType="com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo$WechatCompareRecordSumDto">
+		select COUNT(st.user_id_),COUNT(DISTINCT DATE_FORMAT(smcr.create_time_,'%Y-%m-%d')) trainNum,SUM(smcr.play_time_) playTime
+		from student st
+		LEFT JOIN sys_music_compare_record smcr ON smcr.user_id_ = st.user_id_
+		where st.membership_end_time_ >= NOW()
+		<if test="queryInfo.startTime != null and queryInfo.startTime != ''">
+			AND smcr.create_time_ BETWEEN #{queryInfo.startTime} AND #{queryInfo.endTime}
+		</if>
+		<if test="queryInfo.tenantId != null">
+			AND smcr.tenant_id_ = #{queryInfo.tenantId}
+		</if>
+	</select>
 	<!--曲目练习统计-->
 
 </mapper>

+ 8 - 1
cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml

@@ -182,7 +182,14 @@
                 and te.name_ like concat('%',#{param.tenantName},'%')
             </if>
         </where>
-        order by t.create_time_ desc
+        <choose>
+            <when test="param.orderBy != null and param.orderBy.trim() != ''">
+                order by #{param.orderBy}
+            </when>
+            <otherwise>
+                order by t.create_time_ desc
+            </otherwise>
+        </choose>
     </select>
 
 	<resultMap id="BasicUserInfo" type="com.yonge.cooleshow.biz.dal.dto.BasicUserInfo">

+ 1 - 1
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/SysMusicCompareRecordController.java

@@ -66,7 +66,7 @@ public class SysMusicCompareRecordController extends BaseController {
 
     @ApiOperation("学员训练数据统计")
     @GetMapping("studentTrainData")
-    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("获取用户信息失败");

+ 1 - 1
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/SysMusicCompareRecordController.java

@@ -63,7 +63,7 @@ public class SysMusicCompareRecordController extends BaseController {
 
     @ApiOperation("老师训练数据统计")
     @GetMapping("studentTrainData")
-    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo queryInfo){
+    public HttpResponseResult studentTrainData(SysMusicCompareRecordQueryInfo.TeacherCompareRecordQueryInfo queryInfo){
         SysUser sysUser = sysUserFeignService.queryUserInfo();
         if (sysUser == null) {
             return failed("获取用户信息失败");

+ 99 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/StudentController.java

@@ -0,0 +1,99 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentSearch;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.vo.StudentVo;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.UserStatusEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/student")
+@Api(value = "学生表", tags = "学生表")
+public class StudentController extends BaseController {
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "详情", notes = "传入id")
+    public HttpResponseResult<StudentVo> detail(@PathVariable("id") Long id) {
+        StudentVo detail = studentService.detail(id);
+        return succeed(detail);
+    }
+
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入StudentSearch")
+    public HttpResponseResult<PageInfo<StudentVo>> page(@RequestBody StudentSearch query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        query.setDelFlag(YesOrNoEnum.NO);
+        query.setOrderBy("t.username desc");
+
+        IPage<StudentVo> pages = studentService.selectPage(PageUtil.getPage(query), query);
+        List<StudentVo> rows = pages.getRecords();
+
+        for (StudentVo vo : rows) {
+            if (vo.getDelFlag() == YesOrNoEnum.YES) {
+                vo.setUserStatus(UserStatusEnum.CLOSED);
+            } else {
+                if (vo.getLockFlag() == UserLockFlag.LOCKED) {
+                    vo.setUserStatus(UserStatusEnum.LOCKED);
+                } else {
+                    vo.setUserStatus(UserStatusEnum.NORMAL);
+                }
+            }
+        }
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    @PostMapping("/save")
+    @ApiOperation(value = "新增/修改", notes = "传入Student")
+    public HttpResponseResult<Boolean> save(
+            @Validated @RequestBody com.yonge.cooleshow.tenant.vo.StudentVo.Student student) {
+        TenantInfo tenantInfo = getTenantInfo();
+        StudentWrapper.Student studentInfo = JSON.parseObject(JSON.toJSONString(student), StudentWrapper.Student.class);
+        studentInfo.setTenantId(tenantInfo.getId());
+        studentService.save(studentInfo);
+        return succeed();
+    }
+
+    private TenantInfo getTenantInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
+                .last("limit 1").one();
+        if (tenantInfo == null) {
+            throw new com.microsvc.toolkit.common.webportal.exception.BizException("非法请求");
+        }
+        return tenantInfo;
+    }
+}

+ 55 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/SysMusicCompareRecordController.java

@@ -0,0 +1,55 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.queryInfo.SysMusicCompareRecordQueryInfo;
+import com.yonge.cooleshow.biz.dal.service.SysMusicCompareRecordService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.page.PageInfo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@Api(tags = "小酷Ai记录")
+@RequestMapping("sysMusicRecord")
+@RestController
+public class SysMusicCompareRecordController extends BaseController {
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private SysMusicCompareRecordService sysMusicCompareRecordService;
+
+
+    @ApiOperation("学员训练数据统计列表")
+    @PostMapping("queryStudentTrainData")
+    public HttpResponseResult<PageInfo<SysMusicCompareRecordQueryInfo.WechatCompareRecordPageDto>> queryStudentTrainData
+            (@RequestBody SysMusicCompareRecordQueryInfo.WechatCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setTenantId(sysUser.getTenantId());
+        return succeed(sysMusicCompareRecordService.weChatStudentTrainData(queryInfo));
+    }
+
+
+    @ApiOperation("学员训练数据统计列表")
+    @PostMapping("studentTrainData")
+    public HttpResponseResult<SysMusicCompareRecordQueryInfo.WechatCompareRecordDto> studentTrainData
+            (@RequestBody SysMusicCompareRecordQueryInfo.WechatCompareRecordQueryInfo queryInfo){
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            return failed("获取用户信息失败");
+        }
+        queryInfo.setTenantId(sysUser.getTenantId());
+        queryInfo.setRows(10);
+        SysMusicCompareRecordQueryInfo.WechatCompareRecordDto result = new SysMusicCompareRecordQueryInfo.WechatCompareRecordDto();
+        result.setSumDto(sysMusicCompareRecordService.getDao().wechatCompareRecordSum(queryInfo));
+        result.setPage(sysMusicCompareRecordService.weChatStudentTrainData(queryInfo).getRows());
+        return succeed(result);
+    }
+
+}

+ 131 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TeacherController.java

@@ -0,0 +1,131 @@
+package com.yonge.cooleshow.tenant.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.webportal.exception.BizException;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.req.TeacherSubmitReq;
+import com.yonge.cooleshow.biz.dal.dto.search.TeacherSearch;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.vo.TeacherVo;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.common.enums.UserLockFlag;
+import com.yonge.cooleshow.common.enums.UserStatusEnum;
+import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.toolset.base.page.PageInfo;
+import com.yonge.toolset.mybatis.support.PageUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequestMapping("/teacher")
+@Api(value = "教师表", tags = "教师表")
+public class TeacherController extends BaseController {
+
+    @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    /**
+     * 查询单条
+     */
+    @GetMapping("/detail/{id}")
+    @ApiOperation(value = "详情", notes = "传入id")
+    public HttpResponseResult<TeacherVo> detail(@PathVariable("id") Long userId) {
+        TenantInfo tenantInfo = getTenantInfo();
+
+        TeacherVo detail = teacherService.findTeacherDetailInfo(userId);
+        if (detail == null) {
+            throw new BizException("数据不存在");
+        }
+        if (tenantInfo.getId().equals(detail.getTenantId())) {
+            throw new BizException("非法请求");
+        }
+        if (!CollectionUtils.isEmpty(detail.getStyleVideo())) {
+            List<TeacherStyleVideo> styleVideo = detail.getStyleVideo();
+            List<TeacherStyleVideo> collect =
+                    styleVideo.stream().filter(o -> AuthStatusEnum.PASS.equals(o.getAuthStatus())).collect(Collectors.toList());
+            detail.setStyleVideo(collect);
+        }
+        return succeed(detail);
+    }
+
+    /**
+     * 查询分页
+     */
+    @PostMapping("/page")
+    @ApiOperation(value = "查询分页", notes = "传入teacher")
+    public HttpResponseResult<PageInfo<TeacherVo>> page(@RequestBody TeacherSearch query) {
+        TenantInfo tenantInfo = getTenantInfo();
+        query.setTenantId(tenantInfo.getId());
+        query.setDelFlag(YesOrNoEnum.NO);
+        query.setOrderBy("t.username desc");
+
+        IPage<TeacherVo> pages = teacherService.selectPage(PageUtil.getPage(query), query);
+        List<TeacherVo> rows = pages.getRecords();
+
+        for (TeacherVo vo : rows) {
+            if (vo.getDelFlag() == YesOrNoEnum.YES) {
+                vo.setUserStatus(UserStatusEnum.CLOSED);
+            } else {
+                if (vo.getLockFlag() == UserLockFlag.LOCKED) {
+                    vo.setUserStatus(UserStatusEnum.LOCKED);
+                } else {
+                    vo.setUserStatus(UserStatusEnum.NORMAL);
+                }
+            }
+        }
+        return succeed(PageUtil.pageInfo(pages));
+    }
+
+    /**
+     * 新增或修改
+     */
+    @PostMapping("/submit")
+    @ApiOperation(value = "新增或修改", notes = "传入teacher")
+    public HttpResponseResult<Boolean> submit(@Valid @RequestBody TeacherSubmitReq teacherSubmitReq) {
+        TenantInfo tenantInfo = getTenantInfo();
+        if (teacherSubmitReq.getUserId() != null) {
+            Teacher teacher = teacherService.lambdaQuery().eq(Teacher::getUserId, teacherSubmitReq.getUserId())
+                    .eq(Teacher::getTenantId, tenantInfo.getId()).last("limit 1").one();
+            if (teacher == null) {
+                throw new BizException("老师不存在");
+            }
+        }
+        teacherSubmitReq.setTenantId(tenantInfo.getId());
+        return teacherService.submit(teacherSubmitReq);
+    }
+
+    private TenantInfo getTenantInfo() {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantInfo tenantInfo = tenantInfoService.lambdaQuery().eq(TenantInfo::getUserId, sysUser.getId())
+                .last("limit 1").one();
+        if (tenantInfo == null) {
+            throw new BizException("非法请求");
+        }
+        return tenantInfo;
+    }
+}

+ 47 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java

@@ -0,0 +1,47 @@
+package com.yonge.cooleshow.tenant.controller.open;
+
+import com.alibaba.fastjson.JSON;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.toolset.base.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/open/student")
+@Api(value = "学生表", tags = "学生表")
+public class OpenStudentController extends BaseController {
+    @Autowired
+    private StudentService studentService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @PostMapping("/save")
+    @ApiOperation(value = "新增/修改", notes = "传入Student")
+    public HttpResponseResult<Boolean> save(
+            @Validated @RequestBody com.yonge.cooleshow.tenant.vo.StudentVo.Student student) {
+        Long tenantId = student.getTenantId();
+        if (tenantId == null) {
+            throw new BizException("未指定机构");
+        }
+        TenantInfo tenantInfo = tenantInfoService.getById(tenantId);
+        if (tenantInfo == null) {
+            throw new BizException("机构不存在");
+        }
+        StudentWrapper.Student studentInfo = JSON.parseObject(JSON.toJSONString(student), StudentWrapper.Student.class);
+        studentInfo.setTenantId(tenantInfo.getId());
+        studentService.save(studentInfo);
+        return succeed();
+    }
+}

+ 45 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/vo/StudentVo.java

@@ -0,0 +1,45 @@
+package com.yonge.cooleshow.tenant.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+@ApiModel("学生入参模型")
+@Data
+public class StudentVo {
+
+    @Data
+    @ApiModel("添加/修改学生")
+    public static class Student{
+
+        @ApiModelProperty("id")
+        private Long id;
+
+        @ApiModelProperty("所属机构,开放接口必填")
+        private Long tenantId;
+
+        @ApiModelProperty("姓名")
+        @NotNull
+        private String name;
+
+        @ApiModelProperty("性别。0:女 1:男")
+        @NotNull
+        private Boolean gender;
+
+        @ApiModelProperty("生日")
+        private Date birthdate;
+
+        @ApiModelProperty("手机号码")
+        @NotNull
+        private String phone;
+
+        @ApiModelProperty("声部,多个用逗号隔开")
+        private String subjectId;
+
+        @ApiModelProperty("是否解绑")
+        private Boolean bindTenant;
+    }
+}