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 
 | 
    { 
 | 
        /// <summary> 
 | 
        /// 解析编码成对象集 
 | 
        /// </summary> 
 | 
        /// <typeparam name="T">泛型</typeparam> 
 | 
        /// <param name="analysisCode">规则编号</param> 
 | 
        /// <param name="code">需解析的字符串</param> 
 | 
        /// <returns></returns> 
 | 
        public static T CodeAnalysis<T>(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<AnalysisRuleAttribute>(); 
 | 
                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<string> items = format.Split(splitStr).ToList(); 
 | 
                        List<string> 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<AnalysisItemRuleAttribute>(); 
 | 
                                    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) 
 | 
            { 
 | 
                throw new Exception($"解析错误,{ex.Message}"); 
 | 
            } 
 | 
  
 | 
            (bool, string, object?) validateResult = ModelValidate.ValidateModelData(result, type); 
 | 
            if (!validateResult.Item1) 
 | 
            { 
 | 
                throw new Exception($"解析错误,{validateResult.Item2}"); 
 | 
            } 
 | 
  
 | 
            return result; 
 | 
        } 
 | 
  
 | 
        /// <summary> 
 | 
        /// 解析编码成对象集合 
 | 
        /// </summary> 
 | 
        /// <typeparam name="T">泛型</typeparam> 
 | 
        /// <param name="analysisCode">规则编号</param> 
 | 
        /// <param name="codeList">需解析的字符串集合</param> 
 | 
        /// <returns></returns> 
 | 
        public static List<T> CodeAnalysis<T>(AnalysisCodeEnum analysisCode, List<string> codeList) 
 | 
        { 
 | 
            Type type = typeof(T); 
 | 
            List<T> list = new List<T>(); 
 | 
  
 | 
            try 
 | 
            { 
 | 
                AnalysisRuleAttribute? analysisRule = type.GetCustomAttribute<AnalysisRuleAttribute>(); 
 | 
                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<string> items = format.Split(splitStr).ToList(); 
 | 
                            List<string> 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<AnalysisItemRuleAttribute>(); 
 | 
                                        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; 
 | 
        } 
 | 
    } 
 | 
} 
 |