Browse Source

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

# Conflicts:
#	pom.xml
zouxuan 1 year ago
parent
commit
de8b348edd
54 changed files with 1298 additions and 202 deletions
  1. 11 3
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  2. 5 0
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java
  3. 3 1
      cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ETenantUnBindAuditStatus.java
  4. 8 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TeacherController.java
  5. 3 2
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantAlbumController.java
  6. 38 0
      cooleshow-user/user-admin/src/main/java/com/yonge/cooleshow/admin/controller/TenantUnbindHistoryController.java
  7. 76 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantUnbindHistory.java
  8. 18 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantUnbindRecord.java
  9. 27 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantUnbindHistoryMapper.java
  10. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantUnbindRecordMapper.java
  11. 7 2
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java
  12. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TeacherService.java
  13. 5 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantInfoService.java
  14. 43 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantUnbindHistoryService.java
  15. 9 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantUnbindRecordService.java
  16. 2 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java
  17. 2 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ActivityPlanServiceImpl.java
  18. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseGroupServiceImpl.java
  19. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/CourseScheduleServiceImpl.java
  20. 12 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupServiceImpl.java
  21. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MemberPriceSettingsServiceImpl.java
  22. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  23. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/PianoRoomBuyRecordServiceImpl.java
  24. 90 27
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TeacherServiceImpl.java
  25. 2 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantActivationCodeServiceImpl.java
  26. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantAlbumServiceImpl.java
  27. 58 5
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantInfoServiceImpl.java
  28. 66 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantUnbindHistoryServiceImpl.java
  29. 86 54
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/TenantUnbindRecordServiceImpl.java
  30. 3 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserOrderServiceImpl.java
  31. 97 8
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java
  32. 1 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/VideoLessonPurchaseRecordServiceImpl.java
  33. 12 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java
  34. 69 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantUnbindHistoryWrapper.java
  35. 25 6
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantUnbindRecordWrapper.java
  36. 16 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java
  37. 1 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupWrapper.java
  38. 17 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/teacher/TeacherWrapper.java
  39. 10 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml
  40. 1 1
      cooleshow-user/user-biz/src/main/resources/config/mybatis/SysUserMapper.xml
  41. 12 5
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TeacherMapper.xml
  42. 29 0
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindHistoryMapper.xml
  43. 11 4
      cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindRecordMapper.xml
  44. 32 2
      cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml
  45. 5 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TenantActivationCodeController.java
  46. 88 0
      cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserTenantAlbumRecordController.java
  47. 59 7
      cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java
  48. 23 9
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java
  49. 0 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumPurchaseController.java
  50. 90 26
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantInfoController.java
  51. 17 11
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantUnbindRecordController.java
  52. 57 1
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java
  53. 41 0
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/io/request/SysUserWrapper.java
  54. 0 9
      cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/io/request/TenantInfoVo.java

+ 11 - 3
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java

@@ -4,6 +4,7 @@ import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
 import com.yonge.cooleshow.auth.api.dto.UpdatePasswordDto;
 import com.yonge.cooleshow.auth.api.dto.UserSetReq;
+import com.yonge.cooleshow.auth.api.entity.SysConfig;
 import com.yonge.cooleshow.auth.api.entity.SysRole;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.vo.UserSetVo;
@@ -50,9 +51,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.text.MessageFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
+import java.util.*;
 
 @RestController()
 @RequestMapping("user")
@@ -666,4 +665,13 @@ public class UserController extends BaseController {
     public HttpResponseResult<List<SysUser>> page(@RequestBody SysUserQueryInfo queryInfo) {
         return succeed(sysUserService.queryEmployeeList(queryInfo));
     }
+
+    @ApiOperation(value = "获取配置的客服电话和邮箱")
+    @PostMapping(value = "/queryConfig")
+    public HttpResponseResult<Map<String,String>> queryConfig() {
+        Map<String,String> result = new HashMap<>(2);
+        result.put("customerServiceEmail",sysConfigService.findConfigValue("customer_service_email"));
+        result.put("customerServicePhone",sysConfigService.findConfigValue("customer_service_phone"));
+        return succeed(result);
+    }
 }

+ 5 - 0
cooleshow-common/src/main/java/com/yonge/cooleshow/common/constant/SysConfigConstant.java

@@ -384,4 +384,9 @@ public interface SysConfigConstant {
      *  子账户创建回调url
      */
     String SUB_ACCOUNT_CREATE_CALLBACK_URL = "sub_account_create_callback_url";
+
+    /**
+     * 机构默认logo
+     */
+    String TENANT_DEFAULT_HEAD = "tenant_default_head";
 }

+ 3 - 1
cooleshow-common/src/main/java/com/yonge/cooleshow/common/enums/ETenantUnBindAuditStatus.java

@@ -10,7 +10,9 @@ public enum ETenantUnBindAuditStatus implements BaseEnum<String, ETenantUnBindAu
 
     DOING("审核中"),
     PASS("审核通过"),
-    UNPASS("审核不通过");
+    UNPASS("审核不通过"),
+    CANCEL("撤销"),
+    CLOSE("关闭");
 
     @EnumValue
     private final String code;

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

@@ -169,6 +169,14 @@ public class TeacherController extends BaseController {
         return teacherService.submit(teacherSubmitReq);
     }
 
+    @PostMapping("/updateTenant")
+    @ApiOperation(value = "新增或修改", notes = "传入teacher")
+    @PreAuthorize("@pcs.hasPermissions('teacher/updateTenant')")
+    public HttpResponseResult<Boolean> updateTenant(@Valid @RequestBody TeacherWrapper.UpdateTenant updateTenant) {
+        teacherService.updateTenant(updateTenant);
+        return succeed();
+    }
+
     @ApiOperation(value = "老师列表导出")
     @PostMapping("export")
     @PreAuthorize("@pcs.hasPermissions('teacher/export')")

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

