起步软件技术论坛-X3

 找回密码
 立即注册
搜索
楼主: xhong

任务回收

[复制链接]
发表于 2010-6-24 16:16:18 | 显示全部楼层
呵呵,如果确实按你说的这样的话,那就是3012版本的缺陷了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-24 16:24:44 | 显示全部楼层
嗯,我刚初始化了一个新库,3012随时可以回退,这个大bug啊。。。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-24 16:25:45 | 显示全部楼层
现在有新的稳定版本没,我们考虑一下是否升级了
回复 支持 反对

使用道具 举报

发表于 2010-6-24 16:26:37 | 显示全部楼层
可以升级到3109
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-25 09:42:35 | 显示全部楼层
我们综合考虑了一下,升级能解决B环节处理后A环节还能回收的这个致命的Bug,但是
无论升级与否,其实都是需要回收后恢复一些AfterFlowOut里执行的逻辑的
现在我2个思路你们给些意见:
1、能不能打开任务消息后知道当前任务消息是一个回收回来的?如果可以,就在这个时候处理逻辑
2、如果1不能,TaskFetchBack方法里如何得到当前流程ID、环节ID和流程字段的值,请给些代码示范,这个我们不会请支持一下

补充:在3109版本中,如果B环节打开过任务,A还能回收吗;如果B环节是主从,修改了从表数据,A还能回收吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-25 09:55:28 | 显示全部楼层
3109 what's new 发个,我查查是哪个版本后修正了回收这个bug,如果没改过那3109也还是有这个bug
回复 支持 反对

使用道具 举报

发表于 2010-6-25 10:31:35 | 显示全部楼层
关于回收 可以确定3109版本是好的
对于你的3012版本,你可以 打开 业务模型\系统空间\系统运行库\系统核心库 参考下面的处理试试是否可以解决。(因为升级的话总是有一定的风险和一定的工作量的)

增加函数
procedure TFuncManager.SetCurrentTaskState(AFlowControl: TFlowControl; AExecutor: TOrgURL);
var
  I: Integer;
begin
  for I := 0 to AFlowControl.CurrentTask.TaskMessages.Count -1 do
    with AFlowControl.CurrentTask.TaskMessages[I] do
    if SysUtils.SameText(ReceiverDeptID, AExecutor.DeptID)
      and SysUtils.SameText(ReceiverPositionID, AExecutor.PositionID)
      and SysUtils.SameText(ReceiverID, AExecutor.PersonID) then
      begin
        State := TTaskMessageState.tmsReceived;
        AFlowControl.CurrentTask.SaveToDB;
        Break;
      end;
end;

调用
function TFuncManager.RunFunc(AContext: TContext; AFuncItem: TOperatorFuncItem; const AParams, AUniqueID: string; BeforeRunFunc: TFuncNotifyEvent; Modal: Boolean): TFunc;
const
  ErrMsg = '当前操作者不具备运行该功能的权限,请向管理员询问';
var
  S: string;
  lRealFuncURL: TBizURL;
  lPosition: TOperatorPosition;
  lProcURL: TBizURL;
  lProc: TProc;
  lEntryID: string;
  lFlowControl: TFlowControl;
  lOrgURL: TOrgURL;
  I: Integer;
begin
  // 这里运行支持扩展空间的机制
  // 流程使用扩展空间的规则:流程需要扩展,并且入口功能也需要扩展

  lRealFuncURL := BizSys.ObjectInfoFromURL(BizSys.BizService.GetFixURL(AFuncItem.FuncURL.URL)).BizURL;

  S := AUniqueID;
  if S = '' then
    S := GetFuncUniqueID(AContext, lRealFuncURL.URL, AParams);

  Result := FindRunning(S);
  if Result <> nil then
  begin
    ActivateFunc(Result);
    Exit;
  end;

  if not AFuncItem.IsProcEntry then
    Result := InternalRunFunc(AContext, lRealFuncURL.URL, AParams, S, BeforeRunFunc, Modal)
  else
  begin
    // 流程这里采取了扩展空间的机制
    lPosition := TContextUtils.GetOperatorPosition(AContext);
    lProcURL := TBizURL.Create;
    try
      lProcURL.URL := BizSys.BizService.GetFixURL(AFuncItem.ProcURL.URL);
      lProc := TSystemCore.GetBizObjectEx(AContext, lProcURL.URL, '') as TProc;
      lFlowControl := TFlowControl.Create(AContext);
      try
        lEntryID := lProc.GetEntryUnitByFuncURL(lRealFuncURL).ID;

        // 不能使用AFuncItem的OrgURL,因为它不一定是人员成员
        lOrgURL := TOrgURL.Create(lPosition.PositionMember.Parent.ID,
          lPosition.PositionMember.ID, lPosition.PersonMember.ID);
        try
          lFlowControl.ExecuteFlow(lProcURL, lEntryID, lOrgURL);
         [B] SetCurrentTaskState(lFlowControl, lOrgURL);[/B]         finally
          lOrgURL.Free;
        end;

        Result := CreateFunc(lFlowControl.Context, lRealFuncURL.URL);
        try
          lFlowControl.Func := Result;
          InternalRunFunc(Result, AParams, S, BeforeRunFunc, Modal);
        except
          Result.Free;
          raise;
        end;
      except
        lFlowControl.Free;
        raise;
      end;
    finally
      lProcURL.Free;
    end;
  end;
end;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-25 10:40:26 | 显示全部楼层
谢谢先呵呵,我试试去啊
你先回复一下我其他的几个问题,问了好几个
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-6-25 11:35:54 | 显示全部楼层
结果来了,还有问题:
我修改代码后在SetCurrentTaskState(lFlowControl, lOrgURL);打了断点,发现
A环节进入时候触发了一次,但是for循环也并没有执行,之后就再也不会触发了
所以回收那个还是和以前一样
请再看看

补充:function TFuncManager.RunFunc(AContext: TContext; AFuncItem: TOperatorFuncItem; const AParams, AUniqueID: string; BeforeRunFunc: TFuncNotifyEvent; Modal: Boolean): TFunc;

这个和我手里3012就添加一个SetCurrentTaskState是吧,我怎么看你的var里有个i但也没用到呢
回复 支持 反对

使用道具 举报

发表于 2010-6-25 11:35:57 | 显示全部楼层
现在我2个思路你们给些意见:
1、能不能打开任务消息后知道当前任务消息是一个回收回来的?如果可以,就在这个时候处理逻辑
2、如果1不能,TaskFetchBack方法里如何得到当前流程ID、环节ID和流程字段的值,请给些代码示范,这个我们不会请支持一下
-----------------------------------------------------------------
1、我觉得麻烦。因为回收的机制是把之前的任务置成回收,然后重新产生一个任务的方式
2、这里是 一个 Task,你可以看看它的属性,应该有环节id、流程guid之类的。
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-8 10:44 , Processed in 0.041034 second(s), 13 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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