ProjectData.pas 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545
  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. procedure UpdateBillsByDealBills;
  843. const
  844. sUpdateSql = 'Update Bills As B, DealBills As D' +
  845. ' Set B.GclDealQuantity = D.Quantity, B.GclDealTotalPrice = D.TotalPrice' +
  846. ' Where (B.B_Code = D.B_Code) and (B.Name = D.Name) and (B.Units = D.Units) and (B.Price = D.Price)';
  847. begin
  848. ExecuteSql(sUpdateSql);
  849. end;
  850. procedure FilterDealBillsByBills;
  851. const
  852. sFilterSql = 'Select D.*' +
  853. ' Into P_FilterDealBills' +
  854. ' From DealBills As D inner join' +
  855. ' (Select D.ID' +
  856. ' From DealBills As D Left join Bills As B' +
  857. ' On (D.B_Code = B.B_Code) and (D.Name = B.Name) and (D.Units = B.Units) and (D.Price = B.Price)' +
  858. ' where B.ID is Null) As R' +
  859. ' On (D.ID = R.ID)';
  860. begin
  861. ExecuteSql(sFilterSql);
  862. end;
  863. procedure CopyCacheReportsData;
  864. begin
  865. // DealBills的数量金额填至Bills中
  866. UpdateBillsByDealBills;
  867. // 过滤DealBills中在Bills中不存在的清单
  868. FilterDealBillsByBills;
  869. end;
  870. begin
  871. Save;
  872. DeletePhaseTable;
  873. CopyCacheReportsData;
  874. if FPhaseIndex > 0 then
  875. CopyCurPhaseData;
  876. FDealPaymentData.UpdateLinkSerialNo;
  877. //CopyHistoryCompleteData;
  878. end;
  879. procedure TProjectData.ExecuteSql(const ASql: string);
  880. var
  881. FQuery: TADOQuery;
  882. begin
  883. FQuery := TADOQuery.Create(nil);
  884. try
  885. FQuery.Connection := FConnection.Connection;
  886. FQuery.SQL.Clear;
  887. FQuery.SQL.Add(ASql);
  888. FQuery.ExecSQL;
  889. finally
  890. FQuery.Free;
  891. end;
  892. end;
  893. function TProjectData.GetADOConnection: TADOConnection;
  894. begin
  895. Result := FConnection.Connection;
  896. end;
  897. procedure TProjectData.ExportJson_Common(const AFileName: string);
  898. var
  899. Rec: TsdDataRecord;
  900. vSL: TStringList;
  901. sBQHTJL, sBQSLBGJL, sJZSQLJWC, sBQWCJL, sLJWCJL, sTotalPrice: string;
  902. begin
  903. vSL := TStringList.Create;
  904. try
  905. Rec := MainListData.GetPhaseMainRecord(ProjProperties.PhaseCount);
  906. sBQHTJL := FloatToStr(Rec.ValueByName('DealTotalPrice').AsFloat); // 本期合同计量
  907. sBQSLBGJL := FloatToStr(Rec.ValueByName('QcTotalPrice').AsFloat); // 本期数量变更计量
  908. sJZSQLJWC := FloatToStr(Rec.ValueByName('PreGatherTotalPrice').AsFloat); // 截止上期累计完成
  909. sBQWCJL := FloatToStr(Rec.ValueByName('GatherTotalPrice').AsFloat); // 本期完成计量
  910. sLJWCJL := FloatToStr(Rec.ValueByName('EndGatherTotalPrice').AsFloat); // 累计完成计量
  911. sTotalPrice := FloatToStr(BillsData.Settlement[0] + Rec.ValueByName('EndQcTotalPrice').AsFloat); // 0号台帐+截止本期累期变更计量
  912. vSL.Text := Format('{"BQHTJL":"%s","BQSLBGJL":"%s","JZSQLJWC":"%s","BQWCJL":"%s","LJWCJL":"%s","TotalPrice":"%s"}',
  913. [sBQHTJL, sBQSLBGJL, sJZSQLJWC, sBQWCJL, sLJWCJL, sTotalPrice]);
  914. vSL.SaveToFile(AFileName);
  915. finally
  916. vSL.Free;
  917. end;
  918. end;
  919. function TProjectData.CurUserIsAuthor: Boolean;
  920. begin
  921. Result := PHPWeb.UserID = WebAuthorID;
  922. end;
  923. function TProjectData.CurUserIsChecker: Boolean;
  924. begin
  925. Result := (PHPWeb.UserID <> WebOwnerID) and (PHPWeb.UserID <> WebAuthorID);
  926. end;
  927. function TProjectData.CurUserIsOwner: Boolean;
  928. begin
  929. Result := PHPWeb.UserID = WebOwnerID;
  930. end;
  931. procedure TProjectData.SaveLastestPhaseMainData;
  932. var
  933. Rec: TsdDataRecord;
  934. begin
  935. if (FPhaseIndex = ProjProperties.PhaseCount) and PhaseData.IsLastStage then
  936. begin
  937. Rec := MainListData.GetPhaseMainRecord(FPhaseIndex);
  938. Rec.ValueByName('DealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 1];
  939. Rec.ValueByName('QcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 2];
  940. Rec.ValueByName('PcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 3];
  941. Rec.ValueByName('GatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 4];
  942. Rec.ValueByName('EndDealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 1];
  943. Rec.ValueByName('EndQcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 2];
  944. Rec.ValueByName('EndPcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 3];
  945. Rec.ValueByName('EndGatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 4];
  946. Rec.ValueByName('PreDealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 1];
  947. Rec.ValueByName('PreQcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 2];
  948. Rec.ValueByName('PrePcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 3];
  949. Rec.ValueByName('PreGatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 4];
  950. Rec.ValueByName('PhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[1];
  951. Rec.ValueByName('EndPhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[2];
  952. Rec.ValueByName('PrePhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[3];
  953. end;
  954. end;
  955. procedure TProjectData.CalculateAll;
  956. begin
  957. FBillsCompileData.CalculateAll;
  958. if not FPhaseData.StageDataReadOnly then
  959. FPhaseData.StageData.CalculateAll;
  960. FBillsMeasureData.CalculateAll;
  961. end;
  962. procedure TProjectData.ImportCloudTenderFile(const AFileName: string);
  963. function GetTempFile(const TempDir: string): string;
  964. var
  965. FXmlDocument: IXMLDocument;
  966. XmlNode, InfoXmlNode: IXMLNode;
  967. ChildNodes: IXMLNodeList;
  968. begin
  969. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  970. try
  971. FXmlDocument.LoadFromFile(TempDir + '\Info.xml');
  972. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  973. XmlNode := FXmlDocument.DocumentElement;
  974. ChildNodes := XmlNode.ChildNodes;
  975. InfoXmlNode := ChildNodes.FindNode('ProjectInfo');
  976. Result := TempDir + '\' + InfoXmlNode.Attributes['FileName'];
  977. finally
  978. FXmlDocument := nil;
  979. end;
  980. end;
  981. procedure ClearAllData;
  982. var
  983. sSql: string;
  984. begin
  985. sSql := 'Delete * From Bills';
  986. ExecuteSql(sSql);
  987. sSql := 'Delete * From DealBills';
  988. ExecuteSql(sSql);
  989. sSql := 'Delete * From ProjProperties';
  990. ExecuteSql(sSql);
  991. sSql := 'Delete * From DealPayment';
  992. ExecuteSql(sSql);
  993. end;
  994. procedure CopyData(const AFileName: string);
  995. const
  996. sBillsSql = 'Insert Into Bills (ID, ParentID, NextSiblingID,' +
  997. ' Code, B_Code, Name, Units, Alias, Price, NewPrice,' +
  998. ' OrgQuantity, OrgTotalPrice,' +
  999. ' DgnQuantity1, DgnQuantity2,'+
  1000. ' Peg, DrawingCode, MemoStr, HasBookMark, MarkMemo)'+
  1001. ' Select ID, ParentID, NextSiblingID,'+
  1002. ' Code, B_Code, Name, Units, Alias, Price, NewPrice,' +
  1003. ' OrgQuantity, OrgTotalPrice,' +
  1004. ' DgnQuantity1, DgnQuantity2,'+
  1005. ' Peg, DrawingCode, MemoStr, HasBookMark, MarkMemo'+
  1006. ' From Bills In ''%s''';
  1007. sDealBillsSql = 'Insert Into DealBills Select * From DealBills In ''%s''';
  1008. sDealPaymentSql = 'Insert Into DealPayment (ID, Name, CalcType, IsMinus,'+
  1009. ' Formula, StartedPrice, SFormula, RangePrice, RFormula)'+
  1010. ' Select ID, Name, CalcType, IsMinus,'+
  1011. ' Formula, StartedPrice, SFormula, RangePrice, RFormula'+
  1012. ' From DealPayment In ''%s''';
  1013. sPropertySql = 'Insert Into ProjProperties'+
  1014. ' Select * From ProjProperties In ''%s'''+
  1015. ' Where (Name <> ''PHASECOUNT'') and (Name <> ''UNLOCKINFOPASSWORD'') and (Name <> ''AUDITSTATUS'')'+
  1016. ' and (Name <> ''FINALAUDITCOUNT'') and (Name <> ''AUDITCOMPANY'') and (Name <> ''UPDATEFLAG'')';
  1017. var
  1018. sSql: string;
  1019. begin
  1020. sSql := Format(sBillsSql, [AFileName]);
  1021. ExecuteSql(sSql);
  1022. sSql := Format(sDealBillsSql, [AFileName]);
  1023. ExecuteSql(sSql);
  1024. sSql := Format(sDealPaymentSql, [AFileName]);
  1025. ExecuteSql(sSql);
  1026. sSql := Format(sPropertySql, [AFileName]);
  1027. ExecuteSql(sSql);
  1028. end;
  1029. function CreateTempSourceFile: string;
  1030. var
  1031. TempDir, TempDir2: string;
  1032. begin
  1033. TempDir := GenerateTempFolder(GetTempPath);
  1034. UnZipFile(AFileName, TempDir);
  1035. try
  1036. TempDir2 := GenerateTempFolder(GetTempPath);
  1037. try
  1038. UnZipFile(GetTempFile(TempDir), TempDir2);
  1039. Result := GetTempFileName;
  1040. SimpleDecrypt(TempDir2 + '\Main.dat', Result);
  1041. finally
  1042. DeleteFileOrFolder(TempDir2);
  1043. end;
  1044. finally
  1045. DeleteFileOrFolder(TempDir);
  1046. end;
  1047. end;
  1048. procedure BeforeCopyData;
  1049. begin
  1050. DisConnectTree;
  1051. CloseAllData;
  1052. end;
  1053. procedure EndCopyData;
  1054. begin
  1055. OpenAllData;
  1056. ReConnectTree;
  1057. FProjProperties.UpdateFlag := 1;
  1058. BillsCompileData.CalculateAll;
  1059. end;
  1060. function CheckFile: Boolean;
  1061. var
  1062. TempDir: string;
  1063. Proj: TProjectData;
  1064. begin
  1065. TempDir := GenerateTempFolder(GetTempPath);
  1066. UnZipFile(AFileName, TempDir);
  1067. try
  1068. Proj := TProjectData.Create;
  1069. Proj.SimpleOpen(GetTempFile(TempDir));
  1070. Result := Proj.ProjProperties.UpdateFlag = 1;
  1071. finally
  1072. Proj.Free;
  1073. DeleteFileOrFolder(TempDir);
  1074. end;
  1075. end;
  1076. var
  1077. sTemMainFile: string;
  1078. begin
  1079. sTemMainFile := CreateTempSourceFile;
  1080. BeforeCopyData;
  1081. try
  1082. ClearAllData;
  1083. CopyData(sTemMainFile);
  1084. finally
  1085. EndCopyData;
  1086. DeleteFileOrFolder(sTemMainFile);
  1087. end;
  1088. end;
  1089. function TProjectData.CheckPassword: Boolean;
  1090. var
  1091. sPassword: string;
  1092. begin
  1093. if ProjProperties.UnlockInfoPassword = '' then
  1094. Result := True
  1095. else
  1096. begin
  1097. Result := InputPassword(sPassword);
  1098. if Result then
  1099. begin
  1100. Result := sPassword = ProjProperties.UnlockInfoPassword;
  1101. if not Result then ErrorMessage('您输入的密码不正确!');
  1102. end;
  1103. end;
  1104. end;
  1105. procedure TProjectData.SetCheckers(const Value: TCheckers);
  1106. begin
  1107. FCheckers := Value;
  1108. end;
  1109. procedure TProjectData.OpenForSubmit(const AFileName: string);
  1110. begin
  1111. FProjectID := -1;
  1112. UnZipFile(AFileName, TempPath);
  1113. FConnection.Open(MainFileName);
  1114. FProjProperties.Open(FConnection.Connection);
  1115. FStaffData.Open(FConnection.Connection);
  1116. end;
  1117. procedure TProjectData.SaveAsForSubmit(const AFileName: string);
  1118. begin
  1119. FStaffData.Save;
  1120. FProjProperties.Save;
  1121. FConnection.Save;
  1122. ZipFolder(FTempFolder, AFileName);
  1123. end;
  1124. procedure TProjectData.LockBillsBaseData;
  1125. const
  1126. sLockInfoSql = 'Update Bills Set LockedInfo = True, LockedLevel = True';
  1127. sLockNPSql = 'Update Bills Set LockedNewPrice = True Where NewPrice <> 0';
  1128. begin
  1129. ExecuteSql(sLockInfoSql);
  1130. ExecuteSql(sLockNPSql);
  1131. end;
  1132. procedure TProjectData.LockDealPaymentData;
  1133. const
  1134. sLockDealSql = 'Update DealPayment Set Locked = True';
  1135. sLockFormulaSql = 'Update DealPayment Set LockedFormula = True Where (Formula <> '''')';
  1136. begin
  1137. ExecuteSql(sLockDealSql);
  1138. ExecuteSql(sLockFormulaSql);
  1139. end;
  1140. procedure TProjectData.LockBGLData;
  1141. const
  1142. sBGSql = 'Update BGL Set Locked = True';
  1143. sBGBillsSql = 'Update BGBills Set Locked = True';
  1144. begin
  1145. ExecuteSql(sBGSql);
  1146. ExecuteSql(sBGBillsSql);
  1147. end;
  1148. procedure TProjectData.OpenForReport(const AFileName: string);
  1149. begin
  1150. FProjectID := -1;
  1151. UnZipFile(AFileName, TempPath);
  1152. FConnection.Open(MainFileName);
  1153. UpdateProjectDataBase;
  1154. FProjProperties.Open(FConnection.Connection);
  1155. UpdateOldData;
  1156. FBillsData.Open(FConnection.Connection);
  1157. FBillsCompileData.Open;
  1158. FDealPaymentData.Open(FConnection.Connection);
  1159. FBGLData.Open(FConnection.Connection);
  1160. end;
  1161. procedure TProjectData.OpenForReply(const AFileName: string);
  1162. begin
  1163. FProjectID := -1;
  1164. UnZipFile(AFileName, TempPath);
  1165. FConnection.Open(MainFileName);
  1166. FProjProperties.Open(FConnection.Connection);
  1167. if ProjProperties.PhaseCount > 0 then
  1168. begin
  1169. FPhaseIndex := ProjProperties.PhaseCount;
  1170. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1171. end;
  1172. FStaffData.Open(FConnection.Connection);
  1173. end;
  1174. procedure TProjectData.SaveForReply(const AFileName: string);
  1175. begin
  1176. FStaffData.Save;
  1177. if FPhaseData.Active then
  1178. FPhaseData.SimpleSave;
  1179. FProjProperties.Save;
  1180. FConnection.Save;
  1181. ZipFolder(FTempFolder, AFileName);
  1182. end;
  1183. procedure TProjectData.OpenForReceive(const AFileName: string);
  1184. begin
  1185. FProjectID := -1;
  1186. UnZipFile(AFileName, TempPath);
  1187. FConnection.Open(MainFileName);
  1188. FProjProperties.Open(FConnection.Connection);
  1189. if ProjProperties.PhaseCount > 0 then
  1190. begin
  1191. FPhaseIndex := ProjProperties.PhaseCount;
  1192. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1193. end;
  1194. FStaffData.Open(FConnection.Connection);
  1195. end;
  1196. procedure TProjectData.SaveForReceive(const AFileName: string);
  1197. begin
  1198. FStaffData.Save;
  1199. if FPhaseData.Active then
  1200. FPhaseData.SimpleSave;
  1201. FProjProperties.Save;
  1202. FConnection.Save;
  1203. ZipFolder(FTempFolder, AFileName);
  1204. end;
  1205. procedure TProjectData.CloseAllData;
  1206. begin
  1207. FBillsData.Close;
  1208. FBillsCompileData.Close;
  1209. FBillsMeasureData.Close;
  1210. FDealBillsData.Close;
  1211. FDealPaymentData.Close;
  1212. FBGLData.Close;
  1213. FStaffData.Close;
  1214. FMainListData.Close;
  1215. end;
  1216. procedure TProjectData.OpenAllData;
  1217. begin
  1218. FProjProperties.Open(FConnection.Connection);
  1219. FBillsData.Open(FConnection.Connection);
  1220. FBillsCompileData.Open;
  1221. FBillsMeasureData.Open;
  1222. FDealBillsData.Open(FConnection.Connection);
  1223. FDealPaymentData.Open(FConnection.Connection);
  1224. FBGLData.Open(FConnection.Connection);
  1225. FStaffData.Open(FConnection.Connection);
  1226. FMainListData.Open(FConnection.Connection);
  1227. end;
  1228. procedure TProjectData.UpdateOldData;
  1229. procedure UpdateBills_OrgData;
  1230. const
  1231. sUpdateSql = 'Update Bills Set OrgQuantity = Quantity, OrgTotalPrice = TotalPrice';
  1232. begin
  1233. ExecuteSql(sUpdateSql);
  1234. end;
  1235. begin
  1236. if ProjProperties.UpdateFlag = 1 then Exit;
  1237. ProjProperties.UpdateFlag := 1;
  1238. UpdateBills_OrgData;
  1239. end;
  1240. procedure TProjectData.ResetFloatDigitView;
  1241. procedure SetBillsCompileDigit;
  1242. begin
  1243. with FBillsCompileData.sdvBillsCompile do
  1244. begin
  1245. Columns.FindColumn('OrgQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1246. Columns.FindColumn('MisQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1247. Columns.FindColumn('OthQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1248. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1249. Columns.FindColumn('DgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1250. Columns.FindColumn('DgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1251. Columns.FindColumn('OrgTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1252. Columns.FindColumn('MisTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1253. Columns.FindColumn('OthTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1254. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1255. Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
  1256. Columns.FindColumn('DgnPrice').DisplayFormat := FProjProperties.PriceFormat;
  1257. Columns.FindColumn('OrgQuantity').EditFormat := FProjProperties.QuantityFormat;
  1258. Columns.FindColumn('MisQuantity').EditFormat := FProjProperties.QuantityFormat;
  1259. Columns.FindColumn('OthQuantity').EditFormat := FProjProperties.QuantityFormat;
  1260. Columns.FindColumn('Quantity').EditFormat := FProjProperties.QuantityFormat;
  1261. Columns.FindColumn('DgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1262. Columns.FindColumn('DgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1263. Columns.FindColumn('OrgTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1264. Columns.FindColumn('MisTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1265. Columns.FindColumn('OthTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1266. Columns.FindColumn('TotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1267. Columns.FindColumn('Price').EditFormat := FProjProperties.PriceFormat;
  1268. Columns.FindColumn('DgnPrice').EditFormat := FProjProperties.PriceFormat;
  1269. end;
  1270. end;
  1271. procedure SetBillsMeasureDigit;
  1272. begin
  1273. with FBillsMeasureData.sdvBillsMeasure do
  1274. begin
  1275. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1276. Columns.FindColumn('CurDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1277. Columns.FindColumn('CurQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1278. Columns.FindColumn('CurPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1279. Columns.FindColumn('CurGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1280. Columns.FindColumn('EndDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1281. Columns.FindColumn('EndQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1282. Columns.FindColumn('EndPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1283. Columns.FindColumn('EndGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1284. Columns.FindColumn('AddDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1285. Columns.FindColumn('AddQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1286. Columns.FindColumn('AddPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1287. Columns.FindColumn('AddGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1288. Columns.FindColumn('DealDgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1289. Columns.FindColumn('DealDgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1290. Columns.FindColumn('CDgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1291. Columns.FindColumn('CDgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1292. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1293. Columns.FindColumn('CurDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1294. Columns.FindColumn('CurQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1295. Columns.FindColumn('CurPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1296. Columns.FindColumn('CurGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1297. Columns.FindColumn('EndDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1298. Columns.FindColumn('EndQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1299. Columns.FindColumn('EndPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1300. Columns.FindColumn('EndGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1301. Columns.FindColumn('AddDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1302. Columns.FindColumn('AddQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1303. Columns.FindColumn('AddPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1304. Columns.FindColumn('AddGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1305. Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
  1306. Columns.FindColumn('NewPrice').DisplayFormat := FProjProperties.PriceFormat;
  1307. Columns.FindColumn('Quantity').EditFormat := FProjProperties.QuantityFormat;
  1308. Columns.FindColumn('CurDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1309. Columns.FindColumn('CurQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1310. Columns.FindColumn('CurPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1311. Columns.FindColumn('CurGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1312. Columns.FindColumn('EndDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1313. Columns.FindColumn('EndQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1314. Columns.FindColumn('EndPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1315. Columns.FindColumn('EndGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1316. Columns.FindColumn('AddDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1317. Columns.FindColumn('AddQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1318. Columns.FindColumn('AddPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1319. Columns.FindColumn('AddGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1320. Columns.FindColumn('DealDgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1321. Columns.FindColumn('DealDgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1322. Columns.FindColumn('CDgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1323. Columns.FindColumn('CDgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1324. Columns.FindColumn('TotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1325. Columns.FindColumn('CurDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1326. Columns.FindColumn('CurQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1327. Columns.FindColumn('CurPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1328. Columns.FindColumn('CurGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1329. Columns.FindColumn('EndDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1330. Columns.FindColumn('EndQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1331. Columns.FindColumn('EndPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1332. Columns.FindColumn('EndGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1333. Columns.FindColumn('AddDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1334. Columns.FindColumn('AddQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1335. Columns.FindColumn('AddPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1336. Columns.FindColumn('AddGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1337. Columns.FindColumn('Price').EditFormat := FProjProperties.PriceFormat;
  1338. Columns.FindColumn('NewPrice').EditFormat := FProjProperties.PriceFormat;
  1339. end;
  1340. end;
  1341. begin
  1342. SetBillsCompileDigit;
  1343. SetBillsMeasureDigit;
  1344. end;
  1345. function TProjectData.GetStageDataReadOnly: Boolean;
  1346. begin
  1347. if FPhaseData.Active then
  1348. Result := FPhaseData.StageDataReadOnly
  1349. else
  1350. Result := True;
  1351. end;
  1352. procedure TProjectData.OpenForReport2(const AFileName: string);
  1353. begin
  1354. FProjectID := -1;
  1355. UnZipFile(AFileName, TempPath);
  1356. FConnection.Open(MainFileName);
  1357. UpdateProjectDataBase;
  1358. FProjProperties.Open(FConnection.Connection);
  1359. UpdateOldData;
  1360. FBillsData.Open(FConnection.Connection);
  1361. FBillsCompileData.Open;
  1362. FDealPaymentData.Open(FConnection.Connection);
  1363. FBGLData.Open(FConnection.Connection);
  1364. if ProjProperties.PhaseCount > 0 then
  1365. begin
  1366. FPhaseIndex := ProjProperties.PhaseCount;
  1367. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1368. end;
  1369. end;
  1370. procedure TProjectData.OpenForReport3(const AFileName: string);
  1371. begin
  1372. FProjectID := -1;
  1373. UnZipFile(AFileName, TempPath);
  1374. FConnection.Open(MainFileName);
  1375. UpdateProjectDataBase;
  1376. FProjProperties.Open(FConnection.Connection);
  1377. UpdateOldData;
  1378. FBillsData.Open(FConnection.Connection);
  1379. FBillsMeasureData.Open;
  1380. FDealPaymentData.Open(FConnection.Connection);
  1381. FBGLData.Open(FConnection.Connection);
  1382. if ProjProperties.PhaseCount > 0 then
  1383. begin
  1384. FPhaseIndex := ProjProperties.PhaseCount;
  1385. FPhaseData.SimpleOpen2(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1386. end;
  1387. FBillsMeasureData.ResetTreeNodeStageRec;
  1388. end;
  1389. end.