|
发表于 2008-9-25 15:25:52
|
显示全部楼层
做了个例子,楼主试试:
unit FlowManagerForm;
interface
uses
Business.System, Business.Model, Business.Forms, Business.Data,
Business.Model.Flow, Business.Model.Org;
type
TFlowManagerForm = class(TForm)
FuncBroker: TFuncBroker;
InfoBrokerFLOWMANAGERINFO: TInfoBroker;
ControlBar: TControlBar;
DataNavigator: TDataNavigator;
DocViewBar: TDocViewBar;
Panel: TPanel;
DocViewFLOWMANAGERINFO_FLOWVIEW: TDocView;
ToolBar1: TToolBar;
tbFlowBack: TToolButton;
ToolButton2: TToolButton;
tbFlowOut: TToolButton;
ToolButton4: TToolButton;
dsbFlow: TDataSetBroker;
dsbTask: TDataSetBroker;
dsbTaskMessage: TDataSetBroker;
FlowBroker1: TFlowBroker;
tbRunTaskFunc: TToolButton;
procedure BizFormDestroy(Sender: TObject);
procedure tbRunTaskFuncClick(Sender: TObject);
procedure tbFlowOutClick(Sender: TObject);
procedure tbFlowBackClick(Sender: TObject);
private
FOperator: TOperator;
FFlowControl: TFlowControl;
FFlow: TFlow;
FTask: TTask;
function CanProcess: Boolean;
function CurrentFlowGuid: String;
function CurrentTaskGuid: String;
function CurrentTaskMessageGuid: String;
function GetExecutorDept: String;
function GetExecutorPosition: String;
function GetExecutorPerson: String;
function CurrentFlow: TFlow;
function CurrentTask: TTask;
function CurrentTaskMessage(ATask: TTask): TTaskMessage;
function GetTaskFuncURL(const ATask: TTask): string;
function GetTaskFunc(AContext: TContext; const AFuncURL: string): TFunc;
function GetPositionContext: TContext;
function GetFlowContext(AContext: TContext): TContext;
function RunTaskFunc(CreateMainForm: Boolean): Boolean;
public
{public declarations}
end;
implementation
procedure TFlowManagerForm.BizFormDestroy(Sender: TObject);
begin
if Assigned(FFlow) then
FFlow.Free;
if Assigned(FTask) then
FTask.Free;
if Assigned(FFlowControl) then
FFlowControl.Free;
if Assigned(FOperator) then
Opr.Logoff(FOperator);
end;
function TFlowManagerForm.CanProcess: Boolean;
begin
Result := (dsbTask.DataSet.FieldByName('FSTATE').AsString = 'tsStarted') and
(dsbTaskMessage.DataSet.FieldByName('FSTATE').AsString = 'tmsSend');
end;
function TFlowManagerForm.CurrentFlowGuid: String;
begin
Result := dsbFlow.DataSet.FieldByName('FGuid').AsString;
end;
function TFlowManagerForm.CurrentTaskGuid: String;
begin
Result := dsbTask.DataSet.FieldByName('FGuid').AsString;
end;
function TFlowManagerForm.CurrentTaskMessageGuid: String;
begin
Result := dsbTaskMessage.DataSet.FieldByName('FGuid').AsString;
end;
function TFlowManagerForm.GetExecutorDept: String;
begin
Result := dsbTaskMessage.DataSet.FieldByName('FRDEPT').AsString;
end;
function TFlowManagerForm.GetExecutorPosition: String;
begin
Result := dsbTaskMessage.DataSet.FieldByName('FRPOSITION').AsString;
end;
function TFlowManagerForm.GetExecutorPerson: String;
begin
Result := dsbTaskMessage.DataSet.FieldByName('FRPERSON').AsString;
end;
function TFlowManagerForm.CurrentFlow: TFlow;
begin
if not Assigned(FFlow) then
FFlow := TFlow.Create;
if not SysUtils.SameText(FFlow.GUID, CurrentFlowGuid) then
Business.Model.Flow.Flow.FlowEngine.LoadFlow(CurrentFlowGuid, FFlow);
Result := FFlow;
end;
function TFlowManagerForm.CurrentTask: TTask;
begin
if not Assigned(FTask) then
FTask := TTask.Create;
if not SysUtils.SameText(FTask.GUID, CurrentTaskGuid) then
Business.Model.Flow.Flow.FlowEngine.LoadTask(CurrentTaskGuid, FTask);
Result := FTask;
end;
function TFlowManagerForm.CurrentTaskMessage(ATask: TTask): TTaskMessage;
var
I: Integer;
begin
Result := nil;
for I := 0 to ATask.TaskMessages.Count - 1 do
if SysUtils.SameText(CurrentTaskMessageGuid, ATask.TaskMessages[I].GUID) then
begin
Result := ATask.TaskMessages[I];
break;
end;
end;
function TFlowManagerForm.GetTaskFuncURL(const ATask: TTask): string;
var
lProcURL: TBizURL;
lProc: TProc;
begin
lProcURL := TBizURL.Create;
try
lProcURL.URL := ATask.ProcURL;
lProc := TProc(Business.Model.BizSys.BizSystem.GetBizObject(lProcURL));
Result := TProcActivity(lProc.GetUnit(ATask.ProcUnitID)).FuncURL.URL;
finally
lProcURL.Free;
end;
end;
function TFlowManagerForm.GetTaskFunc(AContext: TContext; const AFuncURL: string): TFunc;
var
lBizClassURL: TBizClassURL;
begin
lBizClassURL := TBizClassURL.Create;
Try
lBizClassURL.BizURL.URL := AFuncURL;
Result := TFunc(AContext.GetBizObject(lBizClassURL));
finally
lBizClassURl.Free;
end;
end;
function TFlowManagerForm.GetPositionContext: TContext;
CONST
msg_NotFoundPosition = '组织节点[部门:%s, 岗位:%s, 人员:%s]的岗位环境不存在,'+
#13 + #10 + '可能是已经被删除或代理!';
var
lPerson: TPerson;
lPosition: TOperatorPosition;
lDeptID, lPositionID, lPersonID: string;
lPositions: TOperatorPositionArray;
begin
Result := nil;
//if CanProcess then
//begin
lDeptID := GetExecutorDept;
lPositionID := GetExecutorPosition;
lPersonID := GetExecutorPerson;
if Assigned(FOperator) and (FOperator.ID <> lPersonID) then
Opr.Logoff(FOperator);
lPerson := Org.OrgSys.OrgSystem.GetPerson(lPersonID);
FOperator := Opr.Logon(lPerson.ID, lPerson.Password);
try
lPositions := [];
if FOperator.FindPosition(lDeptID, lPositionID, lPersonID, lPositions) then
lPosition := lPositions[0]
else
lPosition := nil;
if lPosition <> nil then
Result := lPosition.Context
else
JSDialogs.ShowMsg(SysUtils.Format(msg_NotFoundPosition,
[lDeptID, lPositionID, lPersonID]), '');
finally
//
end;
//end;
end;
function TFlowManagerForm.GetFlowContext(AContext: TContext): TContext;
var
lContext: TContext;
begin
Result := nil;
if AContext <> nil then
lContext := AContext
else
Exit;
if (FFlowControl <> nil) then
FFlowControl.Free;
FFlowControl := TFlowControl.Create(lContext);
Result := FFlowControl.Context;
end;
function TFlowManagerForm.RunTaskFunc(CreateMainForm: Boolean): Boolean;
var
lFuncURL: string;
lFunc: TFunc;
lFlowContext: TContext;
lTask: TTask;
lTaskMessage: TTaskMessage;
lOrgURL: TOrgURL;
begin
Result := CanProcess;
if not Result then exit;
lTask := CurrentTask;
lTaskMessage := CurrentTaskMessage(lTask);
lFlowContext := GetFlowContext(GetPositionContext);
if lFlowContext = nil then
Exit;
lOrgUrl := TOrgUrl.Create(lTaskMessage.ReceiverDeptID,
lTaskMessage.ReceiverPositionID, lTaskMessage.ReceiverID);
try
FFlowControl.ExecuteTask(lTask, lOrgUrl);
lFuncURL := GetTaskFuncURL(lTask);
lFunc := GetTaskFunc(lFlowContext, lFuncURL);
FFlowControl.Func := lFunc;
lFunc.Run('');
if CreateMainForm and (lFunc.MainForm <> nil) then
begin
lFunc.MainForm.Show;
end;
Result := true;
finally
lOrgUrl.Free;
end;
end;
procedure TFlowManagerForm.tbRunTaskFuncClick(Sender: TObject);
begin
RunTaskFunc(true);
end;
procedure TFlowManagerForm.tbFlowOutClick(Sender: TObject);
var
lTasks: TList;
begin
lTasks := TList.Create;
try
if RunTaskFunc(false) then
begin
lTasks.Add(CurrentTask);
FFlowControl.FlowOut(lTasks);
end;
finally
lTasks.Free;
end;
end;
procedure TFlowManagerForm.tbFlowBackClick(Sender: TObject);
var
lTasks: TList;
begin
lTasks := TList.Create;
try
if RunTaskFunc(false) then
begin
lTasks.Add(CurrentTask);
FFlowControl.FlowBack(lTasks);
end;
finally
lTasks.Free;
end;
end;
end. |
|