了解mocoolka更多的信息,直接访问http://sourceforge.net/p/mocoolkacn/wiki/Home/
按照ERP的特点,功能大致可以分为三部分
1)模块本身的功能,比如增、删、改、查、导入、导出、日志、附件等
2)模块本身的状态控制。比如一个模块可能有草稿、审核、拒绝、订单4个状态。每个状态通过动作来转换。草稿按审核动作转化为审核,审核按激活动作转化为草稿,审核按拒绝按钮转化为拒绝,审核按订单动作转化为订单。其中每个状态可以定义哪些动作不能操作,哪些字段只读,是否允许编辑从表。以上描述形成状态机。
3)模块之间的操作,主要体现在一个动作操作多个模块,输入的数据经过转化、计算后生成其它模块数据显示到屏幕或直接增加或修改对应模块库表数据。
本文章描述状态机的设计和预计的操作步骤。
期望结果:
1)用户可以通过开发管理屏幕直接设计状态、动作、状态机图。
2)在系统运行中,用户可以查看一条记录的状态机,当前状态用黄色表示。
设计:
在模型中已有动作和状态,但两个模块之间没有关联。
在动作模块中增加从状态、到状态,表示这个动作执行后会把从状态改为到状态。
在开发管理中增加状态机设计,打开后,把模型数据生成json格式的数据传入到屏幕中,如果有状态数据就生成状态机图,用户可以拖动排列状态位置,然后用json格式直接保存到模型,下次打开直接加载到屏幕中。
在常用动作中增加状态机动作,执行后显示当前状态机
其中json格式如下:
[{
name: 'Draft', Description: '草稿',dx: 121,
dy: 108, actions: [{
name: 'Aduit', Description: '审核', target: 'evaluation'
}]
},
{
name: 'evaluation', Description: '审核', dx: 315,
dy: 123, actions: [
{ name: 'Draft', Description: '草稿', target: 'Draft' },
{ name: 'ClosedRejected', Description: '拒绝', target: 'ClosedRejected' },
{ name: 'ClosedOrdercreated', Description: '订单',target: 'ClosedOrdercreated' } ,
]
},
{
name: 'ClosedOrdercreated', Description: '订单', dx: 483,
dy: 175,
},
{
name: 'ClosedRejected',dx: 490,
dy: 72, Description: '拒绝',
},
];
图形控制使用joint.js
转换json到图片代码如下:
var testdata = [{
name: 'Draft', Description: '草稿',dx: 121,
dy: 108, actions: [{
name: 'Aduit', Description: '审核', target: 'evaluation'
}]
},
{
name: 'evaluation', Description: '审核', dx: 315,
dy: 123, actions: [
{ name: 'Draft', Description: '草稿', target: 'Draft' },
{ name: 'ClosedRejected', Description: '拒绝', target: 'ClosedRejected' },
{ name: 'ClosedOrdercreated', Description: '订单',target: 'ClosedOrdercreated' } ,
]
},
{
name: 'ClosedOrdercreated', Description: '订单', dx: 483,
dy: 175,
},
{
name: 'ClosedRejected',dx: 490,
dy: 72, Description: '拒绝',
},
];
console.log(testdata);
arrs = new Array();
var statushash = [];
var fsa = Joint.dia.fsa;
Joint.paper("myfsa", 2000, 200); /*(id or HTMLElement, width, height)*/
for (var i = 0; i < testdata.length; i++) {
var tempstatus = testdata[i];
var x = 120 * (i + 1);
var y=120;
if (tempstatus.dx) {
x = tempstatus.dx;
}
if (tempstatus.dy) {
y = tempstatus.dy;
}
var draw =fsa.State.create({ position: { x: x, y:y }, label: tempstatus.Description }) ;
arrs.push(draw);
statushash.push({name:tempstatus.name,draw:draw});
}
for (var i = 0; i < testdata.length; i++) {
var tempstatus = testdata[i];
if (tempstatus.actions) {
for (var j = 0; j < tempstatus.actions.length; j++) {
var action = tempstatus.actions[j];
var src, dest;
for (var k = 0; k < statushash.length; k++) {
if (statushash[k].name == tempstatus.name) {
src = statushash[k].draw;
}
if (statushash[k].name == action.target) {
dest = statushash[k].draw;
}
}
if (src && dest) {
src.joint(dest, (fsa.arrow.label = action.Description, fsa.arrow)).registerForever(arrs);
}
}
}
}
状态机图片见附件: