From e5ab4d6887e87b81f52aff0d9917778eb8a11e7d Mon Sep 17 00:00:00 2001 From: "fei.pan" Date: Fri, 17 Nov 2023 14:05:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E7=BA=A7=E9=87=8D=E5=86=99=E9=80=9A=E7=94=A8=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ConfigureMvcControllerExtensions.cs | 3 + common/Tnb.Common/Models/DObject.cs | 4 + .../Tnb.Common/Utils/AdapterCfg.cs | 21 +++-- .../Tnb.Vengine/AppService/BaseAppService.cs | 33 ++++++++ .../AppService/VengineAppService.cs | 40 +++------- .../AppService/VengineAppServiceT.cs | 76 +++++++++---------- .../AppService/VmodelAppService.cs | 28 ++++--- visualdev/Tnb.Vengine/AppService/VmodelDto.cs | 30 +++++++- .../AppService/VmodelPageAppService.cs | 30 -------- .../Tnb.Vengine/DataAccess/DataAccess.cs | 9 +-- visualdev/Tnb.Vengine/Domain/VengineDto.cs | 42 ++++++---- visualdev/Tnb.Vengine/Domain/Vmodel.cs | 6 +- 12 files changed, 177 insertions(+), 145 deletions(-) rename visualdev/Tnb.Vengine/Mapper/TypeAdapter.cs => common/Tnb.Common/Utils/AdapterCfg.cs (68%) diff --git a/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs b/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs index a3f102db..38ac8e17 100644 --- a/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs +++ b/apihost/Tnb.API.Entry/Extensions/ConfigureMvcControllerExtensions.cs @@ -3,10 +3,12 @@ using JNPF.API.Entry.Handlers; using JNPF.Common.Core.Filter; using JNPF.JsonSerialization; using JNPF.UnifyResult; +using Mapster; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.HttpOverrides; using Newtonsoft.Json; using Newtonsoft.Json.Serialization; +using Tnb.Vengine; namespace Microsoft.Extensions.DependencyInjection; @@ -22,6 +24,7 @@ public static class ConfigureMvcControllerExtensions /// public static IServiceCollection ConfigureMvcController(this IServiceCollection services) { + AdapterCfg.ConfigGlobal(); services.AddControllers() .AddMvcFilter() .AddInjectWithUnifyResult() diff --git a/common/Tnb.Common/Models/DObject.cs b/common/Tnb.Common/Models/DObject.cs index 855353d2..eea73a8a 100644 --- a/common/Tnb.Common/Models/DObject.cs +++ b/common/Tnb.Common/Models/DObject.cs @@ -47,4 +47,8 @@ public class DObject : Dictionary } } + public static DObject? FromObject(object? data) + { + return data?.Adapt(AdapterCfg.ExactCase); + } } diff --git a/visualdev/Tnb.Vengine/Mapper/TypeAdapter.cs b/common/Tnb.Common/Utils/AdapterCfg.cs similarity index 68% rename from visualdev/Tnb.Vengine/Mapper/TypeAdapter.cs rename to common/Tnb.Common/Utils/AdapterCfg.cs index 46948d2e..3fe5d46e 100644 --- a/visualdev/Tnb.Vengine/Mapper/TypeAdapter.cs +++ b/common/Tnb.Common/Utils/AdapterCfg.cs @@ -3,22 +3,29 @@ // https://git.tuotong-tech.com/tnb/tnb.server // ///////////////////////////////////////////////////////////////////////////////// -using Mapster; using Newtonsoft.Json.Linq; -namespace Tnb.Vengine; +namespace Mapster; -public class TypeAdapter +public class AdapterCfg { - public static TypeAdapterConfig IgnoreNull { get; } + public static TypeAdapterConfig IgnoreNull { get; internal set; } + public static TypeAdapterConfig ExactCase { get; internal set; } - static TypeAdapter() + static AdapterCfg() + { + IgnoreNull = TypeAdapterConfig.GlobalSettings.Clone(); + IgnoreNull.Default.IgnoreNullValues(true); + + ExactCase = TypeAdapterConfig.GlobalSettings.Clone(); + ExactCase.Default.NameMatchingStrategy(NameMatchingStrategy.Exact); + } + + public static void ConfigGlobal() { TypeAdapterConfig.GlobalSettings.Default.PreserveReference(true); TypeAdapterConfig.GlobalSettings.NewConfig().MapWith(json => json); TypeAdapterConfig.GlobalSettings.NewConfig().MapWith(json => json); TypeAdapterConfig.GlobalSettings.NewConfig().MapWith(json => json); - IgnoreNull = TypeAdapterConfig.GlobalSettings.Clone(); - IgnoreNull.Default.IgnoreNullValues(true); } } \ No newline at end of file diff --git a/visualdev/Tnb.Vengine/AppService/BaseAppService.cs b/visualdev/Tnb.Vengine/AppService/BaseAppService.cs index 48475349..891cb27c 100644 --- a/visualdev/Tnb.Vengine/AppService/BaseAppService.cs +++ b/visualdev/Tnb.Vengine/AppService/BaseAppService.cs @@ -5,6 +5,8 @@ using JNPF.DependencyInjection; using JNPF.DynamicApiController; +using Tnb.Vengine.DataAccess; +using Tnb.Vengine.Domain; namespace Tnb.Vengine.AppService; @@ -13,6 +15,37 @@ namespace Tnb.Vengine.AppService; /// public class BaseAppService : IDynamicApiController, ITransient { + protected readonly IDataAccess _dataAccess; + private readonly Dictionary _models = new(); + + public BaseAppService(IDataAccess dataAccess) + { + _dataAccess = dataAccess; + } + + /// + /// 根据id获取Vmodel + /// + protected async Task GetVmodelAsync(string id) + { + if (!_models.ContainsKey(id)) + { + _models[id] = await _dataAccess.GetVmodelAsync(id, false); + } + return _models[id]; + } + /// + /// 根据areaCode和vmCode获取Vmodel + /// + protected async Task GetVmodelAsync(string areaCode, string vmCode) + { + var key = areaCode + "/" + vmCode; + if (!_models.ContainsKey(key)) + { + _models[key] = await _dataAccess.GetVmodelAsync(areaCode, vmCode, false); + } + return _models[key]; + } } //[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 100)] diff --git a/visualdev/Tnb.Vengine/AppService/VengineAppService.cs b/visualdev/Tnb.Vengine/AppService/VengineAppService.cs index 266eccc1..49ee50fb 100644 --- a/visualdev/Tnb.Vengine/AppService/VengineAppService.cs +++ b/visualdev/Tnb.Vengine/AppService/VengineAppService.cs @@ -22,32 +22,17 @@ namespace Tnb.Vengine.AppService; [Route("/")] public class VengineAppService : BaseAppService, IVengineAppService { - private readonly IDataAccess _dataAccess; - private readonly ISqlSugarClient _db; - private readonly Dictionary _models = new(); + //private readonly ISqlSugarClient _db; /// /// 构造函数 /// - public VengineAppService(IDataAccess da) + public VengineAppService(IDataAccess da):base(da) { - _dataAccess = da; - _db = _dataAccess.GetSqlSugar(); + //_db = _dataAccess.GetSqlSugar(); } #region 按模型的id进行增删改查接口 - /// - /// 获取Vmodel - /// - private async Task GetVmodelAsync(string id) - { - if (!_models.ContainsKey(id)) - { - _models[id] = await _dataAccess.GetVmodelAsync(id, false); - } - return _models[id]; - } - /// /// 获取一条 数据信息 /// @@ -55,7 +40,9 @@ public class VengineAppService : BaseAppService, IVengineAppService public async Task GetAsync(string vmid, [FromQuery] VmGetInput input) { var vm = await GetVmodelAsync(vmid); - var arg = input.ToQueryInput(vm.GetPrimary().code); + var arg = input.Adapt(); + arg.AddQueryParaIf(!string.IsNullOrEmpty(input.id), vm.GetPrimary().code, input.id!); + var ls = await ListAsync(vmid, arg); return ls.items.FirstOrDefault(); } @@ -116,17 +103,6 @@ public class VengineAppService : BaseAppService, IVengineAppService #endregion 按模型的id进行增删改查接口 #region 按模型的areaCode和vmcode进行增删改查接口 - - private async Task GetVmodelAsync(string areaCode, string vmCode) - { - var key = areaCode + "/" + vmCode; - if (!_models.ContainsKey(key)) - { - _models[key] = await _dataAccess.GetVmodelAsync(areaCode, vmCode, false); - } - return _models[key]; - } - /// /// 获取一条 数据信息 /// @@ -134,7 +110,9 @@ public class VengineAppService : BaseAppService, IVengineAppService public async Task GetAsync(string areaCode, string vmCode, [FromQuery] VmGetInput input) { var vm = await GetVmodelAsync(areaCode, vmCode); - var arg = input.ToQueryInput(vm.GetPrimary().code); + var arg = input.Adapt(); + arg.AddQueryParaIf(!string.IsNullOrEmpty(input.id), vm.GetPrimary().code, input.id!); + var ls = await ListAsync(areaCode, vmCode, arg); return ls.items.FirstOrDefault(); } diff --git a/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs b/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs index 0ea7d967..f5975d96 100644 --- a/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs +++ b/visualdev/Tnb.Vengine/AppService/VengineAppServiceT.cs @@ -6,10 +6,14 @@ using System.Reflection; using System.Security.Cryptography; using Aop.Api.Domain; +using JNPF; using JNPF.Common.Contracts; +using JNPF.Common.Extension; using Mapster; using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Controllers; using SqlSugar; using Tnb.Core; using Tnb.Vengine.DataAccess; @@ -31,57 +35,55 @@ public class VengineAppService _models = new(); /// /// 构造函数 /// - public VengineAppService(IDataAccess dataAccess) + public VengineAppService(IDataAccess dataAccess) : base(dataAccess) { - _dataAccess = dataAccess; - _db = _dataAccess.GetSqlSugar(); + _db = dataAccess.GetSqlSugar(); } protected virtual async Task GetVmodelAsync() { + string? areaCode = null, vmCode = null; + // 1.优先从路由中获取模型code + IHttpContextAccessor httpContextAccessor = App.GetService(); + var routes = httpContextAccessor.HttpContext?.Request.RouteValues; + //HttpContext.GetEndpoint()?.Metadata.GetMetadata(); + if (routes != null) + { + areaCode = routes.GetOrDefault("area")?.ToString(); + vmCode = routes.GetOrDefault("controller")?.ToString(); + if (!string.IsNullOrEmpty(areaCode) && !string.IsNullOrEmpty(vmCode)) + { + return await GetVmodelAsync(areaCode, vmCode); + } + } + // 2.其次从实体特性中获取模型code var tp = typeof(TEntity); - string? id = null, area = null, code = null; var vset = tp.GetCustomAttribute(); if (vset != null) { - id = vset.Id; - area = vset.Area; - code = vset.Code; + if (!string.IsNullOrEmpty(vset.Id)) + { + return await GetVmodelAsync(vset.Id); + } + areaCode = vset.Area; + vmCode = vset.Code; } - if (!string.IsNullOrEmpty(id)) + // 3.从实体命名空间中获取模型code + if (string.IsNullOrEmpty(areaCode)) { - if (!_models.ContainsKey(id)) - { - _models[id] = await _dataAccess.GetVmodelAsync(id, false); - //_models[_models[id].fullCode] = _models[id]; - } - return _models[id]; + ThrowIf.IsNullOrEmpty(tp.Namespace, $"类型 {nameof(tp)} 的命名空间不可为空"); + areaCode = tp.Namespace.RemovePreFix(ModuleConst.NsPrefix + ".").Replace(".Domain", "").Replace(".Entities", "").ToKebab(); } - else + if (string.IsNullOrEmpty(vmCode)) { - if (string.IsNullOrEmpty(area)) - { - ThrowIf.IsNullOrEmpty(tp.Namespace, $"类型 {nameof(tp)} 的命名空间不可为空"); - area = tp.Namespace.RemovePreFix(ModuleConst.NsPrefix + ".").Replace(".Domain", "").Replace(".Entities", "").ToKebab(); - } - if (string.IsNullOrEmpty(code)) - { - code = tp.Name.ToKebab(); - } - var key = area + "/" + code; - if (!_models.ContainsKey(key)) - { - _models[key] = await _dataAccess.GetVmodelAsync(area, code, false); - } - return _models[key]; + vmCode = tp.Name.ToKebab(); } + return await GetVmodelAsync(areaCode, vmCode); } /// @@ -92,11 +94,7 @@ public class VengineAppService(); - if (input.id != null) - { - if (arg.q == null) arg.q = new DObject(); - arg.q.Add(vm.GetPrimary().code, input.id); - } + arg.AddQueryParaIf(!string.IsNullOrEmpty(input.id), vm.GetPrimary().code, input.id!); var data = (await ListAsync(arg)).items.FirstOrDefault(); return data == null ? default! : data.Adapt(); @@ -129,7 +127,7 @@ public class VengineAppService CreateAsync([FromBody] TCreateInput input) { var vm = await GetVmodelAsync(); - var ret = await _dataAccess.CreateDataAsync(vm, input); + var ret = await _dataAccess.CreateDataAsync(vm, input.ToEditInput()); return ret; } @@ -140,7 +138,7 @@ public class VengineAppService UpdateAsync([FromBody] TUpdateInput input) { var vm = await GetVmodelAsync(); - var ret = await _dataAccess.UpdateDataAsync(vm, input); + var ret = await _dataAccess.UpdateDataAsync(vm, input.ToEditInput()); return ret; } diff --git a/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs b/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs index 751388db..b03f2231 100644 --- a/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs +++ b/visualdev/Tnb.Vengine/AppService/VmodelAppService.cs @@ -4,6 +4,7 @@ ///////////////////////////////////////////////////////////////////////////////// using JNPF; +using JNPF.Common.Core.Manager; using JNPF.Common.Manager; using JNPF.Common.Security; using JNPF.ViewEngine; @@ -13,26 +14,29 @@ using SqlSugar; using Tnb.Core; using Tnb.Vengine.DataAccess; using Tnb.Vengine.Domain; +using Yitter.IdGenerator; namespace Tnb.Vengine.AppService; /// -/// 视图模型服务类 +/// 视图模型服务类, /// [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, KeepVerb = true, Order = 1102)] -[Route("api/[area]/[controller]/[action]")] +//[Route("api/[area]/[controller]/[action]")] public class VmodelAppService : VengineAppService, IVmodelAppService { private readonly IViewEngine _viewEngine; private readonly ICacheManager _cache; + private readonly IUserManager _user; /// /// 构造函数 /// - public VmodelAppService(IDataAccess da, IViewEngine viewEngine, ICacheManager cache) : base(da) + public VmodelAppService(IDataAccess da, IViewEngine viewEngine, ICacheManager cache, IUserManager user) : base(da) { _viewEngine = viewEngine; _cache = cache; + _user = user; } /// @@ -65,7 +69,8 @@ public class VmodelAppService : VengineAppService> ListAsync(VmQueryInput input) { - var q = _db.Queryable().WhereIF(!string.IsNullOrEmpty(input.k), a => a.vmCode.Contains(input.k!) || a.vmName.Contains(input.k!)); + var q = _db.Queryable().Where(a => a.deleted == 0) + .WhereIF(!string.IsNullOrEmpty(input.k), a => a.vmCode.Contains(input.k!) || a.vmName.Contains(input.k!)); RefAsync total = 0; var data = await q.OrderBy(input.sort).ToPageListAsync((input.pnum - 1) * input.psize, input.psize, total); return PagedOutput.Create(total, data); @@ -77,10 +82,12 @@ public class VmodelAppService : VengineAppService CreateAsync(VmodelCreateInput input) { ThrowIf.IsNull(input.data); - //ArgumentNullException.ThrowIfNull(input.data); - Vmodel vm = input.data.ToObject(); + Vmodel vm = input.data.Adapt(); + vm.id = YitIdHelper.NextId().ToString(); vm.areaCode = vm.areaCode.ToKebab(); vm.vmCode = vm.vmCode.ToKebab(); + vm.createTime = DateTime.Now; + vm.createId = _user.UserId; await _db.Insertable(vm).ExecuteCommandAsync(); return vm; } @@ -91,11 +98,14 @@ public class VmodelAppService : VengineAppService UpdateAsync(VmodelUpdateInput input) { ThrowIf.IsNull(input.data); - //ArgumentNullException.ThrowIfNull(input.data); - Vmodel vm = input.data.ToObject(); + ThrowIf.IsNullOrEmpty(input.data.id, $"更新数据时主键(id)不可为空"); + + Vmodel vm = input.data.Adapt(); vm.areaCode = vm.areaCode.ToKebab(); vm.vmCode = vm.vmCode.ToKebab(); vm.navProps.ForEach(a => a.naviModel = null); + vm.modifyTime = DateTime.Now; + vm.modifyId = _user.UserId; await _db.Updateable(vm).WhereColumns(a => a.id).ExecuteCommandAsync(); await _cache.DelAsync(_dataAccess.GetVmodelCacheKey(vm.id)); return vm; @@ -106,7 +116,7 @@ public class VmodelAppService : VengineAppService public override async Task DeleteAsync(VmDeleteInput input) { - var ret = await _db.Deleteable(input.id).ExecuteCommandAsync(); + var ret = await _db.Updateable().SetColumns(a => a.deleted, 1).Where(a => a.id == input.id).ExecuteCommandAsync(); await _cache.DelAsync(_dataAccess.GetVmodelCacheKey(input.id!)); return ret; } diff --git a/visualdev/Tnb.Vengine/AppService/VmodelDto.cs b/visualdev/Tnb.Vengine/AppService/VmodelDto.cs index 2cbbb864..d935a9aa 100644 --- a/visualdev/Tnb.Vengine/AppService/VmodelDto.cs +++ b/visualdev/Tnb.Vengine/AppService/VmodelDto.cs @@ -3,10 +3,18 @@ // https://git.tuotong-tech.com/tnb/tnb.server // ///////////////////////////////////////////////////////////////////////////////// +using Mapster; +using Newtonsoft.Json; +using SqlSugar; +using Tnb.Core; using Tnb.Vengine.Domain; namespace Tnb.Vengine.AppService; +public record VmodelCreateData(string areaCode, string vmCode, string vmName, string? dbCode, string tableName, List dbProps, List navProps, List calProps, int ordinal, short softDelete, short enabled, string? descrip); +public record VmNavPropCreateData(string code, string name, string vmid, eNavigateType navType, string refCode, string refProp, string fkProp); +public record VmodelUpdateData(string id, string areaCode, string vmCode, string vmName, string? dbCode, string tableName, List dbProps, List navProps, List calProps, int ordinal, short softDelete, short enabled, string? descrip); + public class VmodelGetInput : VmGetInput { /// @@ -24,11 +32,17 @@ public class VmodelGetInput : VmGetInput } public class VmodelCreateInput : VmEditInput { - public new Vmodel? data { get; set; } + public new VmodelCreateData? data { get; set; } + public override VmEditInput ToEditInput() + { + VmEditInput input = this; + input.data = DObject.FromObject(data); + return input; + } } public class VmodelUpdateInput : VmEditInput { - public new Vmodel? data { get; set; } + public new VmodelUpdateData? data { get; set; } } public class VmodelCreateFromTableInput { @@ -43,11 +57,23 @@ public class VmodelCreateFromTableInput public class VmodelPageCreateInput : VmEditInput { public new VmodelPage? data { get; set; } + public override VmEditInput ToEditInput() + { + VmEditInput input = this; + input.data = DObject.FromObject(data); + return input; + } } public class VmodelPageUpdateInput : VmEditInput { public new VmodelPage? data { get; set; } + public override VmEditInput ToEditInput() + { + VmEditInput input = this; + input.data = DObject.FromObject(data); + return input; + } } public class VmodelPageCreateFromVmodelInput diff --git a/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs b/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs index 08467778..75b29763 100644 --- a/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs +++ b/visualdev/Tnb.Vengine/AppService/VmodelPageAppService.cs @@ -19,7 +19,6 @@ namespace Tnb.Vengine.AppService; /// 视图模型服务类 /// [ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 1104, KeepVerb = true)] -[Route("api/[area]/[controller]/[action]")] public class VmodelPageAppService : VengineAppService, IVmodelPageAppService { /// @@ -29,35 +28,6 @@ public class VmodelPageAppService : VengineAppService - ///// 新增 模型 - ///// - //public override async Task CreateAsync(VmCreateInput input) - //{ - // ThrowIf.IsNull(input.data); - // VmodelPage vpage = input.data.Adapt(); - // await _db.Insertable(vpage).ExecuteCommandAsync(); - // return vpage; - //} - - ///// - ///// 更新 数据 - ///// - //public override async Task UpdateAsync(VmUpdateInput input) - //{ - // ThrowIf.IsNull(input.data); - // if (!input.data.ContainsKey(nameof(VmodelPage.id))) - // { - // throw new Exception($"更新数据时主键({nameof(VmodelPage.id)})不可为空"); - // } - // var id = input.data[nameof(VmodelPage.id)].ToString(); - // var model = await _db.Queryable().FirstAsync(a => a.id == id); - // ThrowIf.IsNull(model, $"找不到id={id}的视图页面数据"); - // input.data.Adapt(model, TypeAdapter.IgnoreNull); - // await _db.Updateable(model).WhereColumns(a => a.id).ExecuteCommandAsync(); - // return model; - //} - /// /// 从数据表创建模型 /// diff --git a/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs b/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs index 0f2b9a03..d399017e 100644 --- a/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs +++ b/visualdev/Tnb.Vengine/DataAccess/DataAccess.cs @@ -394,14 +394,7 @@ public class DataAccess : IDataAccess, ITransient, IDisposable if (input.data != null) { DObject model = vm.ToUpdateEntity(input.data, _user); - if (!model.ContainsKey(pk.field)) - { - throw new Exception($"更新数据时主键({pk.code})不可为空"); - } - //if (!model.ContainsKey(pk.field) && input.id != null) - //{ - // model.Add(pk.field, input.id); - //} + ThrowIf.When(!model.ContainsKey(pk.field), $"更新数据时主键({pk.code})不可为空"); num = await db.Updateable(model).AS(vm.tableName).WhereColumns(pk.field).ExecuteCommandAsync(); } //批量修改数据 diff --git a/visualdev/Tnb.Vengine/Domain/VengineDto.cs b/visualdev/Tnb.Vengine/Domain/VengineDto.cs index 4e822155..f71b4923 100644 --- a/visualdev/Tnb.Vengine/Domain/VengineDto.cs +++ b/visualdev/Tnb.Vengine/Domain/VengineDto.cs @@ -34,22 +34,6 @@ public class VmGetInput : VmBaseInput /// public string o { get; set; } = "*"; - /// - /// 转换为QueryInput - /// - /// - /// - public VmQueryInput ToQueryInput(string primaryKey) - { - VmQueryInput arg = this.Adapt(); - if (!string.IsNullOrEmpty(id)) - { - if (arg.q == null) arg.q = new DObject(); - arg.q.Add(primaryKey, id); - } - - return arg; - } } public class VmGetListInput : VmBaseInput @@ -94,6 +78,27 @@ public class VmQueryInput : VmGetListInput /// 查询条件 /// public new DObject? q { get; set; } + + /// + /// 添加一个查询条件 + /// + /// + /// + public void AddQueryPara(string key, object value) + { + if (q == null) q = new DObject(); + q.Add(key, value); + } + + /// + /// 添加一个查询条件 + /// + /// + /// + public void AddQueryParaIf(bool condition, string key, object value) + { + if(condition) AddQueryPara(key, value); + } } /// @@ -110,6 +115,11 @@ public class VmEditInput : VmBaseInput /// 批量添加 /// public List? items { get; set; } + + public virtual VmEditInput ToEditInput() + { + return this; + } } /// diff --git a/visualdev/Tnb.Vengine/Domain/Vmodel.cs b/visualdev/Tnb.Vengine/Domain/Vmodel.cs index 27e72305..2a7bcb78 100644 --- a/visualdev/Tnb.Vengine/Domain/Vmodel.cs +++ b/visualdev/Tnb.Vengine/Domain/Vmodel.cs @@ -23,7 +23,7 @@ namespace Tnb.Vengine.Domain; [SugarTable("sys_vmodel")] public partial class Vmodel : Entity { - public string[] SOFT_DELETED = new string[] { "deleted", "isDeleted", "softDeleted" }; + private static string[] SOFT_DELETED = new string[] { "deleted", "isDeleted", "softDeleted" }; #region Properties @@ -88,7 +88,7 @@ public partial class Vmodel : Entity public int ordinal { get; set; } /// - /// 软删除 + /// 是否软删除 /// [SugarColumn(ColumnName = "soft_delete", IsNullable = false)] public short softDelete { get; set; } @@ -103,7 +103,7 @@ public partial class Vmodel : Entity /// 是否删除 /// [SugarColumn(ColumnName = "deleted", IsNullable = false)] - public short deleted { get; set; } + public short deleted { get; set; } = 0; /// /// 描述