起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 261|回复: 10

【搞定】急!奇怪的问题:为什么流程一直自己流转到某个用户?**

[复制链接]
发表于 2007-12-13 18:42:39 | 显示全部楼层 |阅读模式
我在 流程A 的环节X的执行者规则中设置的执行者是 OrgKey('DDB', 'LDXZ', 'DDBSJ')
可是流程流转后,一直都只是DDB这个用户的工作台中有任务出现,DDBSJ都是空的。
DDB和DDBSJ处于同一部门,同一岗位下,拥有的功能权限,数据权限都是一样的。

把流程的执行者清空了。用写代码来流转,断点测试确实有执行到这段代码。
可是照样也只有DDB这个用户的工作台有这条任务。
  lddb='DDBSJ';
  lFlowTask := Command.FlowTasks.FindFlowTask('SHHYJDMK');
  lRange:=sysutils.format(CRange,['DDB','LDXZ',lddb]);
  if lFlowTask <> nil then
  begin
    lFlowTask.ExecutorMustBeFuncOwner:=false;
    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;
    lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember];
    lFlowTask.ExecutorRange:=lRange;
  end;  

真是超级不解,这可能是什么原因?
回复

使用道具 举报

 楼主| 发表于 2007-12-14 09:05:57 | 显示全部楼层
现在流程的[发改委进度审核]环节可以正常流转到指定的DDBSJ,初始环节[进度上报]死也只转到DDB。

[进度上报]环节的流程事件:
procedure TYJDSB.flbCreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
const CRange:string='OrgKey(''%s'', ''%s'', ''%s'')';
var
  lFlowTask:TFlowTask;
  lRange,lSHR,lDept,lPsn,lPsm,lXMID,lSHR2,lDept2,lPsn2,lPsm2,lTaskTitle:String;
  lddb,lxmjb:string;
  ls:TstringList;
  i:integer;
begin
  inherited;
  ls:=TstringList.create;
  lXMID:=dsb_XMXX.dataset.fieldByName('XM_ID').asstring;
  lSHR:=SysFuncLib.TFunDDB.getSHR(lXMID,2);
  lSHR2:=SysFuncLib.TFunDDB.getSHR(lXMID,1);
  try
    ls.Delimiter:='-';
    ls.DelimitedText :=lSHR;
    if ls.count=3 then
    begin
      lDept:=ls.strings[2];
      lPsn:=ls.strings[1];
      lPsm:=ls.strings[0];
    end else
      raise exception.create('项目信息中未填写相关审核人,不能提交!');
    ls.DelimitedText :=lSHR2;
    if ls.count=3 then
    begin
      lDept2:=ls.strings[2];
      lPsn2:=ls.strings[1];
      lPsm2:=ls.strings[0];
    end else
      raise exception.create('项目信息中未填写相关审核人,不能提交!');
  finally
    ls.free;
  end;
  lRange:=sysutils.format(CRange,[lDept,lPsn,lPsm]);
  lFlowTask := Command.FlowTasks.FindFlowTask('ZGBMSH');
  if lFlowTask <> nil then
  begin
    lFlowTask.ExecutorMustBeFuncOwner:=false;       //执行者必须是功能拥有者
    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;  //执行者范围 1个
    lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember]; //执行者类型   人员成员
    lFlowTask.ExecutorRange:=lRange; //默认执行者范围
  end;
  //发改委进度审核 20070424 xh
   lRange:=sysutils.format(CRange,[lDept2,lPsn2,lPsm2]);
  lFlowTask := Command.FlowTasks.FindFlowTask('FGWSH');
  if lFlowTask <> nil then
  begin
    lFlowTask.ExecutorMustBeFuncOwner:=false;
    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;
    lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember];
    lFlowTask.ExecutorRange:=lRange;
  end;
  //带动办
  lxmjb:=dsb_XMXX.dataset.fieldByName('XMJB_ID').asstring;
  if lxmjb='' then
    raise exception.create('项目信息中未填写项目级别,无对应的带动办审核人,不能提交!');
  lddb:=SysFuncLib.TFunDDB.getDDBFromXMJB(lxmjb); //OrgKey('DDB', 'LDXZ', 'DDB')
  if lddb='' then
    raise exception.create('项目信息中填写的项目级别无对应的带动办审核人,不能提交!');
  lFlowTask := Command.FlowTasks.FindFlowTask('SHHYJDMK');
  lRange:=sysutils.format(CRange,['DDB','LDXZ',lddb]);
  if lFlowTask <> nil then
  begin
    lFlowTask.ExecutorMustBeFuncOwner:=false;
    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;
    lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember];
    lFlowTask.ExecutorRange:=lRange;
  end;
  //先更新SBR,SBSJ
  //更新审核状态
  with dsb_YJD.dataset do
  begin
    edit;
    //上报时间
    fieldByName('SBSJ').asDateTime:=business.Data.SysSrv.SysService.Time;
    fieldByName('SBR').asString:=SYSFUNCLIB.TFUNJustep.GetCurrentLoginUserID(context);
    post;
    applyUpdates(false);
  end;
   //[承办单位-上报人 上报 "小项目名称" 某年某月月进度] (某责任单位已审) (某发改委业务处已审) 业为上报时间
  //主管和发改委
  lTaskTitle:=SYSFUNCLIB.TFunDDB.getYSBProcTaskTitle(context,TSqldataset(ib.info.datasetByID['LSCD']),dsb_yjd.dataset.fieldByName('ID').asstring,'JDSB');
  for I:=0 to Command.FlowTasks.Count-1 do
  begin
    Command.FlowTasks[I].Subject :=lTaskTitle;
    //'任务:[项目'+getXMMC+': ' + Command.FlowTasks[I].ProcUnit.Proc.DisplayName + ' - ' + Command.FlowTasks[I].ProcUnit.DisplayName + ']被' + SYSFUNCLIB.TFUNJUSTEP.GetCurrentLoginUser(context)+ '提交';
  end;
