using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http.Headers; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; namespace ReZero.SuperAPI { internal class ValidateParameters { public static async Task> CheckAsync(DataModel dataModel) { List errorLists = new List(); // 记录所有参数的状态,帮助调试 Console.WriteLine("==== 开始参数验证 ===="); foreach (var item in dataModel.DefaultParameters ?? new List()) { Console.WriteLine($"参数: {item.Name}, 值类型: {(item.Value?.GetType().Name ?? "null")}, 值: {(item.Value?.ToString() ?? "null")}"); } foreach (var item in dataModel.DefaultParameters ?? new List()) { // 记录Name参数的检查 if (item?.Name?.Equals("Name", StringComparison.OrdinalIgnoreCase) == true) { Console.WriteLine($"检查Name参数:Name={item.Name}, Value={(item.Value ?? "null")}, ValueType={(item.Value?.GetType().Name ?? "null")}"); } if (IsRequired(item)) { Console.WriteLine($"参数 {item.Name} 验证失败: 必填但为空"); AddReuiredError(errorLists, item); } if (IsInsertUnique(dataModel, item)) { await AddInsertUniqueError(dataModel, errorLists, item); } if (item?.ParameterValidate?.IsUnique == true && dataModel.ActionType == ActionType.InsertObject) { } } Console.WriteLine("==== 参数验证结束 ===="); return errorLists; } #region Add Error private static async Task AddInsertUniqueError(DataModel dataModel, List errorLists, DataModelDefaultParameter item) { var type = await EntityGeneratorManager.GetTypeAsync(dataModel.TableId); var db = App.GetDbTableId(dataModel.TableId); new CommonDataService().InitDb(type, db!); var entityInfo = db!.EntityMaintenance.GetEntityInfo(type); var dbColumnInfo = entityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualsCase(item.Name!)); var isDeleteIdColumn = entityInfo.Columns.FirstOrDefault(it => it.PropertyName.EqualsCase(nameof(DbBase.IsDeleted))); bool isAny = await IsAnyValue(item, type, db, dbColumnInfo, isDeleteIdColumn, dataModel); if (isAny) { errorLists.Add(new ErrorParameter() { Name = item.Name, ErrorType = "IsUnique", Message = TextHandler.GetCommonText("唯一", "Unique") }); } } private static void AddReuiredError(List errorLists, DataModelDefaultParameter item) { errorLists.Add(new ErrorParameter() { Name = item.Name, ErrorType = "IsRequired", Message = TextHandler.GetCommonText("必填", "Required") }); } #endregion #region Validate private static bool IsInsertUnique(DataModel dataModel, DataModelDefaultParameter item) { return item?.ParameterValidate?.IsUnique == true && dataModel.ActionType == ActionType.InsertObject; } private static bool IsRequired(DataModelDefaultParameter item) { // 如果不是必填字段,直接返回false if (item?.ParameterValidate?.IsRequired != true) return false; // 如果值为null,则视为空 if (item.Value == null) return true; // 如果是字符串类型,检查是否为空字符串 if (item.Value is string stringValue) return string.IsNullOrWhiteSpace(stringValue); // 基本数值类型通常不视为空 if (item.Value is int || item.Value is long || item.Value is decimal || item.Value is double || item.Value is float || item.Value is bool) return false; // JSON类型对象不视为空 if (item.Value.GetType().FullName?.Contains("Newtonsoft.Json") == true) return false; // 其他类型转换为字符串后判断 string valueAsString = Convert.ToString(item.Value); return string.IsNullOrWhiteSpace(valueAsString); } private static async Task IsAnyValue(DataModelDefaultParameter? item, Type type, SqlSugarClient? db, EntityColumnInfo dbColumnInfo, EntityColumnInfo isDeleteIdColumn, DataModel dataModel) { var condition = new ConditionalModel() { ConditionalType = ConditionalType.Equal, CSharpTypeName = dbColumnInfo.UnderType.Name, FieldValue = item!.Value + "", FieldName = dbColumnInfo.DbColumnName }; var whereColumns = new List() { condition }; if (isDeleteIdColumn != null) { var condition2 = new ConditionalModel() { ConditionalType = ConditionalType.Equal, CSharpTypeName = typeof(bool).Name, FieldValue = false.ToString().ToLower(), FieldName = isDeleteIdColumn.DbColumnName }; whereColumns.Add(condition2); } if (type.Name == nameof(ZeroEntityInfo)) { var condition3 = new ConditionalModel() { ConditionalType = ConditionalType.Equal, CSharpTypeName = typeof(long).Name, FieldValue = dataModel.DefaultParameters.First(it => it.Name!.EqualsCase(nameof(ZeroEntityInfo.DataBaseId))).Value + "", FieldName = db!.EntityMaintenance.GetEntityInfo(type).Columns.First(it => it.PropertyName == nameof(ZeroEntityInfo.DataBaseId)).DbColumnName }; whereColumns.Add(condition3); } return await db!.QueryableByObject(type) .Where(whereColumns) .AnyAsync(); } #endregion } }