using Core.Data.Models;
using Microsoft.Extensions.Logging;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Text;
using System.Linq;
using Core.Model.PowerBiModel;
using Microsoft.Data.SqlClient;
using Npgsql;
using System.Data.Odbc;
using System.Data.OracleClient;
using System.Data.Common;
namespace Common
{
public class RedisClient
{
public static ConnectionMultiplexer redis = GetRedisConnection();
public static IDatabase db = redis.GetDatabase();
public static ISubscriber sub = redis.GetSubscriber();
public static List<string> listItemIdList = new List<string>();
//全局用户redis key缓存
public static string globalUserKeysCache = "POWERBI:USER:RIGHT:GLOBAL";
//全局报表文件夹 key缓存
public static string globalReportKeysCache = "POWERBI:FOLDERREPORT:RIGHT:GLOBAL";
//全局收藏 key缓存
public static string globalFavoriteKeysCache = "POWERBI:FAVORITE:GLOBAL";
//全局反向 key缓存
public static string globalPrincipleKeysCache = "POWERBI:ITEMIDPRINCIPLE:GLOBAL";
//存储用户对应用户组遍历结果的缓存
public static string globalGetGroupByUserName = "POWERBI:GETGROUPBYUSERNAME:";
public static string globalDwSQLView = "DWSQLVIEW";
public static string globalCallApiInterfaceNoRepeat = "CALLAPIINTERFACENOREPEAT";
/// <summary>
/// 初始化Redis集群
/// </summary>
/// <returns></returns>
public static ConnectionMultiplexer GetRedisConnection()
{
ConfigurationOptions option = new ConfigurationOptions();
option.Password = AppSettings.app("AllUrl", "RedisPwd");
//解密
option.Password = AESHelper.Decrypt(option.Password, "12345678876543211234567887654abc");
option.EndPoints.Add(AppSettings.app("AllUrl", "RedisHostName"), Convert.ToInt32(AppSettings.app("AllUrl", "RedisPort")));
return ConnectionMultiplexer.Connect(option);
}
/// <summary>
/// 保存用户报表缓存
/// </summary>
public static string SaveFolderReportUserCache(List<VCPUR> vCPURs, ILogger<object> logger)
{
try
{
//IServer server = redis.GetServer(AppSettings.app("AllUrl", "RedisHostName"), Convert.ToInt32(AppSettings.app("AllUrl", "RedisPort")));
//List<RedisKey> redisKeys = server.Keys(pattern: "POWERBI:FOLDERREPORTUSER:RIGHT:*").ToList();
RedisValue[] redisValues = db.SetMembers(globalUserKeysCache);
//删除之前的redisvalue对应key的值
foreach (string item in redisValues)
{
db.KeyDelete(item);
}
//redisKeys = server.Keys(pattern: "POWERBI:ITEMIDPRINCIPLE:*").ToList();
redisValues = db.SetMembers(globalPrincipleKeysCache);
//删除之前的redisvalue对应key的值
foreach (string item in redisValues)
{
db.KeyDelete(item);
}
//删除之前的固定的rediskey的值
db.KeyDelete(globalUserKeysCache);
db.KeyDelete(globalPrincipleKeysCache);
//用户名Redis
if (vCPURs != null && vCPURs.Any())
{
foreach (VCPUR item in vCPURs)
{
string record = item.ItemID.ToString() + "#" + item.RoleNum + "#" + item.UserID.ToString();
db.SetAdd("POWERBI:FOLDERREPORTUSER:RIGHT:" + item.UserName.ToUpper().Trim(), record);
db.SetAdd(globalUserKeysCache, "POWERBI:FOLDERREPORTUSER:RIGHT:" + item.UserName.ToUpper().Trim());
//反向保存一份缓存:报表有哪些用户查看
db.SetAdd("POWERBI:ITEMIDPRINCIPLE:" + item.ItemID.ToString().ToUpper(), item.UserName.Trim() + "#" + item.RoleNum);
db.SetAdd(globalPrincipleKeysCache, "POWERBI:ITEMIDPRINCIPLE:" + item.ItemID.ToString().ToUpper());
}
logger.Log(LogLevel.Information, "刷新用户权限缓存总条数vCPURs:" + vCPURs.Count);
}
}
catch (Exception ex)
{
logger.Log(LogLevel.Error, "SaveFolderReportUserCache:" + ex.ToString());
return ex.ToString();
}
return "";
}
/// <summary>
/// 刷新用户权限缓存,一条一条刷新
/// </summary>
/// <param name="vCPURs"></param>
/// <returns></returns>
public static string SaveUserRightOneByOne(List<VCPUR> vCPURs, ILogger<object> logger)
{
string result = string.Empty;
if (vCPURs == null || !vCPURs.Any())
{
return result;
}
try
{
//IServer server = redis.GetServer(AppSettings.app("AllUrl", "RedisHostName"), Convert.ToInt32(AppSettings.app("AllUrl", "RedisPort")));
//List<RedisKey> redisKeys = server.Keys(pattern: "POWERBI:FOLDERREPORTUSER:RIGHT:*").ToList();
//List<RedisKey> redisKeysPrinciple = server.Keys(pattern: "POWERBI:ITEMIDPRINCIPLE:*").ToList();
//删除之前的redisvalue对应key的值
RedisValue[] redisValues = db.SetMembers(globalPrincipleKeysCache);
//删除之前的
foreach (string item in redisValues)
{
db.KeyDelete(item);
}
//删除之前的固定的rediskey的值
db.KeyDelete(globalPrincipleKeysCache);
redisValues = db.SetMembers(globalUserKeysCache);
//删除之前的
foreach (string item in redisValues)
{
//删除旧key
db.KeyDelete(item);
db.SetRemove(globalUserKeysCache, item);
string oldUserName = item.ToString().Split("POWERBI:FOLDERREPORTUSER:RIGHT:")[1];
List<VCPUR> vCPURsNew = vCPURs.Where(t => t.UserName.ToUpper() == oldUserName).ToList();
if (vCPURsNew != null && vCPURsNew.Any())
{
//添加新key
foreach (VCPUR itemNew in vCPURsNew)
{
string record = itemNew.ItemID.ToString() + "#" + itemNew.RoleNum + "#" + itemNew.UserID.ToString();
db.SetAdd("POWERBI:FOLDERREPORTUSER:RIGHT:" + itemNew.UserName.ToUpper(), record);
db.SetAdd(globalUserKeysCache, "POWERBI:FOLDERREPORTUSER:RIGHT:" + itemNew.UserName.ToUpper());
//反向保存一份缓存:报表有哪些用户查看
db.SetAdd("POWERBI:ITEMIDPRINCIPLE:" + itemNew.ItemID.ToString().ToUpper(), itemNew.UserName + "#" + itemNew.RoleNum);
db.SetAdd(globalPrincipleKeysCache, "POWERBI:ITEMIDPRINCIPLE:" + itemNew.ItemID.ToString().ToUpper());
}
//添加之后移除
vCPURs.RemoveAll(t => t.UserName.ToUpper() == oldUserName);
}
}
//旧的key全部删除完之后,新的key还没用完的情况下
if (vCPURs.Any())
{
foreach (VCPUR item in vCPURs)
{
string record = item.ItemID.ToString() + "#" + item.RoleNum + "#" + item.UserID.ToString();
db.SetAdd("POWERBI:FOLDERREPORTUSER:RIGHT:" + item.UserName.ToUpper(), record);
db.SetAdd(globalUserKeysCache, "POWERBI:FOLDERREPORTUSER:RIGHT:" + item.UserName.ToUpper());
//反向保存一份缓存:报表有哪些用户查看
db.SetAdd("POWERBI:ITEMIDPRINCIPLE:" + item.ItemID.ToString().ToUpper(), item.UserName + "#" + item.RoleNum);
db.SetAdd(globalPrincipleKeysCache, "POWERBI:ITEMIDPRINCIPLE:" + item.ItemID.ToString().ToUpper());
}
}
}
ca