起步软件技术论坛-X3

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: 欧诺万德

代码实现流程转发**

[复制链接]
 楼主| 发表于 2007-9-12 14:09:06 | 显示全部楼层
procedure TWDRW.btnMoveClick(Sender: TObject);
var
  lLoadTaskParam: TLoadTaskParam;
  lTasks: TTasks;
  lTask: TTask;
  lContextCurrent :TContextCurrent;
  lFlowControl: TFlowControl;
  lTaskList :TList;
  AID :String;
  lFunc :TFunc;
  i :integer;
begin
  //lFlowControl := TFlowControl.Create();
  lTasks:= TTasks.Create;
  lLoadTaskParam := TLoadTaskParam.Create;
  lContextCurrent := TContextCurrent.Create(Context);
  //lContext :=SYSTEMCORE.TSystemCore.TCommonComponentLibrary.UserSystem.CurrentPosition.Context;
  AID :=DataSetBrokerMyTask.DataSet.FieldByName('FGUID').AsString;
  lTaskList :=TList.Create;
  try
    lLoadTaskParam.GUIDs.Add(AID);
    lLoadTaskParam.IncludeTaskMessage := True;
    lLoadTaskParam.IncludeSenderDisplayName := True;
    lLoadTaskParam.IncludeReceiverParent := True;
    lLoadTaskParam.TaskMessageStates := Task.SProcessingTaskMessageStates;
    //根据条件获取到任务
    Flow.FlowEngine.GetTasks(lLoadTaskParam, lTasks);

    for i :=0 to lTasks.Count-1 do begin
      lTask := lTasks;
      lTaskList.Add(lTask);

      //启动任务,该处会运行功能,我不想运行功能
      if Assigned(lTask) then
        lFunc :=SystemCore.TSystemCore.FuncManager.RunTask(lContextCurrent.OperatorPosition, lTask);
      //获取FlowControl
      lFlowControl := SystemUtils.TContextUtils.GetFlowControl(lFunc.Context);
      //实现转发,该处会弹出流转窗体,我想自己指定转发到某人
   lFlowControl.FlowTransmit(lTaskList);
    end;
  finally
    lLoadTaskParam.Free;
    lTasks.Free;
  end;

end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-9-12 14:11:33 | 显示全部楼层
上面是我写的转发代码,

//启动任务,该处会运行功能,我不想运行功能
      if Assigned(lTask) then
        lFunc :=SystemCore.TSystemCore.FuncManager.RunTask(lContextCurrent.OperatorPosition, lTask);

   //实现转发,该处会弹出流转窗体,我想自己指定转发到某人
   lFlowControl.FlowTransmit(lTaskList);

能不能帮我看看,因为我要实现批量转发
回复 支持 反对

使用道具 举报

发表于 2007-9-13 11:53:50 | 显示全部楼层
其实是两个问题:
1。不需要运行功能即得到FlowControl
2。转发时代码填写执行者,而不需要弹出窗口

先看第一个问题,参考业务模型\系统空间\系统功能\业务流程\流程监控\流程监控库 的代码
static function TFlowMonitorServices.AbortFlow

对于每个Task做以下操作

lFlowControl := TFlowControl.Create(BizSys.GlobalContext);  
try
  lFlowControl.RegisterFlow(AFlow, lTask);      
  lFlowControl.FlowTransmit(nil);
finally
  lFlowControl .Free;
end;


第二个问题,可以在FlowControl注册之前,设置流程的转发规则为不需要转发确认。
然后动态的给转发的执行人赋值。

动态的设置转发规则还得研究下,从来没人这么做过。貌似很复杂。楼主也可以研究下。

不过即使设置了转发规则也需要做比较多的判断,比如,如果转发的人没有某功能的权限,则会转发失败,所以在转发前要对每个任务做判断,是否转发目标具有该权限。没有则需要例外处理。
回复 支持 反对

使用道具 举报

发表于 2007-9-13 11:57:50 | 显示全部楼层
或者第二个问题在设计时在转发规则里面设好。不过这样该环节不使用这个功能时转发也会应用相应的转发规则
回复 支持 反对

使用道具 举报

发表于 2007-9-13 14:54:59 | 显示全部楼层
第二个问题找到了一个办法:
在Create出来的FlowControl里面注册一个FlowBroker,在OnCreateFlowTransmitFlowTasks事件中写入你需要的处理问题。

IFlowBroker:=TFlowBroker.Create(nil);
IFlowBroker.OnCreateFlowTransmitFlowTasks:=YouFunc;
FlowControl.RegisterFlowBroker(IFlowBroker);

procedure YouFunc(Sender: Business.System.TObject; Command: TFlowTransmitCommand) ;
begin
  Command.UserConfirm:=false;
  Command.FlowTasks[0].Excuter:=UserYouDesigned;
end;
回复 支持 反对

使用道具 举报

发表于 2007-9-18 09:15:36 | 显示全部楼层
楼主,能结贴了吗?不反馈我结了
回复 支持 反对

使用道具 举报

发表于 2007-9-21 09:10:50 | 显示全部楼层
结,有问题请重新开帖
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-6-28 05:51 , Processed in 0.038082 second(s), 14 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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