Ver código fonte

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

liujc 1 ano atrás
pai
commit
0f8f119175

+ 2 - 2
cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/StudentController.java

@@ -157,9 +157,9 @@ public class StudentController extends BaseController {
         OutputStream outputStream = response.getOutputStream();
         try {
             HSSFWorkbook workbook = POIUtil.exportExcel(new String[]{"学生编号", "学生姓名", "真实姓名", "性别", "出生日期",
-                    "年龄", "专业", "手机号码", "是否是会员", "注册时间","用户状态"}, new String[]{
+                    "年龄", "专业", "手机号码", "是否是会员", "注册时间","用户状态","学生来源"}, new String[]{
                     "userId","username" , "realName", "gender.msg", "birthdate", "age", "subjectName", "phone",
-                    "isVip.msg", "createTime", "userStatus.msg"}, rows);
+                    "isVip.msg", "createTime", "userStatus.msg","tenantName"}, rows);
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attac:wq" +
                     "hment;filename=学生列表-" + DateUtil.getDate(new Date()) + ".xls");

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/dao/ImUserFriendDao.java

@@ -17,5 +17,7 @@ public interface ImUserFriendDao extends BaseMapper<ImUserFriend> {
     int insertBatch(@Param("entities") List<ImUserFriend> entities);
 
     ImUserFriend findByUserIdAndFriendId(@Param("userId") Long userId, @Param("friendId") Long friendId);
+
+    void delFriendByTenantId(@Param("tenantId") Long tenantId,@Param("userId") Long userId);
 }
 

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

@@ -1,16 +1,18 @@
 package com.yonge.cooleshow.biz.dal.dto.req;
 
+import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-
-import java.io.Serializable;
+import lombok.Data;
 
 import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
 
 /**
  * @Author: liweifan
  * @Data: 2022/3/18 14:56
  */
