起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 3161|回复: 12

[分享]流程揭密1--流程与数据

[复制链接]
发表于 2007-11-16 14:58:05 | 显示全部楼层 |阅读模式
用Studio定义了流程模型(流程模型跟其他模型一起存放在虚拟文件系统中)以后,在运行时按照流程模型,创建出流程实例(流程实例存放在流程表等几张表中),所有流程的执行情况都是在这几张表中存储,这些数据也叫流程控制数据。流程中涉及的功能中的数据叫做流程业务数据。

流程控制数据保存在系统数据库的以下几张表中:
  流程表:记录流程实例对应的流程模型BizURL、创建时间,状态等流程实例有关信息。
  流程ID表:记录流程实例对应的流程ID值(流程字段的值)
  任务表:记录流程实例中创建的每一个任务的创建时间、状态、提交人信息等,一个流程实例对应多个任务,凡是经过的环节至少有一条任务,一个环节可能对应多条任务
  任务消息表:记录任务的处理人信息,一个任务对应一个或者多个任务消息
  任务业务数据表:记录每个任务对应业务数据

流程 1:m 任务
流程 1:m 流程ID
任务 1:m 任务消息
任务 1:m 任务业务数据表


名词解释:
  流程控制数据:记录流程的执行情况,以及流程当前环节的执行状态等信息,保存在系统数据库的 流程表 流程ID表 任务表 任务消息表 任务业务数据表 等。
  流程业务数据:随着流程实例在流程中流动的数据,例如订单审批流程中的订单数据。
回复

使用道具 举报

 楼主| 发表于 2007-11-16 15:19:32 | 显示全部楼层
在流程入口环节上,创建流程实例时候,会在流程表中增加一条记录,记录这个流程实例
在流程环境下,查找每一个子环境,找到流程字段,在流程ID表中增加一条记录,记录下来流程字段的值

如果流程的启动规则是处理时,增加一条任务,提交人就是当前操作者,增加一条任务消息,处理人是当前操作者

如果流程的启动规则是流转时,增加一条已完成的任务,提交人是当前操作者,为这条任务增加一条已完成的任务消息,处理人是当前操作者,然后根据下一个环节的执行者,为下一个环节生成一条或者多条任务,为每一个任务生成一条或者多条任务消息
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-16 15:29:12 | 显示全部楼层
流程的中间环节上,在流程环境会增加业务语义策略,条件是
流程字段 = 流程ID

这样,流程中的每一个环节上自然就只显示 流程ID 对应的数据了
当然,如果信息的隔离级是全局\人员\岗位,那么这个信息因为不在流程环境中,自然不会按照上面的条件来过滤数据,因此,如果定义了这样的隔离级,就要自己来过滤业务数据了。

关于流程中的业务数据传递更通俗的讲法,请参考 http://bbs.justep.com/forum.php?mod=viewthread&tid=2354
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-19 09:08:28 | 显示全部楼层

代码修改流程控制数据

如果要改变流程控制,比如修改流程状态、比如增加任务执行者等,都可以通过直接操作系统数据库这些表来完成,强烈建议不直接操作系统数据库中的数据。

操作流程对象、任务对象的方式是推荐的方式,以下举例来看看如何操作任务对象和任务消息对象。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-19 09:28:01 | 显示全部楼层
流程如下图所示,在 业务部审批 策划部审批 财务部审批 这三个并行环节上,如果其中一个环节回退了,就把其他两个环节也取消掉,等再次流转过来再处理,免得多次处理浪费时间。

-- vvvvvvvvvvvv -- alang 2008-05-28
可以不用代码,在这三个并行的环节上定义回退规则,设置“取消同步任务”为True,就可以达到以上效果
-- ^^^^^^^^^^^ -- alang 2008-05-28

可以在这三个环节回退时候(AfterFlowBack),找到属于这三个环节的任务和任务消息,置状态为取消状态
procedure TMainForm.FlowBroker1AfterFlowBack(Sender: TObject; Command: TFlowBackCommand);
var
  i, j: Integer;
  lTask: TTask;
begin
  for i:=0 to FlowBroker1.FlowControl.Flow.Tasks.Count-1 do
  begin
    lTask := FlowBroker1.FlowControl.Flow.Tasks;
    if ((lTask.ProcUnitID = 'QXRWHJ')
      or (lTask.ProcUnitID='QXRWHJ1')
      or (lTask.ProcUnitID='QXRWHJ2'))
      and (lTask.State in Task.SUnFinishedTaskStates) then
    begin
      for j := 0 to lTask.TaskMessages.Count-1 do
        if lTask.TaskMessages[j].State in Task.SUnFinishedTaskMessageStates then
          lTask.TaskMessages[j].State := TTaskMessageState.tmsCanceled;

      lTask.State := TTaskState.tsCanceled;
      lTask.SaveToDB
    end;
  end;
end;
注意:最后一定要执行SaveToDB才可以,否则这些修改没有提交到数据库。

1.jpg

45.47 KB, 下载次数: 1268

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-19 09:35:09 | 显示全部楼层
以上是在流程环节中,直接用流程控制FlowControl得到任务和任务消息的,也可以通过FlowEngine搜索需要的任务,然后修改,参考 http://bbs.justep.com/forum.php?mod=viewthread&tid=18984
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-19 09:58:43 | 显示全部楼层

多套X3系统之间流程的串接

如果在不同的地点,部署了多套X3系统,类似总部分支机构模式的,那么肯定会有分支机构的流程需要传递到总部的,总部处理之后,又需要传递到分支机构继续处理,象这样的模式流程的传递就可以用 数据库之间的数据同步来解决,只要组织机构数据和流程控制数据在不同的数据库之间做了同步就可以了。
简单的说,分支机构中保存完整的组织机构树,分支机构的流程控制数据与总部的流程控制数据做同步,这样流转给总部的任务和任务消息,就可以在总部的系统数据库中看到,总部的人就会处理了,处理以后再同步回来就可以了。
数据库数据的同步可以采用数据库自身的工具,象SQL Server、Oracle数据库等都有这样的同步工具。如果总部和分支机构采用不同的数据库,就不好用数据库自身的工具了,我们提供了一个另外工具,数据交换平台,可以解决跨数据库的数据同步问题。
回复 支持 反对

使用道具 举报

发表于 2007-11-19 12:46:49 | 显示全部楼层
支持!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-21 14:36:46 | 显示全部楼层

任务中心中,用户的管理权限范围内的任务数据的定位

在任务中心中,可以看到
自己的待办任务
自己的提交任务
下属的待办任务
下属的提交任务

提交任务是看任务表,任务提交人信息在任务表中
待办任务是看任务消息表,任务处理人的信息在任务消息表中

看自己的任务很简单了,只要看提交人或者处理人是自己就可以了
但是如果是下属,那么如果下属是部门,那么这个部门每一个人员成员的待办任务或者提交任务都需要查询出来,如果都列出来就很多了,这里有一个小技巧,BizURL
在任务表、任务消息表中都冗余存储了提交人或者处理人的BizURL,只要找到当前用户的管理权限对应的BizURL,在SQL语句中用Like '部门URL%' 就可以了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-21 14:40:40 | 显示全部楼层
例如:总经理王五在总经办部门下,分配了管理权限是阳光集团
那么,在任务表中 FSORGURL like 'Org:\ROOT\YGJT.ogn%'
在任务消息表中 FRORGURL like 'Org:\ROOT\YGJT.ogn%'
的数据就都是王五的管理权限范围内可以看到的数据

如果王五有多个管理权限,那么上面得到的条件就是多个条件的or关系了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2024-12-23 00:05 , Processed in 0.046188 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表