Forráskód Böngészése

Merge branch 'feature/1204-tenant' into develop-new

yuanliang 1 éve
szülő
commit
4c0f6dc870
14 módosított fájl, 247 hozzáadás és 9 törlés
  1. 36 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantActivationCodeController.java
  2. 84 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantGroupController.java
  3. 20 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/vo/TenantActivationCodeVo.java
  4. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java
  5. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantBindRecordMapper.java
  6. 31 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/StudentServiceImpl.java
  7. 38 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  8. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantGroupServiceImpl.java
  9. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantUnbindRecordServiceImpl.java
  10. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java
  11. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupWrapper.java
  12. 3 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml
  13. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantAlbumPurchaseMapper.xml
  14. 10 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantBindRecordMapper.xml

+ 36 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantActivationCodeController.java

@@ -2,12 +2,16 @@ package com.yonge.cooleshow.admin.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.biz.dal.entity.TenantActivationCode;
 import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.service.TenantActivationCodeService;
 import com.yonge.cooleshow.biz.dal.service.TenantAlbumPurchaseService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantActivationCodeWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import com.yonge.cooleshow.tenant.vo.TenantActivationCodeVo;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.mybatis.support.PageUtil;
@@ -16,10 +20,12 @@ import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
 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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 
@@ -36,9 +42,12 @@ public class TenantActivationCodeController extends BaseController {
     @Autowired
     private TenantAlbumPurchaseService tenantAlbumPurchaseService;
 
+    @Autowired
+    private TenantInfoService tenantInfoService;
 
     @ApiOperation(value = "查询分页", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCodeQuery")
     @PostMapping("/page")
+    @PreAuthorize("@pcs.hasPermissions('tenantActivationCode/page')")
     public HttpResponseResult<PageInfo<TenantActivationCodeWrapper.TenantActivationCode>> page(
             @RequestBody TenantActivationCodeWrapper.TenantActivationCodeQuery query) {
 
@@ -64,4 +73,31 @@ public class TenantActivationCodeController extends BaseController {
         return succeed(pageInfo);
     }
 
+    @ApiOperation(value = "激活码发放", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCodeSend")
+    @PostMapping("/send")
+    @PreAuthorize("@pcs.hasPermissions('tenantActivationCode/send')")
+    public HttpResponseResult<Boolean> send(@Validated @RequestBody TenantActivationCodeVo.TenantActivationCodeSend send) {
+        tenantActivationCodeService.sendActivationCode(send.getTenantId(), send.getTenantAlbumPurchaseId(),
+                send.getActivationCodeList(),
+                send.getStudentIdList());
+        return succeed();
+    }
+
+    @ApiOperation(value = "激活码重发", notes = "机构激活码- 传入 TenantActivationCodeVo.TenantActivationCodeSend")
+    @PostMapping("/resend")
+    @PreAuthorize("@pcs.hasPermissions('tenantActivationCode/resend')")
+    public HttpResponseResult<Boolean> resend(@Validated @RequestBody TenantActivationCodeVo.TenantActivationCodeResend send) {
+        tenantActivationCodeService.resend(send.getCode(), send.getUserId(), send.getTenantId(), send.getTenantAlbumPurchaseId());
+        return succeed();
+    }
+
+    @ApiOperation(value = "激活码发放取消", notes = "传入 激活码的ID")
+    @PostMapping("/sendCancel")
+    @PreAuthorize("@pcs.hasPermissions('tenantActivationCode/sendCancel')")
+    public HttpResponseResult<Boolean> sendCancel(@Validated @RequestBody TenantActivationCodeVo.CodeSend codeSend) {
+        TenantActivationCode activationCode = tenantActivationCodeService.getById(codeSend.getId());
+        TenantInfo tenantInfo = tenantInfoService.getById(codeSend.getTenantId());
+        tenantActivationCodeService.sendCancel(tenantInfo, activationCode);
+        return succeed();
+    }
 }

+ 84 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/TenantGroupController.java

@@ -1,21 +1,39 @@
 package com.yonge.cooleshow.admin.controller;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.microsvc.toolkit.common.response.paging.PageInfo;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.microsvc.toolkit.common.response.template.R;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+import com.yonge.cooleshow.biz.dal.entity.TenantGroup;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.TenantGroupService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantGroupWrapper;
+import com.yonge.cooleshow.tenant.vo.TenantGroupVo;
+import com.yonge.toolset.base.exception.BizException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 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.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.stream.Collectors;
+
 @Slf4j
 @Validated
 @RestController
@@ -26,6 +44,12 @@ public class TenantGroupController {
     @Autowired
     private TenantGroupService tenantGroupService;
 
+    @Resource
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
     @ApiOperation(value = "查询分页", notes = "机构小组表- 传入 TenantGroupWrapper.TenantGroupQuery")
     @PreAuthorize("@pcs.hasPermissions('tenantGroup/page', {'BACKEND'})")
     @PostMapping("/page")
@@ -40,4 +64,64 @@ public class TenantGroupController {
         return R.from(tenantGroupService.adjustTenantGroup(adjustTenantGroup));
     }
 
+    @ApiOperation(value = "详情", notes = "机构小组表-根据详情ID查询单条, 传入id")
+    @GetMapping("/detail/{id}")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroup/detail')")
+    public R<TenantGroupWrapper.TenantGroup> detail(@PathVariable("id") Long id) {
+        TenantGroup wrapper = tenantGroupService.detail(id);
+        if (wrapper == null) {
+            return R.from(new TenantGroupWrapper.TenantGroup());
+        }
+        TenantGroupWrapper.TenantGroup group = TenantGroupWrapper.TenantGroup.from(JSON.toJSONString(wrapper));
+        group.setImGroupExist(false);
+        if (StringUtils.isNotEmpty(wrapper.getImGroupId())) {
+            ImGroup imGroup = imGroupService.getById(wrapper.getImGroupId());
+            if (imGroup != null) {
+                group.setImGroupExist(true);
+            }
+        }
+        List<TenantGroupWrapper.TenantGroupMember> members =
+                tenantGroupService.queryGroupMember(wrapper.getTenantId(), id);
+        List<Long> userIds = members.stream().map(TenantGroupWrapper.TenantGroupMember::getUserId)
+                .collect(Collectors.toList());
+        group.setUserIds(userIds);
+        group.setGroupUserCount(members.size());
+        group.setUserList(members);
+        return R.from(group);
+    }
+
+    @ApiOperation(value = "新增", notes = "机构小组表- 传入 TenantGroupWrapper.TenantGroup")
+    @PostMapping("/save")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroup/add')")
+    public R<JSONObject> add(@Validated @RequestBody TenantGroupVo.TenantGroup tenantGroup) {
+        Long tenantId = tenantGroup.getTenantId();
+        if (tenantId == null) {
+            throw new BizException("机构ID不能为空");
+        }
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        TenantGroupWrapper.TenantGroup group = TenantGroupWrapper.TenantGroup.from(tenantGroup.jsonString());
+        group.setCreateBy(sysUser.getId());
+        // 新增数据
+        tenantGroupService.add(group, tenantGroup.getImGroupCreate());
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "修改", notes = "机构小组表- 传入 TenantGroupWrapper.TenantGroup")
+    @PostMapping("/update")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroup/update')")
+    public R<JSONObject> update(@Validated @RequestBody TenantGroupVo.TenantGroup tenantGroup) {
+        // 更新数据
+        tenantGroupService.update(TenantGroupWrapper.TenantGroup.from(tenantGroup.jsonString()), tenantGroup.getImGroupCreate());
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "删除", notes = "机构小组表- 传入id")
+    @PostMapping("/remove")
+    @PreAuthorize("@pcs.hasPermissions('tenantGroup/detail')")
+    public R<Boolean> remove(@RequestParam Long id) {
+
+        return R.from(tenantGroupService.delete(id));
+    }
 }

+ 20 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/tenant/vo/TenantActivationCodeVo.java

@@ -27,6 +27,9 @@ public class TenantActivationCodeVo {
         @NotNull(message = "专辑购买记录的ID不能为空")
         private Long tenantAlbumPurchaseId;
 
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
         @ApiModelProperty("激活码列表,批量发送时为空")
         private List<String> activationCodeList = new ArrayList<>();
 
@@ -45,6 +48,9 @@ public class TenantActivationCodeVo {
         @NotNull(message = "专辑购买记录的ID不能为空")
         private Long tenantAlbumPurchaseId;
 
+        @ApiModelProperty("结构ID")
+        private Long tenantId;
+
         @ApiModelProperty("激活码")
         @NotBlank(message = "激活码不能为空")
         private String code;
@@ -117,4 +123,18 @@ public class TenantActivationCodeVo {
         }
     }
 
+    @Data
+    @ApiModel("激活码发放")
+    public static class CodeSend {
+
+        @ApiModelProperty("机构ID")
+        @NotNull
+        private Long tenantId;
+
+        @ApiModelProperty("激活码ID")
+        @NotNull
+        private Long id;
+
+    }
+
 }

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/enums/MessageTypeEnum.java

@@ -131,6 +131,8 @@ public enum MessageTypeEnum implements BaseEnum<String, MessageTypeEnum> {
     TENANT_MUSIC_BUY("购买曲目"),
     TENANT_STUDENT_CHANGE("机构变更"),
     ADD_COOPERATE_TENANT("添加合作机构"),
+    TEACHER_BIND_TENANT("老师绑定机构"),
+    TEACHER_UNBIND_TENANT("老师解绑机构"),
     ;
 
     MessageTypeEnum(String msg) {

+ 1 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantBindRecordMapper.java

@@ -25,4 +25,5 @@ public interface UserTenantBindRecordMapper extends BaseMapper<UserTenantBindRec
     List<UserTenantBindRecordWrapper.UserTenantBindRecord> selectPage(@Param("page") IPage<UserTenantBindRecordWrapper.UserTenantBindRecord> page,
                                                                       @Param("param") UserTenantBindRecordWrapper.UserTenantBindRecordQuery param);
 
+    void add(@Param("record") UserTenantBindRecord record);
 }

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

@@ -25,6 +25,7 @@ import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantAlbumRefMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
+import com.yonge.cooleshow.biz.dal.mapper.UserTenantBindRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.service.im.ImGroupCoreService;
 import com.yonge.cooleshow.biz.dal.vo.MyFollow;
@@ -125,6 +126,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
     @Autowired
     private TenantGroupMapper tenantGroupMapper;
 
+    @Autowired
+    private UserTenantBindRecordMapper userTenantBindRecordMapper;
     @Override
     public StudentVo detail(Long userId) {
         return baseMapper.detail(userId);
@@ -582,6 +585,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
 //             删除好友
             imUserFriendService.delTeacherFriendByTenantId(student.getTenantId(), student.getUserId(),
                     ClientEnum.STUDENT.getCode());
+            addBindUnBindRecord(student.getUserId(),student.getTenantId(),false);
         }
         if (toTenantId != null && toTenantId != -1L) {
             // 加好友
@@ -593,6 +597,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 studentIds.add(student.getUserId());
                 imUserFriendService.saveUserFriend(teacher.getUserId(), studentIds);
             }
+            addBindUnBindRecord(student.getUserId(),student.getTenantId(),true);
         }
         this.lambdaUpdate().set(Student::getTenantId, toTenantId)
                 .set(Student::getTenantGroupId, -1L)
@@ -672,6 +677,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             imUserFriendService.delTeacherFriendByTenantId(student.getTenantId(), student.getUserId(),
                     ClientEnum.STUDENT.getCode());
 
+            addBindUnBindRecord(student.getUserId(),student.getTenantId(),false);
+
             // 加好友
             QueryWrapper<Teacher> query = new QueryWrapper<>();
             query.lambda().eq(Teacher::getTenantId, newTenantId);
@@ -682,6 +689,7 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
                 imUserFriendService.saveUserFriend(teacher.getUserId(), studentIds);
             }
 
+            addBindUnBindRecord(student.getUserId(),studentInfo.getTenantId(),true);
             sendStudentTenantChange(student,newTenantId);
         }
 
@@ -837,6 +845,8 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
             List<Teacher> teacherList = teacherDao.selectList(queryWrapper);
             teacherList.forEach(next -> imUserFriendService.saveUserFriend(next.getUserId(),
                     new HashSet<>(ImmutableList.of(sysUser.getId()))));
+
+            addBindUnBindRecord(student.getUserId(), student.getTenantId(), true);
         }
 
         //  与随机一个客服建立好友
