十、业务流程实例
业务流程运行框架中的业务流程引擎(ProcessEngine)解析业务流程定义,其运行的结果就是生成业务流程实例。业务流程实例是个泛指,其实它真正包含了流程实例(ProcessInstance)和每个活动环节的任务(Task)两部分的数据。其中流程实例(ProcessInstance)是每次启动流程生成一个,而活动环节的任务(Task)则是每次流转,回退和转发时都会为流向活动环节生成的。所以它们是一个流程实例(ProcessInstance)包含多个任务(Task)的关系。
1 流程实例和任务
由于流程实例(ProcessInstance)和任务(Task)的绝大多数属性是都一样的,所以在数据库中,它们都是存入到任务表(SA_Task)。两种数据使用SCATALOGID和SKINID字段组合来区分。所以流程实例(ProcessInstance)本质上也是任务(Task),一种特殊类型的任务(Task)。
任务类型 |
sCataLogID |
sKindID |
流程实例(ProcessInstance) |
tsProcess |
tkProcessInstance |
流程任务(Task) |
tsProcess |
tkTask |
协同任务(Task) |
tsTask |
tkTask |
由于每一条任务只能描述一个创建者和一个执行者,所以当一条任务需要多个执行者共同处理时就需要为这条任务生成与执行者数量等量的子任务。当一条任务只需要一个执行者来处理时则就不需要生成子任务。
任务类型 |
sCataLogID |
sKindID |
流程任务(Task) |
tsProcess |
tkTask |
流程任务的子任务(Task) |
tsProcess |
tkExecutor |
流程通知(Task) |
tsProcess |
tkNotice |
协同任务(Task) |
tsTask |
tkTask |
同任务的子任务(Task) |
tsTask |
tkExecutor |
任务其实本质就是一个通知,用来通知执行者处理相关事务。它包含创建者,接收者,时间和相关单号等信息。一条任务被执行者处理完毕以后还可以把它再发给其他执行者处理,则在任务间就会形成前后关系。任务本身是存入任务表的,而任务的关系是存入任务关系表。
2 Task对象
任务在概念上使用SA_Task描述,而概念本身只负责数据的存取和数据的规则,在代码中操作起来并不方便所以扩展出Task对象。Task对象描述任务的基本信息和任务见的父子和前后信息。
业务流程运行体系的代码都是基于Task对象来写的,其中在业务流程引擎中扩展的ProcessInstance和ActivityInstance对象其实内部实现都是Task对象。
在需要在代码中生成任务时,推荐的方案是创建Task对象然后创建一个TaskEngine对象来保存它们。当然也可以直接使用SQL语句插入任务表。
3 任务表(SA_Task)
任务表用来存储任务,这里的任务是个泛指,其实是包含了流程实例,待办任务,多人处理,协同任务等等信息都被存入了任务表。
*任务表结构
在任务表结构中各个字段就不一一列举了,详细结构可以查看SA_Task的概念定义。在这里要特别说明的是其中一些重要字段的定义和取值范围。
字段名 |
描述 |
sID |
任务唯一标识 |
sVars |
流程变量 |
sSubProcess |
子流程标识 |
sSubPI |
子流程实例 |
sProcessVersion |
流程版本 |
sCode |
编号 |
sParentID |
父任务ID |
sName |
任务标题,在任务相关页面和任务中心显示用 |
sContent |
审批意见 |
sSign |
签名信息 |
sRemark |
处理情况 |
sSummary |
摘要 |
sFlowID |
任务所属流程实例的ID,如果当前记录本身就是流程实例,则它的值和SID的值相等 |
sSourceID |
只有在回退时用到,用来记录新生成的回退的待办任务是基于此执行者原始的哪条待办任务的 |
sFrontID |
回退时记录的前序任务ID |
sExecuteMode2 |
任务的回退模式,取值范围是flowToAgain(重新流转)、flowToFront(原路返回)、flowToFrontOrAgain(重新流转或原路返回) |
sExecuteMode |
任务的执行模式,取值范围是temPreempt(抢占),temSequential(顺序),temSimultaneous(同时) |
sPreemtMode |
任务的抢占模式,取值范围是tpmOpen(打开时),tpmExecute(处理时) |
sCatalogID |
任务的大类标识,tsProcess为流程任务,tsTask为协同任务 |
sKindID |
任务的类型细分标识,tkProcessInstance为流程实例,tkTask为任务,tkExecutor为执行者 |
sTypeID |
任务类型ID |
sTypeName |
任务类型 |
sImportanceID |
重要性ID |
sImportanceName |
重要性 |
sEmergencyID |
紧迫度ID |
sEmergencyName |
紧迫度 |
sProcess |
任务属于哪个业务过程,存储业务过程的URL,一般只有属于流程的任务会给这个关系赋值 |
sActivity |
任务属于哪个业务环节,存储业务环节的ID,一般只有属于流程的任务会给这个关系赋值 |
sCURL |
一般存储的是创建此任务的activity的URL,创建者用它来浏览任务详细 |
sEURL |
存储的是处理此任务的activity的URL,执行者用它来查看详细和处理待办任务 |
sCreateTime |
创建时间 |
sDistributeTime |
发布时间 |
sLastModifyTime |
最后修改时间 |
sWarningTime |
警告时间 |
sLimitTime |
限制时间 |
sLimitSecond |
限制时间(秒) |
sRemindTime |
提醒时间 |
sRemindInterval |
提醒间隔时间 |
sLastRemindTime |
最后提醒时间 |
sExpiredProcessMode |
超时处理方式 |
sRemindChannel |
提醒方式 |
sExpectStartTime |
预计开始时间 |
sExpectFinishTime |
预计结束时间 |
sActualStartTime |
开始时间 |
sActualFinishTime |
结束时间 |
sExecuteTime |
处理时间 |
sCreatorPersonID |
提交者的ID |
sCreatorPersonName |
提交者的姓名 |
sCreatorPosID |
提交者的岗位ID |
sCreatorPosName |
提交者的岗位名称 |
sCreatorDeptID |
提交者的部门ID |
sCreatorDeptName |
提交者的部门名称 |
sCreatorOgnID |
提交者的机构ID |
sCreatorOgnName |
提交者的机构名称 |
sCreatorFID |
提交者的FID |
sCreatorFName |
提交者的FName |
sExecutorPersonID |
执行者的ID |
sExecutorPersonName |
执行者的姓名 |
sExecutorPosID |
执行者的岗位ID |
sExecutorPosName |
执行者的岗位名称 |
sExecutorDeptID |
执行者的部门ID |
sExecutorDeptName |
执行者的部门名称 |
sExecutorOgnID |
执行者的机构ID |
sExecutorOgnName |
执行者的机构名称 |
sExecutorFID |
执行者的FID |
sExecutorFName |
执行者的FName |
sExecutorNames |
执行者列表,逗号分隔 |
sActivityNames |
当前活动环节 |
sResponsible |
负责人 |
sCustomerID |
客户ID |
sCustomerCode |
客户编码 |
sCustomerName |
客户 |
sProjectID |
项目ID |
sProjectCode |
项目编码 |
sProjectName |
项目 |
sPlanID |
计划ID |
sPlanCode |
计划编码 |
sPlanName |
计划 |
sData1 |
存储业务单据的关键字 |
sData2 |
存储业务单据的关键字 |
sData3 |
存储业务单据的关键字 |
sData4 |
存储业务单据的关键字 |
sStatusID |
任务状态,取值范围是tesReady(尚未处理),tesExecuting(正在处理),tesSleeping(暂缓处理),tesCanceled(已取消),tesAborted(已终止),tesFinished(已完成),tesReturned(已回退),tesTrainsmited(已转发),tesPaused(已暂停) |
sStatusName |
任务状态 |
sAIID |
环节实例 |
sAIStatusID |
环节状态ID,只有在属于流程的待办任务会用到,值默认为NULL,外界不需要维护 |
sAIStatusName |
环节状态 |
sAIActive |
环节激活 |
sSequence |
序号 |
sLock |
编号 |
sHints |
提示 |
sShortcut |
快捷操作 |
sRemindMode |
提醒模式 |
version |
版本 |
sWithdraw |
回收标记 |
sVariable |
存储变量名和值 |
sProcessName |
流程名称 |
sActivityName |
环节名称 |
sProcessTemplateID |
流程模板 |
sProcessTemplateItemSequence |
流程模板序号 |
sTempPermissionID |
临时权限 |
sActivityInTemplate |
模板2 |
sProcessTemplateID2 |
环节2 |
sPICreatorPersonName |
流程发起人 |
sESField01 - sESField54 |
用户扩展字段 |
4 任务关系表(SA_TaskRelation)
任务关系表用来存储任务间的前后关系,可以认为它是任务表的从表。当一条任务真的具有前序任务或后序任务时在任务关系表中才会有相关关系的维护。
任务关系表中sTaskID1表示前面的待办任务sTaskID2表示后面的待办任务。sKind字段用来描述关系类型,目前没有使用。
任务关系表的字段在这就不一一列举了,详细的表结构可以查看SA_TaskRelation概念的定义。
5 Token表(SA_TokenInstance)
Token表用来存储业务流程底层算法PetriNet中产生的Token。一般的业务流程和协同任务都不会用到Token,所以Token表也不需要被外界所关注,因为业务流程本身做到了只要具有待办任务就可以进行任意操作而不需要依赖Token。Token表是任务表的从表,它的sProcessInstanceID字段对应于在任务表中存储的业务流程实例的SID。
*Token表结构
Token表的字段在这就不一一列举了,只列举一些重要的字段和描述。详细的表结构可以查看SA_TOKEN概念的定义。
字段名 |
描述 |
sID |
Token唯一标识 |
sProcessInstanceID |
Token所属的流程实例的ID,记录的值是表示流程实例的那条任务的ID |
sProcess |
Token所属的业务过程,这里存储业务过程的URL |
sPlace |
Token所属的Place,这里存储Place的ID |
sFromActivity |
Token是由哪个Activity产生的,这里存储Activity的ID |
sFromActivityInstanceID |
Token是由哪个任务产生的,记录任务的ID |
sToActivity |
Token是被哪个Activity消耗的,这里存储Activity的ID |
sToActivityInstanceID |
Token是被哪个任务消耗的,记录任务的ID |
sValue |
Token的值 |
sActive |
标识Token是否被消耗,取值范围是true和false |
6 ProcessControl表(SA_ProcessControl)
某个执行者在做流转操作时选择了目标执行者,他下次再基于相同的活动环节做流转操作时,系统会默认选择上次他选择的执行者。此特性的实现是因为业务流程引擎在每次操作的时候都把ProcessControl的内容给保存到ProcessControl表里了,以备下次操作时可以还原当初的一些选择。
*ProcessControl表结构
ProcessControl表的字段在这就不一一列举了,只列举一些重要的字段和描述。详细的表结构可以查看SA_ProcessControl概念的定义。
字段名 |
描述 |
sID |
唯一标识 |
sOperatorID |
操作者ID,标识ProcessControl属于哪个操作者 |
sProcess |
标识ProcessControl在哪个业务过程做操作时产生的,这里存储业务过程的URL |
sActivity |
标识ProcessControl在哪个业务环节做操作时产生的,这里存储业务环节的ID |
sAction |
标识ProcessControl在做什么操作时产生的 |
sContent |
ProcessControl的内容,这里存储的值是基于ProcessControl对象的XML格式 |