工作流资料

最近实在有些忙,好久没上网,昨天来看了一下,发关心我这个博客的朋友还真不少。
首先对大家道个歉,这么久没有发新文章,也没有及时回贴。

我的很多文章风格有些怪异,其实当时写这些文章只是心情不好时的一种发泻,没想到会有这么多的朋友关注我的文章,再次向大家道歉,

最近有些忙,空余时间还要重新整理以前的资(包括工作流),以后一定为大家重新提供一套结构完整、风格正常(^_^)的工作流资料。

昨天晚上写了一篇关于实现工作流引擎的文章,写这篇文章的目的不是让大家放弃WF从头写自已的工作流,只是为了从数据结构、实现思路上描述一下工作流的简单原理(工作流的解决方案有很多,我这只是一种而以,我尽量去模拟WF的实现)

//正文
//工作流平台其实就是:维护集合里的一组链表......
类结构图:




工作流平台代码:

using System;

namespace wfTest
{
    
#region 工作流引擎
    
//引擎类
    public class wfEngine
    
{
        
//实例池
        protected System.Collections.SortedList InstancePool;

        
public wfEngine()
        
{
            InstancePool
=new System.Collections.SortedList();
        }

        
        
        
/// <summary>
        
/// 添加实例到引擎
        
/// </summary>
        
/// <param name="Instance">工作流实例</param>
        
/// <returns>实例ID</returns>

        public string AddInstance(wfTemplet Instance)
        
{
            InstancePool.Add(Instance.InstanceID ,Instance.CurrentNode);
            
return Instance.InstanceID;
        }


        
/// <summary>
        
/// 工作流下移一结点
        
/// </summary>
        
/// <param name="InstanceID">实例ID</param>
        
/// <returns></returns>

        public bool ExecuteNextNode(string InstanceID)
        
{
            
if(InstancePool.Contains(InstanceID))
            
{
                
if(((wfNode)InstancePool[InstanceID]).NextNode !=null)
                
{
                    InstancePool[InstanceID]
=((wfNode)InstancePool[InstanceID]).execute();
                    
return true;
                }

                
else
                
{
                    ((wfNode)InstancePool[InstanceID]).execute();
                    InstancePool.Remove(InstanceID);
                    
return false;
                }

            }

            
return false;
        }



        
/// <summary>
        
/// 一次执行完实例的所有结点
        
/// </summary>
        
/// <param name="InstanceID">实例ID</param>

        public void AutoExecute(string InstanceID)
        
{
            
while (ExecuteNextNode(InstanceID))
            
{
                AutoExecute(InstanceID);
            }

        }

    
        
//得到实例状态
        public  string getInstanceState(string InstanceID)
        
{
            
if(InstancePool.Contains(InstanceID))
            
{
                
return ((wfNode)InstancePool[InstanceID]).NodeId;
            }

            
return null;
        }


        
//得到引擎内的所有实例
        public System.Collections.SortedList getInstances()
        
{
            
return this.InstancePool;
         }


        
//停止实例
        public void StopInstance(string InstanceID)
        
{}

        
//继续被停止实例
        public void runInstance(string InstanceID)
        
{}
    }

  

    
#endregion

//---------------------------------------------------------------------
    工作流模板
//---------------------------------------------------------------------
    结点模板
//---------------------------------------------------------------------
    代码结点模板
//---------------------------------------------------------------------
    条件结点模板
//---------------------------------------------------------------------
}

基于该平台设计的工作流:

class 一个工作流:wfTest.wfTemplet
    
{
        
public 一个工作流(string InstanceID)
            :
base(InstanceID)
        
{
            
/*
             *          结点A
             *              |
             *              |
             *          结点B 
             *    (true)/   /(false)
             *             /     /
             *     结点C    结点D
             *            /      /
             *             /    /
             *         结点E
             
*/
      

            
//结点A:代码结点
            wfTest.codeNode 结点A =new wfTest.codeNode(this.InstanceID,"结点A");
            结点A.Code
+=new wfTest.codeMethod(结点A_Code);
            结点A.CodeParameter
="hello wf";

            
//结点B:条件结点
            wfTest.conditionNode 结点B=new wfTest.conditionNode(this.InstanceID,"结点B");

            
//结点B的条件表达式
            wfTest.conditionExpression 条件表达式=new wfTest.conditionExpression();

            条件表达式.leftExpression
="123";//条件表达式左值
            条件表达式.rightExpression ="1234";//条件表达式右值

            结点B.expression
=条件表达式; //绑定条件表达式到结点B

            
//结点C:代码结点
            wfTest.codeNode 结点C =new wfTest.codeNode(this.InstanceID,"结点C");
            结点C.Code
+=new wfTest.codeMethod(结点C_Code);
            结点C.CodeParameter
="i am 结点C,条件的真结点";
        
            
//结点D:代码结点
            wfTest.codeNode 结点D =new wfTest.codeNode(this.InstanceID,"结点D");
            结点D.Code
+=new wfTest.codeMethod(结点D_Code);
            结点D.CodeParameter
="这是_结点D,条件的假结点";

            
//结点E:代码结点
            wfTest.codeNode 结点E =new wfTest.codeNode(this.InstanceID,"结点E");
            结点E.Code
+=new wfTest.codeMethod(结点E_Code);
            结点E.CodeParameter
="完成了";

            
//指定入口结点
            this.CurrentNode=结点A;
            
            
//设置结点关系
            结点A.NextNode =结点B;
            结点B.NextNode 
=结点C;
            结点B.ElseNode 
=结点D;
            结点C.NextNode 
=结点E;
            结点D.NextNode 
=结点E;
      }


        
//结点A:代码
        private void 结点A_Code(wfTest.wfNode sender, object data)
        
{
            Console.WriteLine(sender.InstanceId 
+ ":" + sender.NodeId + ":" + data.ToString());
        }


        
//结点C:代码
        private void 结点C_Code(wfTest.wfNode sender, object data)
        
{
            Console.WriteLine(sender.InstanceId 
+ ":" + sender.NodeId + ":" + data.ToString());
        }


        
//结点B:代码
        private void 结点D_Code(wfTest.wfNode sender, object data)
        
{
            Console.WriteLine(sender.InstanceId 
+ ":" + sender.NodeId + ":" + data.ToString());
        }


        
//结点E:代码
        private void 结点E_Code(wfTest.wfNode sender, object data)
        
{
            Console.WriteLine(sender.InstanceId 
+ ":" + sender.NodeId + ":" + data.ToString());
        }

    }


