ProjectData.pas 79 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250
  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, OtherMeasureOnceDm, OtherMeasurePhaseDm,
  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. FDebugDir: string;
  23. FBillsData: TBillsData;
  24. FBillsCompileData: TBillsCompileData;
  25. FBillsMeasureData: TBillsMeasureData;
  26. FBillsBookmarkData: TBillsBookmarkData;
  27. FDealBillsData: TDealBillsData;
  28. FProjProperties: TProjProperties;
  29. FPhaseIndex: Integer;
  30. FPhaseData: TPhaseData;
  31. FPhaseCompareData: TPhaseCompareData;
  32. FBillsGatherData: TBillsGatherData;
  33. FDealPaymentData: TDealPaymentData;
  34. FBGLData: TBGLData;
  35. FStaffData: TStaffData;
  36. FSearchData: TSearchData;
  37. FMainListData: TMainListData;
  38. FProjectGLData: TProjectGLData;
  39. FDetailGLData: TDetailGLData;
  40. FPriceMarginBillsData: TPriceMarginBillsData;
  41. FOtherMeasureOnceData: TOtherMeasureOnceData;
  42. FOtherMeasurePhaseData: TOtherMeasurePhaseData;
  43. FCanUnlockInfo: Boolean;
  44. FWebID: Integer;
  45. FWebOwnerID: Integer;
  46. FWebAuthorID: Integer;
  47. FAuthorHasSubmited: Boolean;
  48. FProjectReadOnly: Boolean;
  49. FAttachmentData: TUpFiles;
  50. FCheckers: TCheckers;
  51. FIsGuest: Boolean;
  52. {For Open}
  53. procedure UpdateProjectDataBase;
  54. procedure CheckNewFile(AConnection: TADOConnection);
  55. procedure OpenLastPhaseData;
  56. procedure UpdateOldData;
  57. procedure SaveInfoToManager;
  58. procedure DropCacheTable(const AKey: string);
  59. // 备份0号台账的历史数据
  60. procedure CopyLedgerHistoryData(AAudit: Integer);
  61. // 备份各期的截止本期累计完成数据
  62. procedure CopyPhaseCompleteData;
  63. procedure SetPhaseIndexSimple(AIndex: Integer);
  64. // 锁定数据 -- Sql语句方式(使用时注意相应的DataMoudle应处于关闭状态)
  65. procedure LockBillsBaseData;
  66. procedure LockDealPaymentData;
  67. procedure LockProjectGLData;
  68. procedure LockDetailGLData;
  69. procedure UpdatePhaseData;
  70. procedure CloseAllData;
  71. procedure OpenAllData;
  72. procedure CheckCalcBeforeSave;
  73. procedure InnerSave;
  74. procedure LoadCheckersData;
  75. function GetMainFileName: string;
  76. procedure SetPhaseIndex(const Value: Integer);
  77. function GetTempPath: string;
  78. function GetProjectFileName: string;
  79. function GetAllowInsert: Boolean;
  80. function GetBaseDataReadOnly: Boolean;
  81. function GetADOConnection: TADOConnection;
  82. procedure SetCheckers(const Value: TCheckers);
  83. function GetStageDataReadOnly: Boolean;
  84. function GetPriceMarginReadOnly: Boolean;
  85. function GetStageIndex: Integer;
  86. procedure SetStageIndex(const Value: Integer);
  87. function GetCanInsertNormalBills: Boolean;
  88. function GetValidStageIsRefer: Boolean;
  89. function GetStartMeasure: Boolean;
  90. procedure SetIsGuest(const Value: Boolean);
  91. public
  92. constructor Create;
  93. destructor Destroy; override;
  94. procedure Open(AProjRec: TsdDataRecord);
  95. procedure Save;
  96. function SaveAs(const AFileName: string): Boolean;
  97. procedure SaveAndCheck;
  98. //----------------------- Begin ---后台打开 ------------------------
  99. {总说明:
  100. 为节省内存使用,对不同的后台打开分别写不同的方法
  101. 按需使用,稍有不同,则新增后台打开方法
  102. 变更(新增)方法须同步变更(新增)注释
  103. }
  104. {OpenForSubmit: ProjProperties, StaffData}
  105. procedure OpenForSubmit(const AFileName: string);
  106. procedure SaveAsForSubmit(const AFileName: string);
  107. {OpenForReply: ProjProperties, StaffData, PhaseData, DetailGLData}
  108. procedure OpenForReply(const AFileName: string);
  109. procedure SaveForReply(const AFileName: string);
  110. {OpenForReceive: ProjProperties, StaffData, PhaseData, StageData}
  111. procedure OpenForReceive(const AFileName: string);
  112. procedure SaveForReceive(const AFileName: string);
  113. {SimpleOpen: 仅打开数据库[项目+最后一期],不打开除属性以外的任何数据表(项目属性都是通过Sql语句修改)}
  114. procedure SimpleOpen(const AFileName: string);
  115. procedure SimpleSaveAs(const AFileName: string);
  116. {OpenForReport: BillsData, BillsCompileData, DealPaymentData, BGLData 报表仅读取数据不做任何修改}
  117. procedure OpenForReport(const AFileName: string);
  118. {OpenForReport2: OpenForReport的基础上打开最后一期数据}
  119. procedure OpenForReport2(const AFileName: string);
  120. {OpenForReport3: OpenForReport2的基础上打开最后一个审核人数据,打开BillsMeasureTree不打开BillsCompileTree,链接BillsMeasureTree跟StageData}
  121. procedure OpenForReport3(const AFileName: string);
  122. {OpenForGather: BillsData, BillsMeasureTree, DealPaymentData, BGLData, PhaseData(根据PhaseIndex指定打开)}
  123. procedure OpenForGather(const AFileName: string; APhaseIndex: Integer = -1);
  124. {OpenForSignOnline: BillsData, BillsMeasureTree, PhaseData(根据PhaseIndex指定打开)}
  125. procedure OpenForSignOnline(AProjRec: TsdDataRecord; APhaseIndex: Integer = -1);
  126. //----------------------- End ---后台打开 ------------------------
  127. procedure SaveDebugFile(const AFileName: string);
  128. procedure SaveTempDataBaseFile(const AFileName: string);
  129. procedure SaveLastestPhaseMainData;
  130. procedure CopyPreData;
  131. procedure CreateNewPhase;
  132. {重设所有LookUpDataset连接}
  133. procedure ResetPhaseDataLink;
  134. {重设所有DataView小数位数显示}
  135. procedure ResetFloatDigitView;
  136. {锁定数据}
  137. // 上报
  138. procedure LockedDataForSubmit;
  139. // 终审批复
  140. procedure LockedDataForReply;
  141. {创建审核数据}
  142. procedure UpdateDataForReceive;
  143. // 上报文件:
  144. { 返回值:
  145. 1. True 文件检验结果正确,生成文件
  146. 2. False 文件检验结果错误,不生成文件}
  147. function SubmitProject(const AFileName: string = ''): Boolean;
  148. // 批复文件: 返回值含义同上报
  149. function ReplyProject(const AFileName: string = ''): Boolean;
  150. // json文件:清单
  151. procedure ExportJson_Bills(const AFileName: string);
  152. procedure ExportJson_Common(const AFileName: string);
  153. // 断开所有树的链接
  154. procedure DisConnectTree;
  155. // 重新连接所有的树
  156. procedure ReConnectTree;
  157. {For Reports: 复制当期的全部数据到项目数据中}
  158. procedure CopyPhaseData(ASaveBeforeCopy: Boolean = true);
  159. procedure ClearReportCacheData;
  160. procedure ClearReportPrepareData;
  161. procedure ExecuteSql(const ASql: string);
  162. procedure CalculateAll;
  163. procedure CalculatePriceMargin;
  164. function CheckDataBaseInfo(APhaseCount, AAuditStatus: Integer): Boolean;
  165. procedure ImportCloudTenderFile(const AFileName: string);
  166. procedure ImportDmfFile(const AFileName: string);
  167. function CheckPassword: Boolean;
  168. function CheckPhaseFileComplete: Boolean;
  169. function CheckLastPhaseFileExist: Boolean;
  170. procedure AppendProjectLog(const ALog: string);
  171. function CurUserIsOwner: Boolean;
  172. function CurUserIsAuthor: Boolean;
  173. function CurUserIsChecker: Boolean;
  174. function IsHistoryPhase: Boolean;
  175. property BillsData: TBillsData read FBillsData;
  176. property BillsCompileData: TBillsCompileData read FBillsCompileData;
  177. property BillsMeasureData: TBillsMeasureData read FBillsMeasureData;
  178. property BillsBookmarkData: TBillsBookmarkData read FBillsBookmarkData;
  179. property DealBillsData: TDealBillsData read FDealBillsData;
  180. property PhaseIndex: Integer read FPhaseIndex write SetPhaseIndex;
  181. property StageIndex: Integer read GetStageIndex write SetStageIndex;
  182. property PhaseData: TPhaseData read FPhaseData;
  183. property ProjProperties: TProjProperties read FProjProperties;
  184. property PhaseCompareData: TPhaseCompareData read FPhaseCompareData;
  185. property BillsGatherData: TBillsGatherData read FBillsGatherData;
  186. property DealPaymentData: TDealPaymentData read FDealPaymentData;
  187. property BGLData: TBGLData read FBGLData;
  188. property StaffData: TStaffData read FStaffData;
  189. property SearchData: TSearchData read FSearchData;
  190. property MainListData: TMainListData read FMainListData;
  191. property AttachmentData: TUpFiles read FAttachmentData; // 附件
  192. property ProjectGLData: TProjectGLData read FProjectGLData;
  193. property DetailGLData: TDetailGLData read FDetailGLData;
  194. property PriceMarginBillsData: TPriceMarginBillsData read FPriceMarginBillsData;
  195. property OtherMeasureOnceData: TOtherMeasureOnceData read FOtherMeasureOnceData;
  196. property OtherMeasurePhaseData: TOtherMeasurePhaseData read FOtherMeasurePhaseData;
  197. // 台账、合同支付
  198. property AllowInsert: Boolean read GetAllowInsert;
  199. property BaseDataReadOnly: Boolean read GetBaseDataReadOnly;
  200. property StageDataReadOnly: Boolean read GetStageDataReadOnly;
  201. property PriceMarginReadOnly: Boolean read GetPriceMarginReadOnly;
  202. property ValidStageIsRefer: Boolean read GetValidStageIsRefer;
  203. property StartMeasure: Boolean read GetStartMeasure;
  204. property CanUnlockInfo: Boolean read FCanUnlockInfo write FCanUnlockInfo;
  205. property CanInsertNormalBills: Boolean read GetCanInsertNormalBills;
  206. property ProjectName: string read FProjectName;
  207. // 磁盘上存储该项目的文件名称
  208. property FileName: string read FFileName;
  209. property ProjectID: Integer read FProjectID;
  210. property MainFileName: string read GetMainFileName;
  211. property TempPath: string read GetTempPath;
  212. property ADOConnection: TADOConnection read GetADOConnection;
  213. property WebID: Integer read FWebID;
  214. property WebOwnerID: Integer read FWebOwnerID;
  215. property WebAuthorID: Integer read FWebAuthorID;
  216. property AuthorHasSubmited: Boolean read FAuthorHasSubmited write FAuthorHasSubmited;
  217. property ProjectReadOnly: Boolean read FProjectReadOnly;
  218. property Checkers: TCheckers read FCheckers write SetCheckers;
  219. property IsGuest: Boolean read FIsGuest write SetIsGuest;
  220. end;
  221. implementation
  222. uses UtilMethods, Globals, ProjectCommands, sdIDTree, StageDm,
  223. ZJJLDm, PHPWebDm, XMLDoc, XMLIntf, ConstUnit, PasswordInputFrm,
  224. mProgressProFrm, mDataRecord, ConditionalDefines, DbTreeImport,
  225. StrUtils, sdProvider, CalcDecimal, Math, CslJson, OrderCheckerFme,
  226. Forms, ProgressHintFrm, BillsTree, Controls;
  227. { TProjectData }
  228. procedure TProjectData.CheckNewFile(AConnection: TADOConnection);
  229. var
  230. FTableList: TStringList;
  231. begin
  232. FTableList := TStringList.Create;
  233. try
  234. AConnection.GetTableNames(FTableList);
  235. FIsNewFile := FTableList.Count = 0;
  236. finally
  237. FTableList.Free;
  238. end;
  239. end;
  240. procedure TProjectData.CopyLedgerHistoryData(AAudit: Integer);
  241. const
  242. sSql = 'Select ID as BillsID, Quantity, TotalPrice, QtyFlag, QtyFormula ' +
  243. 'Into LedgerHistory%d '+
  244. 'From Bills';
  245. begin
  246. ExecuteSql(Format(sSql, [AAudit]));
  247. end;
  248. constructor TProjectData.Create;
  249. begin
  250. FCheckers := TCheckers.Create;
  251. FTempFolder := GenerateTempFolder(GetTempFilePath);
  252. FConnection := TEncryptConnection.Create;
  253. FUpdator := TUpdateProjectDB.Create;
  254. FProjProperties := TProjProperties.Create(Self);
  255. FBillsData := TBillsData.Create(Self);
  256. FBillsCompileData := TBillsCompileData.Create(Self);
  257. FBillsMeasureData := TBillsMeasureData.Create(Self);
  258. FBillsBookmarkData := TBillsBookmarkData.Create(Self);
  259. FDealBillsData := TDealBillsData.Create(Self);
  260. FPhaseData := TPhaseData.Create(Self);
  261. FPhaseCompareData := TPhaseCompareData.Create(Self);
  262. FBillsGatherData := TBillsGatherData.Create(Self);
  263. FDealPaymentData := TDealPaymentData.Create(Self);
  264. FBGLData := TBGLData.Create(Self);
  265. FStaffData := TStaffData.Create(Self);
  266. FSearchData := TSearchData.Create(Self);
  267. FMainListData := TMainListData.Create(Self);
  268. FProjectGLData := TProjectGLData.Create(Self);
  269. FDetailGLData := TDetailGLData.Create(Self);
  270. FPriceMarginBillsData := TPriceMarginBillsData.Create(Self);
  271. FOtherMeasureOnceData := TOtherMeasureOnceData.Create(Self);
  272. FOtherMeasurePhaseData := TOtherMeasurePhaseData.Create(Self);
  273. FAttachmentData := TUpFiles.Create;
  274. FPhaseIndex := 0;
  275. end;
  276. procedure TProjectData.CreateNewPhase;
  277. var
  278. sPhaseFileName: string;
  279. begin
  280. FProjProperties.Save;
  281. FBillsData.LockedBaseData;
  282. FProjProperties.PhaseCount := FProjProperties.PhaseCount + 1;
  283. FProjProperties.AuditStatus := 0;
  284. FStaffData.UpdateDataForNewPhase;
  285. sPhaseFileName := Format('%s\Phase%d.dat', [TempPath, FProjProperties.PhaseCount]);
  286. CopyFileOrFolder(GetEmptyDataBaseFileName, sPhaseFileName);
  287. end;
  288. destructor TProjectData.Destroy;
  289. begin
  290. try
  291. FCheckers.Free;
  292. FOtherMeasurePhaseData.Free;
  293. FOtherMeasureOnceData.Free;
  294. FPriceMarginBillsData.Free;
  295. FDetailGLData.Free;
  296. FProjectGLData.Free;
  297. FMainListData.Free;
  298. FSearchData.Free;
  299. FStaffData.Free;
  300. FBGLData.Free;
  301. FDealPaymentData.Free;
  302. FPhaseCompareData.Free;
  303. FPhaseData.Free;
  304. FProjProperties.Free;
  305. FDealBillsData.Free;
  306. FBillsBookmarkData.Free;
  307. FBillsMeasureData.Free;
  308. FBillsCompileData.Free;
  309. FBillsData.Free;
  310. FAttachmentData.Free;
  311. FUpdator.Free;
  312. FConnection.Free;
  313. finally
  314. DeleteFileOrFolder(FTempFolder);
  315. DeleteFileOrFolder(FDebugDir);
  316. end;
  317. inherited;
  318. end;
  319. function TProjectData.GetBaseDataReadOnly: Boolean;
  320. begin
  321. if FProjProperties.PhaseCount = 0 then
  322. Result := False
  323. else
  324. Result := not AllowInsert;
  325. end;
  326. function TProjectData.GetAllowInsert: Boolean;
  327. begin
  328. if FPhaseData.Active then
  329. Result := FPhaseData.AllowInsert
  330. else
  331. Result := True;
  332. end;
  333. function TProjectData.GetMainFileName: string;
  334. begin
  335. Result := TempPath + 'Main.dat';
  336. end;
  337. function TProjectData.GetProjectFileName: string;
  338. begin
  339. Result := GetMyProjectsFilePath + FProjectName;
  340. end;
  341. function TProjectData.GetTempPath: string;
  342. begin
  343. Result := FTempFolder + '\';
  344. end;
  345. procedure TProjectData.LockedDataForReply;
  346. begin
  347. LockBillsBaseData;
  348. LockDealPaymentData;
  349. LockProjectGLData;
  350. LockDetailGLData;
  351. FPhaseData.PhaseProperty.FinalAudit := True;
  352. // 有顺序限制,谨慎修改
  353. FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
  354. FProjProperties.AuditStatus := -1;
  355. FProjProperties.FinalAuditCount := FProjProperties.PhaseCount;
  356. FStaffData.LockedDataForReply;
  357. end;
  358. procedure TProjectData.LockedDataForSubmit;
  359. begin
  360. LockBillsBaseData;
  361. LockDealPaymentData;
  362. FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
  363. FStaffData.LockedDataForAudit;
  364. end;
  365. procedure TProjectData.Open(AProjRec: TsdDataRecord);
  366. begin
  367. {Open规则:在打开Phase或者设置PhaseIndex时,会设置多个LookUpDataset,
  368. 故要求须在BillsData、DealPayment打开之后}
  369. FProjectName := AProjRec.ValueByName('Name').AsString;
  370. FFileName := GetMyProjectsFilePath + AProjRec.ValueByName('FileName').AsString;
  371. FProjectID := AProjRec.ValueByName('ID').AsInteger;
  372. FWebID := AProjRec.ValueByName('WebID').AsInteger;
  373. FWebOwnerID := AProjRec.ValueByName('WebOwnerID').AsInteger;
  374. FWebAuthorID := AProjRec.ValueByName('WebAuthorID').AsInteger;
  375. FAttachmentData.ProjectData := Self;
  376. FAttachmentData.LoadDatas;
  377. UpdateSysProgress(5, '正在打开项目');
  378. UnZipFile(FileName, TempPath);
  379. UpdateSysProgress(10, '正在打开项目');
  380. FConnection.Open(MainFileName);
  381. CheckNewFile(FConnection.Connection);
  382. UpdateSysProgress(15, '正在升级文件');
  383. UpdateProjectDataBase;
  384. UpdateSysProgress(20, '正在读取数据');
  385. FProjProperties.Open(FConnection.Connection);
  386. if FIsNewFile then
  387. FProjProperties.UpdateFlag := 1;
  388. UpdateOldData;
  389. ResetFloatDigitView;
  390. FProjProperties.DecimalManager.ResetLinkViewColumns;
  391. UpdateSysProgress(25, '正在读取数据');
  392. FBillsData.Open(FConnection.Connection);
  393. if FIsNewFile then
  394. FBillsData.InitBills;
  395. FBillsCompileData.Open;
  396. FBillsMeasureData.Open;
  397. UpdateSysProgress(65, '正在读取数据');
  398. FBillsBookmarkData.Open;
  399. UpdateSysProgress(70, '正在读取数据');
  400. FDealBillsData.Open(FConnection.Connection);
  401. UpdateSysProgress(80, '正在读取数据');
  402. FDealPaymentData.Open(FConnection.Connection);
  403. if FIsNewFile then
  404. FDealPaymentData.Init;
  405. UpdateSysProgress(90, '正在读取数据');
  406. OpenLastPhaseData;
  407. UpdateSysProgress(140, '正在读取数据');
  408. // 价差数据应在当期数据打开后打开
  409. FProjectGLData.Open(FConnection.Connection);
  410. FDetailGLData.Open(FConnection.Connection);
  411. FBGLData.Open(FConnection.Connection);
  412. UpdateSysProgress(160, '正在读取数据');
  413. FStaffData.Open(FConnection.Connection);
  414. UpdateSysProgress(180, '正在读取数据');
  415. //FBillsGatherData.RefreshBills;
  416. FMainListData.Open(FConnection.Connection);
  417. UpdateSysProgress(190, '正在读取数据');
  418. FOtherMeasureOnceData.Open(FConnection.Connection);
  419. FOtherMeasurePhaseData.Open(FConnection.Connection);
  420. UpdateSysProgress(200, '就绪');
  421. if _IsDebugView then
  422. begin
  423. FDebugDir := GetAppFilePath + 'Debug\' + FProjectName;
  424. CreateDirectoryInDeep(FDebugDir);
  425. end;
  426. end;
  427. procedure TProjectData.OpenLastPhaseData;
  428. begin
  429. if ProjProperties.PhaseCount = 0 then Exit;
  430. FPhaseIndex := ProjProperties.PhaseCount;
  431. FProjProperties.PhaseIndex := FPhaseIndex;
  432. FPhaseData.Open(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  433. ResetPhaseDataLink;
  434. end;
  435. procedure TProjectData.Save;
  436. begin
  437. try
  438. InnerSave;
  439. ZipFolder(FTempFolder, FileName);
  440. SaveInfoToManager;
  441. except
  442. ErrorMessage('保存数据出错。请重试,或联系纵横客服:企业QQ:800003850 客服热线:(0756)3850888');
  443. end;
  444. end;
  445. procedure TProjectData.SaveInfoToManager;
  446. var
  447. InfoRec, PhaseRec: TsdDataRecord;
  448. begin
  449. InfoRec := ProjectManager.sddProjectsInfo.FindKey('idxID', FProjectID);
  450. PhaseRec := MainListData.GetPhaseMainRecord(ProjProperties.PhaseCount);
  451. InfoRec.ValueByName('DealTotalPrice').AsFloat := FBillsData.Settlement[DealIndex];
  452. InfoRec.ValueByName('Deal_BGLTotalPrice').AsFloat := FBillsData.Settlement[DealIndex] + FBGLData.AllBGLTotalPrice;
  453. InfoRec.ValueByName('PhaseTotalPrice').AsFloat := PhaseRec.ValueByName('GatherTotalPrice').AsFloat;
  454. InfoRec.ValueByName('EndDealTotalPrice').AsFloat := PhaseRec.ValueByName('EndDealTotalPrice').AsFloat;
  455. InfoRec.ValueByName('EndChangeTotalPrice').AsFloat :=
  456. PhaseRec.ValueByName('EndQcTotalPrice').AsFloat + PhaseRec.ValueByName('EndPcTotalPrice').AsFloat;
  457. InfoRec.ValueByName('EndTotalPrice').AsFloat := PhaseRec.ValueByName('EndGatherTotalPrice').AsFloat;
  458. InfoRec.ValueByName('PreTotalPrice').AsFloat := PhaseRec.ValueByName('PreGatherTotalPrice').AsFloat;
  459. InfoRec.ValueByName('PhasePay').AsFloat := PhaseRec.ValueByName('PhasePay').AsFloat;
  460. InfoRec.ValueByName('PhaseCount').AsInteger := FProjProperties.PhaseCount;
  461. InfoRec.ValueByName('AuditStatus').AsInteger := FProjProperties.AuditStatus;
  462. InfoRec.ValueByName('CommonDigit').AsInteger := FProjProperties.DecimalManager.Common.TotalPrice.Digit;
  463. InfoRec.ValueByName('DealPayDigit').AsInteger := FProjProperties.DecimalManager.DealPay.TotalPrice.Digit;
  464. ProjectManager.CalculateParentInfo(InfoRec.ValueByName('ParentID').AsInteger);
  465. ProjectManager.Save;
  466. end;
  467. procedure TProjectData.SetPhaseIndex(const Value: Integer);
  468. function GetPhaseFileName: string;
  469. begin
  470. Result := Format('%s\Phase%d.dat', [TempPath, FPhaseIndex]);
  471. end;
  472. procedure ReCreatePhaseData(AOrgPhaseIndex: Integer);
  473. begin
  474. if (FPhaseData.Active) and (AOrgPhaseIndex = ProjProperties.PhaseCount) then
  475. FPhaseData.Save;
  476. FPhaseData.Free;
  477. FBillsMeasureData.FreeTreeNodeStageRec;
  478. FPhaseData := TPhaseData.Create(Self);
  479. end;
  480. var
  481. iOrgPhaseIndex: Integer;
  482. begin
  483. SaveLastestPhaseMainData;
  484. FProjectGLData.Save;
  485. FOtherMeasurePhaseData.Save;
  486. iOrgPhaseIndex := FPhaseIndex;
  487. FPhaseIndex := Value;
  488. ProjProperties.PhaseIndex := FPhaseIndex;
  489. ReCreatePhaseData(iOrgPhaseIndex);
  490. FPhaseData.Open(GetPhaseFileName);
  491. ResetPhaseDataLink;
  492. // 须保存项目工料数据,重新加载当期的项目工料数据
  493. FProjectGLData.LoadCurPhaseInfoPrice;
  494. FProjectGLData.LoadStagePM_CalcData;
  495. FProjectGLData.RefreshGatherData;
  496. // 须保存其他台账--分期计量数据
  497. FOtherMeasurePhaseData.LoadCurStageData;
  498. //BillsGatherData.RefreshBills;
  499. end;
  500. procedure TProjectData.SetPhaseIndexSimple(AIndex: Integer);
  501. begin
  502. FPhaseIndex := AIndex;
  503. if FPhaseData.Active then
  504. FPhaseData.SimpleSave;
  505. FPhaseData.Free;
  506. FPhaseData := TPhaseData.Create(Self);
  507. FPhaseData.SimpleOpen(Format('%s\Phase%d.dat', [TempPath, FPhaseIndex]));
  508. end;
  509. procedure TProjectData.UpdateProjectDataBase;
  510. const
  511. sHint = '标段文件(%s)高于当前软件支持:' + #13#10 +
  512. '专业版:请升级软件;' + #13#10 +
  513. '云版:请联系纵横客服,确认是否可升级软件。';
  514. begin
  515. if TEncryptConnection(FConnection).OverExe then
  516. WarningMessage(Format(sHint, [TEncryptConnection(FConnection).CurFileVersion]));
  517. FUpdator.Update(FConnection);
  518. end;
  519. procedure TProjectData.ResetPhaseDataLink;
  520. begin
  521. BillsMeasureData.ResetPhaseStageLink;
  522. BillsMeasureData.ResetTreeNodeStageRec;
  523. DealPaymentData.ResetPhaseLink;
  524. BillsBookmarkData.ResetPhaseStageLink;
  525. end;
  526. procedure TProjectData.SimpleOpen(const AFileName: string);
  527. begin
  528. FProjectID := -1;
  529. UnZipFile(AFileName, TempPath);
  530. FConnection.Open(MainFileName);
  531. UpdateProjectDataBase;
  532. FProjProperties.Open(FConnection.Connection);
  533. if ProjProperties.PhaseCount > 0 then
  534. begin
  535. FPhaseIndex := ProjProperties.PhaseCount;
  536. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  537. end;
  538. end;
  539. procedure TProjectData.SimpleSaveAs(const AFileName: string);
  540. begin
  541. if FPhaseData.Active then
  542. FPhaseData.SimpleSave;
  543. FProjProperties.Save;
  544. FConnection.Save;
  545. ZipFolder(FTempFolder, AFileName);
  546. end;
  547. procedure TProjectData.UpdateDataForReceive;
  548. begin
  549. UpdatePhaseData;
  550. end;
  551. procedure TProjectData.UpdatePhaseData;
  552. function GetUpdateGLPriceSql(AAuditStatus, APhaseCount: Integer): string;
  553. const
  554. vFields: array [0..5] of String = ('PM_Quantity', 'PM_TotalPrice', 'PAL_UsedQuantity', 'PAL_UsedTotalPrice', 'PAL_DeltaPrice', 'PAL_Total');
  555. sUpdateSql = 'Update GLPrice Set %s Where PhaseID = %d';
  556. {sUpdateSql = 'Update GLPrice Set PM_Quantity%d = PM_Quantity%d, PM_TotalPrice%d = PM_TotalPrice%d,'+
  557. ' PAL_UsedQuantity%d = PAL_UsedQuantity%d, PAL_UsedTotalPrice%d = PAL_UsedTotalPrice%d,'+
  558. ' PAL_DeltaPrice%d = PAL_DeltaPrice%d, PAL_Total%d = PAL_Total%d'+
  559. ' Where PhaseID = %d';}
  560. var
  561. sField: string;
  562. i: Integer;
  563. begin
  564. sField := '';
  565. for i := Low(vFields) to High(vFields) do
  566. begin
  567. if i = High(vFields) then
  568. sField := sField + Format('%s%d = %s%d', [vFields[i], AAuditStatus, vFields[i], AAuditStatus-1])
  569. else
  570. sField := sField + Format('%s%d = %s%d, ', [vFields[i], AAuditStatus, vFields[i], AAuditStatus-1])
  571. end;
  572. Result := Format(sUpdateSql, [sField, APhaseCount]);
  573. end;
  574. procedure UpdateGLPriceData;
  575. var
  576. sSql: string;
  577. begin
  578. if (ProjProperties.PhaseCount < 1) or (ProjProperties.AuditStatus < 1) then Exit;
  579. sSql := GetUpdateGLPriceSql(ProjProperties.AuditStatus, ProjProperties.PhaseCount);
  580. ExecuteSql(sSql);
  581. end;
  582. procedure UpdateOMPhaseDetailData;
  583. const
  584. sUpdateSql = 'Insert Into OMPhaseDetail (ID, PhaseID, StageID,' +
  585. ' PreTotalPrice, CurTotalPrice, EndTotalPrice)' +
  586. ' Select ID, %d, %d, PreTotalPrice, CurTotalPrice, EndTotalPrice' +
  587. ' From OMPhaseDetail Where (PhaseID = %d) and (StageID = -1)';
  588. begin
  589. if (ProjProperties.PhaseCount > 0) and (ProjProperties.AuditStatus > 0) then
  590. ExecuteSql(Format(sUpdateSql, [FPhaseIndex, FProjProperties.AuditStatus, FPhaseIndex]));
  591. end;
  592. var
  593. iPhase: Integer;
  594. begin
  595. FProjProperties.AuditStatus := FProjProperties.AuditStatus + 1;
  596. for iPhase := FProjProperties.FinalAuditCount + 1 to FProjProperties.PhaseCount do
  597. begin
  598. SetPhaseIndexSimple(iPhase);
  599. PhaseData.CreateNewAuditData;
  600. StaffData.UpdateDataForNewAudit;
  601. UpdateGLPriceData;
  602. UpdateOMPhaseDetailData;
  603. end;
  604. end;
  605. function TProjectData.ReplyProject(const AFileName: string = ''): Boolean;
  606. var
  607. Replyor: TReplyProject;
  608. begin
  609. Replyor := TReplyProject.Create(FProjectName, FFileName, FProjectID);
  610. try
  611. if AFileName = '' then
  612. Result := Replyor.Execute
  613. else
  614. Result := Replyor.ExportTo(AFileName);
  615. finally
  616. Replyor.Free;
  617. end;
  618. end;
  619. function TProjectData.SubmitProject(const AFileName: string = ''): Boolean;
  620. var
  621. Submitor :TSubmitProject;
  622. begin
  623. Submitor := TSubmitProject.Create(FProjectName, FFileName, FProjectID);
  624. try
  625. if AFileName = '' then
  626. Result := Submitor.Execute
  627. else
  628. Result := Submitor.ExportTo(AFileName);
  629. finally
  630. Submitor.Free;
  631. end;
  632. end;
  633. procedure TProjectData.ExportJson_Bills(const AFileName: string);
  634. function GetProjectName: string;
  635. var
  636. vNode: tsdIDTreeNode;
  637. begin
  638. vNode := ProjectManager.ProjectsTree.FindNode(FProjectID).Parent;
  639. Result := vNode.Rec.ValueByName('Name').AsString;
  640. end;
  641. // lkJSON 暂时未找到添加数组结构的办法,官方也没有提供相关的Demo,自己合成。
  642. // lkJSON 合成的长文本自动带有大量“\”转义字符,这点有些烦人。
  643. // 其实这么折腾,还不如自己直接合成。那为什么还要用它?自己写是很容易,但是
  644. // 要自己读JSON,那写起来就很麻烦了。
  645. function BillsStr: string;
  646. var vRec: TsdDataRecord;
  647. i: Integer;
  648. sSplit: string;
  649. function v(AFieldName: string): string;
  650. begin
  651. Result := vRec.ValueByName(AFieldName).AsString;
  652. end;
  653. // 杰哥那头不识别中文,将中文转成URL编码形式
  654. function URLEncode(const S: string; const InQueryString: Boolean): string;
  655. var
  656. Idx: Integer;
  657. begin
  658. Result := '';
  659. for Idx := 1 to Length(S) do
  660. begin
  661. case S[Idx] of
  662. 'A'..'Z', 'a'..'z', '0'..'9', '-', '_', '.':
  663. Result := Result + S[Idx];
  664. ' ':
  665. if InQueryString then
  666. Result := Result + '+'
  667. else
  668. Result := Result + '%20';
  669. else
  670. Result := Result + '%' + SysUtils.IntToHex(Ord(S[Idx]), 2);
  671. end;
  672. end;
  673. end;
  674. begin
  675. for i := 0 to BillsMeasureData.BillsMeasureTree.Count - 1 do
  676. begin
  677. vRec := BillsMeasureData.BillsMeasureTree.Items[i].Rec;
  678. if (i mod 100) = 0 then
  679. ProgressProRun('生成汇总数据... ' + IntToStr(i), 0, pmtEdit, pptSet);
  680. if i = 0 then
  681. sSplit := ''
  682. else
  683. sSplit := ',';
  684. Result := Result + sSplit + Format('{"Code":"%s","B_Code":"%s","Name":"%s",' +
  685. '"Units":"%s","Price":"%s","Quantity":"%s","TotalPrice":"%s"}',
  686. [v('Code'), v('B_Code'), v('Name'), v('Units'), v('Price'),
  687. v('Quantity'), v('TotalPrice')]);
  688. end;
  689. end;
  690. var
  691. fPhasePay: Double;
  692. vSL: TStringList;
  693. begin
  694. vSL := TStringList.Create;
  695. try
  696. vSL.Text := Format('{"DealTotalPrice":"%s","Bills":[%s]}',
  697. [FloatToStr(FBillsData.Settlement[DealIndex]), AnsiToUtf8(BillsStr)]);
  698. vSL.SaveToFile(AFileName);
  699. finally
  700. vSL.Free;
  701. end;
  702. end;
  703. procedure TProjectData.DisConnectTree;
  704. begin
  705. BillsMeasureData.BillsMeasureTree.Active := False;
  706. BillsCompileData.BillsCompileTree.Active := False;
  707. end;
  708. procedure TProjectData.ReConnectTree;
  709. begin
  710. BillsCompileData.ReConnectTree;
  711. BillsMeasureData.ReConnectTree;
  712. end;
  713. procedure TProjectData.CopyPhaseCompleteData;
  714. const
  715. sInsertSql = 'Insert Into PhaseComplete (BillsID)' +
  716. ' Select ID' +
  717. ' From Bills where Bills.CreatePhaseID = %d';
  718. sUpdateSql = 'Update PhaseComplete Inner Join [Bills]' +
  719. ' On PhaseComplete.BillsID=Bills.ID' +
  720. ' Set PhaseComplete.Quantity%d=Bills.AddGatherQuantity,' +
  721. ' PhaseComplete.TotalPrice%d=Bills.AddGatherTotalPrice';
  722. var
  723. iPhase: Integer;
  724. sSql: string;
  725. begin
  726. for iPhase := FProjProperties.FinalAuditCount + 1 to FProjProperties.PhaseCount do
  727. begin
  728. SetPhaseIndexSimple(iPhase);
  729. // 插入本期新增的数据
  730. sSql := Format(sInsertSql, [iPhase]);
  731. ExecuteSql(sSql);
  732. // 更新所有截止本期完成计量数据
  733. sSql := Format(sInsertSql, [iPhase, iPhase]);
  734. ExecuteSql(sSql);
  735. end;
  736. end;
  737. procedure TProjectData.CopyPhaseData;
  738. procedure CopyStageData(const AFileName, ASourceTable, AResultTable: string);
  739. const
  740. sCopySql = 'Select BillsID, DealQuantity, DealTotalPrice, QcQuantity, QcTotalPrice, QcBGLCode, QcBGLNum,' +
  741. ' PcQuantity, PcTotalPrice, PcBGLCode, PcBGLNum, GatherQuantity, GatherTotalPrice,' +
  742. ' EndDealQuantity, EndDealTotalPrice, EndQcQuantity, EndQcTotalPrice,' +
  743. ' EndPcQuantity, EndPcTotalPrice, EndGatherQuantity, EndGatherTotalPrice,' +
  744. ' PreDealQuantity, PreDealTotalPrice, PreQcQuantity, PreQcTotalPrice,' +
  745. ' PrePcQuantity, PrePcTotalPrice, PreGatherQuantity, PreGatherTotalPrice' +
  746. ' Into %s' +
  747. ' From %s' +
  748. ' In ''%s''';
  749. var
  750. sSql: string;
  751. begin
  752. sSql := Format(sCopySql, [AResultTable, ASourceTable, AFileName]);
  753. ExecuteSql(sSql);
  754. end;
  755. procedure CopyEmptyStageData(const AFileName, ASourceTable, AResultTable: string);
  756. const
  757. sCopySql = 'Select BillsID, DealQuantity, DealTotalPrice, QcQuantity, QcTotalPrice, QcBGLCode, QcBGLNum,' +
  758. ' PcQuantity, PcTotalPrice, PcBGLCode, PcBGLNum, GatherQuantity, GatherTotalPrice,' +
  759. ' EndDealQuantity, EndDealTotalPrice, EndQcQuantity, EndQcTotalPrice,' +
  760. ' EndPcQuantity, EndPcTotalPrice, EndGatherQuantity, EndGatherTotalPrice,' +
  761. ' PreDealQuantity, PreDealTotalPrice, PreQcQuantity, PreQcTotalPrice,' +
  762. ' PrePcQuantity, PrePcTotalPrice, PreGatherQuantity, PreGatherTotalPrice' +
  763. ' Into %s' +
  764. ' From %s' +
  765. ' In ''%s''' +
  766. ' Where 1=2';
  767. var
  768. sSql: string;
  769. begin
  770. sSql := Format(sCopySql, [AResultTable, ASourceTable, AFileName]);
  771. ExecuteSql(sSql);
  772. end;
  773. procedure AddSettlementData;
  774. const
  775. sAddSql = 'Insert Into P_Stage (BillsID,' +
  776. ' DealTotalPrice, QcTotalPrice, PcTotalPrice, GatherTotalPrice,' +
  777. ' EndDealTotalPrice, EndQcTotalPrice, EndPcTotalPrice, EndGatherTotalPrice,' +
  778. ' PreDealTotalPrice, PreQcTotalPrice, PrePcTotalPrice, PreGatherTotalPrice)' +
  779. ' Values (-2,'+
  780. ' %f, %f, %f, %f,'+
  781. ' %f, %f, %f, %f,'+
  782. ' %f, %f, %f, %f)';
  783. var
  784. sSql: string;
  785. begin
  786. with PhaseData.StageData do
  787. sSql := Format(sAddSql,
  788. [StageSettlement[1,1], StageSettlement[1,2], StageSettlement[1,3], StageSettlement[1,4],
  789. StageSettlement[2,1], StageSettlement[2,2], StageSettlement[2,3], StageSettlement[2,4],
  790. StageSettlement[3,1], StageSettlement[3,2], StageSettlement[3,3], StageSettlement[3,4]]);
  791. ExecuteSql(sSql);
  792. end;
  793. procedure CopyZJJLBillsData;
  794. var
  795. sSql: string;
  796. begin
  797. sSql := 'Select PZ.ID, B.B_Code, B.Name, B.Units, B.Price, PS.GatherQuantity As Quantity, PS.GatherTotalPrice As TotalPrice' +
  798. ' Into P_ZJJLBills'+
  799. ' From Bills As B, P_Stage As PS, P_ZJJL As PZ' +
  800. ' Where (PZ.BillsID = B.LeafXmjParentID) And (B.ID = PS.BillsID) And (B.IsLeaf=True)';
  801. ExecuteSql(sSql);
  802. sSql := 'Select PZD.ID, PZD.BillsID, B.Quantity As Quantity, B.TotalPrice As TotalPrice,' +
  803. ' PS.DealQuantity As DealQuantity, PS.DealTotalPrice As DealTotalPrice,' +
  804. ' PS.QcQuantity As QcQuantity, PS.QcTotalPrice As QcTotalPrice,' +
  805. ' PS.GatherQuantity As GatherQuantity, PS.GatherTotalPrice As GatherTotalPrice,' +
  806. ' PS.PreDealQuantity As PreDealQuantity, PS.PreDealTotalPrice As PreDealTotalPrice,' +
  807. ' PS.PreQcQuantity As PreQcQuantity, PS.PreQcTotalPrice As PreQcTotalPrice,' +
  808. ' PS.PreGatherQuantity As PreGatherQuantity, PS.PreGatherTotalPrice As PreGatherTotalPrice,' +
  809. ' PS.EndDealQuantity As EndDealQuantity, PS.EndDealTotalPrice As EndDealTotalPrice,' +
  810. ' PS.EndQcQuantity As EndQcQuantity, PS.EndQcTotalPrice As EndQcTotalPrice,' +
  811. ' PS.EndGatherQuantity As EndGatherQuantity, PS.EndGatherTotalPrice As EndGatherTotalPrice' +
  812. ' Into P_ZJJL_DetailBills' +
  813. ' From Bills As B, P_Stage As PS, P_ZJJL_Detail As PZD' +
  814. ' Where (PZD.BillsID = PS.BillsID) And (B.ID = PZD.BillsID)';
  815. ExecuteSql(sSql);
  816. end;
  817. procedure CopyZJJLData(const AFileName: string);
  818. var
  819. sSql: string;
  820. begin
  821. sSql := 'Select ID, BillsID, GatherBillsID, Code, CertificateCode, BillsCode, FormulaMemo, RelaFile,' +
  822. ' BGLCode, PegName, FBFXName, BeginPeg, EndPeg, UnitName, DrawingCode' +
  823. ' Into P_ZJJL' +
  824. ' From ' + PhaseData.ZJJLData.sdpZJJL.TableName +
  825. ' In ' + Format('''%s''', [AFileName]);
  826. ExecuteSql(sSql);
  827. sSql := 'Select ID, BillsID' +
  828. ' Into P_ZJJL_Detail' +
  829. ' From ' + PhaseData.ZJJLData.sdpZJJLDetail.TableName +
  830. ' In ' + Format('''%s''', [AFileName]);
  831. ExecuteSql(sSql);
  832. CopyZJJLBillsData;
  833. end;
  834. procedure CopyPhasePayData(const AFileName: string);
  835. const
  836. sCopySql = 'Select ID, TotalPrice%d As CurTotalPrice, EndTotalPrice%d As EndTotalPrice,' +
  837. ' PreTotalPrice%d As PreTotalPrice,' +
  838. ' TotalPrice0, EndTotalPrice0, PreTotalPrice0,' +
  839. ' TotalPrice1, EndTotalPrice1, PreTotalPrice1,' +
  840. ' TotalPrice2, EndTotalPrice2, PreTotalPrice2,' +
  841. ' TotalPrice3, EndTotalPrice3, PreTotalPrice3,' +
  842. ' TotalPrice4, EndTotalPrice4, PreTotalPrice4,' +
  843. ' TotalPrice5, EndTotalPrice5, PreTotalPrice5,' +
  844. ' TotalPrice6, EndTotalPrice6, PreTotalPrice6,' +
  845. ' TotalPrice7, EndTotalPrice7, PreTotalPrice7,' +
  846. ' TotalPrice8, EndTotalPrice8, PreTotalPrice8,' +
  847. ' TotalPrice9, EndTotalPrice9, PreTotalPrice9,' +
  848. ' TotalPrice10, EndTotalPrice10, PreTotalPrice10,' +
  849. ' TotalPrice11, EndTotalPrice11, PreTotalPrice11,' +
  850. ' TotalPrice12, EndTotalPrice12, PreTotalPrice12,' +
  851. ' TotalPrice13, EndTotalPrice13, PreTotalPrice13,' +
  852. ' TotalPrice14, EndTotalPrice14, PreTotalPrice14,' +
  853. ' TotalPrice%d As TotalPrice_F, EndTotalPrice%d As EndTotalPrice_F, PreTotalPrice%d As PreTotalPrice_F' +
  854. ' Into P_PhasePay' +
  855. ' From PhasePay' +
  856. ' In ''%s''';
  857. var
  858. sSql: string;
  859. begin
  860. with PhaseData do
  861. sSql := Format(sCopySql, [StageIndex, StageIndex, StageIndex, StageCount - 1, StageCount - 1, StageCount - 1, AFileName]);
  862. ExecuteSql(sSql);
  863. end;
  864. procedure CopyReportData(const AFileName: string);
  865. const
  866. sCopySql = 'Select Flag, SubFlag, SerialNo, Select1, Result1, Result2' +
  867. ' Into P_ReportData' +
  868. ' From ReportData' +
  869. ' In ''%s''';
  870. begin
  871. ExecuteSql(Format(sCopySql, [AFileName]));
  872. end;
  873. procedure CopyCurPhaseData;
  874. var
  875. sTempFile: string;
  876. i: Integer;
  877. begin
  878. sTempFile := GetTempFileName;
  879. try
  880. FPhaseData.SaveDebugFile(sTempFile);
  881. // 复制当前阶段数据
  882. CopyStageData(sTempFile, PhaseData.StageData.sdpStage.TableName, 'P_Stage');
  883. // 复制原报、审核、批复数据
  884. // 其中审核、批复数据,如果存在则复制,如果不存在,则创建空表
  885. CopyStageData(sTempFile, 'Refer', 'P_Refer');
  886. for i := 1 to iMaxStageCount - 1 do
  887. if PhaseData.AuditCount >= i then
  888. CopyStageData(sTempFile, PhaseData.StageTableName[i],
  889. 'P_Audit' + IntToStr(i))
  890. else
  891. CopyEmptyStageData(sTempFile, PhaseData.StageTableName[PhaseData.AuditCount],
  892. 'P_Audit' + IntToStr(i));
  893. if PhaseData.StageCount > 1 then
  894. CopyStageData(sTempFile, PhaseData.StageTableName[PhaseData.AuditCount], 'P_Reply')
  895. else
  896. CopyEmptyStageData(sTempFile, PhaseData.StageTableName[PhaseData.AuditCount], 'P_Reply');
  897. AddSettlementData;
  898. CopyZJJLData(sTempFile);
  899. CopyPhasePayData(sTempFile);
  900. CopyReportData(sTempFile);
  901. finally
  902. DeleteFile(sTempFile);
  903. end;
  904. end;
  905. procedure CopyHistoryCompleteData;
  906. const
  907. sCopySql1 = 'Select BillsID, 0 As Quantity1, 0 As TotalPrice1,' +
  908. ' Quantity%d As Quantity2, TotalPrice%d As TotalPrice2' +
  909. ' Into P_Complete' +
  910. ' From PhaseComplete';
  911. sCopySqlN = 'Select BillsID, Quantity%d As Quantity1, TotalPrice%d As TotalPrice1,' +
  912. ' Quantity%d As Quantity2, TotalPrice%d As TotalPrice2' +
  913. ' Into P_Complete' +
  914. ' From PhaseComplete';
  915. sUnionCopySql1 = 'Select BillsID, 0 As Quantity1, 0 As TotalPrice1,' +
  916. ' GatherQuantity As Quantity2, GatherTotalPrice As TotalPrice2' +
  917. ' Into P_Complete' +
  918. ' From P_Stage';
  919. sUnionCopySqlN = 'Select PS.BillsID As BillsID,' +
  920. ' PC.Quantity%d As Quantity1,' +
  921. ' PC.TotalPrice%d As TotalPrice1,' +
  922. ' PC.Quantity%d + PS.GatherQuantity As Quantity2,' +
  923. ' PC.TotalPrice%d + PS.GatherTotalPrice As TotalPrice2' +
  924. ' Into P_Complete' +
  925. ' From PhaseComplete As PC, P_Stage As PS';
  926. var
  927. sSql: string;
  928. begin
  929. if (ProjProperties.FinalAuditCount >= PhaseIndex) then
  930. if PhaseIndex <= 1 then
  931. sSql := Format(sCopySql1, [FPhaseIndex, FPhaseIndex])
  932. else
  933. sSql := Format(sCopySqlN, [PhaseIndex - 1, PhaseIndex - 1, PhaseIndex, PhaseIndex])
  934. else
  935. if PhaseIndex <= 1 then
  936. sSql := sUnionCopySql1
  937. else
  938. sSql := Format(sUnionCopySqlN, [PhaseIndex - 1, PhaseIndex - 1, PhaseIndex - 1, PhaseIndex - 1]);
  939. ExecuteSql(sSql);
  940. end;
  941. procedure UpdateBillsByDealBills;
  942. const
  943. sClearSql = 'Update Bills Set GclDealQuantity = 0, GclDealTotalPrice = 0';
  944. sUpdateSql = 'Update Bills As B, DealBills As D' +
  945. ' Set B.GclDealQuantity = D.Quantity, B.GclDealTotalPrice = D.TotalPrice' +
  946. ' Where (B.B_Code = D.B_Code) and (B.Name = D.Name) and (B.Units = D.Units) and (B.Price = D.Price)';
  947. begin
  948. ExecuteSql(sClearSql);
  949. ExecuteSql(sUpdateSql);
  950. end;
  951. procedure FilterDealBillsByBills;
  952. const
  953. sFilterSql = 'Select D.*' +
  954. ' Into P_FilterDealBills' +
  955. ' From DealBills As D inner join' +
  956. ' (Select D.ID' +
  957. ' From DealBills As D Left join Bills As B' +
  958. ' On (D.B_Code = B.B_Code) and (D.Name = B.Name) and (D.Units = B.Units) and (D.Price = B.Price)' +
  959. ' where B.ID is Null) As R' +
  960. ' On (D.ID = R.ID)';
  961. begin
  962. ExecuteSql(sFilterSql);
  963. end;
  964. procedure CopyCacheReportsData;
  965. begin
  966. // DealBills的数量金额填至Bills中
  967. UpdateBillsByDealBills;
  968. // 过滤DealBills中在Bills中不存在的清单
  969. FilterDealBillsByBills;
  970. end;
  971. procedure SaveCurPhaseCheckers;
  972. const
  973. sCreateSql = 'Create Table P_Checkers (CheckerNo Integer NOT NULL, Name Text(50), Role Text(50), MemoStr Text(255), CheckedDateTime Text(20), Flag Integer,'+
  974. ' CONSTRAINT PrimaryKey PRIMARY KEY (CheckerNo, Flag))';
  975. sInsertSql = 'Insert Into P_Checkers (CheckerNo, Name, Role, MemoStr, CheckedDateTime, Flag) Values (%d, ''%s'', ''%s'', ''%s'', ''%s'', %d)';
  976. var
  977. i: Integer;
  978. vChecker: TChecker;
  979. sSql: string;
  980. begin
  981. ExecuteSql(sCreateSql);
  982. // 全部审核人
  983. for i := 0 to Checkers.Count - 1 do
  984. begin
  985. vChecker := Checkers.Item[i];
  986. sSql := Format(sInsertSql, [vChecker.No, vChecker.Name, vChecker.Role, vChecker.Memo, vChecker.CheckedDateTime, 0]);
  987. ExecuteSql(sSql);
  988. end;
  989. // 审核通过的最后一人
  990. vChecker := Checkers.LastChecker;
  991. if Assigned(vChecker) then
  992. sSql := Format(sInsertSql, [vChecker.No, vChecker.Name, vChecker.Role, vChecker.Memo, vChecker.CheckedDateTime, 1])
  993. else
  994. sSql := Format(sInsertSql, [-1, '', '', '', '', 1]);
  995. ExecuteSql(sSql);
  996. end;
  997. procedure SaveCloudInfo;
  998. begin
  999. SaveCurPhaseCheckers;
  1000. end;
  1001. begin
  1002. AppendProjectLog('Display Reports Prepare');
  1003. if ASaveBeforeCopy then
  1004. InnerSave;
  1005. ClearReportCacheData;
  1006. CopyCacheReportsData;
  1007. if FPhaseIndex > 0 then
  1008. CopyCurPhaseData;
  1009. FDealPaymentData.UpdateLinkSerialNo;
  1010. //CopyHistoryCompleteData;
  1011. if _IsCloud then
  1012. SaveCloudInfo;
  1013. if _IsDebugView then
  1014. SaveDebugFile('Report.dat');
  1015. MeasureLog.AppendLogTo('Display Reports Prepare --> Pass');
  1016. end;
  1017. procedure TProjectData.ExecuteSql(const ASql: string);
  1018. var
  1019. FQuery: TADOQuery;
  1020. begin
  1021. FQuery := TADOQuery.Create(nil);
  1022. try
  1023. FQuery.Connection := FConnection.Connection;
  1024. FQuery.SQL.Clear;
  1025. FQuery.SQL.Add(ASql);
  1026. FQuery.ExecSQL;
  1027. finally
  1028. FQuery.Free;
  1029. end;
  1030. end;
  1031. function TProjectData.GetADOConnection: TADOConnection;
  1032. begin
  1033. Result := FConnection.Connection;
  1034. end;
  1035. procedure TProjectData.ExportJson_Common(const AFileName: string);
  1036. var
  1037. Rec: TsdDataRecord;
  1038. vSL: TStringList;
  1039. sBQHTJL, sBQSLBGJL, sJZSQLJWC, sBQWCJL, sLJWCJL, sTotalPrice: string;
  1040. begin
  1041. vSL := TStringList.Create;
  1042. try
  1043. Rec := MainListData.GetPhaseMainRecord(ProjProperties.PhaseCount);
  1044. sBQHTJL := FloatToStr(Rec.ValueByName('DealTotalPrice').AsFloat); // 本期合同计量
  1045. sBQSLBGJL := FloatToStr(Rec.ValueByName('QcTotalPrice').AsFloat); // 本期数量变更计量
  1046. sJZSQLJWC := FloatToStr(Rec.ValueByName('PreGatherTotalPrice').AsFloat); // 截止上期累计完成
  1047. sBQWCJL := FloatToStr(Rec.ValueByName('GatherTotalPrice').AsFloat); // 本期完成计量
  1048. sLJWCJL := FloatToStr(Rec.ValueByName('EndGatherTotalPrice').AsFloat); // 累计完成计量
  1049. sTotalPrice := FloatToStr(BillsData.Settlement[0] + Rec.ValueByName('EndQcTotalPrice').AsFloat); // 0号台帐+截止本期累期变更计量
  1050. vSL.Text := Format('{"BQHTJL":"%s","BQSLBGJL":"%s","JZSQLJWC":"%s","BQWCJL":"%s","LJWCJL":"%s","TotalPrice":"%s"}',
  1051. [sBQHTJL, sBQSLBGJL, sJZSQLJWC, sBQWCJL, sLJWCJL, sTotalPrice]);
  1052. vSL.SaveToFile(AFileName);
  1053. finally
  1054. vSL.Free;
  1055. end;
  1056. end;
  1057. function TProjectData.CurUserIsAuthor: Boolean;
  1058. begin
  1059. Result := PHPWeb.UserID = WebAuthorID;
  1060. end;
  1061. function TProjectData.CurUserIsChecker: Boolean;
  1062. begin
  1063. Result := (PHPWeb.UserID <> WebOwnerID) and (PHPWeb.UserID <> WebAuthorID);
  1064. end;
  1065. function TProjectData.CurUserIsOwner: Boolean;
  1066. begin
  1067. Result := PHPWeb.UserID = WebOwnerID;
  1068. end;
  1069. procedure TProjectData.SaveLastestPhaseMainData;
  1070. var
  1071. Rec: TsdDataRecord;
  1072. begin
  1073. if (FPhaseIndex = ProjProperties.PhaseCount) and PhaseData.IsLastStage then
  1074. begin
  1075. Rec := MainListData.GetPhaseMainRecord(FPhaseIndex);
  1076. Rec.ValueByName('DealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 1];
  1077. Rec.ValueByName('QcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 2];
  1078. Rec.ValueByName('PcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 3];
  1079. Rec.ValueByName('GatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[1, 4];
  1080. Rec.ValueByName('EndDealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 1];
  1081. Rec.ValueByName('EndQcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 2];
  1082. Rec.ValueByName('EndPcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 3];
  1083. Rec.ValueByName('EndGatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[2, 4];
  1084. Rec.ValueByName('PreDealTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 1];
  1085. Rec.ValueByName('PreQcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 2];
  1086. Rec.ValueByName('PrePcTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 3];
  1087. Rec.ValueByName('PreGatherTotalPrice').AsFloat := PhaseData.StageData.StageSettlement[3, 4];
  1088. Rec.ValueByName('PhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[1];
  1089. Rec.ValueByName('EndPhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[2];
  1090. Rec.ValueByName('PrePhasePay').AsFloat := PhaseData.PhasePayData.LastestPhasePay[3];
  1091. end;
  1092. end;
  1093. procedure TProjectData.CalculateAll;
  1094. begin
  1095. FBillsCompileData.CalculateAll; //台账
  1096. FProjectGLData.CalculateAll; //工料价差
  1097. FPhaseData.StageData.CalculateAll; //计量&清单价差
  1098. FBillsMeasureData.CalculateAll; //累计
  1099. FPhaseData.PhasePayData.CalculateAll; // 合同支付
  1100. FOtherMeasurePhaseData.CalculateAll;
  1101. end;
  1102. procedure TProjectData.ImportCloudTenderFile(const AFileName: string);
  1103. function GetTempFile(const TempDir: string): string;
  1104. var
  1105. FXmlDocument: IXMLDocument;
  1106. XmlNode, InfoXmlNode: IXMLNode;
  1107. ChildNodes: IXMLNodeList;
  1108. begin
  1109. FXmlDocument := TXMLDocument.Create(nil) as IXMLDocument;
  1110. try
  1111. FXmlDocument.LoadFromFile(TempDir + '\Info.xml');
  1112. FXmlDocument.Options := [doNodeAutoCreate,doNodeAutoIndent,doAutoPrefix,doNamespaceDecl];
  1113. XmlNode := FXmlDocument.DocumentElement;
  1114. ChildNodes := XmlNode.ChildNodes;
  1115. InfoXmlNode := ChildNodes.FindNode('ProjectInfo');
  1116. Result := TempDir + '\' + InfoXmlNode.Attributes['FileName'];
  1117. finally
  1118. FXmlDocument := nil;
  1119. end;
  1120. end;
  1121. procedure ClearAllData;
  1122. var
  1123. sSql: string;
  1124. begin
  1125. sSql := 'Delete * From Bills';
  1126. ExecuteSql(sSql);
  1127. sSql := 'Delete * From DealBills';
  1128. ExecuteSql(sSql);
  1129. sSql := 'Delete * From ProjProperties';
  1130. ExecuteSql(sSql);
  1131. sSql := 'Delete * From DealPayment';
  1132. ExecuteSql(sSql);
  1133. end;
  1134. procedure CopyData(const AFileName: string);
  1135. const
  1136. sBillsSql = 'Insert Into Bills (ID, ParentID, NextSiblingID,' +
  1137. ' Code, B_Code, Name, Units, Alias, Price, NewPrice,' +
  1138. ' OrgQuantity, OrgTotalPrice, MisQuantity, MisTotalPrice, OthQuantity, OthTotalPrice,' +
  1139. ' CalcType,' +
  1140. ' DgnQuantity1, DgnQuantity2,'+
  1141. ' Peg, DrawingCode, MemoStr, HasBookMark, MarkMemo, ApprovalCode)'+
  1142. ' Select ID, ParentID, NextSiblingID,'+
  1143. ' Code, B_Code, Name, Units, Alias, Price, NewPrice,' +
  1144. ' OrgQuantity, OrgTotalPrice, MisQuantity, MisTotalPrice, OthQuantity, OthTotalPrice,' +
  1145. ' CalcType,' +
  1146. ' DgnQuantity1, DgnQuantity2,'+
  1147. ' Peg, DrawingCode, MemoStr, HasBookMark, MarkMemo, ApprovalCode'+
  1148. ' From Bills In ''%s''';
  1149. sDealBillsSql = 'Insert Into DealBills Select ID, B_Code, Name, Units, Price, Quantity, TotalPrice'+
  1150. ' From DealBills In ''%s''';
  1151. sDealPaymentSql = 'Insert Into DealPayment (ID, Name, CalcType, IsMinus,'+
  1152. ' Formula, StartedPrice, SFormula, RangePrice, RFormula)'+
  1153. ' Select ID, Name, CalcType, IsMinus,'+
  1154. ' Formula, StartedPrice, SFormula, RangePrice, RFormula'+
  1155. ' From DealPayment In ''%s''';
  1156. sPropertySql = 'Insert Into ProjProperties'+
  1157. ' Select * From ProjProperties In ''%s'''+
  1158. ' Where (Name <> ''PHASECOUNT'') and (Name <> ''UNLOCKINFOPASSWORD'') and (Name <> ''AUDITSTATUS'')'+
  1159. ' and (Name <> ''FINALAUDITCOUNT'') and (Name <> ''AUDITCOMPANY'') and (Name <> ''UPDATEFLAG'')';
  1160. var
  1161. sSql: string;
  1162. begin
  1163. sSql := Format(sBillsSql, [AFileName]);
  1164. ExecuteSql(sSql);
  1165. sSql := Format(sDealBillsSql, [AFileName]);
  1166. ExecuteSql(sSql);
  1167. sSql := Format(sDealPaymentSql, [AFileName]);
  1168. ExecuteSql(sSql);
  1169. sSql := Format(sPropertySql, [AFileName]);
  1170. ExecuteSql(sSql);
  1171. end;
  1172. function CreateTempSourceFile: string;
  1173. var
  1174. TempDir, TempDir2: string;
  1175. begin
  1176. TempDir := GenerateTempFolder(GetTempPath);
  1177. UnZipFile(AFileName, TempDir);
  1178. try
  1179. TempDir2 := GenerateTempFolder(GetTempPath);
  1180. try
  1181. UnZipFile(GetTempFile(TempDir), TempDir2);
  1182. Result := GetTempFileName;
  1183. SimpleDecrypt(TempDir2 + '\Main.dat', Result);
  1184. finally
  1185. DeleteFileOrFolder(TempDir2);
  1186. end;
  1187. finally
  1188. DeleteFileOrFolder(TempDir);
  1189. end;
  1190. end;
  1191. procedure BeforeCopyData;
  1192. begin
  1193. DisConnectTree;
  1194. CloseAllData;
  1195. end;
  1196. procedure EndCopyData;
  1197. begin
  1198. OpenAllData;
  1199. FProjProperties.Reload;
  1200. FProjProperties.UpdateFlag := 1;
  1201. ReConnectTree;
  1202. ResetFloatDigitView;
  1203. BillsCompileData.CalculateAll;
  1204. end;
  1205. function CheckFile: Boolean;
  1206. var
  1207. TempDir: string;
  1208. Proj: TProjectData;
  1209. begin
  1210. TempDir := GenerateTempFolder(GetTempPath);
  1211. UnZipFile(AFileName, TempDir);
  1212. try
  1213. Proj := TProjectData.Create;
  1214. Proj.SimpleOpen(GetTempFile(TempDir));
  1215. Result := Proj.ProjProperties.UpdateFlag = 1;
  1216. finally
  1217. Proj.Free;
  1218. DeleteFileOrFolder(TempDir);
  1219. end;
  1220. end;
  1221. procedure UpdateSourceFile(const AFileName: string);
  1222. var
  1223. vCon: TADOConnection;
  1224. vUpdate: TUpdateProjectDB;
  1225. begin
  1226. vCon := TADOConnection.Create(nil);
  1227. vCon.LoginPrompt := False;
  1228. try
  1229. vCon.ConnectionString := Format(SAdoConnectStr, [AFileName]);
  1230. vUpdate := TUpdateProjectDB.Create;
  1231. vUpdate.ForceUpdate(vCon);
  1232. finally
  1233. vUpdate.Free;
  1234. vCon.Free;
  1235. end;
  1236. end;
  1237. var
  1238. sTemMainFile: string;
  1239. begin
  1240. sTemMainFile := CreateTempSourceFile;
  1241. UpdateSourceFile(sTemMainFile);
  1242. BeforeCopyData;
  1243. try
  1244. ClearAllData;
  1245. CopyData(sTemMainFile);
  1246. finally
  1247. EndCopyData;
  1248. DeleteFileOrFolder(sTemMainFile);
  1249. end;
  1250. end;
  1251. function TProjectData.CheckPassword: Boolean;
  1252. var
  1253. sPassword: string;
  1254. begin
  1255. if ProjProperties.UnlockInfoPassword = '' then
  1256. Result := True
  1257. else
  1258. begin
  1259. Result := InputPassword(sPassword);
  1260. if Result then
  1261. begin
  1262. Result := sPassword = ProjProperties.UnlockInfoPassword;
  1263. if not Result then ErrorMessage('您输入的密码不正确!');
  1264. end;
  1265. end;
  1266. end;
  1267. procedure TProjectData.SetCheckers(const Value: TCheckers);
  1268. begin
  1269. FCheckers := Value;
  1270. end;
  1271. procedure TProjectData.OpenForSubmit(const AFileName: string);
  1272. begin
  1273. FProjectID := -1;
  1274. UnZipFile(AFileName, TempPath);
  1275. FConnection.Open(MainFileName);
  1276. UpdateProjectDataBase;
  1277. FProjProperties.Open(FConnection.Connection);
  1278. FStaffData.Open(FConnection.Connection);
  1279. end;
  1280. procedure TProjectData.SaveAsForSubmit(const AFileName: string);
  1281. begin
  1282. FStaffData.Save;
  1283. FProjProperties.Save;
  1284. FConnection.Save;
  1285. ZipFolder(FTempFolder, AFileName);
  1286. end;
  1287. procedure TProjectData.LockBillsBaseData;
  1288. const
  1289. sLockInfoSql = 'Update Bills Set LockedInfo = True, LockedLevel = True';
  1290. sLockNPSql = 'Update Bills Set LockedNewPrice = True Where NewPrice <> 0';
  1291. begin
  1292. ExecuteSql(sLockInfoSql);
  1293. ExecuteSql(sLockNPSql);
  1294. end;
  1295. procedure TProjectData.LockDealPaymentData;
  1296. const
  1297. sLockDealSql = 'Update DealPayment Set Locked = True';
  1298. sLockFormulaSql = 'Update DealPayment Set LockedFormula = True Where (Formula <> '''')';
  1299. begin
  1300. ExecuteSql(sLockDealSql);
  1301. ExecuteSql(sLockFormulaSql);
  1302. end;
  1303. procedure TProjectData.OpenForReport(const AFileName: string);
  1304. begin
  1305. FProjectID := -1;
  1306. UnZipFile(AFileName, TempPath);
  1307. FConnection.Open(MainFileName);
  1308. UpdateProjectDataBase;
  1309. FProjProperties.Open(FConnection.Connection);
  1310. UpdateOldData;
  1311. FBillsData.Open(FConnection.Connection);
  1312. FBillsCompileData.Open;
  1313. FDealPaymentData.Open(FConnection.Connection);
  1314. FBGLData.Open(FConnection.Connection);
  1315. end;
  1316. procedure TProjectData.OpenForReply(const AFileName: string);
  1317. begin
  1318. FProjectID := -1;
  1319. UnZipFile(AFileName, TempPath);
  1320. FConnection.Open(MainFileName);
  1321. UpdateProjectDataBase;
  1322. FProjProperties.Open(FConnection.Connection);
  1323. if ProjProperties.PhaseCount > 0 then
  1324. begin
  1325. FPhaseIndex := ProjProperties.PhaseCount;
  1326. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1327. end;
  1328. FStaffData.Open(FConnection.Connection);
  1329. FDetailGLData.Open(FConnection.Connection);
  1330. end;
  1331. procedure TProjectData.SaveForReply(const AFileName: string);
  1332. begin
  1333. FDetailGLData.Save;
  1334. FStaffData.Save;
  1335. if FPhaseData.Active then
  1336. FPhaseData.SimpleSave;
  1337. FProjProperties.Save;
  1338. FConnection.Save;
  1339. ZipFolder(FTempFolder, AFileName);
  1340. end;
  1341. procedure TProjectData.OpenForReceive(const AFileName: string);
  1342. begin
  1343. FProjectID := -1;
  1344. UnZipFile(AFileName, TempPath);
  1345. FConnection.Open(MainFileName);
  1346. UpdateProjectDataBase;
  1347. FProjProperties.Open(FConnection.Connection);
  1348. if ProjProperties.PhaseCount > 0 then
  1349. begin
  1350. FPhaseIndex := ProjProperties.PhaseCount;
  1351. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1352. end;
  1353. FStaffData.Open(FConnection.Connection);
  1354. end;
  1355. procedure TProjectData.SaveForReceive(const AFileName: string);
  1356. begin
  1357. FStaffData.Save;
  1358. if FPhaseData.Active then
  1359. FPhaseData.SimpleSave;
  1360. FProjProperties.Save;
  1361. FConnection.Save;
  1362. ZipFolder(FTempFolder, AFileName);
  1363. end;
  1364. procedure TProjectData.CloseAllData;
  1365. begin
  1366. FBillsBookmarkData.Close;
  1367. FBillsData.Close;
  1368. FBillsCompileData.Close;
  1369. FBillsMeasureData.Close;
  1370. FDealBillsData.Close;
  1371. FDealPaymentData.Close;
  1372. FBGLData.Close;
  1373. FStaffData.Close;
  1374. FMainListData.Close;
  1375. end;
  1376. procedure TProjectData.OpenAllData;
  1377. begin
  1378. FProjProperties.Open(FConnection.Connection);
  1379. FBillsData.Open(FConnection.Connection);
  1380. FBillsCompileData.Open;
  1381. FBillsMeasureData.Open;
  1382. FDealBillsData.Open(FConnection.Connection);
  1383. FDealPaymentData.Open(FConnection.Connection);
  1384. FBGLData.Open(FConnection.Connection);
  1385. FStaffData.Open(FConnection.Connection);
  1386. FMainListData.Open(FConnection.Connection);
  1387. FBillsBookmarkData.Open;
  1388. end;
  1389. procedure TProjectData.UpdateOldData;
  1390. procedure UpdateBills_OrgData;
  1391. const
  1392. sUpdateSql = 'Update Bills Set OrgQuantity = Quantity, OrgTotalPrice = TotalPrice';
  1393. begin
  1394. ExecuteSql(sUpdateSql);
  1395. end;
  1396. begin
  1397. if ProjProperties.UpdateFlag = 1 then Exit;
  1398. ProjProperties.UpdateFlag := 1;
  1399. UpdateBills_OrgData;
  1400. end;
  1401. procedure TProjectData.ResetFloatDigitView;
  1402. procedure SetBillsCompileDigit;
  1403. begin
  1404. with FBillsCompileData.sdvBillsCompile do
  1405. begin
  1406. Columns.FindColumn('OrgQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1407. Columns.FindColumn('MisQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1408. Columns.FindColumn('OthQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1409. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1410. Columns.FindColumn('DgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1411. Columns.FindColumn('DgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1412. Columns.FindColumn('OrgTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1413. Columns.FindColumn('MisTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1414. Columns.FindColumn('OthTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1415. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1416. Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
  1417. Columns.FindColumn('DgnPrice').DisplayFormat := FProjProperties.PriceFormat;
  1418. Columns.FindColumn('OrgQuantity').EditFormat := FProjProperties.QuantityFormat;
  1419. Columns.FindColumn('MisQuantity').EditFormat := FProjProperties.QuantityFormat;
  1420. Columns.FindColumn('OthQuantity').EditFormat := FProjProperties.QuantityFormat;
  1421. Columns.FindColumn('Quantity').EditFormat := FProjProperties.QuantityFormat;
  1422. Columns.FindColumn('DgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1423. Columns.FindColumn('DgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1424. Columns.FindColumn('OrgTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1425. Columns.FindColumn('MisTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1426. Columns.FindColumn('OthTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1427. Columns.FindColumn('TotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1428. Columns.FindColumn('Price').EditFormat := FProjProperties.PriceFormat;
  1429. Columns.FindColumn('DgnPrice').EditFormat := FProjProperties.PriceFormat;
  1430. end;
  1431. end;
  1432. procedure SetBillsMeasureDigit;
  1433. begin
  1434. with FBillsMeasureData.sdvBillsMeasure do
  1435. begin
  1436. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1437. Columns.FindColumn('CurDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1438. Columns.FindColumn('CurQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1439. Columns.FindColumn('CurPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1440. Columns.FindColumn('CurGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1441. Columns.FindColumn('EndDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1442. Columns.FindColumn('EndQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1443. Columns.FindColumn('EndPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1444. Columns.FindColumn('EndGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1445. Columns.FindColumn('AddDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1446. Columns.FindColumn('AddQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1447. Columns.FindColumn('AddPcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1448. Columns.FindColumn('AddGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1449. Columns.FindColumn('DealDgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1450. Columns.FindColumn('DealDgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1451. Columns.FindColumn('CDgnQuantity1').DisplayFormat := FProjProperties.QuantityFormat;
  1452. Columns.FindColumn('CDgnQuantity2').DisplayFormat := FProjProperties.QuantityFormat;
  1453. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1454. Columns.FindColumn('CurDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1455. Columns.FindColumn('CurQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1456. Columns.FindColumn('CurPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1457. Columns.FindColumn('CurGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1458. Columns.FindColumn('EndDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1459. Columns.FindColumn('EndQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1460. Columns.FindColumn('EndPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1461. Columns.FindColumn('EndGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1462. Columns.FindColumn('AddDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1463. Columns.FindColumn('AddQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1464. Columns.FindColumn('AddPcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1465. Columns.FindColumn('AddGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1466. Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
  1467. Columns.FindColumn('NewPrice').DisplayFormat := FProjProperties.PriceFormat;
  1468. Columns.FindColumn('Quantity').EditFormat := FProjProperties.QuantityFormat;
  1469. Columns.FindColumn('CurDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1470. Columns.FindColumn('CurQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1471. Columns.FindColumn('CurPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1472. Columns.FindColumn('CurGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1473. Columns.FindColumn('EndDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1474. Columns.FindColumn('EndQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1475. Columns.FindColumn('EndPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1476. Columns.FindColumn('EndGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1477. Columns.FindColumn('AddDealQuantity').EditFormat := FProjProperties.QuantityFormat;
  1478. Columns.FindColumn('AddQcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1479. Columns.FindColumn('AddPcQuantity').EditFormat := FProjProperties.QuantityFormat;
  1480. Columns.FindColumn('AddGatherQuantity').EditFormat := FProjProperties.QuantityFormat;
  1481. Columns.FindColumn('DealDgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1482. Columns.FindColumn('DealDgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1483. Columns.FindColumn('CDgnQuantity1').EditFormat := FProjProperties.QuantityFormat;
  1484. Columns.FindColumn('CDgnQuantity2').EditFormat := FProjProperties.QuantityFormat;
  1485. Columns.FindColumn('TotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1486. Columns.FindColumn('CurDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1487. Columns.FindColumn('CurQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1488. Columns.FindColumn('CurPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1489. Columns.FindColumn('CurGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1490. Columns.FindColumn('EndDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1491. Columns.FindColumn('EndQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1492. Columns.FindColumn('EndPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1493. Columns.FindColumn('EndGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1494. Columns.FindColumn('AddDealTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1495. Columns.FindColumn('AddQcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1496. Columns.FindColumn('AddPcTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1497. Columns.FindColumn('AddGatherTotalPrice').EditFormat := FProjProperties.TotalPriceFormat;
  1498. Columns.FindColumn('Price').EditFormat := FProjProperties.PriceFormat;
  1499. Columns.FindColumn('NewPrice').EditFormat := FProjProperties.PriceFormat;
  1500. end;
  1501. end;
  1502. procedure SetBillsGatherDigit;
  1503. begin
  1504. with FBillsGatherData.sdvGclBills do
  1505. begin
  1506. Columns.FindColumn('Price').DisplayFormat := FProjProperties.PriceFormat;
  1507. Columns.FindColumn('DealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1508. Columns.FindColumn('DealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1509. Columns.FindColumn('BGLQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1510. Columns.FindColumn('BGLTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1511. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1512. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1513. Columns.FindColumn('CurDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1514. Columns.FindColumn('CurDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1515. Columns.FindColumn('CurQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1516. Columns.FindColumn('CurQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1517. Columns.FindColumn('CurGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1518. Columns.FindColumn('CurGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1519. Columns.FindColumn('PreDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1520. Columns.FindColumn('PreDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1521. Columns.FindColumn('PreQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1522. Columns.FindColumn('PreQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1523. Columns.FindColumn('PreGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1524. Columns.FindColumn('PreGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1525. Columns.FindColumn('AddDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1526. Columns.FindColumn('AddDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1527. Columns.FindColumn('AddQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1528. Columns.FindColumn('AddQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1529. Columns.FindColumn('AddGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1530. Columns.FindColumn('AddGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1531. Columns.FindColumn('EndDealQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1532. Columns.FindColumn('EndDealTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1533. Columns.FindColumn('EndQcQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1534. Columns.FindColumn('EndQcTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1535. Columns.FindColumn('EndGatherQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1536. Columns.FindColumn('EndGatherTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1537. Columns.FindColumn('Deal_BGLQuantity').DisplayFormat := FProjProperties.QuantityFormat;
  1538. Columns.FindColumn('Deal_BGLTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1539. end;
  1540. with FBillsGatherData.sdvDetailGclBills do
  1541. begin
  1542. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1543. end;
  1544. with FBillsGatherData.sdvDetailDealBills do
  1545. begin
  1546. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1547. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1548. end;
  1549. with FBillsGatherData.sdvDetailBGLBills do
  1550. begin
  1551. Columns.FindColumn('Quantity').DisplayFormat := FProjProperties.QuantityFormat;
  1552. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1553. end;
  1554. end;
  1555. procedure SetDealPaymentDigit;
  1556. begin
  1557. with FDealPaymentData.sdvDealPayment do
  1558. begin
  1559. Columns.FindColumn('CurTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1560. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1561. Columns.FindColumn('StartedPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1562. Columns.FindColumn('RangePrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1563. end;
  1564. end;
  1565. procedure SetBGLDigit;
  1566. begin
  1567. FBGLData.cdsBGLViewTotalPrice.DisplayFormat := FProjProperties.TotalPriceFormat;
  1568. FBGLData.cdsBGBillsViewPrice.DisplayFormat := FProjProperties.PriceFormat;
  1569. FBGLData.cdsBGBillsViewQuantity.DisplayFormat := FProjProperties.QuantityFormat;
  1570. FBGLData.cdsBGBillsViewTotalPrice.DisplayFormat := FProjProperties.TotalPriceFormat;
  1571. FBGLData.cdsBGBillsViewUsedQuantity.DisplayFormat := FProjProperties.QuantityFormat;
  1572. end;
  1573. procedure SetOtherMeasureDigit;
  1574. begin
  1575. with FOtherMeasureOnceData.sdvOnce do
  1576. begin
  1577. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1578. end;
  1579. with FOtherMeasurePhaseData.sdvPhase do
  1580. begin
  1581. Columns.FindColumn('TotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1582. Columns.FindColumn('PreTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1583. Columns.FindColumn('CurTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1584. Columns.FindColumn('EndTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1585. Columns.FindColumn('AddTotalPrice').DisplayFormat := FProjProperties.TotalPriceFormat;
  1586. end;
  1587. end;
  1588. begin
  1589. SetBillsCompileDigit;
  1590. SetBillsMeasureDigit;
  1591. //SetDealPaymentDigit;
  1592. SetBillsGatherDigit;
  1593. SetBGLDigit;
  1594. SetOtherMeasureDigit;
  1595. end;
  1596. function TProjectData.GetStageDataReadOnly: Boolean;
  1597. begin
  1598. if FPhaseData.Active then
  1599. Result := FPhaseData.StageDataReadOnly
  1600. else
  1601. Result := True;
  1602. end;
  1603. procedure TProjectData.OpenForReport2(const AFileName: string);
  1604. begin
  1605. FProjectID := -1;
  1606. UnZipFile(AFileName, TempPath);
  1607. FConnection.Open(MainFileName);
  1608. UpdateProjectDataBase;
  1609. FProjProperties.Open(FConnection.Connection);
  1610. UpdateOldData;
  1611. FBillsData.Open(FConnection.Connection);
  1612. FBillsCompileData.Open;
  1613. FDealPaymentData.Open(FConnection.Connection);
  1614. FBGLData.Open(FConnection.Connection);
  1615. if ProjProperties.PhaseCount > 0 then
  1616. begin
  1617. FPhaseIndex := ProjProperties.PhaseCount;
  1618. FPhaseData.SimpleOpen(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1619. end;
  1620. end;
  1621. function TProjectData.CheckDataBaseInfo(APhaseCount, AAuditStatus: Integer): Boolean;
  1622. begin
  1623. Result := (FProjProperties.PhaseCount = APhaseCount)
  1624. and (FProjProperties.AuditStatus = AAuditStatus);
  1625. if Result and (APhaseCount > 0) and (AAuditStatus <> -1) then
  1626. Result := PhaseData.AuditCount = AAuditStatus;
  1627. end;
  1628. procedure TProjectData.OpenForReport3(const AFileName: string);
  1629. begin
  1630. FProjectID := -1;
  1631. UnZipFile(AFileName, TempPath);
  1632. FConnection.Open(MainFileName);
  1633. UpdateProjectDataBase;
  1634. FProjProperties.Open(FConnection.Connection);
  1635. UpdateOldData;
  1636. FBillsData.Open(FConnection.Connection);
  1637. FBillsMeasureData.Open;
  1638. FDealPaymentData.Open(FConnection.Connection);
  1639. FBGLData.Open(FConnection.Connection);
  1640. if ProjProperties.PhaseCount > 0 then
  1641. begin
  1642. FPhaseIndex := ProjProperties.PhaseCount;
  1643. FPhaseData.SimpleOpen2(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1644. end;
  1645. FBillsMeasureData.ResetTreeNodeStageRec;
  1646. end;
  1647. function TProjectData.GetPriceMarginReadOnly: Boolean;
  1648. begin
  1649. if FPhaseData.Active then
  1650. Result := not((FPhaseIndex = FProjProperties.PhaseCount) and (FPhaseData.StageCount = 1) and (FProjProperties.AuditStatus <> -1))
  1651. else
  1652. Result := True;
  1653. end;
  1654. procedure TProjectData.CalculatePriceMargin;
  1655. begin
  1656. // 计算工料价差数据
  1657. FProjectGLData.CalculateAll;
  1658. {if not FPhaseData.StageDataReadOnly then
  1659. begin
  1660. // 计算清单价差节点
  1661. PhaseData.StageData.CalculatePriceMarginNode;
  1662. // 计算合同支付
  1663. PhaseData.PhasePayData.CalculateAll;
  1664. end;}
  1665. end;
  1666. procedure TProjectData.LockProjectGLData;
  1667. const
  1668. sLockSql = 'Update ProjectGL As P, GLPrice As G' +
  1669. ' Set P.LockedPhaseID = %d'+
  1670. ' Where (P.ID = G.GLID) and (G.PM_Quantity_F <> 0) and (IsNull(P.LockedPhaseID) or (P.LockedPhaseID = 0))';
  1671. var
  1672. sSql: string;
  1673. begin
  1674. sSql := Format(sLockSql, [FProjProperties.PhaseCount]);
  1675. ExecuteSql(sSql);
  1676. end;
  1677. procedure TProjectData.LockDetailGLData;
  1678. const
  1679. sLockSql = 'Update DetailGL As D Set D.LockedPhaseID = %d' +
  1680. ' Where (D.LastBillsQuantity <> 0) and (IsNull(D.LockedPhaseID) or (D.LockedPhaseID = 0))';
  1681. var
  1682. sSql: string;
  1683. begin
  1684. sSql := Format(sLockSql, [FProjProperties.PhaseCount]);
  1685. ExecuteSql(sSql);
  1686. end;
  1687. procedure TProjectData.CopyPreData;
  1688. procedure CopyPreGLPrice;
  1689. const
  1690. sCopySql = 'Insert Into GLPrice (GLID, PhaseID,' +
  1691. ' InfoPrice, InfoDate, DeltaPrice, ValidDeltaPrice,' +
  1692. ' PreUsedQuantity, PreUsedTotalPrice,' +
  1693. ' PM_PreQuantity, PM_PreTotalPrice,'+
  1694. ' PrePAL_UsedQuantity, PrePAL_UsedTotalPrice,'+
  1695. ' PrePAL_DeltaPrice, PrePAL_Total)'+
  1696. ' Select GLID, %d,'+
  1697. ' InfoPrice, InfoDate, DeltaPrice, ValidDeltaPrice,'+
  1698. ' iif(IsNull(PreUsedQuantity), 0, PreUsedQuantity)+UsedQuantity, iif(IsNull(PreUsedTotalPrice), 0, PreUsedTotalPrice)+UsedTotalPrice,'+
  1699. ' iif(IsNull(PM_PreQuantity), 0, PM_PreQuantity)+PM_Quantity_F, iif(IsNull(PM_PreTotalPrice), 0, PM_PreTotalPrice)+PM_TotalPrice_F,'+
  1700. ' iif(IsNull(PrePAL_UsedQuantity), 0, PrePAL_UsedQuantity)+PAL_UsedQuantity_F, iif(IsNull(PrePAL_UsedTotalPrice), 0, PrePAL_UsedTotalPrice)+PAL_UsedTotalPrice_F,'+
  1701. ' iif(IsNull(PrePAL_DeltaPrice), 0, PrePAL_DeltaPrice)+PAL_DeltaPrice_F, iif(IsNull(PrePAL_Total), 0, PrePAL_Total)+PAL_Total_F'+
  1702. ' From GLPrice Where PhaseID = %d';
  1703. begin
  1704. if FProjProperties.PhaseCount > 1 then
  1705. ExecuteSql(Format(sCopySql, [FProjProperties.PhaseCount, FProjProperties.PhaseCount - 1]));
  1706. end;
  1707. procedure CopyPreOMPhaseDetail;
  1708. const
  1709. sCopySql = 'Insert Into OMPhaseDetail (ID, PhaseID, StageID,' +
  1710. ' PreTotalPrice, CurTotalPrice, EndTotalPrice)' +
  1711. ' Select ID, %d, 0, PreTotalPrice + CurTotalPrice, 0, PreTotalPrice + CurTotalPrice' +
  1712. ' From OMPhaseDetail Where (PhaseID = %d) and (StageID = -1)';
  1713. begin
  1714. if FProjProperties.PhaseCount > 1 then
  1715. ExecuteSql(Format(sCopySql, [FProjProperties.PhaseCount, FProjProperties.PhaseCount - 1]));
  1716. end;
  1717. begin
  1718. CopyPreGLPrice;
  1719. CopyPreOMPhaseDetail;
  1720. PhaseData.CopyPreData;
  1721. ProjectGLData.LoadCurPhaseInfoPrice;
  1722. ProjectGLData.LoadStagePM_CalcData;
  1723. FProjectGLData.RefreshGatherData;
  1724. FOtherMeasurePhaseData.LoadCurStageData;
  1725. BillsMeasureData.ResetTreeNodeStageRec;
  1726. end;
  1727. function TProjectData.GetStageIndex: Integer;
  1728. begin
  1729. Result := FPhaseData.StageIndex;
  1730. end;
  1731. procedure TProjectData.SetStageIndex(const Value: Integer);
  1732. begin
  1733. FProjectGLData.Save;
  1734. FOtherMeasurePhaseData.Save;
  1735. FPhaseData.StageIndex := Value;
  1736. FProjectGLData.LoadStagePM_CalcData;
  1737. FOtherMeasurePhaseData.LoadCurStageData;
  1738. end;
  1739. procedure TProjectData.ClearReportCacheData;
  1740. begin
  1741. DropCacheTable('P_');
  1742. end;
  1743. function TProjectData.GetCanInsertNormalBills: Boolean;
  1744. begin
  1745. if FProjProperties.PhaseCount > 0 then
  1746. Result := CanUnlockInfo
  1747. else
  1748. Result := True;
  1749. end;
  1750. procedure TProjectData.ClearReportPrepareData;
  1751. begin
  1752. DropCacheTable('rdp_');
  1753. end;
  1754. procedure TProjectData.DropCacheTable(const AKey: string);
  1755. var
  1756. FTableList: TStringList;
  1757. iIndex: Integer;
  1758. sDeleteTableSql: String;
  1759. begin
  1760. FTableList := TStringList.Create;
  1761. try
  1762. FConnection.Connection.GetTableNames(FTableList);
  1763. iIndex := 0;
  1764. while iIndex < FTableList.Count do
  1765. begin
  1766. if Pos(AKey, FTableList.Strings[iIndex]) = 1 then
  1767. begin
  1768. sDeleteTableSql := Format('Drop Table %s', [FTableList.Strings[iIndex]]);
  1769. ExecuteSql(sDeleteTableSql);
  1770. end;
  1771. Inc(iIndex);
  1772. end;
  1773. finally
  1774. FTableList.Free;
  1775. end;
  1776. end;
  1777. procedure TProjectData.SaveDebugFile(const AFileName: string);
  1778. var
  1779. sFileName: string;
  1780. begin
  1781. sFileName := ExtractFileName(AFileName);
  1782. if FDebugDir = '' then
  1783. FConnection.SaveDebugFile('E:\' + sFileName)
  1784. else
  1785. FConnection.SaveDebugFile(FDebugDir + '\' + sFileName);
  1786. end;
  1787. procedure TProjectData.SaveTempDataBaseFile(const AFileName: string);
  1788. begin
  1789. FConnection.SaveDebugFile(AFileName);
  1790. end;
  1791. procedure TProjectData.ImportDmfFile(const AFileName: string);
  1792. begin
  1793. ImportDbTreeTo(AFileName, Self);
  1794. end;
  1795. function TProjectData.GetValidStageIsRefer: Boolean;
  1796. begin
  1797. if FPhaseData.Active then
  1798. Result := (FPhaseIndex = FProjProperties.PhaseCount) and (FPhaseData.StageCount = 1) and (FProjProperties.AuditStatus <> -1)
  1799. else
  1800. Result := False;
  1801. end;
  1802. procedure TProjectData.OpenForGather(const AFileName: string;
  1803. APhaseIndex: Integer = -1);
  1804. begin
  1805. FProjectID := -1;
  1806. UnZipFile(AFileName, TempPath);
  1807. FConnection.Open(MainFileName);
  1808. UpdateProjectDataBase;
  1809. FProjProperties.Open(FConnection.Connection);
  1810. UpdateOldData;
  1811. FBillsData.Open(FConnection.Connection);
  1812. FBillsMeasureData.Open;
  1813. FDealPaymentData.Open(FConnection.Connection);
  1814. FBGLData.Open(FConnection.Connection);
  1815. if ProjProperties.PhaseCount > 0 then
  1816. begin
  1817. if (APhaseIndex <= ProjProperties.PhaseCount) and (APhaseIndex > 0) then
  1818. FPhaseIndex := APhaseIndex
  1819. else
  1820. FPhaseIndex := ProjProperties.PhaseCount;
  1821. FPhaseData.SimpleOpen2(Format('%sPhase%d.dat', [TempPath, FPhaseIndex]));
  1822. end;
  1823. FBillsMeasureData.ResetTreeNodeStageRec;
  1824. end;
  1825. function TProjectData.IsHistoryPhase: Boolean;
  1826. begin
  1827. Result := PhaseIndex < ProjProperties.PhaseCount;
  1828. end;
  1829. procedure TProjectData.OpenForSignOnline(AProjRec: TsdDataRecord;
  1830. APhaseIndex: Integer);
  1831. begin
  1832. FWebID := AProjRec.ValueByName('WebID').AsInteger;
  1833. FWebOwnerID := AProjRec.ValueByName('WebOwnerID').AsInteger;
  1834. FWebAuthorID := AProjRec.ValueByName('WebAuthorID').AsInteger;
  1835. OpenForGather(GetMyProjectsFilePath + AProjRec.ValueByName('FileName').AsString, APhaseIndex);
  1836. if _IsCloud then
  1837. LoadCheckersData;
  1838. CopyPhaseData(False);
  1839. end;
  1840. function TProjectData.GetStartMeasure: Boolean;
  1841. begin
  1842. Result := ProjProperties.PhaseCount > 0;
  1843. end;
  1844. function TProjectData.CheckPhaseFileComplete: Boolean;
  1845. var
  1846. i: Integer;
  1847. begin
  1848. Result := True;
  1849. for i := 1 to FProjProperties.PhaseCount do
  1850. begin
  1851. if not FileExists(Format('%s\Phase%d.dat', [TempPath, i])) then
  1852. begin
  1853. Result := False;
  1854. Break;
  1855. end;
  1856. end;
  1857. end;
  1858. procedure TProjectData.SaveAndCheck;
  1859. function CheckFile(AFileName: string): Boolean;
  1860. var
  1861. Checker: TTenderZipCompleteChecker;
  1862. begin
  1863. Checker := TTenderZipCompleteChecker.Create;
  1864. try
  1865. Checker.CheckType := zctLastPhase;
  1866. Result := Checker.CheckFileValid(AFileName);
  1867. finally
  1868. Checker.Free;
  1869. end;
  1870. end;
  1871. begin
  1872. AppendProjectLog('Save Project');
  1873. Save;
  1874. if not CheckFile(FFileName) then
  1875. begin
  1876. AppendProjectLog('Save Project --> Error');
  1877. Save;
  1878. if not CheckFile(FFileName) then
  1879. begin
  1880. AppendProjectLog('Save Project --> Error-2');
  1881. ErrorMessage('保存数据出错。请重试,或联系纵横客服:企业QQ:800003850 客服热线:(0756)3850888');
  1882. Abort;
  1883. end
  1884. else
  1885. ProjectManager.AddSaveTenderBackup(FProjectID);
  1886. end
  1887. else
  1888. ProjectManager.AddSaveTenderBackup(FProjectID);
  1889. AppendProjectLog('Save Project --> End');
  1890. end;
  1891. function TProjectData.CheckLastPhaseFileExist: Boolean;
  1892. begin
  1893. if FProjProperties.PhaseCount > 0 then
  1894. Result := FileExists(Format('%s\Phase%d.dat', [TempPath, FProjProperties.PhaseCount]))
  1895. else
  1896. Result := True;
  1897. end;
  1898. procedure TProjectData.InnerSave;
  1899. begin
  1900. try
  1901. AppendProjectLog('Save Main Data');
  1902. CheckCalcBeforeSave;
  1903. UpdateSysProgress(5, '正在保存数据');
  1904. SaveLastestPhaseMainData;
  1905. UpdateSysProgress(10, '正在保存数据');
  1906. if (FPhaseData.Active) and (FPhaseIndex = ProjProperties.PhaseCount) then
  1907. FPhaseData.Save;
  1908. UpdateSysProgress(40, '正在保存数据');
  1909. FMainListData.Save;
  1910. FDealPaymentData.Save;
  1911. UpdateSysProgress(50, '正在保存数据');
  1912. FStaffData.Save;
  1913. UpdateSysProgress(60, '正在保存数据');
  1914. FBGLData.Save;
  1915. UpdateSysProgress(70, '正在保存数据');
  1916. FDealBillsData.Save;
  1917. UpdateSysProgress(80, '正在保存数据');
  1918. FProjectGLData.Save;
  1919. FDetailGLData.Save;
  1920. UpdateSysProgress(100, '正在保存数据');
  1921. FBillsCompileData.ReLockBaseData;
  1922. UpdateSysProgress(110, '正在保存数据');
  1923. FBillsData.Save;
  1924. UpdateSysProgress(165, '正在保存数据');
  1925. FOtherMeasureOnceData.Save;
  1926. FOtherMeasurePhaseData.Save;
  1927. UpdateSysProgress(170, '正在保存数据');
  1928. FProjProperties.AuditCompany := FStaffData.FinalStaffCompany;
  1929. FProjProperties.Save;
  1930. UpdateSysProgress(180, '正在保存数据');
  1931. FConnection.Save;
  1932. UpdateSysProgress(200, '就绪');
  1933. AppendProjectLog('Save Main Data --> End');
  1934. except
  1935. ErrorMessage('保存数据出错。请重试,或联系纵横客服:企业QQ:800003850 客服热线:(0756)3850888');
  1936. AppendProjectLog('Save Main Data --> Error');
  1937. end;
  1938. end;
  1939. function TProjectData.SaveAs(const AFileName: string): Boolean;
  1940. begin
  1941. try
  1942. InnerSave;
  1943. ZipFolder(FTempFolder, AFileName);
  1944. SaveInfoToManager;
  1945. except
  1946. Result := False;
  1947. end;
  1948. end;
  1949. procedure TProjectData.AppendProjectLog(const ALog: string);
  1950. begin
  1951. if SupportManager.ConfigInfo.IsLog then
  1952. MeasureLog.AppendLogTo(Format('%s: %s', [FProjectName, ALog]));
  1953. end;
  1954. procedure TProjectData.SetIsGuest(const Value: Boolean);
  1955. begin
  1956. FIsGuest := Value;
  1957. end;
  1958. procedure TProjectData.LoadCheckersData;
  1959. var
  1960. sURL: string;
  1961. vA: TOVArr;
  1962. i, iIndex: Integer;
  1963. vStatus: TCheckStatus;
  1964. begin
  1965. Checkers.Clear;
  1966. sURL := Format('%suser/get/all/%d/%d/measure', [PHPWeb.MeasureURL, WebID, PhaseIndex]);
  1967. if PHPWeb.Search(sURL, [''], [''], vA) = 1 then
  1968. begin
  1969. for i := Low(vA) to High(vA) do
  1970. begin
  1971. vStatus := TCheckStatus(StrToInt(vA[i, 3])-1);
  1972. iIndex := Checkers.Add(StrToInt(vA[i, 4]), vA[i, 0], vA[i, 2], vA[i, 6], vA[i, 8]);
  1973. if vStatus in [csFinished, csNotPass] then
  1974. Checkers.LastChecker := Checkers.Item[iIndex];
  1975. end;
  1976. end
  1977. end;
  1978. procedure TProjectData.CheckCalcBeforeSave;
  1979. function NeedReCalc: Boolean;
  1980. var
  1981. vTopNode: TsdIDTreeNode;
  1982. begin
  1983. Result := False;
  1984. vTopNode := BillsMeasureData.BillsMeasureTree.FirstNode;
  1985. while not Result and Assigned(vTopNode) do
  1986. begin
  1987. if not BillsMeasureData.CheckNodeGatherCalc(TMeasureBillsIDTreeNode(vTopNode)) then
  1988. Result := True;
  1989. vTopNode := vTopNode.NextSibling;
  1990. end;
  1991. end;
  1992. var
  1993. i: Integer;
  1994. fLeafSum, fTopParent: Double;
  1995. begin
  1996. if PhaseData.Active and (not StageDataReadOnly) and NeedReCalc then
  1997. begin
  1998. Screen.Cursor := crHourGlass;
  1999. try
  2000. ShowProgressHint('检查到有需要计算的清单,请稍候...');
  2001. CalculateAll;
  2002. CloseProgressHint;
  2003. finally
  2004. Screen.Cursor := crDefault;
  2005. end;
  2006. end;
  2007. end;
  2008. end.