如何实现OA系统的自定议审批流程的数据库设计
我举一个例子:有的OA系统是要公司客户自己有服务器,然后装到客户的服务器上。可是客户嫌麻烦,所以我想将OA系统(PHP+Mysql)放在自己的服务器上,让公司客户及其员工来注册使用。那么问题来了,原来在客户自己的服务器上数据库也就十几张表,但都放到我的服务器上,每注册一个公司就得增加十几张表,那如果有一万家公司注册数据库不得有几十万张表?跟楼主一样的问题,有一些老牌厂商早就给出来完美答案了,比如华为、天翎都有过类似的问题,这些企业提出的解决方案就很不错,就针对上面的问题,最简单的办法是给每张表加个实例ID,一个公司对应一个实例ID,然后在你的MVC架构中跟DB最近的这一层加个拦截器,每个SQL查询都自动带上实例ID,这样不用对代码做很大改动。后期再根据需要优化,哪些公司合用一张表,哪些单独占用一张表甚至一个数据库,总之具体问题具体对待,需要在运营的过程中根据用户量和业务情况来分析采取对策。
1、用户表
用户ID
用户角色(1:业务员,2:经理,3:总经理,4:总裁。。。)
用户姓名
2、客户表
客户ID
客户名称
3、业务员客户表
用户ID(其实就是用户表里的用户角色为业务员的用户)
客户ID
4、业务员移交客户申请表
申请人用户ID
申请移交的客户ID
审批状态(0:审批中,1:已审批。。。。)
移交后用户ID
5、请假表
用户ID
请假开始时间
请假结束时间
请假类别(1:事假、2:病假、3:婚假。。。。。)
审批状态(0:审批中,1:已审批。。。。)
6、周报表
用户ID
周报月份
审批状态(0:临时保存,1:已提交,2:经理已审批,3:总经理已审批。。。。)
其实具体控制,你要在程序里进行流程控制,并没有你说的那种自动控制,不过这样的表结构设计是可以满足你后期不用再动数据库,只用修改业务流程即可
一、建立完善的OA审批流程管理约定。
电子化的OA流程审批必须和企业的管理制度相结合,这样网上审批才能得以实施和执行。那么当审批人少有登录OA的习惯,甚至也不习惯于使用电子邮箱等办公交流工具。
这时候,其实所有的技术手段都已经失效了,目前恐怕没有更高级的提醒方式,以将提醒消息及时送达了。除非使用非常规方式(例如使用电话催办)。可见,这已不是技术问题,而是企业管理上问题了。
二、启用各种OA流程审批的提醒。
开启OA办公平台的消息提醒功能,OA系统中的消息提醒、即时通讯软件提醒、短信提醒、邮件提醒等,可以根据不同提醒对象的特点以及是OA在线等系统自动进行选择。当一个审批节点接收到上一级的审批文件时,首先审批人会收到系统自动发送来的相关提醒消息。
当审批人OA在线或登录OA时,自然会看到提醒消息,从而做出审批操作。而未做出审批操作的流程单,始终会存储在“待审待签”标签中,再以代签文件量的数字加以提醒,确保审批人不会忘记存在未存未审批单件。
基本概念
办公自动化(office Automation,OA)是在设备、通信逐步实现自动化的基础上,通过管理信息系统(Management Information System,MIS)的发展而兴起的一门综合性技术。它是将计算机网络与现代化办公相结合的一种新型办公方式。
它不仅可以实现办公事务的自动化处理,而且可以极大地提高个人或者群体办公事务的工作效率,为企业或部门机关的管理与决策提供科学的依据。在办公自动化管理领域,如果说硬件技术是其环境保障,则软件技术就是办公自动化各项功能得以顺利实现的灵魂所在。
自20世纪70年代,从单机处理开始,例如,采用微型机处理文字,进而完成文件归档、记录指示、电话自动记录等任务。
以上内容参考:百度百科-办公自动化
i. 需要根据业务规定,填写流程定义。(单表的增加操作)
ii. 数据流转:首先,后台管理员登录流程管理模块,点击流程管理,选择“添加流程定义”,填写相关的流程定义的表单,选择流程定义的类型,(比如:请假申请、资产申请、报销申请等。)当前请假模块中,我们默认只有请假申请。添加审批人,最后提交该表单,交给后台的action。Action首先校验所有的审批人是否合法(例如,审批人是否具备当前功能模块的权限),action再依赖Service完成先关的业务处理,service中,可以直接调用DAO,完成数据的持久,即:将数据,添加到流程定义表中。
b) 取得待审任务
i. 用户登录系统,会发起一个请求,查看是否有待审任务。或者,用户自行去点击“待审任务”按钮。此时,后台接收到当前请求,从session中获得当前用户的id,到任务表中查询相关的请假单的id。将所有的id,通过持久层取出来,展示到相关页面上。
c)审批请假单
i. 首先取得待审任务,选择一条申请单,点击“审批”按钮,填写审批意见,并且选择同意或者拒绝,提交表单到action中,调用service将当前审批意见保存到数据库。
ii. 接着:查询流程定义中,是否有下一个审批人。如果有,则修改申请表中的状态为待“下个人”审批。如果没有下一个人审批,则修改状态为结束。
iii. 然后:如果还有下个审批人,将先关的任务修改当前审批人字段,修改成下一个审批人。如果没有,则删除相关的任务数据。
项目ID(ItemId) 项目描述(ItemName) 流程ID (RoutID) 申请人ID (ApplyUserID) 状态(State) 项目类型(ItemType)
1 郑州出差借款 1 1 借款单
2郑州出差报销 3 1报销单 这里的项目,是泛指,可以是公文,借款单,报销单等等需要流转的数据.
任务列表(TaskList)
任务ID(taskId) 项目ID (itemId) 步骤ID (actorId) 状态(state) 版本(version) 11 1 检出 100
2 23 检出 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 报销流程 11草稿
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 t1join 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,12--插入任务列表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"