运行

public class begin
    
{
        
static void Main()
        
{
            wfTest.wfEngine 引擎
=new wfTest.wfEngine();

            一个工作流 obj1
=new 一个工作流("12345");
            一个工作流 obj2
=new 一个工作流("12347");

            引擎.AddInstance(obj1);
            引擎.AddInstance(obj2);
            引擎.AutoExecute(obj1.InstanceID);
            引擎.AutoExecute(obj2.InstanceID);

            System.Console.Read();
        }

    }


原码:http://www.cnblogs.com/Files/foundation/wfTest.rar
(VS2003中实现)

///////////////////////////////////////////////////////
///////以此文祝大家春节快乐///////
//////////////////////////////////////////////////////
 

2.1 工作流 3 2.1.1 什么叫工作流 3 2.1.2 工作流发展 3 2.1.3 工作流的优点 3 2.2 MVC工作模式 4 2.2.1 MVC设计思想 4 2.2.2 MVC的具体实现 5 2.2.3 MVC的不足 6 2.3 JSP技术介绍 6 2.3.1 JSP的运行原理 7 2.3.2 JSP的生命周期 8 2.3.3 Servlet和JavaBean技术介绍 8 2.3.4 Java 虚拟机 9 2.3.5 JSP访问SQL Server 2000数据库 9 2.4 数据库后台环境配置 10 2.5 系统开发工具简介 10 2.5.1 Dreamweaver 10 2.5.2 MyEclipse 10 2.5.3 Tomcat 11 2.5.4 SQL Server2000 11 2.5.5 chs_sql2ksp3 12 3 系统需求分析 13 3.1 系统功能分析 13 3.2 系统性能分析 13 3.3 系统方案的确定和评价 13 4 系统总体设计 15 4.1 系统层次模块图 15 4.1.1 营业厅模块 15 4.1.2 收费管理模块 16 4.2 系统数据流程图 16 4.3 数据表设计 18 5 详细设计及编码 21 5.1 编写JAVABEAN 21 5.2 营业厅实现函数 21 5.3 收费厅主要的实现函数 22 5.4 JAVABEAN主要实现模块 22 5.4.1 中文字符格式的转换模块(Stringto.java) 22 5.4.2 自动生成验证码(Ran.java) 22 5.4.3 数据库的连接(ConnectionFactory.java) 23 5.4.4 数据库连接的关闭(DatabaseUtils.java)--只提供接口 23 5.4.5 密码修改模块(Common_fuction.java) 24 5.4.6 时间格式转换(timeBean.java) 24 5.4.7 数据统计(counthander.java) 25 5.4.8 营业厅的接口(luruaction.java) 27 5.4.9 营业厅的主要函数实现(luruhander.java) 28 5.4.10 收费厅的主要函数接口 32 5.5 管理员登陆模块 33 5.5.1 管理员登录 33 5.6 营业厅管理模块 36 5.6.1 Left.jsp页面 36 5.6.2 Work.jsp 40 5.6.3 customerlistinfo.jsp 41 5.6.4 allinfo.jsp 41 5.7 收费厅管理模块 42 5.7.1 Left.jsp 42 5.7.2 Work.jsp 43 5.7.3 Customerlistinfo.jsp 43 5.7.4 gongdan.jsp 43 6 系统测试与维护 45 6.1 测试目的 45 6.2 测试环境 45 6.3 系统测试 45 6.4 系统维护 45 7 开发难点与技术 46 7.1 主要程序实现的代码描述 46 7.1.1 验证码的自动生成 46 7.1.2 生成WORD工单 46 7.1.3 以一定的时间刷新页面 47 7.1.4 JSP中文问题的解决 47 7.2 在程序编码过程遇到的主要问题: 48 7.3 代码编写风格 49 7.4 我的不足: 49
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值