@@ -42,7 +42,7 @@ import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/tenantAlbum")
-@Api(value = "机构管理", tags = "机构管理")
+@Api(value = "机构专辑管理", tags = "机构专辑管理")
 public class TenantAlbumController {
     @Autowired
     TenantAlbumService tenantAlbumService;
@@ -126,7 +126,7 @@ public class TenantAlbumController {
             List<TenantAlbumWrapper.TenantAlbumSheet> tenantAlbumSheets = value.stream().map(next -> {
 
                 TenantAlbumWrapper.TenantAlbumSheet tenantAlbumSheet = new TenantAlbumWrapper.TenantAlbumSheet();
-                BeanUtils.copyProperties(value, tenantAlbumSheet);
+                BeanUtils.copyProperties(value.get(0), tenantAlbumSheet);
                 Long musicSheetId = tenantAlbumSheet.getMusicSheetId();
                 MusicSheetVo musicSheet = idMsMap.getOrDefault(musicSheetId, new MusicSheetVo());
                 tenantAlbumSheet.setMusicSheetName(musicSheet.getMusicSheetName());
@@ -137,6 +137,7 @@ public class TenantAlbumController {
 
             sheetData.setTenantAlbumSheetList(tenantAlbumSheets);
             musicSheetData.add(sheetData);
+            vo.setMusicSheetData(musicSheetData);
         });
 
         return HttpResponseResult.succeed(vo);

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

@@ -0,0 +1,38 @@
+package com.yonge.cooleshow.admin.controller;
+
+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.biz.dal.entity.TenantUnbindHistory;
+import com.yonge.cooleshow.biz.dal.service.TenantUnbindHistoryService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindHistoryWrapper;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+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;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/tenantUnbindHistory")
+@Api(tags = "机构解绑历史表")
+public class TenantUnbindHistoryController {
+
+    @Autowired
+    private TenantUnbindHistoryService tenantUnbindHistoryService;
+
+    @ApiOperation(value = "查询分页", notes = "机构解绑历史表- 传入 TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery")
+    @PostMapping("/page")
+    public R<PageInfo<TenantUnbindHistory>> page(@RequestBody TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery query) {
+
+        IPage<TenantUnbindHistory> pages = tenantUnbindHistoryService.selectPage(QueryInfo.getPage(query), query);
+
+        return R.from(QueryInfo.pageInfo(pages));
+    }
+}

+ 76 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantUnbindHistory.java

@@ -0,0 +1,76 @@
+package com.yonge.cooleshow.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 机构解绑历史表
+ * 2023-08-18 18:00:10
+ */
+@Data
+@ApiModel(" TenantUnbindHistory-机构解绑历史表")
+@TableName("tenant_unbind_history")
+public class TenantUnbindHistory implements Serializable {
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id_")
+    private Long id;
+
+    @ApiModelProperty("机构ID")
+    @TableField(value = "tenant_id_")
+    private Long tenantId;
+
+    @ApiModelProperty("机构名称")
+    @TableField(value = "tenant_name_")
+    private String tenantName;
+
+    @ApiModelProperty("用户ID")
+    @TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("用户名称")
+    @TableField(value = "user_name_")
+    private String userName;
+
+    @ApiModelProperty("手机号")
+    @TableField(value = "phone_")
+    private String phone;
+
+    @ApiModelProperty("用户类型")
+    @TableField(value = "user_type_")
+    private String userType;
+
+    @ApiModelProperty("解绑理由")
+    @TableField(value = "unbind_reason_")
+    private String unbindReason;
+
+    @ApiModelProperty("审核状态 CANCEL、撤销 PASS、通过 UNPASS、不通过")
+    @TableField(value = "status_")
+    private ETenantUnBindAuditStatus status;
+
+    @ApiModelProperty("审核人")
+    @TableField(value = "verify_user_id_")
+    private Long verifyUserId;
+
+    @ApiModelProperty("审核理由")
+    @TableField(value = "reason_")
+    private String reason;
+
+    @ApiModelProperty("后台介入时间")
+    @TableField(value = "intervene_time_")
+    private Date interveneTime;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 18 - 3
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/entity/TenantUnbindRecord.java

@@ -4,10 +4,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
-import lombok.Data;
-
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -15,7 +14,7 @@ import java.util.Date;
 
 /**
  * 机构解绑申请记录
- * 2023-07-21 17:32:49
+ * 2023-08-18 11:06:07
  */
 @Data
 @ApiModel(" TenantUnbindRecord-机构解绑申请记录")
@@ -30,14 +29,30 @@ public class TenantUnbindRecord implements Serializable {
     @TableField(value = "tenant_id_")
     private Long tenantId;
 
+    @ApiModelProperty("机构名称")
+    @TableField(value = "tenant_name_")
+    private String tenantName;
+
     @ApiModelProperty("用户ID")
     @TableField(value = "user_id_")
     private Long userId;
 
+    @ApiModelProperty("用户名称")
+    @TableField(value = "user_name_")
+    private String userName;
+
+    @ApiModelProperty("手机号")
+    @TableField(value = "phone_")
+    private String phone;
+
     @ApiModelProperty("用户类型")
     @TableField(value = "user_type_")
     private String userType;
 
+    @ApiModelProperty("声部名称")
+    @TableField(value = "subject_name_")
+    private String subjectName;
+
     @ApiModelProperty("解绑理由")
     @TableField(value = "unbind_reason_")
     private String unbindReason;

+ 27 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantUnbindHistoryMapper.java

@@ -0,0 +1,27 @@
+package com.yonge.cooleshow.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.yonge.cooleshow.biz.dal.entity.TenantUnbindHistory;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindHistoryWrapper;
+
+/**
+ * 机构解绑历史表
+ * 2023-08-18 18:00:10
+ */
+@Repository
+public interface TenantUnbindHistoryMapper extends BaseMapper<TenantUnbindHistory> {
+
+    /**
+     * 分页查询
+     * @param page IPage<TenantUnbindHistoryWrapper.TenantUnbindHistory>
+     * @param param TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery
+     * @return List<TenantUnbindHistoryWrapper.TenantUnbindHistory>
+     */
+    List<TenantUnbindHistory> selectPage(@Param("page") IPage<TenantUnbindHistory> page, @Param("param") TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery param);
+
+}

+ 2 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/TenantUnbindRecordMapper.java

@@ -26,4 +26,6 @@ public interface TenantUnbindRecordMapper extends BaseMapper<TenantUnbindRecord>
     List<TenantUnbindRecordWrapper.TenantUnbindRecord> selectPage(@Param("page") IPage<TenantUnbindRecordWrapper.TenantUnbindRecord> page,
                                                                   @Param("param") TenantUnbindRecordWrapper.TenantUnbindRecordQuery param);
 
+    List<TenantUnbindRecord> getRecord(@Param("tenantId") Long tenantId, @Param("userId") Long userId,
+                                 @Param("userType") String userType);
 }

+ 7 - 2
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/mapper/UserTenantAlbumRecordMapper.java

@@ -4,6 +4,8 @@ import java.util.List;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbum;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Repository;
 import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
@@ -22,6 +24,9 @@ public interface UserTenantAlbumRecordMapper extends BaseMapper<UserTenantAlbumR
 	 * @param param UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery
 	 * @return List<UserTenantAlbumRecordWrapper.UserTenantAlbumRecord>
 	 */
-	List<UserTenantAlbumRecord> selectPage(@Param("page") IPage<UserTenantAlbumRecord> page, @Param("param") UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery param);
-	
+	List<TenantAlbumWrapper.TenantAlbum> selectPage(@Param("page") IPage<UserTenantAlbumRecord> page, @Param("param") UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery param);
+
+	List<Long> selectTenantIds(@Param("id") Long id);
+
+	List<TenantAlbum> selectTenantAlbumInfo(@Param("tenantIds") List<Long> tenantIds);
 }

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

@@ -175,4 +175,6 @@ public interface TeacherService extends IService<Teacher> {
      * @return TeacherWrapper.TeacherStatInfo
      */
     TeacherWrapper.TeacherStatInfo findTeacherStatInfoById(Long userId);
+
+    void updateTenant(TeacherWrapper.UpdateTenant updateTenant);
 }

+ 5 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantInfoService.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
@@ -98,4 +99,8 @@ public interface TenantInfoService extends IService<TenantInfo>  {
     Boolean entry(TenantInfoWrapper.TenantInfoQuery query);
 
     TenantInfoWrapper.TenantInfo Infodetail(Long id);
+
+    Boolean updateTenantInfo(TenantInfo tenantInfo, Long tenantId);
+
+    Boolean updateSysUser(SysUser sysUser, Long id);
 }

+ 43 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantUnbindHistoryService.java

@@ -0,0 +1,43 @@
+package com.yonge.cooleshow.biz.dal.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindHistoryWrapper;
+import com.yonge.cooleshow.biz.dal.entity.TenantUnbindHistory;
+
+/**
+ * 机构解绑历史表
+ * 2023-08-18 18:00:10
+ */
+public interface TenantUnbindHistoryService extends IService<TenantUnbindHistory>  {
+
+    /**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantUnbindHistory
+     */
+    TenantUnbindHistory detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<TenantUnbindHistory>
+     * @param query TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery
+     * @return IPage<TenantUnbindHistory>
+     */
+    IPage<TenantUnbindHistory> selectPage(IPage<TenantUnbindHistory> page, TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery query);
+
+    /**
+     * 添加
+     * @param tenantUnbindHistory TenantUnbindHistoryWrapper.TenantUnbindHistory
+     * @return Boolean
+     */
+    Boolean add(TenantUnbindHistoryWrapper.TenantUnbindHistory tenantUnbindHistory);
+
+    /**
+     * 更新
+     * @param tenantUnbindHistory TenantUnbindHistoryWrapper.TenantUnbindHistory
+     * @return Boolean
+     */
+    Boolean update(TenantUnbindHistoryWrapper.TenantUnbindHistory tenantUnbindHistory);
+
+}

+ 9 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/TenantUnbindRecordService.java

@@ -53,4 +53,13 @@ public interface TenantUnbindRecordService extends IService<TenantUnbindRecord>
      * @param intervene    true:后台审核,false:机构管理员
      */
     void tenantUserUnbindAudit(TenantUnbindRecordWrapper.Audio audio, Long verifyUserId, Boolean intervene);
+
+    /**
+     * 解绑老师
+     *
+     * @param tenantId     机构
+     * @param verityUserId 审核人
+     * @param unbind       解绑信息
+     */
+    void unbindTenant(Long tenantId, Long verityUserId, TenantUnbindRecordWrapper.Unbind unbind);
 }

+ 2 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/UserTenantAlbumRecordService.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
 import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
 import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
 
@@ -27,7 +28,7 @@ public interface UserTenantAlbumRecordService extends IService<UserTenantAlbumRe
      * @param query UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery
      * @return IPage<UserTenantAlbumRecord>
      */
-    IPage<UserTenantAlbumRecord> selectPage(IPage<UserTenantAlbumRecord> page, UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query);
+    IPage<TenantAlbumWrapper.TenantAlbum> selectPage(IPage<TenantAlbumWrapper.TenantAlbum> page, UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query);
 	
     /**
      * 添加

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

@@ -20,10 +20,7 @@ import com.yonge.cooleshow.biz.dal.dto.activity.ActivityTeacherQuery;
 import com.yonge.cooleshow.biz.dal.dto.req.OrderReq;
 import com.yonge.cooleshow.biz.dal.dto.search.ActivityPlanSearch;
 import com.yonge.cooleshow.biz.dal.entity.*;
-import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.enums.EQueryOp;
-import com.yonge.cooleshow.biz.dal.enums.MK;
-import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.*;
 import com.yonge.cooleshow.biz.dal.enums.activity.ActivityRankingMethodEnum;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.ActivityMusicVo;
@@ -666,6 +663,7 @@ public class ActivityPlanServiceImpl extends ServiceImpl<ActivityPlanDao, Activi
         orderCreateRes.setGoodType(orderCreateRes.getGoodType());
         orderCreateRes.setBizId(activityPlanPayDto.getActivityId());
         orderCreateRes.setGoodNum(1);
+        orderCreateRes.setSourceType(SourceTypeEnum.PLATFORM);
         orderCreateRes.setOriginalPrice(activityPlan.getRegistrationPrice());
         orderCreateRes.setExpectPrice(activityPlan.getRegistrationPrice());
         return HttpResponseResult.succeed(orderCreateRes);

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

@@ -805,6 +805,7 @@ public class CourseGroupServiceImpl extends ServiceImpl<CourseGroupDao, CourseGr
         orderCreateRes.setExpectPrice(courseGroup.getCoursePrice());
         orderCreateRes.setGoodNum(courseGroup.getCourseNum());
         orderCreateRes.setGoodType(GoodTypeEnum.LIVE);
+        orderCreateRes.setSourceType(SourceTypeEnum.TEACHER);
 
         HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
         httpResponseResult.setData(orderCreateRes);

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

@@ -1094,6 +1094,7 @@ public class CourseScheduleServiceImpl extends ServiceImpl<CourseScheduleDao, Co
         orderCreateRes.setExpectPrice(scheduleDto.getCoursePrice());
         orderCreateRes.setGoodNum(scheduleDto.getCourseNum());
         orderCreateRes.setGoodType(GoodTypeEnum.PRACTICE);
+        orderCreateRes.setSourceType(SourceTypeEnum.TEACHER);
         HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
         httpResponseResult.setData(orderCreateRes);
         log.info("buyPracticeCourse  return {}", httpResponseResult);

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

@@ -298,7 +298,9 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
     public void create(ImGroupWrapper.ImGroup imGroup) throws Exception {
         //创建本地群聊
         Date now = new Date();
-        imGroup.setType(ImGroupType.FAN);
+        if (imGroup.getType() == null) {
+            imGroup.setType(ImGroupType.FAN);
+        }
         imGroup.setMemberNum(1);
         imGroup.setCreateTime(now);
         imGroup.setUpdateTime(now);
@@ -336,6 +338,15 @@ public class ImGroupServiceImpl extends ServiceImpl<ImGroupDao, ImGroup> impleme
         List<ImGroupMember> groupMemberList = imGroupMemberService.initGroupMembers(groupId,
                 studentIdList, ImGroupMemberRoleType.STUDENT);
         imGroupMemberService.join(groupMemberList, groupId);
+
+        // 如果是机构群,学生自动添加老师好友
+        if (ImGroupType.ORG.equals(imGroup.getType())) {
+            List<ImGroupMember> teacherList = imGroupMemberService.lambdaQuery()
+                    .eq(ImGroupMember::getGroupId, groupId)
+                    .eq(ImGroupMember::getRoleType, ImGroupMemberRoleType.TEACHER)
+                    .list();
+            teacherList.forEach(teacher -> imUserFriendService.saveUserFriend(teacher.getUserId(), studentIdList));
+        }
     }
 
 

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

@@ -114,6 +114,7 @@ public class MemberPriceSettingsServiceImpl extends ServiceImpl<MemberPriceSetti
         orderCreateRes.setOriginalPrice(detail.getOriginalPrice());
         orderCreateRes.setCouponAmount(couponAmount);
         orderCreateRes.setExpectPrice(detail.getSalePrice());
+        orderCreateRes.setSourceType(SourceTypeEnum.PLATFORM);
         return HttpResponseResult.succeed(orderCreateRes);
     }
 

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

@@ -924,6 +924,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                     if (!musicSheet.getSourceType().getCode().equals(SourceTypeEnum.PLATFORM.getCode())) {
                         orderCreateRes.setMerchId(musicSheet.getUserId());
                     }
+                    orderCreateRes.setSourceType(musicSheet.getSourceType());
 
 
                     orderCreateRes.setBizId(musicSheet.getId());
@@ -938,6 +939,7 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
                     if (Objects.isNull(album)) {
                         throw new BizException("无效的专辑信息");
                     }
+                    orderCreateRes.setSourceType(SourceTypeEnum.PLATFORM);
 
                     orderCreateRes.setRes(true);
                     orderCreateRes.setMerchId(0L);

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

@@ -75,6 +75,7 @@ public class PianoRoomBuyRecordServiceImpl extends ServiceImpl<PianoRoomBuyRecor
         orderCreateRes.setBizContent("琴房时长包购买-" + detail.getTimes() + "分");
         orderCreateRes.setGoodNum(1);
         orderCreateRes.setOriginalPrice(detail.getOriginalPrice());
+        orderCreateRes.setSourceType(SourceTypeEnum.PLATFORM);
         orderCreateRes.setExpectPrice(detail.getSalePrice());
         return HttpResponseResult.succeed(orderCreateRes);
     }

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

@@ -8,8 +8,12 @@ import java.util.stream.Collectors;
 
 import javax.annotation.Resource;
 
+import com.alibaba.fastjson.JSON;
 import com.google.common.collect.Lists;
 import com.yonge.cooleshow.biz.dal.entity.*;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
+import com.yonge.cooleshow.biz.dal.mapper.TenantUnbindHistoryMapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantUnbindRecordMapper;
 import com.yonge.cooleshow.biz.dal.queryInfo.TeacherQueryInfo;
 import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.vo.MusicSheetUploadCountVo;
@@ -17,6 +21,7 @@ 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 com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
 import org.redisson.api.RMap;
 import org.redisson.api.RedissonClient;
 import org.slf4j.Logger;
@@ -95,13 +100,13 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
     @Autowired
     private SubjectService subjectService;
-    
+
     @Autowired
     private StudentStarDao studentStarDao;
-    
+
     @Autowired
     private StudentService studentService;
-    
+
     @Autowired
     private SysMessageService sysMessageService;
 
@@ -120,6 +125,13 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Autowired
     private MusicSheetService musicSheetService;
 
+    @Autowired
+    private TenantUnbindRecordMapper tenantUnbindRecordMapper;
+
+    @Autowired
+    private TenantUnbindHistoryMapper tenantUnbindHistoryMapper;
+
+
     @Override
     public TeacherVo detail(Long userId) {
         TeacherVo detail = baseMapper.detail(userId);
@@ -156,7 +168,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             return page.setRecords(teacherVos);
         }
         //设置声部
-        List<Long> subjectIds = teacherVos.stream().filter(o -> o.getSubjectId() != null).flatMap(o -> Arrays.stream(o.getSubjectId().split(","))).map(Long::parseLong).collect(Collectors.toList());
+        List<Long> subjectIds =
+                teacherVos.stream().filter(o -> o.getSubjectId() != null).flatMap(o -> Arrays.stream(o.getSubjectId().split(","))).map(Long::parseLong).collect(Collectors.toList());
         List<Subject> subjects = subjectService.findBySubjectByIdList(subjectIds);
 
         Map<Long, String> subjectMap = subjects.stream().collect(Collectors.toMap(Subject::getId, Subject::getName));
@@ -278,15 +291,18 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
     @Override
     public HttpResponseResult<Boolean> openLive(Long id) {
-        TeacherTotal teacherTotal = (TeacherTotal) redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(id)).get();
+        TeacherTotal teacherTotal =
+                (TeacherTotal) redissonClient.getBucket(CacheNameEnum.TEACHER_TOTAL.getRedisKey(id)).get();
         if (null == teacherTotal) {
             teacherTotal = new TeacherTotal();
         }
 
         //开通直播需要粉丝数
-        Integer fansNum = Integer.parseInt(sysConfigService.findByParamName(SysConfigConstant.OPEN_LIVE_FANS_NUM).getParamValue());
+        Integer fansNum =
+                Integer.parseInt(sysConfigService.findByParamName(SysConfigConstant.OPEN_LIVE_FANS_NUM).getParamValue());
         //开通直播需要已完成课时数
-        Integer overClass = Integer.parseInt(sysConfigService.findByParamName(SysConfigConstant.OPEN_LIVE_OVER_CLASS).getParamValue());
+        Integer overClass =
+                Integer.parseInt(sysConfigService.findByParamName(SysConfigConstant.OPEN_LIVE_OVER_CLASS).getParamValue());
         //根据老师规则,判断老师直播权限
         if (teacherTotal.getFansNum() >= fansNum && teacherTotal.getExpTime() >= overClass) {
             Teacher teacher = new Teacher();
@@ -402,7 +418,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             if (teacher.getTenantId() != -1L && Boolean.FALSE.equals(teacherSubmitReq.getBindTenant())) {
                 // 老师建立的班级群解散,并解除好友关系
                 List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
-                        .eq(ImGroupMember::getIsAdmin,true)
+                        .eq(ImGroupMember::getIsAdmin, true)
                         .eq(ImGroupMember::getUserId, teacher.getUserId()).list();
                 if (!groupMembers.isEmpty()) {
                     List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId).distinct()
@@ -440,7 +456,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             realNameAuthDto.setRealName(teacherSubmitReq.getRealName());
             realNameAuthDto.setSave(false);
 
-            HttpResponseResult<IdcardInfoExtractor> idcardInfoExtractorResult = userFeignService.realNameAuth(realNameAuthDto);
+            HttpResponseResult<IdcardInfoExtractor> idcardInfoExtractorResult =
+                    userFeignService.realNameAuth(realNameAuthDto);
             if (!idcardInfoExtractorResult.getStatus() || null == idcardInfoExtractorResult.getData()) {
                 throw new BizException("实名认证未通过");
             }
@@ -585,15 +602,17 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
     @Transactional(rollbackFor = Exception.class)
     public boolean updateStyleVideo(Long userId, List<TeacherStyleVideo> styleVideo, String message) {
 
-        if(styleVideo == null){
+        if (styleVideo == null) {
             styleVideo = new ArrayList<TeacherStyleVideo>();
         }
         //修改老师信息
-        
-        List<TeacherStyleVideo> teacherStyleVideoList = teacherStyleVideoService.list(Wrappers.<TeacherStyleVideo>lambdaQuery()
-                .eq(TeacherStyleVideo::getUserId, userId));
 
-        Map<Long, TeacherStyleVideo> oldMap = teacherStyleVideoList.stream().collect(Collectors.toMap(TeacherStyleVideo::getId, o -> o));
+        List<TeacherStyleVideo> teacherStyleVideoList =
+                teacherStyleVideoService.list(Wrappers.<TeacherStyleVideo>lambdaQuery()
+                        .eq(TeacherStyleVideo::getUserId, userId));
+
+        Map<Long, TeacherStyleVideo> oldMap =
+                teacherStyleVideoList.stream().collect(Collectors.toMap(TeacherStyleVideo::getId, o -> o));
 
         List<TeacherStyleVideo> createList = styleVideo.stream().filter(o -> o.getId() == null)
                 .collect(Collectors.toList());
@@ -606,9 +625,9 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
 
         List<Long> oldIds = styleVideo.stream().filter(o -> o.getId() != null)
                 .map(TeacherStyleVideo::getId).collect(Collectors.toList());
-        
-        for(TeacherStyleVideo tv : teacherStyleVideoList){
-            if(tv.getAuthStatus() == AuthStatusEnum.DOING){
+
+        for (TeacherStyleVideo tv : teacherStyleVideoList) {
+            if (tv.getAuthStatus() == AuthStatusEnum.DOING) {
                 oldIds.add(tv.getId());
             }
         }
@@ -629,7 +648,7 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
                         .eq(TeacherStyleVideo::getId, o.getId()));
             }
         });
-        
+
         //发送推送
         try {
             //  发送消息
@@ -638,7 +657,8 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             Map<Long, String> receivers = new HashMap<>();
             receivers.put(userId, user.getPhone());
 
-            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG, MessageTypeEnum.CUSTOME_MESSAGE_PUSH, receivers, null, 0,
+            sysMessageService.batchSendMessage(MessageSenderPluginContext.MessageSender.JIGUANG,
+                    MessageTypeEnum.CUSTOME_MESSAGE_PUSH, receivers, null, 0,
                     null, ClientEnum.TEACHER.getCode(), message);
 
         } catch (Exception e) {
@@ -692,7 +712,8 @@ 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());
+        List<MyFens> teacherVos = baseMapper.queryMyFans(page,
+                TeacherQueryInfo.FansQuery.builder().teacherId(teacherId).build());
         return page.setRecords(teacherVos);
     }
 
@@ -735,19 +756,19 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         List<Long> watchTeacherIdList = new ArrayList<Long>();
 
         List<StudentStar> studentStarList = studentStarDao.queryByStudentId(userId);
-        if(studentStarList != null && studentStarList.size() > 0){
-            watchTeacherIdList = studentStarList.stream().map(StudentStar :: getTeacherId).collect(Collectors.toList());
+        if (studentStarList != null && studentStarList.size() > 0) {
+            watchTeacherIdList = studentStarList.stream().map(StudentStar::getTeacherId).collect(Collectors.toList());
         }
 
         Student student = studentService.getById(userId);
         Long subjectId = null;
-        if (student.getSubjectId()!= null) {
+        if (student.getSubjectId() != null) {
             subjectId = Long.parseLong(student.getSubjectId());
         }
 
         List<HotTeacherVo> hotTeacherList = baseMapper.queryHotTeacherList(subjectId);
-        for(HotTeacherVo vo : hotTeacherList){
-            if(watchTeacherIdList.contains(vo.getUserId())){
+        for (HotTeacherVo vo : hotTeacherList) {
+            if (watchTeacherIdList.contains(vo.getUserId())) {
                 vo.setWatch(true);
             }
         }
@@ -807,8 +828,10 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
             }
 
             // 老师学生人数统计
-            Map<Long, Integer> studentNumsMap = getBaseMapper().selectTeacherStudentNumberStatInfo(Lists.newArrayList(teacherId)).stream()
-                    .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal, (o, n) -> n));
+            Map<Long, Integer> studentNumsMap =
+                    getBaseMapper().selectTeacherStudentNumberStatInfo(Lists.newArrayList(teacherId)).stream()
+                            .collect(Collectors.toMap(StatGroupWrapper::getId, StatGroupWrapper::getTotal,
+                                    (o, n) -> n));
 
             teacherInfo.setStudentNums(studentNumsMap.getOrDefault(teacherId, 0));
         }
@@ -857,4 +880,44 @@ public class TeacherServiceImpl extends ServiceImpl<TeacherDao, Teacher> impleme
         return wrapper;
     }
 
+    @Override
+    public void updateTenant(TeacherWrapper.UpdateTenant updateTenant) {
+        Teacher teacher = this.getById(updateTenant.getTeacherId());
+        if (teacher.getTenantId().equals(updateTenant.getTenantId())) {
+            return;
+        }
+        Long oldTenantId = teacher.getTenantId();
+        if (oldTenantId != -1L) {
+            List<ImGroup> imGroups = imGroupService.lambdaQuery()
+                    .eq(ImGroup::getCreateBy, teacher.getUserId())
+                    .eq(ImGroup::getType, ImGroupType.ORG)
+                    .list();
+            imGroups.forEach(next -> {
+                try {
+                    imGroupService.dismiss(next.getId());
+                } catch (Exception e) {
+                    log.error("老师修改机构,解散机构群失败:{}", e.getMessage());
+                }
+            });
+        }
+
+        teacher.setTenantId(updateTenant.getTenantId());
+        teacher.setSettlementFrom(ESettlementFrom.TENANT);
+        this.updateById(teacher);
+
+        Optional<TenantUnbindRecord> first = tenantUnbindRecordMapper.getRecord(oldTenantId,
+                        updateTenant.getTeacherId(), "TEACHER").stream()
+                .filter(next -> next.getStatus().equals(ETenantUnBindAuditStatus.DOING)).findFirst();
+        if (first.isPresent()) {
+            TenantUnbindRecord tenantUnbindRecord = first.get();
+            tenantUnbindRecord.setStatus(ETenantUnBindAuditStatus.CLOSE);
+            tenantUnbindRecordMapper.updateById(tenantUnbindRecord);
+
+            TenantUnbindHistory history = JSON.parseObject(JSON.toJSONString(tenantUnbindRecord),
+                    TenantUnbindHistory.class);
+            tenantUnbindHistoryMapper.insert(history);
+        }
+
+    }
+
 }

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

@@ -123,11 +123,13 @@ public class TenantActivationCodeServiceImpl extends ServiceImpl<TenantActivatio
             // 入参为空走批量发放方式
             queryWrapper.lambda().eq(TenantActivationCode::getTenantId, tenantId)
                     .eq(TenantActivationCode::getTenantAlbumPurchaseId, tenantAlbumPurchaseId)
+                    .eq(TenantActivationCode::getSendStatus, EActivationCode.WAIT)
                     .eq(TenantActivationCode::getActivationStatus, false);
         } else {
             queryWrapper.lambda().eq(TenantActivationCode::getTenantId, tenantId)
                     .eq(TenantActivationCode::getTenantAlbumPurchaseId, tenantAlbumPurchaseId)
                     .in(TenantActivationCode::getActivationCode, activationCodeList)
+                    .eq(TenantActivationCode::getSendStatus, EActivationCode.WAIT)
                     .eq(TenantActivationCode::getActivationStatus, false);
         }
 

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

@@ -278,7 +278,7 @@ public class TenantAlbumServiceImpl extends ServiceImpl<TenantAlbumMapper, Tenan
                 .distinct().collect(Collectors.toList());
         tenantAlbum.setSubjectTypes(String.join(",", subjectTypeNames));
         //给机构专辑赋值
-        tenantAlbum.setStatus(true);
+        tenantAlbum.setStatus(false);
         tenantAlbum.setDelFlag(false);
         this.add(tenantAlbum);
 

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

@@ -192,7 +192,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
 
 
     /**
-     * 添加
+     * 新增
      *
      * @param tenantInfo TenantInfoWrapper.TenantInfo
      * @return Boolean
@@ -204,7 +204,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         tenantInfo.setEnableFlag(true);
         if (StringUtils.isEmpty(tenantInfo.getLogo())) {
             // todo 设置默认logo
-            tenantInfo.setLogo("");
+            tenantInfo.setLogo(sysConfigService.findConfigValue(SysConfigConstant.TENANT_DEFAULT_HEAD));
         }
         tenantInfo.setEnableFlag(true);
         tenantInfo.setUserId(sysUser.getId());
@@ -261,7 +261,41 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         }
         return sysUser;
     }
-	
+
+
+
+    private SysUser getAccount(TenantInfo tenantInfo, TenantInfo oldTenantInfo) {
+        QueryWrapper<SysUser> sysUserQueryWrapper = new QueryWrapper<>();
+        sysUserQueryWrapper.lambda().eq(SysUser::getPhone, tenantInfo.getPhone());
+        List<SysUser> sysUsers = sysUserMapper.selectList(sysUserQueryWrapper);
+        SysUser sysUser = new SysUser();
+        //若存在信息
+        if (!sysUsers.isEmpty()) {
+            sysUser = sysUsers.get(0);
+            TenantStaff tenantStaff = tenantStaffMapper.selectByUserId(sysUser.getId());
+            if (tenantStaff != null && oldTenantInfo != null &&
+                    !tenantStaff.getUserId().equals(oldTenantInfo.getUserId())) {
+                throw new BizException("手机号已经注册机构账号");
+            }
+            //获取当前账户的用户类型
+            String userType = sysUser.getUserType();
+            //设置默认机构类型
+            String tenantUserType = SysUserType.ORGANIZATION.getCode();
+            if (StringUtils.isEmpty(userType)) {
+                sysUser.setUserType(tenantUserType);
+            } else if (!userType.contains(tenantUserType)) {
+                sysUser.setUserType(userType + "," + tenantUserType);
+            }
+
+            //更新当前账号的用户名
+            sysUser.setUsername(tenantInfo.getUsername());
+
+            sysUserMapper.updateById(sysUser);
+        }
+        return sysUser;
+    }
+
+
 
     /*@Override
     public Boolean add(TenantInfoWrapper.TenantInfo tenantInfo) {    	
@@ -344,7 +378,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         // todo  机构冻结状态是否允许修改
         //更新或创建sysUser
         TenantInfo oldTenantInfo = this.getById(info.getId());
-        SysUser sysUser = getOrCreateAccount(info, oldTenantInfo);
+        SysUser sysUser = getAccount(info, oldTenantInfo);
 
         tenantStaffMapper.update(null, Wrappers.<TenantStaff>lambdaUpdate()
                 .set(TenantStaff::getUserId, sysUser.getId())
@@ -354,7 +388,7 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
 
         if (StringUtils.isEmpty(info.getLogo())) {
             // todo 设置默认logo
-            info.setLogo("");
+            info.setLogo(sysConfigService.findConfigValue(SysConfigConstant.TENANT_DEFAULT_HEAD));
         }
         tenantInfoMapper.update(null, Wrappers.<TenantInfo>lambdaUpdate()
                 .set(TenantInfo::getName, info.getName())
@@ -519,6 +553,25 @@ public class TenantInfoServiceImpl extends ServiceImpl<TenantInfoMapper, TenantI
         return null;
     }
 
+    @Override
+    public Boolean updateTenantInfo(TenantInfo info, Long tenantId) {
+        boolean update = this.lambdaUpdate().set(TenantInfo::getName, info.getName())
+                .set(TenantInfo::getLogo, info.getLogo())
+                .set(TenantInfo::getBriefIntroduction, info.getBriefIntroduction())
+                .set(TenantInfo::getProvinceCode, info.getProvinceCode())
+                .set(TenantInfo::getCityCode, info.getCityCode())
+                .set(TenantInfo::getRegionCode, info.getRegionCode())
+                .eq(TenantInfo::getId, tenantId).update();
+        return update;
+    }
+
+    @Override
+    public Boolean updateSysUser(SysUser sysUser, Long id) {
+        sysUser.setId(id);
+        sysUserMapper.updateById(sysUser);
+        return true;
+    }
+
 
     /**
      * 匹配地区码与省市区

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

@@ -0,0 +1,66 @@
+package com.yonge.cooleshow.biz.dal.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import org.springframework.beans.BeanUtils;
+import lombok.extern.slf4j.Slf4j;
+import com.yonge.cooleshow.biz.dal.entity.TenantUnbindHistory;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindHistoryWrapper;
+import com.yonge.cooleshow.biz.dal.mapper.TenantUnbindHistoryMapper;
+import com.yonge.cooleshow.biz.dal.service.TenantUnbindHistoryService;
+
+/**
+ * 机构解绑历史表
+ * 2023-08-18 18:00:10
+ */
+@Slf4j
+@Service
+public class TenantUnbindHistoryServiceImpl extends ServiceImpl<TenantUnbindHistoryMapper, TenantUnbindHistory> implements TenantUnbindHistoryService {
+
+    /**
+     * 查询详情
+     * @param id 详情ID
+     * @return TenantUnbindHistory
+     */
+    @Override
+    public TenantUnbindHistory detail(Long id) {
+
+        return baseMapper.selectById(id);
+    }
+
+    /**
+     * 分页查询
+     * @param page IPage<TenantUnbindHistory>
+     * @param query TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery
+     * @return IPage<TenantUnbindHistory>
+     */
+    @Override
+    public IPage<TenantUnbindHistory> selectPage(IPage<TenantUnbindHistory> page, TenantUnbindHistoryWrapper.TenantUnbindHistoryQuery query) {
+
+        return page.setRecords(baseMapper.selectPage(page, query));
+    }
+
+    /**
+     * 添加
+     * @param tenantUnbindHistory TenantUnbindHistoryWrapper.TenantUnbindHistory
+     * @return Boolean
+     */
+    @Override
+    public Boolean add(TenantUnbindHistoryWrapper.TenantUnbindHistory tenantUnbindHistory) {
+
+        return this.save(JSON.parseObject(tenantUnbindHistory.jsonString(), TenantUnbindHistory.class));
+    }
+
+    /**
+     * 更新
+     * @param tenantUnbindHistory TenantUnbindHistoryWrapper.TenantUnbindHistory
+     * @return Boolean
+     */
+    @Override
+    public Boolean update(TenantUnbindHistoryWrapper.TenantUnbindHistory tenantUnbindHistory){
+
+        return this.updateById(JSON.parseObject(tenantUnbindHistory.jsonString(), TenantUnbindHistory.class));
+    }
+}

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

@@ -9,33 +9,34 @@ import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dao.SubjectDao;
 import com.yonge.cooleshow.biz.dal.dao.TeacherDao;
-import com.yonge.cooleshow.biz.dal.entity.Subject;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
 import com.yonge.cooleshow.biz.dal.entity.SysArea;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.TenantUnbindHistory;
 import com.yonge.cooleshow.biz.dal.entity.TenantUnbindRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
 import com.yonge.cooleshow.biz.dal.mapper.SysAreaMapper;
 import com.yonge.cooleshow.biz.dal.mapper.TenantUnbindRecordMapper;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
 import com.yonge.cooleshow.biz.dal.service.SysConfigService;
 import com.yonge.cooleshow.biz.dal.service.SysMessageService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.TenantUnbindHistoryService;
 import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindRecordWrapper;
 import com.yonge.cooleshow.common.constant.SysConfigConstant;
+import com.yonge.cooleshow.common.enums.ESettlementFrom;
 import com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
@@ -68,12 +69,6 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
     private SysUserFeignService sysUserFeignService;
 
     @Autowired
-    private StudentService studentService;
-
-    @Autowired
-    private TeacherService teacherService;
-
-    @Autowired
     private SysConfigService sysConfigService;
 
     @Autowired
@@ -85,6 +80,12 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
     @Autowired
     private SysMessageService sysMessageService;
 
+    @Autowired
+    private TenantUnbindHistoryService tenantUnbindHistoryService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
     /**
      * @param id 详情ID
      * @return TenantUnbindRecord
@@ -133,41 +134,42 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
             });
         }
 
-        List<Long> teacherIdList = records.stream().map(TenantUnbindRecordWrapper.TenantUnbindRecord::getUserId)
-                .collect(Collectors.toList());
-
-        QueryWrapper<Teacher> objectQueryWrapper = new QueryWrapper<>();
-        objectQueryWrapper.lambda().in(Teacher::getUserId, teacherIdList);
-        List<Teacher> teachers = teacherDao.selectList(objectQueryWrapper);
-
-
-        List<Long> subjectIdList = teachers.stream().filter(next -> StringUtils.isNotEmpty(next.getSubjectId()))
-                .map(next -> Arrays.stream(next.getSubjectId().split(",")).map(Long::valueOf).collect(Collectors.toList()))
-                .flatMap(Collection::stream).collect(Collectors.toList());
-
-        Map<Long, String> userIdSubjectNameMap = new HashMap<>();
-        Map<Long, String> userIdSubjectIdMap = new HashMap<>();
-        if (!subjectIdList.isEmpty()) {
-            List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIdList);
-            Map<Long, String> idNameMap = subjectList.stream().collect(Collectors.toMap(Subject::getId,
-                    Subject::getName));
-
-            for (Teacher user : teachers) {
-                String subjectId = user.getSubjectId();
-                if (StringUtils.isEmpty(subjectId)) {
-                    continue;
-                }
-                userIdSubjectIdMap.put(user.getUserId(), subjectId);
-                List<String> names = Arrays.stream(subjectId.split(",")).map(next ->
-                        idNameMap.getOrDefault(Long.valueOf(next), "")).collect(Collectors.toList());
-                userIdSubjectNameMap.put(user.getUserId(), String.join(",", names));
-            }
-        }
-
-        for (TenantUnbindRecordWrapper.TenantUnbindRecord next : records) {
-            next.setSubjectId(userIdSubjectIdMap.getOrDefault(next.getUserId(), ""));
-            next.setSubjectName(userIdSubjectNameMap.getOrDefault(next.getUserId(), ""));
-        }
+//        List<Long> teacherIdList = records.stream().map(TenantUnbindRecordWrapper.TenantUnbindRecord::getUserId)
+//                .collect(Collectors.toList());
+
+//        QueryWrapper<Teacher> objectQueryWrapper = new QueryWrapper<>();
+//        objectQueryWrapper.lambda().in(Teacher::getUserId, teacherIdList);
+//        List<Teacher> teachers = teacherDao.selectList(objectQueryWrapper);
+
+
+//        List<Long> subjectIdList = teachers.stream().filter(next -> StringUtils.isNotEmpty(next.getSubjectId()))
+//                .map(next -> Arrays.stream(next.getSubjectId().split(",")).map(Long::valueOf).collect(Collectors
+//                .toList()))
+//                .flatMap(Collection::stream).collect(Collectors.toList());
+//
+//        Map<Long, String> userIdSubjectNameMap = new HashMap<>();
+//        Map<Long, String> userIdSubjectIdMap = new HashMap<>();
+//        if (!subjectIdList.isEmpty()) {
+//            List<Subject> subjectList = subjectDao.findBySubjectIds(subjectIdList);
+//            Map<Long, String> idNameMap = subjectList.stream().collect(Collectors.toMap(Subject::getId,
+//                    Subject::getName));
+//
+//            for (Teacher user : teachers) {
+//                String subjectId = user.getSubjectId();
+//                if (StringUtils.isEmpty(subjectId)) {
+//                    continue;
+//                }
+//                userIdSubjectIdMap.put(user.getUserId(), subjectId);
+//                List<String> names = Arrays.stream(subjectId.split(",")).map(next ->
+//                        idNameMap.getOrDefault(Long.valueOf(next), "")).collect(Collectors.toList());
+//                userIdSubjectNameMap.put(user.getUserId(), String.join(",", names));
+//            }
+//        }
+//
+//        for (TenantUnbindRecordWrapper.TenantUnbindRecord next : records) {
+//            next.setSubjectId(userIdSubjectIdMap.getOrDefault(next.getUserId(), ""));
+//            next.setSubjectName(userIdSubjectNameMap.getOrDefault(next.getUserId(), ""));
+//        }
         return page.setRecords(records);
     }
 
@@ -210,14 +212,6 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
         if (unbindRecord == null || !ETenantUnBindAuditStatus.DOING.equals(unbindRecord.getStatus())) {
             throw new BizException("审核记录不存在");
         }
-        // 平台介入审核,需要达到审批超时时间
-        if (Boolean.TRUE.equals(intervene)) {
-            String configValue = sysConfigService.findConfigValue(SysConfigConstant.TENANT_USER_UNBIND_EXPIRE_TIME);
-            if (StringUtils.isNotEmpty(configValue) &&
-                    (System.currentTimeMillis() < (unbindRecord.getCreateTime().getTime() + Long.parseLong(configValue) * 60 * 1000))) {
-                throw new BizException("请联系机构管理人员审核");
-            }
-        }
         this.lambdaUpdate()
                 .set(TenantUnbindRecord::getStatus, Boolean.TRUE.equals(audio.getStatus()) ?
                         ETenantUnBindAuditStatus.PASS : ETenantUnBindAuditStatus.UNPASS)
@@ -230,12 +224,50 @@ public class TenantUnbindRecordServiceImpl extends ServiceImpl<TenantUnbindRecor
         if (Boolean.TRUE.equals(audio.getStatus())) {
             teacherDao.update(null, Wrappers.<Teacher>lambdaUpdate()
                     .eq(Teacher::getUserId, audio.getId())
+                    .set(Teacher::getSettlementFrom, ESettlementFrom.TEACHER)
                     .set(Teacher::getTenantId, -1L));
+            // 解散机构群
+            List<ImGroup> imGroups = imGroupService.lambdaQuery()
+                    .eq(ImGroup::getCreateBy, unbindRecord.getUserId())
+                    .eq(ImGroup::getType, ImGroupType.ORG)
+                    .list();
+            for (ImGroup imGroup : imGroups) {
+                try {
+                    imGroupService.dismiss(imGroup.getId());
+                } catch (Exception e) {
+                    log.error("老师解绑审核成功,解散机构群失败:{}", e.getMessage());
+                }
+            }
         }
+
+        // 添加历史记录
+        TenantUnbindHistory history = JSON.parseObject(JSON.toJSONString(unbindRecord), TenantUnbindHistory.class);
+        tenantUnbindHistoryService.save(history);
+
         // 老师端发送消息
         CompletableFuture.runAsync(() -> sendTeacherUnBindMessage(audio, unbindRecord));
     }
 
+    @Transactional(rollbackFor = Exception.class)
+    @Override
+    public void unbindTenant(Long tenantId, Long verityUserId, TenantUnbindRecordWrapper.Unbind unbind) {
+        Teacher teacher = teacherDao.selectById(unbind.getUserId());
+        if (teacher == null || !teacher.getTenantId().equals(tenantId)) {
+            throw new BizException("老师信息不存在");
+        }
+        teacher.setTenantId(-1L);
+        teacherDao.updateById(teacher);
+        // 如果有申请解绑,更新状态为关闭状态
+        tenantUnbindRecordService.lambdaUpdate()
+                .set(TenantUnbindRecord::getReason, unbind.getReason())
+                .set(TenantUnbindRecord::getVerifyUserId, verityUserId)
+                .set(TenantUnbindRecord::getStatus, ETenantUnBindAuditStatus.CLOSE)
+                .eq(TenantUnbindRecord::getUserId, unbind.getUserId())
+                .eq(TenantUnbindRecord::getUserType, "TEACHER")
+                .eq(TenantUnbindRecord::getStatus, ETenantUnBindAuditStatus.DOING)
+                .update();
+    }
+
     private void sendTeacherUnBindMessage(TenantUnbindRecordWrapper.Audio audio, TenantUnbindRecord record) {
         TenantInfo tenantInfo = tenantInfoService.getById(record.getTenantId());
         if (tenantInfo == null) {

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

@@ -364,6 +364,9 @@ public class UserOrderServiceImpl extends ServiceImpl<UserOrderDao, UserOrder> i
 
             // 计算优惠券金额
             if (StringUtils.isNotEmpty(orderReq.getCouponId())) {
+                if (createRes.getSourceType() != null && !createRes.getSourceType().equals(SourceTypeEnum.PLATFORM)) {
+                    return HttpResponseResult.failed("优惠券不可用");
+                }
 
                 couponOrderWrapper = couponInfoService.queryUserOrderCouponInfo(orderReq.getUserId(),
                         CouponInfoQuery.CouponOrderQuery.builder()

+ 97 - 8
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/UserTenantAlbumRecordServiceImpl.java

@@ -3,19 +3,26 @@ package com.yonge.cooleshow.biz.dal.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
+import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.dto.search.StudentMusicSheetSearch;
+import com.yonge.cooleshow.biz.dal.entity.*;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.SubjectTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.MusicSheetVo;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.toolset.mybatis.support.PageUtil;
 import org.apache.commons.collections.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.beans.BeanUtils;
 import lombok.extern.slf4j.Slf4j;
-import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
 import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
 import com.yonge.cooleshow.biz.dal.mapper.UserTenantAlbumRecordMapper;
-import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
 
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -26,6 +33,21 @@ import java.util.stream.Collectors;
 @Service
 public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbumRecordMapper, UserTenantAlbumRecord> implements UserTenantAlbumRecordService {
 
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+
+    @Autowired
+    private TenantAlbumRefService tenantAlbumRefService;
+
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private TenantAlbumMusicService tenantAlbumMusicService;
+
+    @Autowired
+    private MusicSheetService musicSheetService;
+
 	/**
      * 查询详情
      * @param id 详情ID
@@ -44,9 +66,76 @@ public class UserTenantAlbumRecordServiceImpl extends ServiceImpl<UserTenantAlbu
      * @return IPage<UserTenantAlbumRecord>
      */
     @Override
-    public IPage<UserTenantAlbumRecord> selectPage(IPage<UserTenantAlbumRecord> page, UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query) {
-        
-        return page.setRecords(baseMapper.selectPage(page, query));
+    public IPage<TenantAlbumWrapper.TenantAlbum> selectPage(IPage<TenantAlbumWrapper.TenantAlbum> page, UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Long id = sysUser.getId();
+        query.setUserId(sysUser.getId());
+
+        List<TenantAlbumWrapper.TenantAlbum> list = new ArrayList<>();
+
+            //查询生效的机构专辑id
+            List<Long> tenantIds = baseMapper.selectTenantIds(id);
+            List<TenantAlbum> tenantAlbums = baseMapper.selectTenantAlbumInfo(tenantIds);
+            tenantAlbums.stream().forEach(i->{
+                TenantAlbumWrapper.TenantAlbum vo = JSON.parseObject(JSON.toJSONString(i),
+                        TenantAlbumWrapper.TenantAlbum.class);
+
+                //查关联表
+                TenantAlbumRef one = tenantAlbumRefService.lambdaQuery().eq(TenantAlbumRef::getTenantAlbumId, i.getId())
+                        .last("limit 1").one();
+                vo.setTenantId(one.getTenantId());
+
+                //查询曲目表
+                TenantInfo tenantInfo = tenantInfoService.getById(one.getTenantId());
+                vo.setTenantName(tenantInfo.getName());
+
+                List<TenantAlbumMusic> tenantAlbumMusics = tenantAlbumMusicService.lambdaQuery()
+                        .eq(TenantAlbumMusic::getTenantAlbumId, i.getId())
+                        .eq(TenantAlbumMusic::getDelFlag, false)
+                        .list();
+
+                Map<SubjectTypeEnum, List<TenantAlbumMusic>> groupByType =
+                        tenantAlbumMusics.stream().collect(Collectors.groupingBy(TenantAlbumMusic::getSubjectType));
+
+                List<Long> musicSheetIdlist = tenantAlbumMusics.stream().map(next -> next.getMusicSheetId()).distinct().collect(Collectors.toList());
+
+                StudentMusicSheetSearch search = new StudentMusicSheetSearch();
+                search.setMusicSheetIdlist(musicSheetIdlist);
+                search.setPage(1);
+                search.setRows(9999);
+
+                IPage<MusicSheetVo> records = musicSheetService.selectStudentPage(PageUtil.getPage(search), search, ClientEnum.TENANT_STUDENT);
+
+                Map<Long, MusicSheetVo> idMsMap = records.getRecords().stream()
+                        .collect(Collectors.toMap(MusicSheet::getId, Function.identity()));
+
+                List<TenantAlbumWrapper.MusicSheetData> musicSheetData = vo.getMusicSheetData();
+
+                groupByType.forEach((key, value) -> {
+                    value.sort(Comparator.comparing(TenantAlbumMusic::getSortNumber));
+                    TenantAlbumWrapper.MusicSheetData sheetData = new TenantAlbumWrapper.MusicSheetData();
+                    sheetData.setSubjectType(key);
+                    List<TenantAlbumWrapper.TenantAlbumSheet> tenantAlbumSheets = value.stream().map(next -> {
+
+                        TenantAlbumWrapper.TenantAlbumSheet tenantAlbumSheet = new TenantAlbumWrapper.TenantAlbumSheet();
+                        BeanUtils.copyProperties(value.get(0), tenantAlbumSheet);
+                        Long musicSheetId = tenantAlbumSheet.getMusicSheetId();
+                        MusicSheetVo musicSheet = idMsMap.getOrDefault(musicSheetId, new MusicSheetVo());
+                        tenantAlbumSheet.setMusicSheetName(musicSheet.getMusicSheetName());
+                        tenantAlbumSheet.setMusicTag(musicSheet.getMusicTag());
+                        tenantAlbumSheet.setComposer(musicSheet.getComposer());
+                        return tenantAlbumSheet;
+                    }).collect(Collectors.toList());
+
+
+                    sheetData.setTenantAlbumSheetList(tenantAlbumSheets);
+                    musicSheetData.add(sheetData);
+                    vo.setMusicSheetData(musicSheetData);
+                });
+                list.add(vo);
+            });
+
+        return page.setRecords(list);
     }
 	
     /**

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

@@ -130,6 +130,7 @@ public class VideoLessonPurchaseRecordServiceImpl extends ServiceImpl<VideoLesso
         orderCreateRes.setActualPrice(purchaseRecord.getPayMoney());//实际价格
         orderCreateRes.setGoodNum(lessonGroup.getLessonCount());
         orderCreateRes.setGoodType(GoodTypeEnum.VIDEO);
+        orderCreateRes.setSourceType(SourceTypeEnum.TEACHER);
         HttpResponseResult<OrderCreateRes> httpResponseResult = new HttpResponseResult<>();
         httpResponseResult.setData(orderCreateRes);
         log.info("buyVideoCourse  return {}", httpResponseResult);

+ 12 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/vo/res/OrderCreateRes.java

@@ -2,6 +2,7 @@ package com.yonge.cooleshow.biz.dal.vo.res;
 
 import com.yonge.cooleshow.biz.dal.enums.GoodTypeEnum;
 import com.yonge.cooleshow.biz.dal.enums.OrderTypeEnum;
+import com.yonge.cooleshow.biz.dal.enums.SourceTypeEnum;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 
@@ -46,6 +47,17 @@ public class OrderCreateRes {
     // 透传订单类型
     private OrderTypeEnum orderType;
 
+    // 商品来源
+    private SourceTypeEnum sourceType;
+
+    public SourceTypeEnum getSourceType() {
+        return sourceType;
+    }
+
+    public void setSourceType(SourceTypeEnum sourceType) {
+        this.sourceType = sourceType;
+    }
+
     public Long getRewardId() {
         return rewardId;
     }

+ 69 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantUnbindHistoryWrapper.java

@@ -0,0 +1,69 @@
+package com.yonge.cooleshow.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import java.util.Optional;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 机构解绑历史表
+ * 2023-08-18 18:00:10
+ */
+@ApiModel(value = "TenantUnbindHistoryWrapper对象", description = "机构解绑历史表查询对象")
+public class TenantUnbindHistoryWrapper {
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" TenantUnbindHistoryQuery-机构解绑历史表")
+    public static class TenantUnbindHistoryQuery implements QueryInfo {
+
+        @ApiModelProperty("当前页")
+        private Integer page;
+
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+
+        @ApiModelProperty("关键字匹配")
+        private String keyword;
+
+        @ApiModelProperty("用户ID")
+        private Long userId;
+
+        @ApiModelProperty("机构ID")
+        private Long tenantId;
+
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantUnbindHistoryQuery from(String json) {
+            return JSON.parseObject(json, TenantUnbindHistoryQuery.class);
+        }
+    }
+
+    @ApiModel(" TenantUnbindHistory-机构解绑历史表")
+    public static class TenantUnbindHistory {
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static TenantUnbindHistory from(String json) {
+            return JSON.parseObject(json, TenantUnbindHistory.class);
+        }
+    }
+
+}

+ 25 - 6
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/TenantUnbindRecordWrapper.java

@@ -3,6 +3,7 @@ package com.yonge.cooleshow.biz.dal.wrapper;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -50,8 +51,8 @@ public class TenantUnbindRecordWrapper {
         @ApiModelProperty("用户类型,TEACHER/STUDENT")
         private String userType;
 
-        @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过")
-        private String status;
+        @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过,取消:CANCEL,关闭:CLOSE")
+        private ETenantUnBindAuditStatus status;
 
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
@@ -121,8 +122,8 @@ public class TenantUnbindRecordWrapper {
         @ApiModelProperty("解绑理由")
         private String unbindReason;
 
-        @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过")
-        private String status;
+        @ApiModelProperty("审核状态 DOING、审核中 PASS、通过 UNPASS、不通过,撤销:CANCEL,关闭:CLOSE")
+        private ETenantUnBindAuditStatus status;
 
         @ApiModelProperty("审核人")
         private Long verifyUserId;
@@ -142,8 +143,8 @@ public class TenantUnbindRecordWrapper {
         @ApiModelProperty("头像")
         private String avatar;
 
-        @ApiModelProperty("声部Id")
-        private String subjectId;
+//        @ApiModelProperty("声部Id")
+//        private String subjectId;
 
         @ApiModelProperty("声部名称")
         private String subjectName;
@@ -177,4 +178,22 @@ public class TenantUnbindRecordWrapper {
         private String reason;
     }
 
+
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel("机构主动解绑老师")
+    public static class Unbind {
+
+        @ApiModelProperty("解绑的用户ID")
+        @NotNull
+        private Long userId;
+
+        @ApiModelProperty("审核理由")
+        @NotNull
+        private String reason;
+    }
+
 }

+ 16 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/UserTenantAlbumRecordWrapper.java

@@ -34,6 +34,10 @@ public class UserTenantAlbumRecordWrapper {
         
         @ApiModelProperty("关键字匹配")
 		private String keyword;
+
+        @ApiModelProperty("用户Id")
+        private Long userId;
+
         
         public String getKeyword() {
             return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
@@ -50,7 +54,18 @@ public class UserTenantAlbumRecordWrapper {
 
 	@ApiModel(" UserTenantAlbumRecord-购买训练工具记录")
     public static class UserTenantAlbumRecord {
-        
+        @ApiModelProperty("专辑名称")
+        private String albumName;
+
+        @ApiModelProperty("专辑介绍")
+        private String describe;
+
+        @ApiModelProperty("机构名称")
+        private String tenantName;
+
+        @ApiModelProperty("专辑封面")
+        private String coverImg;
+
         public String jsonString() {
             return JSON.toJSONString(this);
         }

+ 1 - 1
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/wrapper/im/ImGroupWrapper.java

@@ -59,7 +59,7 @@ public class ImGroupWrapper {
         @ApiModelProperty(value = "群头像")
         private String img;
 
-        @ApiModelProperty(value = "群类型:FAN粉丝群、COURSE课程群;")
+        @ApiModelProperty(value = "群类型:FAN粉丝群、COURSE课程群;ORG机构群")
         private ImGroupType type = ImGroupType.FAN;
 
         @ApiModelProperty(value = "创建人")

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

@@ -9,6 +9,7 @@ import lombok.Builder;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.validation.constraints.NotNull;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
@@ -99,12 +100,27 @@ public class TeacherWrapper {
 
     @Data
     @ApiModel("解绑机构")
-    public static class UnbindTenant{
+    public static class UnbindTenant {
 
         @ApiModelProperty("短信验证码")
+        @NotNull
         private String code;
 
         @ApiModelProperty("解绑原因")
+        @NotNull
         private String unbindReason;
     }
+
+    @Data
+    @ApiModel("修改机构")
+    public static class UpdateTenant {
+
+        @ApiModelProperty("老师ID")
+        @NotNull
+        private Long teacherId;
+
+        @ApiModelProperty("机构ID")
+        @NotNull
+        private Long tenantId;
+    }
 }

+ 10 - 5
cooleshow-user/user-biz/src/main/resources/config/mybatis/StudentMapper.xml

@@ -325,20 +325,25 @@
     <select id="countTeacherByTenantIds" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper$UserCount">
         select tenant_id_ tenantId, count(tenant_id_) count
         from student
-        where tenant_id_ in
-        <foreach collection="tenantIdList" item="item" separator="," open="(" close=")">
-            #{item}
-        </foreach>
+        <where>
+            lock_flag_ = 0
+            <if test="tenantIdList != null">
+                AND tenant_id_ in
+                <foreach collection="tenantIdList" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
         group by tenant_id_
     </select>
     <select id="queryStudentCounts" resultType="java.lang.Integer">
         select count(tenant_id_)
         from student
         <where>
+            lock_flag_ = 0
             <if test="id != null">
                 and  tenant_id_ = #{id}
             </if>
         </where>
-
     </select>
 </mapper>

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

@@ -54,7 +54,7 @@
         </choose>
         left join sys_user su on su.id_ = t.user_id_
         <where>
-            t.lock_flag_ = 0 and su.del_flag_ = 0
+            t.lock_flag_ = 0 and su.del_flag_ = 0 AND t.tenant_id_ != -1
             <if test="keyword != null and keyword != ''">
                 and (
                 su.real_name_ like concat('%',#{keyword},'%')

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

@@ -376,18 +376,25 @@
     <select id="countTeacherByTenantIds" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper$UserCount">
         select tenant_id_ tenantId, count(tenant_id_) count
         from teacher
-        where tenant_id_ in
-        <foreach collection="tenantIdList" item="item" separator="," open="(" close=")">
-            #{item}
-        </foreach>
+        <where>
+            lock_flag_ = 0
+            <if test="tenantIdList != null">
+                AND tenant_id_ in
+                <foreach collection="tenantIdList" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+
         group by tenant_id_
     </select>
     <select id="queryTeacherCounts" resultType="java.lang.Integer">
         select count(tenant_id_)
         from teacher
         <where>
+             lock_flag_ = 0
             <if test="id != null">
-              and   tenant_id_ = #{id}
+              and tenant_id_ = #{id}
             </if>
         </where>
     </select>

+ 29 - 0
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindHistoryMapper.xml

@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE  mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.yonge.cooleshow.biz.dal.mapper.TenantUnbindHistoryMapper">
+
+    <!-- 表字段 -->
+    <sql id="baseColumns">
+        t.id_ AS id
+        , t.tenant_id_ AS tenantId
+        , t.tenant_name_ AS tenantName
+        , t.user_id_ AS userId
+        , t.user_name_ AS userName
+        , t.phone_ AS phone
+        , t.user_type_ AS userType
+        , t.unbind_reason_ AS unbindReason
+        , t.status_ AS status
+        , t.verify_user_id_ AS verifyUserId
+        , t.reason_ AS reason
+        , t.intervene_time_ AS interveneTime
+        , t.create_time_ AS createTime
+    </sql>
+
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.TenantUnbindHistory">
+        SELECT
+        <include refid="baseColumns" />
+        FROM tenant_unbind_history t
+        order by id_ desc
+    </select>
+
+</mapper>

+ 11 - 4
cooleshow-user/user-biz/src/main/resources/config/mybatis/TenantUnbindRecordMapper.xml

@@ -5,7 +5,10 @@
     <sql id="baseColumns">
         t.id_ AS id
         , t.tenant_id_ AS tenantId
+        , t.tenant_name_ AS tenantName
         , t.user_id_ AS userId
+        , t.user_name_ AS userName
+        , t.phone_ AS phone
         , t.user_type_ AS userType
         , t.unbind_reason_ AS unbindReason
         , t.status_ AS status
@@ -20,14 +23,11 @@
             resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindRecordWrapper$TenantUnbindRecord">
         SELECT
         <include refid="baseColumns"/>
-        ,ti.name_ as tenantName
         ,ti.province_code_ as provinceCode
         ,ti.city_code_ as cityCode
         ,ti.region_code_ as regionCode
         ,ti.username_ as tenantUserName
         ,ti.phone_ as tenantUserPhone
-        ,su.username_ as userName
-        ,su.phone_ as phone
         ,su.avatar_ as avatar
         FROM tenant_unbind_record t
         LEFT JOIN tenant_info ti ON ti.id_ = t.tenant_id_
@@ -58,6 +58,13 @@
                 AND t.status_ = #{param.status}
             </if>
         </where>
-        order by t.status_='DOING' desc, t.id_
+        order by t.status_='DOING' desc, t.update_time_ desc
+    </select>
+
+    <select id="getRecord" resultType="com.yonge.cooleshow.biz.dal.entity.TenantUnbindRecord">
+        SELECT
+        <include refid="baseColumns"/>
+        FROM tenant_unbind_record t
+        where tenant_id_ = #{tenantId} and user_id_ = #{userId} and user_type_ = #{userType}
     </select>
 </mapper>

+ 32 - 2
cooleshow-user/user-biz/src/main/resources/config/mybatis/UserTenantAlbumRecordMapper.xml

@@ -25,10 +25,40 @@
         , t.reason_ AS reason
         </sql> 
     
-    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord">
+    <select id="selectPage" resultType="com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper$TenantAlbum">
 		SELECT         
         	<include refid="baseColumns" />
 		FROM user_tenant_album_record t
+        <where>
+
+        </where>
 	</select>
-    
+    <select id="selectTenantIds" resultType="java.lang.Long">
+        select distinct tenant_album_id_
+        from user_tenant_album_record
+        <where>
+            end_time_ > now()
+          <if test="id != null">
+              and user_id_ = #{id}
+          </if>
+        </where>
+    </select>
+    <select id="selectTenantAlbumInfo" resultType="com.yonge.cooleshow.biz.dal.entity.TenantAlbum">
+        select id_ AS id,
+               name_ AS name,
+               describe_ AS `describe`,
+               cover_img_ AS coverImg,
+               subject_types_ AS subjectTypes
+        FROM tenant_album
+        <where>
+            <if test="tenantIds != null">
+                and id_ in
+                <foreach collection="tenantIds" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+        </where>
+
+    </select>
+
 </mapper>

+ 5 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/TenantActivationCodeController.java

@@ -59,6 +59,11 @@ public class TenantActivationCodeController extends BaseController {
         // 查询数据
         IPage<TenantActivationCodeWrapper.TenantActivationCode> pages =
                 tenantActivationCodeService.selectPage(QueryInfo.getPage(query), query);
+        for (TenantActivationCodeWrapper.TenantActivationCode record : pages.getRecords()) {
+            String activationCode = record.getActivationCode();
+            String substring = activationCode.substring(3);
+            record.setActivationCode("***" + substring);
+        }
         return succeed(QueryInfo.pageInfo(pages, pages.getRecords()));
     }
 

+ 88 - 0
cooleshow-user/user-student/src/main/java/com/yonge/cooleshow/student/controller/UserTenantAlbumRecordController.java

@@ -0,0 +1,88 @@
+package com.yonge.cooleshow.student.controller;
+
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.microsvc.toolkit.common.response.template.R;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yonge.cooleshow.biz.dal.wrapper.TenantAlbumWrapper;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+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 lombok.extern.slf4j.Slf4j;
+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.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 com.baomidou.mybatisplus.core.metadata.IPage;
+
+import com.yonge.cooleshow.biz.dal.service.UserTenantAlbumRecordService;
+import com.yonge.cooleshow.biz.dal.wrapper.UserTenantAlbumRecordWrapper;
+import com.yonge.cooleshow.biz.dal.entity.UserTenantAlbumRecord;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/userTenantAlbumRecord")
+@Api(tags = "购买训练工具记录")
+public class UserTenantAlbumRecordController {
+
+    @Autowired
+    private UserTenantAlbumRecordService userTenantAlbumRecordService;
+
+    @ApiOperation(value = "详情", notes = "购买训练工具记录-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@auditsvc.hasPermissions('userTenantAlbumRecord/detail', {'BACKEND'})")
+    //@GetMapping("/detail/{id}")
+    public R<UserTenantAlbumRecord> detail(@PathVariable("id") Long id) {
+
+        UserTenantAlbumRecord wrapper = userTenantAlbumRecordService.detail(id);
+
+        return R.from(wrapper);
+    }
+
+    @ApiOperation(value = "查询分页", notes = "购买训练工具记录- 传入 UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery")
+    //@PreAuthorize("@auditsvc.hasPermissions('userTenantAlbumRecord/page', {'BACKEND'})")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<TenantAlbumWrapper.TenantAlbum>> page(@RequestBody UserTenantAlbumRecordWrapper.UserTenantAlbumRecordQuery query) {
+
+        IPage<TenantAlbumWrapper.TenantAlbum> pages = userTenantAlbumRecordService.selectPage(QueryInfo.getPage(query), query);
+
+        return HttpResponseResult.succeed(PageUtil.pageInfo(pages));
+    }
+
+    @ApiOperation(value = "新增", notes = "购买训练工具记录- 传入 UserTenantAlbumRecordWrapper.UserTenantAlbumRecord")
+    @PreAuthorize("@auditsvc.hasPermissions('userTenantAlbumRecord/save', {'BACKEND'})")
+    //@PostMapping("/save")
+    public R<JSONObject> add(@Validated @RequestBody UserTenantAlbumRecord userTenantAlbumRecord) {
+
+        // 新增数据
+        userTenantAlbumRecordService.save(userTenantAlbumRecord);
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "修改", notes = "购买训练工具记录- 传入 UserTenantAlbumRecordWrapper.UserTenantAlbumRecord")
+    @PreAuthorize("@auditsvc.hasPermissions('userTenantAlbumRecord/update', {'BACKEND'})")
+    //@PostMapping("/update")
+    public R<JSONObject> update(@Validated @RequestBody UserTenantAlbumRecord userTenantAlbumRecord) {
+
+        // 更新数据
+        userTenantAlbumRecordService.updateById(userTenantAlbumRecord);
+
+        return R.defaultR();
+    }
+
+    @ApiOperation(value = "删除", notes = "购买训练工具记录- 传入id")
+    @PreAuthorize("@auditsvc.hasPermissions('userTenantAlbumRecord/remove', {'BACKEND'})")
+    //@PostMapping("/remove")
+    public R<Boolean> remove(@RequestParam Long id) {
+
+        return R.from(userTenantAlbumRecordService.removeById(id));
+    }
+}

+ 59 - 7
cooleshow-user/user-teacher/src/main/java/com/yonge/cooleshow/teacher/controller/TeacherController.java

@@ -7,11 +7,14 @@ import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.dto.TeacherDto;
 import com.yonge.cooleshow.biz.dal.entity.Subject;
 import com.yonge.cooleshow.biz.dal.entity.Teacher;
+import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
 import com.yonge.cooleshow.biz.dal.entity.TenantUnbindRecord;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
 import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
+import com.yonge.cooleshow.biz.dal.service.SubjectService;
 import com.yonge.cooleshow.biz.dal.service.SysUserService;
 import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
 import com.yonge.cooleshow.biz.dal.vo.MyFens;
 import com.yonge.cooleshow.biz.dal.vo.TeacherHomeVo;
@@ -20,6 +23,7 @@ import com.yonge.cooleshow.biz.dal.wrapper.teacher.TeacherWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ETenantUnBindAuditStatus;
+import com.yonge.toolset.base.exception.BizException;
 import com.yonge.toolset.base.page.PageInfo;
 import com.yonge.toolset.base.page.QueryInfo;
 import com.yonge.toolset.base.util.StringUtil;
@@ -31,6 +35,7 @@ import io.swagger.annotations.ApiParam;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -41,7 +46,9 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
 import javax.validation.Valid;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/teacher")
@@ -61,6 +68,12 @@ public class TeacherController extends BaseController {
     @Autowired
     private TenantUnbindRecordService tenantUnbindRecordService;
 
+    @Autowired
+    private TenantInfoService tenantInfoService;
+
+    @Autowired
+    private SubjectService subjectService;
+
     @ApiOperation(value = "我的-查询教师基本信息")
     @GetMapping("/queryUserInfo")
     public HttpResponseResult<TeacherHomeVo> queryUserInfo() {
@@ -191,14 +204,11 @@ public class TeacherController extends BaseController {
 
     @PostMapping("/unbindTenant")
     @ApiOperation(value = "解绑机构申请")
-    public HttpResponseResult<Boolean> unbindTenant(@RequestBody TeacherWrapper.UnbindTenant unbindTenant) {
+    public HttpResponseResult<Boolean> unbindTenant(@Validated @RequestBody TeacherWrapper.UnbindTenant unbindTenant) {
         SysUser user = sysUserFeignService.queryUserInfo();
         if (user == null || null == user.getId()) {
             return failed(HttpStatus.FORBIDDEN, "请登录");
         }
-        if (StringUtils.isEmpty(unbindTenant.getCode())) {
-            return failed("验证码不能为空");
-        }
         boolean validCode = smsCodeService.verifyValidCode(user.getPhone(), unbindTenant.getCode(), "");
         if (!validCode) {
             return failed("验证码错误");
@@ -216,18 +226,60 @@ public class TeacherController extends BaseController {
                 .eq(TenantUnbindRecord::getTenantId, user.getTenantId())
                 .eq(TenantUnbindRecord::getUserType, "TEACHER")
                 .eq(TenantUnbindRecord::getUserId, user.getId())
-                .eq(TenantUnbindRecord::getStatus, ETenantUnBindAuditStatus.DOING)
                 .last("limit 1").one();
-        if (one != null) {
+        if (one != null && ETenantUnBindAuditStatus.DOING.equals(one.getStatus())) {
             return failed("请勿重复提交申请");
         }
+        TenantInfo tenantInfo = tenantInfoService.getById(user.getTenantId());
         TenantUnbindRecord tenantUnbindRecord = new TenantUnbindRecord();
         tenantUnbindRecord.setTenantId(user.getTenantId());
+        tenantUnbindRecord.setTenantName(tenantInfo == null ? "" : tenantInfo.getName());
         tenantUnbindRecord.setUserId(user.getId());
+        tenantUnbindRecord.setUserName(user.getRealName());
+        tenantUnbindRecord.setPhone(user.getPhone());
+
+        String subjectId = teacher.getSubjectId();
+        if (StringUtils.isNotEmpty(subjectId)) {
+            List<Long> subjectIdList = Arrays.stream(subjectId.split(",")).map(Long::valueOf)
+                    .collect(Collectors.toList());
+            List<Subject> subject = subjectService.findBySubjectByIdList(subjectIdList);
+            String subjectName = subject.stream().map(Subject::getName).collect(Collectors.joining(","));
+            tenantUnbindRecord.setSubjectName(subjectName);
+        }
+
         tenantUnbindRecord.setUserType("TEACHER");
         tenantUnbindRecord.setUnbindReason(unbindTenant.getUnbindReason());
         tenantUnbindRecord.setStatus(ETenantUnBindAuditStatus.DOING);
-        tenantUnbindRecordService.save(tenantUnbindRecord);
+        tenantUnbindRecordService.saveOrUpdate(tenantUnbindRecord);
+
+        if (one != null) {
+            tenantUnbindRecordService.lambdaUpdate()
+                    .set(TenantUnbindRecord::getVerifyUserId, null)
+                    .set(TenantUnbindRecord::getReason, null)
+                    .set(TenantUnbindRecord::getInterveneTime, null)
+                    .eq(TenantUnbindRecord::getId, one.getId())
+                    .update();
+        }
         return succeed();
     }
+
+    @PostMapping("/unbindTenantCancel")
+    @ApiOperation(value = "解绑机构申请撤销")
+    public HttpResponseResult<Boolean> unbindTenantCancel() {
+        SysUser user = sysUserFeignService.queryUserInfo();
+        if (user == null || null == user.getId()) {
+            return failed(HttpStatus.FORBIDDEN, "请登录");
+        }
+        boolean update = tenantUnbindRecordService.lambdaUpdate()
+                .eq(TenantUnbindRecord::getUserId, user.getId())
+                .eq(TenantUnbindRecord::getTenantId, user.getTenantId())
+                .eq(TenantUnbindRecord::getStatus, ETenantUnBindAuditStatus.DOING)
+                .set(TenantUnbindRecord::getStatus, ETenantUnBindAuditStatus.CANCEL)
+                .update();
+        if (!update) {
+            throw new BizException("未查询到提交的申请记录");
+        }
+        return succeed();
+
+    }
 }

+ 23 - 9
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantActivationCodeController.java

@@ -17,17 +17,12 @@ 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.service.TenantStaffService;
-import com.yonge.cooleshow.biz.dal.vo.StudentVo;
-import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 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.common.enums.BizHttpStatus;
-import com.yonge.cooleshow.common.enums.UserLockFlag;
-import com.yonge.cooleshow.common.enums.UserStatusEnum;
-import com.yonge.cooleshow.common.enums.YesOrNoEnum;
+import com.yonge.cooleshow.common.enums.EActivationCode;
 import com.yonge.cooleshow.tenant.vo.TenantActivationCodeVo;
-import com.yonge.toolset.mybatis.support.PageUtil;
 import com.yonge.toolset.utils.date.DateUtil;
 import com.yonge.toolset.utils.easyexcel.ErrMsg;
 import com.yonge.toolset.utils.easyexcel.ExcelDataReader;
@@ -37,7 +32,6 @@ import com.yonge.toolset.utils.excel.POIUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -53,7 +47,6 @@ import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
 import java.io.OutputStream;
 import java.util.Date;
 import java.util.List;
@@ -123,6 +116,26 @@ public class TenantActivationCodeController extends BaseController {
         return succeed();
     }
 
+    @ApiOperation(value = "激活码发放取消", notes = "传入 激活码的ID")
+    @PostMapping("/sendCancel")
+    public HttpResponseResult<Boolean> sendCancel(@RequestParam("id") Long id) {
+        TenantInfo tenantInfo = getTenantInfo();
+        TenantActivationCode activationCode = tenantActivationCodeService.getById(id);
+        if (activationCode == null || !tenantInfo.getId().equals(activationCode.getTenantId())) {
+            throw new BizException("激活码不存在");
+        }
+        boolean update = tenantActivationCodeService.lambdaUpdate()
+                .set(TenantActivationCode::getSendStatus, EActivationCode.WAIT)
+                .eq(TenantActivationCode::getTenantId, id)
+                .eq(TenantActivationCode::getActivationStatus, false)
+                .eq(TenantActivationCode::getSendStatus, EActivationCode.SEND)
+                .update();
+        if (!update) {
+            throw new BizException("激活码已经激活");
+        }
+        return succeed();
+    }
+
     @GetMapping("/exportActiveCode")
     @ApiOperation(value = "导出模板")
     public void exportActiveCode(HttpServletResponse response) {
@@ -178,7 +191,8 @@ public class TenantActivationCodeController extends BaseController {
         try {
             ExcelDataReader<TenantActivationCodeWrapper.ImportTemplate> reader =
                     ExcelUtils.getReader(TenantActivationCodeWrapper.ImportTemplate.class, file);
-            tenantActivationCodeService.importActiveCode(reader.getDataList(), user.getTenantId(), user.getId(), tenantAlbumPurchaseId);
+            tenantActivationCodeService.importActiveCode(reader.getDataList(), user.getTenantId(), user.getId(),
+                    tenantAlbumPurchaseId);
             return HttpResponseResult.succeed();
         } catch (ExcelException e) {
             return HttpResponseResult.failed(BizHttpStatus.IMPORT.getCode(), e.getErrMsgList(),

+ 0 - 1
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantAlbumPurchaseController.java

@@ -22,7 +22,6 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 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.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;

+ 90 - 26
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantInfoController.java

@@ -1,31 +1,28 @@
 package com.yonge.cooleshow.tenant.controller;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.google.gson.JsonObject;
+import com.timevale.tech.sdk.seal.IFontsLoader;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.TenantAlbumPurchase;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
-import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
-import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
+import com.yonge.cooleshow.biz.dal.service.*;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantInfoWrapper;
+import com.yonge.cooleshow.common.constant.SysConfigConstant;
 import com.yonge.cooleshow.common.controller.BaseController;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.security.SecurityConstants;
+import com.yonge.cooleshow.tenant.io.request.SysUserWrapper;
 import com.yonge.cooleshow.tenant.io.request.TenantInfoVo;
-import com.yonge.toolset.base.exception.BizException;
-import com.yonge.toolset.base.page.PageInfo;
-import com.yonge.toolset.base.util.StringUtil;
-import com.yonge.toolset.mybatis.support.PageUtil;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
-import org.apache.ibatis.annotations.Param;
 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.*;
 
 import javax.validation.Valid;
@@ -49,58 +46,125 @@ public class TenantInfoController extends BaseController {
     @Autowired
     private SmsCodeService smsCodeService;
 
+    @Autowired
+    private TenantStaffService tenantStaffService;
+
+    @Autowired
+    private SysConfigService sysConfigService;
+
     @ApiOperation(value = "发送登录短信验证码")
-    @ApiImplicitParams({  @ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
-            @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)", required = true, dataType = "String") })
+    @ApiImplicitParams({@ApiImplicitParam(name = "mobile", value = "手机号", required = true, dataType = "String"),
+            @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)", required =
+                    true, dataType = "String")})
     @PostMapping(value = "/sendSmsCode")
-    public Object sendLoginVerifyCode(String mobile,String type) throws Exception {
+    public Object sendLoginVerifyCode(String mobile, String type) throws Exception {
         smsCodeService.sendValidCode(mobile, type, ClientEnum.SYSTEM);
         return succeed();
     }
 
     @ApiOperation(value = "校验短信验证码")
-    @ApiImplicitParams({ @ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
+    @ApiImplicitParams({@ApiImplicitParam(name = "phone", value = "手机号", required = true, dataType = "String"),
             @ApiImplicitParam(name = "code", value = "短信验证码", required = true, dataType = "String"),
-            @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)", required = true, dataType = "String") })
+            @ApiImplicitParam(name = "type", value = "类型(PASSWD:修改密码,LOGIN:登录或注册,BANK:绑定银行卡,PHONE:修改手机号)", required =
+                    true, dataType = "String")})
     @PostMapping(value = "/verifySmsCode")
-    public Object verifySmsCode(String phone,String code,String type) {
-        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)){
+    public Object verifySmsCode(String phone, String code, String type) {
+        if (StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) {
             return failed(SecurityConstants.PARAM_VERIFY_EXCEPTION);
         }
-        if(smsCodeService.verifyValidCode(phone,code,type)){
+        if (smsCodeService.verifyValidCode(phone, code, type)) {
             return succeed();
         }
         return failed("验证码校验失败");
     }
 
 
-
     /**
-     * 修改数据
+     * 机构修改数据
      */
     @PostMapping("/update")
     @ApiOperation(value = "修改机构信息", notes = "传入TenantInfo")
 //    @PreAuthorize("@pcs.hasPermissions('tenantInfoUpdate/update')")
     public HttpResponseResult<Boolean> updateTenantInfo(@Valid @RequestBody TenantInfoVo.TenantInfo info) {
-
-        return succeed(tenantInfoService.update(JSON.parseObject(info.jsonString(), TenantInfo.class)));
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Long id = sysUser.getId();
+        TenantStaff staff = tenantStaffService.lambdaQuery().eq(TenantStaff::getUserId, id).list().get(0);
+        Long tenantId = staff.getTenantId();
+        return succeed(tenantInfoService.updateTenantInfo(JSON.parseObject(info.jsonString(), TenantInfo.class), tenantId));
 
     }
 
+
+
+
     /**
-     * 查询详细
+     * 当前机构查询详细
      */
     @PostMapping("/detail")
     @ApiOperation(value = "查询详细", notes = "查询详细")
 //    @PreAuthorize("@pcs.hasPermissions('tenantInfoUpdate/detail')")
-    public HttpResponseResult<TenantInfoWrapper.TenantInfo> detail(@RequestParam("id")Long id) {
-        TenantInfoWrapper.TenantInfo info = tenantInfoService.detailTenantInfo(id);
-
+    public HttpResponseResult<TenantInfoWrapper.TenantInfo> detail() {
+        TenantInfoWrapper.TenantInfo info = new TenantInfoWrapper.TenantInfo();
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        Long id = sysUser.getId();
+        TenantStaff staff = tenantStaffService.lambdaQuery().eq(TenantStaff::getUserId, id).list().get(0);
+        Long tenantId = staff.getTenantId();
+        if (!(tenantId == null)){
+            info = tenantInfoService.detailTenantInfo(id);
+        }
         return succeed(info);
+    }
+
+
 
+    /**
+     * 当前用户查询详细
+     */
+    @PostMapping("/sysUserDetail")
+    @ApiOperation(value = "查询详细", notes = "查询详细")
+//    @PreAuthorize("@pcs.hasPermissions('tenantInfoUpdate/sysUserDetail')")
+    public HttpResponseResult<SysUser> sysUserDetail() {
+
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+
+
+        return HttpResponseResult.succeed(sysUser);
     }
 
+    /**
+     * 当前用户修改信息
+     */
+    @PostMapping("/sysUserUpdate")
+    @ApiOperation(value = "用户修改", notes = "用户修改")
+//    @PreAuthorize("@pcs.hasPermissions('tenantInfoUpdate/sysUserUpdate')")
+    public HttpResponseResult<Boolean> sysUserUpdate(SysUserWrapper.SysUser sysUser) {
+        com.yonge.cooleshow.biz.dal.entity.SysUser sysUser1 = JSON.parseObject(sysUser.jsonString(), com.yonge.cooleshow.biz.dal.entity.SysUser.class);
+        SysUser user = sysUserFeignService.queryUserInfo();
+        tenantInfoService.updateSysUser(sysUser1,user.getId());
+
+        //判断更改的手机所属的机构信息
+        String phone = sysUser.getPhone();
+
+        //设置默认头像
+        if (sysUser.getAvatar().isEmpty()){
+            sysUser.setAvatar(sysConfigService.findConfigValue(SysConfigConstant.DEFAULT_HEARD));
+        }
+
+        TenantInfo info = tenantInfoService.lambdaQuery().eq(TenantInfo::getPhone, phone).list().get(0);
+        if (!(info == null)){
+            //更新tennatInfo
+            tenantInfoService.lambdaUpdate().set(TenantInfo::getPhone,phone)
+                                            .eq(TenantInfo::getUserId,user.getId());
 
+            //更新员工表
+            tenantStaffService.lambdaUpdate().set(TenantStaff::getNickname,sysUser.getUsername())
+                                             .set(TenantStaff::getAvatar,sysUser.getAvatar())
+                                             .eq(TenantStaff::getUserId,user.getId());
+        }
 
 
+
+        return HttpResponseResult.succeed(true);
+    }
+
 }

+ 17 - 11
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/TenantUnbindRecordController.java

@@ -6,8 +6,6 @@ import com.microsvc.toolkit.common.response.paging.QueryInfo;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.biz.dal.entity.TenantStaff;
-import com.yonge.cooleshow.biz.dal.service.EmployeeService;
-import com.yonge.cooleshow.biz.dal.service.SysAreaService;
 import com.yonge.cooleshow.biz.dal.service.TenantStaffService;
 import com.yonge.cooleshow.biz.dal.service.TenantUnbindRecordService;
 import com.yonge.cooleshow.biz.dal.wrapper.TenantUnbindRecordWrapper;
@@ -25,6 +23,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.annotation.Resource;
+
 
 @Slf4j
 @Validated
@@ -36,16 +36,10 @@ public class TenantUnbindRecordController extends BaseController {
     @Autowired
     private TenantUnbindRecordService tenantUnbindRecordService;
 
-    @Autowired
-    private SysAreaService sysAreaService;
-
-    @Autowired
+    @Resource
     private SysUserFeignService sysUserFeignService;
 
     @Autowired
-    private EmployeeService employeeService;
-
-    @Autowired
     private TenantStaffService tenantStaffService;
 
 
@@ -67,13 +61,25 @@ public class TenantUnbindRecordController extends BaseController {
             throw new BizException("请登录");
         }
         Long id = sysUserFeignService.queryUserInfo().getId();
-        TenantStaff employeeVo = tenantStaffService.lambdaQuery().eq(TenantStaff::getUserId,id)
+        TenantStaff employeeVo = tenantStaffService.lambdaQuery().eq(TenantStaff::getUserId, id)
                 .last("limit 1").one();
         if (employeeVo == null || UserLockFlag.LOCKED.equals(employeeVo.getStatus())) {
             throw new BizException("权限不足");
         }
-        tenantUnbindRecordService.tenantUserUnbindAudit(audio, sysUser.getId(),false);
+        tenantUnbindRecordService.tenantUserUnbindAudit(audio, sysUser.getId(), false);
+        return succeed();
+    }
+
+    @PostMapping("/unbindTenant")
+    @ApiOperation(value = "机构解绑")
+    public HttpResponseResult<Boolean> unbindTenant(@Validated @RequestBody TenantUnbindRecordWrapper.Unbind unbind) {
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (sysUser == null) {
+            throw new BizException("请登录");
+        }
+        tenantUnbindRecordService.unbindTenant(sysUser.getTenantId(), sysUser.getId(), unbind);
         return succeed();
+
     }
 
 

+ 57 - 1
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/controller/open/OpenStudentController.java

@@ -1,13 +1,22 @@
 package com.yonge.cooleshow.tenant.controller.open;
 
 import com.alibaba.fastjson.JSON;
+import com.google.common.collect.ImmutableList;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.ImGroupMember;
 import com.yonge.cooleshow.biz.dal.entity.Student;
+import com.yonge.cooleshow.biz.dal.entity.Teacher;
 import com.yonge.cooleshow.biz.dal.entity.TenantInfo;
+import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.enums.MessageTypeEnum;
+import com.yonge.cooleshow.biz.dal.service.ImGroupMemberService;
+import com.yonge.cooleshow.biz.dal.service.ImGroupService;
+import com.yonge.cooleshow.biz.dal.service.ImUserFriendService;
 import com.yonge.cooleshow.biz.dal.service.SmsCodeService;
 import com.yonge.cooleshow.biz.dal.service.StudentService;
+import com.yonge.cooleshow.biz.dal.service.TeacherService;
 import com.yonge.cooleshow.biz.dal.service.TenantInfoService;
 import com.yonge.cooleshow.biz.dal.wrapper.StudentWrapper;
 import com.yonge.cooleshow.common.controller.BaseController;
@@ -16,6 +25,7 @@ import com.yonge.cooleshow.tenant.vo.StudentVo;
 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.validation.annotation.Validated;
@@ -25,7 +35,11 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
+import java.util.HashSet;
+import java.util.List;
+import java.util.stream.Collectors;
 
+@Slf4j
 @RestController
 @RequestMapping("/open/student")
 @Api(value = "学生表", tags = "学生表")
@@ -34,6 +48,9 @@ public class OpenStudentController extends BaseController {
     private StudentService studentService;
 
     @Autowired
+    private TeacherService teacherService;
+
+    @Autowired
     private TenantInfoService tenantInfoService;
 
     @Resource
@@ -42,6 +59,15 @@ public class OpenStudentController extends BaseController {
     @Autowired
     private SmsCodeService smsCodeService;
 
+    @Autowired
+    private ImUserFriendService imUserFriendService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+
     @PostMapping("/save")
     @ApiOperation(value = "新增/修改", notes = "传入Student,换绑时按照返回错误码5004判断,是否需要换绑,updateTenant=true表示换绑")
     public HttpResponseResult<Boolean> save(@Validated @RequestBody StudentVo.Student student) {
@@ -78,10 +104,30 @@ public class OpenStudentController extends BaseController {
             if (one != null) {
                 if (one.getTenantId().equals(-1L)) {
                     throw new BizException("该手机号已经注册为平台学生");
-                } else if (!one.getTenantId().equals(tenantId) && (student.getUpdateTenant() == null ||
+                }
+                if (one.getTenantId().equals(tenantId)) {
+                    throw new BizException("已经注册当前机构,请勿重复注册");
+                }
+                // 转到其他机构
+                if ((student.getUpdateTenant() == null ||
                         !student.getUpdateTenant())) {
                     throw new BizException(5004, "该手机号已经注册为其他平台学生");
                 }
+                // 退群
+                List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                        .eq(ImGroupMember::getRoleType, ImGroupMemberRoleType.STUDENT)
+                        .eq(ImGroupMember::getIsAdmin, false)
+                        .eq(ImGroupMember::getUserId, one.getUserId())
+                        .list();
+                List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId)
+                        .distinct().collect(Collectors.toList());
+                groupIdList.forEach(groupId -> {
+                    try {
+                        imGroupService.quit(groupId, one.getUserId(), ClientEnum.STUDENT);
+                    } catch (Exception e) {
+                        log.error("学生注册,切换机构退群失败:{}", e.getMessage());
+                    }
+                });
             }
             student.setId(studentId);
         }
@@ -90,6 +136,16 @@ public class OpenStudentController extends BaseController {
         StudentWrapper.Student studentInfo = JSON.parseObject(JSON.toJSONString(student), StudentWrapper.Student.class);
         studentInfo.setTenantId(tenantInfo.getId());
         studentService.save(studentInfo);
+
+        // 加好友
+        if (student.getId() == null) {
+            SysUser sysUser = sysUserFeignService.queryUserByMobile(student.getPhone());
+            // 自动与机构老师成为好友
+            List<Teacher> teacherList = teacherService.lambdaQuery()
+                    .eq(Teacher::getTenantId, tenantId).list();
+            teacherList.forEach(next -> imUserFriendService.saveUserFriend(next.getUserId(),
+                    new HashSet<>(ImmutableList.of(sysUser.getId()))));
+        }
         return succeed();
     }
 }

+ 41 - 0
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/io/request/SysUserWrapper.java

@@ -0,0 +1,41 @@
+package com.yonge.cooleshow.tenant.io.request;
+
+import com.alibaba.fastjson.JSON;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 用户信息
+ * 2023-08-21 15:55:00
+ */
+@ApiModel(value = "用户对象", description = "用户对象")
+public class SysUserWrapper {
+
+    @Data
+    @ApiModel("sysUer")
+    public static class SysUser {
+
+        @ApiModelProperty(value = "用户名")
+        private String username;
+
+        @ApiModelProperty(value = "手机号")
+        private String phone;
+
+        /** 头像 */
+        @ApiModelProperty(value = "头像")
+        private String avatar;
+
+
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static SysUser from(String json) {
+            return JSON.parseObject(json, SysUser.class);
+        }
+    }
+
+}

+ 0 - 9
cooleshow-user/user-tenant/src/main/java/com/yonge/cooleshow/tenant/io/request/TenantInfoVo.java

@@ -45,15 +45,6 @@ public class TenantInfoVo {
         @NotNull
         private Integer regionCode;
 
-        @ApiModelProperty("联系人")
-        @Length(min = 1, max = 8, message = "联系人字符最大8位")
-        private String username;
-
-        @ApiModelProperty("手机号")
-        @NotNull
-        @Pattern(regexp = "^1\\d{10}$", message = "手机号码格式错误")
-        private String phone;
-
         public String jsonString() {
             return JSON.toJSONString(this);
         }