using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; 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.DB; using WIDESEA_Core.Enums; using WIDESEA_Core.Seed; namespace WIDESEA_Core.Helper { public class CodeAnalysisHelper { /// /// 解析编码成对象集 /// /// 泛型 /// 规则编号 /// 需解析的字符串 /// public static T CodeAnalysis(AnalysisCode 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 (AnalysisRule.Split == analysisRule.AnalysisRule) { for (int i = 0; i < propertyInfos.Length; i++) { PropertyInfo propertyInfo = propertyInfos[i]; AnalysisItemRuleAttribute? analysisItemRule = propertyInfo.GetCustomAttribute(); if (analysisItemRule != null) { int index = items.IndexOf($"[{analysisItemRule.AnalysisFormaType}]"); if (index != -1) propertyInfo.SetValue(result, codes[index]); } } } } } } } catch (Exception ex) { } return result; } /// /// 解析编码成对象集合 /// /// 泛型 /// 规则编号 /// 需解析的字符串集合 /// public static List CodeAnalysis(AnalysisCode 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 (AnalysisRule.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 == AnalysisFormatType.BD) { propertyInfo.SetValue(result, code.ChangeType(propertyInfo.PropertyType)); } else { int index = items.IndexOf($"[{analysisItemRule.AnalysisFormaType}]"); if (index != -1) propertyInfo.SetValue(result, codes[index].ChangeType(propertyInfo.PropertyType)); } } } } list.Add(result); } } } } } catch (Exception ex) { } return list; } } }