+@Data
 @ApiModel(value = "TeacherSubmitReq对象", description = "新增/修改老师对象")
 public class TeacherSubmitReq implements Serializable {
 
@@ -45,6 +47,11 @@ public class TeacherSubmitReq implements Serializable {
     @ApiModelProperty("是否测试用户")
 	private Boolean isTestUser;
 
+    @ApiModelProperty("所属机构,平台为-1")
+    private Long tenantId;
+
+    @ApiModelProperty("结算方式")
+    private ESettlementFrom settlementFrom;
 
     public Long getUserId() {
         return userId;

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

@@ -7,6 +7,7 @@ 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 lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
@@ -16,6 +17,7 @@ import java.util.Optional;
  * @Author: liweifan
  * @Data: 2022/3/21 15:26
  */
+@Data
 @ApiModel(value = "StudentSearch", description = "学院管理查询")
 public class StudentSearch extends QueryInfo{
     @ApiModelProperty(value = "学员编号/昵称/电话")
@@ -61,6 +63,12 @@ public class StudentSearch extends QueryInfo{
     @ApiModelProperty("隐藏标识")
     private Integer hideFlag;
 
+    @ApiModelProperty("机构ID")
+    private String tenantId;
+
+    @ApiModelProperty("机构名称")
+    private String tenantName;
+
     public Date getVipStartTime() {
         return vipStartTime;
     }

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

@@ -6,6 +6,7 @@ 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 lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
@@ -14,6 +15,7 @@ import java.util.Date;
  * @Author: liweifan
  * @Data: 2022/3/21 15:26
  */
+@Data
 @ApiModel(value = "TeacherSearch", description = "老师管理查询")
 public class TeacherSearch extends QueryInfo{
     @ApiModelProperty(value = "老师编号/昵称/电话")
@@ -60,101 +62,11 @@ public class TeacherSearch extends QueryInfo{
 	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
 	private Date vipEndTime;
 
-	public Date getVipStartTime() {
-		return vipStartTime;
-	}
-
-	public void setVipStartTime(Date vipStartTime) {
-		this.vipStartTime = vipStartTime;
-	}
-
-	public Date getVipEndTime() {
-		return vipEndTime;
-	}
-
-	public void setVipEndTime(Date vipEndTime) {
-		this.vipEndTime = vipEndTime;
-	}
-
-	public String getSearch() {
-        return search;
-    }
-
-    public void setSearch(String search) {
-        this.search = search;
-    }
-
-    public String getTeacherType() {
-        return teacherType;
-    }
-
-    public void setTeacherType(String teacherType) {
-        this.teacherType = teacherType;
-    }
-
-	public String getTag() {
-		return tag;
-	}
-
-	public void setTag(String tag) {
-		this.tag = tag;
-	}
-
-    public UserLockFlag getLockFlag() {
-        return lockFlag;
-    }
-
-    public void setLockFlag(UserLockFlag lockFlag) {
-        this.lockFlag = lockFlag;
-    }
-
-    public Integer getIsVip() {
-		return isVip;
-	}
-
-	public void setIsVip(Integer isVip) {
-		this.isVip = isVip;
-	}
+	@ApiModelProperty("机构ID")
+	private Long tenantId;
 
-	public String getUserStatus() {
-		return userStatus;
-	}
-
-	public void setUserStatus(String userStatus) {
-		this.userStatus = userStatus;
-	}
-
-	public YesOrNoEnum getDelFlag() {
-		return delFlag;
-	}
-
-	public void setDelFlag(YesOrNoEnum delFlag) {
-		this.delFlag = delFlag;
-	}
-
-	public Long getSubjectId() {
-		return subjectId;
-	}
-
-	public void setSubjectId(Long subjectId) {
-		this.subjectId = subjectId;
-	}
-
-	public Boolean getIsSettlement() {
-		return isSettlement;
-	}
-
-	public void setIsSettlement(Boolean isSettlement) {
-		this.isSettlement = isSettlement;
-	}
-
-	public Boolean getIsTestUser() {
-		return isTestUser;
-	}
-
-	public void setIsTestUser(Boolean isTestUser) {
-		this.isTestUser = isTestUser;
-	}
+	@ApiModelProperty("结算方式")
+	private String settlementFrom;
 
 	public YesOrNoEnum getTrainFlag() {
 		if (YesOrNoEnum.YES == trainFlag) {
@@ -173,8 +85,4 @@ public class TeacherSearch extends QueryInfo{
 		}
 		return null;
 	}
-
-	public void setEvaluateFlag(YesOrNoEnum evaluateFlag) {
-		this.evaluateFlag = evaluateFlag;
-	}
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/ImUserFriendService.java

@@ -64,5 +64,7 @@ public interface ImUserFriendService extends IService<ImUserFriend> {
      * @return List<ImUserWrapper.ImUserFriend>
      */
     List<ImUserWrapper.ImUserFriend> findUserAllImFriendInfo(ClientEnum clientType, Long userId, Map<String, Object> paramMap);
+
+    void delFriendByTenantId(Long tenantId, Long userId);
 }
 

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

@@ -391,5 +391,15 @@ public class ImUserFriendServiceImpl extends ServiceImpl<ImUserFriendDao, ImUser
 
         return userFriends;
     }
+
+    /**
+     * 删除机构下的好友
+     * @param tenantId 机构ID
+     * @param userId 用户ID
+     */
+    @Override
+    public void delFriendByTenantId(Long tenantId, Long userId) {
+        this.baseMapper.delFriendByTenantId(tenantId, userId);
+    }
 }
 

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

@@ -9,10 +9,12 @@ import java.util.stream.Collectors;
 import javax.annotation.Resource;
 
 import com.google.common.collect.Lists;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
-import com.yonge.cooleshow.biz.dal.service.SubjectService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.StatGroupWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
+import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -36,30 +38,11 @@ import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 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.Student;
-import com.yonge.cooleshow.biz.dal.entity.StudentStar;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
-import com.yonge.cooleshow.biz.dal.entity.Teacher;
-import com.yonge.cooleshow.biz.dal.entity.TeacherAuthMusicianRecord;
-import com.yonge.cooleshow.biz.dal.entity.TeacherStyleVideo;
-import com.yonge.cooleshow.biz.dal.entity.TeacherTotal;
-import com.yonge.cooleshow.biz.dal.entity.UserAccount;
 import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTagEnum;
 import com.yonge.cooleshow.biz.dal.enums.TeacherTypeEnum;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.StudentStarService;
-import com.yonge.cooleshow.biz.dal.service.SysConfigService;
-import com.yonge.cooleshow.biz.dal.service.SysMessageService;
-import com.yonge.cooleshow.biz.dal.service.TeacherAuthEntryRecordService;
-import com.yonge.cooleshow.biz.dal.service.TeacherAuthMusicianRecordService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
-import com.yonge.cooleshow.biz.dal.service.TeacherStyleVideoService;
-import com.yonge.cooleshow.biz.dal.service.TeacherTotalService;
-import com.yonge.cooleshow.biz.dal.service.UserAccountService;
-import com.yonge.cooleshow.biz.dal.service.UserFirstTimeService;
 import com.yonge.cooleshow.biz.dal.vo.HotTeacherVo;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.vo.TeacherAuthEntryRecordVo;
@@ -120,6 +103,18 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+
     @Override
     public TeacherVo detail(Long userId) {
         TeacherVo detail = baseMapper.detail(userId);
@@ -167,6 +162,19 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             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);
     }
 
@@ -384,6 +392,26 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                         .eq(Teacher::getUserId, teacher.getUserId())
                 );
             }
+
+            // 机构发生变化
+            if (!teacher.getTenantId().equals(teacherSubmitReq.getTenantId())) {
+                // 老师建立的班级群解散,并解除好友关系
+                List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                        .eq(ImGroupMember::getIsAdmin,true)
+                        .eq(ImGroupMember::getUserId, teacher.getUserId()).list();
+                if (!groupMembers.isEmpty()) {
+                    List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId).distinct()
+                            .collect(Collectors.toList());
+                    groupIdList.forEach(next -> {
+                        try {
+                            imGroupService.dismiss(next);
+                        } catch (Exception e) {
+                            log.error("解散群聊失败,", e);
+                        }
+                    });
+                    imUserFriendService.delFriendByTenantId(teacher.getTenantId(), teacher.getUserId());
+                }
+            }
         }
 
         return teacher;
@@ -446,6 +474,12 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         teacher.setMusicianDate(null);
         teacher.setIsSettlement(teacherSubmitReq.getIsSettlement());
         teacher.setIsTestUser(teacherSubmitReq.getIsTestUser());
+        teacher.setTenantId(teacherSubmitReq.getTenantId() == null ? -1L : teacherSubmitReq.getTenantId());
+        if (teacher.getTenantId() == -1L) {
+            teacher.setSettlementFrom(ESettlementFrom.TEACHER);
+        } else {
+            teacher.setSettlementFrom(teacherSubmitReq.getSettlementFrom());
+        }
         if (StringUtil.isEmpty(teacherSubmitReq.getTeacherType())) {
             return teacher;
         }
@@ -647,6 +681,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     }
 
 
+    @Override
     public IPage<MyFens> queryMyFans(IPage<MyFens> page, Long teacherId) {
         List<MyFens> teacherVos = baseMapper.queryMyFans(page, TeacherQueryInfo.FansQuery.builder().teacherId(teacherId).build());
         return page.setRecords(teacherVos);

+ 8 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/StudentVo.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
@@ -17,6 +18,7 @@ import com.yonge.cooleshow.common.enums.YesOrNoEnum;
  * @Author: liweifan
  * @Data: 2022/3/24 17:22
  */
+@Data
 @ApiModel(value = "StudentVo对象", description = "学生表")
 public class StudentVo extends Student {
     @ApiModelProperty("头像地址")
@@ -54,6 +56,12 @@ public class StudentVo extends Student {
     @ApiModelProperty(value = "用户状态 NORMAL-正常   LOCKED-冻结  CLOSED-关闭")
     private UserStatusEnum userStatus;
 
+    @ApiModelProperty(value = "机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty(value = "机构名称")
+    private String tenantName;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }

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

@@ -11,6 +11,7 @@ import com.yonge.cooleshow.common.enums.YesOrNoEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
+import lombok.Data;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.util.Date;
@@ -20,6 +21,7 @@ import java.util.List;
  * @Author: liweifan
  * @Data: 2022/3/22 10:10
  */
+@Data
 @ApiModel(value = "TeacherVo对象", description = "教师详情")
 public class TeacherVo extends Teacher {
     private static final long serialVersionUID = 1L;
@@ -83,6 +85,15 @@ public class TeacherVo extends Teacher {
     @ApiModelProperty("学生数")
     private Integer studentNums;
 
+    @ApiModelProperty("机构ID")
+    private Long tenantId;
+
+    @ApiModelProperty("机构名称")
+    private String tenantName;
+
+    @ApiModelProperty("结算方式")
+    private String settlementFrom;
+
     public YesOrNoEnum getDelFlag() {
         return delFlag;
     }

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

@@ -27,4 +27,15 @@
     <select id="findByUserIdAndFriendId" resultMap="BaseResultMap">
         SELECT <include refid="Base_Column_List"/> FROM im_user_friend WHERE user_id_ = #{userId} AND friend_id_ = #{friendId} LIMIT 1
     </select>
+
+    <delete id="delFriendByTenantId">
+        DELETE t1
+        FROM im_user_friend t1
+                 LEFT JOIN teacher t2 ON (
+                    t2.tenant_id_ = #{tenantId} AND
+                    (t1.user_id_ = t2.user_id_ OR t1.friend_id_ = t2.user_id_)
+            )
+        WHERE t1.user_id_ = #{userId}
+           OR t1.friend_id_ = #{userId}
+    </delete>
 </mapper>

+ 12 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -52,9 +52,11 @@
             (
             SELECT GROUP_CONCAT(name_ ORDER by locate(id_,t.subject_id_)) FROM subject WHERE FIND_IN_SET(id_,t.subject_id_)
             ) as subjectName,
-            u.user_type_ as userType
+            u.user_type_ as userType,
+            (case when t.tenant_id_ = -1 then '平台学生' else ti.name_ end) as tenantName
         FROM student t
         left join sys_user u on t.user_id_ = u.id_
+        left join tenant_info ti on ti.id_ = t.tenant_id_
         where u.del_flag_ = 0 and t.user_id_ = #{userId}
     </select>
     <select id="detailByPhone" resultType="com.yonge.cooleshow.biz.dal.vo.StudentVo">
@@ -95,9 +97,11 @@
             (!isnull(membership_end_time_) and membership_end_time_ > now()) as isVip,
             (
             SELECT GROUP_CONCAT(name_ ORDER by locate(id_,t.subject_id_)) FROM subject WHERE FIND_IN_SET(id_,t.subject_id_)
-            ) as subjectName
+            ) as subjectName,
+            (case when t.tenant_id_ = -1 then '平台学生' else ti.name_ end) as tenantName
         FROM student t
         left join sys_user u on t.user_id_ = u.id_
+        left join tenant_info ti on t.tenant_id_ = ti.id_
         <where>
             <if test="null != param.search and '' != param.search">
                 AND (
@@ -148,6 +152,12 @@
             <if test="param.hideFlag != null">
                 and t.hide_flag_ = #{param.hideFlag}
             </if>
+            <if test="param.tenantId != null">
+                and t.tenant_id_ = #{param.tenantId}
+            </if>
+            <if test="param.tenantName != null and param.tenantName.trim() != ''">
+                and te.name_ like concat('%',#{param.tenantName},'%')
+            </if>
         </where>
         order by t.create_time_ desc
     </select>

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

@@ -103,12 +103,14 @@
 <!--            t.tag_ tag,-->
             u.del_flag_ as delFlag,
             (case when isnull(u.id_card_no_) then 0 else 1 end) as isReal,
-            (case when isnull(b.user_id_) then 0 else 1 end) as isBank
+            (case when isnull(b.user_id_) then 0 else 1 end) as isBank,
+            (case when t.tenant_id_ = -1 then '平台老师' else ti.name_ end) as tenantName
         FROM teacher t
         left join sys_user u on t.user_id_ = u.id_
         left join (
             select distinct user_id_ from user_bank_card where del_flag_ = 0
         ) b on t.user_id_ = b.user_id_
+        left join tenant_info ti on t.tenant_id_ = ti.id_
         <where>
             <if test="null != param.search and '' != param.search">
                 AND (
@@ -170,6 +172,15 @@
             <if test="param.evaluateFlag != null">
                 AND t.evaluate_time_ > 0
             </if>
+            <if test="param.tenantId ! =null">
+                AND t.tenantId_ = #{param.tenantId}
+            </if>
+            <if test="param.settlementFrom ! =null and param.settlementFrom.trim() != ''">
+                AND t.settlement_from_ = #{param.settlementFrom}
+            </if>
+            <if test="param.tenantName != null and param.tenantName.trim() != ''">
+                and te.name_ like concat('%',#{param.tenantName},'%')
+            </if>
         </where>
         order by t.create_time_ desc
     </select>