ProjectData.pas 58 KB

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