package com.ruoyi.im.service.impl; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.netease.nim.server.sdk.core.BizName; import com.netease.nim.server.sdk.core.YunxinApiHttpClient; import com.netease.nim.server.sdk.core.YunxinApiResponse; import com.netease.nim.server.sdk.core.exception.YunxinSdkException; import com.netease.nim.server.sdk.core.http.HttpMethod; import com.netease.nim.server.sdk.im.v2.team.TeamV2UrlContext; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.im.comm.Result; import com.ruoyi.im.config.AppAuthConfig; import com.ruoyi.im.config.CreateTeamRequest; import com.ruoyi.im.dto.CreateGroupDto; import com.ruoyi.im.service.NeteaseTeamService; import com.ruoyi.system.domain.NeteaseTeam; import com.ruoyi.system.mapper.NeteaseTeamMapper; import org.aspectj.weaver.loadtime.Aj; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.interceptor.TransactionAspectSupport; import javax.annotation.PostConstruct; import javax.annotation.Resource; import java.util.*; @Service public class NeteaseTeamServiceImpl extends ServiceImpl implements NeteaseTeamService { private final YunxinApiHttpClient yunxinClient; // 使用构造函数注入(推荐) @Autowired public NeteaseTeamServiceImpl(YunxinApiHttpClient yunxinClient) { this.yunxinClient = yunxinClient; } @Resource private NeteaseTeamMapper neteaseTeamMapper; /** * 创建群组(根据最新参数说明) */ @Override @Transactional(rollbackFor = Exception.class) public AjaxResult createGroup(CreateTeamRequest request) { try { // 1. 构建请求参数Map Map paramMap = buildCreateTeamParams(request); // 2. 将Map转换为JSON字符串 String jsonBody = JSON.toJSONString(paramMap); // 3. 调用网易云信API创建群组 YunxinApiResponse response = yunxinClient.executeV2Api( HttpMethod.POST, TeamV2UrlContext.CREATE_TEAM, TeamV2UrlContext.CREATE_TEAM, null, jsonBody ); // 4. 处理响应 String data = response.getData(); JSONObject json = JSONObject.parseObject(data); int code = json.getIntValue("code"); if (code != 200) { log.error("网易云信创建群组失败,响应:"); return AjaxResult.error("创建群组失败"); } // 5. 解析响应获取群组ID JSONObject resultData = json.getJSONObject("data"); JSONObject teamInfo = resultData.getJSONObject("team_info"); String tid = teamInfo.getString("team_id"); String ownerAccountId = teamInfo.getString("owner_account_id"); // 6. 保存群组信息到本地数据库 int count = saveTeamToLocal(request,ownerAccountId, tid); if(count > 0){ return AjaxResult.success("创建群组成功"); } return AjaxResult.error("创建群组失败"); } catch (YunxinSdkException e) { // 云信调用异常时回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); e.printStackTrace(); log.error("网易云信服务调用异常 traceId:"); return AjaxResult.error("创建群组失败,云信服务异常"); } catch (Exception e) { // 其他异常同样回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); e.printStackTrace(); log.error("创建群组过程发生未知异常", e); return AjaxResult.error("创建群组失败,系统异常"); } } /** * 构建创建群组的参数Map */ private Map buildCreateTeamParams(CreateTeamRequest request) { Map paramMap = new HashMap<>(); // 必填参数 paramMap.put("owner_account_id", request.getOwner_account_id()); paramMap.put("team_type", request.getTeam_type()); paramMap.put("name", request.getName()); paramMap.put("invite_account_ids", request.getInvite_account_ids()); paramMap.put("invite_msg", request.getInvite_msg()); // 群组配置 Map configMap = new HashMap<>(); configMap.put("join_mode", request.getJoin_mode()); configMap.put("agree_mode", request.getAgree_mode()); configMap.put("invite_mode", request.getInvite_mode()); configMap.put("update_team_info_mode", request.getUpdate_team_info_mode()); configMap.put("update_extension_mode", request.getUpdate_extension_mode()); paramMap.put("configuration", configMap); // 选填参数 if (request.getIcon() != null) { paramMap.put("icon", request.getIcon()); } if (request.getAnnouncement() != null) { paramMap.put("announcement", request.getAnnouncement()); } if (request.getIntro() != null) { paramMap.put("intro", request.getIntro()); } if (request.getMembers_limit() != null) { paramMap.put("members_limit", request.getMembers_limit()); } if (request.getServer_extension() != null) { paramMap.put("server_extension", request.getServer_extension()); } if (request.getCustomer_extension() != null) { paramMap.put("customer_extension", request.getCustomer_extension()); } if (request.getExtension() != null) { paramMap.put("extension", request.getExtension()); } return paramMap; } /** * 保存群组信息到本地数据库 */ private int saveTeamToLocal(CreateTeamRequest request,String ownerAccountId, String tid) { NeteaseTeam team = new NeteaseTeam(); BeanUtils.copyProperties(request, team); team.setTid(tid); team.setCreateTime(new Date()); team.setUpdateTime(new Date()); team.setStatus(0); // 正常状态 team.setOwnerAccountId(ownerAccountId); team.setTeamType(request.getTeam_type()); team.setName(request.getName()); team.setMembersLimit(request.getMembers_limit()); // 保存配置信息 team.setJoinMode(request.getJoin_mode()); team.setAgreeMode(request.getAgree_mode()); team.setInviteMode(request.getInvite_mode()); team.setUpdateTeamInfoMode(request.getUpdate_team_info_mode()); team.setUpdateExtensionMode(request.getUpdate_extension_mode()); // 保存到数据库 int insert = neteaseTeamMapper.insert(team); return insert; } }