完善模型通用接口的无限层级一对一和单层级一对多
This commit is contained in:
@@ -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>
|
||||
|
||||
Reference in New Issue
Block a user