diff --git a/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs b/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs index 95b03123..5789376a 100644 --- a/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs +++ b/BasicData/Tnb.BasicData.Entities/Consts/DictConst.cs @@ -280,6 +280,10 @@ public static class DictConst /// 设备保养类型 /// public const string EqpMaintainType = "EqpMaintainType"; + /// + /// 设备生命周期 + /// + public const string EquipmentLife = "EquipmentLife"; #endregion } \ No newline at end of file diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipListOuput.cs b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipListOuput.cs new file mode 100644 index 00000000..740787a3 --- /dev/null +++ b/EquipMgr/Tnb.EquipMgr.Entities/Dto/EquipListOuput.cs @@ -0,0 +1,230 @@ +using JNPF.Common.Contracts; +using JNPF.Common.Security; +using SqlSugar; + +namespace Tnb.EquipMgr.Entities; + + +public partial class EquipListOuput +{ + public string id { get; set; } + /// + /// 所属组织 + /// + public string? org_id { get; set; } + + /// + /// 设备代码 + /// + public string code { get; set; } = string.Empty; + + /// + /// 设备名称 + /// + public string name { get; set; } = string.Empty; + + /// + /// 设备类型id + /// + public string equip_type_id { get; set; } = string.Empty; + + /// + /// 设备类型id + /// + public string equip_type_id_id { get; set; } = string.Empty; + + /// + /// 设备生产日期 + /// + public string? product_date { get; set; } + + /// + /// 设备生产厂家 + /// + public string? manufacturer { get; set; } + + /// + /// 使用部门id + /// + public string? use_department_id { get; set; } + + public string? use_department_id_id { get; set; } + + /// + /// 安装日期 + /// + public string install_date { get; set; } = string.Empty; + + /// + /// 使用日期 + /// + public DateTime? use_date { get; set; } + + /// + /// 验收日期 + /// + public DateTime? accept_date { get; set; } + + /// + /// 管理部门id + /// + public string? manage_department_id { get; set; } + + public string? manage_department_id_id { get; set; } + + /// + /// 设备生命周期 + /// + public string? life { get; set; } + + /// + /// 技改编码 + /// + public string? techno_logy_code { get; set; } + + /// + /// 备注 + /// + public string remark { get; set; } = string.Empty; + + /// + /// 时间戳 + /// + public string? timestamp { get; set; } + + /// + /// 创建用户 + /// + public string? create_id { get; set; } + + public string? create_id_id { get; set; } + + /// + /// 创建时间 + /// + public DateTime? create_time { get; set; } + + /// + /// 修改用户 + /// + public string? modify_id { get; set; } + + public string? modify_id_id { get; set; } + + /// + /// 修改时间 + /// + public DateTime? modify_time { get; set; } + + /// + /// 扩展字段 + /// + public string? extras { get; set; } + + /// + /// 供应商id + /// + public string? supplier_id { get; set; } + + public string? supplier_id_id { get; set; } + + /// + /// 出厂编码 + /// + public string? factory_code { get; set; } + + /// + /// 合同/采购单号 + /// + public string? contract_no { get; set; } + + /// + /// 维保单位 + /// + public string? maintenance_unit { get; set; } + + /// + /// 维保电话 + /// + public string? maintenance_phone { get; set; } + + /// + /// 规格型号 + /// + public string? specification { get; set; } + + /// + /// 安装地点 + /// + public string? installation_location { get; set; } + + /// + /// 是否成套设备 + /// + public string is_complete_set { get; set; } = string.Empty; + + /// + /// DCS-ID + /// + public string? dcs_id { get; set; } + + /// + /// 技术参数 + /// + public string? technology_parameter { get; set; } + + /// + /// 状态 + /// + public string? status { get; set; } + + /// + /// 吨位 + /// + public decimal? tonnage { get; set; } + + /// + /// 设备机台号 + /// + public string? eqp_machine_num { get; set; } + + /// + /// 模具Id + /// + public string? mold_id { get; set; } + /// + /// 工位编码 + /// + public string? station_code { get; set; } + + /// + /// 质保开始时间 + /// + public DateTime? warranty_start_time { get; set; } + + /// + /// 质保结束时间 + /// + public DateTime? warranty_end_time { get; set; } + + /// + /// 责任人 + /// + public string? responsibler_id { get; set; } + + public string? responsibler_id_id { get; set; } + + /// + /// 二维码 + /// + public string? qrcode { get; set; } + + /// + /// 入库库位id + /// + public string? as_location_id { get; set; } + + public string? as_location_id_id { get; set; } + + +} diff --git a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpEquipment.cs b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpEquipment.cs index 300bbf3d..c771febc 100644 --- a/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpEquipment.cs +++ b/EquipMgr/Tnb.EquipMgr.Entities/Entity/EqpEquipment.cs @@ -213,9 +213,5 @@ public partial class EqpEquipment : BaseEntity /// public string? as_location_id { get; set; } - /// - /// 第三方平台设备编号 - /// - public string? third_equip_code { get; set; } } diff --git a/EquipMgr/Tnb.EquipMgr/EquipmentService.cs b/EquipMgr/Tnb.EquipMgr/EquipmentService.cs index 3630b578..ab32e0fa 100644 --- a/EquipMgr/Tnb.EquipMgr/EquipmentService.cs +++ b/EquipMgr/Tnb.EquipMgr/EquipmentService.cs @@ -6,6 +6,7 @@ using JNPF.DynamicApiController; using JNPF.Extras.CollectiveOAuth.Models; using JNPF.FriendlyException; using JNPF.Systems.Entitys.Permission; +using JNPF.Systems.Entitys.System; using JNPF.VisualDev; using JNPF.VisualDev.Entitys; using JNPF.VisualDev.Entitys.Dto.VisualDevModelData; @@ -50,7 +51,88 @@ namespace Tnb.EquipMgr _userManager = userManager; OverideFuncs.CreateAsync = Create; OverideFuncs.UpdateAsync = Update; + OverideFuncs.GetListAsync = PageList; } + + private async Task PageList(VisualDevModelListQueryInput input) + { + Dictionary? queryJson = !string.IsNullOrEmpty(input.queryJson) ? Newtonsoft.Json.JsonConvert.DeserializeObject>(input.queryJson) : new Dictionary(); + string equip_type_id = queryJson.ContainsKey("equip_type_id") ? queryJson["equip_type_id"].ToString() : ""; + string code = queryJson.ContainsKey("code") ? queryJson["code"].ToString() : ""; + string name = queryJson.ContainsKey("name") ? queryJson["name"].ToString() : ""; + string contract_no = queryJson.ContainsKey("contract_no") ? queryJson["contract_no"].ToString() : ""; + + var result = await _repository.AsSugarClient().Queryable((a, b,c,d,e,f,g,h,i,j) => + new JoinQueryInfos( + JoinType.Left, a.use_department_id == b.Id, + JoinType.Left, a.manage_department_id == c.Id, + JoinType.Left, a.create_id == d.Id, + JoinType.Left, a.modify_id == e.Id, + JoinType.Left, a.supplier_id == f.id, + JoinType.Left, a.responsibler_id == g.Id, + JoinType.Left, a.as_location_id == h.id, + JoinType.Left, i.EnCode==DictConst.EquipmentLife, + JoinType.Left, i.Id==j.DictionaryTypeId && a.life==j.EnCode + )) + .WhereIF(!string.IsNullOrEmpty(equip_type_id),a=>a.equip_type_id==equip_type_id) + .WhereIF(!string.IsNullOrEmpty(code),a=>a.code.Contains(code)) + .WhereIF(!string.IsNullOrEmpty(name),a=>a.name.Contains(name)) + .WhereIF(!string.IsNullOrEmpty(contract_no),a=>a.contract_no.Contains(contract_no)) + .Select((a, b,c,d,e,f,g,h,i,j) => new EquipListOuput() + { + id = a.id, + org_id = a.org_id, + code = a.code , + name = a.name , + equip_type_id = a.equip_type_id , + product_date = a.product_date, + manufacturer = a.manufacturer, + use_department_id = b.FullName, + use_department_id_id = a.use_department_id, + install_date = a.install_date , + use_date = a.use_date, + accept_date = a.accept_date, + manage_department_id = c.FullName, + manage_department_id_id = a.manage_department_id, + life = j.FullName, + techno_logy_code = a.techno_logy_code, + remark = a.remark , + timestamp = a.timestamp, + create_id = d.RealName, + create_id_id = a.create_id, + create_time = a.create_time, + modify_id = e.RealName, + modify_id_id = a.modify_id, + modify_time = a.modify_time, + extras = a.extras, + supplier_id = f.supplier_name, + supplier_id_id = a.supplier_id, + factory_code = a.factory_code, + contract_no = a.contract_no, + maintenance_unit = a.maintenance_unit, + maintenance_phone = a.maintenance_phone, + specification = a.specification, + installation_location = a.installation_location, + is_complete_set = a.is_complete_set=="1" ? "是" : "否", + dcs_id = a.dcs_id, + technology_parameter = a.technology_parameter, + status = a.status, + tonnage = a.tonnage, + eqp_machine_num = a.eqp_machine_num, + mold_id = a.mold_id, + station_code = a.station_code, + warranty_start_time = a.warranty_start_time, + warranty_end_time = a.warranty_end_time, + responsibler_id = g.RealName, + responsibler_id_id = a.responsibler_id, + qrcode = a.qrcode, + as_location_id = h.location_name, + as_location_id_id = a.as_location_id, + }).ToPagedListAsync(input.currentPage,input.pageSize); + return PageResult.SqlSugarPageResult(result); + + } + /// /// 在线开发-获取设备列表 /// 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; /// /// 描述