优化代码生成对枚举字段的支持

This commit is contained in:
智能大石头 2024-12-30 11:30:37 +08:00
parent 83e0f86ce8
commit 0044878857
10 changed files with 115 additions and 76 deletions

View File

@ -1658,11 +1658,11 @@ public class EntityBuilder : ClassBuilder
var methodName = columns.Select(e => e.Name).Join("And");
methodName = $"FindBy{methodName}";
var ps = GetParameters(columns);
var args = ps.Join(", ", e => $"{e.Value} {e.Key}");
var builder = new SearchBuilder(Table) { Nullable = Option.Nullable };
var ps = builder.GetParameters(columns);
// 如果方法名已存在,则不生成
var key = $"{methodName}({ps.Join(",", e => e.Value)})";
var key = $"{methodName}({ps.Join(",", e => e.TypeName)})";
if (Members.Contains(key)) return false;
Members.Add(key);
@ -1675,6 +1675,7 @@ public class EntityBuilder : ClassBuilder
var nullable = EntityOption.Nullable;
var args = ps.Join(", ", e => $"{e.TypeFullName} {e.Name}");
WriteLine("/// <returns>实体对象</returns>");
WriteLine("public static {2} {0}({1})", methodName, args, ClassName + (nullable ? "?" : ""));
WriteLine("{");
@ -1761,11 +1762,11 @@ public class EntityBuilder : ClassBuilder
var methodName = columns.Select(e => e.Name).Join("And");
methodName = $"FindAllBy{methodName}";
var ps = GetParameters(columns);
var args = ps.Join(", ", e => $"{e.Value} {e.Key}");
var builder = new SearchBuilder(Table) { Nullable = Option.Nullable };
var ps = builder.GetParameters(columns);
// 如果方法名已存在,则不生成
var key = $"{methodName}({ps.Join(",", e => e.Value)})";
var key = $"{methodName}({ps.Join(",", e => e.TypeName)})";
if (Members.Contains(key)) return false;
Members.Add(key);
@ -1776,6 +1777,7 @@ public class EntityBuilder : ClassBuilder
WriteLine("/// <param name=\"{0}\">{1}</param>", dc.CamelName(), dc.DisplayName);
}
var args = ps.Join(", ", e => $"{e.TypeFullName} {e.Name}");
WriteLine("/// <returns>实体列表</returns>");
WriteLine("public static IList<{2}> {0}({1})", methodName, args, ClassName);
WriteLine("{");
@ -1827,36 +1829,6 @@ public class EntityBuilder : ClassBuilder
return true;
}
private IDictionary<String, String> GetParameters(IList<IDataColumn> columns)
{
var ps = new Dictionary<String, String>();
var ps2 = new Dictionary<String, String>();
foreach (var dc in columns)
{
var type = dc.Properties["Type"];
if (type.IsNullOrEmpty()) type = dc.DataType?.Name + "";
if (dc.DataType == typeof(Boolean))
type += "?";
else if (dc.DataType == typeof(String))
{
if (Option.Nullable && dc.Nullable)
{
type += "?";
}
}
ps[dc.CamelName()] = type;
var p = type.LastIndexOf('.');
if (p > 0) type = type[(p + 1)..];
ps2[dc.CamelName()] = type;
}
//return (ps, ps2);
return ps2;
}
/// <summary>自定义查询区域</summary>
protected virtual void BuildSearch()
{
@ -1941,10 +1913,10 @@ public class EntityBuilder : ClassBuilder
var returnName = ClassName;
var ps = builder.GetParameters(cs, true, true, true);
var ps = builder.GetParameters(cs, true);
// 如果方法名已存在,则不生成
var key = $"Search({ps.Join(",", e => e.Value)})";
var key = $"Search({ps.Join(",", e => e.TypeName)})";
if (Members.Contains(key)) return cs;
Members.Add(key);
@ -1966,7 +1938,7 @@ public class EntityBuilder : ClassBuilder
WriteLine("/// <returns>实体列表</returns>");
// 参数部分
var pis = ps.Join(", ", e => $"{e.Value} {e.Key}");
var pis = ps.Join(", ", e => $"{e.TypeFullName} {e.Name}");
WriteLine("public static IList<{0}> Search({1})", returnName, pis);
WriteLine("{");
{
@ -1976,7 +1948,7 @@ public class EntityBuilder : ClassBuilder
WriteLine();
foreach (var dc in cs)
{
if (dc.DataType.IsInt() && dc.DataType.IsEnum)
if (dc.DataType.IsInt() && (dc.DataType.IsEnum || !dc.Properties["Type"].IsNullOrEmpty()))
WriteLine("if ({0} > 0) exp &= _.{1} == {0};", dc.CamelName(), dc.Name);
else if (dc.DataType.IsInt())
WriteLine("if ({0} >= 0) exp &= _.{1} == {0};", dc.CamelName(), dc.Name);

View File

@ -0,0 +1,14 @@
namespace XCode.Code;
/// <summary>参数模型</summary>
public class ParameterModel
{
/// <summary>参数名</summary>
public String Name { get; set; } = null!;
/// <summary>类型名。简称</summary>
public String TypeName { get; set; } = null!;
/// <summary>类型全名。含命名空间</summary>
public String TypeFullName { get; set; } = null!;
}

View File

@ -50,12 +50,18 @@ public class SearchBuilder(IDataTable table)
// 数据时间字段可用于搜索
if (!dc.DataScale.IsNullOrEmpty())
cs.Add(dc);
// 整型枚举
if (dc.DataType.IsInt() && dc.DataType.IsEnum)
cs.Add(dc);
// 整型有映射
else if (dc.DataType.IsInt() && !dc.Map.IsNullOrEmpty())
cs.Add(dc);
// 整型
else if (dc.DataType.IsInt())
{
// 整型枚举
if (dc.DataType.IsEnum)
cs.Add(dc);
else if (!dc.Properties["Type"].IsNullOrEmpty())
cs.Add(dc);
// 整型有映射
else if (!dc.Map.IsNullOrEmpty())
cs.Add(dc);
}
// 布尔型
else if (dc.DataType == typeof(Boolean) && !dc.Name.EqualIgnoreCase("enable", "isDeleted"))
cs.Add(dc);
@ -87,15 +93,55 @@ public class SearchBuilder(IDataTable table)
return cs;
}
/// <summary>获取参数列表。名称+类型</summary>
///// <summary>获取参数列表。名称+类型</summary>
///// <param name="columns"></param>
///// <param name="includeTime"></param>
///// <param name="includeKey"></param>
///// <param name="includePage"></param>
///// <returns></returns>
//public IDictionary<String, String> GetParameters(IList<IDataColumn> columns, Boolean includeTime = false, Boolean includeKey = false, Boolean includePage = false)
//{
// var ps = new Dictionary<String, String>();
// foreach (var dc in columns)
// {
// var type = dc.Properties["Type"];
// if (type.IsNullOrEmpty()) type = dc.DataType?.Name + "";
// if (dc.DataType == typeof(Boolean))
// type += "?";
// else if (dc.DataType == typeof(String))
// {
// if (Nullable && dc.Nullable)
// {
// type += "?";
// }
// }
// //var p = type.LastIndexOf('.');
// //if (p > 0) type = type[(p + 1)..];
// ps[dc.CamelName()] = type;
// }
// if (includeTime && DataTime != null)
// {
// ps["start"] = "DateTime";
// ps["end"] = "DateTime";
// }
// if (includeKey)
// ps["key"] = "String";
// if (includePage)
// ps["page"] = "PageParameter";
// return ps;
//}
/// <summary>获取参数列表。名称+类型(全名+简名)</summary>
/// <param name="columns"></param>
/// <param name="includeTime"></param>
/// <param name="includeKey"></param>
/// <param name="includePage"></param>
/// <param name="extend"></param>
/// <returns></returns>
public IDictionary<String, String> GetParameters(IList<IDataColumn> columns, Boolean includeTime = false, Boolean includeKey = false, Boolean includePage = false)
public IList<ParameterModel> GetParameters(IList<IDataColumn> columns, Boolean extend = false)
{
var ps = new Dictionary<String, String>();
var ps = new List<ParameterModel>();
foreach (var dc in columns)
{
var type = dc.Properties["Type"];
@ -103,28 +149,27 @@ public class SearchBuilder(IDataTable table)
if (dc.DataType == typeof(Boolean))
type += "?";
else if (dc.DataType == typeof(String))
{
if (Nullable && dc.Nullable)
{
type += "?";
}
}
else if (dc.DataType == typeof(String) && Nullable && dc.Nullable)
type += "?";
var model = new ParameterModel { Name = dc.CamelName(), TypeName = type, TypeFullName = type };
var p = type.LastIndexOf('.');
if (p > 0) type = type[(p + 1)..];
ps[dc.CamelName()] = type;
if (p > 0) model.TypeName = type[(p + 1)..];
ps.Add(model);
}
if (includeTime && DataTime != null)
if (extend)
{
ps["start"] = "DateTime";
ps["end"] = "DateTime";
if (DataTime != null)
{
ps.Add(new ParameterModel { Name = "start", TypeName = "DateTime", TypeFullName = "DateTime" });
ps.Add(new ParameterModel { Name = "end", TypeName = "DateTime", TypeFullName = "DateTime" });
}
ps.Add(new ParameterModel { Name = "key", TypeName = "String", TypeFullName = "String" });
ps.Add(new ParameterModel { Name = "page", TypeName = "PageParameter", TypeFullName = "PageParameter" });
}
if (includeKey)
ps["key"] = "String";
if (includePage)
ps["page"] = "PageParameter";
return ps;
}

Binary file not shown.

View File

@ -339,8 +339,6 @@ public class CubeBuilder : ClassBuilder
var cs = builder.GetColumns();
if (cs.Count <= 0) return null;
var ps = builder.GetParameters(cs, true, true, true);
var sb = Pool.StringBuilder.Get();
var pis = new List<String>();
@ -351,7 +349,9 @@ public class CubeBuilder : ClassBuilder
if (dc.DataType.IsInt())
{
if (dc.DataType.IsEnum)
sb.AppendLine($" var {name} = ({dc.DataType.Name})p[\"{name}\"].ToInt();");
sb.AppendLine($" var {name} = ({dc.DataType.FullName})p[\"{name}\"].ToInt();");
else if (!dc.Properties["Type"].IsNullOrEmpty())
sb.AppendLine($" var {name} = ({dc.Properties["Type"]})p[\"{name}\"].ToInt();");
else if (dc.DataType == typeof(Int64))
sb.AppendLine($" var {name} = p[\"{name}\"].ToLong(-1);");
else

View File

@ -57,11 +57,12 @@ public class Parameter : EntityController<Parameter>
var userId = p["userId"].ToInt(-1);
var category = p["category"];
var name = p["name"];
var kind = (XCode.Membership.ParameterKinds)p["kind"].ToInt();
var enable = p["enable"]?.ToBoolean();
var start = p["dtStart"].ToDateTime();
var end = p["dtEnd"].ToDateTime();
return Parameter.Search(userId, category, name, enable, start, end, p["Q"], p);
return Parameter.Search(userId, category, name, kind, enable, start, end, p["Q"], p);
}
}

View File

@ -60,6 +60,7 @@ public class User : EntityController<User>
var code = p["code"];
var roleId = p["roleId"].ToInt(-1);
var departmentId = p["departmentId"].ToInt(-1);
var sex = (XCode.Membership.SexKinds)p["sex"].ToInt();
var mailVerified = p["mailVerified"]?.ToBoolean();
var mobileVerified = p["mobileVerified"]?.ToBoolean();
var areaId = p["areaId"].ToInt(-1);
@ -69,6 +70,6 @@ public class User : EntityController<User>
var start = p["dtStart"].ToDateTime();
var end = p["dtEnd"].ToDateTime();
return User.Search(name, mail, mobile, code, roleId, departmentId, mailVerified, mobileVerified, areaId, online, enable, start, end, p["Q"], p);
return User.Search(name, mail, mobile, code, roleId, departmentId, sex, mailVerified, mobileVerified, areaId, online, enable, start, end, p["Q"], p);
}
}

