ProjectData.pas 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513
  1. unit ProjectData;
  2. interface
  3. uses
  4. Connections, BillsDm, PhaseData, UpdateDataBase, ZhAPI, ProjectProperty,
  5. PhaseCompareDm, DealPaymentDm, SearchDm, DealBillsDm, MainDataListDm,
  6. BillsGatherDm, BGLDm, StaffDm, BillsCompileDm, BillsMeasureDm,
  7. BillsBookmarkDm, UpFileManageUnit,
  8. Classes, SysUtils, ADODB, sdDB, Checker;
  9. type
  10. TProjectData = class
  11. private
  12. // 临时文件夹,解压项目后存放文件的文件夹
  13. FTempFolder: string;
  14. // 项目管理界面看到的项目名称
  15. FProjectName: string;
  16. FFileName: string;
  17. FProjectID: Integer;
  18. FConnection: TEncryptConnection;
  19. FUpdator: TUpdateProjectDB;
  20. FIsNewFile: Boolean;
  21. FBillsData: TBillsData;
  22. FBillsCompileData: TBillsCompileData;
  23. FBillsMeasureData: TBillsMeasureData;
  24. FBillsBookmarkData: TBillsBookmarkData;
  25. FDealBillsData: TDealBillsData;
  26. FProjProperties: TProjProperties;
  27. FPhaseIndex: Integer;
  28. FPhaseData: TPhaseData;
  29. FPhaseCompareData: TPhaseCompareData;
  30. FBillsGatherData: TBillsGatherData;
  31. FDealPaymentData: TDealPaymentData;
  32. FBGLData: TBGLData;
  33. FStaffData: TStaffData;
  34. FSearchData: TSearchData;
  35. FMainListData: TMainListData;
  36. FCanUnlockInfo: Boolean;
  37. FWebID: Integer;
  38. FWebOwnerID: Integer;
  39. FWebAuthorID: Integer;
  40. FAuthorHasSubmited: Boolean;
  41. FProjectReadOnly: Boolean;
  42. FAttachmentData: TUpFiles;
  43. FCheckers: TCheckers;
  44. {For Open}
  45. procedure UpdateProjectDataBase;
  46. procedure CheckNewFile(AConnection: TADOConnection);
  47. procedure OpenLastPhaseData;
  48. procedure UpdateOldData;
  49. procedure SaveInfoToManager;
  50. procedure ExecuteSql(const ASql: string);
  51. // 备份0号台账的历史数据
  52. procedure CopyLedgerHistoryData(AAudit: Integer);
  53. // 备份各期的截止本期累计完成数据
  54. procedure CopyPhaseCompleteData;
  55. procedure SetPhaseIndexSimple(AIndex: Integer);
  56. // 锁定数据 -- Sql语句方式(使用时注意相应的DataMoudle应处于关闭状态)
  57. procedure LockBillsBaseData;
  58. procedure LockDealPaymentData;
  59. procedure LockBGLData;
  60. procedure UpdatePhaseData;
  61. procedure CloseAllData;
  62. procedure OpenAllData;
  63. function GetMainFileName: string;
  64. procedure SetPhaseIndex(const Value: Integer);
  65. function GetTempPath: string;
  66. function GetProjectFileName: string;
  67. function GetAllowInsert: Boolean;
  68. function GetBaseDataReadOnly: Boolean;
  69. function GetADOConnection: TADOConnection;
  70. procedure SetCheckers(const Value: TCheckers);
  71. function GetStageDataReadOnly: Boolean;
  72. public
  73. constructor Create;
  74. destructor Destroy; override;
  75. procedure Open(AProjRec: TsdDataRecord);
  76. procedure Save;
  77. //----------------------- Begin ---后台打开 ------------------------
  78. {总说明:
  79. 为节省内存使用,对不同的后台打开分别写不同的方法
  80. 按需使用,稍有不同,则新增后台打开方法
  81. 变更(新增)方法须同步变更(新增)注释
  82. }
  83. {OpenForSubmit: ProjProperties, StaffData}
  84. procedure OpenForSubmit(const AFileName: string);
  85. procedure SaveAsForSubmit(const AFileName: string);
  86. {OpenForReply: ProjProperties, StaffData, PhaseData}
  87. procedure OpenForReply(const AFileName: string);
  88. procedure SaveForReply(const AFileName: string);
  89. {OpenForReceive: ProjProperties, StaffData, PhaseData, StageData}
  90. procedure OpenForReceive(const AFileName: string);
  91. procedure SaveForReceive(const AFileName: string);
  92. {SimpleOpen: 仅打开数据库[项目+最后一期],不打开除属性以外的任何数据表(项目属性都是通过Sql语句修改)}
  93. procedure SimpleOpen(const AFileName: string);
  94. procedure SimpleSaveAs(const AFileName: string);
  95. {OpenForReport: BillsData, BillsCompileData, DealPaymentData, BGLData 报表仅读取数据不做任何修改}
  96. procedure OpenForReport(const AFileName: string);
  97. {OpenForReport2: OpenForReport的基础上打开最后一期数据}
  98. procedure OpenForReport2(const AFileName: string);
  99. {OpenForReport3: OpenForReport2的基础上打开最后一个审核人数据,打开BillsMeasureTree不打开BillsCompileTree,链接BillsMeasureTree跟StageData}
  100. procedure OpenForReport3(const AFileName: string);
  101. //----------------------- End ---后台打开 ------------------------
  102. procedure SaveLastestPhaseMainData;
  103. procedure CreateNewPhase;
  104. {重设所有LookUpDataset连接}
  105. procedure ResetPhaseDataLink;
  106. {重设所有DataView小数位数显示}
  107. procedure ResetFloatDigitView;
  108. {锁定数据}
  109. // 上报
  110. procedure LockedDataForSubmit;
  111. // 终审批复
  112. procedure LockedDataForReply;
  113. {创建审核数据}
  114. procedure UpdateDataForReceive;
  115. // 上报文件
  116. procedure SubmitProject(const AFileName: string = '');
  117. // 批复文件
  118. procedure ReplyProject(const AFileName: string = '');
  119. // json文件:清单
  120. procedure ExportJson_Bills(const AFileName: string);
  121. procedure ExportJson_Common(const AFileName: string);
  122. // 断开所有树的链接
  123. procedure DisConnectTree;
  124. // 重新连接所有的树
  125. procedure ReConnectTree;
  126. {For Reports: 复制当期的全部数据到项目数据中}
  127. procedure CopyPhaseData;
  128. procedure CalculateAll;
  129. procedure ImportCloudTenderFile(const AFileName: string);
  130. function CheckPassword: Boolean;
  131. function CurUserIsOwner: Boolean;
  132. function CurUserIsAuthor: Boolean;
  133. function CurUserIsChecker: Boolean;
  134. property BillsData: TBillsData read FBillsData;
  135. property BillsCompileData: TBillsCompileData read FBillsCompileData;
  136. property BillsMeasureData: TBillsMeasureData read FBillsMeasureData;
  137. property BillsBookmarkData: TBillsBookmarkData read FBillsBookmarkData;
  138. property DealBillsData: TDealBillsData read FDealBillsData;
  139. property PhaseIndex: Integer read FPhaseIndex write SetPhaseIndex;
  140. property PhaseData: TPhaseData read FPhaseData;
  141. property ProjProperties: TProjProperties read FProjProperties;
  142. property PhaseCompareData: TPhaseCompareData read FPhaseCompareData;
  143. property BillsGatherData: TBillsGatherData read FBillsGatherData;
  144. property DealPaymentData: TDealPaymentData read FDealPaymentData;
  145. property BGLData: TBGLData read FBGLData;
  146. property StaffData: TStaffData read FStaffData;
  147. property SearchData: TSearchData read FSearchData;
  148. property MainListData: TMainListData read FMainListData;
  149. property AttachmentData: TUpFiles read FAttachmentData; // 附件
  150. // 台账、合同支付
  151. property AllowInsert: Boolean read GetAllowInsert;
  152. property BaseDataReadOnly: Boolean read GetBaseDataReadOnly;
  153. property StageDataReadOnly: Boolean read GetStageDataReadOnly;
  154. property CanUnlockInfo: Boolean read FCanUnlockInfo write FCanUnlockInfo;
  155. property ProjectName: string read FProjectName;
  156. // 磁盘上存储该项目的文件名称
  157. property FileName: string read FFileName;
  158. property ProjectID: Integer read FProjectID;
  159. property MainFileName: string read GetMainFileName;
  160. property TempPath: string read GetTempPath;
  161. property ADOConnection: TADOConnection read GetADOConnection;
  162. property WebID: Integer read FWebID;
  163. property WebOwnerID: Integer read FWebOwnerID;
  164. property WebAuthorID: Integer read FWebAuthorID;
  165. property AuthorHasSubmited: Boolean read FAuthorHasSubmited write FAuthorHasSubmited;
  166. property ProjectReadOnly: Boolean read FProjectReadOnly;
  167. property Checkers: TCheckers read FCheckers write SetCheckers;
  168. end;
  169. implementation
  170. uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
  171. ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm;
  172. { TProjectData }
  173. procedure TProjectData.CheckNewFile(AConnection: TADOConnection);
  174. var
  175. FTableList: TStringList;
  176. begin
  177. FTableList := TStringList.Create;
  178. try
  179. AConnection.GetTableNames(FTableList);
  180. FIsNewFile := FTableList.Count = 0;
  181. finally
  182. FTableList.Free;
  183. end;
  184. end;
  185. procedure TProjectData.CopyLedgerHistoryData(AAudit: Integer);
  186. const
  187. sSql = 'Select ID as BillsID, Quantity, TotalPrice, QtyFlag, QtyFormula ' +
  188. 'Into LedgerHistory%d '+
  189. 'From Bills';
  190. begin
  191. ExecuteSql(Format(sSql, [AAudit]));
  192. end;
  193. constructor TProjectData.Create;
  194. begin
  195. FCheckers := TCheckers.Create;
  196. FTempFolder := GenerateTempFolder(GetTempFilePath);
  197. FConnection := TEncryptConnection.Create;
  198. FUpdator := TUpdateProjectDB.Create;
  199. FProjProperties := TProjProperties.Create(Self);
  200. FBillsData := TBillsData.Create(Self);
  201. FBillsCompileData := TBillsCompileData.Create(Self);
  202. FBillsMeasureData := TBillsMeasureData.Create(Self);
  203. FBillsBookmarkData := TBillsBookmarkData.Create(Self);
  204. FDealBillsData := TDealBillsData.Create(Self);
  205. FPhaseData := TPhaseData.Create(Self);
  206. FPhaseCompareData := TPhaseCompareData.Create(Self);
  207. FBillsGatherData := TBillsGatherData.Create(Self);
  208. FDealPaymentData := TDealPaymentData.Create(Self);
  209. FBGLData := TBGLData.Create(Self);
  210. FStaffData := TStaffData.Create(Self);
  211. FSearchData := TSearchData.Create(Self);
  212. FMainListData := TMainListData.Create(Self);
  213. FAttachmentData := TUpFiles.Create;
  214. FPhaseIndex := 0;
  215. end;
  216. procedure TProjectData.CreateNewPhase;
  217. var
  218. sPhaseFileName: string;
  219. begin
  220. FBillsData.LockedBaseData;
  221. FProjProperties.PhaseCount := FProjProperties.PhaseCount + 1;
  222. FProjProperties.AuditStatus := 0;
  223. FStaffData.UpdateDataForNewPhase;
  224. sPhaseFileName := Format('%s\Phase%d.dat', [TempPath, FProjProperties.PhaseCount]);
  225. CopyFileOrFolder(GetEmptyDataBaseFileName, sPhaseFileName);
  226. end;
  227. destructor TProjectData.Destroy;
  228. begin
  229. FCheckers.Free;
  230. FMainListData.Free;
  231. FSearchData.Free;
  232. FStaffData.Free;
  233. FBGLData.Free;
  234. FDealPaymentData.Free;
  235. FPhaseCompareData.Free;
  236. FPhaseData.Free;
  237. FProjProperties.Free;
  238. FDealBillsData.Free;
  239. FBillsBookmarkData.Free;
  240. FBillsMeasureData.Free;
  241. FBillsCompileData.Free;
  242. FBillsData.Free;
  243. FAttachmentData.Free;
  244. FUpdator.Free;
  245. FConnection.Free;
  246. DeleteFileOrFolder(FTempFolder);
  247. inherited;
  248. end;
  249. function TProjectData.GetBaseDataReadOnly: Boolean;
  250. begin
  251. if FProjProperties.PhaseCount = 0 then
  252. Result := False
  253. else
  254. Result := not AllowInsert;
  255. end;
  256. function TProjectData.GetAllowInsert: Boolean;
  257. begin
  258. if FPhaseData.Active then
  259. Result := FPhaseData.AllowInsert
  260. else
  261. Result := True;
  262. end;
  263. function TProjectData.GetMainFileName: string;
  264. begin
  265. Result := TempPath + 'Main.dat';
  266. end;
  267. function TProjectData.GetProjectFileName: string;
  268. begin
  269. Result := GetMyProjectsFilePath + FProjectName;
  270. end;
  271. function TProjectData.GetTempPath: string;
  272. begin
  273. Result := FTempFolder + '\';
  274. end;
  275. procedure TProjectData.LockedDataForReply;
  276. begin
  277. LockBillsBaseData;
  278. LockDealPaymentData;
  279. FPhaseData.PhaseProperty.FinalAudit := True;
  280. // 有顺序限制,谨慎修改
  281. FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
  282. FProjProperties.AuditStatus := -1;
  283. FProjProperties.FinalAuditCount := FProjProperties.PhaseCount;
  284. FStaffData.LockedDataForReply;
  285. LockBGLData;
  286. end;
  287. procedure TProjectData.LockedDataForSubmit;
  288. begin
  289. LockBillsBaseData;
  290. LockDealPaymentData;
  291. FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
  292. FStaffData.LockedDataForAudit;
  293. LockBGLData;
  294. end;
  295. procedure TProjectData.Open(AProjRec: TsdDataRecord);
  296. begin
  297. {Open规则:在打开Phase或者设置PhaseIndex时,会设置多个LookUpDataset,
  298. 故要求须在BillsData、DealPayment打开之后}
  299. FProjectName := AProjRec.ValueByName('Name').AsString;
  300. FFileName := GetMyProjectsFilePath + AProjRec.ValueByName('FileName').AsString;
  301. FProjectID := AProjRec.ValueByName('ID').AsInteger;
  302. FWebID := AProjRec.ValueByName('WebID').AsInteger;
  303. FWebOwnerID := AProjRec.ValueByName('WebOwnerID').AsInteger;
  304. FWebAuthorID := AProjRec.ValueByName('WebAuthorID').AsInteger;
  305. FAttachmentData.ProjectData := Self;
  306. FAttachmentData.LoadDatas;
  307. UpdateSysProgress(5, '正在打开项目');
  308. UnZipFile(FileName, TempPath);
  309. UpdateSysProgress(10, '正在打开项目');
  310. FConnection.Open(MainFileName);
  311. CheckNewFile(FConnection.Connection);
  312. UpdateSysProgress(15, '正在升级文件');
  313. UpdateProjectDataBase;
  314. UpdateSysProgress(20, '正在读取数据');
  315. FProjProperties.Open(FConnection.Connection);
  316. if FIsNewFile then
  317. FProjProperties.UpdateFlag := 1;
  318. UpdateOldData;
  319. ResetFloatDigitView;
  320. UpdateSysProgress(25, '正在读取数据');
  321. FBillsData.Open(FConnection.Connection);
  322. if FIsNewFile then
  323. FBillsData.InitBills;
  324. FBillsCompileData.Open;
  325. FBillsMeasureData.Open;
  326. UpdateSysProgress(65, '正在读取数据');
  327. FBillsBookmarkData.Open;
  328. UpdateSysProgress(70, '正在读取数据');
  329. FDealBillsData.Open(FConnection.Connection);
  330. UpdateSysProgress(80, '正在读取数据');
  331. FDealPaymentData.Open(FConnection.Connection);
  332. if FIsNewFile then
  333. FDealPaymentData.Init;
  334. UpdateSysProgress(90, '正在读取数据');
  335. OpenLastPhaseData;
  336. UpdateSysProgress(140, '正在读取数据');
  337. FBGLData.Open(FConnection.Connection);
  338. UpdateSysProgress(160, '正在读取数据');
  339. FStaffData.Open(FConnection.Connection);
  340. UpdateSysProgress(180, '正在读取数据');
  341. //FBillsGatherData.RefreshBills;
  342. FMainListData.Open(FConnection.Connection);
  343. UpdateSysProgress(200, '就绪');
  344. end;
  345. procedure TProjectData.OpenLastPhaseData;
  346. begin
  347. if ProjProperties.PhaseCount = 0 then Exit;
  348. FPhaseIndex := ProjProperties.PhaseCount;
  349. FProjProperties.PhaseIndex := FPhaseIndex;
  350. FPhaseData.Open(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  351. ResetPhaseDataLink;
  352. end;
  353. procedure TProjectData.Save;
  354. begin
  355. UpdateSysProgress(5, '正在保存数据');
  356. SaveLastestPhaseMainData;
  357. if FPhaseData.Active then
  358. FPhaseData.Save;
  359. UpdateSysProgress(20, '正在保存数据');
  360. FMainListData.Save;
  361. FDealPaymentData.Save;
  362. UpdateSysProgress(40, '正在保存数据');
  363. FStaffData.Save;
  364. UpdateSysProgress(50, '正在保存数据');
  365. FBGLData.Save;
  366. UpdateSysProgress(60, '正在保存数据');
  367. FDealBillsData.Save;
  368. UpdateSysProgress(80, '正在保存数据');
  369. FBillsCompileData.ReLockBaseData;
  370. UpdateSysProgress(85, '正在保存数据');
  371. FBillsData.Save;
  372. UpdateSysProgress(170, '正在保存数据');
  373. FProjProperties.Save;
  374. UpdateSysProgress(180, '正在保存数据');
  375. FConnection.Save;
  376. UpdateSysProgress(190, '正在保存数据');
  377. ZipFolder(FTempFolder, FileName);
  378. SaveInfoToManager;
  379. UpdateSysProgress(200, '就绪');
  380. ProjectManager.AddSaveTenderBackup(FProjectID);
  381. end;
  382. procedure TProjectData.SaveInfoToManager;
  383. var
  384. InfoRec, PhaseRec: TsdDataRecord;
  385. begin
  386. InfoRec := ProjectManager.sddProjectsInfo.FindKey('idxID', FProjectID);
  387. PhaseRec := MainListData.GetPhaseMainRecord(ProjProperties.PhaseCount);
  388. InfoRec.ValueByName('DealTotalPrice').AsFloat := FBillsData.Settlement[DealIndex];
  389. InfoRec.ValueByName('Deal_BGLTotalPrice').AsFloat := FBillsData.Settlement[DealIndex] + FBGLData.AllBGLTotalPrice;
  390. InfoRec.ValueByName('PhaseTotalPrice').AsFloat := PhaseRec.ValueByName('GatherTotalPrice').AsFloat;
  391. InfoRec.ValueByName('EndDealTotalPrice').AsFloat := PhaseRec.ValueByName('EndDealTotalPrice').AsFloat;
  392. InfoRec.ValueByName('EndChangeTotalPrice').AsFloat :=
  393. PhaseRec.ValueByName('EndQcTotalPrice').AsFloat + PhaseRec.ValueByName('EndPcTotalPrice').AsFloat;
  394. InfoRec.ValueByName('EndTotalPrice').AsFloat := PhaseRec.ValueByName('EndGatherTotalPrice').AsFloat;
  395. InfoRec.ValueByName('PreTotalPrice').AsFloat := PhaseRec.ValueByName('PreGatherTotalPrice').AsFloat;
  396. InfoRec.ValueByName('PhasePay').AsFloat := PhaseRec.ValueByName('PhasePay').AsFloat;
  397. InfoRec.ValueByName('PhaseCount').AsInteger := FProjProperties.PhaseCount;
  398. InfoRec.ValueByName('AuditStatus').AsInteger := FProjProperties.AuditStatus;
  399. ProjectManager.Save;
  400. end;
  401. procedure TProjectData.SetPhaseIndex(const Value: Integer);
  402. function GetPhaseFileName: string;
  403. begin
  404. Result := Format('%s\Phase%d.dat', [TempPath, FPhaseIndex]);
  405. end;
  406. procedure ReCreatePhaseData;
  407. begin
  408. if FPhaseData.Active then
  409. FPhaseData.Save;
  410. FPhaseData.Free;
  411. FPhaseData := TPhaseData.Create(Self);
  412. end;
  413. begin
  414. SaveLastestPhaseMainData;
  415. FPhaseIndex := Value;
  416. ProjProperties.PhaseIndex := FPhaseIndex;
  417. ReCreatePhaseData;
  418. FPhaseData.Open(GetPhaseFileName);
  419. ResetPhaseDataLink;
  420. //BillsGatherData.RefreshBills;
  421. end;
  422. procedure TProjectData.SetPhaseIndexSimple(AIndex: Integer);
  423. begin
  424. FPhaseIndex := AIndex;
  425. if FPhaseData.Active then
  426. FPhaseData.SimpleSave;
  427. FPhaseData.Free;
  428. FPhaseData := TPhaseData.Create(Self);
  429. FPhaseData.SimpleOpen(Format('%s\Phase%d.dat', [TempPath, FPhaseIndex]));
  430. end;
  431. procedure TProjectData.UpdateProjectDataBase;
  432. begin
  433. FUpdator.Update(FConnection);
  434. end;
  435. procedure TProjectData.ResetPhaseDataLink;
  436. begin
  437. BillsMeasureData.ResetPhaseStageLink;
  438. BillsMeasureData.ResetTreeNodeStageRec;
  439. DealPaymentData.ResetPhaseLink;
  440. BillsBookmarkData.ResetPhaseStageLink;
  441. end;
  442. procedure TProjectData.SimpleOpen(const AFileName: string);
  443. begin
  444. FProjectID := -1;
  445. UnZipFile(AFileName, TempPath);
  446. FConnection.Open(MainFileName);
  447. FProjProperties.Open(FConnection.Connection);
  448. if ProjProperties.PhaseCount > 0 then
  449. begin
  450. FPhaseIndex := ProjProperties.PhaseCount;
  451. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  452. end;
  453. end;
  454. procedure TProjectData.SimpleSaveAs(const AFileName: string);
  455. begin
  456. if FPhaseData.Active then
  457. FPhaseData.SimpleSave;
  458. FProjProperties.Save;
  459. FConnection.Save;
  460. ZipFolder(FTempFolder, AFileName);
  461. end;
  462. procedure TProjectData.UpdateDataForReceive;
  463. begin
  464. UpdatePhaseData;
  465. end;
  466. procedure TProjectData.UpdatePhaseData;
  467. var
  468. iPhase: Integer;
  469. begin
  470. FProjProperties.AuditStatus := FProjProperties.AuditStatus + 1;
  471. for iPhase := FProjProperties.FinalAuditCount + 1 to FProjProperties.PhaseCount do
  472. begin
  473. SetPhaseIndexSimple(iPhase);
  474. PhaseData.CreateNewAuditData;
  475. StaffData.UpdateDataForNewAudit;
  476. end;
  477. end;
  478. procedure TProjectData.ReplyProject(const AFileName: string = '');
  479. var
  480. Replyor: TReplyProject;
  481. begin
  482. Replyor := TReplyProject.Create(FProjectName, FFileName, FProjectID);
  483. try
  484. if AFileName = '' then
  485. Replyor.Execute
  486. else
  487. Replyor.ExportTo(AFileName);
  488. finally
  489. Replyor.Free;
  490. end;
  491. end;
  492. procedure TProjectData.SubmitProject(const AFileName: string = '');
  493. var
  494. Submitor :TSubmitProject;
  495. begin
  496. Submitor := TSubmitProject.Create(FProjectName, FFileName, FProjectID);
  497. try
  498. if AFileName = '' then
  499. Submitor.Execute
  500. else
  501. Submitor.ExportTo(AFileName);
  502. finally
  503. Submitor.Free;
  504. end;
  505. end;
  506. procedure TProjectData.ExportJson_Bills(const AFileName: string);
  507. function GetProjectName: string;
  508. var
  509. vNode: tsdIDTreeNode;
  510. begin
  511. vNode := ProjectManager.ProjectsTree.FindNode(FProjectID).Parent;
  512. Result := vNode.Rec.ValueByName('Name').AsString;
  513. end;
  514. // lkJSON 暂时未找到添加数组结构的办法,官方也没有提供相关的Demo,自己合成。
  515. // lkJSON 合成的长文本自动带有大量“\”转义字符,这点有些烦人。
  516. // 其实这么折腾,还不如自己直接合成。那为什么还要用它?自己写是很容易,但是
  517. // 要自己读JSON,那写起来就很麻烦了。
  518. function BillsStr: string;
  519. var vRec: TsdDataRecord;
  520. i: Integer;
  521. sSplit: string;
  522. function v(AFieldName: string): string;
  523. begin
  524. Result := vRec.ValueByName(AFieldName).AsString;
  525. end;
  526. // 杰哥那头不识别中文,将中文转成URL编码形式
  527. function URLEncode(const S: string; const InQueryString: Boolean): string;
  528. var
  529. Idx: Integer;
  530. begin
  531. Result := '';
  532. for Idx := 1 to Length(S) do
  533. begin
  534. case S[Idx] of
  535. 'A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.':
  536. Result := Result + S[Idx];
  537. ' ':
  538. if InQueryString then
  539. Result := Result + '+'
  540. else
  541. Result := Result + '%20';
  542. else
  543. Result := Result + '%' + SysUtils.IntToHex(Ord(S[Idx]), 2);
  544. end;
  545. end;
  546. end;
  547. begin
  548. for i := 0 to BillsMeasureData.BillsMeasureTree.Count - 1 do
  549. begin
  550. vRec := BillsMeasureData.BillsMeasureTree.Items[i].Rec;
  551. if i = 0 then
  552. sSplit := ''
  553. else
  554. sSplit := ',';
  555. Result := Result + sSplit + Format('{"Code":"%s","B_Code":"%s","Name":"%s",' +
  556. '"Units":"%s","Price":"%s","Quantity":"%s","TotalPrice":"%s"}',
  557. [v('Code'), v('B_Code'), v('Name'), v('Units'), v('Price'),
  558. v('Quantity'), v('TotalPrice')]);
  559. end;
  560. end;
  561. var
  562. fPhasePay: Double;
  563. vSL: TStringList;
  564. begin
  565. vSL := TStringList.Create;
  566. try
  567. vSL.Text := Format('{"DealTotalPrice":"%s","Bills":[%s]}',
  568. [FloatToStr(FBillsData.Settlement[DealIndex]), AnsiToUtf8(BillsStr)]);
  569. vSL.SaveToFile(AFileName);
  570. finally
  571. vSL.Free;
  572. end;
  573. end;
  574. procedure TProjectData.DisConnectTree;
  575. begin
  576. BillsMeasureData.BillsMeasureTree.Active := False;
  577. BillsCompileData.BillsCompileTree.Active := False;
  578. end;
  579. procedure TProjectData.ReConnectTree;
  580. begin
  581. BillsCompileData.ReConnectTree;
  582. BillsMeasureData.ReConnectTree;
  583. end;
  584. procedure TProjectData.CopyPhaseCompleteData;
  585. const
  586. sInsertSql = 'Insert Into PhaseComplete (BillsID)' +
  587. ' Select ID' +
  588. ' From Bills where Bills.CreatePhaseID = %d';
  589. sUpdateSql = 'Update PhaseComplete Inner Join [Bills]' +
  590. ' On PhaseComplete.BillsID=Bills.ID' +
  591. ' Set PhaseComplete.Quantity%d=Bills.AddGatherQuantity,' +
  592. ' PhaseComplete.TotalPrice%d=Bills.AddGatherTotalPrice';
  593. var
  594. iPhase: Integer;
  595. sSql: string;
  596. begin
  597. for iPhase := FProjProperties.FinalAuditCount + 1 to FProjProperties.PhaseCount do
  598. begin
  599. SetPhaseIndexSimple(iPhase);
  600. // 插入本期新增的数据
  601. sSql := Format(sInsertSql, [iPhase]);
  602. ExecuteSql(sSql);
  603. // 更新所有截止本期完成计量数据
  604. sSql := Format(sInsertSql, [iPhase, iPhase]);
  605. ExecuteSql(sSql);
  606. end;
  607. end;
  608. procedure TProjectData.CopyPhaseData;
  609. procedure DeletePhaseTable;
  610. var
  611. FTableList: TStringList;
  612. iIndex: Integer;
  613. sDeleteTableSql: String;
  614. begin
  615. FTableList := TStringList.Create;
  616. try
  617. FConnection.Connection.GetTableNames(FTableList);
  618. iIndex := 0;
  619. while iIndex < FTableList.Count do
  620. begin
  621. if Pos('P_', FTableList.Strings[iIndex]) = 1 then
  622. begin
  623. sDeleteTableSql := Format('Drop Table %s', [FTableList.Strings[iIndex]]);
  624. ExecuteSql(sDeleteTableSql);
  625. end;
  626. Inc(iIndex);
  627. end;
  628. finally
  629. FTableList.Free;
  630. end;
  631. end;
  632. procedure CopyStageData(const AFileName, ASourceTable, AResultTable: string);
  633. const
  634. sCopySql = 'Select BillsID, DealQuantity, DealTotalPrice, QcQuantity, QcTotalPrice, QcBGLCode, QcBGLNum,' +
  635. ' PcQuantity, PcTotalPrice, PcBGLCode, PcBGLNum, GatherQuantity, GatherTotalPrice,' +
  636. ' EndDealQuantity, EndDealTotalPrice, EndQcQuantity, EndQcTotalPrice,' +
  637. ' EndPcQuantity, EndPcTotalPrice, EndGatherQuantity, EndGatherTotalPrice,' +
  638. ' PreDealQuantity, PreDealTotalPrice, PreQcQuantity, PreQcTotalPrice,' +
  639. ' PrePcQuantity, PrePcTotalPrice, PreGatherQuantity, PreGatherTotalPrice' +
  640. ' Into %s' +
  641. ' From %s' +
  642. ' In ''%s''';
  643. var
  644. sSql: string;
  645. begin
  646. sSql := Format(sCopySql, [AResultTable, ASourceTable, AFileName]);
  647. ExecuteSql(sSql);
  648. end;
  649. procedure CopyEmptyStageData(const AFileName, ASourceTable, AResultTable: string);
  650. const
  651. sCopySql = 'Select BillsID, DealQuantity, DealTotalPrice, QcQuantity, QcTotalPrice, QcBGLCode, QcBGLNum,' +
  652. ' PcQuantity, PcTotalPrice, PcBGLCode, PcBGLNum, GatherQuantity, GatherTotalPrice,' +
  653. ' EndDealQuantity, EndDealTotalPrice, EndQcQuantity, EndQcTotalPrice,' +
  654. ' EndPcQuantity, EndPcTotalPrice, EndGatherQuantity, EndGatherTotalPrice,' +
  655. ' PreDealQuantity, PreDealTotalPrice, PreQcQuantity, PreQcTotalPrice,' +
  656. ' PrePcQuantity, PrePcTotalPrice, PreGatherQuantity, PreGatherTotalPrice' +
  657. ' Into %s' +
  658. ' From %s' +
  659. ' In ''%s''' +
  660. ' Where 1=2';
  661. var
  662. sSql: string;
  663. begin
  664. sSql := Format(sCopySql, [AResultTable, ASourceTable, AFileName]);
  665. ExecuteSql(sSql);
  666. end;
  667. procedure AddSettlementData;
  668. const
  669. sAddSql = 'Insert Into P_Stage (BillsID,' +
  670. ' DealTotalPrice, QcTotalPrice, PcTotalPrice, GatherTotalPrice,' +
  671. ' EndDealTotalPrice, EndQcTotalPrice, EndPcTotalPrice, EndGatherTotalPrice,' +
  672. ' PreDealTotalPrice, PreQcTotalPrice, PrePcTotalPrice, PreGatherTotalPrice)' +
  673. ' Values (-2,'+
  674. ' %f, %f, %f, %f,'+
  675. ' %f, %f, %f, %f,'+
  676. ' %f, %f, %f, %f)';
  677. var
  678. sSql: string;
  679. begin
  680. with PhaseData.StageData do
  681. sSql := Format(sAddSql,
  682. [StageSettlement[1,1], StageSettlement[1,2], StageSettlement[1,3], StageSettlement[1,4],
  683. StageSettlement[2,1], StageSettlement[2,2], StageSettlement[2,3], StageSettlement[2,4],
  684. StageSettlement[3,1], StageSettlement[3,2], StageSettlement[3,3], StageSettlement[3,4]]);
  685. ExecuteSql(sSql);
  686. end;
  687. procedure UpdateZJJLData;
  688. const
  689. sUpdateSql = 'Update P_ZJJL' +
  690. ' Set BGLCode = ''%s'', PegName = ''%s'', FBFXName = ''%s'',' +
  691. ' UnitName = ''%s'', DrawingCode = ''%s''' +
  692. ' Where ID = %d';
  693. var
  694. sSql: string;
  695. ZJJLInfoRec: TZJJLInfoRec;
  696. begin
  697. with PhaseData.ZJJLData do
  698. begin
  699. cdsZJJL.First;
  700. while not cdsZJJL.Eof do
  701. begin
  702. ZJJLInfoRec := GetInfoRec(cdsZJJLBillsID.AsInteger, cdsZJJLType.AsInteger);
  703. sSql := Format(sUpdateSql, [ZJJLInfoRec.BGLCode, ZJJLInfoRec.PegName,
  704. ZJJLInfoRec.FBFXName, ZJJLInfoRec.UnitName, ZJJLInfoRec.DrawingCode,
  705. cdsZJJLID.AsInteger]);
  706. ExecuteSql(sSql);
  707. cdsZJJL.Next;
  708. end;
  709. end;
  710. end;
  711. procedure CopyZJJLBillsData;
  712. var
  713. sSql: string;
  714. begin
  715. sSql := 'Select PZ.ID, B.B_Code, B.Name, B.Units, B.Price, PS.GatherQuantity As Quantity, PS.GatherTotalPrice As TotalPrice' +
  716. ' Into P_ZJJLBills'+
  717. ' From Bills As B, P_Stage As PS, P_ZJJL As PZ' +
  718. ' Where (PZ.BillsID = B.LeafXmjParentID) And (B.ID = PS.BillsID) And (B.IsLeaf=True)';
  719. ExecuteSql(sSql);
  720. end;
  721. procedure CopyZJJLData(const AFileName: string);
  722. var
  723. sSql: string;
  724. begin
  725. sSql := 'Select ID, BillsID, Code, CertificateCode, BillsCode, FormulaMemo, RelaFile,' +
  726. ' '''' As BGLCode, '''' As PegName, '''' As FBFXName, '''' As UnitName, '''' As DrawingCode' +
  727. ' Into P_ZJJL' +
  728. ' From ' + PhaseData.ZJJLData.atZJJL.TableName +
  729. ' In ' + Format('''%s''', [AFileName]);
  730. ExecuteSql(sSql);
  731. // 获取分部分项等实时统计字段值
  732. UpdateZJJLData;
  733. CopyZJJLBillsData;
  734. end;
  735. procedure CopyPhasePayData(const AFileName: string);
  736. const
  737. sCopySql = 'Select ID, TotalPrice%d As CurTotalPrice, EndTotalPrice%d As EndTotalPrice,' +
  738. ' PreTotalPrice%d As PreTotalPrice,' +
  739. ' TotalPrice0, EndTotalPrice0, PreTotalPrice0,' +
  740. ' TotalPrice1, EndTotalPrice1, PreTotalPrice1,' +
  741. ' TotalPrice2, EndTotalPrice2, PreTotalPrice2,' +
  742. ' TotalPrice3, EndTotalPrice3, PreTotalPrice3,' +
  743. ' TotalPrice4, EndTotalPrice4, PreTotalPrice4,' +
  744. ' TotalPrice5, EndTotalPrice5, PreTotalPrice5,' +
  745. ' TotalPrice6, EndTotalPrice6, PreTotalPrice6,' +
  746. ' TotalPrice7, EndTotalPrice7, PreTotalPrice7,' +
  747. ' TotalPrice8, EndTotalPrice8, PreTotalPrice8,' +
  748. ' TotalPrice9, EndTotalPrice9, PreTotalPrice9,' +
  749. ' TotalPrice10, EndTotalPrice10, PreTotalPrice10,' +
  750. ' TotalPrice11, EndTotalPrice11, PreTotalPrice11,' +
  751. ' TotalPrice12, EndTotalPrice12, PreTotalPrice12,' +
  752. ' TotalPrice13, EndTotalPrice13, PreTotalPrice13,' +
  753. ' TotalPrice14, EndTotalPrice14, PreTotalPrice14,' +
  754. ' TotalPrice%d As TotalPrice_F, EndTotalPrice%d As EndTotalPrice_F, PreTotalPrice%d As PreTotalPrice_F' +
  755. ' Into P_PhasePay' +
  756. ' From PhasePay' +
  757. ' In ''%s''';
  758. var
  759. sSql: string;
  760. begin
  761. with PhaseData do
  762. sSql := Format(sCopySql, [StageIndex, StageIndex, StageIndex, StageCount - 1, StageCount - 1, StageCount - 1, AFileName]);
  763. ExecuteSql(sSql);
  764. end;
  765. procedure CopyReportData(const AFileName: string);
  766. const
  767. sCopySql = 'Select Flag, SubFlag, SerialNo, Select1, Result1, Result2' +
  768. ' Into P_ReportData' +
  769. ' From ReportData' +
  770. ' In ''%s''';
  771. begin
  772. ExecuteSql(Format(sCopySql, [AFileName]));
  773. end;
  774. procedure CopyCurPhaseData;
  775. var
  776. sTempFile: string;
  777. i: Integer;
  778. begin
  779. sTempFile := GetTempFileName;
  780. try
  781. SimpleDecrypt(Format('%s\Phase%d.dat', [TempPath, FPhaseIndex]), sTempFile);
  782. // 复制当前阶段数据
  783. CopyStageData(sTempFile, PhaseData.StageData.sdpStage.TableName, 'P_Stage');
  784. // 复制原报、审核、批复数据
  785. // 其中审核、批复数据,如果存在则复制,如果不存在,则创建空表
  786. CopyStageData(sTempFile, 'Refer', 'P_Refer');
  787. for i := 1 to iMaxStageCount - 1 do
  788. if PhaseData.AuditCount >= i then
  789. CopyStageData(sTempFile, PhaseData.StageTableName[i],
  790. 'P_Audit' + IntToStr(i))
  791. else
  792. CopyEmptyStageData(sTempFile, PhaseData.StageTableName[PhaseData.AuditCount],
  793. 'P_Audit' + IntToStr(i));
  794. if PhaseData.StageCount > 1 then
  795. CopyStageData(sTempFile, PhaseData.StageTableName[PhaseData.AuditCount], 'P_Reply')
  796. else
  797. CopyEmptyStageData(sTempFile, PhaseData.StageTableName[PhaseData.AuditCount], 'P_Reply');
  798. AddSettlementData;
  799. CopyZJJLData(sTempFile);
  800. CopyPhasePayData(sTempFile);
  801. CopyReportData(sTempFile);
  802. finally
  803. DeleteFile(sTempFile);
  804. end;
  805. end;
  806. procedure CopyHistoryCompleteData;
  807. const
  808. sCopySql1 = 'Select BillsID, 0 As Quantity1, 0 As TotalPrice1,' +
  809. ' Quantity%d As Quantity2, TotalPrice%d As TotalPrice2' +
  810. ' Into P_Complete' +
  811. ' From PhaseComplete';
  812. sCopySqlN = 'Select BillsID, Quantity%d As Quantity1, TotalPrice%d As TotalPrice1,' +
  813. ' Quantity%d As Quantity2, TotalPrice%d As TotalPrice2' +
  814. ' Into P_Complete' +
  815. ' From PhaseComplete';
  816. sUnionCopySql1 = 'Select BillsID, 0 As Quantity1, 0 As TotalPrice1,' +
  817. ' GatherQuantity As Quantity2, GatherTotalPrice As TotalPrice2' +
  818. ' Into P_Complete' +
  819. ' From P_Stage';
  820. sUnionCopySqlN = 'Select PS.BillsID As BillsID,' +
  821. ' PC.Quantity%d As Quantity1,' +
  822. ' PC.TotalPrice%d As TotalPrice1,' +
  823. ' PC.Quantity%d + PS.GatherQuantity As Quantity2,' +
  824. ' PC.TotalPrice%d + PS.GatherTotalPrice As TotalPrice2' +
  825. ' Into P_Complete' +
  826. ' From PhaseComplete As PC, P_Stage As PS';
  827. var
  828. sSql: string;
  829. begin
  830. if (ProjProperties.FinalAuditCount >= PhaseIndex) then
  831. if PhaseIndex <= 1 then
  832. sSql := Format(sCopySql1, [FPhaseIndex, FPhaseIndex])
  833. else
  834. sSql := Format(sCopySqlN, [PhaseIndex - 1, PhaseIndex - 1, PhaseIndex, PhaseIndex])
  835. else
  836. if PhaseIndex <= 1 then
  837. sSql := sUnionCopySql1
  838. else
  839. sSql := Format(sUnionCopySqlN, [PhaseIndex - 1, PhaseIndex - 1, PhaseIndex - 1, PhaseIndex - 1]);
  840. ExecuteSql(sSql);
  841. end;
  842. begin
  843. Save;
  844. DeletePhaseTable;
  845. if FPhaseIndex > 0 then
  846. CopyCurPhaseData;
  847. FDealPaymentData.UpdateLinkSerialNo;
  848. //CopyHistoryCompleteData;
  849. end;
  850. procedure TProjectData.ExecuteSql(const ASql: string);
  851. var
  852. FQuery: TADOQuery;
  853. begin
  854. FQuery := TADOQuery.Create(nil);
  855. try
  856. FQuery.Connection := FConnection.Connection;
  857. FQuery.SQL.Clear;
  858. FQuery.SQL.Add(ASql);
  859. FQuery.ExecSQL;
  860. finally
  861. FQuery.Free;
  862. end;
  863. end;
  864. function TProjectData.GetADOConnection: TADOConnection;
  865. begin
  866. Result := FConnection.Connection;
  867. end;
  868. procedure TProjectData.ExportJson_Common(const AFileName: string);
  869. var
  870. Rec: TsdDataRecord;
  871. vSL: TStringList;
  872. sBQHTJL, sBQSLBGJL, sJZSQLJWC, sBQWCJL, sLJWCJL, sTotalPrice: string;
  873. begin
  874. vSL := TStringList.Create;
  875. try
  876. Rec := MainListData.GetPhaseMainRecord(ProjProperties.PhaseCount);
  877. sBQHTJL := FloatToStr(Rec.ValueByName('DealTotalPrice').AsFloat); // 本期合同计量
  878. sBQSLBGJL := FloatToStr(Rec.ValueByName('QcTotalPrice').AsFloat); // 本期数量变更计量
  879. sJZSQLJWC := FloatToStr(Rec.ValueByName('PreGatherTotalPrice').AsFloat); // 截止上期累计完成
  880. sBQWCJL := FloatToStr(Rec.ValueByName('GatherTotalPrice').AsFloat); // 本期完成计量
  881. sLJWCJL := FloatToStr(Rec.ValueByName('EndGatherTotalPrice').AsFloat); // 累计完成计量
  882. sTotalPrice := FloatToStr(BillsData.Settlement[0] + Rec.ValueByName('EndQcTotalPrice').AsFloat); // 0号台帐+截止本期累期变更计量
  883. vSL.Text := Format('{"BQHTJL":"%s","BQSLBGJL":"%s","JZSQLJWC":"%s","BQWCJL":"%s","LJWCJL":"%s","TotalPrice":"%s"}',
  884. [sBQHTJL, sBQSLBGJL, sJZSQLJWC, sBQWCJL, sLJWCJL, sTotalPrice]);
  885. vSL.SaveToFile(AFileName);
  886. finally
  887. vSL.Free;
  888. end;
  889. end;
  890. function TProjectData.CurUserIsAuthor: Boolean;
  891. begin
  892. Result := PHPWeb.UserID = WebAuthorID;
  893. end;
  894. function TProjectData.CurUserIsChecker: Boolean;
  895. begin
  896. Result := (PHPWeb.UserID <> WebOwnerID) and (PHPWeb.UserID <> WebAuthorID);
  897. end;
  898. function TProjectData.CurUserIsOwner: Boolean;
  899. begin
  900. Result := PHPWeb.UserID = WebOwnerID;
  901. end;
  902. procedure TProjectData.SaveLastestPhaseMainData;
  903. var
  904. Rec: TsdDataRecord;
  905. begin
  906. if (FPhaseIndex = ProjProperties.PhaseCount) and PhaseData.IsLastStage then
  907. begin
  908. Rec := MainListData.GetPhaseMainRecord(FPhaseIndex);
  909. Rec.ValueByName('DealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 1];
  910. Rec.ValueByName('QcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 2];
  911. Rec.ValueByName('PcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 3];
  912. Rec.ValueByName('GatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 4];
  913. Rec.ValueByName('EndDealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 1];
  914. Rec.ValueByName('EndQcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 2];
  915. Rec.ValueByName('EndPcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 3];
  916. Rec.ValueByName('EndGatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 4];
  917. Rec.ValueByName('PreDealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 1];
  918. Rec.ValueByName('PreQcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 2];
  919. Rec.ValueByName('PrePcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 3];
  920. Rec.ValueByName('PreGatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 4];
  921. Rec.ValueByName('PhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[1];
  922. Rec.ValueByName('EndPhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[2];
  923. Rec.ValueByName('PrePhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[3];
  924. end;
  925. end;
  926. procedure TProjectData.CalculateAll;
  927. begin
  928. FBillsCompileData.CalculateAll;
  929. if not FPhaseData.StageDataReadOnly then
  930. FPhaseData.StageData.CalculateAll;
  931. FBillsMeasureData.CalculateAll;
  932. end;
  933. procedure TProjectData.ImportCloudTenderFile(const AFileName: string);
  934. function GetTempFile(const TempDir: string): string;
  935. var
  936. FXmlDocument: IXMLDocument;
  937. XmlNode, InfoXmlNode: IXMLNode;
  938. ChildNodes: IXMLNodeList;
  939. begin
  940. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  941. try
  942. FXmlDocument.LoadFromFile(TempDir + '\Info.xml');
  943. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  944. XmlNode := FXmlDocument.DocumentElement;
  945. ChildNodes := XmlNode.ChildNodes;
  946. InfoXmlNode := ChildNodes.FindNode('ProjectInfo');
  947. Result := TempDir + '\' + InfoXmlNode.Attributes['FileName'];
  948. finally
  949. FXmlDocument := nil;
  950. end;
  951. end;
  952. procedure ClearAllData;
  953. var
  954. sSql: string;
  955. begin
  956. sSql := 'Delete * From Bills';
  957. ExecuteSql(sSql);
  958. sSql := 'Delete * From DealBills';
  959. ExecuteSql(sSql);
  960. sSql := 'Delete * From ProjProperties';
  961. ExecuteSql(sSql);
  962. sSql := 'Delete * From DealPayment';
  963. ExecuteSql(sSql);
  964. end;
  965. procedure CopyData(const AFileName: string);
  966. const
  967. sBillsSql = 'Insert Into Bills (ID, ParentID, NextSiblingID,' +
  968. ' Code, B_Code, Name, Units, Alias, Price, NewPrice,' +
  969. ' OrgQuantity, OrgTotalPrice,' +
  970. ' DgnQuantity1, DgnQuantity2,'+
  971. ' Peg, DrawingCode, MemoStr, HasBookMark, MarkMemo)'+
  972. ' Select ID, ParentID, NextSiblingID,'+
  973. ' Code, B_Code, Name, Units, Alias, Price, NewPrice,' +
  974. ' OrgQuantity, OrgTotalPrice,' +
  975. ' DgnQuantity1, DgnQuantity2,'+
  976. ' Peg, DrawingCode, MemoStr, HasBookMark, MarkMemo'+
  977. ' From Bills In ''%s''';
  978. sDealBillsSql = 'Insert Into DealBills Select * From DealBills In ''%s''';
  979. sDealPaymentSql = 'Insert Into DealPayment (ID, Name, CalcType, IsMinus,'+
  980. ' Formula, StartedPrice, SFormula, RangePrice, RFormula)'+
  981. ' Select ID, Name, CalcType, IsMinus,'+
  982. ' Formula, StartedPrice, SFormula, RangePrice, RFormula'+
  983. ' From DealPayment In ''%s''';
  984. sPropertySql = 'Insert Into ProjProperties'+
  985. ' Select * From ProjProperties In ''%s'''+
  986. ' Where (Name <> ''PHASECOUNT'') and (Name <> ''UNLOCKINFOPASSWORD'') and (Name <> ''AUDITSTATUS'')'+
  987. ' and (Name <> ''FINALAUDITCOUNT'') and (Name <> ''AUDITCOMPANY'') and (Name <> ''UPDATEFLAG'')';
  988. var
  989. sSql: string;
  990. begin
  991. sSql := Format(sBillsSql, [AFileName]);
  992. ExecuteSql(sSql);
  993. sSql := Format(sDealBillsSql, [AFileName]);
  994. ExecuteSql(sSql);
  995. sSql := Format(sDealPaymentSql, [AFileName]);
  996. ExecuteSql(sSql);
  997. sSql := Format(sPropertySql, [AFileName]);
  998. ExecuteSql(sSql);
  999. end;
  1000. function CreateTempSourceFile: string;
  1001. var
  1002. TempDir, TempDir2: string;
  1003. begin
  1004. TempDir := GenerateTempFolder(GetTempPath);
  1005. UnZipFile(AFileName, TempDir);
  1006. try
  1007. TempDir2 := GenerateTempFolder(GetTempPath);
  1008. try
  1009. UnZipFile(GetTempFile(TempDir), TempDir2);
  1010. Result := GetTempFileName;
  1011. SimpleDecrypt(TempDir2 + '\Main.dat', Result);
  1012. finally
  1013. DeleteFileOrFolder(TempDir2);
  1014. end;
  1015. finally
  1016. DeleteFileOrFolder(TempDir);
  1017. end;
  1018. end;
  1019. procedure BeforeCopyData;
  1020. begin
  1021. DisConnectTree;
  1022. CloseAllData;
  1023. end;
  1024. procedure EndCopyData;
  1025. begin
  1026. OpenAllData;
  1027. ReConnectTree;
  1028. FProjProperties.UpdateFlag := 1;
  1029. BillsCompileData.CalculateAll;
  1030. end;
  1031. function CheckFile: Boolean;
  1032. var
  1033. TempDir: string;
  1034. Proj: TProjectData;
  1035. begin
  1036. TempDir := GenerateTempFolder(GetTempPath);
  1037. UnZipFile(AFileName, TempDir);
  1038. try
  1039. Proj := TProjectData.Create;
  1040. Proj.SimpleOpen(GetTempFile(TempDir));
  1041. Result := Proj.ProjProperties.UpdateFlag = 1;
  1042. finally
  1043. Proj.Free;
  1044. DeleteFileOrFolder(TempDir);
  1045. end;
  1046. end;
  1047. var
  1048. sTemMainFile: string;
  1049. begin
  1050. sTemMainFile := CreateTempSourceFile;
  1051. BeforeCopyData;
  1052. try
  1053. ClearAllData;
  1054. CopyData(sTemMainFile);
  1055. finally
  1056. EndCopyData;
  1057. DeleteFileOrFolder(sTemMainFile);
  1058. end;
  1059. end;
  1060. function TProjectData.CheckPassword: Boolean;
  1061. var
  1062. sPassword: string;
  1063. begin
  1064. if ProjProperties.UnlockInfoPassword = '' then
  1065. Result := True
  1066. else
  1067. begin
  1068. Result := InputPassword(sPassword);
  1069. if Result then
  1070. begin
  1071. Result := sPassword = ProjProperties.UnlockInfoPassword;
  1072. if not Result then ErrorMessage('您输入的密码不正确!');
  1073. end;
  1074. end;
  1075. end;
  1076. procedure TProjectData.SetCheckers(const Value: TCheckers);
  1077. begin
  1078. FCheckers := Value;
  1079. end;
  1080. procedure TProjectData.OpenForSubmit(const AFileName: string);
  1081. begin
  1082. FProjectID := -1;
  1083. UnZipFile(AFileName, TempPath);
  1084. FConnection.Open(MainFileName);
  1085. FProjProperties.Open(FConnection.Connection);
  1086. FStaffData.Open(FConnection.Connection);
  1087. end;
  1088. procedure TProjectData.SaveAsForSubmit(const AFileName: string);
  1089. begin
  1090. FStaffData.Save;
  1091. FProjProperties.Save;
  1092. FConnection.Save;
  1093. ZipFolder(FTempFolder, AFileName);
  1094. end;
  1095. procedure TProjectData.LockBillsBaseData;
  1096. const
  1097. sLockInfoSql = 'Update Bills Set LockedInfo = True, LockedLevel = True';
  1098. sLockNPSql = 'Update Bills Set LockedNewPrice = True Where NewPrice <> 0';
  1099. begin
  1100. ExecuteSql(sLockInfoSql);
  1101. ExecuteSql(sLockNPSql);
  1102. end;
  1103. procedure TProjectData.LockDealPaymentData;
  1104. const
  1105. sLockDealSql = 'Update DealPayment Set Locked = True';
  1106. sLockFormulaSql = 'Update DealPayment Set LockedFormula = True Where (Formula <> '''')';
  1107. begin
  1108. ExecuteSql(sLockDealSql);
  1109. ExecuteSql(sLockFormulaSql);
  1110. end;
  1111. procedure TProjectData.LockBGLData;
  1112. const
  1113. sBGSql = 'Update BGL Set Locked = True';
  1114. sBGBillsSql = 'Update BGBills Set Locked = True';
  1115. begin
  1116. ExecuteSql(sBGSql);
  1117. ExecuteSql(sBGBillsSql);
  1118. end;
  1119. procedure TProjectData.OpenForReport(const AFileName: string);
  1120. begin
  1121. FProjectID := -1;
  1122. UnZipFile(AFileName, TempPath);
  1123. FConnection.Open(MainFileName);
  1124. UpdateProjectDataBase;
  1125. FProjProperties.Open(FConnection.Connection);
  1126. UpdateOldData;
  1127. FBillsData.Open(FConnection.Connection);
  1128. FBillsCompileData.Open;
  1129. FDealPaymentData.Open(FConnection.Connection);
  1130. FBGLData.Open(FConnection.Connection);
  1131. end;
  1132. procedure TProjectData.OpenForReply(const AFileName: string);
  1133. begin
  1134. FProjectID := -1;
  1135. UnZipFile(AFileName, TempPath);
  1136. FConnection.Open(MainFileName);
  1137. FProjProperties.Open(FConnection.Connection);
  1138. if ProjProperties.PhaseCount > 0 then
  1139. begin
  1140. FPhaseIndex := ProjProperties.PhaseCount;
  1141. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1142. end;
  1143. FStaffData.Open(FConnection.Connection);
  1144. end;
  1145. procedure TProjectData.SaveForReply(const AFileName: string);
  1146. begin
  1147. FStaffData.Save;
  1148. if FPhaseData.Active then
  1149. FPhaseData.SimpleSave;
  1150. FProjProperties.Save;
  1151. FConnection.Save;
  1152. ZipFolder(FTempFolder, AFileName);
  1153. end;
  1154. procedure TProjectData.OpenForReceive(const AFileName: string);
  1155. begin
  1156. FProjectID := -1;
  1157. UnZipFile(AFileName, TempPath);
  1158. FConnection.Open(MainFileName);
  1159. FProjProperties.Open(FConnection.Connection);
  1160. if ProjProperties.PhaseCount > 0 then
  1161. begin
  1162. FPhaseIndex := ProjProperties.PhaseCount;
  1163. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1164. end;
  1165. FStaffData.Open(FConnection.Connection);
  1166. end;
  1167. procedure TProjectData.SaveForReceive(const AFileName: string);
  1168. begin
  1169. FStaffData.Save;
  1170. if FPhaseData.Active then
  1171. FPhaseData.SimpleSave;
  1172. FProjProperties.Save;
  1173. FConnection.Save;
  1174. ZipFolder(FTempFolder, AFileName);
  1175. end;
  1176. procedure TProjectData.CloseAllData;
  1177. begin
  1178. FBillsData.Close;
  1179. FBillsCompileData.Close;
  1180. FBillsMeasureData.Close;
  1181. FDealBillsData.Close;
  1182. FDealPaymentData.Close;
  1183. FBGLData.Close;
  1184. FStaffData.Close;
  1185. FMainListData.Close;
  1186. end;
  1187. procedure TProjectData.OpenAllData;
  1188. begin
  1189. FProjProperties.Open(FConnection.Connection);
  1190. FBillsData.Open(FConnection.Connection);
  1191. FBillsCompileData.Open;
  1192. FBillsMeasureData.Open;
  1193. FDealBillsData.Open(FConnection.Connection);
  1194. FDealPaymentData.Open(FConnection.Connection);
  1195. FBGLData.Open(FConnection.Connection);
  1196. FStaffData.Open(FConnection.Connection);
  1197. FMainListData.Open(FConnection.Connection);
  1198. end;
  1199. procedure TProjectData.UpdateOldData;
  1200. procedure UpdateBills_OrgData;
  1201. const
  1202. sUpdateSql = 'Update Bills Set OrgQuantity = Quantity, OrgTotalPrice = TotalPrice';
  1203. begin
  1204. ExecuteSql(sUpdateSql);
  1205. end;
  1206. begin
  1207. if ProjProperties.UpdateFlag = 1 then Exit;
  1208. ProjProperties.UpdateFlag := 1;
  1209. UpdateBills_OrgData;
  1210. end;
  1211. procedure TProjectData.ResetFloatDigitView;
  1212. procedure SetBillsCompileDigit;
  1213. begin
  1214. with FBillsCompileData.sdvBillsCompile do
  1215. begin
  1216. Columns.FindColumn('OrgQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1217. Columns.FindColumn('MisQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1218. Columns.FindColumn('OthQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1219. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1220. Columns.FindColumn('DgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1221. Columns.FindColumn('DgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1222. Columns.FindColumn('OrgTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1223. Columns.FindColumn('MisTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1224. Columns.FindColumn('OthTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1225. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1226. Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
  1227. Columns.FindColumn('DgnPrice').DisplayFormat := FProjProperties.PriceFormat;
  1228. Columns.FindColumn('OrgQuantity').EditFormat := FProjProperties.QuantityFormat;
  1229. Columns.FindColumn('MisQuantity').EditFormat := FProjProperties.QuantityFormat;
  1230. Columns.FindColumn('OthQuantity').EditFormat := FProjProperties.QuantityFormat;
  1231. Columns.FindColumn('Quantity').EditFormat := FProjProperties.QuantityFormat;
  1232. Columns.FindColumn('DgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1233. Columns.FindColumn('DgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1234. Columns.FindColumn('OrgTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1235. Columns.FindColumn('MisTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1236. Columns.FindColumn('OthTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1237. Columns.FindColumn('TotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1238. Columns.FindColumn('Price').EditFormat := FProjProperties.PriceFormat;
  1239. Columns.FindColumn('DgnPrice').EditFormat := FProjProperties.PriceFormat;
  1240. end;
  1241. end;
  1242. procedure SetBillsMeasureDigit;
  1243. begin
  1244. with FBillsMeasureData.sdvBillsMeasure do
  1245. begin
  1246. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1247. Columns.FindColumn('CurDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1248. Columns.FindColumn('CurQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1249. Columns.FindColumn('CurPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1250. Columns.FindColumn('CurGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1251. Columns.FindColumn('EndDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1252. Columns.FindColumn('EndQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1253. Columns.FindColumn('EndPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1254. Columns.FindColumn('EndGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1255. Columns.FindColumn('AddDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1256. Columns.FindColumn('AddQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1257. Columns.FindColumn('AddPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1258. Columns.FindColumn('AddGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1259. Columns.FindColumn('DealDgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1260. Columns.FindColumn('DealDgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1261. Columns.FindColumn('CDgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1262. Columns.FindColumn('CDgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1263. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1264. Columns.FindColumn('CurDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1265. Columns.FindColumn('CurQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1266. Columns.FindColumn('CurPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1267. Columns.FindColumn('CurGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1268. Columns.FindColumn('EndDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1269. Columns.FindColumn('EndQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1270. Columns.FindColumn('EndPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1271. Columns.FindColumn('EndGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1272. Columns.FindColumn('AddDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1273. Columns.FindColumn('AddQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1274. Columns.FindColumn('AddPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1275. Columns.FindColumn('AddGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1276. Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
  1277. Columns.FindColumn('NewPrice').DisplayFormat := FProjProperties.PriceFormat;
  1278. Columns.FindColumn('Quantity').EditFormat := FProjProperties.QuantityFormat;
  1279. Columns.FindColumn('CurDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1280. Columns.FindColumn('CurQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1281. Columns.FindColumn('CurPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1282. Columns.FindColumn('CurGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1283. Columns.FindColumn('EndDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1284. Columns.FindColumn('EndQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1285. Columns.FindColumn('EndPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1286. Columns.FindColumn('EndGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1287. Columns.FindColumn('AddDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1288. Columns.FindColumn('AddQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1289. Columns.FindColumn('AddPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1290. Columns.FindColumn('AddGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1291. Columns.FindColumn('DealDgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1292. Columns.FindColumn('DealDgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1293. Columns.FindColumn('CDgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1294. Columns.FindColumn('CDgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1295. Columns.FindColumn('TotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1296. Columns.FindColumn('CurDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1297. Columns.FindColumn('CurQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1298. Columns.FindColumn('CurPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1299. Columns.FindColumn('CurGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1300. Columns.FindColumn('EndDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1301. Columns.FindColumn('EndQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1302. Columns.FindColumn('EndPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1303. Columns.FindColumn('EndGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1304. Columns.FindColumn('AddDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1305. Columns.FindColumn('AddQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1306. Columns.FindColumn('AddPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1307. Columns.FindColumn('AddGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1308. Columns.FindColumn('Price').EditFormat := FProjProperties.PriceFormat;
  1309. Columns.FindColumn('NewPrice').EditFormat := FProjProperties.PriceFormat;
  1310. end;
  1311. end;
  1312. begin
  1313. SetBillsCompileDigit;
  1314. SetBillsMeasureDigit;
  1315. end;
  1316. function TProjectData.GetStageDataReadOnly: Boolean;
  1317. begin
  1318. if FPhaseData.Active then
  1319. Result := FPhaseData.StageDataReadOnly
  1320. else
  1321. Result := True;
  1322. end;
  1323. procedure TProjectData.OpenForReport2(const AFileName: string);
  1324. begin
  1325. FProjectID := -1;
  1326. UnZipFile(AFileName, TempPath);
  1327. FConnection.Open(MainFileName);
  1328. UpdateProjectDataBase;
  1329. FProjProperties.Open(FConnection.Connection);
  1330. UpdateOldData;
  1331. FBillsData.Open(FConnection.Connection);
  1332. FBillsCompileData.Open;
  1333. FDealPaymentData.Open(FConnection.Connection);
  1334. FBGLData.Open(FConnection.Connection);
  1335. if ProjProperties.PhaseCount > 0 then
  1336. begin
  1337. FPhaseIndex := ProjProperties.PhaseCount;
  1338. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1339. end;
  1340. end;
  1341. procedure TProjectData.OpenForReport3(const AFileName: string);
  1342. begin
  1343. FProjectID := -1;
  1344. UnZipFile(AFileName, TempPath);
  1345. FConnection.Open(MainFileName);
  1346. UpdateProjectDataBase;
  1347. FProjProperties.Open(FConnection.Connection);
  1348. UpdateOldData;
  1349. FBillsData.Open(FConnection.Connection);
  1350. FBillsMeasureData.Open;
  1351. FDealPaymentData.Open(FConnection.Connection);
  1352. FBGLData.Open(FConnection.Connection);
  1353. if ProjProperties.PhaseCount > 0 then
  1354. begin
  1355. FPhaseIndex := ProjProperties.PhaseCount;
  1356. FPhaseData.SimpleOpen2(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1357. end;
  1358. FBillsMeasureData.ResetTreeNodeStageRec;
  1359. end;
  1360. end.