using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using WIDESEA_Core.Attributes; using WIDESEA_Core.CodeConfigEnum; using WIDESEA_Core.DB; using WIDESEA_Core.Enums; using WIDESEA_Core.Seed; using WIDESEA_Core.Utilities; namespace WIDESEA_Core.Helper { public class CodeAnalysisHelper { /// /// 解析编码成对象集 /// /// 泛型 /// 规则编号 /// 需解析的字符串 /// public static T CodeAnalysis(AnalysisCodeEnum analysisCode, string code) { Type type = typeof(T); object? obj = Activator.CreateInstance(type); if (obj == null) throw new Exception("实例化对象错误"); T result = (T)obj; try { AnalysisRuleAttribute? analysisRule = type.GetCustomAttribute(); if (analysisRule != null) { SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig { ConfigId = MainDb.CurrentDbConnId, ConnectionString = DBContext.GetMainConnectionDb().Connection, IsAutoCloseConnection = true, DbType = MainDb.DbType, }); dynamic ruleConfig = sugarClient.Queryable(MainDb.AnalysisRuleConfig, "x").Where(MainDb.AnalysisCode, "=", analysisCode.ToString()).First(); if (ruleConfig != null) { string format = ruleConfig.Format; string splitStr = ruleConfig.SplitStr; List items = format.Split(splitStr).ToList(); List codes = code.Split(splitStr).ToList(); if (items.Count == codes.Count) { PropertyInfo[] propertyInfos = type.GetProperties(); if (AnalysisRuleEnum.Split == analysisRule.AnalysisRule) { for (int i = 0; i < propertyInfos.Length; i++) { PropertyInfo propertyInfo = propertyInfos[i]; AnalysisItemRuleAttribute? analysisItemRule = propertyInfo.GetCustomAttribute(); if (analysisItemRule != null) { if (analysisItemRule.AnalysisFormaType == AnalysisFormatTypeEnum.BD) { propertyInfo.SetValue(result, code.ChangeType(propertyInfo.PropertyType)); } else { int index = items.IndexOf($"[{analysisItemRule.AnalysisFormaType}]"); if (index != -1) { propertyInfo.SetValue(result, codes[index]); } else { string? codeItem = items.FirstOrDefault(x => x.Contains($"[{analysisItemRule.AnalysisFormaType}]")); if (!string.IsNullOrEmpty(codeItem)) { index = items.IndexOf(codeItem); if (index != -1) { string value = codes[index]; string replaceStr = codeItem.Replace($"[{analysisItemRule.AnalysisFormaType}]", ""); propertyInfo.SetValue(result, value.Replace(replaceStr, "").ChangeType(propertyInfo.PropertyType)); } } } } } } } } } } } catch (Exception ex) { } (bool, string, object?) validateResult = ModelValidate.ValidateModelData(result, type); if (!validateResult.Item1) { throw new Exception($"解析错误,{validateResult.Item2}"); } return result; } /// /// 解析编码成对象集合 /// /// 泛型 /// 规则编号 /// 需解析的字符串集合 /// public static List CodeAnalysis(AnalysisCodeEnum analysisCode, List codeList) { Type type = typeof(T); List list = new List(); try { AnalysisRuleAttribute? analysisRule = type.GetCustomAttribute(); if (analysisRule != null) { SqlSugarClient sugarClient = new SqlSugarClient(new ConnectionConfig { ConfigId = MainDb.CurrentDbConnId, ConnectionString = DBContext.GetMainConnectionDb().Connection, IsAutoCloseConnection = true, DbType = MainDb.DbType, }); dynamic ruleConfig = sugarClient.Queryable(MainDb.AnalysisRuleConfig, "x").Where(MainDb.AnalysisCode, "=", analysisCode.ToString()).First(); if (ruleConfig != null) { for (int j = 0; j < codeList.Count; j++) { T result = (T)Activator.CreateInstance(type); string code = codeList[j]; string format = ruleConfig.Format; string splitStr = ruleConfig.SplitStr; List items = format.Split(splitStr).ToList(); List codes = code.Split(splitStr).ToList(); if (items.Count == codes.Count) { PropertyInfo[] propertyInfos = type.GetProperties(); if (AnalysisRuleEnum.Split == analysisRule.AnalysisRule) { for (int i = 0; i < propertyInfos.Length; i++) { PropertyInfo propertyInfo = propertyInfos[i]; AnalysisItemRuleAttribute? analysisItemRule = propertyInfo.GetCustomAttribute(); if (analysisItemRule != null) { if (analysisItemRule.AnalysisFormaType == AnalysisFormatTypeEnum.BD) { propertyInfo.SetValue(result, code.ChangeType(propertyInfo.PropertyType)); } else { int index = items.IndexOf($"[{analysisItemRule.AnalysisFormaType}]"); if (index != -1) { propertyInfo.SetValue(result, codes[index]); } else { string? codeItem = items.FirstOrDefault(x => x.Contains($"[{analysisItemRule.AnalysisFormaType}]")); if (!string.IsNullOrEmpty(codeItem)) { index = items.IndexOf(codeItem); if (index != -1) { string value = codes[index]; string replaceStr = codeItem.Replace($"[{analysisItemRule.AnalysisFormaType}]", ""); propertyInfo.SetValue(result, value.Replace(replaceStr, "").ChangeType(propertyInfo.PropertyType)); } } } } } } } list.Add(result); } } } } } catch (Exception ex) { } return list; } } }