是否遇到过这样的情况。一个订单系统,有这么个类似的审批流程:客户建立订单-->B领导审批-->B部门B1职员确认(其它职员不能确认)。。。。。。
然而,隔一段时间,有可能会演变成:客户建立订单-->A领导审批-->部门B的B2职员确认(其它职员不能确认)。。。
又可能演变成不需要领导审批:客户建立订单-->部门B的B2职员确认(其它职员不能确认)。。。
这种审批功能,很多人是做成hard code的,改的时候改代码。
那么怎样设计个简单的可配置系统?
订单状态表:
角色审批表:
roleId 角色ID
oStatus 目前订单的状态
aprStatus 该角色审批通过的话将使订单到达的状态
rejStatus 该角色审批不通过的话将使订单到达的状态
operate 该审批需要进行什么特别操作,比如这里写 toSendEmail,就是审批后,发送一个email。
账号审批表:
为了操作简便,设计一个视图:
CREATE VIEW [dbo].[vAPR]
as
SELECT a.userId, r.oStatus, r.aprStatus, r.rejStatus,r.operate
FROM TEST_APR_STATUS_ROLE r
INNER JOIN TEST_ROLEACCOUNT ra on ra.roleId = ra.roleId
INNER JOIN TEST_ACCOUNT a ON ra.userId = a.userId
UNION
SELECT s.userId, s.oStatus, s.aprStatus, s.rejStatus,s.operate
FROM TEST_APR_STATUS_ACCOUNT s
left join TEST_ROLEACCOUNT ra on ra.userId = s.userId
left join TEST_APR_STATUS_ROLE r on r.roleId=ra.roleId
where r.roleId is null
那么,登录者只要这么查:
select * from vAPR
where userId=@userId and oStatus=@oStatus
就可以得到他具有哪些审批权了,可以进行审批了。
如果后续审批流节点要改,要添加,要删除都可以通过配置去完成,而不需要重新去编码了。
注意事项:
账号审批表优先级高于角色审批表。
设置审批权时,同一个账号,不能设置两行初始状态相同的。比如角色①,即可以从状态1审批到状态3,又可以从状态1审批到状态2,是不允许的。