准备设计一个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 = ;
int EndColumnIndex = ;
int ColumnCount = ;
int StartRowIndex = ;
if (ModTableCell_.DimensionNum == ) //维度1 列
{
ColumnCount = ModTableCell_.EndColumnIndex - ModTableCell_.StartColumnIndex + ;
if (ColumnCount == ) return;
StartColumnIndex = ModTableCell_.StartColumnIndex;
EndColumnIndex = ModTableCell_.EndColumnIndex;
StartRowIndex = ModTableCell_.StartRowIndex + ;
}
else if (ModTableCell_.DimensionNum == )//维度1 行
{
ColumnCount = ModTableCell_.EndRowIndex - ModTableCell_.StartRowIndex + ;
if (ColumnCount == ) return;
StartColumnIndex = ModTableCell_.StartRowIndex;
EndColumnIndex = ModTableCell_.EndRowIndex;
StartRowIndex = ModTableCell_.StartColumnIndex + ;
}
else
{
return;
}
int LayerIndexCurrent = ModTableCell_.LayerIndex + ;
int i = ; //层次
while (StartColumnIndex <= EndColumnIndex)
{
Excel.Range cell;
int StartRowIndex_ = , StartColumnIndex_ = , EndRowIndex_ = , EndColumnIndex_ = , ColumnCount_ = ;
string CellStringID_ = "", CellVal_ = "";
if (ModTableCell_.DimensionNum == ) //维度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 + ;
StartColumnIndex_ = StartColumnIndex;
EndRowIndex_ = StartRowIndex_ + (CellRowsCount - );
EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - );
ColumnCount_ = CellColumnsCount;
CellStringID_ = Convert.ToChar(StartColumnIndex_ + ).ToString() + ((StartColumnIndex_ == EndColumnIndex_) ? "" : "_" + Convert.ToChar(EndColumnIndex_ + ).ToString()); }
else if (ModTableCell_.DimensionNum == ) //维度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 + ;
EndRowIndex_ = StartRowIndex_ + (CellRowsCount - );
EndColumnIndex_ = StartColumnIndex_ + (CellColumnsCount - );
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 + ;
TreeNode TreeNodeNew_ = new TreeNode(ModTableCell_new.DisplayName);
TreeNodeNew_.Tag = ModTableCell_new;
TreeNode_.Nodes.Add(TreeNodeNew_); ExcelHeadToTreeNodes(TreeNodeNew_); StartColumnIndex = StartColumnIndex + (ColumnCount_ - ) + ; 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; }
}

PCB决策引擎:多维决策表转决策树的更多相关文章

  1. PCB 围绕CAM自动化,打造PCB规则引擎

    AutoCAM自动化平台,前端管理订单,而后端执行任务,前端UIl界面有板厚,铜厚,板材,表面处理,层数等信息,而这些信息并不是后端最终所需要的信息后.拿钻孔补偿来说,后端需要的是钻孔补偿值,但前端并 ...

  2. PCB 规则引擎之脚本语言JavaScript应用评测

    世界上没有好做的软件,觉得好做,只是你的系统简单而已,而不是哪个行业简单,特别像我们PCB制造企业务逻辑的很复杂的,仅仅靠决策树中的每个节点布置决策逻辑是不能满足要求的,所以我们在制作PCB规则引擎必 ...

  3. PCB 规则引擎之JSON对象查看器

    在PCB规则引擎开发中,JavaScript V8引擎是处理业务逻辑的, 当然业务逻辑需要数据支撑才行,  即需有将数据推进入到V8引擎.目前这边数据传输到JavaScript V8引擎以C# Mod ...

  4. StartDT AI Lab | 视觉智能引擎+数据决策引擎——打造商业“智能沙盘”

    众所周知,线上商家可以通过淘宝平台的大量前端“埋点”轻松获取商品的加购率.收藏率.转化率.成交额等大量基础信息,甚至商家能够在更精细的层面,获取商品关键字变化或者上新/爆款带来的流量变化数据,更甚者商 ...

  5. 通俗地说决策树算法(三)sklearn决策树实战

    前情提要 通俗地说决策树算法(一)基础概念介绍 通俗地说决策树算法(二)实例解析 上面两篇介绍了那么多决策树的知识,现在也是时候来实践一下了.Python有一个著名的机器学习框架,叫sklearn.我 ...

  6. PCB 规则引擎之编辑器(语法着色,错误提示,代码格式化)

    对于一个规则引擎中的脚本代码编辑器是非常关键的,因为UI控件直接使用对象是规则维护者,关系到用户体验,在选用脚本编辑器的功能时除了满足代码的编辑的基本编辑要求外,功能还需要包含;语法着色,错误提示,代 ...

  7. PCB Genesis加二维码 实现方式

    使用incam可以很轻松的增加2维码,这里通过另外一种方式玩转二维码的加法, 使用谷歌zxing.dll类库实现,将文字信息转为bitmap点阵后,在Genesis绘制点即可. 一.incam增加二维 ...

  8. .Net规则引擎Biztalk,Workflow和CKRule的比较

    微软的规则引擎   很多朋友会问,.Net平台有没有规则引擎?像Java就有很多的规则引擎,Drools,ILog都做得非常好,但.Net好像还没有哦.很多知道规则引擎,但不知道.Net的朋友都烦这个 ...

  9. 决策树(decision tree)

    决策树是一种常见的机器学习模型.形象地说,决策树对应着我们直观上做决策的过程:经由一系列判断,得到最终决策.由此,我们引出决策树模型. 一.决策树的基本流程 决策树的跟节点包含全部样例,叶节点则对应决 ...

随机推荐

  1. strcmp 与 _tcscmp

    strcmp 用来比较ANSI字符串,而_tcscmp用来比较UNICODE(宽字符)的字符串.ANSI字符串中,1个英文字母为1个字节,1个中文字符为2个字节,遇到0字符表示字符串结束.而在UNIC ...

  2. resize监听div的size变化

    具体实现分两类, ie9-10 默认支持div的resize事件,可以直接通过div.attachEvent('onresize', handler);的方式实现 其它浏览器 通过在div中添加一个内 ...

  3. redis在linux下安装以及扩展

    安装过redis后发现回头忘了,今天重新安装记录下 首先 我是在home下创建redis文件   mkdir  redis 然后直接用wget安装 wget http://download.redis ...

  4. Python3:numpy模块中的argsort()函数

    Python3:numpy模块中的argsort()函数   argsort函数是Numpy模块中的函数: >>> import numpy >>> help(nu ...

  5. 【js】数组置空的其他方式及使用场景

    数组在js中属于引用型类型. var arr = [1, 2, 3]; a = []; 通常使用以上方式.如果使用场景必须使用方法置空, 可以采用arr.length = 0; 或者使用a.splic ...

  6. POJ-2135-Farm Tour(最大费用最小流)模板

    Farm Tour POJ - 2135 When FJ's friends visit him on the farm, he likes to show them around. His farm ...

  7. Java 下实现Cache

    最近在做Spring的项目,想做一个缓存,访问数据库,定期来做数据更新 要实现两个功能 可以通过http请求来立刻刷新缓存 缓存可以通过自己配置的时间间隔来定期刷新 通过Controller来做 因为 ...

  8. Maven学习总结(9)——使用Nexus搭建Maven私服

    1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...

  9. UVa - 12664 - Interesting Calculator

    先上题目: 12664 Interesting CalculatorThere is an interesting calculator. It has 3 rows of button.• Row ...

  10. RDS for MySQL Mysqldump 常见问题和处理

    https://help.aliyun.com/knowledge_detail/41732.html?spm=5176.7841698.2.13.u67H3h