//
using System.Text.RegularExpressions;
namespace SafeCampus.SqlSugar;
///
/// 种子数据工具类
///
public class SeedDataUtil
{
public static List GetSeedData(string jsonName)
{
var seedData = new List();//种子数据结果
var basePath = AppContext.BaseDirectory;//获取项目目录
var json = basePath.CombinePath("SeedData", "Json", jsonName);//获取文件路径
var dataString = FileHelper.ReadFile(json);//读取文件
if (!string.IsNullOrEmpty(dataString))//如果有内容
{
//字段没有数据的替换成null
dataString = dataString.Replace("\"\"", "null");
#region 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}"
//正则匹配"ConfigValue": "[{开头的字符串以]"结尾
var matcheDefaultDataScope = Regex.Matches(dataString, "\"DefaultDataScope\": \"\\{.*?\\}\"");
foreach (Match match in matcheDefaultDataScope)
{
//获取匹配的值
var value = match.Value;
//将匹配的值替换成"ConfigValue": "{XXX}"
//字符串是\"的替换成"
var newValue = value.Replace("\\\"", "\"");
//字符串是\{替换成{
newValue = newValue.Replace("\"{", "{");
//字符串是}"的替换成}
newValue = newValue.Replace("}\"", "}");
dataString = dataString.Replace(value, newValue);
}
#endregion 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}"
#region Sys_Org
//如果T是Sys_Org
var nameofT = typeof(T).Name;//获取类型名称
if (nameofT == "SysOrg")
{
//字段是"[的替换成[
dataString = dataString.Replace("\"[", "[");
//字段是]"的替换成]
dataString = dataString.Replace("]\"", "]");
}
#endregion
//将json字符串转为实体,这里ExtJson可以正常转换为字符串
var seedDataRecord1 = dataString.ToJsonEntity>();
//正则匹配"ConfigValue": "[{开头的字符串以]"结尾
var matches = Regex.Matches(dataString, "\"ConfigValue\": \"\\[\\{.*?\\}\\]\"");
foreach (Match match in matches)
{
//获取匹配的值
var value = match.Value;
//将匹配的值替换成"ConfigValue": "null"
dataString = dataString.Replace(value, "\"ConfigValue\": \"null\"");
}
#region 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}"
//字符串是\"的替换成"
dataString = dataString.Replace("\\\"", "\"");
//字符串是\{替换成{
dataString = dataString.Replace("\"{", "{");
//字符串是}"的替换成}
dataString = dataString.Replace("}\"", "}");
//将json字符串转为实体,这里ExtJson会转为null,替换字符串把ExtJson值变为实体类型而实体类是string类型
var seedDataRecord2 = dataString.ToJsonEntity>();
#endregion 针对导出的json字符串嵌套json字符串如 "DefaultDataScope": "{\"Level\":5,\"ScopeCategory\":\"SCOPE_ALL\",\"ScopeDefineOrgIdList\":[]}"
//遍历seedDataRecord2
for (var i = 0; i < seedDataRecord2.Records.Count; i++)
{
#region 处理ExtJosn
//获取ExtJson属性
var propertyExtJson = typeof(T).GetProperty(nameof(PrimaryKeyEntity.ExtJson));
if (propertyExtJson != null)
{
//获取ExtJson的值
var extJson = propertyExtJson.GetValue(seedDataRecord2.Records[i])?.ToString();
// 如果ExtJson不为空并且包含NullableDictionary表示序列化失败了
if (!string.IsNullOrEmpty(extJson) && extJson.Contains("NullableDictionary"))
{
//设置ExtJson为seedDataRecord1对应的值
extJson = propertyExtJson.GetValue(seedDataRecord1.Records[i])?.ToString();
//seedDataRecord2赋值seedDataRecord1的ExtJson
propertyExtJson.SetValue(seedDataRecord2.Records[i], extJson);
}
}
#endregion 处理ExtJosn
#region 处理ConfigValue
//获取ExtJson属性
var propertyConfigValue = typeof(T).GetProperty("ConfigValue");
if (propertyConfigValue != null)
{
//获取configValue的值
var configValue = propertyConfigValue.GetValue(seedDataRecord2.Records[i])?.ToString();
// 如果configValue不为空并且包含NullableDictionary表示序列化失败了
if (!string.IsNullOrEmpty(configValue) && (configValue.Contains("NullableDictionary") || configValue == "null"))
{
//设置ExtJson为seedDataRecord1对应的值
configValue = propertyConfigValue.GetValue(seedDataRecord1.Records[i])?.ToString();
//seedDataRecord2赋值seedDataRecord1的ExtJson
propertyConfigValue.SetValue(seedDataRecord2.Records[i], configValue);
}
}
#endregion 处理ConfigValue
}
//种子数据赋值
seedData = seedDataRecord2.Records;
}
return seedData;
}
}
///
/// 种子数据格式实体类,遵循Navicat导出json格式
///
///
public class SeedDataRecords
{
///
/// 数据
///
public List Records { get; set; }
}