end;

[发改委进度审核]环节的流程事件:
procedure TXMJDSH.FlowBroker1CreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
const CRange:string='OrgKey(''%s'', ''%s'', ''%s'')';
var
  lFlowTask:TFlowTask;
  lRange,lSHR,lDept,lPsn,lPsm,lXMID,lProcID,lTaskTitle,lxmjb,lddb:String;
  ls:TstringList;
  i:integer;
begin
  inherited;
  lProcID:=flowBroker1.FlowControl.Proc.ID;

  //重点建设:设置带动办环节
  if sysutils.sameText(lProcID,'DSHLC3') then
  begin
    lxmjb:=dsb_xmjd.dataset.fieldByName('XMJB_ID').asstring;
    lddb:=SysFuncLib.TFunDDB.getDDBFromXMJB(lxmjb);
    fReceiver:=lddb;
    //带动办
    lFlowTask := Command.FlowTasks.FindFlowTask('SHHYJDMK');
    lRange:=sysutils.format(CRange,['DDB','LDXZ',lddb]);
    if lFlowTask <> nil then
    begin
      lFlowTask.ExecutorMustBeFuncOwner:=false;
      lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;
      lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember];
      lFlowTask.ExecutorRange:=lRange;
    end;
  end;

  lTaskTitle:=SYSFUNCLIB.TFunDDB.getYSBProcTaskTitle(context,TSqldataset(Info_JDSH.info.datasetByID['LSCD']),dsb_xmjd.dataset.fieldByName('ID').asstring,'ZDQQJDSB');
  for I:=0 to  Command.FlowTasks.Count-1 do
    Command.FlowTasks[I].Subject := lTaskTitle; //'任务:[ 项目'+dsb_xmjd.dataset.fieldByName('xmmc').asString+': ' + Command.FlowTasks[I].ProcUnit.Proc.DisplayName + ' - ' + Command.FlowTasks[I].ProcUnit.DisplayName + ']被' + SYSFUNCLIB.TFUNJUSTEP.GetCurrentLoginUser(context)+ '提交';
end;

proc.gif

19.61 KB, 下载次数: 150

回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-14 10:20:51 | 显示全部楼层
顶下
回复 支持 反对

使用道具 举报

