工作流之公文流转篇

出处:http://www.cnblogs.com/flyskyer/archive/2009/03/11/1408578.html

最近因为接手离职同事的公文审批(没有使用工作流)维护,感觉很麻烦,于是在我开发的工作流平台上重新写了相关的功能,扩展同事的功能,同时可以支持固定流和任意流功能。希望大哥们给予指点。

固定流就是由发起人定义审批的步骤,流程按照既定步骤执行。

任意流就是由发起人发起,选择下一步审批人审批,然后审批再选择下一步审批人。

当然公文审批支持的电子签名的功能也有,但是不作为本篇讨论内容,还有界面美观。

1.服务代码。

工作流之公文流转篇工作流之公文流转篇Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->工作流之公文流转篇usingSystem;
工作流之公文流转篇
usingSystem.Collections.Generic;
工作流之公文流转篇
usingSystem.Linq;
工作流之公文流转篇
usingSystem.Text;
工作流之公文流转篇
usingSystem.Workflow.Runtime;
工作流之公文流转篇
usingSystem.Workflow.Activities;
工作流之公文流转篇
usingSystem.Workflow.ComponentModel;
工作流之公文流转篇
工作流之公文流转篇
namespaceStateMachineService
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇[Serializable]
工作流之公文流转篇
publicclassDocFlowEventArgs:ExternalDataEventArgs
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
publicDocFlowEventArgs(stringuserID,Guiduninstand):base(uninstand)
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
工作流之公文流转篇
this.uninstand=uninstand;
工作流之公文流转篇
this.userID=userID;
工作流之公文流转篇}

工作流之公文流转篇
工作流之公文流转篇
privateGuiduninstand=Guid.Empty;
工作流之公文流转篇
publicGuidUninstand
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇工作流之公文流转篇
get工作流之公文流转篇{returnthis.uninstand;}
工作流之公文流转篇工作流之公文流转篇
set工作流之公文流转篇{this.uninstand=value;}
工作流之公文流转篇}

工作流之公文流转篇
privatestringuserID=string.Empty;
工作流之公文流转篇
publicstringUserID
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇工作流之公文流转篇
get工作流之公文流转篇{returnthis.userID;}
工作流之公文流转篇工作流之公文流转篇
set工作流之公文流转篇{this.userID=value;}
工作流之公文流转篇}

工作流之公文流转篇}

工作流之公文流转篇[ExternalDataExchange]
工作流之公文流转篇
publicinterfaceIDocFlowService
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
eventEventHandler<DocFlowEventArgs>Next;
工作流之公文流转篇
eventEventHandler<DocFlowEventArgs>Jump;
工作流之公文流转篇
eventEventHandler<DocFlowEventArgs>Stop;
工作流之公文流转篇
工作流之公文流转篇
voidSetFixNextApprover(intNextStpeID,stringuninstand);
工作流之公文流转篇
voidSetFixEnableApprover(intCurrentStpeID,stringuninstand);
工作流之公文流转篇
voidSetAutoNextApprover();
工作流之公文流转篇
voidSetAutoEnableApprover(stringuninstand);
工作流之公文流转篇
voidChangeStatus();
工作流之公文流转篇}

工作流之公文流转篇[Serializable]
工作流之公文流转篇
publicclassDocFlowService:IDocFlowService
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇IDAL.IWFreeNodeiwfreenode;
工作流之公文流转篇GuidT;
工作流之公文流转篇
stringUserID;
工作流之公文流转篇Dictionary
<string,EventHandler<DocFlowEventArgs>>list=newDictionary<string,EventHandler<DocFlowEventArgs>>();
工作流之公文流转篇
publicvoidRaiseEventer(stringeventName,Guiduninstand,stringuserID)
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
if(list[eventName]!=null)
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
try
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇EventHandler
<DocFlowEventArgs>eventHandler=list[eventName];
工作流之公文流转篇DocFlowEventArgsargs
=newDocFlowEventArgs(userID,uninstand);
工作流之公文流转篇args.WaitForIdle
=true;
工作流之公文流转篇eventHandler.Invoke(
null,args);
工作流之公文流转篇
this.T=uninstand;
工作流之公文流转篇
this.UserID=userID;
工作流之公文流转篇}

工作流之公文流转篇
catch
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇}

工作流之公文流转篇}

工作流之公文流转篇}

工作流之公文流转篇工作流之公文流转篇
IDocFlowService成员#regionIDocFlowService成员
工作流之公文流转篇
工作流之公文流转篇
publiceventEventHandler<DocFlowEventArgs>Next
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇add
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
this.list.Add("Next",value);
工作流之公文流转篇}

工作流之公文流转篇remove
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
this.list.Remove("Next");
工作流之公文流转篇}

工作流之公文流转篇}

工作流之公文流转篇
工作流之公文流转篇
publiceventEventHandler<DocFlowEventArgs>Jump
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{add
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
this.list.Add("Jump",value);
工作流之公文流转篇}

工作流之公文流转篇remove
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
this.list.Remove("Jump");
工作流之公文流转篇}

工作流之公文流转篇}

工作流之公文流转篇
工作流之公文流转篇
publiceventEventHandler<DocFlowEventArgs>Stop
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇add
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
this.list.Add("Stop",value);
工作流之公文流转篇}

工作流之公文流转篇remove
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
this.list.Remove("Stop");
工作流之公文流转篇}

