Ver Fonte

Merge branch 'feature/0613-opt' into develop-new

# Conflicts:
#	cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/MusicSheetController.java
#	cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserServiceImpl.java
yuanliang há 10 meses atrás
pai
commit
5d3691b488
14 ficheiros alterados com 285 adições e 16 exclusões
  1. 8 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java
  2. 11 0
      cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java
  3. 40 0
      cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SysUserController.java
  4. 0 1
      cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java
  5. 2 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java
  6. 12 1
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java
  7. 3 3
      cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/web/controller/UserController.java
  8. 11 0
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/OmsReturnApplyQueryParam.java
  9. 29 1
      cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java
  10. 5 1
      cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderReturnApplyDao.xml
  11. 4 0
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserService.java
  12. 8 3
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/ImGroupMemberServiceImpl.java
  13. 10 1
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/MusicSheetServiceImpl.java
  14. 142 4
      cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/impl/SysUserServiceImpl.java

+ 8 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/AdminFeignService.java

@@ -209,4 +209,12 @@ public interface AdminFeignService {
     HttpResponseResult<Object> workOverdue();
 
 
+    /**
+     * 账号注销校验
+     */
+    @PostMapping("/sysUser/logoffCheck")
+    HttpResponseResult<List<String>> accountLogoffCheck(@RequestParam("phone") String phone);
+
+    @PostMapping("/sysUser/dismissFanImGroup")
+    HttpResponseResult<Boolean> dismissFanImGroup(@RequestParam("phone") String phone);
 }

+ 11 - 0
cooleshow-api/src/main/java/com/yonge/cooleshow/api/feign/fallback/AdminFeignServiceFallback.java

@@ -204,4 +204,15 @@ public class AdminFeignServiceFallback implements AdminFeignService {
     public ImUserInfo register(String userId, String clientType, String username, String avatar) {
         return null;
     }
+
+
+    @Override
+    public HttpResponseResult<List<String>> accountLogoffCheck(String phone) {
+        return null;
+    }
+
+    @Override
+    public HttpResponseResult<Boolean> dismissFanImGroup(String phone) {
+        return null;
+    }
 }

+ 40 - 0
cooleshow-app/src/main/java/com/yonge/cooleshow/admin/controller/SysUserController.java

@@ -0,0 +1,40 @@
+package com.yonge.cooleshow.admin.controller;
+
+import com.yonge.cooleshow.biz.dal.service.SysUserService;
+import com.yonge.cooleshow.common.controller.BaseController;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
+import io.swagger.annotations.Api;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("${app-config.url.admin:}/sysUser")
+@Api(value = "用户表", tags = "用户表")
+public class SysUserController extends BaseController {
+
+    @Autowired
+    private SysUserService sysUserService;
+
+
+    /**
+     * 账号注销校验
+     */
+    @PostMapping("/sysUser/logoffCheck")
+    HttpResponseResult<List<String>> accountLogoffCheck(@RequestParam("phone") String phone) {
+        List<String> strings = sysUserService.accountLogoffCheck(phone);
+        return HttpResponseResult.succeed(strings);
+    }
+
+    @PostMapping("/sysUser/dismissFanImGroup")
+    HttpResponseResult<Boolean> dismissFanImGroup(@RequestParam("phone") String phone){
+        sysUserService.dismissFanImGroup(phone);
+        return HttpResponseResult.succeed(true);
+    }
+
+}

+ 0 - 1
cooleshow-app/src/main/java/com/yonge/cooleshow/teacher/controller/MusicSheetController.java

@@ -169,7 +169,6 @@ public class MusicSheetController extends BaseController {
         return succeed(cbsMusicScoreService.musicSheetAdd(addMusicSheet));
     }
 
