完善模型通用接口的无限层级一对一和单层级一对多

This commit is contained in:
2023-11-15 13:43:24 +08:00
parent d800987307
commit 9c03ef2bcc
145 changed files with 758 additions and 10219 deletions

View File

@@ -23,8 +23,6 @@ namespace Tnb.Vengine.Domain;
[SugarTable("sys_vmodel")]
public partial class Vmodel : Entity
{
public const string MAIN_ALIES = "m";
#region Properties
/// <summary>
@@ -139,9 +137,6 @@ public partial class Vmodel : Entity
public string fullCode
{ get { return areaCode + "/" + vmCode; } }
[SugarColumn(IsIgnore = true)]
public Vmodel? parent { get; set; }
/// <summary>
/// 主键
/// </summary>
@@ -151,8 +146,8 @@ public partial class Vmodel : Entity
}
#endregion Properties
//private Dictionary<string, string>? _mapField2Prop = null;
//private Dictionary<string, string>? _mapProp2Field = null;
private Dictionary<string, VmDbProp>? _mapProps = null;
/// <summary>
/// 通过实体创建模型
/// </summary>
@@ -207,43 +202,13 @@ public partial class Vmodel : Entity
/// </summary>
/// <param name="propCode"></param>
/// <returns></returns>
public string? PropCodeToFieldCode(string propCode)
public string? PropToFieldCode(string propCode)
{
return dbProps.Where(a => a.code == propCode).Select(a => a.field).FirstOrDefault();
}
/// <summary>
/// 根据字段名获取属性名
/// </summary>
/// <param name="fieldCode"></param>
/// <returns></returns>
public string? FieldCodeToPropCode(string fieldCode)
{
return dbProps.Where(a => a.field == fieldCode).Select(a => a.code).FirstOrDefault();
}
/// <summary>
/// 属性代码转换为字段代码
/// </summary>
/// <param name="input"></param>
/// <param name="ignoreNotMapped"></param>
/// <returns></returns>
public DObject PropToField(DObject input, bool ignoreNotMapped = true)
{
DObject ret = new();
foreach (var item in input)
if(_mapProps == null)
{
var fcode = PropCodeToFieldCode(item.Key);
if (!string.IsNullOrEmpty(fcode))
{
ret.Add(fcode, item.Value);
}
else if (!ignoreNotMapped)
{
ret.Add(item.Key, item.Value);
}
_mapProps = dbProps.ToDictionary(a=>a.code);
}
return ret;
return _mapProps.GetOrDefault(propCode)?.field;
}
/// <summary>
@@ -252,214 +217,13 @@ public partial class Vmodel : Entity
/// <param name="input"></param>
/// <param name="ignoreNotMapped"></param>
/// <returns></returns>
public DObject FieldToProp(DObject input, bool ignoreNotMapped = true)
public VmDbProp? GetDbProp(string propCode)
{
DObject ret = new();
foreach (var item in input)
if (_mapProps == null)
{
var pcode = FieldCodeToPropCode(item.Key);
if (!string.IsNullOrEmpty(pcode))
{
ret.Add(pcode, item.Value);
}
else if (!ignoreNotMapped)
{
ret.Add(item.Key, item.Value);
}
_mapProps = dbProps.ToDictionary(a => a.code);
}
return ret;
}
/// <summary>
/// 获取查询字段的属性信息
/// </summary>
/// <param name="outputProps"></param>
/// <returns></returns>
public List<VmSelectProp> GetVmSelectProps(string? outputProps)
{
if (string.IsNullOrEmpty(outputProps) || outputProps == "*")
{
return dbProps.Select(a => new VmSelectProp { code = a.code, field = a.field }).ToList();
}
List<VmSelectProp> selProps = new();
var outputs = outputProps.Split(',').Distinct().ToList();
foreach (var propCode in outputs)
{
if (!propCode.Contains("."))
{
var fieldCode = PropCodeToFieldCode(propCode);
if (!string.IsNullOrEmpty(fieldCode))
{
selProps.Add(new VmSelectProp { code = propCode, field = fieldCode });
}
continue;
}
var codes = propCode.Split('.');
if (codes.Length != 2) continue;
if (codes[0] == VmSelectProp.MAIN_ALIES)
{
var fieldCode = PropCodeToFieldCode(propCode);
if (!string.IsNullOrEmpty(fieldCode))
{
selProps.Add(new VmSelectProp { code = propCode, field = fieldCode });
}
continue;
}
var navProp = navProps.FirstOrDefault(a => a.code == codes[0]);
if (navProp?.naviModel != null)
{
var fieldCode = navProp.naviModel.PropCodeToFieldCode(codes[1]);
if (!string.IsNullOrEmpty(fieldCode))
{
selProps.Add(new VmSelectProp { code = codes[1], field = fieldCode, navCode = codes[0], propType = ePropType.Navigate, navType = navProp.navType });
}
}
}
return selProps;
}
/// <summary>
/// 获取联表配置信息
/// </summary>
/// <param name="selProps"></param>
/// <returns></returns>
public List<JoinInfoParameter> GetJoinInfos(List<VmSelectProp> selProps)
{
var navigates = selProps.Where(a => a.propType == ePropType.Navigate).Select(a => a.navCode).Distinct().ToList();
List<JoinInfoParameter> joins = new();
foreach (var navCode in navigates)
{
if (navCode == VmSelectProp.MAIN_ALIES) continue;
var navProp = navProps.First(a => a.code == navCode);
if (navProp.naviModel == null || navProp.navType != eNavigateType.OneToOne) continue;
JoinInfoParameter join = new JoinInfoParameter { TableName = navProp.naviModel.tableName, ShortName = navCode, Type = JoinType.Left };
var fkField = navProp.naviModel.PropCodeToFieldCode(navProp.fkField);
var refField = navProp.refField;
if (navProp.refCode != VmSelectProp.MAIN_ALIES)
{
var refProp = navProps.First(a => a.code == navProp.refCode);
refField = refProp.naviModel!.PropCodeToFieldCode(navProp.refField);
}
join.Models = ObjectFuncModel.Create("Equals", $"{navCode}.{fkField}", $"{navProp.refCode}.{refField}");
joins.Add(join);
}
return joins;
}
/// <summary>
/// 转换为查询过滤条件
/// </summary>
/// <param name="filter"></param>
/// <returns></returns>
public List<IConditionalModel> GetConditionalModels(DObject? filter)
{
List<IConditionalModel> wheres = new List<IConditionalModel>();
if (filter == null) return wheres;
foreach (var item in filter)
{
VmDbProp? prop = null;
// TODO 按子表条件查询
if (item.Key.Contains("."))
{
var codes = item.Key.Split('.');
if (codes.Length >= 2)
{
var navProp = navProps.FirstOrDefault(a => a.code == codes[0]);
if (navProp != null && navProp.naviModel != null)
{
var dbProp = navProp.naviModel.dbProps.FirstOrDefault(a => a.code == codes[1]);
if (dbProp != null)
{
prop = new VmDbProp();
prop.field = codes[0] + "." + dbProp.field;
prop.csType = dbProp.csType;
}
}
}
}
else
{
prop = dbProps.FirstOrDefault(a => a.code == item.Key);
}
if (prop == null) continue;
if (item.Value is JArray val)
{
var op = val[0].ToString();
switch (op)
{
case "><":
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[1].ToString(), ConditionalType = ConditionalType.GreaterThan, CSharpTypeName = prop.csType });
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[2].ToString(), ConditionalType = ConditionalType.LessThan, CSharpTypeName = prop.csType });
break;
case ">=<":
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[1].ToString(), ConditionalType = ConditionalType.GreaterThanOrEqual, CSharpTypeName = prop.csType });
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[2].ToString(), ConditionalType = ConditionalType.LessThan, CSharpTypeName = prop.csType });
break;
case "><=":
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[1].ToString(), ConditionalType = ConditionalType.GreaterThan, CSharpTypeName = prop.csType });
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[2].ToString(), ConditionalType = ConditionalType.LessThanOrEqual, CSharpTypeName = prop.csType });
break;
case ">=<=":
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[1].ToString(), ConditionalType = ConditionalType.GreaterThanOrEqual, CSharpTypeName = prop.csType });
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val[2].ToString(), ConditionalType = ConditionalType.LessThanOrEqual, CSharpTypeName = prop.csType });
break;
case "in":
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = val.Skip(1).ToString(), ConditionalType = ConditionalType.In, CSharpTypeName = prop.csType });
break;
default: op = string.Empty; break;
}
}
else
{
//if (item.Value == null) continue;
var conditionalType = ConditionalType.Equal;
string? value = item.Value?.ToString();
if (string.IsNullOrEmpty(value)) continue;
if (value.Length >= 2)
{
var op = value.Substring(0, 2);
switch (op)
{
case "%%": conditionalType = ConditionalType.Like; break;
case ">>": conditionalType = ConditionalType.GreaterThan; break;
case "<<": conditionalType = ConditionalType.LessThan; break;
case ">=": conditionalType = ConditionalType.GreaterThanOrEqual; break;
case "<=": conditionalType = ConditionalType.LessThanOrEqual; break;
case "==": conditionalType = ConditionalType.Equal; break;
default: op = string.Empty; break;
}
if (!string.IsNullOrEmpty(op))
{
value = value.RemovePreFix(op);
if (value.ToLower() == "null")
{
value = null;
}
}
}
wheres.Add(new ConditionalModel { FieldName = prop.field, FieldValue = value, ConditionalType = conditionalType, CSharpTypeName = prop.csType });
}
}
return wheres;
}
/// <summary>
/// 转换为查询字段列表
/// </summary>
/// <param name="selProps"></param>
/// <returns></returns>
public List<SelectModel> GetSelectModels(List<VmSelectProp> selProps)
{
return selProps.Where(a => a.navType != eNavigateType.OneToMany && a.navType != eNavigateType.ManyToMany).Select(a => new SelectModel
{
FiledName = a.navCode + "." + a.field,
AsName = (a.navCode == VmSelectProp.MAIN_ALIES ? "" : a.navCode + "_") + a.code
}).ToList();
return _mapProps.GetOrDefault(propCode);
}
/// <summary>