准备设计一个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. 【sqli-labs】 less50 GET -Error based -Order By Clause -numeric -Stacked injection(GET型基于错误的整型Order By从句堆叠注入)

    报错没有关闭,直接可以用UpdateXml函数 http://192.168.136.128/sqli-labs-master/Less-50/?sort=1 and UpdateXml(1,conc ...

  2. 转录组入门(3):了解fastq测序数据

    sra文件转换为fastq格式 fastq-dump -h --split-3 也就是说如果SRA文件中只有一个文件,那么这个参数就会被忽略.如果原文件中有两个文件,那么它就会把成对的文件按*_1.f ...

  3. 用jquery-easyui的布局layout写后台管理页面

    先在官网下载easyui文档 引入头部文件 <link rel="stylesheet" type="text/css" href="${pag ...

  4. Day 11 文件和异常

    文件和异常 在实际开发中,常常需要对程序中的数据进行持久化操作,而实现数据持久化最直接简单的方式就是将数据保存到文件中.说到“文件”这个词,可能需要先科普一下关于文件系统的知识,对于这个概念,维基百科 ...

  5. Asp.NET误人子弟教程:在MVC里面结合JQ实现AJAX

    public class Person { public string Name { get; set; } public string City { get; set; } public strin ...

  6. Python基础-while

    使用while循环实现输出2-3+4-5+6.....+100的和. i = 2 sum=0 while i<=100: if i % 2 == 0: sum += i else: sum -= ...

  7. 腾讯云,搭建Docker环境

    安装与配置 Docker 任务时间:10min ~ 20min 安装 Docker Docker 软件包已经包括在默认的 CentOS-Extras 软件源里.因此想要安装 docker,只需要运行下 ...

  8. 前端开发神器之chrome 综述

    作为前端工程师,也许你对chrome开发工具不陌生,但也谈不上对各个模块有深入了解. 本文主要是为chrome开发工具使用这个系列做个开篇. 参考资料: 谷歌开发者: https://develope ...

  9. 集群管理软件clustershell

    一.简介 1.安装方便.一条指令就能轻松安装. 2.配置方便.很多集群管理软件都需要在所有的服务器上都安装软件,而且还要进行很多的连接操作,clustershell就相当的方便了,仅仅需要所有机器能够 ...

  10. class类加载机制

    1.类的加载过程 a.加载-链接-初始化-使用-卸载 加载: 查找并加载类的二进制数据 链接: 验证类的正确性,为类的静态变量分配内存,并将其初始化为默认值,把类的符号引用转换为直接引用. 初始化: ...