@@ -938,4 +948,25 @@ public class StudentServiceImpl extends ServiceImpl<StudentDao, Student> impleme
         }
     }
 
+    private void addBindUnBindRecord(Long studentId, Long tenantId, Boolean bind) {
+        UserTenantBindRecord bindRecord = new UserTenantBindRecord();
+        bindRecord.setUserId(studentId);
+        bindRecord.setUserType("STUDENT");
+        bindRecord.setTenantId(tenantId);
+        bindRecord.setBindStatus(bind);
+        bindRecord.setBindTime(new Date());
+        userTenantBindRecordMapper.add(bindRecord);
+
+        SysUser sysUser = sysUserMapper.getByUserId(studentId);
+        sendBindUnBindSMS(studentId, sysUser.getPhone(), Boolean.TRUE.equals(bind) ? MessageTypeEnum.TEACHER_BIND_TENANT : MessageTypeEnum.TEACHER_UNBIND_TENANT, tenantId);
+    }
+
+    private void sendBindUnBindSMS(Long userId, String phone, MessageTypeEnum messageType, Long tenantId) {
+        TenantInfo tenantInfo = tenantInfoService.getById(tenantId);
+        Map<Long, String> receivers = new HashMap<>();
+        receivers.put(userId, phone);
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, messageType,
+                receivers, null, 0, null, ClientEnum.SYSTEM.getCode(), tenantInfo.getName());
+    }
+
 }

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

