起步软件技术论坛-X3

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

【结帖】业务流程.无法正常回退的问题**

[复制链接]
 楼主| 发表于 2007-10-8 15:38:38 | 显示全部楼层
好的.
回复 支持 反对

使用道具 举报

发表于 2008-1-8 10:03:37 | 显示全部楼层
楼主,这个问题在没有解决缺陷的情况下可以绕着解决
解决方案就是一句话:以流转的方式进行回退。
具体举例如下:
1、流程模型改造成如图所示
2、[请假-经理审批的子对象]这个功能中,放一个FlowBroker和一个BizToolBar(因为这里就不能用工作台主界面上的那个流程工具栏了,可以考虑屏蔽它,修改主界面即可),设置它的ToolBarRef为[业务模型系统空间\用户界面基础界面库\工具栏流程],
定义一个标记用于记录是执行了流转还是执行了回退动作,具体如下
--------------------------------------------------
  private
    {private declarations}
    vFlag : Boolean;//标记,true代表执行了流转/false代表执行了回退
---------------------------------------------------
还要放一个ActionList,定义一个流程动作FlowActionOut,设置它的ID为‘流转’。
3、首先接管BizToolBar的流程动作(BeforeAction事件),执行了回退还是流转就要对vFlag进行赋值,具体参考代码如下:
---------------------------------------------------
procedure TMAINFORM.BizToolBar1BeforeAction(Sender: TObject; var Accept: Boolean);
begin
  Case (Sender As TFlowAction).ID of
    BizActnConsts.ActionFlowOut :
    begin
      //流转
      vFlag := True;
    end;
    BizActnConsts.ActionFlowBack :
    begin
      //回退
      vFlag := False;
    end;
  end;
end;
---------------------------------------------------
接着,接管FlowBroker的CalcProcCondition事件,对[条件分支]进行动态赋值(为vFlag的值),具体参考代码如下:
---------------------------------------------------
procedure TMAINFORM.FlowBrokerCalcProcCondition(Sender: TObject; Command: TCalcProcConditionCommand);
begin
  //找到这个条件环节
  if SysUtils.SameText(Command.ProcCondition.ID, 'CONDITIONBRANCH') then
  begin
    Command.Accept := vFlag;
    //确定使用OnCalcProcCondition里的条件
    Command.Handled := True;
  end;
end;
---------------------------------------------------
还要接管FlowBroker的BeforeFlowBack,让它不执行回退。具体参考代码如下:
---------------------------------------------------
procedure TMAINFORM.FlowBrokerBeforeFlowBack(Sender: TObject; Command: TFlowBackCommand);
begin
  Command.Accept := False;
  FlowActionOut.Execute;
end;
---------------------------------------------------
最后,接管FlowBroker的CreateFlowOutFlowTasks事件,给该回退的任务(其实是流转产生的任务)定制标题(加上‘回退’两字儿),具体参考代码如下(一般有几个后续环节就要设置几个):
---------------------------------------------------
procedure TMAINFORM.FlowBrokerCreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
begin
  if not vFlag then
  begin
    Command.FlowTasks[0].Subject := '退回:' + Command.FlowTasks[0].Subject ;
    Command.FlowTasks[1].Subject := '退回:' + Command.FlowTasks[1].Subject ;
    Command.FlowControl.CurrentTask.SaveToDB;
  end;
end;
---------------------------------------------------
[B]{上面的解决方案仅供研究参考}[/B]

snap8.png

63.58 KB, 下载次数: 106

回复 支持 反对

使用道具 举报

发表于 2008-1-8 10:12:06 | 显示全部楼层
该帖结帖,有问题请重新开新帖!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-9 20:02:42 | 显示全部楼层
非常感谢!
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-5 04:39 , Processed in 0.046040 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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