准备设计一个PCB使用的决策引擎,需要用到决策表,而单维决策表不能满足业务要求,
这里主要是为了实现:用户编辑的是决策表,实际底层存储的是树结构,树的的各个节点挂上业务决策逻辑.
这里将多维决策表转决策树构思整理如下:
一.决策表(多维表头结构UI编辑界面)
用户可编辑的规则界面,规则决策表交由用户配制,可实现任意多表头结构的决策表。
二.决策树(TreeNode 简易界面)
TreeNode 是从决策表中转换过来的,可以实现节点决策控制,后续转换TreeNodeVIew用户可以附加属性编辑
左表头 上表头
三.DB数据库存储结构
多表头结构:
交叉行列号存储值表:
四.决策表转决策树 C#程序实现代码:
/// <summary> /// 采用TreeNode做为树根结点做为起始点递归实现 /// </summary> /// <param name="TreeNode_"></param> private void ExcelHeadToTreeNodes(TreeNode TreeNode_) { T_RuleTableRowColumnMultiExpression ModTableCell_ = (T_RuleTableRowColumnMultiExpression)TreeNode_.Tag; if (ModTableCell_ == null) return; int StartColumnIndex = 0; int EndColumnIndex = 0; int ColumnCount = 0; int StartRowIndex = 0; if (ModTableCell_.DimensionNum == 1) //维度1 列 { ColumnCount = ModTableCell_.EndColumnIndex - ModTableCell_.StartColumnIndex + 1; if (ColumnCount == 1) return; StartColumnIndex = ModTableCell_.StartColumnIndex; EndColumnIndex = ModTableCell_.EndColumnIndex; StartRowIndex = ModTableCell_.StartRowIndex + 1; } else if (ModTableCell_.DimensionNum == 2)//维度1 行 { ColumnCount = ModTableCell_.EndRowIndex - ModTableCell_.StartRowIndex + 1; if (ColumnCount == 1) return; StartColumnIndex = ModTableCell_.StartRowIndex; EndColumnIndex = ModTableCell_.EndRowIndex; StartRowIndex = ModTableCell_.StartColumnIndex + 1; } else { return; } int LayerIndexCurrent = ModTableCell_.LayerIndex + 1; int i = 1; //层次 while (StartColumnIndex <= EndColumnIndex) { Excel.Range cell; int StartRowIndex_ = 0, StartColumnIndex_ = 0, EndRowIndex_ = 0, EndColumnIndex_ = 0, ColumnCount_ = 0; string CellStringID_ = "", CellVal_ = ""; if (ModTableCell_.DimensionNum == 1) //维度1 列头 { cell = ((Excel.Range)_WorkSheet.Cells[StartRowIndex, StartColumnIndex]); var CellMergeArea = cell.MergeArea; var CellRowsCount = CellMergeArea.Rows.Count; var CellColumnsCount = CellMergeArea.Columns.Count; CellVal_ = cell.Text.ToString(); StartRowIndex_ = ModTableCell_.EndRowIndex + 1; StartColumnIndex_ = StartColumnIndex; EndRowIndex_ = StartRowIndex_ + (CellRowsCount - 1); EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - 1); ColumnCount_ = CellColumnsCount; CellStringID_ = Convert.ToChar(StartColumnIndex_ + 64).ToString() + ((StartColumnIndex_ == EndColumnIndex_) ? "" : "_" + Convert.ToChar(EndColumnIndex_ + 64).ToString()); } else if (ModTableCell_.DimensionNum == 2) //维度2 行头 { cell = ((Excel.Range)_WorkSheet.Cells[StartColumnIndex, StartRowIndex]); var CellMergeArea = cell.MergeArea; var CellRowsCount = CellMergeArea.Rows.Count; var CellColumnsCount = CellMergeArea.Columns.Count; CellVal_ = cell.Text.ToString(); StartRowIndex_ = StartColumnIndex; StartColumnIndex_ = ModTableCell_.EndColumnIndex + 1; EndRowIndex_ = StartRowIndex_ + (CellRowsCount - 1); EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - 1); ColumnCount_ = CellRowsCount; CellStringID_ = StartRowIndex_.ToString() + ((StartRowIndex_ == EndRowIndex_) ? "" : "_" + EndRowIndex_.ToString()); } T_RuleTableRowColumnMultiExpression ModTableCell_new = new T_RuleTableRowColumnMultiExpression(); ModTableCell_new.LayerIndex = LayerIndexCurrent; ModTableCell_new.StartRowIndex = StartRowIndex_; ModTableCell_new.StartColumnIndex = StartColumnIndex_; ModTableCell_new.EndRowIndex = EndRowIndex_; ModTableCell_new.EndColumnIndex = EndColumnIndex_; ModTableCell_new.LayerOrder = i; ModTableCell_new.CellStringID = CellStringID_; ModTableCell_new.ParentCellStringID = ModTableCell_.CellStringID; ModTableCell_new.DimensionNum = ModTableCell_.DimensionNum; ModTableCell_new.TableNo = ModTableCell_.TableNo; ModTableCell_new.Text = CellVal_; ModTableCell_new.Value = CellVal_; ModTableCell_new.Remark = CellVal_; ModTableCell_new.Expression = CellVal_; ModTableCell_new.DisplayName = CellVal_ + "________" + ModTableCell_new.CellStringID; ModTableCell_new.AllOrder = ModTableCell_.AllOrder + 1; TreeNode TreeNodeNew_ = new TreeNode(ModTableCell_new.DisplayName); TreeNodeNew_.Tag = ModTableCell_new; TreeNode_.Nodes.Add(TreeNodeNew_); ExcelHeadToTreeNodes(TreeNodeNew_); StartColumnIndex = StartColumnIndex + (ColumnCount_ - 1) + 1; i++; } }
/// <summary> /// 多维二维表结构 /// </summary> public class T_RuleTableRowColumnMultiExpression { /// <summary> /// 规则表名ID /// </summary> public int TableNo { get; set; } /// <summary> /// 维度 /// </summary> public int DimensionNum { get; set; } /// <summary> /// 层次深度 /// </summary> public int LayerIndex { get; set; } /// <summary> /// 层次排序号 /// </summary> public int LayerOrder { get; set; } /// <summary> /// 节点单元格值ID /// </summary> public string CellStringID { get; set; } /// <summary> /// 父节点单元格值ID /// </summary> public string ParentCellStringID { get; set; } /// <summary> /// 节点:显示名 /// </summary> public string DisplayName { get; set; } /// <summary> /// 节点:表达式 /// </summary> public string Expression { get; set; } /// <summary> /// 节点:文本内容 /// </summary> public string Text { get; set; } /// <summary> /// 节点:值 /// </summary> public string Value { get; set; } /// <summary> /// 节点:备注 /// </summary> public string Remark { get; set; } /// <summary> /// 开始行号 /// </summary> public int StartRowIndex { get; set; } /// <summary> /// 开始列号 /// </summary> public int StartColumnIndex { get; set; } /// <summary> /// 终止行号 /// </summary> public int EndRowIndex { get; set; } /// <summary> /// 终止列号 /// </summary> public int EndColumnIndex { get; set; } /// <summary> /// 总排序 /// </summary> public int AllOrder { get; set; } }