zoukankan      html  css  js  c++  java
  • 使用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(@"

    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 

  • 相关阅读:
    每日一练leetcode
    每日一练leetcode
    每日一练leetcode
    springboot搭建过程
    每日一练leetcode
    每日一练leetcode
    每日一练leetcode
    安装 Redis 迎客
    windows系统上面如何后台执行程序 迎客
    jira的详细安装和破解 迎客
  • 原文地址:https://www.cnblogs.com/jingle/p/3694915.html
Copyright © 2011-2022 走看看