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(@"

select Name as 名称,MPercent as 份量,0 as 重量 from MatBase a inner joinFml b on a.BaseId=b.Id where b.ProductName ='" + 产品名 + "'");

Fill(物料集合,_table);

初始化半结构化表格数据

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

InitTable(_table);

初始化非结构化规则表

var _table = LookDB(@"select

'' as id,

sindex as ""index"",

'' as returnType,

'Get' + name as propname,

1 as codestyle,

ifcode,

0 as thencodeisscript,

thencode,

0 as priority,

'' as execstep

from poolset

");

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还没有集成流程功能,这可能会有一些的影响,但做常规的规则计算已经很充分了。关键还是看模型者的设计。

数据表设计

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

TableName

Prop1

Prop2

Prop3

Prop4

Prop5

Prop6

Prop7

增透剂规范

B1

TM-001

1

 

 

 

 

增透剂规范

B2

TM-002

0.5

 

 

 

 

增透剂规范

B3

TM-003

1.5

 

 

 

 

对照一个CKRule上面的设置

代码如下:

特征码

Prop1

!string.IsNullOrEmpty(特性) && 特性 == value

增透剂编码

Prop2

AddRow(物料集合,x=>{

x.名称 = value;

x.份量 = CDouble(Row.Cells["Prop3"].Value);

});

主规则中的初始化逻辑

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

InitTable(_table);

客户规则池数据表

SIndex

Name

IfCode

ThenCode

ElseCode

Priority

ExecStep

0

按订单第2位加增塑剂

取第N个字符(订单号,1) == "X"

增加份量("DINP",2);

 

10

 

主规则中的初始化逻辑

var _table = LookDB(@"select

'' as id,

sindex as ""index"",

'' as returnType,

'Get' + name as propname,

1 as codestyle,

ifcode,

0 as thencodeisscript,

thencode,

0 as priority,

'' as execstep

from poolset

");

InitPool(_table);

配方表

ID

ProductName

OrderNo

Spe

Color

Oil

Flower

Length

Width

Depth

Density

Weight

1

CKP-01

T2X14042000

B1

CL-01

45

FL-33

1000

21

0.4

 

 

2

CKP-02

TX2X014041000

B1

CL-01

32

FL-65

400

22

0.3

 

 

3

CKP-03

TX2014045000

B2

CL-02

44

FL-12

300

23

0.8

 

 

4

CKP-04

T2014043500

B3

CL-03

27

FL-11

400

24

0.9

 

 

5

CKP-05

T2014044000

B2

CL-06

50

FL-44

2000

19

1

 

 

配料表

BaseId

Name

MPercent

1

PVC

100

1

DINP

15

1

Caco3

5

1

CK-001

20

2

CK-YL01

20

2

CK-YL02

20

3

PVC

100

3

DOP

19

3

CK-001

8

3

CK-002

2

3

CK-003

3

4

PVC

100

4

DOP

4

4

CK-032

1

4

CK-044

2

4

CK-055

3

4

Caco3

4

5

PVC

100

5

DINP

20

5

CK-422

6

5

CK-478

7

编码说明:一般而言,在厂企中都使用编码,方便规范化管理和保密的需要,CK-478如果不是厂企的员工,根本不知道是什么,如果有保密配方,那这个编码就应该只有几个重要人员知道是什么。但本文而言,作者是因为不太熟悉配方设计,一般都是塑料化工科班出身的人才配得出来,所以才使用编码。但不影响阅读。

5,业务系统界面显示

配方计算主界面由配方列表和物资明细组成,其中配方主表数据来自来Fml数据表,而物资明细信息来自于MatBase表,Fml相当于配方订单表(含生产信息),而MatBase就是物料清单,这两个表有关联关系。

事实上,还应该有一个产品-物料表,即生产何种产品就使用何种物资,这就是之前提及的结构化的标准配方数据。

配方规则编写表,只写了一个最简单的规则,如前面所述通过订单编号来判断份量。这只是一个简单,还需要业务系统开发商的不断扩展,以便适应不同厂商的要求。这需要一个抽象和提炼的过程,是与客户不断接触的过程中完善和改进的对象模型。

源代码下载, http://www.ckrule.com/cn/solution/business/195.html

使用CKRule实现PVC配方计算的更多相关文章

  1. 浅谈PVC塑料配方计算软件的设计

    1, 配方设计与配方计算 题目是配方计算,不是配方设计,设计是需要有深厚的塑料知识才可以做的,即生产什么塑料产品,需要放各种原料是什么,各自比较是多少,遇到什么情况下就要多放什么,少放什么.配方设计不 ...

  2. 使用CKRule规则引擎处理多变业务

    1, 多变业务 开发系统时,有没有试过下面的情况,如果你试过,那可以考虑一下使用规则引擎了. 序号 问题 举例 1 业务规则来自于一个或多个表格 商店的会员积分表,停车场的计费标准,快递费的计算表,客 ...

  3. 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解

    欢迎大家前往腾讯云技术社区,获取更多腾讯海量技术实践干货哦~ 作者:腾讯云容器服务团队 源码为 k8s v1.6.1 版本,github 上对应的 commit id 为 b0b7a323cc5a4a ...

  4. 业务与IT技术

    最近听一个同事又再次提问关于业务比技术重要,是真的吗? 今天我们再来看一下.      一,什么是业务? 业务意指某种有目的的工作或工作项目.技术可以指人类对机器.硬件或人造器皿的运用,但它也可以包含 ...

  5. ckrule规则编辑器在wpf中的使用

    当前,ckrule的IDE和业务管理系统都是由winform开发的,规则编辑器也只提供了winform的版本,所以很多的朋友都提出意见,要有wpf的版本.wpf的界面设置和管理都更加的方便. 事实上可 ...

  6. kubernetes系列11—PV和PVC详解

    本文收录在容器技术学习系列文章总目录 1.认识PV/PVC/StorageClass 1.1 介绍 管理存储是管理计算的一个明显问题.该PersistentVolume子系统为用户和管理员提供了一个A ...

  7. 13.kubernetes之pv,pvc,configmap(带补充实例)

    管理存储是管理计算的一个明显问题.该PersistentVolume子系统为用户和管理员提供了一个API,用于抽象如何根据消费方式提供存储的详细信息.为此,我们引入了两个新的API资源:Persist ...

  8. pv和pvc状态

    原文地址:https://kubernetes.cn/topics/46 API Server 和 PVController API Server: 这个组件提供对API的支持,响应REST操作,验证 ...

  9. Kubernetes 中的pv和pvc

    原文地址:http://www.cnblogs.com/leidaxia/p/6485646.html 持久卷 PersistentVolumes 本文描述了 Kubernetes 中的 Persis ...

随机推荐

  1. 文件句柄NSFileHandle

    //一.读取 //1.以只读方式打开 NSFileHandle *fh = [NSFileHandle fileHandleForReadingAtPath:txtPath]; //2.读取所有内容 ...

  2. springboot整合activemq加入会签,自动重发机制,持久化

    消费者客户端成功接收一条消息的标志是:这条消息被签收. 消费者客户端成功接收一条消息一般包括三个阶段:          1.消费者接收消息,也即从MessageConsumer的receive方法返 ...

  3. Ngnix,EA(Enterprise Architect)

    nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点 ...

  4. day--39-MySQL的多表查询

    多表查询一:表的基本介绍 可以参考:https://www.cnblogs.com/cdf-opensource-007/p/6517627.html 建立一个员工表信息表和一个部门表,每个员工都对应 ...

  5. python学习之路---day03

    一:数据类型转换 1:bool-->int 将bool转成 int型 True 是1 False是0 a=True c=int(a) print(c) b=False d=int(b) prin ...

  6. Android RecyclerView组件和 Spinner(下拉列表框)

    1.RecyclerView <1>知识点介绍 RecyclerView 比 ListView 更高级且更具灵活性. 它是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效 ...

  7. WPF Hidden和Collapsed

    对于这两种设定,其实已经提示的很清楚了 Visibility="Hidden"不显示元素,但是在布局为元素保留空间 Visibility="Collapsed" ...

  8. Highcharts的一些属性

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 处女座和他的小姐姐(三)----数位DP

    链接:https://ac.nowcoder.com/acm/contest/329/G来源:牛客网 经过了选号和漫长的等待,处女座终于拿到了给小姐姐定制的手环,小姐姐看到以后直呼666! 处女座其实 ...

  10. (转)2017年最新企业面试题之shell(一,二)

    2017年最新企业面试题之shell(一) ********************************************** 企业Shell面试题1:批量生成随机字符文件名案例 * *** ...