工作流之公文流转篇}

工作流之公文流转篇
工作流之公文流转篇
publicvoidChangeStatus()
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
thrownewNotImplementedException();
工作流之公文流转篇}

工作流之公文流转篇
工作流之公文流转篇
#endregion

工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇工作流之公文流转篇
IDocFlowService成员#regionIDocFlowService成员
工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇
publicvoidSetFixNextApprover(intNextStpeID,stringuninstand)
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇iwfreenode
=DALFactory.WFreeNode.CreateInstance();
工作流之公文流转篇
stringscript="updateWFreeNodeset[ExceteState]=1whereUninstand='"+uninstand+"'andStepID="+NextStpeID;
工作流之公文流转篇iwfreenode.Update(script);
工作流之公文流转篇
工作流之公文流转篇
//thrownewNotImplementedException();
工作流之公文流转篇
}

工作流之公文流转篇
工作流之公文流转篇
#endregion

工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇工作流之公文流转篇
IDocFlowService成员#regionIDocFlowService成员
工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇
publicvoidSetFixEnableApprover(intCurrentStpeID,stringuninstand)
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇iwfreenode
=DALFactory.WFreeNode.CreateInstance();
工作流之公文流转篇
stringscript="updateWFreeNodeset[ExceteState]=2whereUninstand='"+uninstand+"'anduserID='"+this.UserID+"'andStepID="+CurrentStpeID;
工作流之公文流转篇iwfreenode.Update(script);
工作流之公文流转篇
//thrownewNotImplementedException();
工作流之公文流转篇
}

工作流之公文流转篇
工作流之公文流转篇
#endregion

工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇工作流之公文流转篇
IDocFlowService成员#regionIDocFlowService成员
工作流之公文流转篇
工作流之公文流转篇
工作流之公文流转篇
publicvoidSetAutoNextApprover()
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
工作流之公文流转篇
//thrownewNotImplementedException();
工作流之公文流转篇
}

工作流之公文流转篇
工作流之公文流转篇
publicvoidSetAutoEnableApprover(stringuninstand)
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇iwfreenode
=DALFactory.WFreeNode.CreateInstance();
工作流之公文流转篇
stringscript="updateWFreeNodeset[ExceteState]=2whereUninstand='"+uninstand+"'anduserID='"+this.UserID+"'";
工作流之公文流转篇iwfreenode.Update(script);
工作流之公文流转篇}

工作流之公文流转篇
工作流之公文流转篇
#endregion

工作流之公文流转篇}

工作流之公文流转篇}

工作流之公文流转篇

现在支持前进,抄送(平台功能)和终止,还不支持会退和跳批。

2.数据库结构

工作流之公文流转篇工作流之公文流转篇Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CREATETABLE[dbo].[DocFlow](
[Uninstand][uniqueidentifier]NOTNULL,
[UserID][varchar](
50)NOTNULL,
[Date][datetime]NULL,
[Title][varchar](
400)NULL,
[Remark][varchar](
500)NULL,
[DocLevel][varchar](
50)NULL,
[FlowType][varchar](
10)NULL,
[Depart][varchar](
50)NULL
)

3.流程图

a.

工作流之公文流转篇b.

工作流之公文流转篇2.

3.

工作流之公文流转篇

4.

工作流之公文流转篇

流程代码

工作流之公文流转篇工作流之公文流转篇Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->工作流之公文流转篇usingSystem;
工作流之公文流转篇
usingSystem.ComponentModel;
工作流之公文流转篇
usingSystem.ComponentModel.Design;
工作流之公文流转篇
usingSystem.Collections;
工作流之公文流转篇
usingSystem.Drawing;
工作流之公文流转篇
usingSystem.Linq;
工作流之公文流转篇
usingSystem.Workflow.ComponentModel.Compiler;
工作流之公文流转篇
usingSystem.Workflow.ComponentModel.Serialization;
工作流之公文流转篇
usingSystem.Workflow.ComponentModel;
工作流之公文流转篇
usingSystem.Workflow.ComponentModel.Design;
工作流之公文流转篇
usingSystem.Workflow.Runtime;
工作流之公文流转篇
usingSystem.Workflow.Activities;
工作流之公文流转篇
usingSystem.Workflow.Activities.Rules;
工作流之公文流转篇
工作流之公文流转篇
namespaceStateMachineLibrary
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
publicpartialclassDocFlow:StateMachineWorkflowActivity
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇
publicstaticDependencyPropertyDocFlowTypeProperty=DependencyProperty.Register("DocFlowType",typeof(string),typeof(DocFlow));
工作流之公文流转篇
publicstringDocFlowType
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇{
工作流之公文流转篇工作流之公文流转篇
get工作流之公文流转篇{return(string)base.GetValue(DocFlow.DocFlowTypeProperty);}
工作流之公文流转篇工作流之公文流转篇
set工作流之公文流转篇{base.SetValue(DocFlow.DocFlowTypeProperty,value);}
工作流之公文流转篇}

工作流之公文流转篇
publicstaticDependencyPropertyStepIDListProperty=DependencyProperty.Register("StepIDList",typeof(System.Collections.Generic.List<int>),typeof(DocFlow));
工作流之公文流转篇
publicSystem.Collections.Generic.List<int>StepIDList
工作流之公文流转篇工作流之公文流转篇
工作流之公文流转篇