
项目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"
1、用户表用户ID
用户角色(1:业务员,2:经理,3:总经理,4:总裁。。。)
用户姓名
2、客户表
客户ID
客户名称
3、业务员客户表
用户ID(其实就是用户表里的用户角色为业务员的用户)
客户ID
4、业务员移交客户申请表
申请人用户ID
申请移交的客户ID
审批状态(0:审批中,1:已审批。。。。)
移交后用户ID
5、请假表
用户ID
请假开始时间
请假结束时间
请假类别(1:事假、2:病假、3:婚假。。。。。)
审批状态(0:审批中,1:已审批。。。。)
我举一个例子:有的OA系统是要公司客户自己有服务器,然后装到客户的服务器上。可是客户嫌麻烦,所以我想将OA系统(PHP+Mysql)放在自己的服务器上,让公司客户及其员工来注册使用。那么问题来了,原来在客户自己的服务器上数据库也就十几张表,但都放到我的服务器上,每注册一个公司就得增加十几张表,那如果有一万家公司注册数据库不得有几十万张表?跟楼主一样的问题,有一些老牌厂商早就给出来完美答案了,比如华为、天翎都有过类似的问题,这些企业提出的解决方案就很不错,就针对上面的问题,最简单的办法是给每张表加个实例ID,一个公司对应一个实例ID,然后在你的MVC架构中跟DB最近的这一层加个拦截器,每个SQL查询都自动带上实例ID,这样不用对代码做很大改动。后期再根据需要优化,哪些公司合用一张表,哪些单独占用一张表甚至一个数据库,总之具体问题具体对待,需要在运营的过程中根据用户量和业务情况来分析采取对策。欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)