简单工作流数据库设计 研发部:罗代均
项目(Item) |
|
|
|
|
|
项目ID(ItemId) |
项目描述(ItemName) |
流程ID (RoutID) |
申请人ID (ApplyUserID) |
状态(State) |
项目类型(ItemType) |
1 |
郑州出差借款 |
1 |
|
1 |
借款单 |
2 |
郑州出差报销 |
3 |
|
1 |
报销单 |
这里的项目,是泛指,可以是公文,借款单,报销单等等需要流转的数据.
任务列表(TaskList) |
|
|
|
|
任务ID(taskId) |
项目ID (itemId) |
步骤ID (actorId) |
状态(state) |
版本(version) |
1 |
1 |
1 |
检出 |
100 |
2 |
2 |
3 |
检出 |
1001 |
3 |
3 |
3 |
待检出 |
1002 |
项目申请后,任务列表插入一条记录.用户审批通过或者拒绝后,update当前步骤ID(上一步骤或者下一步骤).某个步骤可能有多个审批人,如果要审批,必须先检出.version字段是为了乐观锁控制,保证只能有一人检出.
任务历史记录(TaskHistory) |
|
|
|
ID(id) |
项目ID (itemId) |
步骤ID (actorId) |
备注(memo) |
操作人ID (operateUserId) |
创建时间(createDate) |
1 |
1 |
1 |
成都出差 |
1 |
|
1 |
1 |
2 |
批准 |
2 |
|
1 |
1 |
3 |
批准 |
3 |
|
每个步骤的操作,都写入任务历史记录
流程(Rout) |
|
|
|
|
流程ID(routId) |
流程描述(routName) |
部门ID (deptID) |
版本号(version) |
状态(State) |
1 |
借款流程 |
1 |
1 |
发布 |
2 |
报销流程 |
1 |
1 |
草稿 |
2 |
预算审批流程 |
1 |
1 |
停止 |
流程草稿状态是可以修改删除,发布状态就不能修改和删除,只能新增一个版本,或者新增一个流程,或者停止流程。
步骤(Actor) |
|
|
|
步骤ID(actorID) |
步骤序号(sortNo) |
步骤描述(actorName) |
流程ID (routId) |
1 |
1 |
借款申请 |
1 |
2 |
2 |
部门经理审批 |
1 |
3 |
3 |
财务经理审批 |
1 |
步骤序号是步骤执行的顺序,审批的时候,根据当前序号,查找下一步骤,然后将下一步骤update任务列表的步骤ID,审批拒绝,则查找上一步骤,然后update任务列表的步骤ID
步骤处理人(actorUser) |
|
步骤ID(actorId) |
处理人ID (operateUserId) |
1 |
1 |
2 |
2 |
2 |
3 |
一个步骤,是有多个处理人。处理人先检出任务列表,然后才能审批。
视图:待我处理的工作
select t1.taskId,t1.itemId,t3.operateUserId
from taskList t1
join actor t2 on t1.actorId=t2.actorId
join actorUser t3 on t2.actorId=t3.actorId
where t1.state='待检出'
视图:我申请的工作
select t1.itemId,t1.itemName,t1.state,t1.applyUserId,t2.actorId from
item t1
join taskList t2 on t1.itemId=t2.itemId
申请时 "1--查找所选流程的第一个步骤
select actorId from actor
where routId =1
order by sortNo
limit 0,1
2--插入任务列表taskList
insert into tasklist(actorId,state,version,itemId)
values()
3--插入任务历史记录
insert into taskhistory(itemId,actorid,memo,operateBy,createDate)
values()
4--修改项目Item的状态为待审批
update item set state='wait_to_approve' where itemId=1"
审批通过 "1--update任务列表的步骤ID为下一步骤ID
update taskList set actorId=
(select actorId from actor
where routId = (select routId from actor where actorID=1)
and actorID>1
order by sortNo
limit 0,1
)
where taskId
2--插入任务历史记录
insert into taskhistory(itemId,actorid,memo,operateBy,createDate)
values()
3--修改项目Item的状态为审批中
update item set state='approveing' where itemId=1"
审批拒绝 "1--update任务列表的步骤ID为第一步的ID
update taskList set actorId=
(select actorId from actor
where routId =(select routId from actor where actorID=1)
order by sortNo
limit 0,1)
where taskId=1
2--插入任务历史记录
insert into taskhistory(itemId,actorid,memo,operateBy,createDate)
values()
3--修改项目Item的状态为审批拒绝
update item set state='jujue' where itemId=1" |
|