using Microsoft.EntityFrameworkCore.Metadata.Internal; using Microsoft.Extensions.DependencyInjection; using MySqlConnector; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Encodings.Web; using System.Threading.Tasks; using Zxd.Core.Domain.Dto; using Zxd.Core.Domain.Dto.Dncmsbase; using Zxd.Domain.Config; namespace Zxd.Core.Domain { internal class UserInfoDomain : IUserInfoDomain { private readonly IServiceProvider _serviceProvider; private readonly IRedisManager _redisManager; private readonly IBaseRepository _cmsBaseRepository; public UserInfoDomain( IRedisManager redisManager, IServiceProvider serviceProvider, IBaseRepository cmsBaseRepository) { _redisManager = redisManager; _serviceProvider = serviceProvider; _cmsBaseRepository = cmsBaseRepository; } /// /// 根据条件获取用户信息 /// /// /// /// /// /// /// public async Task> GetUserInfos(int? cid, string? appid, string? appuserid, string? resid, string? unionid) { var userInfos = new List(); var paramList = new Dictionary(); if (cid != null && cid > 0) { paramList.Add("customerid", cid); userInfos = await GetUserInfoByCid(cid); userInfos ??= await GetUserInfoBySqlCondition(paramList); } else if (!string.IsNullOrEmpty(appid) && !string.IsNullOrEmpty(appuserid)) { // 从缓存中获取用户信息 var uid = await _redisManager.ExistsAsync($"{appid}_1_{appuserid}", "UserCenter") ? await _redisManager.GetAsync($"{appid}_1_{appuserid}", "UserCenter") : 0; //Log.Information($"在缓存key:【{appid}_1_{appuserid}】中获取 uid:{uid}"); if (uid == 0) { uid = await _redisManager.ExistsAsync($"{appid}_{appuserid}", "UserCenter") ? await _redisManager.GetAsync($"{appid}_{appuserid}", "UserCenter") : 0; //Log.Information($"在缓存key:【{appid}_{appuserid}】中获取 uid:{uid}"); } if (uid > 0 && await _redisManager.ExistsAsync($"user_{uid}", "UserCenter")) { Log.Information($"useruid:user_{uid}"); var userInfoDto = await _redisManager.GetHashAsync($"user_{uid}", "UserCenter"); cid = !string.IsNullOrEmpty(userInfoDto.Customerid) ? int.Parse(userInfoDto.Customerid) : 0; Log.Information($"cid:{userInfoDto.ToJson()} {cid}"); } if (cid != null && cid > 0) { paramList.Add("customerid", cid); userInfos = await GetUserInfoByCid(cid); userInfos ??= await GetUserInfoBySqlCondition(paramList); } if (userInfos == null || !userInfos.Any()) { paramList = new Dictionary { { "appid", appid }, { "appuserid", appuserid } }; userInfos = await GetUserInfoBySqlCondition(paramList); if (userInfos.Any()) { cid = !string.IsNullOrEmpty(userInfos.First().Customerid) ? int.Parse(userInfos.First().Customerid) : 0; userInfos = await GetUserInfoByCid(cid); paramList = new Dictionary { { "customerid", cid } }; userInfos ??= await GetUserInfoBySqlCondition(paramList); } } } else if (!string.IsNullOrEmpty(resid)) { // 从缓存中获取用户信息 cid = await _redisManager.ExistsAsync(resid, "UserCenter") ? await _redisManager.GetAsync(resid, "UserCenter") : 0; if (cid != null && cid > 0) { paramList.Add("Resid", resid); userInfos = await GetUserInfoByCid(cid); userInfos ??= await GetUserInfoBySqlCondition(paramList); if (userInfos.Any()) { cid = !string.IsNullOrEmpty(userInfos.First().Customerid) ? int.Parse(userInfos.First().Customerid) : 0; userInfos = await GetUserInfoByCid(cid); paramList = new Dictionary { { "customerid", cid } }; userInfos ??= await GetUserInfoBySqlCondition(paramList); } } } else if (!string.IsNullOrEmpty(unionid)) { paramList.Add("Unionid", unionid); // 如果缓存中没有用户信息,则从数据库中获取 userInfos ??= await GetUserInfoBySqlCondition(paramList); if (userInfos.Any()) { cid = !string.IsNullOrEmpty(userInfos.First().Customerid) ? int.Parse(userInfos.First().Customerid) : 0; userInfos = await GetUserInfoByCid(cid); paramList = new Dictionary { { "customerid", cid } }; userInfos ??= await GetUserInfoBySqlCondition(paramList); } } return userInfos; } /// /// 根据客户id获取客户信息 /// /// /// private async Task?> GetUserInfoByCid(int? cid) { var userInfos = new List(); var userInfo = await _redisManager.GetHashAsync($"user_{cid}", "UserCenter"); if (userInfo != null) { var result = await _redisManager.GetDatabase("UserCenter").SetMembersAsync($"cid_{cid}"); #region 反序列化处理 foreach (var item in result) { if (!item.HasValue) continue; try { var data = JsonSerializer.Deserialize(item, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); if (data == null) continue; var uid = data.Uid; userInfo = await _redisManager.GetHashAsync($"user_{uid}", "UserCenter"); userInfos.Add(userInfo); continue; } catch (Exception e) { Log.Error($"反序列化失败:{e.Message}"); } try { var data = JsonSerializer.Deserialize(item, new JsonSerializerOptions { Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping }); if (data == null) continue; var uid = data.Uid; userInfo = await _redisManager.GetHashAsync($"user_{uid}", "UserCenter"); userInfos.Add(userInfo); } catch (Exception e) { Log.Error($"反序列化失败:{e.Message}"); } } #endregion 反序列化处理 Log.Information($"cid_cache:{userInfos.ToJson()} "); return userInfos; } return null; } /// /// 根据sql和条件获取客户信息 /// /// /// private async Task> GetUserInfoBySqlCondition(Dictionary paramList) { Log.Information($"lookdb:{paramList.ToJson()}"); var sql = @"SELECT Uid, Appid, Appuserid, Customerid, Resid, Unionid FROM UserInfo WHERE 1=1"; if (!paramList.Any()) return new List(); using (var scope = _serviceProvider.CreateAsyncScope()) { var userCenterRepository = scope.ServiceProvider.GetRequiredService>(); var paramter = new List() { }; var values = new List(); foreach (var param in paramList) { sql += $" AND {param.Key} = @{param.Key}"; paramter.Add(new MySqlParameter() { ParameterName = param.Key, MySqlDbType = MySqlDbType.VarChar, Value = param.Value }); values.Add(param.Value); } //Log.Information($"sql: {sql}, param: {string.Join(',', values)}"); var userInfos = await userCenterRepository.ExecuteSqlToListAsync(sql, paramter.ToArray()); return userInfos; } } /// /// 获取业务线Id /// /// /// public async Task> GetLineIdAsync(string userids) { var ids = userids.Split(','); var items = await _cmsBaseRepository.GetRepository().Query().Where(f => ids.Contains(f.userid)).Select(o => new WeWorkUser2EidDto { userid = o.userid, eid = o.eid, deptid = o.deptid }).ToListAsync(); return items; } } }