@@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.microsvc.toolkit.middleware.rtc.enums.EDeviceMessageType;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
@@ -26,6 +27,7 @@ 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.mapper.TenantGroupMapper;
+import com.yonge.cooleshow.biz.dal.mapper.UserTenantBindRecordMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
@@ -203,6 +205,9 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Autowired
     private TenantGroupMapper tenantGroupMapper;
 
+    @Autowired
+    private UserTenantBindRecordMapper userTenantBindRecordMapper;
+
 
     @Override
     public TeacherDao getDao() {
@@ -500,6 +505,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                     .map(Student::getUserId).collect(Collectors.toSet());
 
             imUserFriendService.saveUserFriend(teacher.getUserId(), collect);
+
+            // 机构老师添加机构绑定记录
+            addBindUnBindRecord(teacher.getUserId(),teacher.getTenantId(),true);
+            sendBindUnBindSMS(teacher.getUserId(), teacherSubmitReq.getPhone(), MessageTypeEnum.TEACHER_BIND_TENANT, teacher.getTenantId());
         }
         //  与客服建立好友
         String customerService = customerServiceConfig.getCustomerService();
@@ -1095,21 +1104,23 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                 });
             }
             // 删除好友关系
-            imUserFriendService.delStudentFriendByTenantId(teacher.getTenantId(), teacher.getUserId(),ClientEnum.TEACHER.getCode());
+            imUserFriendService.delStudentFriendByTenantId(teacher.getTenantId(), teacher.getUserId(), ClientEnum.TEACHER.getCode());
+            addBindUnBindRecord(teacher.getUserId(), teacher.getTenantId(), false);
+            SysUser sysUser = sysUserMapper.getByUserId(teacher.getUserId());
+            sendBindUnBindSMS(teacher.getUserId(), sysUser.getPhone(), MessageTypeEnum.TEACHER_UNBIND_TENANT, teacher.getTenantId());
 
         }
 
