ProjectCommands.pas 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111
  1. unit ProjectCommands;
  2. interface
  3. uses
  4. ProjectData, XMLDoc, XMLIntf, ProjectManagerDm, sdIDTree, sdDB,
  5. Connections;
  6. type
  7. {1. 生成临时文件夹
  8. 2. 打开项目
  9. 3. 修改项目(上报、批复相应修改)
  10. 4. 保存修改后项目的属性至xml文件
  11. 5. 保存项目至临时文件夹中
  12. 6. 压缩临时文件夹,得到上报、批复文件
  13. 7. 复制粘贴结果文件得用户选择
  14. 8. 删除临时文件夹}
  15. TReportBase = class
  16. private
  17. // 临时文件夹(生成的项目文件、xml属性文件)
  18. FTempFolder: string;
  19. FProjectName: string;
  20. FFileName: string;
  21. FProjectID: Integer;
  22. FProjectData: TProjectData;
  23. FFileType: string;
  24. // xml项目信息文件
  25. FXmlInfoFile: string;
  26. // 结果文件
  27. FResultFile: string;
  28. // 接收文件时是否需要升级文件
  29. FNeedUpdate: Boolean;
  30. procedure SaveProjectInfo(AXmlNode: IXMLNode);
  31. procedure SaveTenderProperty(AXmlNode: IXMLNode);
  32. procedure SaveInfoToXmlDocument(AXmlNode: IXMLNode);
  33. procedure ExportXmlInfo;
  34. function GetNewOutputFileName: string;
  35. function CheckFile(const AFileName: string): Boolean;
  36. protected
  37. procedure OpenProject; virtual;
  38. procedure SaveProject; virtual;
  39. public
  40. constructor Create(const AProjectName, AFileName: string; AProjectID: Integer);
  41. destructor Destroy; override;
  42. function Execute: Boolean; virtual;
  43. function ExportTo(AFileName: string): Boolean; virtual;
  44. end;
  45. TSubmitProject = class(TReportBase)
  46. protected
  47. procedure OpenProject; override;
  48. procedure SaveProject; override;
  49. public
  50. function Execute: Boolean; override;
  51. function ExportTo(AFileName: string): Boolean; override;
  52. end;
  53. TReplyProject = class(TReportBase)
  54. protected
  55. procedure OpenProject; override;
  56. procedure SaveProject; override;
  57. public
  58. function Execute: Boolean; override;
  59. function ExportTo(AFileName: string): Boolean; override;
  60. end;
  61. {1. 生成临时文件夹
  62. 2. 解压选中文件至临时文件夹
  63. 3. 读取xml信息文件中的数据
  64. 4. 检查同名项目,存在则备份原项目,不存在则创建新节点
  65. 5. 根据xml文件更新数据项目信息,标段属性
  66. 6. 从临时文件夹中复制粘贴项目文件至新节点的数据文件
  67. 7. 打开该数据文件,根据情况修改
  68. 8. 保存该数据文件
  69. 9. 删除临时文件夹}
  70. TReceiveProject = class
  71. private
  72. FTempFolder: string;
  73. FFileType: string;
  74. FCurNode: TsdIDTreeNode;
  75. FProjectName: string;
  76. FFileName: string;
  77. FSelect: TsdIDTreeNode;
  78. FProjectData: TProjectData;
  79. FStageCount: Integer;
  80. FReply: Boolean;
  81. FLostStageCount: Integer;
  82. // 控制是否需要升级更新文件
  83. FNeedUpdate: Boolean;
  84. FLock: Boolean;
  85. FMessageID: Integer;
  86. function CheckOpen: Boolean;
  87. function GetNewTender: TsdIDTreeNode;
  88. procedure GetCurNode;
  89. procedure LoadProjectInfo(AXmlNode: IXMLNode);
  90. procedure LoadTenderProperty(AXmlNode: IXMLNode);
  91. procedure LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
  92. procedure LoadXmlInfo;
  93. procedure UpdateData(const AFileName: string);
  94. public
  95. constructor Create(ASelect: TsdIDTreeNode);
  96. destructor Destroy; override;
  97. function Receive(const AFileName: string): TsdIDTreeNode;
  98. procedure ReceiveForLost(const AFileName: string; AStageCount: Integer; AReply: Boolean);
  99. // 供网络版使用
  100. // 原报已提交,1审已审核并提交后,此时除了2审人以外的参与人接收数据时不可生成二审数据
  101. property Lock: Boolean read FLock write FLock;
  102. // 信息: 0[接收成功]
  103. // 1[接收失败,应接收节点打开状态]
  104. property MessageID: Integer read FMessageID;
  105. end;
  106. {1. 生成临时文件夹
  107. 2. 保存标段的属性至xml文件
  108. 3. 复制粘贴标段文件至临时文件夹
  109. 4. 压缩临时文件夹,得到导出的标段文件(结果文件)
  110. 5. 复制粘贴结果文件得用户选择
  111. 6. 删除临时文件夹}
  112. TTenderExport = class
  113. private
  114. // 临时文件夹(生成的项目文件、xml属性文件)
  115. FTempFolder: string;
  116. FProjectName: string;
  117. FFileName: string;
  118. FProjectID: Integer;
  119. FFileType: string;
  120. // xml项目信息文件
  121. FXmlInfoFile: string;
  122. // 结果文件
  123. FResultFile: string;
  124. FAttachmentPath: string;
  125. procedure SaveProjectInfo(AXmlNode: IXMLNode);
  126. procedure SaveTenderProperty(AXmlNode: IXMLNode);
  127. procedure SaveInfoToXmlDocument(AXmlNode: IXMLNode);
  128. procedure ExportXmlInfo;
  129. public
  130. constructor Create(ARec: TsdDataRecord; const AFileName: string);
  131. destructor Destroy; override;
  132. // 参数AExportAttachment:是否导出附件
  133. procedure Execute(AExportAttachment: Boolean = False);
  134. end;
  135. TTenderImport = class
  136. private
  137. FTempFolder: string;
  138. FSelect: TsdIDTreeNode;
  139. FNewNode: TsdIDTreeNode;
  140. FProjectName: string;
  141. FFileName: string;
  142. FTenderFileName: string;
  143. procedure GetNewNode;
  144. procedure LoadProjectInfo(AXmlNode: IXMLNode);
  145. procedure LoadTenderProperty(AXmlNode: IXMLNode);
  146. procedure LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
  147. procedure LoadXmlInfo;
  148. public
  149. constructor Create(ASelect: TsdIDTreeNode; const AProjectName, AFileName: string);
  150. destructor Destroy; override;
  151. procedure Execute;
  152. procedure ImportToSelect;
  153. end;
  154. {1. 生成临时文件夹
  155. 2. 导出选中节点及其所有子节点信息
  156. 3. 递归所有子节点,分类(Type = 0)则新建同名文件夹,标段(Type = 1)则导出该标段
  157. 4. 压缩临时文件夹,得到导出的分类文件(结果文件)
  158. 5. 复制粘贴结果文件得用户选择
  159. 6. 删除临时文件夹}
  160. TProjectExport = class
  161. private
  162. // 临时文件夹(按层次结构生成所有项目文件)
  163. FTempFolder: string;
  164. // xml树结构文件
  165. FXmlInfoFile: string;
  166. // 结果文件
  167. FResultFile: string;
  168. FExportNode: TsdIDTreeNode;
  169. FTenderExportor: TTenderExport;
  170. FExportAttachment: Boolean;
  171. procedure SaveTreeNodeInfo(AXmlNode: IXMLNode; ANode: TsdIDTreeNode);
  172. procedure ExportXmlInfo;
  173. procedure ExportTender(ANode: TsdIDTreeNode; const AExportPath: string);
  174. procedure ExportNode(ANode: TsdIDTreeNode; const AExportPath: string);
  175. public
  176. constructor Create(ANode: TsdIDTreeNode; const AFileName: string; AExportAttachment: Boolean = False);
  177. destructor Destroy; override;
  178. procedure Execute;
  179. end;
  180. {1. 生成临时文件夹
  181. 2. 解压选中文件至临时文件夹
  182. 3. 根据用户选择新建子分类FNew
  183. 3. 打开Xml树结构信息文件
  184. 4. 根据Xml文件中结构,依次建立分类或导入标段文件
  185. 5. 删除临时文件夹}
  186. TProjectImport = class
  187. private
  188. FTempFolder: string;
  189. FProjectName: string;
  190. FFileName: string;
  191. FSelect: TsdIDTreeNode;
  192. FNew: TsdIDTreeNode;
  193. function AddNewNode(AParentID, ANextID: Integer; const ANodeName: string): TsdIDTreeNode;
  194. procedure LoadTender(AXmlNode: IXMLNode;
  195. AParent: TsdIDTreeNode; const APath: string);
  196. procedure LoadChild(AXmlNode: IXMLNode;
  197. AParent: TsdIDTreeNode; const APath: string);
  198. procedure LoadChildrenFormXml;
  199. public
  200. constructor Create(ASelect: TsdIDTreeNode; const AProjectName, AFileName: string);
  201. destructor Destroy; override;
  202. procedure Execute;
  203. end;
  204. // 文件检验
  205. {
  206. 检验分为两部分:
  207. 1. 一致性检验:检验文件中的xml记录数据,与数据库中数据是否一致,以检验文件是否可用
  208. 2. 主动检验: 提供xml记录的部分数据,用户主动检验是否为所需文件
  209. 流程:
  210. 1. 解压文件,得到xml文件,项目文件
  211. 2. 读取xml文件,得到主要数据,与项目文件名
  212. 3. 读取项目文件,并检验基本数据是否与xml文件中描述一致
  213. PS:用于主动检验的数据,在第2步中同步进行。要求,如果进行主动检验,必须先通过一致性检验。
  214. }
  215. TTenderFileChecker = class
  216. private
  217. FFileName: string;
  218. FTempFolder: string;
  219. FTenderFileName: string;
  220. FTenderTempFolder: string;
  221. FValid: Boolean;
  222. FPhaseCount: Integer;
  223. FAuditStatus: Integer;
  224. FProjectName: string;
  225. procedure LoadProjectInfo(AXmlNode: IXMLNode);
  226. procedure LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
  227. procedure LoadInfoFromXml;
  228. procedure LoadInfo;
  229. function DecryptFile(const AFileName: string): Boolean;
  230. function CheckFileMatchXml: Boolean;
  231. public
  232. // 检验项目数据库数据与xml文件中主要数据是否吻合
  233. function CheckFileValid(const AFileName: string): Boolean;
  234. // xml文件中记录的信息,用于主动检验
  235. property PhaseCount: Integer read FPhaseCount;
  236. property AuditStatus: Integer read FAuditStatus;
  237. end;
  238. implementation
  239. uses
  240. UtilMethods, ZhAPI, Globals, SysUtils, SupportUnit, NewProjectFrm,
  241. PhaseData, ConfigDoc, ConstUnit, PHPWebDm;
  242. { TSubmitProject }
  243. function TSubmitProject.Execute: Boolean;
  244. begin
  245. FFileType := '.rmf';
  246. FNeedUpdate := True;
  247. FProjectData.LockedDataForSubmit;
  248. Result := inherited Execute;
  249. end;
  250. function TSubmitProject.ExportTo(AFileName: string): Boolean;
  251. begin
  252. FNeedUpdate := True;
  253. FProjectData.LockedDataForSubmit;
  254. Result := inherited ExportTo(AFileName);
  255. end;
  256. procedure TSubmitProject.OpenProject;
  257. begin
  258. FProjectData.OpenForSubmit(FFileName);
  259. end;
  260. procedure TSubmitProject.SaveProject;
  261. begin
  262. FProjectData.SaveAsForSubmit(FTempFolder + '\' + ExtractSimpleFileName(FFileName));
  263. end;
  264. { TReportBase }
  265. constructor TReportBase.Create(const AProjectName, AFileName: string;
  266. AProjectID: Integer);
  267. begin
  268. FProjectName := AProjectName;
  269. FFileName := AFileName;
  270. FProjectID := AProjectID;
  271. FProjectData := TProjectData.Create;
  272. FFileType := '.dat';
  273. FTempFolder := GenerateTempFolder(GetTempFilePath);
  274. FXmlInfoFile := FTempFolder + '\Info.xml';
  275. FResultFile := GetTempFileName;
  276. FNeedUpdate := False;
  277. OpenProject;
  278. end;
  279. destructor TReportBase.Destroy;
  280. begin
  281. DeleteFileOrFolder(FTempFolder);
  282. DeleteFileOrFolder(FResultFile);
  283. FProjectData.Free;
  284. inherited;
  285. end;
  286. function TReportBase.Execute: Boolean;
  287. var
  288. sFileName: string;
  289. begin
  290. Result := False;
  291. ExportXmlInfo;
  292. SaveProject;
  293. ZipFolder(FTempFolder, FResultFile);
  294. // 检验导出文件
  295. if CheckFile(FResultFile) then
  296. begin
  297. Result := True;
  298. sFileName := GetNewOutputFileName;
  299. if SaveFile(sFileName, FFileType) then
  300. CopyFileOrFolder(FResultFile, sFileName);
  301. end;
  302. end;
  303. function TReportBase.ExportTo(AFileName: string): Boolean;
  304. begin
  305. Result := False;
  306. ExportXmlInfo;
  307. FProjectData.SimpleSaveAs(FTempFolder + '\' + ExtractSimpleFileName(FFileName));
  308. ZipFolder(FTempFolder, FResultFile);
  309. if CheckFile(FResultFile) then
  310. begin
  311. Result := True;
  312. CopyFileOrFolder(FResultFile, AFileName);
  313. end;
  314. end;
  315. procedure TReportBase.ExportXmlInfo;
  316. var
  317. FXmlDocument: IXMLDocument;
  318. begin
  319. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  320. try
  321. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAttrNull,doAutoPrefix,doNamespaceDecl];
  322. FXmlDocument.Active := True;
  323. FXmlDocument.Encoding := 'GB2312';
  324. FXmlDocument.AddChild('ProjectMangerInfo');
  325. SaveInfoToXmlDocument(FXmlDocument.DocumentElement);
  326. FXmlDocument.SaveToFile(FXmlInfoFile);
  327. finally
  328. FXmlDocument := nil;
  329. end;
  330. end;
  331. function TReportBase.GetNewOutputFileName: string;
  332. begin
  333. Result := SupportManager.ConfigInfo.AuditPath + FProjectName
  334. + Format('-第%d期', [FProjectData.ProjProperties.PhaseCount]);
  335. if FProjectData.ProjProperties.AuditCompany <> '' then
  336. Result := Result + '-' + FProjectData.ProjProperties.AuditCompany;
  337. Result := Result + Format('-%s-', [FProjectData.ProjProperties.AuditStatusStr])
  338. + FormatDateTime('yyyy-mm-dd', Date) + FFileType;
  339. end;
  340. procedure TReportBase.OpenProject;
  341. begin
  342. FProjectData.SimpleOpen(FFileName);
  343. end;
  344. procedure TReportBase.SaveProject;
  345. begin
  346. FProjectData.SimpleSaveAs(FTempFolder + '\' + ExtractSimpleFileName(FFileName));
  347. end;
  348. procedure TReportBase.SaveInfoToXmlDocument(AXmlNode: IXMLNode);
  349. begin
  350. SaveProjectInfo(AXmlNode);
  351. SaveTenderProperty(AXmlNode);
  352. end;
  353. procedure TReportBase.SaveProjectInfo(AXmlNode: IXMLNode);
  354. var
  355. vInfo: IXMLNode;
  356. InfoRec: TsdDataRecord;
  357. begin
  358. vInfo := AXmlNode.AddChild('ProjectInfo');
  359. InfoRec := ProjectManager.sddProjectsInfo.FindKey('idxID', FProjectID);
  360. vInfo.Attributes['ProjectName'] := FProjectName;
  361. vInfo.Attributes['NeedUpdate'] := FNeedUpdate;
  362. vInfo.Attributes['DealTotalPrice'] := InfoRec.ValueByName('DealTotalPrice').AsFloat;
  363. vInfo.Attributes['PhaseTotalPrice'] := InfoRec.ValueByName('PhaseTotalPrice').AsFloat;
  364. vInfo.Attributes['EndDealTotalPrice'] := InfoRec.ValueByName('EndDealTotalPrice').AsFloat;
  365. vInfo.Attributes['EndChangeTotalPrice'] := InfoRec.ValueByName('EndChangeTotalPrice').AsFloat;
  366. vInfo.Attributes['EndTotalPrice'] := InfoRec.ValueByName('EndTotalPrice').AsFloat;
  367. vInfo.Attributes['PreTotalPrice'] := InfoRec.ValueByName('PreTotalPrice').AsFloat;
  368. vInfo.Attributes['PhasePay'] := InfoRec.ValueByName('PhasePay').AsFloat;
  369. vInfo.Attributes['Deal_BGLTotalPrice'] := InfoRec.ValueByName('Deal_BGLTotalPrice').AsFloat;
  370. vInfo.Attributes['PhaseCount'] := FProjectData.ProjProperties.PhaseCount;
  371. vInfo.Attributes['AuditStatus'] := FProjectData.ProjProperties.AuditStatus;
  372. vInfo.Attributes['FileName'] := ExtractSimpleFileName(FFileName);
  373. if G_IsCloud then
  374. begin
  375. vInfo.Attributes['WebID'] := InfoRec.ValueByName('WebID').AsInteger;
  376. vInfo.Attributes['WebOwnerID'] := InfoRec.ValueByName('WebOwnerID').AsInteger;
  377. vInfo.Attributes['WebAuthorID'] := InfoRec.ValueByName('WebAuthorID').AsInteger;
  378. end;
  379. end;
  380. procedure TReportBase.SaveTenderProperty(AXmlNode: IXMLNode);
  381. var
  382. vProp: IXMLNode;
  383. begin
  384. vProp := AXmlNode.AddChild('TenderProperty');
  385. end;
  386. function TReportBase.CheckFile(const AFileName: string): Boolean;
  387. var
  388. vChecker: TTenderFileChecker;
  389. begin
  390. Result := False;
  391. vChecker := TTenderFileChecker.Create;
  392. try
  393. Result := vChecker.CheckFileValid(AFileName);
  394. finally
  395. vChecker.Free;
  396. end;
  397. end;
  398. { TReplyProject }
  399. function TReplyProject.Execute: Boolean;
  400. begin
  401. FFileType := '.arf';
  402. FProjectData.LockedDataForReply;
  403. Result := inherited Execute;
  404. end;
  405. function TReplyProject.ExportTo(AFileName: string): Boolean;
  406. begin
  407. FProjectData.LockedDataForReply;
  408. Result := inherited ExportTo(AFileName);
  409. end;
  410. procedure TReplyProject.OpenProject;
  411. begin
  412. FProjectData.OpenForReply(FFileName);
  413. end;
  414. procedure TReplyProject.SaveProject;
  415. begin
  416. FProjectData.SaveForReply(FTempFolder + '\' + ExtractSimpleFileName(FFileName));
  417. end;
  418. { TReceiveProject }
  419. function TReceiveProject.CheckOpen: Boolean;
  420. begin
  421. Result := OpenProjectManager.ProjectIndex(FCurNode.ID) <> -1;
  422. if Result then
  423. FMessageID := 1;
  424. end;
  425. constructor TReceiveProject.Create(ASelect: TsdIDTreeNode);
  426. begin
  427. FSelect := ASelect;
  428. FTempFolder := GenerateTempFolder(GetTempFilePath);
  429. FStageCount := -1;
  430. FReply := False;
  431. FLock := False;
  432. FMessageID := 0;
  433. end;
  434. destructor TReceiveProject.Destroy;
  435. begin
  436. DeleteFileOrFolder(FTempFolder);
  437. inherited;
  438. end;
  439. procedure TReceiveProject.GetCurNode;
  440. var
  441. I: Integer;
  442. begin
  443. if FSelect.Rec.ValueByName('Type').AsInteger = 0 then
  444. FCurNode := FSelect.FirstChild
  445. else
  446. FCurNode := FSelect.Parent.FirstChild;
  447. while Assigned(FCurNode) and (FCurNode.Rec.ValueByName('Name').AsString <> FProjectName) do
  448. FCurNode := FCurNode.NextSibling;
  449. if not Assigned(FCurNode) then
  450. FCurNode := GetNewTender
  451. else if CheckOpen then Abort;
  452. end;
  453. function TReceiveProject.GetNewTender: TsdIDTreeNode;
  454. begin
  455. if FSelect.Rec.ValueByName('Type').AsInteger = 0 then
  456. Result := ProjectManager.ProjectsTree.Add(FSelect.ID, -1)
  457. else
  458. Result := ProjectManager.ProjectsTree.Add(FSelect.ParentID, FSelect.NextSiblingID);
  459. Result.Rec.ValueByName('Name').AsString := FProjectName;
  460. Result.Rec.ValueByName('Type').AsInteger := 1;
  461. Result.Rec.ValueByName('FileName').AsString := ExtractSimpleFileName(GetNewGUIDFileName(GetMyProjectsFilePath));
  462. end;
  463. procedure TReceiveProject.LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
  464. var
  465. ChildNodes: IXMLNodeList;
  466. vProjInfo: IXMLNode;
  467. begin
  468. ChildNodes := AXmlNode.ChildNodes;
  469. vProjInfo := ChildNodes.FindNode('ProjectInfo');
  470. FProjectName := vProjInfo.Attributes['ProjectName'];
  471. FFileName := vProjInfo.Attributes['FileName'];
  472. GetCurNode;
  473. // 备份旧文件
  474. // 备份须放在这里的原因是,需要打开xml文件后,才能确认是否要备份文件以及应备份哪个文件
  475. // 但是又不能再导入xml数据以后,导入xml数据后,项目的属性会变掉
  476. ProjectManager.RestoreTender(FCurNode.ID);
  477. LoadProjectInfo(ChildNodes.FindNode('ProjectInfo'));
  478. LoadTenderProperty(ChildNodes.FindNode('TenderProperty'));
  479. end;
  480. procedure TReceiveProject.LoadProjectInfo(AXmlNode: IXMLNode);
  481. function GetCurAuditStatus: Integer;
  482. begin
  483. if FStageCount > 0 then
  484. FLostStageCount := FStageCount - (AXmlNode.Attributes['AuditStatus'] + 1) - 1;
  485. if FNeedUpdate then
  486. begin
  487. if FReply then
  488. Result := -1
  489. else if FStageCount > 0 then
  490. Result := FStageCount - 1
  491. else
  492. Result := AXmlNode.Attributes['AuditStatus'] + 1
  493. end
  494. else
  495. Result := AXmlNode.Attributes['AuditStatus'];
  496. end;
  497. begin
  498. if not FLock then
  499. FNeedUpdate := AXmlNode.Attributes['NeedUpdate'];
  500. FCurNode.Rec.ValueByName('DealTotalPrice').AsFloat := AXmlNode.Attributes['DealTotalPrice'];
  501. FCurNode.Rec.ValueByName('PhaseTotalPrice').AsFloat := AXmlNode.Attributes['PhaseTotalPrice'];
  502. FCurNode.Rec.ValueByName('EndDealTotalPrice').AsFloat := AXmlNode.Attributes['EndDealTotalPrice'];
  503. FCurNode.Rec.ValueByName('EndChangeTotalPrice').AsFloat := AXmlNode.Attributes['EndChangeTotalPrice'];
  504. FCurNode.Rec.ValueByName('EndTotalPrice').AsFloat := AXmlNode.Attributes['EndTotalPrice'];
  505. FCurNode.Rec.ValueByName('PreTotalPrice').AsFloat := AXmlNode.Attributes['PreTotalPrice'];
  506. FCurNode.Rec.ValueByName('PhasePay').AsFloat := AXmlNode.Attributes['PhasePay'];
  507. if AXmlNode.HasAttribute('Deal_BGLTotalPrice') then
  508. FCurNode.Rec.ValueByName('Deal_BGLTotalPrice').AsFloat := AXmlNode.Attributes['Deal_BGLTotalPrice'];
  509. FCurNode.Rec.ValueByName('PhaseCount').AsInteger := AXmlNode.Attributes['PhaseCount'];
  510. FCurNode.Rec.ValueByName('AuditStatus').AsInteger := GetCurAuditStatus;
  511. FCurNode.Rec.ValueByName('CreateDate').AsString := FormatDateTime('yyyy-mm-dd', Date);
  512. if G_IsCloud then
  513. begin
  514. FCurNode.Rec.ValueByName('WebID').AsInteger := AXmlNode.Attributes['WebID'];
  515. FCurNode.Rec.ValueByName('WebOwnerID').AsInteger := AXmlNode.Attributes['WebOwnerID'];
  516. FCurNode.Rec.ValueByName('WebAuthorID').AsInteger := AXmlNode.Attributes['WebAuthorID'];
  517. end;
  518. end;
  519. procedure TReceiveProject.LoadTenderProperty(AXmlNode: IXMLNode);
  520. begin
  521. // ToDo
  522. end;
  523. procedure TReceiveProject.LoadXmlInfo;
  524. var
  525. FXmlDocument: IXMLDocument;
  526. XmlNode: IXMLNode;
  527. FRootList: IXMLNodeList;
  528. begin
  529. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  530. try
  531. FXmlDocument.LoadFromFile(FTempFolder + '\Info.xml');
  532. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  533. XmlNode := FXmlDocument.DocumentElement;
  534. LoadInfoFromXmlDocument(XmlNode);
  535. finally
  536. FRootList := nil;
  537. FXmlDocument := nil;
  538. end;
  539. end;
  540. function TReceiveProject.Receive(const AFileName: string): TsdIDTreeNode;
  541. begin
  542. FFileType := ExtractFileExt(AFileName);
  543. UnZipFile(AFileName, FTempFolder);
  544. LoadXmlInfo;
  545. CopyFileOrFolder(FTempFolder + '\' + FFileName,
  546. GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
  547. UpdateData(GetMyProjectsFilePath + FCurNode.Rec.ValueByName('FileName').AsString);
  548. Result := FCurNode;
  549. end;
  550. procedure TReceiveProject.ReceiveForLost(const AFileName: string;
  551. AStageCount: Integer; AReply: Boolean);
  552. begin
  553. FStageCount := AStageCount;
  554. FReply := AReply;
  555. Receive(AFileName);
  556. end;
  557. procedure TReceiveProject.UpdateData(const AFileName: string);
  558. var
  559. I: Integer;
  560. begin
  561. if FNeedUpdate then
  562. begin
  563. FProjectData := TProjectData.Create;
  564. try
  565. FProjectData.OpenForReceive(AFileName);
  566. FProjectData.UpdateDataForReceive;
  567. for I := 1 to FLostStageCount do
  568. begin
  569. FProjectData.LockedDataForSubmit;
  570. FProjectData.UpdateDataForReceive;
  571. end;
  572. if FReply then
  573. FProjectData.LockedDataForReply;
  574. FProjectData.SaveForReceive(AFileName);
  575. finally
  576. FProjectData.Free;
  577. end;
  578. end;
  579. end;
  580. { TTenderExport }
  581. constructor TTenderExport.Create(ARec: TsdDataRecord;
  582. const AFileName: string);
  583. begin
  584. FProjectName := ARec.ValueByName('Name').AsString;
  585. FFileName := GetMyProjectsFilePath + ARec.ValueByName('FileName').AsString;
  586. if not G_IsCloud then
  587. FAttachmentPath := GetMyProjectsFilePath + 'Attachment\' + ARec.ValueByName('FileName').AsString + '\';
  588. FProjectID := ARec.ValueByName('ID').AsInteger;
  589. FTempFolder := GenerateTempFolder(GetTempFilePath);
  590. FXmlInfoFile := FTempFolder + '\Info.xml';
  591. FResultFile := AFileName;
  592. end;
  593. destructor TTenderExport.Destroy;
  594. begin
  595. DeleteFileOrFolder(FTempFolder);
  596. inherited;
  597. end;
  598. procedure TTenderExport.Execute(AExportAttachment: Boolean);
  599. var
  600. sFileName: string;
  601. begin
  602. ExportXmlInfo;
  603. sFileName := ExtractSimpleFileName(FResultFile);
  604. CopyFileOrFolder(FFileName, FTempFolder + '\' + sFileName);
  605. if not G_IsCloud then // 云版不导出附件,云版的运作机制是从网上下载
  606. if AExportAttachment then
  607. CopyFolder(FAttachmentPath, FTempFolder + '\' + sFileName + '[附件包]');
  608. ZipFolder(FTempFolder, FResultFile);
  609. end;
  610. procedure TTenderExport.ExportXmlInfo;
  611. var
  612. FXmlDocument: IXMLDocument;
  613. begin
  614. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  615. try
  616. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAttrNull,doAutoPrefix,doNamespaceDecl];
  617. FXmlDocument.Active := True;
  618. FXmlDocument.Encoding := 'GB2312';
  619. FXmlDocument.AddChild('ProjectMangerInfo');
  620. SaveInfoToXmlDocument(FXmlDocument.DocumentElement);
  621. FXmlDocument.SaveToFile(FXmlInfoFile);
  622. finally
  623. FXmlDocument := nil;
  624. end;
  625. end;
  626. procedure TTenderExport.SaveInfoToXmlDocument(AXmlNode: IXMLNode);
  627. begin
  628. SaveProjectInfo(AXmlNode);
  629. SaveTenderProperty(AXmlNode);
  630. end;
  631. procedure TTenderExport.SaveProjectInfo(AXmlNode: IXMLNode);
  632. var
  633. vInfo: IXMLNode;
  634. InfoRec: TsdDataRecord;
  635. begin
  636. vInfo := AXmlNode.AddChild('ProjectInfo');
  637. InfoRec := ProjectManager.sddProjectsInfo.FindKey('idxID', FProjectID);
  638. vInfo.Attributes['ProjectName'] := FProjectName;
  639. vInfo.Attributes['DealTotalPrice'] := InfoRec.ValueByName('DealTotalPrice').AsFloat;
  640. vInfo.Attributes['PhaseTotalPrice'] := InfoRec.ValueByName('PhaseTotalPrice').AsFloat;
  641. vInfo.Attributes['EndDealTotalPrice'] := InfoRec.ValueByName('EndDealTotalPrice').AsFloat;
  642. vInfo.Attributes['EndChangeTotalPrice'] := InfoRec.ValueByName('EndChangeTotalPrice').AsFloat;
  643. vInfo.Attributes['EndTotalPrice'] := InfoRec.ValueByName('EndTotalPrice').AsFloat;
  644. vInfo.Attributes['PreTotalPrice'] := InfoRec.ValueByName('PreTotalPrice').AsFloat;
  645. vInfo.Attributes['PhasePay'] := InfoRec.ValueByName('PhasePay').AsFloat;
  646. vInfo.Attributes['Deal_BGLTotalPrice'] := InfoRec.ValueByName('Deal_BGLTotalPrice').AsFloat;
  647. vInfo.Attributes['PhaseCount'] := InfoRec.ValueByName('PhaseCount').AsInteger;
  648. vInfo.Attributes['AuditStatus'] := InfoRec.ValueByName('AuditStatus').AsInteger;
  649. vInfo.Attributes['FileName'] := ExtractSimpleFileName(FResultFile);
  650. if G_IsCloud then
  651. begin
  652. vInfo.Attributes['WebID'] := InfoRec.ValueByName('WebID').AsInteger;
  653. vInfo.Attributes['WebOwnerID'] := InfoRec.ValueByName('WebOwnerID').AsInteger;
  654. vInfo.Attributes['WebAuthorID'] := InfoRec.ValueByName('WebAuthorID').AsInteger;
  655. end;
  656. end;
  657. procedure TTenderExport.SaveTenderProperty(AXmlNode: IXMLNode);
  658. var
  659. vProp: IXMLNode;
  660. begin
  661. vProp := AXmlNode.AddChild('TenderProperty');
  662. end;
  663. { TProjectExport }
  664. constructor TProjectExport.Create(ANode: TsdIDTreeNode; const AFileName: string; AExportAttachment: Boolean);
  665. begin
  666. FTempFolder := GenerateTempFolder(GetTempFilePath);
  667. FExportNode := ANode;
  668. FResultFile := AFileName;
  669. FExportAttachment := AExportAttachment;
  670. FXmlInfoFile := FTempFolder + '\TreeInfo.xml';
  671. end;
  672. destructor TProjectExport.Destroy;
  673. begin
  674. DeleteFileOrFolder(FTempFolder);
  675. inherited;
  676. end;
  677. procedure TProjectExport.Execute;
  678. begin
  679. ExportXmlInfo;
  680. ExportNode(FExportNode.FirstChild, FTempFolder + '\');
  681. ZipFolder(FTempFolder, FResultFile);
  682. end;
  683. procedure TProjectExport.ExportNode(ANode: TsdIDTreeNode;
  684. const AExportPath: string);
  685. var
  686. ACurPath: string;
  687. begin
  688. if not Assigned(ANode) then Exit;
  689. if ANode.HasChildren or (ANode.Rec.ValueByName('Type').AsInteger = 0) then
  690. begin
  691. ACurPath := AExportPath + ANode.Rec.ValueByName('Name').AsString + '\';
  692. CreateDirectoryInDeep(ACurPath);
  693. ExportNode(ANode.FirstChild, ACurPath);
  694. end
  695. else
  696. ExportTender(ANode, AExportPath);
  697. ExportNode(ANode.NextSibling, AExportPath);
  698. end;
  699. procedure TProjectExport.ExportTender(ANode: TsdIDTreeNode;
  700. const AExportPath: string);
  701. begin
  702. FTenderExportor := TTenderExport.Create(ANode.Rec,
  703. AExportPath + ANode.Rec.ValueByName('Name').AsString);
  704. try
  705. FTenderExportor.Execute(FExportAttachment);
  706. finally
  707. FTenderExportor.Free;
  708. end;
  709. end;
  710. procedure TProjectExport.ExportXmlInfo;
  711. var
  712. FXmlDocument: IXMLDocument;
  713. begin
  714. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  715. try
  716. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAttrNull,doAutoPrefix,doNamespaceDecl];
  717. FXmlDocument.Active := True;
  718. FXmlDocument.Encoding := 'GB2312';
  719. FXmlDocument.AddChild('ProjectTreeInfo');
  720. SaveTreeNodeInfo(FXmlDocument.DocumentElement, FExportNode.FirstChild);
  721. FXmlDocument.SaveToFile(FXmlInfoFile);
  722. finally
  723. FXmlDocument := nil;
  724. end;
  725. end;
  726. procedure TProjectExport.SaveTreeNodeInfo(AXmlNode: IXMLNode;
  727. ANode: TsdIDTreeNode);
  728. var
  729. CurNode: IXMLNode;
  730. begin
  731. if not Assigned(ANode) then Exit;
  732. CurNode := AXmlNode.AddChild('TreeNode');
  733. CurNode.Attributes['Name'] := ANode.Rec.ValueByName('Name').AsString;
  734. CurNode.Attributes['Type'] := ANode.Rec.ValueByName('Type').AsInteger;
  735. if ANode.HasChildren then
  736. SaveTreeNodeInfo(CurNode, ANode.FirstChild);
  737. SaveTreeNodeInfo(AXmlNode, ANode.NextSibling);
  738. end;
  739. { TProjectImport }
  740. function TProjectImport.AddNewNode(AParentID, ANextID: Integer;
  741. const ANodeName: string): TsdIDTreeNode;
  742. begin
  743. with ProjectManager.ProjectsTree do
  744. Result := Add(AParentID, ANextID);
  745. Result.Rec.ValueByName('Name').AsString := ANodeName;
  746. Result.Rec.ValueByName('Type').AsInteger := 0;
  747. end;
  748. constructor TProjectImport.Create(ASelect: TsdIDTreeNode;
  749. const AProjectName, AFileName: string);
  750. begin
  751. FSelect := ASelect;
  752. FProjectName := AProjectName;
  753. FFileName := AFileName;
  754. FTempFolder := GenerateTempFolder(GetTempFilePath);
  755. end;
  756. destructor TProjectImport.Destroy;
  757. begin
  758. DeleteFileOrFolder(FTempFolder);
  759. inherited;
  760. end;
  761. procedure TProjectImport.Execute;
  762. begin
  763. UnZipFile(FFileName, FTempFolder);
  764. // ID 188 需求变更,一直作为后兄弟节点导入
  765. {if FSelect.Rec.ValueByName('Type').AsInteger = 1 then
  766. FNew := AddNewNode(FSelect.ParentID, FSelect.NextSiblingID, FProjectName)
  767. else
  768. FNew := AddNewNode(FSelect.ID, -1, FProjectName);}
  769. FNew := AddNewNode(FSelect.ParentID, FSelect.NextSiblingID, FProjectName);
  770. LoadChildrenFormXml;
  771. end;
  772. procedure TProjectImport.LoadChild(AXmlNode: IXMLNode;
  773. AParent: TsdIDTreeNode; const APath: string);
  774. var
  775. I, iType: Integer;
  776. XmlNode: IXMLNode;
  777. stnNewNode: TsdIDTreeNode;
  778. begin
  779. for I := 0 to AXmlNode.ChildNodes.Count - 1 do
  780. begin
  781. XmlNode := AXmlNode.ChildNodes.Get(I);
  782. iType := XmlNode.Attributes['Type'];
  783. if iType = 0 then
  784. begin
  785. stnNewNode := AddNewNode(AParent.ID, -1, XmlNode.Attributes['Name']);
  786. if XmlNode.HasChildNodes then
  787. LoadChild(XmlNode, stnNewNode, APath + XmlNode.Attributes['Name'] + '\');
  788. end
  789. else
  790. LoadTender(XmlNode, AParent, APath);
  791. end;
  792. end;
  793. procedure TProjectImport.LoadChildrenFormXml;
  794. var
  795. FXmlDocument: IXMLDocument;
  796. XmlNode: IXMLNode;
  797. FRootList: IXMLNodeList;
  798. begin
  799. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  800. try
  801. FXmlDocument.LoadFromFile(FTempFolder + '\TreeInfo.xml');
  802. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  803. XmlNode := FXmlDocument.DocumentElement;
  804. LoadChild(XmlNode, FNew, FTempFolder + '\');
  805. finally
  806. FRootList := nil;
  807. FXmlDocument := nil;
  808. end;
  809. end;
  810. procedure TProjectImport.LoadTender(AXmlNode: IXMLNode;
  811. AParent: TsdIDTreeNode; const APath: string);
  812. var
  813. TenderImportor: TTenderImport;
  814. begin
  815. TenderImportor := TTenderImport.Create(AParent,
  816. AXmlNode.Attributes['Name'], APath + AXmlNode.Attributes['Name']);
  817. try
  818. TenderImportor.Execute;
  819. finally
  820. TenderImportor.Free;
  821. end;
  822. end;
  823. { TTenderImport }
  824. constructor TTenderImport.Create(ASelect: TsdIDTreeNode;
  825. const AProjectName, AFileName: string);
  826. begin
  827. FSelect := ASelect;
  828. FProjectName := AProjectName;
  829. FFileName := AFileName;
  830. FTempFolder := GenerateTempFolder(GetTempFilePath);
  831. end;
  832. destructor TTenderImport.Destroy;
  833. begin
  834. DeleteFileOrFolder(FTempFolder);
  835. inherited;
  836. end;
  837. procedure TTenderImport.Execute;
  838. var
  839. sFile, sFJ: string;
  840. begin
  841. UnZipFile(FFileName, FTempFolder);
  842. GetNewNode;
  843. LoadXmlInfo;
  844. sFile := FTempFolder + '\' + FTenderFileName;
  845. sFJ := sFile + '[附件包]';
  846. CopyFileOrFolder(sFile, GetMyProjectsFilePath + FNewNode.Rec.ValueByName('FileName').AsString);
  847. if not G_IsCloud then // 云版附件从服务器获取,不导入。
  848. if DirectoryExists(sFJ) then
  849. CopyFolder(sFJ, GetMyProjectsFilePath + 'Attachment\' + FNewNode.Rec.ValueByName('FileName').AsString);
  850. end;
  851. procedure TTenderImport.GetNewNode;
  852. begin
  853. if FSelect.Rec.ValueByName('Type').AsInteger = 1 then
  854. FNewNode := ProjectManager.ProjectsTree.Add(FSelect.ParentID, FSelect.NextSiblingID)
  855. else
  856. FNewNode := ProjectManager.ProjectsTree.Add(FSelect.ID, -1);
  857. FNewNode.Rec.ValueByName('Name').AsString := FProjectName;
  858. FNewNode.Rec.ValueByName('Type').AsInteger := 1;
  859. FNewNode.Rec.ValueByName('FileName').AsString := ExtractSimpleFileName(GetNewGUIDFileName(GetMyProjectsFilePath));
  860. end;
  861. procedure TTenderImport.ImportToSelect;
  862. begin
  863. UnZipFile(FFileName, FTempFolder);
  864. FNewNode := FSelect;
  865. LoadXmlInfo;
  866. CopyFileOrFolder(FTempFolder + '\' + FTenderFileName,
  867. GetMyProjectsFilePath + FNewNode.Rec.ValueByName('FileName').AsString);
  868. end;
  869. procedure TTenderImport.LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
  870. var
  871. ChildNodes: IXMLNodeList;
  872. begin
  873. ChildNodes := AXmlNode.ChildNodes;
  874. LoadProjectInfo(ChildNodes.FindNode('ProjectInfo'));
  875. LoadTenderProperty(ChildNodes.FindNode('TenderProperty'));
  876. end;
  877. procedure TTenderImport.LoadProjectInfo(AXmlNode: IXMLNode);
  878. begin
  879. FTenderFileName := AXmlNode.Attributes['FileName'];
  880. FNewNode.Rec.ValueByName('DealTotalPrice').AsFloat := AXmlNode.Attributes['DealTotalPrice'];
  881. FNewNode.Rec.ValueByName('PhaseTotalPrice').AsFloat := AXmlNode.Attributes['PhaseTotalPrice'];
  882. FNewNode.Rec.ValueByName('EndDealTotalPrice').AsFloat := AXmlNode.Attributes['EndDealTotalPrice'];
  883. FNewNode.Rec.ValueByName('EndChangeTotalPrice').AsFloat := AXmlNode.Attributes['EndChangeTotalPrice'];
  884. FNewNode.Rec.ValueByName('EndTotalPrice').AsFloat := AXmlNode.Attributes['EndTotalPrice'];
  885. FNewNode.Rec.ValueByName('PreTotalPrice').AsFloat := AXmlNode.Attributes['PreTotalPrice'];
  886. FNewNode.Rec.ValueByName('PhasePay').AsFloat := AXmlNode.Attributes['PhasePay'];
  887. if AXmlNode.HasAttribute('Deal_BGLTotalPrice') then
  888. FNewNode.Rec.ValueByName('Deal_BGLTotalPrice').AsFloat := AXmlNode.Attributes['Deal_BGLTotalPrice'];
  889. FNewNode.Rec.ValueByName('PhaseCount').AsInteger := AXmlNode.Attributes['PhaseCount'];
  890. FNewNode.Rec.ValueByName('AuditStatus').AsInteger := AXmlNode.Attributes['AuditStatus'];
  891. FNewNode.Rec.ValueByName('CreateDate').AsString := FormatDateTime('yyyy-mm-dd', Date);
  892. if G_IsCloud then
  893. begin
  894. FNewNode.Rec.ValueByName('WebID').AsInteger := AXmlNode.Attributes['WebID'];
  895. FNewNode.Rec.ValueByName('WebOwnerID').AsInteger := AXmlNode.Attributes['WebOwnerID'];
  896. FNewNode.Rec.ValueByName('WebAuthorID').AsInteger := AXmlNode.Attributes['WebAuthorID'];
  897. end;
  898. end;
  899. procedure TTenderImport.LoadTenderProperty(AXmlNode: IXMLNode);
  900. begin
  901. // TODO
  902. end;
  903. procedure TTenderImport.LoadXmlInfo;
  904. var
  905. FXmlDocument: IXMLDocument;
  906. XmlNode: IXMLNode;
  907. FRootList: IXMLNodeList;
  908. begin
  909. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  910. try
  911. FXmlDocument.LoadFromFile(FTempFolder + '\Info.xml');
  912. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  913. XmlNode := FXmlDocument.DocumentElement;
  914. LoadInfoFromXmlDocument(XmlNode);
  915. finally
  916. FRootList := nil;
  917. FXmlDocument := nil;
  918. end;
  919. end;
  920. { TTenderFileChecker }
  921. function TTenderFileChecker.CheckFileMatchXml: Boolean;
  922. var
  923. FProjectData: TProjectData;
  924. begin
  925. FProjectData := TProjectData.Create;
  926. try
  927. try
  928. FProjectData.SimpleOpen(FTenderFileName);
  929. Result := FProjectData.CheckDataBaseInfo(FPhaseCount, FAuditStatus);
  930. except
  931. Result := False;
  932. end;
  933. finally
  934. FProjectData.Free;
  935. end;
  936. end;
  937. function TTenderFileChecker.CheckFileValid(const AFileName: string): Boolean;
  938. begin
  939. FTempFolder := GenerateTempFolder(GetTempFilePath);
  940. FTenderTempFolder := FTempFolder + '\Tender';
  941. CreateDirectoryInDeep(FTenderTempFolder);
  942. try
  943. Result := DecryptFile(AFileName) and CheckFileMatchXml;
  944. finally
  945. DeleteFileOrFolder(FTempFolder);
  946. end;
  947. end;
  948. function TTenderFileChecker.DecryptFile(const AFileName: string): Boolean;
  949. begin
  950. Result := UnZipFile(AFileName, FTempFolder);
  951. if not Result then Exit;
  952. LoadInfo;
  953. Result := UnZipFile(FTenderFileName, FTenderTempFolder);
  954. end;
  955. procedure TTenderFileChecker.LoadInfo;
  956. begin
  957. LoadInfoFromXml;
  958. end;
  959. procedure TTenderFileChecker.LoadInfoFromXml;
  960. var
  961. FXmlDocument: IXMLDocument;
  962. XmlNode: IXMLNode;
  963. FRootList: IXMLNodeList;
  964. begin
  965. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  966. try
  967. FXmlDocument.LoadFromFile(FTempFolder + '\Info.xml');
  968. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  969. XmlNode := FXmlDocument.DocumentElement;
  970. LoadInfoFromXmlDocument(XmlNode);
  971. finally
  972. FRootList := nil;
  973. FXmlDocument := nil;
  974. end;
  975. end;
  976. procedure TTenderFileChecker.LoadInfoFromXmlDocument(AXmlNode: IXMLNode);
  977. var
  978. ChildNodes: IXMLNodeList;
  979. begin
  980. ChildNodes := AXmlNode.ChildNodes;
  981. LoadProjectInfo(ChildNodes.FindNode('ProjectInfo'));
  982. end;
  983. procedure TTenderFileChecker.LoadProjectInfo(AXmlNode: IXMLNode);
  984. begin
  985. FProjectName := AXmlNode.Attributes['ProjectName'];
  986. FPhaseCount := AXmlNode.Attributes['PhaseCount'];
  987. FAuditStatus := AXmlNode.Attributes['AuditStatus'];
  988. FTenderFileName := FTempFolder + '\' + AXmlNode.Attributes['FileName'];
  989. end;
  990. end.