| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 解析编码成对象集 |
| | | /// </summary> |
| | | /// <typeparam name="T">泛型</typeparam> |
| | | /// <param name="analysisCode">规则编号</param> |
| | | /// <param name="code">需解析的字符串</param> |
| | | /// <returns></returns> |
| | | public static T CodeAnalysisCP<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> |