namespace Application.Domain; public class GameTeamService(ISqlSugarClient DbClient, IRedisCache redis) : IGameTeamService, ITransient { public async Task> GetTeamDataPage(int area, string code, int page, int limit, RefAsync total) { var db = DbClient.AsTenant().GetConnectionWithAttr(); var data = await db.Queryable().Where(it => it.areaId == area && it.code == code) .OrderByDescending(it => it.addTime).ToPageListAsync(page, limit, total); List result = new List(); foreach (var item in data) { var temp = await GetTeamDataByTeamId(item.teamId); if (temp.state == 1) { result.Add(temp); } } return result; } public async Task GetUserTeamData(string userId) { string key = string.Format(UserCache.BaseCacheKeys, "TeamData", "UserData"); if (await redis.HExistsHashAsync(key, userId)) { return await redis.GetHashAsync(key, userId); } var db = DbClient.AsTenant().GetConnectionWithAttr(); var data = await db.Queryable().Where(it => it.userId == userId).SingleAsync(); await redis.AddHashAsync(key, userId, data); return data; } public async Task GetTeamInfo(string teamId) { string key = string.Format(UserCache.BaseCacheKeys, "TeamData", "TeamData"); if (await redis.HExistsHashAsync(key, teamId)) { return await redis.GetHashAsync(key, teamId); } var db = DbClient.AsTenant().GetConnectionWithAttr(); var data = await db.Queryable().Where(it => it.teamId == teamId).SingleAsync(); await redis.AddHashAsync(key, teamId, data); return data; } public async Task> GetTeamMember(string teamId) { string key = string.Format(UserCache.BaseCacheKeys, "TeamData", "MemberData"); if (await redis.HExistsHashAsync(key, teamId)) { return await redis.GetHashAsync>(key, teamId); } var db = DbClient.AsTenant().GetConnectionWithAttr(); var data = await db.Queryable().Where(it => it.teamId == teamId).ToListAsync(); await redis.AddHashAsync(key, teamId, data); return data; } private async Task GetTeamData(string userId) { TeamModel result = new TeamModel(); var userTeam = await GetUserTeamData(userId); if (userTeam.teamId == "0") { result.state = 0; result.user = new List(); result.team = new game_team(); return result; } else { result = await GetTeamDataByTeamId(userTeam.teamId); return result; } } public async Task GetTeamDataByTeamId(string teamId) { TeamModel result = new TeamModel(); var teamInfo = await GetTeamInfo(teamId); if (teamInfo == null) { result.state = 0; result.user = new List(); result.team = new game_team(); return result; } else { var mapService = App.GetService(); result.state = 1; result.team = teamInfo; var members = await GetTeamMember(teamId); List user = new List(); foreach (var member in members) { TeamUser temp = new TeamUser(); temp.user = await UserModelTool.GetUserView(member.userId); var onMap = await mapService.GetUserOnMapInfo(member.userId); temp.isOnline = onMap.isOnline; user.Add(temp); } result.codeTips = "普通"; result.user = user; return result; } } public async Task GetUserTeamInfo(string userId) { string key = string.Format(UserCache.BaseCacheKeys, "TeamData", userId); if (await redis.ExistsAsync(key)) { return await redis.GetAsync(key); } var data = await GetTeamData(userId); await redis.SetAsync(key, data, GameConfig.TeamCacheTime); return data; } private async Task ClearTeamCache(string teamId) { var members = await GetTeamMember(teamId); string key = string.Format(UserCache.BaseCacheKeys, "TeamData", "TeamData"); await redis.DelHashAsync(key, teamId); key = string.Format(UserCache.BaseCacheKeys, "TeamData", "MemberData"); await redis.DelHashAsync(key, teamId); List memberDataKeys = new List(); List userDataKeys = new List(); foreach (var member in members) { string mk = string.Format(UserCache.BaseCacheKeys, "TeamData", member.userId); memberDataKeys.Add(mk); userDataKeys.Add(member.userId); } await redis.DelAsync(memberDataKeys.ToArray()); string uk = string.Format(UserCache.BaseCacheKeys, "TeamData", "UserData"); await redis.DelHashAsync(uk, userDataKeys.ToArray()); } public async Task Add(string userId, string teamId, bool isAdd = false, string name = "", int area = 0, string code = "", string par = "", int count = 0) { var db = DbClient.AsTenant().GetConnectionWithAttr(); if (isAdd) { game_team team = new game_team() { teamId = teamId, areaId = area, name = name, code = code, par = par, count = count, masterId = userId, addTime = DateTime.Now }; await db.Insertable(team).ExecuteCommandAsync(); } var result = await db.Updateable() .SetColumns(it => it.teamId == teamId) .Where(it => it.userId == userId).ExecuteCommandAsync() > 0; if (result) { if (isAdd == false) { await ClearTeamCache(teamId); } string key = string.Format(UserCache.BaseCacheKeys, "TeamData", "UserData"); await redis.DelHashAsync(key, userId); key = string.Format(UserCache.BaseCacheKeys, "TeamData", userId); await redis.DelAsync(key); } return result; } public async Task Remove(string userId, string teamId) { var db = DbClient.AsTenant().GetConnectionWithAttr(); var result = await db.Updateable() .SetColumns(it => it.teamId == "0") .Where(it => it.userId == userId).ExecuteCommandAsync() > 0; if (result) { await ClearTeamCache(teamId); } return result; } public async Task DisTeam(string teamId) { var db = DbClient.AsTenant().GetConnectionWithAttr(); await db.Deleteable().Where(it => it.teamId == teamId).ExecuteCommandAsync(); await db.Updateable() .SetColumns(it => it.teamId == "0") .Where(it => it.teamId == teamId).ExecuteCommandAsync(); await ClearTeamCache(teamId); } public async Task UpdateTeamName(string teamId, string name) { var db = DbClient.AsTenant().GetConnectionWithAttr(); bool result = await db.Updateable().SetColumns(it => it.name == name) .Where(it => it.teamId == teamId).ExecuteCommandAsync() > 0; if (result) { await ClearTeamCache(teamId); } return result; } }