如果需要人员只能启动一次某个流程,当执行完上一次启动的流程实例以后,才可以再次启动流程实例。查找在这个流程的流程实例中是否有当前人员启动的,并且流程实例处于处理中和等待中状态中的任务,如果任务数大于0表示这个人已经启动了流程实例,就不让他再启动了,从而达到某个流程只能让某个人员启动一次的目的。
实现步骤:
1、你需要设置流程的“启动模式”为“处理时”;
2、在入口功能的 BeforFlowOut 的事件上写:
procedure TMainForm.FlowDDLRBeforeFlowOut(…);
var
lOrgURL: TOrgURL;
lTaskList: TObjectList;
lFlowList: TObjectList;
lLoadTaskParam: TLoadTaskParam; //任务参数列表
lLoadFlowParam: TLoadFlowParam; //流程参数列表
I: Integer;
lTask: TTask;
lUnFinishedCount: Integer;
begin
lOrgURL := TOrgURL.Create('XSB', 'XSY', 'ZXX'); //创建组织单元
lTaskList := TObjectList.Create;
lFlowList := TObjectList.Create;
lLoadTaskParam := TLoadTaskParam.Create;
lLoadFlowParam := TLoadFlowParam.Create;
try
lLoadTaskParam.Senders.Add(lOrgURL); //当前操作者
//流程的BizURL
lLoadTaskParam.ProcURLs.Add(Command.FlowControl.Proc.BizClassURL.BizURL.URL);
//流程入口功能的 ID
lLoadTaskParam.ProcUnitIDs.Add('DDLR');
//得到当前操作者所有的该流程的任务列表
Business.Model.Flow.Task.TaskManager.GetTasks(lLoadTaskParam, lTaskList);
for I := 0 to lTaskList.Count - 1 do
begin
lTask := TTask(lTaskList.Items[I]);
lLoadFlowParam.GUIDs.Add(lTask.FlowGUID);
end;
//流程实例状态处于处理中或者等待中
lLoadFlowParam.States := [TFlowState.fsProcessing, TFlowState.fsWaiting];
if lLoadFlowParam.GUIDs.Count > 0 then
begin
Flow.FlowEngine.GetFlows(lLoadFlowParam,lFlowList);
Command.Accept := lFlowList.Count <= 1;
if not Command.Accept then //如果有其他流程启动就不允许流转
Dialogs.ShowMessage('你要启动的流程还没有结束,稍后再启动... ');
end
finally
lFlowList.Free;
lTaskList.Free;
lLoadTaskParam.Free;
lLoadFlowParam.Free;
end;
end; |