ProjectCommands.pas 32 KB

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