You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
421 lines
12 KiB
Plaintext
421 lines
12 KiB
Plaintext
11 months ago
|
using System;
|
||
|
using System.Text;
|
||
|
using System.Collections;
|
||
|
using BP.DA;
|
||
|
|
||
|
namespace BP.En
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// 属性列表
|
||
|
/// </summary>
|
||
|
public class EntityTreeAttr
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// 树结构编号
|
||
|
/// </summary>
|
||
|
public const string No = "No";
|
||
|
/// <summary>
|
||
|
/// 名称
|
||
|
/// </summary>
|
||
|
public const string Name = "Name";
|
||
|
/// <summary>
|
||
|
/// 父节编号
|
||
|
/// </summary>
|
||
|
public const string ParentNo = "ParentNo";
|
||
|
/// <summary>
|
||
|
/// 顺序号
|
||
|
/// </summary>
|
||
|
public const string Idx = "Idx";
|
||
|
/// <summary>
|
||
|
/// 控制参数
|
||
|
/// </summary>
|
||
|
public const string CtrlWayPara = "CtrlWayPara";
|
||
|
/// <summary>
|
||
|
/// 图标
|
||
|
/// </summary>
|
||
|
public const string ICON = "ICON";
|
||
|
/// <summary>
|
||
|
/// 节点类型
|
||
|
/// </summary>
|
||
|
public const string MenuType = "MenuType";
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 树实体
|
||
|
/// </summary>
|
||
|
abstract public class EntityTree : Entity
|
||
|
{
|
||
|
#region 属性
|
||
|
public bool IsRoot
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
if (this.ParentNo == "-1" || this.ParentNo == "0")
|
||
|
return true;
|
||
|
|
||
|
if (this.ParentNo == this.No)
|
||
|
return true;
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 唯一标示
|
||
|
/// </summary>
|
||
|
public string No
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.GetValStringByKey(EntityTreeAttr.No);
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.SetValByKey(EntityTreeAttr.No, value);
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 名称
|
||
|
/// </summary>
|
||
|
public string Name
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.GetValStringByKey(EntityTreeAttr.Name);
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.SetValByKey(EntityTreeAttr.Name, value);
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 父节点编号
|
||
|
/// </summary>
|
||
|
public string ParentNo
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.GetValStringByKey(EntityTreeAttr.ParentNo);
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.SetValByKey(EntityTreeAttr.ParentNo, value);
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 图标
|
||
|
/// </summary>
|
||
|
public string ICON
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.GetValStringByKey(EntityTreeAttr.ICON);
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.SetValByKey(EntityTreeAttr.ICON, value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 顺序号
|
||
|
/// </summary>
|
||
|
public int Idx
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return this.GetValIntByKey(EntityTreeAttr.Idx);
|
||
|
}
|
||
|
set
|
||
|
{
|
||
|
this.SetValByKey(EntityTreeAttr.Idx, value);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endregion
|
||
|
|
||
|
#region 构造函数
|
||
|
/// <summary>
|
||
|
/// 主键
|
||
|
/// </summary>
|
||
|
public override string PK
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return EntityTreeAttr.No;
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 树结构编号
|
||
|
/// </summary>
|
||
|
public EntityTree()
|
||
|
{
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 树结构编号
|
||
|
/// </summary>
|
||
|
/// <param name="no">编号</param>
|
||
|
public EntityTree(string no)
|
||
|
{
|
||
|
if (DataType.IsNullOrEmpty(no))
|
||
|
throw new Exception(this.EnDesc + "@对表[" + this.EnDesc + "]进行查询前必须指定编号。");
|
||
|
|
||
|
this.No = no;
|
||
|
if (this.Retrieve() == 0)
|
||
|
throw new Exception("@没有" + this._enMap.PhysicsTable + ", No = " + this.No + "的记录。");
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region 业务逻辑处理
|
||
|
/// <summary>
|
||
|
/// 重新设置treeNo
|
||
|
/// </summary>
|
||
|
public void ResetTreeNo()
|
||
|
{
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 检查名称的问题.
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
protected override bool beforeInsert()
|
||
|
{
|
||
|
if (this.EnMap.IsAllowRepeatName == false)
|
||
|
{
|
||
|
if (this.PKCount == 1)
|
||
|
{
|
||
|
if (this.ExitsValueNum("Name", this.Name) >= 1)
|
||
|
throw new Exception("@插入失败[" + this.EnMap.EnDesc + "] 编号[" + this.No + "]名称[" + Name + "]重复.");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (DataType.IsNullOrEmpty(this.No))
|
||
|
this.No = this.GenerNewNoByKey("No");
|
||
|
|
||
|
return base.beforeInsert();
|
||
|
}
|
||
|
protected override bool beforeUpdate()
|
||
|
{
|
||
|
if (this.EnMap.IsAllowRepeatName == false)
|
||
|
{
|
||
|
if (this.PKCount == 1)
|
||
|
{
|
||
|
if (this.ExitsValueNum("Name", this.Name) >= 2)
|
||
|
throw new Exception("@更新失败[" + this.EnMap.EnDesc + "] 编号[" + this.No + "]名称[" + Name + "]重复.");
|
||
|
}
|
||
|
}
|
||
|
return base.beforeUpdate();
|
||
|
}
|
||
|
#endregion
|
||
|
|
||
|
#region 可让子类调用的方法
|
||
|
/// <summary>
|
||
|
/// 新建同级节点
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public EntityTree DoCreateSameLevelNode(string name = null)
|
||
|
{
|
||
|
|
||
|
EntityTree en = this.CreateInstance() as EntityTree;
|
||
|
if (this.ClassID.Contains("FlowSort") || this.ClassID.Contains("SysFormTree"))
|
||
|
en.No = DBAccess.GenerGUID();
|
||
|
else
|
||
|
en.No = DBAccess.GenerOID(this.ToString()).ToString(); // en.GenerNewNoByKey(EntityTreeAttr.No);
|
||
|
if (name == null)
|
||
|
en.Name = "新建节点" + en.No;
|
||
|
else
|
||
|
en.Name = name;
|
||
|
|
||
|
en.ParentNo = this.ParentNo;
|
||
|
en.Insert();
|
||
|
|
||
|
return en;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 新建子节点
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public EntityTree DoCreateSubNode(string name=null)
|
||
|
{
|
||
|
EntityTree en = this.CreateInstance() as EntityTree;
|
||
|
en.Copy(this);
|
||
|
if (this.ClassID.Contains("FlowSort") || this.ClassID.Contains("SysFormTree"))
|
||
|
en.No = DBAccess.GenerGUID(10, null, null);
|
||
|
else
|
||
|
en.No = DBAccess.GenerOID(this.ToString()).ToString();
|
||
|
if (name == null)
|
||
|
en.Name = "新建节点" + en.No;
|
||
|
else
|
||
|
en.Name = name;
|
||
|
|
||
|
en.ParentNo = this.No;
|
||
|
en.Insert();
|
||
|
|
||
|
return en;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 上移
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public string DoUp()
|
||
|
{
|
||
|
this.DoOrderUp(EntityTreeAttr.ParentNo, this.ParentNo, EntityTreeAttr.Idx);
|
||
|
return "执行成功.";
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 下移
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public string DoDown()
|
||
|
{
|
||
|
this.DoOrderDown(EntityTreeAttr.ParentNo, this.ParentNo, EntityTreeAttr.Idx);
|
||
|
return "执行成功.";
|
||
|
}
|
||
|
#endregion
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 树实体s
|
||
|
/// </summary>
|
||
|
abstract public class EntitiesTree : Entities
|
||
|
{
|
||
|
#region 转化为树结构的tree.
|
||
|
private StringBuilder appendMenus = null;
|
||
|
private StringBuilder appendMenuSb = null;
|
||
|
/// <summary>
|
||
|
/// 转化为json树
|
||
|
/// </summary>
|
||
|
/// <returns></returns>
|
||
|
public string ToJsonOfTree(string rootNo = "0")
|
||
|
{
|
||
|
appendMenus = new StringBuilder();
|
||
|
appendMenuSb = new StringBuilder();
|
||
|
EntityTree root = this.GetEntityByKey(EntityTreeAttr.ParentNo, rootNo) as EntityTree;
|
||
|
if (root == null)
|
||
|
return "err@没有找到rootNo=" + rootNo + "的entity.";
|
||
|
|
||
|
appendMenus.Append("[{");
|
||
|
appendMenus.Append("'id':'" + root.No + "',");
|
||
|
appendMenus.Append("'pid':'" + root.ParentNo + "',");
|
||
|
appendMenus.Append("'text':'" + root.Name + "'");
|
||
|
// appendMenus.Append(IsPermissionsNodes(ens, dms, root.No));
|
||
|
|
||
|
// 增加它的子级.
|
||
|
appendMenus.Append(",'children':");
|
||
|
AddChildren(root, this);
|
||
|
appendMenus.Append(appendMenuSb);
|
||
|
appendMenus.Append("}]");
|
||
|
|
||
|
return ReplaceIllgalChart(appendMenus.ToString());
|
||
|
}
|
||
|
public void AddChildren(EntityTree parentEn, EntitiesTree ens)
|
||
|
{
|
||
|
appendMenus.Append(appendMenuSb);
|
||
|
appendMenuSb.Clear();
|
||
|
|
||
|
appendMenuSb.Append("[");
|
||
|
foreach (EntityTree item in ens)
|
||
|
{
|
||
|
if (item.ParentNo != parentEn.No)
|
||
|
continue;
|
||
|
|
||
|
appendMenuSb.Append("{'id':'" + item.No + "','pid':'" + item.ParentNo + "','text':'" + item.Name + "'");
|
||
|
//appendMenuSb.Append(IsPermissionsNodes(ens, dms, item.No));
|
||
|
EntityTree treeNode = item as EntityTree;
|
||
|
// 增加它的子级.
|
||
|
appendMenuSb.Append(",'children':");
|
||
|
AddChildren(item, ens);
|
||
|
appendMenuSb.Append("},");
|
||
|
}
|
||
|
if (appendMenuSb.Length > 1)
|
||
|
appendMenuSb = appendMenuSb.Remove(appendMenuSb.Length - 1, 1);
|
||
|
appendMenuSb.Append("]");
|
||
|
appendMenus.Append(appendMenuSb);
|
||
|
appendMenuSb.Clear();
|
||
|
}
|
||
|
public string ReplaceIllgalChart(string s)
|
||
|
{
|
||
|
StringBuilder sb = new StringBuilder();
|
||
|
for (int i = 0, j = s.Length; i < j; i++)
|
||
|
{
|
||
|
|
||
|
char c = s[i];
|
||
|
switch (c)
|
||
|
{
|
||
|
case '\"':
|
||
|
sb.Append("\\\"");
|
||
|
break;
|
||
|
case '\\':
|
||
|
sb.Append("\\\\");
|
||
|
break;
|
||
|
case '/':
|
||
|
sb.Append("\\/");
|
||
|
break;
|
||
|
case '\b':
|
||
|
sb.Append("\\b");
|
||
|
break;
|
||
|
case '\f':
|
||
|
sb.Append("\\f");
|
||
|
break;
|
||
|
case '\n':
|
||
|
sb.Append("\\n");
|
||
|
break;
|
||
|
case '\r':
|
||
|
sb.Append("\\r");
|
||
|
break;
|
||
|
case '\t':
|
||
|
sb.Append("\\t");
|
||
|
break;
|
||
|
default:
|
||
|
sb.Append(c);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return sb.ToString();
|
||
|
}
|
||
|
#endregion 转化为树结构的tree.
|
||
|
|
||
|
#region 构造.
|
||
|
/// <summary>
|
||
|
/// 查询他的子节点
|
||
|
/// </summary>
|
||
|
/// <param name="en"></param>
|
||
|
/// <returns></returns>
|
||
|
public int RetrieveHisChinren(EntityTree en)
|
||
|
{
|
||
|
int i = this.Retrieve(EntityTreeAttr.ParentNo, en.No);
|
||
|
this.AddEntity(en);
|
||
|
return i + 1;
|
||
|
}
|
||
|
|
||
|
/// <summary>
|
||
|
/// 获取它的子节点
|
||
|
/// </summary>
|
||
|
/// <param name="en"></param>
|
||
|
/// <returns></returns>
|
||
|
public EntitiesTree GenerHisChinren(EntityTree en)
|
||
|
{
|
||
|
EntitiesTree ens = this.CreateInstance() as EntitiesTree;
|
||
|
foreach (EntityTree item in ens)
|
||
|
{
|
||
|
if (en.ParentNo == en.No)
|
||
|
ens.AddEntity(item);
|
||
|
}
|
||
|
return ens;
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 根据位置取得数据
|
||
|
/// </summary>
|
||
|
public new EntityTree this[int index]
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
return (EntityTree)this.InnerList[index];
|
||
|
}
|
||
|
}
|
||
|
/// <summary>
|
||
|
/// 构造
|
||
|
/// </summary>
|
||
|
public EntitiesTree()
|
||
|
{
|
||
|
}
|
||
|
#endregion 构造.
|
||
|
}
|
||
|
}
|