View File

@ -130,19 +130,21 @@ public partial class Parameter : Entity<Parameter>
/// <param name="userId">用户。按用户区分参数用户0表示系统级</param>
/// <param name="category">类别</param>
/// <param name="name">名称</param>
/// <param name="kind">种类。0普通21列表22名值</param>
/// <param name="enable">启用</param>
/// <param name="start">更新时间开始</param>
/// <param name="end">更新时间结束</param>
/// <param name="key">关键字</param>
/// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
/// <returns>实体列表</returns>
public static IList<Parameter> Search(Int32 userId, String? category, String? name, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
public static IList<Parameter> Search(Int32 userId, String? category, String? name, XCode.Membership.ParameterKinds kind, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
if (userId >= 0) exp &= _.UserID == userId;
if (!category.IsNullOrEmpty()) exp &= _.Category == category;
if (!name.IsNullOrEmpty()) exp &= _.Name == name;
if (kind > 0) exp &= _.Kind == kind;
if (enable != null) exp &= _.Enable == enable;
exp &= _.UpdateTime.Between(start, end);
if (!key.IsNullOrEmpty()) exp &= SearchWhereByKeys(key);

View File

@ -161,6 +161,7 @@ public partial class User : Entity<User>
/// <param name="mobile">手机</param>
/// <param name="code">代码。身份证、员工编号等</param>
/// <param name="roleId">角色。主要角色</param>
/// <param name="sex">性别。未知、男、女</param>
/// <param name="areaId">地区。省市区</param>
/// <param name="online">在线</param>
/// <param name="enable">启用</param>
@ -169,7 +170,7 @@ public partial class User : Entity<User>
/// <param name="key">关键字</param>
/// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
/// <returns>实体列表</returns>
public static IList<User> Search(String name, String? mail, String? mobile, String? code, Int32 roleId, Int32 areaId, Boolean? online, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
public static IList<User> Search(String name, String? mail, String? mobile, String? code, Int32 roleId, XCode.Membership.SexKinds sex, Int32 areaId, Boolean? online, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
@ -178,6 +179,7 @@ public partial class User : Entity<User>
if (!mobile.IsNullOrEmpty()) exp &= _.Mobile == mobile;
if (!code.IsNullOrEmpty()) exp &= _.Code == code;
if (roleId >= 0) exp &= _.RoleID == roleId;
if (sex > 0) exp &= _.Sex == sex;
if (areaId >= 0) exp &= _.AreaId == areaId;
if (online != null) exp &= _.Online == online;
if (enable != null) exp &= _.Enable == enable;

View File

@ -157,6 +157,7 @@ public partial class User : Entity<User>
/// <param name="code">代码。身份证、员工编码等,支持登录</param>
/// <param name="roleId">角色。主要角色</param>
/// <param name="departmentId">部门。组织机构</param>
/// <param name="sex">性别。未知、男、女</param>
/// <param name="mailVerified">邮箱验证。邮箱是否已通过验证</param>
/// <param name="mobileVerified">手机验证。手机是否已通过验证</param>
/// <param name="areaId">地区。省市区</param>
@ -167,7 +168,7 @@ public partial class User : Entity<User>
/// <param name="key">关键字</param>
/// <param name="page">分页参数信息。可携带统计和数据权限扩展查询等信息</param>
/// <returns>实体列表</returns>
public static IList<User> Search(String name, String? mail, String? mobile, String? code, Int32 roleId, Int32 departmentId, Boolean? mailVerified, Boolean? mobileVerified, Int32 areaId, Boolean? online, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
public static IList<User> Search(String name, String? mail, String? mobile, String? code, Int32 roleId, Int32 departmentId, XCode.Membership.SexKinds sex, Boolean? mailVerified, Boolean? mobileVerified, Int32 areaId, Boolean? online, Boolean? enable, DateTime start, DateTime end, String key, PageParameter page)
{
var exp = new WhereExpression();
@ -177,6 +178,7 @@ public partial class User : Entity<User>
if (!code.IsNullOrEmpty()) exp &= _.Code == code;
if (roleId >= 0) exp &= _.RoleID == roleId;
if (departmentId >= 0) exp &= _.DepartmentID == departmentId;
if (sex > 0) exp &= _.Sex == sex;
if (mailVerified != null) exp &= _.MailVerified == mailVerified;
if (mobileVerified != null) exp &= _.MobileVerified == mobileVerified;
if (areaId >= 0) exp &= _.AreaId == areaId;