需求
设计一个通用的审批系统,模仿钉钉
无论是申请电脑补贴,申请餐补,申请账号,总是可以发现审批流程相关的行为都是差不多的,既经过XXX、YYY、ZZZ各节点同意,审批最终通过。
策略
审批完成后,再通过不同脚本进行发放电脑补贴,发放餐补,告知账号等操作,我们对这些执行不同行为的脚本称为一个个策略。
为了降低审批系统与策略的耦合性,审批系统不应当关心策略的执行过程。
对象关系
观察钉钉的审批系统,易得出以下对象关系
审批单,审批单下有多层审批
每一层审批只要其中一个审批人通过即可
审批单还会有抄送人
如下图,出差、外出、名片印刷....是一个个的审批类型
接着想下去,一个公司这么多的审批类型,总不能让每个员工都能使用任何一种审批类型吧,因此需要 适用部门、适用人
因此,审批类型 1:n 适用部门
审批类型 1:n 审批单
审批单 1:n 审批层级
审批层级 1:n 审批人
审批单 1:n 抄送人
对这些对象粗略的建表(适用人先不做,跟适用部门差不多)
每个审批单会有多个审批的层级,每个层级可能有多个人来审批(只要其中任意一个人审批通过该层级就通过),对某一层级的某审批人称为审批节点
层级这个东西作为审批节点的属性node_level
这样设计能
将 审批人-审批层级-审批单 3个表
简化为 审批节点-审批单 2个表
接着往下想,
现在我想通过审批系统申请团建经费,我想申请100,000元带全公司去旅游,审批要经过我的组长,我的中心负责人,老板一层一层审批,这无可厚非。
接着,我想申请500元跟研发组的同事吃顿大餐,这点小钱如果还要经老板手审批,那同事的肚子都饿瘪了,钱都没到手。
这时候,你就会想要是
1000元以下经费只需要经过组长审批,
5000元以下只需要经过组长-中心负责人审批就好了
因此,我们需要给审批类型加点配置
这个配置限制每一审批层级的触发条件
审批类型表加一个字段门槛去存储json,结构如下
[
{
"node_level":1,
"node_approval_type":0,
"node_user_id":"3",
"node_user_name":"jason"
},
{
"node_level":2,
"node_approval_type":1,
"node_user_id":"",
"node_user_name":"",
"threshold":{
"5":{
"contrast":"gte",
"value":"10000"
},
"6":{
"contrast":"gte",
"value":"10000"
},
"7":{
"contrast":"gte",
"value":"10000"
}
}
},
{
"node_level":3,
"node_approval_type":2,
"node_user_id":"",
"node_user_name":""
}
]
即可通过t_approval_type审批类型表 知道 XX审批类型 YY层 节点生成的条件
但为了让门槛有快照,便将门槛单独创建一个表,单独作为一个表还能简化json的结构
conf_data字段json结构(node_approval_type这个字段是业务要求的 为0时是指定人 为1时是审批发起人的直属部门的领导 为2时是审批发起人的直属部门的上级部门的领导 以此递推 最多为3)
threshold_data(该字段里的值与前端约定 含义)
{
"5":{"contrast":"gte","value":"10000"},
"6":{"contrast":"gte","value":"10000"},
"7":{"contrast":"gte","value":"10000"}
}