准备设计一个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. IIS添加映射配置

    这种问题主要出现在使用应用程序级别的地址重写.如果你将一个动态的地址重写成虚拟的其它扩展名或者不带扩展名的地址,通常在IIS5.1和II6.0中,访问这样一个实际不存在的地址,首先会被Web服务器返回 ...

  2. 【转载】HTTP 请求头与请求体

    原文地址: https://segmentfault.com/a/1190000006689767 HTTP Request HTTP 的请求报文分为三个部分 请求行.请求头和请求体,格式如图:一个典 ...

  3. 03--QT教程(转自:豆子)

    http://blog.51cto.com/zt/20

  4. centos安装指定mysql

    mysql下载地址:http://repo.mysql.com/ nginx下载地址 我下载是这个 http://nginx.org/packages/centos/7/noarch/RPMS/ngi ...

  5. 【转】IDEA 中tomcat图片储存和访问虚拟路径

    1.idea 修改Tomcat的虚拟路径(第一种方法)修改配置文件有很多种,但是一直不成功;后来想还是idea的配置原因,这里tomcat虚拟路径只说一种; 修改Tomcat安装路径下server.x ...

  6. 数组题汇总(python3)

    题目主要来自<剑指offer>和LeetCode,用python3来写的代码. 1.二维数组的查找: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列 ...

  7. PAT (Advanced Level) Practice(更新中)

    Source: PAT (Advanced Level) Practice Reference: [1]胡凡,曾磊.算法笔记[M].机械工业出版社.2016.7 Outline: 基础数据结构: 线性 ...

  8. Python编码格式导致的csv读取错误

    Python编码格式导致的csv读取错误(pandas.read_csv) 本文记录python小白我今天遇到的这两个问题(csv.reader和pandas.csv_read): pandas模块“ ...

  9. Problem 34

    Problem 34 https://projecteuler.net/problem=34 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 1 ...

  10. nginx的安装部署以及使用

    [介绍] nginx是现在互联上非常流行的高性能的 Web 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. 现在很多互联网应用都使用nginx来作为负载均衡的使用,再高并发 ...