-        if (updateTenant.getTenantId().equals(-1L)) {
+        long tenantId = Optional.ofNullable(updateTenant.getTenantId()).orElse(-1L);
+        if (tenantId == -1L) {
             // 平台老师处理流程
             if (ESettlementFrom.TENANT.equals(teacher.getSettlementFrom())) {
                 // 解绑后,结算方式如果是机构,默认调整为老师
                 teacher.setSettlementFrom(ESettlementFrom.TEACHER);
                 teacher.setIsSettlement(true);
             }
-        }
-
-        // 机构老师与学生互加好友关系
-        if (Optional.ofNullable(updateTenant.getTenantId()).orElse(-1L) > 0) {
+        }else {
+            // 机构老师与学生互加好友关系
             // 自动与机构学生成为好友
             Set<Long> collect = studentService.lambdaQuery()
                     .eq(Student::getTenantId, updateTenant.getTenantId()).list().stream()
@@ -1119,6 +1130,9 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             if (!collect.isEmpty()) {
                 imUserFriendService.saveUserFriend(teacher.getUserId(), collect);
             }
+            addBindUnBindRecord(teacher.getUserId(),updateTenant.getTenantId(),true);
+            SysUser sysUser = sysUserMapper.getByUserId(teacher.getUserId());
+            sendBindUnBindSMS(teacher.getUserId(), sysUser.getPhone(), MessageTypeEnum.TEACHER_BIND_TENANT, updateTenant.getTenantId());
         }
 
         teacher.setTenantId(updateTenant.getTenantId());
@@ -1199,4 +1213,22 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
         return teachers.stream().collect(Collectors.toMap(Teacher::getUserId, o -> o, (o, n) -> n));
     }
