修复钻取一对多子表时条件使用了字段的错误

This commit is contained in:
2023-09-26 17:55:26 +08:00
parent bc8401c8e9
commit ccebc3dea1
8 changed files with 61 additions and 28 deletions

View File

@@ -3,8 +3,13 @@
// https://git.tuotong-tech.com/tnb/tnb.server // // https://git.tuotong-tech.com/tnb/tnb.server //
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
using Aspose.Cells.Drawing;
using JNPF.DependencyInjection; using JNPF.DependencyInjection;
using JNPF.DynamicApiController; using JNPF.DynamicApiController;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Tnb.Core;
using Tnb.Vengine.Domain;
namespace Tnb.Vengine.AppService; namespace Tnb.Vengine.AppService;
@@ -14,3 +19,16 @@ namespace Tnb.Vengine.AppService;
public class BaseAppService : IDynamicApiController, ITransient public class BaseAppService : IDynamicApiController, ITransient
{ {
} }
//[ApiDescriptionSettings(Tag = ModuleConst.Tag, Area = ModuleConst.Area, Order = 100)]
//public class VTestAppService : BaseAppService
//{
// /// <summary>
// /// 获取多条 数据列表
// /// </summary>
// public async Task<dynamic> ListAsync(string vmid, [FromQuery] VmGetListInput input)
// {
// return new List<string>();
// }
//}

View File

