完善通用接口输入参数

This commit is contained in:
2023-11-21 00:19:45 +08:00
parent 079eec500b
commit 70de358f97
17 changed files with 375 additions and 226 deletions

View File

@@ -112,62 +112,47 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
/// <summary>
/// 获取 Vmodel, 为空时不抛异常
/// </summary>
public async Task<Vmodel?> TryGetVmodelAsync(string id, bool loadNavigate = false)
{
Vmodel vm = await Db.Queryable<Vmodel>().FirstAsync(a => a.id == id && a.deleted == 0);
if (vm != null && loadNavigate)
{
await LoadVmodelNavigateAsync(vm);
}
return vm;
}
/// <summary>
/// 获取 Vmodel, 为空时抛异常
/// </summary>
public async Task<Vmodel> GetVmodelAsync(string id, bool loadNavigate = false)
public async Task<Vmodel?> TryGetVmodelAsync(string id)
{
var key = GetVmodelCacheKey(id);
var vm = await _cache.GetAsync<Vmodel>(key);
if (vm == null)
{
vm = await Db.Queryable<Vmodel>().FirstAsync(a => a.id == id && a.deleted == 0);
ThrowIf.IsNull(vm, $"找不到id={id}的模型");
if (loadNavigate)
if (vm != null)
{
await LoadVmodelNavigateAsync(vm);
await _cache.SetAsync(key, vm, TimeSpan.FromMinutes(10));
}
await _cache.SetAsync(key, vm, TimeSpan.FromMinutes(10));
}
return vm;
}
/// <summary>
/// 获取 Vmodel, 为空时不抛异常
/// </summary>
public async Task<Vmodel?> TryGetVmodelAsync(string areaCode, string vmCode, bool loadNavigate = false)
{
Vmodel vm = await Db.Queryable<Vmodel>().FirstAsync(a => a.areaCode == areaCode && a.vmCode == vmCode && a.deleted == 0);
if (vm != null && loadNavigate)
{
await LoadVmodelNavigateAsync(vm);
}
return vm;
}
/// <summary>
/// 获取 Vmodel, 为空时抛异常
/// </summary>
public async Task<Vmodel> GetVmodelAsync(string areaCode, string vmCode, bool loadNavigate = false)
public async Task<Vmodel> GetVmodelAsync(string id)
{
var vm = await TryGetVmodelAsync(id);
ThrowIf.IsNull(vm, $"找不到id={id}的模型");
return vm;
}
/// <summary>
/// 获取 Vmodel, 为空时不抛异常
/// </summary>
public async Task<Vmodel?> TryGetVmodelAsync(string areaCode, string vmCode)
{
Vmodel vm = await Db.Queryable<Vmodel>().FirstAsync(a => a.areaCode == areaCode && a.vmCode == vmCode && a.deleted == 0);
ThrowIf.IsNull(vm, $"找不到areaCode={areaCode}, vmCode={vmCode}的模型");
if (loadNavigate)
{
await LoadVmodelNavigateAsync(vm);
}
return vm;
}
/// <summary>
/// 获取 Vmodel, 为空时抛异常
/// </summary>
public async Task<Vmodel> GetVmodelAsync(string areaCode, string vmCode)
{
var vm = await TryGetVmodelAsync(areaCode, vmCode);
ThrowIf.IsNull(vm, $"找不到areaCode={areaCode}, vmCode={vmCode}的模型");
return vm;
}
@@ -321,8 +306,8 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
/// </summary>
public async Task<dynamic> CreateDataAsync(Vmodel vm, VmEditInput input)
{
ISqlSugarClient db = GetSqlSugar(vm.dbCode);
ThrowIf.When(input.data == null && input.items == null, "新增数据时data和items不可同时为空");
ISqlSugarClient db = GetSqlSugar(vm.dbCode);
//新增一条数据
if (input.data != null)
{
@@ -331,7 +316,7 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
if (pkey.csType is "int" or "long")
{
long id = await db.Insertable(model).AS(vm.tableName).ExecuteReturnBigIdentityAsync();
if ((long)input.data[pkey.code] != id)
if (input.data[pkey.code].ParseToLong() != id)
{
input.data[pkey.code] = id;
}
@@ -339,6 +324,10 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
else
{
_ = await db.Insertable(model).AS(vm.tableName).ExecuteCommandAsync();
if (input.data[pkey.code].ToString() != model[pkey.field].ToString())
{
input.data[pkey.code] = model[pkey.field];
}
}
return input.data;
}
@@ -370,6 +359,11 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
else
{
_ = await db.Insertable(lst).AS(vm.tableName).ExecuteCommandAsync();
for (int i = 0; i < input.items.Count; i++)
{
input.items[i][pkey.code] = lst[i][pkey.field];
}
}
return input.items;
}
@@ -387,31 +381,35 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
/// </summary>
public async Task<dynamic> UpdateDataAsync(Vmodel vm, VmEditInput input)
{
ThrowIf.When(input.data == null && input.items == null, "新增数据时data和items不可同时为空");
ISqlSugarClient db = GetSqlSugar(vm.dbCode);
VmDbProp pk = vm.GetPrimary();
int num = 0;
//修改一条数据
if (input.data != null)
{
ThrowIf.When(!input.data.ContainsKey(pk.code) || string.IsNullOrWhiteSpace(input.data[pk.code].ToString()), $"更新数据时主键({pk.code})不可为空");
DObject model = vm.ToUpdateEntity(input.data, _user);
ThrowIf.When(!model.ContainsKey(pk.field), $"更新数据时主键({pk.code})不可为空");
num = await db.Updateable(model).AS(vm.tableName).WhereColumns(pk.field).ExecuteCommandAsync();
return num > 0 ? input.data[pk.code].ToString()! : 0;
}
//批量修改数据
else if (input.items != null)
else
{
List<DObject> lst = new();
foreach (DObject item in input.items)
List<string> ids = new();
foreach (DObject item in input.items!)
{
DObject model = vm.ToUpdateEntity(item, _user);
if (model.ContainsKey(pk.field))
if (item.ContainsKey(pk.code) && !string.IsNullOrWhiteSpace(item[pk.code].ToString()))
{
DObject model = vm.ToUpdateEntity(item, _user);
lst.Add(model);
ids.Add(item[pk.code].ToString()!);
}
}
num = await db.Updateable(lst).AS(vm.tableName).WhereColumns(pk.field).ExecuteCommandAsync();
return num > 0 ? ids : 0;
}
return num;
}
/// <summary>

View File

@@ -23,30 +23,30 @@ public interface IDataAccess : ITransient
/// <returns></returns>
VmodelLink GetVmodelLink(string dbCode);
/// <summary>
/// 获取 Vmodel, 为空时不抛异常
/// </summary>
Task<Vmodel?> TryGetVmodelAsync(string id, bool loadNavigate = false);
/// <summary>
/// 获取 Vmodel 的缓存键
/// </summary>
string GetVmodelCacheKey(string id);
/// <summary>
/// 获取 Vmodel, 为空时不抛异常
/// </summary>
Task<Vmodel?> TryGetVmodelAsync(string id);
/// <summary>
/// 获取 Vmodel, 为空时抛异常
/// </summary>
Task<Vmodel> GetVmodelAsync(string id, bool loadNavigate = false);
Task<Vmodel> GetVmodelAsync(string id);
/// <summary>
/// 获取 Vmodel, 为空时不抛异常
/// </summary>
Task<Vmodel?> TryGetVmodelAsync(string area, string vmCode, bool loadNavigate = false);
Task<Vmodel?> TryGetVmodelAsync(string area, string vmCode);
/// <summary>
/// 获取 Vmodel, 为空时抛异常
/// </summary>
Task<Vmodel> GetVmodelAsync(string area, string vmCode, bool loadNavigate = false);
Task<Vmodel> GetVmodelAsync(string area, string vmCode);
//Task<VmPagedOutput> QueryDataAsync(VmBaseInput input);