|
-
- //
-
-
-
-
-
-
-
-
- using System.Text.RegularExpressions;
-
- namespace SafeCampus.SqlSugar;
-
- /// <summary>
- /// 种子数据工具类
- /// </summary>
- public class SeedDataUtil
- {
- public static List<T> GetSeedData<T>(string jsonName)
- {
- var seedData = new List<T>();//种子数据结果
- 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<SeedDataRecords<T>>();
-
-
- //正则匹配"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<SeedDataRecords<T>>();
-
- #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;
- }
- }
-
- /// <summary>
- /// 种子数据格式实体类,遵循Navicat导出json格式
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class SeedDataRecords<T>
- {
- /// <summary>
- /// 数据
- /// </summary>
- public List<T> Records { get; set; }
- }
|