起步软件技术论坛-X3

 找回密码
 立即注册
搜索
查看: 191|回复: 7

【结】怎样修改流程中的任务状态

[复制链接]
发表于 2010-4-16 10:46:42 | 显示全部楼层 |阅读模式
怎样修改流程中的任务状态
回复

使用道具 举报

发表于 2010-4-16 11:02:59 | 显示全部楼层
系统核心库中
函数声明
procedure SetCurrentTaskState(AFlowControl: TFlowControl; AExecutor: TOrgURL);
函数实现
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;
函数调用
1、RunFunc方法中调用
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;
2、runtasks
function TFuncManager.RunTasks(AContext: TContext; ATasks: TList; ATaskMessages: TList;
  AExecutor: TOrgURL): TFunc;
var
  I: Integer;
  lTask: TTask;
  lFuncURL: string;
  lUIDs: TStringList;
  lFlowControl: TFlowControl;
begin
  lTask := ATasks[0] as TTask;
  lFuncURL := GetFuncURLByTask(lTask);
  Assert(lFuncURL <> '', '');

  lUIDs := TStringList.Create;
  try
    for I := 0 to ATasks.Count - 1 do
      lUIDs.Add(GetTaskUniqueID(ATasks[I] as TTask));
    lFlowControl := TFlowControl.Create(AContext);
    try
      lFlowControl.ExecuteTask(ATasks, AExecutor);
      [B]SetCurrentTaskState(lFlowControl, AExecutor);[/B]
      Result := CreateFunc(lFlowControl.Context, lFuncURL);
      try
        lFlowControl.Func := Result;
        InternalRunFunc(Result, '', lUIDs, nil, False);
      except
        Result.Free;
        raise;
      end;
    except
      lFlowControl.Free;
      raise;
    end;
  finally
    lUIDs.Free;
  end;
end;
3、
function TFuncManager.RunTasks(AContext: TContext; ATasks: TList;
  AExecutor: TOrgURL): TFunc;
var
  I: Integer;

  lTask: TTask;
  lFuncURL: string;

  lUIDs: TStringList;
  lFlowControl: TFlowControl;
begin
  lTask := ATasks[0] as TTask;
  lFuncURL := GetFuncURLByTask(lTask);
  if lFuncURL = '' then
    raise Exception.CreateFmt('找不到与任务''%s''对应的业务功能', [lTask.Subject]);

  lUIDs := TStringList.Create;
  try
    for I := 0 to ATasks.Count - 1 do
      lUIDs.Add(GetTaskUniqueID(ATasks[I] as TTask));
    lFlowControl := TFlowControl.Create(AContext);
    try
      lFlowControl.ExecuteTask(ATasks, AExecutor);
      [B]SetCurrentTaskState(lFlowControl, AExecutor);[/B]      
      Result := CreateFunc(lFlowControl.Context, lFuncURL);
      try
        lFlowControl.Func := Result;
        InternalRunFunc(Result, '', lUIDs, nil, False);
      except
        Result.Free;
        raise;
      end;
    except
      lFlowControl.Free;
      raise;
    end;
  finally
    lUIDs.Free;
  end;
end;

因为不清楚楼主那边的环境,所以只能把上面的代码贴出,请楼主对照参考一下吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-16 11:10:13 | 显示全部楼层
x3 3102
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-16 11:59:44 | 显示全部楼层
用2楼方法更改后,
打开一个从未处理过的待办事务,任务表的状太还是“尚未处理”,只是任务消息表的状态变成了“已接收”。
回复 支持 反对

使用道具 举报

发表于 2010-4-16 13:14:06 | 显示全部楼层
此任务 是否 有多个执行者呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-16 13:19:37 | 显示全部楼层
只有一个
回复 支持 反对

使用道具 举报

发表于 2010-4-16 14:17:40 | 显示全部楼层
那有 可能是 修改任务消息表的状态时,没有级联修改任务表的状态。
楼主这样吧,你参考 http://bbs.justep.com/forum.php?mod=viewthread&tid=19485 的5楼,把2楼的代码再加上任务状态的修改。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-4-17 09:15:34 | 显示全部楼层
结了吧
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Justep Inc.

GMT+8, 2025-7-9 16:00 , Processed in 0.042376 second(s), 16 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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