以下是我根据一个数据集生成流程控制数据的完整代码
unit MainForm;
interface
uses
Business.System, Business.Model, Business.Forms, Business.Data, Business.Model.Flow;
type
TMainForm = class(TForm)
FuncBroker: TFuncBroker;
InfoBroker: TInfoBroker;
ControlBar: TControlBar;
DataNavigator: TDataNavigator;
DocViewBar: TDocViewBar;
Panel: TPanel;
DocViewDTYWSJXX_SJWG1: TDocView;
Memo1: TMemo;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{private declarations}
FPath: TStrings;
procedure InitFlowPaths;
procedure UnInitFlowPaths;
function AddAFlow(ADataSet: TDataSet): TFlow;
function CreateATask(ADataSet: TDataSet; AFlowPath: TFlowPath; AFlow: TFlow; preTask: TTask; AFinished: Boolean): TTask;
public
{public declarations}
end;
implementation
procedure TMainForm.Button1Click(Sender: TObject);
var
i: Integer;
lDataSet: TDataSet;
begin
lDataSet := InfoBroker.Info.DataSetByID('BZSJJ1');
InitFlowPaths;
lDataSet.DisableControls;
try
lDataSet.First;
while not lDataSet.Eof do
begin
AddAFlow(lDataSet);
lDataSet.Next;
end;
finally
lDataSet.EnableControls;
end;
UnInitFlowPaths;
end;
type
TFlowPath = class(TObject)
public
ProcUnitID: String;
TaskTypeName: String;
FuncURL: String;
PrevUnitID: String;
Path: String;
end;
procedure TMainForm.InitFlowPaths;
var
lPath: TFlowPath;
begin
if not Assigned(FPath) then FPath := TStringList.Create;
lPath := TFlowPath.Create;
lPath.ProcUnitID := 'LCSJRKHJ';
lPath.TaskTypeName := '流程事件入口环节-控制条件';
lPath.FuncURL := 'Biz:\LZ\LCSJRKHJ.Func';
lPath.PrevUnitID := '';
lPath.Path := ';LCSJZJHJ;ZJHJ1;ZJHJ5;ZJHJ2;ZJHJ3;ZJHJ4;';
FPath.AddObject(lPath.ProcUnitID, lPath);
lPath := TFlowPath.Create;
lPath.ProcUnitID := 'LCSJZJHJ';
lPath.TaskTypeName := '流程事件中间环节';
lPath.FuncURL := 'Biz:\LZ\LCSJZJHJ.Func';
lPath.PrevUnitID := 'LCSJRKHJ';
lPath.Path := '';
FPath.AddObject(lPath.ProcUnitID, lPath);
lPath := TFlowPath.Create;
lPath.ProcUnitID := 'ZJHJ1';
lPath.TaskTypeName := '流转控制环节';
lPath.FuncURL := 'Biz:\LZ\CLSJHJ.Func';
lPath.PrevUnitID := 'LCSJRKHJ';
lPath.Path := ';ZJHJ4;ZJHJ5;';
FPath.AddObject(lPath.ProcUnitID, lPath);
lPath := TFlowPath.Create;
lPath.ProcUnitID := 'ZJHJ2';
lPath.TaskTypeName := '中间环节2';
lPath.FuncURL := 'Biz:\LZ\LCSJZJHJ.Func';
lPath.PrevUnitID := 'LCSJRKHJ';
lPath.Path := ';ZJHJ4;';
FPath.AddObject(lPath.ProcUnitID, lPath);
lPath := TFlowPath.Create;
lPath.ProcUnitID := 'ZJHJ3';
lPath.TaskTypeName := '中间环节3';
lPath.FuncURL := 'Biz:\LZ\LCSJZJHJ.Func';
lPath.PrevUnitID := 'LCSJRKHJ';
lPath.Path := ';ZJHJ4;';
FPath.AddObject(lPath.ProcUnitID, lPath);
lPath := TFlowPath.Create;
lPath.ProcUnitID := 'ZJHJ5';
lPath.TaskTypeName := '修改任务控制者';
lPath.FuncURL := 'Biz:\LZ\CLSJHJ.Func';
lPath.PrevUnitID := 'ZJHJ1';
lPath.Path := ';ZJHJ4;';
FPath.AddObject(lPath.ProcUnitID, lPath);
lPath := TFlowPath.Create;
lPath.ProcUnitID := 'ZJHJ4';
lPath.TaskTypeName := '代码控制回退环节';
lPath.FuncURL := 'Biz:\LZ\DMKZHTGN.Func';
lPath.PrevUnitID := ';ZJHJ1;ZJHJ2;ZJHJ3;ZJHJ5;';
lPath.Path := '';
FPath.AddObject(lPath.ProcUnitID, lPath);
end;
procedure TMainForm.UnInitFlowPaths;
begin
while FPath.Count>0 do
begin
TFlowPath(FPath.Objects[0]).Free;
FPath.Delete(0);
end;
end;
function TMainForm.AddAFlow(ADataSet: TDataSet): TFlow;
var
i, j: Integer;
lUnitID: String;
lFlowPath: TFlowPath;
lFlow: TFlow;
lTask: TTask;
lFreeobjs: TList;
begin
lFreeobjs := TList.Create;
try
lUnitID := SysUtils.UpperCase(ADataSet.FieldByName('PRODUCTTYPE').AsString);
//环节ID是否存在
if (Length(lUnitID)=0) or (FPath.IndexOf(lUnitID)=-1) then
Exit;
lFlow := TFlow.Create;
lFlow.ProcURL := 'Biz:\LZ\LCSJJCLC.PROC';
lFlow.DisplayName := '流程事件检查流程';
lFlow.FlowField := 'Biz:\OPERATION\OPERATIONDB.DATABASE\CRM_PRODUCT.TABLE\PRODUCTID.Field';
lFlow.ID := ADataSet.FieldByName('PRODUCTID').AsString;
lFlow.State := TFlowState.fsProcessing;
lFlow.ParentGUID := JSConst.cRootID;
lFlow.PrevGUID := JSConst.cRootID;
lFlow.NextGUID := JSConst.cRootID;
lFlow.CreateTime := SysUtils.Now();
lFlow.SaveToDB;
lFreeObjs.Add(lFlow);
lTask := nil;
for i:=0 to FPath.Count-1 do
begin
lFlowPath := FPath.Objects as TFlowPath;
if StringUtils.Pos(';'+lUnitID+';', lFlowPath.Path)>0 then
begin
if Length(lFlowPath.PrevUnitID)=0 then
lTask := nil
else if StringUtils.Pos(';', lFlowPath.PrevUnitID)=0 then
for j:=1 to lFreeObjs.Count-1 do
try
lTask := lFreeObjs[j] as TTask;
if lTask.ProcUnitID=lFlowPath.PrevUnitID then
Break;
except
Continue;
end
else
for j:=1 to lFreeObjs.Count-1 do
try
lTask := lFreeObjs[j] as TTask;
if StringUtils.Pos(';'+lTask.ProcUnitID+';', lFlowPath.PrevUnitID)>0 then
Break;
except
end;
lTask := CreateATask(ADataSet, lFlowPath, lFlow, lTask, True);
lFreeObjs.Add(lTask);
end;
end;
i := FPath.IndexOf(lUnitID);
lFlowPath := FPath.Objects as TFlowPath;
lTask := CreateATask(ADataSet, lFlowPath, lFlow, lTask, False);
lFreeObjs.Add(lTask);
finally
for i:=lFreeObjs.Count-1 downto 0 do
lFreeObjs.Free;
lFreeObjs.Free;
end;
end;
function TMainForm.CreateATask(ADataSet: TDataSet; AFlowPath: TFlowPath; AFlow: TFlow; preTask: TTask; AFinished: Boolean): TTask;
var
lBizData: TTaskBizData;
lBizDataRec: TTaskBizDataRec;
lTaskMessage: TTaskMessage;
begin
Result := TTask.Create;
Result.Kind := 'ftkActivity';
Result.FlowGUID := AFlow.GUID;
Result.ProcURL := AFlow.ProcURL;
Result.ProcUnitID := AFlowPath.ProcUnitID;
Result.FuncURL := AFlowPath.FuncURL;
Result.NextGUID := '';
Result.Subject := '我的流程'+ADataSet.FieldByName('PRODUCTID').AsString;
if Assigned(preTask) then
Result.PrevGUID := preTask.GUID;
Result.SenderDeptID := 'XSB';
Result.SenderPositionID := 'XSY';
Result.SenderID := 'ZS';
lBizData := TTaskBizData.Create;
lBizDataRec := TTaskBizDataRec.Create;
lBizDataRec.BizField := AFlow.FlowField;
lBizDataRec.Value := AFlow.ID;
lBizData.BizDataKeys.Add(lBizDataRec);
Result.BizDatas.Add(lBizData);
lTaskMessage := Result.TaskMessages.AddTaskMessage(nil, 'XSB', 'XSY', 'ZS');
Result.TaskTypeName := AFlowPath.TaskTypeName;
if AFinished then
begin
Result.State := TTaskState.tsFinished;
lTaskMessage.State := TTaskMessageState.tmsFinished;
lTaskMessage.FinishTime := SysUtils.Now();
lTaskMessage.ReceiveTime := SysUtils.Now();
end
else
begin
Result.State := TTaskState.tsProcessing;
lTaskMessage.State := TTaskMessageState.tmsProcessing;
lTaskMessage.FinishTime := SysUtils.Now();
lTaskMessage.ReceiveTime := SysUtils.Now();
end;
Result.SaveToDB;
end;
end. |