+
+    private void addBindUnBindRecord(Long teacherId, Long tenantId, Boolean bind) {
+        UserTenantBindRecord bindRecord = new UserTenantBindRecord();
+        bindRecord.setUserId(teacherId);
+        bindRecord.setUserType("TEACHER");
+        bindRecord.setTenantId(tenantId);
+        bindRecord.setBindStatus(bind);
+        bindRecord.setBindTime(new Date());
+        userTenantBindRecordMapper.add(bindRecord);
+    }
+
+    private void sendBindUnBindSMS(Long userId, String phone, MessageTypeEnum messageType, Long tenantId) {
+        TenantInfo tenantInfo = tenantInfoService.getById(tenantId);
+        Map<Long, String> receivers = new HashMap<>();
+        receivers.put(userId, phone);
+        sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.AWSMS, messageType,
+                receivers, null, 0, null, ClientEnum.SYSTEM.getCode(), tenantInfo.getName());
+    }
 }

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

@@ -109,10 +109,13 @@ public class TenantGroupServiceImpl extends ServiceImpl<TenantGroupMapper, Tenan
                         .list().stream().map(ImGroup::getId).collect(Collectors.toList());
                 existImgGroupIds.addAll(imgGroupIds);
             }
+            List<Long> adminIdList = records.stream().map(TenantGroupWrapper.TenantGroup::getAdminId).distinct().collect(Collectors.toList());
+            Map<Long, com.yonge.cooleshow.biz.dal.entity.SysUser> mapByIds = sysUserService.getMapByIds(adminIdList);
 
             for (TenantGroupWrapper.TenantGroup record : records) {
                 record.setGroupUserCount(groupBy.getOrDefault(record.getId(), 0));
                 record.setImGroupExist(existImgGroupIds.contains(record.getImGroupId()));
+                record.setAdminName(mapByIds.get(record.getAdminId()).getUsername());
             }
         }
         return iPage;

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

