You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

146 lines
6.5 KiB

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<List<ErrorParameter>> CheckAsync(DataModel dataModel)
{
List<ErrorParameter> errorLists = new List<ErrorParameter>();
// 记录所有参数的状态,帮助调试
Console.WriteLine("==== 开始参数验证 ====");
foreach (var item in dataModel.DefaultParameters ?? new List<DataModelDefaultParameter>())
{
Console.WriteLine($"参数: {item.Name}, 值类型: {(item.Value?.GetType().Name ?? "null")}, 值: {(item.Value?.ToString() ?? "null")}");
}
foreach (var item in dataModel.DefaultParameters ?? new List<DataModelDefaultParameter>())
{
// 记录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<ErrorParameter> 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<ErrorParameter> 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<bool> 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<IConditionalModel>() { 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
}
}