|
@@ -36,6 +36,8 @@ type
|
|
|
procedure SaveInfoToXmlDocument(AXmlNode: IXMLNode);
|
|
|
procedure ExportXmlInfo;
|
|
|
function GetNewOutputFileName: string;
|
|
|
+
|
|
|
+ function CheckFile(const AFileName: string): Boolean;
|
|
|
protected
|
|
|
procedure OpenProject; virtual;
|
|
|
procedure SaveProject; virtual;
|
|
@@ -43,8 +45,8 @@ type
|
|
|
constructor Create(const AProjectName, AFileName: string; AProjectID: Integer);
|
|
|
destructor Destroy; override;
|
|
|
|
|
|
- procedure Execute; virtual;
|
|
|
- procedure ExportTo(AFileName: string); virtual;
|
|
|
+ function Execute: Boolean; virtual;
|
|
|
+ function ExportTo(AFileName: string): Boolean; virtual;
|
|
|
end;
|
|
|
|
|
|
TSubmitProject = class(TReportBase)
|
|
@@ -52,8 +54,8 @@ type
|
|
|
procedure OpenProject; override;
|
|
|
procedure SaveProject; override;
|
|
|
public
|
|
|
- procedure Execute; override;
|
|
|
- procedure ExportTo(AFileName: string); override;
|
|
|
+ function Execute: Boolean; override;
|
|
|
+ function ExportTo(AFileName: string): Boolean; override;
|
|
|
end;
|
|
|
|
|
|
TReplyProject = class(TReportBase)
|
|
@@ -61,8 +63,8 @@ type
|
|
|
procedure OpenProject; override;
|
|
|
procedure SaveProject; override;
|
|
|
public
|
|
|
- procedure Execute; override;
|
|
|
- procedure ExportTo(AFileName: string); override;
|
|
|
+ function Execute: Boolean; override;
|
|
|
+ function ExportTo(AFileName: string): Boolean; override;
|
|
|
end;
|
|
|
|
|
|
{1. 生成临时文件夹
|
|
@@ -224,10 +226,27 @@ type
|
|
|
procedure Execute;
|
|
|
end;
|
|
|
|
|
|
+ // 文件检验
|
|
|
+ {
|
|
|
+ 检验分为两部分:
|
|
|
+ 1. 一致性检验:检验文件中的xml记录数据,与数据库中数据是否一致,以检验文件是否可用
|
|
|
+ 2. 主动检验: 提供xml记录的部分数据,用户主动检验是否为所需文件
|
|
|
+
|
|
|
+ 流程:
|
|
|
+ 1. 解压文件,得到xml文件,项目文件
|
|
|
+ 2. 读取xml文件,得到主要数据,与项目文件名
|
|
|
+ 3. 读取项目文件,并检验基本数据是否与xml文件中描述一致
|
|
|
+ PS:用于主动检验的数据,在第2步中同步进行。要求,如果进行主动检验,必须先通过一致性检验。
|
|
|
+ }
|
|
|
TTenderFileChecker = class
|
|
|
private
|
|
|
- FTempFolder: string;
|
|
|
FFileName: string;
|
|
|
+ FTempFolder: string;
|
|
|
+ FTenderFileName: string;
|
|
|
+ FTenderTempFolder: string;
|
|
|
+
|
|
|
+ FValid: Boolean;
|
|
|
+
|
|
|
FPhaseCount: Integer;
|
|
|
FAuditStatus: Integer;
|
|
|
FProjectName: string;
|
|
@@ -236,11 +255,14 @@ type
|
|
|
procedure LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
|
|
|
procedure LoadInfoFromXml;
|
|
|
procedure LoadInfo;
|
|
|
+
|
|
|
+ function DecryptFile(const AFileName: string): Boolean;
|
|
|
+ function CheckFileMatchXml: Boolean;
|
|
|
public
|
|
|
- constructor Create(AFileName: string);
|
|
|
- destructor Destroy; override;
|
|
|
+ // 检验项目数据库数据与xml文件中主要数据是否吻合
|
|
|
+ function CheckFileValid(const AFileName: string): Boolean;
|
|
|
|
|
|
- property ProjectName: string read FProjectName;
|
|
|
+ // xml文件中记录的信息,用于主动检验
|
|
|
property PhaseCount: Integer read FPhaseCount;
|
|
|
property AuditStatus: Integer read FAuditStatus;
|
|
|
end;
|
|
@@ -253,19 +275,19 @@ uses
|
|
|
|
|
|
{ TSubmitProject }
|
|
|
|
|
|
-procedure TSubmitProject.Execute;
|
|
|
+function TSubmitProject.Execute: Boolean;
|
|
|
begin
|
|
|
FFileType := '.rmf';
|
|
|
FNeedUpdate := True;
|
|
|
FProjectData.LockedDataForSubmit;
|
|
|
- inherited;
|
|
|
+ Result := inherited Execute;
|
|
|
end;
|
|
|
|
|
|
-procedure TSubmitProject.ExportTo(AFileName: string);
|
|
|
+function TSubmitProject.ExportTo(AFileName: string): Boolean;
|
|
|
begin
|
|
|
FNeedUpdate := True;
|
|
|
FProjectData.LockedDataForSubmit;
|
|
|
- inherited;
|
|
|
+ Result := inherited ExportTo(AFileName);
|
|
|
end;
|
|
|
|
|
|
procedure TSubmitProject.OpenProject;
|
|
@@ -303,24 +325,35 @@ begin
|
|
|
inherited;
|
|
|
end;
|
|
|
|
|
|
-procedure TReportBase.Execute;
|
|
|
+function TReportBase.Execute: Boolean;
|
|
|
var
|
|
|
sFileName: string;
|
|
|
begin
|
|
|
+ Result := False;
|
|
|
ExportXmlInfo;
|
|
|
SaveProject;
|
|
|
ZipFolder(FTempFolder, FResultFile);
|
|
|
- sFileName := GetNewOutputFileName;
|
|
|
- if SaveFile(sFileName, FFileType) then
|
|
|
- CopyFileOrFolder(FResultFile, sFileName);
|
|
|
+ // 检验导出文件
|
|
|
+ if CheckFile(FResultFile) then
|
|
|
+ begin
|
|
|
+ Result := True;
|
|
|
+ sFileName := GetNewOutputFileName;
|
|
|
+ if SaveFile(sFileName, FFileType) then
|
|
|
+ CopyFileOrFolder(FResultFile, sFileName);
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
-procedure TReportBase.ExportTo(AFileName: string);
|
|
|
+function TReportBase.ExportTo(AFileName: string): Boolean;
|
|
|
begin
|
|
|
+ Result := False;
|
|
|
ExportXmlInfo;
|
|
|
FProjectData.SimpleSaveAs(FTempFolder + '\' + ExtractSimpleFileName(FFileName));
|
|
|
ZipFolder(FTempFolder, FResultFile);
|
|
|
- CopyFileOrFolder(FResultFile, AFileName);
|
|
|
+ if CheckFile(FResultFile) then
|
|
|
+ begin
|
|
|
+ Result := True;
|
|
|
+ CopyFileOrFolder(FResultFile, AFileName);
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
procedure TReportBase.ExportXmlInfo;
|
|
@@ -402,19 +435,32 @@ begin
|
|
|
vProp := AXmlNode.AddChild('TenderProperty');
|
|
|
end;
|
|
|
|
|
|
+function TReportBase.CheckFile(const AFileName: string): Boolean;
|
|
|
+var
|
|
|
+ vChecker: TTenderFileChecker;
|
|
|
+begin
|
|
|
+ Result := False;
|
|
|
+ vChecker := TTenderFileChecker.Create;
|
|
|
+ try
|
|
|
+ Result := vChecker.CheckFileValid(AFileName);
|
|
|
+ finally
|
|
|
+ vChecker.Free;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
{ TReplyProject }
|
|
|
|
|
|
-procedure TReplyProject.Execute;
|
|
|
+function TReplyProject.Execute: Boolean;
|
|
|
begin
|
|
|
FFileType := '.arf';
|
|
|
FProjectData.LockedDataForReply;
|
|
|
- inherited;
|
|
|
+ Result := inherited Execute;
|
|
|
end;
|
|
|
|
|
|
-procedure TReplyProject.ExportTo(AFileName: string);
|
|
|
+function TReplyProject.ExportTo(AFileName: string): Boolean;
|
|
|
begin
|
|
|
FProjectData.LockedDataForReply;
|
|
|
- inherited;
|
|
|
+ Result := inherited ExportTo(AFileName);
|
|
|
end;
|
|
|
|
|
|
procedure TReplyProject.OpenProject;
|
|
@@ -986,18 +1032,41 @@ end;
|
|
|
|
|
|
{ TTenderFileChecker }
|
|
|
|
|
|
-constructor TTenderFileChecker.Create(AFileName: string);
|
|
|
+function TTenderFileChecker.CheckFileMatchXml: Boolean;
|
|
|
+var
|
|
|
+ FProjectData: TProjectData;
|
|
|
+begin
|
|
|
+ FProjectData := TProjectData.Create;
|
|
|
+ try
|
|
|
+ try
|
|
|
+ FProjectData.SimpleOpen(FTenderFileName);
|
|
|
+ Result := FProjectData.CheckDataBaseInfo(FPhaseCount, FAuditStatus);
|
|
|
+ except
|
|
|
+ Result := False;
|
|
|
+ end;
|
|
|
+ finally
|
|
|
+ FProjectData.Free;
|
|
|
+ end;
|
|
|
+end;
|
|
|
+
|
|
|
+function TTenderFileChecker.CheckFileValid(const AFileName: string): Boolean;
|
|
|
begin
|
|
|
- FFileName := AFileName;
|
|
|
FTempFolder := GenerateTempFolder(GetTempFilePath);
|
|
|
- UnZipFile(FFileName, FTempFolder);
|
|
|
- LoadInfo;
|
|
|
+ FTenderTempFolder := FTempFolder + '\Tender';
|
|
|
+ CreateDirectoryInDeep(FTenderTempFolder);
|
|
|
+ try
|
|
|
+ Result := DecryptFile(AFileName) and CheckFileMatchXml;
|
|
|
+ finally
|
|
|
+ DeleteFileOrFolder(FTempFolder);
|
|
|
+ end;
|
|
|
end;
|
|
|
|
|
|
-destructor TTenderFileChecker.Destroy;
|
|
|
+function TTenderFileChecker.DecryptFile(const AFileName: string): Boolean;
|
|
|
begin
|
|
|
- DeleteFileOrFolder(FTempFolder);
|
|
|
- inherited;
|
|
|
+ Result := UnZipFile(AFileName, FTempFolder);
|
|
|
+ if not Result then Exit;
|
|
|
+ LoadInfo;
|
|
|
+ Result := UnZipFile(FTenderFileName, FTenderTempFolder);
|
|
|
end;
|
|
|
|
|
|
procedure TTenderFileChecker.LoadInfo;
|
|
@@ -1036,6 +1105,7 @@ begin
|
|
|
FProjectName := AXmlNode.Attributes['ProjectName'];
|
|
|
FPhaseCount := AXmlNode.Attributes['PhaseCount'];
|
|
|
FAuditStatus := AXmlNode.Attributes['AuditStatus'];
|
|
|
+ FTenderFileName := FTempFolder + '\' + AXmlNode.Attributes['FileName'];
|
|
|
end;
|
|
|
|
|
|
end.
|