首页 > 学院 > 开发设计 > 正文

使用CKRule实现PVC配方计算

2019-11-17 03:12:13
字体:
来源:转载
供稿:网友
使用CKRule实现PVC配方计算

1,PVC计算的基本原理

配方员设计好配方,再进行抽象提炼,会出现相对于软件而言可以理解的逻辑,如属性的概念,对厂企生成的PVC产品而言,一般都有产品大类名称,花纹,颜色,长度,宽度,厚度等概念,这对于软件而言,就是一个对象,该对象是描述订单的对象。而配方计算出来的结果,如原料名称,质量比分量,重量等信息就是物料清单对象。

配方计算的过程就是这样的一个过程。

设计图

结构化标准配方,就是教科书上面的知识,如

PVC

100

DINP

40

Caco3

10

HSt

1

Sb2O3

4

这此是基础数据,生产某产品,并且油份在一定的区间就要调用这个配方。

而半结构化表格配方规则,一般是厂企特有的内容,设置时可以自定义一个属性进行归纳总结,如使用特征码来表达增加某些原料,如增加透明度时,执行这个表格:

特征码

增透明剂编码

份量

B1

TM-001

1

B2

TM-002

0.5

B3

TM-003

1.5

表示,如果当前的配方对象的特征为B2时,就要在物料集合中增加透明剂TM-002,份量为1。而特征码和增透明剂的编码都是厂企按一定的规则进行编写的。

非结构化表达式是指,某些配方确实不好表达时使用,如产品名第2个字符为X,则增加DINP份量2。也就是针对表达内容非常随便的自然语言的处理。

2,PVC计算三大问题

PVC计算过程中遇到了结构化标准配方、半结构化表格规范及非结构化表达式规则三个类型的问题。下面使用最简单的例子表达

结构化标准配方

PVC

100

DINP

40

Caco3

10

HSt

1

Sb2O3

4

半结构化表格配方范

特征码

增透明剂编码

份量

B1

TM-001

1

B2

TM-002

0.5

B3

TM-003

1.5

非结构化表达式规则

产品名第2个字符为X,则增加DINP份量2。

3,CKRule界面设置

物料清单会被抽象出来成为一个对象。该对象有名称,份量,重量等内容

对象定义

在传入传出对象上,则定义了配方计算对象主要的属性,如产品名,订单号,特性,颜色,油份,花纹,长度,宽度,厚度,密度,重量等等。

传入传出

半结构化表格规范,使用了CKRule中的决策表逻辑,目前只增加了一个增透剂使用规范,规范中标明,如果一定的特征码就要增加增透剂一定数据。

决策表设置

在处理非结构化规则时,使用了CKRule的客户规则池功能,定义了多个关键字,并针对规则编写过程中的实际情况增加了两个方法,取第N个字符和增加份量。

客户规则池

客户规则池相关代码

取第N个字符

var_result = "";

if(!string.IsNullOrEmpty(字符串)){

if(字符串.Length>索引&&索引> -1){

_result = 字符串.Substring(索引,1);

}

}

return_result;

增加份量

AddRow(物料集合,x=>{

x.名称 = 物料名称;

x.份量 = 份量;

});

客户规则池方法定义

最后就是在总规则中初始化结构化,半结构化,非结构化数据。并执行决策表和规则池。

主规则

主规则相关代码

初始化结构化标准数据

var_table =LookDB(@"

selectNameas名称,MPercentas份量,0as重量fromMatBase ainnerjoinFml bona.BaseId=b.Idwhereb.PRoductName ='" +产品名+ "'");

Fill(物料集合,_table);

初始化半结构化表格数据

var_table =LookDB(@"select TableName,Prop1,Prop2,Prop3,Prop4,Prop5,Prop6 from TableSet");

InitTable(_table);

初始化非结构化规则表

var_table =LookDB(@"select

''asid,

sindexas""index"",

''asreturnType,

'Get' + nameaspropname,

1ascodestyle,

ifcode,

0asthencodeisscript,

thencode,

0aspriority,

''asexecstep

frompoolset

");

InitPool(_table);

执行决策表和规则池

ExeTable();

ExePool();

4,业务系统中的抽象

上一节已经介绍了PVC配方计算在CKRule上面的定义,而CKRule不是直接面对终端客户的,业务系统才是面对客户的,也就是说客户不会直接操作CKRule,为了业务系统界面友好性和设置的需要,定义业务系统中的对象,数据表和公式编辑界面显得相当的必要了。

下面将介绍对象的定义

配方对象定义

[Serializable]

public class FmlCond

{

public string Id { get; set; }

public string ProductName { get; set; }

public string OrderNo { get; set; }

public string Color { get; set; }

public string Spe { get; set; }

public double Oil { get; set; }

public string Flower { get; set; }

public double Length { get; set; }

public double Width { get; set; }

public double Depth { get; set; }

public double Density { get; set; }

public double Weight { get; set; }

private List<物料定义> _物料集合= new List<物料定义>();

public List<物料定义> MatList

{

get { return _物料集合; }

set { _物料集合= value; }

}

}

[Serializable]

public class物料定义

{

public string Name { get; set; }

public double MPercent { get; set; }

public double Weight { get; set; }

}

扩展说明:配方计算也许不仅仅有这些内容,还可能有更多的,如生产班组,部门,班长,时间,压纹层数,如果层数变化那厚度也会变化,而这些的定义都必须是业务系统的开发员进行的,也就是说,计算的过程可能是多变的,不简单的是上面的这样。但只要划清楚流程图,做好调用设计和对象设计,这些都不是问题,CKRule还没有集成流程功能,这可能会有一些的影响,但做常规的规则计算已经很充分了。关键还是看模型者的设计。

数据表设计

决策表数据设计,事实上,相对通用的设置也许是最合理的,下面的设计是很简单的,但这样设计即使决策表的初始化非常的方法。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表