例如:根据当前业务数据,查询出对应的任务,并且运行起这个任务,就像任务中心一样
procedure TMainForm.DoGetTaskReceivers(AOrgURLs: TOrgURLs);
var
lOrgUnit: TOrgUnit;
i: Integer;
begin
for i:=0 to SystemCore.TSystemCore.Operator.PositionCount-1 do
begin
//每一个岗位环境下的人员成员
lOrgUnit := SystemCore.TSystemCore.Operator.Positions.PersonMember;
while lOrgUnit <> nil do
begin
case lOrgUnit.OrgKind of
TOrgUnitKind.boOrgan, TOrgUnitKind.boDept:
AOrgURLs.Add(lOrgUnit.ID, '', '');
TOrgUnitKind.boPositionMember:
begin
AOrgURLs.Add(lOrgUnit.Parent.ID, lOrgUnit.ID, '');
AOrgURLs.Add('', lOrgUnit.ID, '');
end;
TOrgUnitKind.boPersonMember:
AOrgURLs.Add(lOrgUnit.Parent.Parent.ID, lOrgUnit.Parent.ID, lOrgUnit.ID);
end;
//找组织单元的父,因为分配到父单元上的任务,也是可以执行的
//例如:直接分配在部门上的任务,部门内的每一个人员成员都可以执行
lOrgUnit := lOrgUnit.Parent;
end;
end;
end;
function TMAINFORM.GetTaskContext(ATask: TTask): TContext;
var
i: Integer;
lTask: TaskLib.TTask;
begin
//需要在项目管理中引入 协同系统\任务\任务库
lTask := TaskLib.TTask.Create;
try
lTask.Assign(ATask);
for i:=0 to ATask.TaskMessages.Count-1 do
begin
//调用任务库中的静态函数FindTaskRunContext,用每一个任务消息查找环境
Result := TaskLib.TTaskServices.FindTaskRunContext(Context, lTask, lTask.TaskMessages);
if Assigned(Result) then
Break;
end;
if not Assigned(Result) then
Result := SystemCore.TSystemCore.Operator.Positions[0].Context;
finally
lTask := nil;
end;
end;
procedure TMainForm.btnRunTaskClick(Sender: TObject);
var
lTaskParam: TLoadTaskParam;
lFlowParam: TLoadFlowParam;
lTasks: TTasks;
lDataSet : TDataSet;
lContext: TContext;
begin
lDataSet := DataSetBroker1.DataSet;
if not lDataSet.Active or lDataSet.Eof then
Exit;
lFlowParam := TLoadFlowParam.Create;
lTaskParam := TLoadTaskParam.Create;
lTasks := TTasks.Create;
try
//根据ProductID,找到对应的流程Guid值
DoGetFlowGUIDs(lDataSet.FieldByName('ProductID').AsString, lFlowParam.GUIDs);
if cbUnFinished.Checked then
lTaskParam.States := Task.SUnFinishedTaskStates;
if cbMyTask.Checked then
DoGetTaskReceivers(lTaskParam.Receivers);
//以给定的条件查询任务(这里给定的条件由lFlowParam给出,根据流程Guid值查询,lTaskParam条件是按照任务状态,只查询出需要处理的任务)
Flow.FlowEngine.GetTasks(lFlowParam, lTaskParam, lTasks);
if lTasks.Count=0 then
raise Exception.Create('没有符合条件的任务!');
lContext := GetTaskContext(lTasks[0]);
lFunc := SystemCore.TSystemCore.FuncManager.RunTask(lContext, lTasks[0]);
finally
lFlowParam.Free;
lTaskParam.Free;
lTasks.Free;
end;
end;
此贴修改历史:
2007-10-29 11:55 提供第一个版本,可以用第一个岗位运行查询出的任务
2007-12-03 15:01 更新了如下内容
1 只检查自己的任务(当然,如果给管理员使用可以不是自己的任务)
2 要检查得到的任务列表不为空
3 如果人员有多个岗位,需要找到合适的岗位环境来运行任务 |