@@ -19,6 +19,7 @@ import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysAreaMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantGroupMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantUnbindRecordMapper;
+import com.yonge.cooleshow.biz.dal.mapper.UserTenantBindRecordMapper;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindRecordWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
@@ -93,6 +94,9 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
     @Autowired
     private ImGroupMemberService imGroupMemberService;
 
+    @Autowired
+    private UserTenantBindRecordMapper userTenantBindRecordMapper;
+
     /**
      * @param id 详情ID
      * @return TenantUnbindRecord
@@ -270,6 +274,14 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
                     .set(ESettlementFrom.TENANT.equals(teacher.getSettlementFrom()), Teacher::getSettlementFrom,
                             ESettlementFrom.TEACHER)
                     .set(Teacher::getTenantId, -1L));
+
+            UserTenantBindRecord bindRecord = new UserTenantBindRecord();
+            bindRecord.setUserId(unbindRecord.getUserId());
+            bindRecord.setUserType("TEACHER");
+            bindRecord.setTenantId(tenantId);
+            bindRecord.setBindStatus(false);
+            bindRecord.setBindTime(new Date());
+            userTenantBindRecordMapper.add(bindRecord);
         }
 
         // 添加历史记录

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantActivationCodeWrapper.java

@@ -76,6 +76,9 @@ public class TenantActivationCodeWrapper {
         @ApiModelProperty("订单号 订单详情专用")
         private String orderNo;
 
+        @ApiModelProperty("激活码")
+        private String activationCode;
+
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
         }

+ 3 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantGroupWrapper.java

@@ -78,6 +78,9 @@ public class TenantGroupWrapper {
         @ApiModelProperty("管理员ID")
         private Long adminId;
 
+        @ApiModelProperty("管理员名称")
+        private String adminName;
+
         @ApiModelProperty("IM群聊ID")
         private String imGroupId;
 

+ 3 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantActivationCodeMapper.xml

@@ -66,6 +66,9 @@
             <if test="param.tenantGroupId != null">
                 and st.tenant_group_id_ = #{param.tenantGroupId}
             </if>
+            <if test="param.activationCode != null and param.activationCode.trim() != ''">
+                AND t.activation_code_ like concat('%',#{param.activationCode},'%')
+            </if>
         </where>
         order by t.activation_status_ asc, t.id_ desc
     </select>

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

@@ -31,7 +31,7 @@
         <where>
             <if test="param.keyword != null and param.keyword.trim() != ''">
                 AND (ta.name_ like concat('%',#{param.keyword},'%')
-                or t.purchase_quantity_ = #{param.keyword}
+                or t.purchase_quantity_ like concat('%',#{param.keyword},'%')
                 )
             </if>
             <if test="param.tenantId != null">

+ 10 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantBindRecordMapper.xml

@@ -81,8 +81,16 @@
                 AND st.subject_id_ = #{param.subjectId}
             </if>
         </where>
-        group by t.user_id_
-        order by t.bind_time_ desc
+        <if test="param.userType == 'TEACHER'">
+            group by t.user_id_
+        </if>
+        order by field(t.bind_status_,1,0) ,t.bind_time_ desc
     </select>
 
+    <insert id="add">
+        INSERT INTO user_tenant_bind_record(user_id_, user_type_, tenant_id_, bind_status_, bind_time_)
+        VALUES (#{record.userId}, #{record.userType}, #{record.tenantId}, #{record.bindStatus}, #{record.bindTime})
+        ON DUPLICATE KEY UPDATE bind_status_ = VALUES(bind_status_),
+                                bind_time_   = VALUES(bind_time_)
+    </insert>
 </mapper>