-
     @ApiOperation(value = "修改", httpMethod="POST", consumes="application/json", produces="application/json")
     @PostMapping(value="/update", consumes="application/json", produces="application/json")
     public HttpResponseResult<Object> update(@Valid @RequestBody MusicSheetDto musicSheet) {

+ 2 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/SysUserService.java

@@ -7,6 +7,7 @@ import com.yonge.cooleshow.auth.api.dto.UserSetReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
 import com.yonge.cooleshow.auth.api.vo.UserSetVo;
 import com.yonge.cooleshow.auth.enums.EClientType;
+import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.entity.ImUserModel;
 import com.yonge.toolset.mybatis.service.BaseService;
 
@@ -221,7 +222,7 @@ public interface SysUserService extends BaseService<Long, SysUser> {
      */
     SysUser getSysUserByOpenId(String openId, String clientId);
 
-    void logoffByPhone(String phone);
+    HttpResponseResult<List<String>> logoffByPhone(String phone);
 
 
     void updateStudentHideFlag(Long userId, int hideFlag);

+ 12 - 1
cooleshow-auth/auth-server/src/main/java/com/yonge/cooleshow/auth/service/impl/SysUserServiceImpl.java

@@ -432,7 +432,14 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void logoffByPhone(String phone) {
+    public HttpResponseResult<List<String>> logoffByPhone(String phone) {
+
+        HttpResponseResult<List<String>> check = adminFeignService.accountLogoffCheck(phone);
+        List<String> errMsg = check.getData();
+        if (org.apache.commons.collections.CollectionUtils.isNotEmpty(errMsg)) {
+            return HttpResponseResult.failed(500, errMsg, "注销失败");
+        }
+
         int num = sysUserDao.countByPhone(phone);
         //冻结相关所有客户端账号
         sysUserDao.updateLockStatusByPhone(phone);
@@ -441,8 +448,12 @@ public class SysUserServiceImpl extends BaseServiceImpl<Long, SysUser> implement
         if(i < 1){
             throw new BizException("用户不存在或已注销");
         }
+        // 解散群
+        adminFeignService.dismissFanImGroup(phone);
+
         //退出登录
         tokenService.revokeTokenByPhone(phone);
+        return HttpResponseResult.succeed();
     }
 
     @Override

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

@@ -1,5 +1,6 @@
 package com.yonge.cooleshow.auth.web.controller;
 
+import com.yonge.cooleshow.api.feign.StudentFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.dto.SysUserQueryInfo;
 import com.yonge.cooleshow.auth.api.dto.UpdatePasswordDto;
@@ -439,7 +440,7 @@ public class UserController extends BaseController {
             @ApiImplicitParam(name = "smsCode", value = "短信验证码", paramType = "path", dataType = "long", required = true),
     })
     @GetMapping(value = "/logoff/{smsCode}")
-    public HttpResponseResult<Boolean> logoff(@PathVariable("smsCode") String smsCode) {
+    public HttpResponseResult<List<String>> logoff(@PathVariable("smsCode") String smsCode) {
         AuthUser authUser = SecurityUtils.getUser();
         SysUser sysUser = sysUserService.get(authUser.getUserId());
         if (sysUser == null) {
@@ -450,9 +451,8 @@ public class UserController extends BaseController {
         if (!b) {
             throw new BadCredentialsException("验证码校验失败");
         }
-        sysUserService.logoffByPhone(sysUser.getPhone());
+        return sysUserService.logoffByPhone(sysUser.getPhone());
 //        sysUserService.logoffById(sysUser.getId());
-        return succeed(true);
     }
 
     @ApiOperation(value = "刷新token")

+ 11 - 0
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/dto/OmsReturnApplyQueryParam.java

@@ -22,6 +22,9 @@ public class OmsReturnApplyQueryParam {
     @ApiModelProperty(value = "处理时间")
     private String handleTime;
 
+    @ApiModelProperty(value = "订单编号")
+    private String orderSn;
+
     public Long getId() {
         return id;
     }
@@ -69,4 +72,12 @@ public class OmsReturnApplyQueryParam {
     public void setHandleTime(String handleTime) {
         this.handleTime = handleTime;
     }
+
+    public String getOrderSn() {
+        return orderSn;
+    }
+
+    public void setOrderSn(String orderSn) {
+        this.orderSn = orderSn;
+    }
 }

+ 29 - 1
cooleshow-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderReturnApplyServiceImpl.java

@@ -12,6 +12,7 @@ import com.yonge.cooleshow.common.service.IdGeneratorService;
 import com.yonge.cooleshow.mall.common.exception.ApiException;
 import com.yonge.cooleshow.mall.common.service.RedisService;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderItemMapper;
+import com.yonge.cooleshow.mbg.mapper.OmsOrderMapper;
 import com.yonge.cooleshow.mbg.model.*;
 import com.yonge.toolset.base.exception.BizException;
 import com.yonge.cooleshow.mbg.mapper.OmsOrderReturnApplyMapper;
@@ -36,6 +37,7 @@ import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 订单退货管理Service实现类
@@ -52,6 +54,9 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
     private OmsOrderReturnApplyMapper returnApplyMapper;
 
     @Autowired
+    private OmsOrderMapper orderMapper;
+
+    @Autowired
     private OmsOrderItemMapper orderItemMapper;
 
     @Autowired
@@ -136,7 +141,30 @@ public class OmsOrderReturnApplyServiceImpl implements OmsOrderReturnApplyServic
         } else {
             return 0;
         }
-        return returnApplyMapper.updateByPrimaryKeySelective(returnApply);
+        int update = returnApplyMapper.updateByPrimaryKeySelective(returnApply);
+        // 更新订单状态
+        updateOrderStatus(omsOrderReturnApply.getOrderSn());
+        return update;
+    }
+
+    private void updateOrderStatus(String orderSn) {
+        // 待发货订单,退费成功后,关闭订单
+        OmsOrder byOrderSn = orderMapper.getByOrderSn(orderSn);
+        if (byOrderSn.getStatus() != 1) {
+            return;
+        }
+
+
+        OmsOrderReturnApplyExample applyExample = new OmsOrderReturnApplyExample();
+        applyExample.createCriteria().andOrderSnEqualTo(orderSn);
+        List<OmsOrderReturnApply> applyList = returnApplyMapper.selectByExample(applyExample);
+
+        List<Integer> statusList = applyList.stream().map(OmsOrderReturnApply::getStatus).distinct().collect(Collectors.toList());
+        // 全部退回完成,更新订单状态为已关闭
+        if (statusList.stream().allMatch(n -> n == 2)) {
+            byOrderSn.setStatus(4);
+            orderMapper.updateByPrimaryKey(byOrderSn);
+        }
     }
 
 

+ 5 - 1
cooleshow-mall/mall-admin/src/main/resources/config/mybatis/OmsOrderReturnApplyDao.xml

@@ -13,7 +13,8 @@
         product_count,
         return_name,
         status,
-        handle_time
+        handle_time,
+        order_sn
         FROM
         oms_order_return_apply
         WHERE
@@ -40,6 +41,9 @@
             AND (return_name LIKE concat("%",#{queryParam.receiverKeyword},"%")
             OR return_phone LIKE concat("%",#{queryParam.receiverKeyword},"%"))
         </if>
+        <if test="queryParam.orderSn != null">
+            and order_sn like concat('%',#{queryParam.orderSn},'%')
+        </if>
         order by id desc
     </select>
     <select id="getDetail" resultMap="returnApplyDetailResultMap">

+ 4 - 0
cooleshow-user/user-biz/src/main/java/com/yonge/cooleshow/biz/dal/service/SysUserService.java

@@ -42,4 +42,8 @@ public interface SysUserService{
      *
      */
     void imDeviceId(UserInfoWrapper.UpdateUser info);
+
+    List<String> accountLogoffCheck(String phone);
+
+    void dismissFanImGroup(String phone);
 }

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

@@ -230,13 +230,18 @@ public class ImGroupMemberServiceImpl extends ServiceImpl<ImGroupMemberDao, ImGr
     public List<ImGroupMember> findChatGroupAllMemberInfo(Map<String, Object> params) {
 
         Object search = params.get("search");
+        if (search == null) {
+            search = params.get("keyword");
+        }
+        Object keyword = search;
+
         Boolean groupMute = params.get("groupMute") == null ? null : Boolean.valueOf(params.get("groupMute").toString());
         List<String> groupRoleTypes = params.get("groupRoleTypes") == null ? new ArrayList() : ((List) params.get("groupRoleTypes"));
         String groupRoleTypesTr = String.join(",", groupRoleTypes);
         List<ImGroupMember> members = getBaseMapper().selectList(Wrappers.<ImGroupMember>query().lambda()
-                .and(Objects.nonNull(search) && StringUtils.isNotEmpty(search.toString()),
-                        e->e.eq(ImGroupMember::getUserId, search).or()
-                                .like(ImGroupMember::getNickname, search))
+                .and(Objects.nonNull(keyword) && StringUtils.isNotEmpty(keyword.toString()),
+                        e->e.eq(ImGroupMember::getUserId, keyword).or()
+                                .like(ImGroupMember::getNickname, keyword))
                 .eq(ImGroupMember::getGroupId, params.get("groupId"))
                 .eq(groupMute != null, ImGroupMember::getGroupMute, groupMute)
                 .apply(StringUtils.isNotEmpty(groupRoleTypesTr), "find_in_set(group_role_type_,'" + groupRoleTypesTr + "')")

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

@@ -588,7 +588,16 @@ public class MusicSheetServiceImpl extends ServiceImpl<MusicSheetDao, MusicSheet
 
         List<MusicSheetAccompaniment> background = detail.getBackground();
         if (CollectionUtils.isNotEmpty(background)) {
-            background.sort(Comparator.comparing(MusicSheetAccompaniment::getSortNumber));
+            // 兼容管乐迷曲目同步数据
+            long count = background.stream().map(MusicSheetAccompaniment::getSortNumber)
+                .filter(x -> Objects.nonNull(x) && x <= 0).count();
+            if (count == background.size()) {
+                // 管乐迷原音排序字段
+                background.sort(Comparator.comparing(MusicSheetAccompaniment::getId));
+            } else {
+                // 酷乐秀原音排序字段
+                background.sort(Comparator.comparing(MusicSheetAccompaniment::getSortNumber));
+            }
         }
         return detail;
     }

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

@@ -9,14 +9,22 @@ import com.microsvc.toolkit.common.response.template.R;
 import com.yonge.cooleshow.auth.api.client.SysUserFeignService;
 import com.yonge.cooleshow.auth.api.dto.RealnameAuthReq;
 import com.yonge.cooleshow.auth.api.entity.SysUser;
+import com.yonge.cooleshow.biz.dal.entity.CourseGroup;
+import com.yonge.cooleshow.biz.dal.entity.ImGroup;
+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.UserOrder;
+import com.yonge.cooleshow.biz.dal.entity.UserOrderRefund;
+import com.yonge.cooleshow.biz.dal.entity.VideoLessonGroup;
+import com.yonge.cooleshow.biz.dal.enums.AuthStatusEnum;
 import com.yonge.cooleshow.biz.dal.enums.ClientEnum;
+import com.yonge.cooleshow.biz.dal.enums.ImGroupType;
+import com.yonge.cooleshow.biz.dal.enums.OrderStatusEnum;
+import com.yonge.cooleshow.biz.dal.enums.im.EImGroupMemberRoleType;
 import com.yonge.cooleshow.biz.dal.mapper.SysUserMapper;
-import com.yonge.cooleshow.biz.dal.service.StudentService;
-import com.yonge.cooleshow.biz.dal.service.SysUserContractRecordService;
-import com.yonge.cooleshow.biz.dal.service.SysUserService;
-import com.yonge.cooleshow.biz.dal.service.TeacherService;
+import com.yonge.cooleshow.biz.dal.service.*;
+import com.yonge.cooleshow.biz.dal.vo.UserAccountVo;
 import com.yonge.cooleshow.biz.dal.wrapper.UserInfoWrapper;
 import com.yonge.cooleshow.common.entity.HttpResponseResult;
 import com.yonge.cooleshow.common.enums.ContractTemplateTypeEnum;
@@ -26,16 +34,24 @@ import com.yonge.toolset.thirdparty.message.MessageSenderPluginContext;
 import com.yonge.toolset.thirdparty.user.realname.RealnameAuthenticationPlugin;
 import com.yonge.toolset.utils.idcard.IdcardInfoExtractor;
 import com.yonge.toolset.utils.idcard.IdcardValidator;
+import jodd.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 
+@Slf4j
 @Service
 public class SysUserServiceImpl implements SysUserService {
 
@@ -55,6 +71,28 @@ public class SysUserServiceImpl implements SysUserService {
     private MessageSenderPluginContext messageSenderPluginContext;
     @Resource
     private MessageFeignClientService messageFeignClientService;
+
+    @Autowired
+    private UserOrderService userOrderService;
+
+    @Autowired
+    private UserOrderRefundService userOrderRefundService;
+
+    @Autowired
+    private ImGroupMemberService imGroupMemberService;
+
+    @Autowired
+    private ImGroupService imGroupService;
+
+    @Autowired
+    private CourseGroupService courseGroupService;
+
+    @Autowired
+    private VideoLessonGroupService videoLessonGroupService;
+
+    @Autowired
+    private UserAccountService userAccountService;
+
     @Override
     public SysUserMapper getDao() {
         return sysUserMapper;
@@ -200,4 +238,104 @@ public class SysUserServiceImpl implements SysUserService {
             return EClientType.BACKEND;
         }
     }
+
+    @Override
+    public List<String> accountLogoffCheck(String phone) {
+        SysUser sysUser = this.getDao().findUserByPhone(phone);
+        if (sysUser == null || Boolean.TRUE.equals(sysUser.getDelFlag())) {
+            throw new BizException("账号不存在");
+        }
+        List<String> errMsg = new ArrayList<>();
+        Long userId = sysUser.getId();
+
+        // 存在待支付、未确认收货、售后处理的订单
+        Integer count = userOrderService.lambdaQuery()
+                .eq(UserOrder::getUserId, userId)
+                .in(UserOrder::getStatus, Arrays.asList(OrderStatusEnum.WAIT_PAY, OrderStatusEnum.PAYING, OrderStatusEnum.PAID))
+                .count();
+        if (count > 0) {
+            errMsg.add("账户存在未支付、未确认收货、售后处理中的订单");
+        } else {
+            Integer refundCount = userOrderRefundService.lambdaQuery()
+                    .eq(UserOrderRefund::getUserId, userId)
+                    .eq(UserOrderRefund::getStatus, AuthStatusEnum.DOING)
+                    .count();
+            if (refundCount > 0) {
+                errMsg.add("账户存在未支付、未确认收货、售后处理中的订单");
+            }
+        }
+
+        Teacher teacher = teacherService.getById(userId);
+
+        if (teacher != null) {
+            // 存在群主身份
+            List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                    .eq(ImGroupMember::getUserId, userId)
+                    .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
+                    .list();
+            List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId).collect(Collectors.toList());
+            if (groupIdList.isEmpty()) {
+                Collection<ImGroup> imGroups = imGroupService.listByIds(groupIdList);
+                long orgGroups = imGroups.stream().filter(next -> ImGroupType.ORG.equals(next.getType())).count();
+                if (orgGroups > 0) {
+                    errMsg.add("账户为机构群群主、需要庄毅群主或解散群聊");
+                }
+            }
+
+            // 存在进行中的课程
+            // 陪练课
+            Integer course = courseGroupService.lambdaQuery()
+                    .eq(CourseGroup::getTeacherId, userId)
+                    .in(CourseGroup::getType, Arrays.asList("PRACTICE", "LIVE", "PIANO_ROOM_CLASS"))
+                    .in(CourseGroup::getStatus, Arrays.asList("ING", "APPLY"))
+                    .count();
+            // 视频课
+            Integer videoCourse = videoLessonGroupService.lambdaQuery()
+                    .eq(VideoLessonGroup::getTeacherId, userId)
+                    .eq(VideoLessonGroup::getShelvesFlag, 1)
+                    .count();
+
+            if (course > 0 || videoCourse > 0) {
+                errMsg.add("存在进行中的课程");
+            }
+
+            // 存在未提现的金额
+            UserAccountVo detail = userAccountService.detail(userId);
+            if (detail != null && (detail.getAmountTotal().compareTo(BigDecimal.ZERO) > 0 || detail.getAmountUnrecorded().compareTo(BigDecimal.ZERO) > 0)) {
+                errMsg.add("收入未结算/推广计划未入账");
+            }
+        }
+        return errMsg;
+    }
+
+    @Override
+    public void dismissFanImGroup(String phone) {
+        SysUser sysUser = this.getDao().findUserByPhone(phone);
+        if (sysUser == null) {
+            return;
+        }
+        Teacher teacher = teacherService.getById(sysUser.getId());
+        if (teacher == null) {
+            return;
+        }
+        List<ImGroupMember> groupMembers = imGroupMemberService.lambdaQuery()
+                .eq(ImGroupMember::getUserId, sysUser.getId())
+                .eq(ImGroupMember::getGroupRoleType, EImGroupMemberRoleType.Owner)
+                .list();
+        List<String> groupIdList = groupMembers.stream().map(ImGroupMember::getGroupId).collect(Collectors.toList());
+        if (groupIdList.isEmpty()) {
+            return;
+        }
+        Collection<ImGroup> imGroups = imGroupService.listByIds(groupIdList);
+        List<String> groupIds = imGroups.stream().filter(next -> ImGroupType.FAN.equals(next.getType()) || ImGroupType.COURSE.equals(next.getType()))
+                .map(ImGroup::getId).collect(Collectors.toList());
+
+        for (String groupId : groupIds) {
+            try {
+                imGroupService.dismiss(groupId);
+            } catch (Exception e) {
+                log.error("群解散失败:" + groupId);
+            }
+        }
+    }
 }