@@ -43,7 +43,7 @@ public class VengineAppService : BaseAppService, IVengineAppService
public async Task<dynamic?> GetAsync(string vmid, [FromQuery]VmGetInput input) public async Task<dynamic?> GetAsync(string vmid, [FromQuery]VmGetInput input)
{ {
var vm = await _dataAccess.GetVmodelAsync(vmid, true); var vm = await _dataAccess.GetVmodelAsync(vmid, true);
VmQueryInput arg = input.Adapt<VmQueryInput>(); VmListInput arg = input.Adapt<VmListInput>();
if (input.id != null) if (input.id != null)
{ {
if (arg.q == null) arg.q = new DObject(); if (arg.q == null) arg.q = new DObject();
@@ -60,7 +60,7 @@ public class VengineAppService : BaseAppService, IVengineAppService
public async Task<VmPagedOutput> GetListAsync(string vmid, [FromQuery] VmGetListInput input) public async Task<VmPagedOutput> GetListAsync(string vmid, [FromQuery] VmGetListInput input)
{ {
var vm = await _dataAccess.GetVmodelAsync(vmid, true); var vm = await _dataAccess.GetVmodelAsync(vmid, true);
VmQueryInput arg = input.Adapt<VmQueryInput>(); VmListInput arg = input.Adapt<VmListInput>();
if (!string.IsNullOrEmpty(input.q)) if (!string.IsNullOrEmpty(input.q))
{ {
arg.q = input.q.ToObject<DObject>(); arg.q = input.q.ToObject<DObject>();
@@ -72,8 +72,8 @@ public class VengineAppService : BaseAppService, IVengineAppService
/// <summary> /// <summary>
/// 获取多条 数据列表 /// 获取多条 数据列表
/// </summary> /// </summary>
[HttpPost("api/[area]/[controller]/{vmid}/query")] [HttpPost("api/[area]/[controller]/{vmid}/list")]
public async Task<VmPagedOutput> QueryAsync(string vmid, [FromBody] VmQueryInput input) public async Task<VmPagedOutput> ListAsync(string vmid, [FromBody] VmListInput input)
{ {
var vm = await _dataAccess.GetVmodelAsync(vmid, true); var vm = await _dataAccess.GetVmodelAsync(vmid, true);
var ls = await _dataAccess.QueryDataAsync(vm, input); var ls = await _dataAccess.QueryDataAsync(vm, input);
@@ -130,7 +130,7 @@ public class VengineAppService : BaseAppService, IVengineAppService
public async Task<dynamic?> GetAsync(string areaCode, string vmCode, [FromQuery] VmGetInput input) public async Task<dynamic?> GetAsync(string areaCode, string vmCode, [FromQuery] VmGetInput input)
{ {
var vm = await GetVmodelAsync(areaCode, vmCode); var vm = await GetVmodelAsync(areaCode, vmCode);
VmQueryInput arg = input.Adapt<VmQueryInput>(); VmListInput arg = input.Adapt<VmListInput>();
if (input.id != null) if (input.id != null)
{ {
if (arg.q == null) arg.q = new DObject(); if (arg.q == null) arg.q = new DObject();
@@ -147,7 +147,7 @@ public class VengineAppService : BaseAppService, IVengineAppService
public async Task<VmPagedOutput> GetListAsync(string areaCode, string vmCode, [FromQuery] VmGetListInput input) public async Task<VmPagedOutput> GetListAsync(string areaCode, string vmCode, [FromQuery] VmGetListInput input)
{ {
var vm = await GetVmodelAsync(areaCode, vmCode); var vm = await GetVmodelAsync(areaCode, vmCode);
VmQueryInput arg = input.Adapt<VmQueryInput>(); VmListInput arg = input.Adapt<VmListInput>();
if (!string.IsNullOrEmpty(input.q)) if (!string.IsNullOrEmpty(input.q))
{ {
arg.q = input.q.ToObject<DObject>(); arg.q = input.q.ToObject<DObject>();
@@ -159,8 +159,8 @@ public class VengineAppService : BaseAppService, IVengineAppService
/// <summary> /// <summary>
/// 获取多条 数据列表 /// 获取多条 数据列表
/// </summary> /// </summary>
[HttpPost("api/{areaCode}/{vmCode}/query")] [HttpPost("api/{areaCode}/{vmCode}/list")]
public async Task<VmPagedOutput> QueryAsync(string areaCode, string vmCode, [FromBody] VmQueryInput input) public async Task<VmPagedOutput> ListAsync(string areaCode, string vmCode, [FromBody] VmListInput input)
{ {
var vm = await GetVmodelAsync(areaCode, vmCode); var vm = await GetVmodelAsync(areaCode, vmCode);
var ls = await _dataAccess.QueryDataAsync(vm, input); var ls = await _dataAccess.QueryDataAsync(vm, input);

View File

@@ -66,7 +66,7 @@ public class VengineAppService<TEntity> : BaseAppService where TEntity : Entity
public virtual async Task<dynamic> GetAsync([FromQuery] VmGetInput input) public virtual async Task<dynamic> GetAsync([FromQuery] VmGetInput input)
{ {
var vm = await GetVmodelAsync(); var vm = await GetVmodelAsync();
VmQueryInput arg = input.Adapt<VmQueryInput>(); VmListInput arg = input.Adapt<VmListInput>();
if (input.id != null) if (input.id != null)
{ {
if (arg.q == null) arg.q = new DObject(); if (arg.q == null) arg.q = new DObject();
@@ -83,12 +83,7 @@ public class VengineAppService<TEntity> : BaseAppService where TEntity : Entity
public virtual async Task<VmPagedOutput> GetListAsync([FromQuery] VmGetListInput input) public virtual async Task<VmPagedOutput> GetListAsync([FromQuery] VmGetListInput input)
{ {
var vm = await GetVmodelAsync(); var vm = await GetVmodelAsync();
VmQueryInput arg = input.Adapt<VmQueryInput>(); var ls = await _dataAccess.QueryDataAsync(vm, input.ToListInput());
if (!string.IsNullOrEmpty(input.q))
{
arg.q = input.q.ToObject<DObject>();
}
var ls = await _dataAccess.QueryDataAsync(vm, arg);
return ls; return ls;
} }
@@ -96,7 +91,7 @@ public class VengineAppService<TEntity> : BaseAppService where TEntity : Entity
/// 获取多条 数据列表 /// 获取多条 数据列表
/// </summary> /// </summary>
[HttpPost] [HttpPost]
public virtual async Task<VmPagedOutput> QueryAsync([FromBody] VmQueryInput input) public virtual async Task<VmPagedOutput> ListAsync([FromBody] VmListInput input)
{ {
var vm = await GetVmodelAsync(); var vm = await GetVmodelAsync();
var ls = await _dataAccess.QueryDataAsync(vm, input); var ls = await _dataAccess.QueryDataAsync(vm, input);

View File

@@ -71,9 +71,9 @@ public class VmodelAppService : VengineAppService<Vmodel>, IVmodelAppService
} }
[NonAction] [NonAction]
public override Task<VmPagedOutput> QueryAsync(VmQueryInput input) public override Task<VmPagedOutput> ListAsync(VmListInput input)
{ {
return base.QueryAsync(input); return base.ListAsync(input);
} }
/// <summary> /// <summary>

View File

@@ -184,7 +184,7 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
/// <summary> /// <summary>
/// 查询数据 默认方法 /// 查询数据 默认方法
/// </summary> /// </summary>
public async Task<VmPagedOutput> QueryDataAsync(Vmodel vm, VmQueryInput input) public async Task<VmPagedOutput> QueryDataAsync(Vmodel vm, VmListInput input)
{ {
ISqlSugarClient db = GetSqlSugar(vm.dbCode); ISqlSugarClient db = GetSqlSugar(vm.dbCode);
var query = db.Queryable<object>().AS(vm.tableName, VmSelectProp.MAIN_ALIES); var query = db.Queryable<object>().AS(vm.tableName, VmSelectProp.MAIN_ALIES);
@@ -259,8 +259,10 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
{ {
if (prop.navType == eNavigateType.OneToOne) if (prop.navType == eNavigateType.OneToOne)
{ {
//以 nav_prop的形式返回
var key = prop.navCode + "_" + prop.code; var key = prop.navCode + "_" + prop.code;
ret.Add(key, src[key]); ret.Add(key, src[key]);
//以 nav.prop的形式返回
//if (!ret.ContainsKey(prop.navCode)) //if (!ret.ContainsKey(prop.navCode))
//{ //{
// ret.Add(prop.navCode, new DObject()); // ret.Add(prop.navCode, new DObject());
@@ -280,10 +282,14 @@ public class DataAccess : IDataAccess, ITransient, IDisposable
var navProp = vm.navProps.First(a => a.code == prop.navCode); var navProp = vm.navProps.First(a => a.code == prop.navCode);
if (navProp != null && navProp.naviModel != null && src.ContainsKey(navProp.refField)) if (navProp != null && navProp.naviModel != null && src.ContainsKey(navProp.refField))
{ {
VmQueryInput input = new VmQueryInput(); VmListInput input = new VmListInput();
input.q = new DObject(navProp.refField, src[navProp.refField]); var fkProp = navProp.naviModel.FieldCodeToPropCode(navProp.fkField);
input.o = string.Join(',', selProps.Where(a => a.navCode == prop.navCode).Select(a => a.code)); if (!string.IsNullOrEmpty(fkProp))
ret[prop.navCode] = (await QueryDataAsync(navProp.naviModel, input)).items; {
input.q = new DObject(fkProp, src[navProp.refField]);
input.o = string.Join(',', selProps.Where(a => a.navCode == prop.navCode).Select(a => a.code));
ret[prop.navCode] = (await QueryDataAsync(navProp.naviModel, input)).items;
}
} }
} }
else if (prop.navType == eNavigateType.ManyToMany) else if (prop.navType == eNavigateType.ManyToMany)

View File

@@ -48,7 +48,7 @@ public interface IDataAccess : ITransient
/// <summary> /// <summary>
/// 查询数据 默认方法 /// 查询数据 默认方法
/// </summary> /// </summary>
Task<VmPagedOutput> QueryDataAsync(Vmodel vm, VmQueryInput input); Task<VmPagedOutput> QueryDataAsync(Vmodel vm, VmListInput input);
//Task<dynamic> CreateDataAsync(VmCreateInput input); //Task<dynamic> CreateDataAsync(VmCreateInput input);
/// <summary> /// <summary>

View File

@@ -3,6 +3,8 @@
// https://git.tuotong-tech.com/tnb/tnb.server // // https://git.tuotong-tech.com/tnb/tnb.server //
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
using JNPF.Common.Security;
using Mapster;
using Tnb.Core; using Tnb.Core;
namespace Tnb.Vengine.Domain; namespace Tnb.Vengine.Domain;
@@ -64,12 +66,24 @@ public class VmGetListInput : VmBaseInput
/// 输出字段 /// 输出字段
/// </summary> /// </summary>
public string o { get; set; } = "*"; public string o { get; set; } = "*";
public VmListInput ToListInput()
{
VmListInput arg = this.Adapt<VmListInput>();
if (!string.IsNullOrEmpty(q))
{
arg.q = q.ToObject<DObject>();
}
return arg;
}
} }
/// <summary> /// <summary>
/// 获取多条数据输入参数 /// 获取多条数据输入参数
/// </summary> /// </summary>
public class VmQueryInput : VmGetListInput public class VmListInput : VmGetListInput
{ {
/// <summary> /// <summary>
/// 查询条件 /// 查询条件

View File

@@ -15,11 +15,11 @@ public class VmodelMapper : IRegister
{ {
public void Register(TypeAdapterConfig config) public void Register(TypeAdapterConfig config)
{ {
config.ForType<VmGetInput, VmQueryInput>() config.ForType<VmGetInput, VmListInput>()
.Map(dest => dest.psize, src => 1) .Map(dest => dest.psize, src => 1)
.Map(dest => dest.pnum, src => 0) .Map(dest => dest.pnum, src => 0)
.Map(dest => dest.q, src => string.IsNullOrEmpty(src.q) ? null : src.q.ToObject<DObject>()); .Map(dest => dest.q, src => string.IsNullOrEmpty(src.q) ? null : src.q.ToObject<DObject>());
config.ForType<VmGetListInput, VmQueryInput>() config.ForType<VmGetListInput, VmListInput>()
.Map(dest => dest.q, src => string.IsNullOrEmpty(src.q) ? null : src.q.ToObject<DObject>()); .Map(dest => dest.q, src => string.IsNullOrEmpty(src.q) ? null : src.q.ToObject<DObject>());
config.ForType<DbColumnInfo, VmDbProp>() config.ForType<DbColumnInfo, VmDbProp>()
.Map(dest => dest.code, src => src.DbColumnName.ToCamel()) .Map(dest => dest.code, src => src.DbColumnName.ToCamel())