发表于 2007-12-14 12:05:40 | 显示全部楼层
这么多代码,只能单步跟踪调试看看了,纯看代码,累死也看不出来了
你可以在这个函数最后看看每一个flowtask是不是跟你预想的一样
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-14 12:38:12 | 显示全部楼层
我在这边[上报]环节的窗体中设置断点后,lFlowTask.ExecutorRange是ddbsj,可流转后还是ddb收到。

  lFlowTask := Command.FlowTasks.FindFlowTask('SHHYJDMK');
  lRange:=sysutils.format(CRange,['DDB','LDXZ',lddb]);
  if lFlowTask <> nil then
  begin
    lFlowTask.ExecutorMustBeFuncOwner:=false;
    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;
    lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember];
    lFlowTask.ExecutorRange:=lRange;
  end;
回复 支持 反对

使用道具 举报

发表于 2007-12-14 13:31:54 | 显示全部楼层
小小问一句啊,您为什么不直接对Executors进行赋值,要对ExecutorRange赋值呢?搞得很复杂啊,这么多代码,还都是涉及到规则的,检查起来太恐怖了吧。您直接把Excutors.clear,然后添加上您希望的执行者不就可以了吗?
回复 支持 反对

使用道具 举报

发表于 2007-12-14 13:43:16 | 显示全部楼层
楼主的平台版本号?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-14 14:16:46 | 显示全部楼层
版本号:
3.0.6.2809
3.0.6.7

小小问一句啊,您为什么不直接对Executors进行赋值,要对ExecutorRange赋值呢?搞得很复杂啊,这么多代码,还都是涉及到规则的,检查起来太恐怖了吧。您直接把Excutors.clear,然后添加上您希望的执行者不就可以了吗?
==
其实仔细看
[进度上报]环节的流程事件:
procedure TYJDSB.flbCreateFlowOutFlowTasks(Sender: TObject; Command: TFlowOutCommand);
就会发现里面只是对 [进度上报]环节所要流转的3个不同环节设置执行者。
里面的3段代码是差不多的。
基本上都是这种形式:
lFlowTask := Command.FlowTasks.FindFlowTask('SHHYJDMK');
  lRange:=sysutils.format(CRange,['DDB','LDXZ',lddb]);
  if lFlowTask <> nil then
  begin
    lFlowTask.ExecutorMustBeFuncOwner:=false;
    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;
    lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember];
    lFlowTask.ExecutorRange:=lRange;  //主要是这个的设置。。
  end;

lFlowTask.ExecutorRange:= OrgKey('DDB', 'LDXZ', 'DDBSJ')
这肯定是没错的吧。


现在的问题就是:
我在
procedure TYJDSB.flbAfterFlowOut(Sender: TObject; Command: TFlowOutCommand);
事件中断点都可以得到:
Command.FlowTasks.FindFlowTask('SHHYJDMK').executorrange=OrgKey('DDB', 'LDXZ', 'DDBSJ')

可结果是: 'DDBSJ' 登录后,工作台却是没任务的? 而偏偏跑到ddb那边去。我实在搞不懂哪冒出的执行者是ddb??
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-14 14:34:42 | 显示全部楼层
按照 yancm 的提示,我写成这样是可以了: 谢谢
  if lFlowTask <> nil then
  begin
    lFlowTask.ExecutorMustBeFuncOwner:=false;
    lFlowTask.ExecutorAmount:=TTaskExecutorAmount.teaOne;
    lFlowTask.ExecutorKinds := [TTaskExecutorKind.ekPersonMember];
  //.......用executors可以
    lFlowTask.Executors.clear;
     lOrgURL:=TOrgURL.Create('DDB','LDXZ','DDBSJ');
    lFlowTask.Executors.add(lOrgURL);
  end;

不过还是很费解:
但是用executorrange就是不行? 这会是什么原因? orgkey和orgurl指的是同一个人啊?
而且只有[上报] 这个环节这样写不行,[发改委]环节都是这样的写法,ddbsj也可以收到。
lFlowTask.executorrange=OrgKey('DDB', 'LDXZ', 'DDBSJ')
回复 支持 反对

使用道具 举报

发表于 2007-12-14 16:57:24 | 显示全部楼层
excutorrange是执行者范围,只限定了执行者必须在这个范围内,没有指定具体的执行者。

至于那个ddb是怎么出来的捏?怀疑是默认添加上次执行者给搞乱了。可以把流程默认执行者表清一下,或者去掉这个自动添加上次执行者的功能。
http://bbs.justep.com/forum.php?mod=viewthread&tid=18672
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-2 09:00 , Processed in 0.045080 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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