ProjectFme.pas 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485
  1. unit ProjectFme;
  2. interface
  3. uses
  4. BillsCompileFme, BillsMeasureFme, PhaseCompareFme, DealPaymentFme,
  5. BillsGatherFme, ZJJLFme, BGLFme, ReportsFrm, SearchFme, BookmarkFme,
  6. ProjectData, UtilMethods, Globals, mEncryptEditions, DealBillsFme,
  7. PriceMarginFme,
  8. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  9. Dialogs, ImgList, XPMenu, Buttons, ComCtrls, ToolWin, ExtCtrls, JimPages,
  10. StdCtrls, JimCombos, dxsbar, ActnList, dxBar, OrderCheckerFme, CheckerFme,
  11. CslButton, UpFileManageFrame, UpFileManageUnit;
  12. type
  13. TProjectFrame = class(TFrame)
  14. xpm: TXPMenu;
  15. ilstExpend: TImageList;
  16. pnlViewControl: TPanel;
  17. pnlView: TPanel;
  18. pnlToolBar: TPanel;
  19. tbToolsButton: TToolBar;
  20. tobtnStandardBills: TToolButton;
  21. tobtnDealPayment: TToolButton;
  22. tobtnSearch: TToolButton;
  23. sbtnExpend: TSpeedButton;
  24. tbXmjBills: TToolBar;
  25. tbExpand: TToolButton;
  26. tbSeparator: TToolButton;
  27. sprAssistant: TSplitter;
  28. jpsAssistant: TJimPages;
  29. jpsAssistantDealPayment: TJimPage;
  30. jpsAssistantSearch: TJimPage;
  31. dxsbViewControl: TdxSideBar;
  32. dxsbsViewControl: TdxSideBarStore;
  33. xbiBillsCompile: TdxStoredSideItem;
  34. jpsAssistantStandardBills: TJimPage;
  35. jpsMain: TJimPages;
  36. jpsMainBillsMeasure: TJimPage;
  37. xbiBillsGather: TdxStoredSideItem;
  38. jpsMainBillsGather: TJimPage;
  39. ilstLarge: TImageList;
  40. ilstSmall: TImageList;
  41. xbiStageCompare: TdxStoredSideItem;
  42. xbiCompleteDegree: TdxStoredSideItem;
  43. xbiReport: TdxStoredSideItem;
  44. jpsMainStageCompare: TJimPage;
  45. tobtnZJJL: TToolButton;
  46. tobtnBGL: TToolButton;
  47. jpsAssistantZJJL: TJimPage;
  48. jpsAssistantBGL: TJimPage;
  49. dxpmExpandBills: TdxBarPopupMenu;
  50. alProject: TActionList;
  51. actnFirstLevel: TAction;
  52. actnSecondLevel: TAction;
  53. actnThirdLevel: TAction;
  54. actnFourthLevel: TAction;
  55. actnFifthLevel: TAction;
  56. actnAllLevel: TAction;
  57. actnAllXmj: TAction;
  58. xbiBillsMeasure: TdxStoredSideItem;
  59. jpsMainBillsCompile: TJimPage;
  60. pnlPhaseSelect: TPanel;
  61. jcbAudit: TJimComboBox;
  62. jcbPhase: TJimComboBox;
  63. tobtnShowChecker: TToolButton;
  64. jpsAssistantChecker: TJimPage;
  65. btnSubmit: TCslButton;
  66. btnPass: TCslButton;
  67. btnNotPass: TCslButton;
  68. pnlNewPhase: TPanel;
  69. btnNewPhase: TCslButton;
  70. pnlProjectCheckStatus: TPanel;
  71. actnCurPhase: TAction;
  72. tobtnBookmark: TToolButton;
  73. jpsAssistantBookmark: TJimPage;
  74. jpsAssistantUpFile: TJimPage;
  75. tobtnUpFile: TToolButton;
  76. jpsAssistantDealBills: TJimPage;
  77. tobtnDealBills: TToolButton;
  78. actnAllPeg: TAction;
  79. jpsMainPriceMargin: TJimPage;
  80. xbiPriceMargin: TdxStoredSideItem;
  81. procedure tobtnStandardBillsClick(Sender: TObject);
  82. procedure jcbPhaseChanged(Sender: TObject);
  83. procedure sbtnExpendClick(Sender: TObject);
  84. procedure jcbAuditChanged(Sender: TObject);
  85. procedure dxsbViewControlItemClick(Sender: TObject;
  86. Item: TdxSideBarItem);
  87. procedure dxpmExpandBillsPopup(Sender: TObject);
  88. procedure actnFirstLevelExecute(Sender: TObject);
  89. procedure tbExpandClick(Sender: TObject);
  90. procedure actnAllXmjExecute(Sender: TObject);
  91. procedure btnSubmitClick(Sender: TObject);
  92. procedure btnPassClick(Sender: TObject);
  93. procedure btnNotPassClick(Sender: TObject);
  94. procedure btnNewPhaseClick(Sender: TObject);
  95. procedure actnCurPhaseExecute(Sender: TObject);
  96. procedure tobtnUpFileClick(Sender: TObject);
  97. procedure jpsAssistantActivePageChanged(Sender: TObject);
  98. procedure actnAllPegExecute(Sender: TObject);
  99. private
  100. FProjectData: TProjectData;
  101. FBillsCompileFrame: TBillsCompileFrame;
  102. FBillsMeasureFrame: TBillsMeasureFrame;
  103. FBillsGatherFrame: TBillsGatherFrame;
  104. FPriceMarginFrame: TPriceMarginFrame;
  105. FPhaseCompareFrame: TPhaseCompareFrame;
  106. FCheckerFrame: TCheckerFrame;
  107. FDealPaymentFrame: TDealPaymentFrame;
  108. FZJJLFrame: TZJJLFrame;
  109. FBGLFrame: TBGLFrame;
  110. FSearchFrame: TSearchFrame;
  111. FBookmarkFrame: TBookmarkFrame;
  112. FUpFileManageView: TUpFileManageView;
  113. FDealBillsFrame: TDealBillsFrame;
  114. procedure CreateBillsFrame;
  115. procedure CreateDealPaymentFrame;
  116. procedure CreateBillsGatherFrame;
  117. procedure CreatePriceMarginFrame;
  118. procedure CreateCheckerFrame;
  119. procedure CreateUpFile;
  120. procedure CreateFrames;
  121. procedure InitialForVersions;
  122. procedure OpenCompare;
  123. procedure CloseCompare;
  124. // 刷新各界面只读、显示等
  125. procedure RefreshProjectState;
  126. procedure AdjustFramesDisplay;
  127. procedure SaveLog(AStr: string);
  128. procedure ExpandNodeTo(ALevel: Integer);
  129. procedure ExpandAllXmj;
  130. procedure ExpandCurPhase;
  131. procedure SetAssistantViewVisible(AVisible: Boolean);
  132. procedure SetImageOfsbtnExpend(AExpend: Boolean);
  133. procedure ControlAssistantButtonsDown(ATag: Integer);
  134. procedure ExpandBookmarkFrame(AExpandFrame: Boolean);
  135. procedure UpToWeb(ACheckPassed: Boolean);
  136. function CheckersHint: string;
  137. procedure SetUpFileManageView(const Value: TUpFileManageView);
  138. procedure CheckUpFile;
  139. procedure ShowPhaseHint;
  140. public
  141. constructor Create(AProjectData: TProjectData);
  142. destructor Destroy; override;
  143. procedure ResetAssistantView;
  144. procedure GeneratePhaseChooseList;
  145. procedure GenerateStageChooseList;
  146. procedure CreateNewPhase;
  147. procedure CreateNewAudit;
  148. procedure RefreshColumnDisplay;
  149. function CheckCanReport: Boolean;
  150. procedure UnLockData;
  151. procedure ReLockData;
  152. function IsUped: Boolean;
  153. procedure ButtonControl_UpToWeb;
  154. procedure ButtonControl_NewPhase;
  155. procedure RepairAudits;
  156. function CheckFileAndCloudChekerList: Boolean;
  157. property ProjectData: TProjectData read FProjectData;
  158. property BillsCompileFrame: TBillsCompileFrame read FBillsCompileFrame;
  159. property BillsMeasureFrame: TBillsMeasureFrame read FBillsMeasureFrame;
  160. property BillsGatherFrame: TBillsGatherFrame read FBillsGatherFrame;
  161. property PriceMarginFrame: TPriceMarginFrame read FPriceMarginFrame;
  162. property CheckerFrame: TCheckerFrame read FCheckerFrame;
  163. property UpFileManageView: TUpFileManageView read FUpFileManageView write SetUpFileManageView;
  164. property DealPaymentFrame: TDealPaymentFrame read FDealPaymentFrame;
  165. property ZJJLFrame: TZJJLFrame read FZJJLFrame;
  166. property BGLFrame: TBGLFrame read FBGLFrame;
  167. property SearchFrame: TSearchFrame read FSearchFrame;
  168. property BookmarkFrame: TBookmarkFrame read FBookmarkFrame;
  169. property DealBillsFrame: TDealBillsFrame read FDealBillsFrame;
  170. end;
  171. implementation
  172. uses
  173. PhaseData, BGLDm, MainFrm, ZhAPI, SearchDm, PHPWebDm, ActiveX,
  174. ConstUnit, MD5Unit, sdIDTree, sdDB, mProgressFrm, ConditionalDefines,
  175. ProjectCommands, ProjectProperty, CheckerMemoFrm, BillsMeasureDm,
  176. ProgressHintFrm, mProgressProFrm;
  177. {$R *.dfm}
  178. { TProjectFrame }
  179. procedure TProjectFrame.AdjustFramesDisplay;
  180. begin
  181. jpsAssistant.Width := 395;
  182. SetAssistantViewVisible(False);
  183. end;
  184. procedure TProjectFrame.ControlAssistantButtonsDown(ATag: Integer);
  185. begin
  186. tobtnStandardBills.Down := ATag = tobtnStandardBills.Tag;
  187. tobtnDealPayment.Down := ATag = tobtnDealPayment.Tag;
  188. tobtnSearch.Down := ATag = tobtnSearch.Tag;
  189. tobtnZJJL.Down := ATag = tobtnZJJL.Tag;
  190. tobtnBGL.Down := ATag = tobtnBGL.Tag;
  191. tobtnShowChecker.Down := ATag = tobtnShowChecker.Tag;
  192. tobtnUpFile.Down := ATag = tobtnUpFile.Tag;
  193. tobtnBookmark.Down := ATag = tobtnBookmark.Tag;
  194. end;
  195. constructor TProjectFrame.Create(AProjectData: TProjectData);
  196. begin
  197. inherited Create(nil);
  198. FProjectData := AProjectData;
  199. ResetAssistantView;
  200. AdjustFramesDisplay;
  201. CreateFrames;
  202. RefreshProjectState;
  203. GeneratePhaseChooseList;
  204. GenerateStageChooseList;
  205. dxsbViewControl.SelectedItem := dxsbViewControl.ActiveGroup.Items.Items[0];
  206. InitialForVersions;
  207. CreateUpFile;
  208. if G_IsCloud then
  209. begin
  210. // 0号台帐无审核人,网络读取会出错。所以只有在有计量的情况下才创建审核人
  211. if (ProjectData.PhaseIndex > 0) then
  212. begin
  213. tobtnShowChecker.Visible := True;
  214. CreateCheckerFrame;
  215. end;
  216. ButtonControl_NewPhase;
  217. ButtonControl_UpToWeb;
  218. RepairAudits;
  219. end;
  220. end;
  221. destructor TProjectFrame.Destroy;
  222. begin
  223. FBookmarkFrame.Free;
  224. FZJJLFrame.Free;
  225. FBillsGatherFrame.Free;
  226. FDealPaymentFrame.Free;
  227. FBillsCompileFrame.Free;
  228. FBillsMeasureFrame.Free;
  229. FUpFileManageView.Free;
  230. SupportManager.ClearAssistantViewParent;
  231. inherited;
  232. end;
  233. procedure TProjectFrame.ResetAssistantView;
  234. begin
  235. AlignControl(SupportManager.StandardLibsFrame, jpsAssistantStandardBills, alClient);
  236. end;
  237. procedure TProjectFrame.SetAssistantViewVisible(AVisible: Boolean);
  238. begin
  239. jpsAssistant.Visible := AVisible;
  240. sprAssistant.Visible := AVisible;
  241. end;
  242. procedure TProjectFrame.SetImageOfsbtnExpend(AExpend: Boolean);
  243. begin
  244. sbtnExpend.Glyph := nil;
  245. ilstExpend.GetBitmap(Integer(AExpend), sbtnExpend.Glyph);
  246. end;
  247. procedure TProjectFrame.tobtnStandardBillsClick(Sender: TObject);
  248. begin
  249. with TToolButton(Sender) do
  250. begin
  251. if Down then
  252. begin
  253. jpsAssistant.ActivePageIndex := Tag;
  254. sbtnExpend.Tag := Tag;
  255. ControlAssistantButtonsDown(Tag);
  256. jpsMain.ActivePage.Tag := Tag;
  257. end;
  258. SetAssistantViewVisible(Down);
  259. SetImageOfsbtnExpend(Down);
  260. end;
  261. end;
  262. procedure TProjectFrame.GeneratePhaseChooseList;
  263. var
  264. iIndex: Integer;
  265. begin
  266. jcbPhase.Items.Clear;
  267. for iIndex := 1 to FProjectData.ProjProperties.PhaseCount do
  268. jcbPhase.Items.Add(Format(' 第 %d 期数据', [iIndex]));
  269. jcbPhase.ItemIndex := jcbPhase.Items.Count - 1;
  270. jcbPhase.Enabled := jcbPhase.Items.Count > 0;
  271. tobtnZJJL.Enabled := jcbPhase.Enabled;
  272. tobtnBGL.Enabled := jcbPhase.Enabled;
  273. end;
  274. procedure TProjectFrame.jcbPhaseChanged(Sender: TObject);
  275. begin
  276. if ProjectData.PhaseIndex = jcbPhase.ItemIndex + 1 then Exit;
  277. FProjectData.PhaseIndex := jcbPhase.ItemIndex + 1;
  278. GenerateStageChooseList;
  279. RefreshProjectState;
  280. if Assigned(FZJJLFrame) then
  281. begin
  282. FZJJLFrame.DataReadOnly := FProjectData.PhaseData.StageDataReadOnly;
  283. FZJJLFrame.ResetFrameLink(FProjectData.PhaseData.ZJJLData);
  284. end;
  285. if G_IsCloud then
  286. begin
  287. if Assigned(FCheckerFrame) then
  288. begin
  289. FCheckerFrame.Init;
  290. RepairAudits;
  291. end;
  292. ButtonControl_UpToWeb;
  293. end;
  294. end;
  295. procedure TProjectFrame.CreateNewPhase;
  296. var
  297. iBef: Integer;
  298. vArr: array of string;
  299. begin
  300. if QuestMessage('请检查合同支付的初始值,新增一期计量将锁定当前全部的清单数据,是否继续?') then
  301. begin
  302. // 网络版创建第二期、第三期等跟第一期有所不同:
  303. // 创建前,先发送信号给服务器,服务器自动根据第一期生成第二期的审核人列表。
  304. // 有了这个列表程序才能正常接下来的业务。
  305. if G_IsCloud then
  306. begin
  307. iBef := FProjectData.ProjProperties.PhaseCount;
  308. if iBef >= 1 then
  309. begin
  310. vArr := VarArrayOf(['msg']);
  311. if PHPWeb.Search(PHPWeb.MeasureURL + 'phaseno/userlist/create',
  312. ['tenderid', 'phaseno'], [IntToStr(FProjectData.WebID),
  313. IntToStr(iBef + 1)], vArr) <> 1 then
  314. begin
  315. Application.MessageBox(Pchar('云端自动创建本期审核人列表出错,请重新尝试!'), '警告', MB_OK + MB_ICONWARNING);
  316. Exit;
  317. end;
  318. end;
  319. end;
  320. FProjectData.CreateNewPhase;
  321. tobtnDealPayment.Enabled := True;
  322. tobtnZJJL.Enabled := True;
  323. tobtnBGL.Enabled := True;
  324. jcbPhase.Enabled := True;
  325. jcbAudit.Enabled := True;
  326. jcbPhase.Items.Add(Format(' 第 %d 期数据', [jcbPhase.Items.Count + 1]));
  327. jcbPhase.ItemIndex := jcbPhase.Items.Count - 1;
  328. FProjectData.CopyPreData;
  329. RefreshProjectState;
  330. if G_IsCloud then
  331. begin
  332. if Assigned(CheckerFrame) then
  333. CheckerFrame.Free;
  334. CreateCheckerFrame;
  335. tobtnShowChecker.Visible := True;
  336. tobtnShowChecker.Enabled := True;
  337. ButtonControl_NewPhase;
  338. ButtonControl_UpToWeb;
  339. end;
  340. end;
  341. end;
  342. procedure TProjectFrame.sbtnExpendClick(Sender: TObject);
  343. var
  344. bExpend: Boolean;
  345. begin
  346. bExpend := not jpsAssistant.Visible;
  347. jpsAssistant.ActivePageIndex := TSpeedButton(Sender).Tag;
  348. SetAssistantViewVisible(bExpend);
  349. SetImageOfsbtnExpend(bExpend);
  350. if bExpend then
  351. begin
  352. ControlAssistantButtonsDown(jpsAssistant.ActivePageIndex);
  353. jpsMain.ActivePage.Tag := jpsAssistant.ActivePageIndex;
  354. end
  355. else
  356. begin
  357. ControlAssistantButtonsDown(-1);
  358. jpsMain.ActivePage.Tag := -1;
  359. end;
  360. if G_IsCloud then
  361. CheckUpFile;
  362. end;
  363. procedure TProjectFrame.CreateNewAudit;
  364. begin
  365. FProjectData.PhaseData.CreateNewAuditData;
  366. jcbAudit.Items.Add(Format(' %d 审', [FProjectData.PhaseData.StageCount - 1]));
  367. if jcbAudit.ItemIndex <> jcbAudit.Items.Count - 1 then
  368. jcbAudit.ItemIndex := jcbAudit.Items.Count - 1
  369. else
  370. FProjectData.ResetPhaseDataLink;
  371. end;
  372. procedure TProjectFrame.GenerateStageChooseList;
  373. var
  374. iIndex: Integer;
  375. begin
  376. jcbAudit.Items.Clear;
  377. if not FProjectData.PhaseData.Active then Exit;
  378. for iIndex := 0 to FProjectData.PhaseData.AuditCount do
  379. begin
  380. if iIndex = 0 then
  381. jcbAudit.Items.Add(' 原报')
  382. else
  383. jcbAudit.Items.Add(Format(' %d 审', [iIndex]));
  384. end;
  385. if jcbAudit.ItemIndex <> jcbAudit.Items.Count - 1 then
  386. jcbAudit.ItemIndex := jcbAudit.Items.Count - 1
  387. else
  388. FProjectData.ResetPhaseDataLink;
  389. jcbAudit.Enabled := jcbAudit.Items.Count > 0;
  390. end;
  391. procedure TProjectFrame.jcbAuditChanged(Sender: TObject);
  392. begin
  393. if FProjectData.PhaseData.StageIndex = jcbAudit.ItemIndex then Exit;
  394. FProjectData.StageIndex := jcbAudit.ItemIndex;
  395. RefreshProjectState;
  396. end;
  397. procedure TProjectFrame.dxsbViewControlItemClick(Sender: TObject;
  398. Item: TdxSideBarItem);
  399. procedure BeforeChangeView;
  400. begin
  401. if G_IsCloud then
  402. begin
  403. tobtnShowChecker.Visible := ProjectData.PhaseIndex > 0;
  404. tobtnShowChecker.Enabled := (Item.Tag = xbiBillsMeasure.Tag);
  405. ButtonControl_NewPhase;
  406. if Item.Tag = xbiBillsCompile.Tag then
  407. begin
  408. if tobtnShowChecker.Down then
  409. begin
  410. tobtnShowChecker.Down := False;
  411. tobtnShowChecker.Click;
  412. tobtnStandardBills.Down := True;
  413. tobtnStandardBills.Click;
  414. tobtnStandardBills.Down := False;
  415. tobtnStandardBills.Click;
  416. end;
  417. end;
  418. end;
  419. // 记录台账分解、计量台账等的右侧展开情况
  420. if jpsAssistant.Visible then
  421. jpsMain.ActivePage.Tag := jpsAssistant.ActivePageIndex
  422. else
  423. jpsMain.ActivePage.Tag := -1;
  424. end;
  425. procedure AfterChangeView;
  426. begin
  427. // 仅计量台账界面可以选择计量期
  428. pnlPhaseSelect.Visible := Item.Tag = xbiBillsMeasure.Tag;
  429. // 台账分解、计量台账、审核比较 可使用"显示至"功能
  430. tbExpand.Visible := (Item.Tag = xbiBillsCompile.Tag)
  431. or (Item.Tag = xbiBillsMeasure.Tag)
  432. or (Item.Tag = xbiStageCompare.Tag);
  433. // 右侧按钮是否显示
  434. tbToolsButton.Visible := (Item.Tag = xbiBillsCompile.Tag)
  435. or (Item.Tag = xbiBillsMeasure.Tag);
  436. tobtnBGL.Visible := Item.Tag = xbiBillsMeasure.Tag;
  437. tobtnZJJL.Visible := Item.Tag = xbiBillsMeasure.Tag;
  438. // 控制整个按钮工具栏显示,
  439. pnlToolBar.Visible := pnlPhaseSelect.Visible or tbExpand.Visible or tbToolsButton.Visible;
  440. // 根据当前View控制右侧按钮是否按下,右侧工具窗是否弹开
  441. jpsAssistant.ActivePageIndex := jpsMain.ActivePage.Tag;
  442. sbtnExpend.Tag := jpsMain.ActivePage.Tag;
  443. ControlAssistantButtonsDown(jpsMain.ActivePage.Tag);
  444. SetAssistantViewVisible(jpsMain.ActivePage.Tag <> -1);
  445. SetImageOfsbtnExpend(jpsMain.ActivePage.Tag <> -1);
  446. // 0号台账与计量台账的书签不同
  447. if Item.Tag = xbiBillsCompile.Tag then
  448. FBookmarkFrame.BMType := bmtCompile
  449. else if Item.Tag = xbiBillsMeasure.Tag then
  450. FBookmarkFrame.BMType := bmtMeasure;
  451. // 0号台账与计量台账的查找定位不同
  452. if Item.Tag = xbiBillsCompile.Tag then
  453. FSearchFrame.LocateType := ltCompile
  454. else if Item.Tag = xbiBillsMeasure.Tag then
  455. FSearchFrame.LocateType := ltMeasure;
  456. // 切换至清单汇总,须重新汇总
  457. if Item.Tag = xbiBillsGather.Tag then
  458. BillsGatherFrame.RefreshBills;
  459. // 切换至材料调差,须重新汇总展示调差清单
  460. if Item.Tag = xbiPriceMargin.Tag then
  461. PriceMarginFrame.RefreshBills;
  462. if G_IsCloud then
  463. if (Item.Tag = xbiBillsCompile.Tag) or (Item.Tag = xbiBillsMeasure.Tag) then
  464. CheckUpFile;
  465. tobtnUpFile.Enabled := Item.Tag = xbiBillsMeasure.Tag;
  466. if (tobtnUpFile.Enabled = False) and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
  467. jpsAssistant.ActivePage := jpsAssistantStandardBills;
  468. end;
  469. procedure ChangeView;
  470. begin
  471. BeforeChangeView;
  472. case Item.Tag of
  473. 0, 2: jpsMain.ActivePageIndex := Item.Tag;
  474. 1, 3: if CheckMeasureEdition then jpsMain.ActivePageIndex := Item.Tag;
  475. end;
  476. AfterChangeView;
  477. end;
  478. procedure DisplayReports;
  479. begin
  480. // 准备数据
  481. if Item.Tag = xbiReport.Tag then
  482. FProjectData.CopyPhaseData;
  483. // 显示报表界面
  484. DisplayReportsForm(FProjectData);
  485. dxsbViewControl.SelectedItem := dxsbViewControl.ActiveGroup.Items[jpsMain.ActivePageIndex];
  486. end;
  487. procedure DisplayCompare;
  488. begin
  489. if FProjectData.ProjProperties.PhaseCount = 0 then
  490. begin
  491. ErrorMessage('当前项目未开始计量,暂无审核比较数据!');
  492. dxsbViewControl.SelectedItem := dxsbViewControl.ActiveGroup.Items[jpsMain.ActivePageIndex];
  493. Abort;
  494. end;
  495. ShowProgressHint('正在准备审核比较数据,请稍候...');
  496. Screen.Cursor := crHourGlass;
  497. try
  498. BeforeChangeView;
  499. if CheckMeasureEdition then
  500. begin
  501. OpenCompare;
  502. jpsMain.ActivePageIndex := Item.Tag;
  503. end;
  504. AfterChangeView;
  505. finally
  506. Screen.Cursor := crDefault;
  507. CloseProgressHint;
  508. end;
  509. end;
  510. procedure DisplayPriceMargin;
  511. var
  512. vPM_Node: TsdIDTreeNode;
  513. begin
  514. vPM_Node := FProjectData.BillsCompileData.BillsCompileTree.FindNode(iPriceMarginID);
  515. if not Assigned(vPM_Node) then
  516. begin
  517. ErrorMessage('台账中无预定义价差节点,不可使用价差功能。');
  518. dxsbViewControl.SelectedItem := dxsbViewControl.ActiveGroup.Items[jpsMain.ActivePageIndex];
  519. Abort;
  520. end
  521. else if ProjectData.ProjProperties.PhaseCount = 0 then
  522. begin
  523. TipMessage('未计量前不可进行材料调差。');
  524. dxsbViewControl.SelectedItem := dxsbViewControl.ActiveGroup.Items[jpsMain.ActivePageIndex];
  525. Abort;
  526. end;
  527. ChangeView;
  528. end;
  529. var
  530. bCloseCompare: Boolean;
  531. begin
  532. if Item.Tag = jpsMain.ActivePageIndex then Exit;
  533. bCloseCompare := (Item.Tag in [0..3]) and (jpsMain.ActivePageIndex = 4);
  534. case Item.Tag of
  535. 0..2: ChangeView;
  536. 3: DisplayPriceMargin;
  537. 4: DisplayCompare;
  538. 5: DisplayReports;
  539. end;
  540. if bCloseCompare then
  541. CloseCompare;
  542. end;
  543. procedure TProjectFrame.CreateBillsFrame;
  544. begin
  545. FBillsCompileFrame := TBillsCompileFrame.Create(Self, FProjectData.BillsCompileData);
  546. FBillsCompileFrame.ShowDesignQuantity := FProjectData.ProjProperties.ShowDesignQuantity;
  547. FBillsCompileFrame.ShowAlias := FProjectData.ProjProperties.ShowAlias;
  548. FBillsCompileFrame.OnAfterSetBookmark := ExpandBookmarkFrame;
  549. AlignControl(FBillsCompileFrame, jpsMainBillsCompile, alClient);
  550. UpdateSysProgress(65, '正在解析数据');
  551. FBillsMeasureFrame := TBillsMeasureFrame.Create(Self, FProjectData.BillsMeasureData);
  552. FBillsMeasureFrame.OnAfterSetBookmark := ExpandBookmarkFrame;
  553. FBillsMeasureFrame.ShowPriceChange := FProjectData.ProjProperties.ShowPriceChange;
  554. FBillsMeasureFrame.ShowBGLCode := FProjectData.ProjProperties.ShowBGLCode;
  555. FBillsMeasureFrame.ShowDesignQuantity := FProjectData.ProjProperties.ShowDesignQuantity;
  556. FBillsMeasureFrame.ShowAlias := FProjectData.ProjProperties.ShowAlias;
  557. AlignControl(FBillsMeasureFrame, jpsMainBillsMeasure, alClient);
  558. end;
  559. procedure TProjectFrame.CreateDealPaymentFrame;
  560. begin
  561. FDealPaymentFrame := TDealPaymentFrame.Create(Self, FProjectData.DealPaymentData);
  562. AlignControl(FDealPaymentFrame, jpsAssistantDealPayment, alClient);
  563. end;
  564. procedure TProjectFrame.CreateBillsGatherFrame;
  565. begin
  566. FBillsGatherFrame := TBillsGatherFrame.Create(Self, FProjectData.BillsGatherData);
  567. AlignControl(FBillsGatherFrame, jpsMainBillsGather, alClient);
  568. FBillsGatherFrame.ShowPriceChange := FProjectData.ProjProperties.ShowPriceChange;
  569. FBillsGatherFrame.ShowPhaseData := FProjectData.ProjProperties.PhaseCount > 0;
  570. end;
  571. procedure TProjectFrame.dxpmExpandBillsPopup(Sender: TObject);
  572. begin
  573. dxpmExpandBills.ItemLinks.Items[8].Visible := G_IsTest;
  574. dxpmExpandBills.ItemLinks.Items[7].Visible := jpsMain.ActivePageIndex in [0, 1, 4];
  575. dxpmExpandBills.ItemLinks.Items[6].Visible := jpsMain.ActivePageIndex in [1, 4];
  576. SetDxBtnAction(actnFirstLevel, MainForm.dxbtnFirstLevel);
  577. SetDxBtnAction(actnSecondLevel, MainForm.dxbtnSecondLevel);
  578. SetDxBtnAction(actnThirdLevel, MainForm.dxbtnThirdLevel);
  579. SetDxBtnAction(actnFourthLevel, MainForm.dxbtnFourthLevel);
  580. SetDxBtnAction(actnFifthLevel, MainForm.dxbtnFifthLevel);
  581. SetDxBtnAction(actnAllLevel, MainForm.dxbtnAllLevel);
  582. SetDxBtnAction(actnCurPhase, MainForm.dxbtnCurPhase);
  583. SetDxBtnAction(actnAllXmj, MainForm.dxbtnAllXmj);
  584. SetDxBtnAction(actnAllPeg, MainForm.dxbtnAllPeg);
  585. end;
  586. procedure TProjectFrame.actnFirstLevelExecute(Sender: TObject);
  587. begin
  588. ExpandNodeTo(TAction(Sender).Tag);
  589. end;
  590. procedure TProjectFrame.tbExpandClick(Sender: TObject);
  591. var
  592. P: TPoint;
  593. begin
  594. P := pnlToolBar.ClientToScreen(Point(tbExpand.Left, tbExpand.Top + tbExpand.Height));
  595. dxpmExpandBills.Popup(P.X, P.Y);
  596. end;
  597. procedure TProjectFrame.actnAllXmjExecute(Sender: TObject);
  598. begin
  599. ExpandAllXmj;
  600. end;
  601. procedure TProjectFrame.ExpandNodeTo(ALevel: Integer);
  602. begin
  603. Screen.Cursor := crHourGlass;
  604. case ALevel of
  605. 0..4: UpdateSysProgress(0, Format('正在显示至第%d层', [ALevel + 1]));
  606. else UpdateSysProgress(0, '正在显示至最底层');
  607. end;
  608. try
  609. case jpsMain.ActivePageIndex of
  610. 0: FBillsCompileFrame.ExpandNodeTo(ALevel);
  611. 1: FBillsMeasureFrame.ExpandNodeTo(ALevel);
  612. 4: FPhaseCompareFrame.ExpandNodeTo(ALevel);
  613. end;
  614. finally
  615. UpdateSysProgress(0, '就绪');
  616. Screen.Cursor := crDefault;
  617. end;
  618. end;
  619. procedure TProjectFrame.ExpandAllXmj;
  620. begin
  621. Screen.Cursor := crHourGlass;
  622. UpdateSysProgress(0, '正在显示至项目节');
  623. try
  624. case jpsMain.ActivePageIndex of
  625. 0: FBillsCompileFrame.ExpandXmjNode;
  626. 1: FBillsMeasureFrame.ExpandXmjNode;
  627. 4: FPhaseCompareFrame.ExpandXmjNode;
  628. end;
  629. finally
  630. UpdateSysProgress(0, '就绪');
  631. Screen.Cursor := crDefault;
  632. end;
  633. end;
  634. procedure TProjectFrame.UnLockData;
  635. procedure DoUnLockData;
  636. begin
  637. FProjectData.CanUnlockInfo := True;
  638. FBillsCompileFrame.stdBillsCompile.Column('LockedInfo').ReadOnly := False;
  639. //FProjectData.BillsData.UnLockedBaseData;
  640. end;
  641. begin
  642. if FProjectData.CheckPassword then
  643. DoUnLockData;
  644. end;
  645. procedure TProjectFrame.CreateCheckerFrame;
  646. begin
  647. FCheckerFrame := TCheckerFrame.Create(Self);
  648. FCheckerFrame.Owner := Self;
  649. FCheckerFrame.ProjectData := FProjectData;
  650. AlignControl(FCheckerFrame, jpsAssistantChecker, alClient);
  651. FCheckerFrame.Init;
  652. end;
  653. procedure TProjectFrame.btnSubmitClick(Sender: TObject);
  654. begin
  655. if not CheckCanReport then Exit;
  656. Screen.Cursor := crHourGlass;
  657. try
  658. UpToWeb(True);
  659. finally
  660. Screen.Cursor := crDefault;
  661. end;
  662. end;
  663. procedure TProjectFrame.btnPassClick(Sender: TObject);
  664. begin
  665. btnSubmitClick(Sender);
  666. end;
  667. function TProjectFrame.IsUped: Boolean; // 是否上传过
  668. begin
  669. Result := False;
  670. // 只有0号台帐那肯定没上传过
  671. if ProjectData.PhaseIndex = 0 then Exit;
  672. // 当前显示的期小于最新期(当前期是旧期),则当前期肯定已经上传过了
  673. if ProjectData.PhaseIndex < ProjectData.ProjProperties.PhaseCount then
  674. begin
  675. Result := True;
  676. end
  677. // 当前显示的期是最新期,分两种情况判断,如果第一审核人已有状态,则上传过了
  678. else if ProjectData.PhaseIndex = ProjectData.ProjProperties.PhaseCount then
  679. begin
  680. // 当用户点击新增一期计量后,会调用该方法,此时,有一期数据,却为上传过
  681. if not Assigned(CheckerFrame) then
  682. Result := False
  683. else if not CheckerFrame.HasChecker then
  684. Result := False
  685. else if CheckerFrame.FirstChecker.CheckStatus = csNotBegin then
  686. Result := False
  687. else
  688. Result := True;
  689. end;
  690. end;
  691. procedure TProjectFrame.ButtonControl_UpToWeb;
  692. begin
  693. if ProjectData.CurUserIsAuthor then
  694. begin
  695. btnSubmit.Visible := True;
  696. // 有计量(非0号台账状态),且当前计量期尚未上报过
  697. btnSubmit.Enabled := (ProjectData.PhaseIndex > 0) and (not IsUped);
  698. btnPass.Visible := False;
  699. btnNotPass.Visible := btnPass.Visible;
  700. btnSubmit.Left := jcbAudit.Left + jcbAudit.Width + 5;
  701. end
  702. else if ProjectData.CurUserIsOwner or ProjectData.CurUserIsChecker then
  703. begin
  704. btnSubmit.Visible := False;
  705. btnPass.Visible := True;
  706. btnNotPass.Visible := btnPass.Visible;
  707. // 在本期我是审核人,切换到历史期有可能我没参与。 所以当CheckerFrame.Me为空时,有可能我是编制人,有可能历史期我没参与。
  708. // 历史期,管你那么多,直接按钮不见。
  709. if ProjectData.PhaseIndex < ProjectData.ProjProperties.PhaseCount then
  710. btnPass.Enabled := False
  711. else
  712. btnPass.Enabled := CheckerFrame.Me.IsChecking;
  713. btnNotPass.Enabled := btnPass.Enabled;
  714. btnPass.Left := jcbAudit.Left + jcbAudit.Width + 5;
  715. btnNotPass.Left := btnPass.Left + btnPass.Width + 1;
  716. end;
  717. ShowPhaseHint;
  718. if Assigned(FCheckerFrame) then
  719. FCheckerFrame.RepairDelete(btnSubmit.Visible and btnSubmit.Enabled);
  720. end;
  721. procedure TProjectFrame.UpToWeb(ACheckPassed: Boolean);
  722. var sURL, sAppFile, sJsonFile_Bills, sJsonFile_Common, sAppFile_UnLock,
  723. sZipFile, sResult, sMD5_JL, sPassedHint1, sPassedHint2,
  724. sNoPassedHint1, sNoPassedHint2, sCheckerMemo: string;
  725. vA, vArr: array of string;
  726. vRec: TsdDataRecord;
  727. bSubmit: Boolean;
  728. vExportor: TTenderExport;
  729. vCF: TCheckerMemoForm;
  730. bNeedFreeEarlier: Boolean;
  731. iFile: Integer;
  732. begin
  733. bSubmit := False;
  734. bNeedFreeEarlier := False;
  735. sAppFile := PHPWeb.UserPath + 'ProjectFile.rmf';
  736. // 只有编制人才真正需要该文件存在
  737. sAppFile_UnLock := PHPWeb.UserPath + 'ProjectFile_UnLock';
  738. sPassedHint1 :=
  739. '【审批通过】后,计量数据将自动交付给下一审批人进行审批,操作后将不可更改,是否通过审批?';
  740. sPassedHint2 :=
  741. '(终审)审批通过后本期计量审批将标记为审批完成,操作后将不可更改,是否通过审批?';
  742. sNoPassedHint1 :=
  743. '【审批不通过】后,本次审批将结束,后续的审批人也将不会审批本次计量,' +
  744. '本期数据也将直接打回给上报人进行重新计量报审。' + #10#13 +
  745. '点击【确定】进入操作确认。';
  746. sNoPassedHint2 := PHPWeb.RealName +
  747. ',请确认本期计量审批不通过。' + #10#13 + '点击【确定】本期计量审批' +
  748. '不通过,计量将不可再更改。';
  749. vCF := TCheckerMemoForm.Create(nil);
  750. try
  751. if ProjectData.CurUserIsAuthor then
  752. begin
  753. bSubmit := True;
  754. if not CheckerFrame.HasNormalChecker then
  755. begin
  756. Application.MessageBox('上报审批前请先配置审核人!', '提示', MB_OK + MB_ICONWARNING);
  757. tobtnShowChecker.Down := True;
  758. tobtnShowChecker.Click;
  759. Exit;
  760. end;
  761. // 保存一次缓存数据,以保证提示信息能读取正确的值
  762. ProjectData.SaveLastestPhaseMainData;
  763. if Application.MessageBox(PChar(CheckersHint), '询问', MB_YESNO + MB_ICONQUESTION) = ID_No then
  764. Exit;
  765. ProgressProCreate(100, '本地数据文件上传到云端');
  766. ProjectData.Save;
  767. ProgressProRun('保存本地数据。OK');
  768. // 生成无锁文件
  769. vRec := MainForm.ProjectManagerFrame.Rec(ProjectData.ProjectID);
  770. vExportor := TTenderExport.Create(vRec, sAppFile_UnLock);
  771. try
  772. vExportor.Execute;
  773. finally
  774. vExportor.Free;
  775. end;
  776. ProgressProRun('生成无锁文件。OK');
  777. ProgressProRun('生成检验文件...', 0);
  778. if not ProjectData.SubmitProject(sAppFile) then
  779. if not ProjectData.SubmitProject(sAppFile) then
  780. begin
  781. bNeedFreeEarlier := True;
  782. WarningMessage('Sorry!待审核文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
  783. Exit;
  784. end;
  785. ProgressProRun('生成检验文件。OK', 10, pmtEdit);
  786. end
  787. else if ProjectData.CurUserIsChecker then
  788. begin
  789. if ACheckPassed then
  790. begin
  791. vCF.Init(sPassedHint1, 1);
  792. if vCF.ShowModal = mrCancel then
  793. Exit
  794. else
  795. sCheckerMemo := vCF.Memo;
  796. end
  797. else
  798. begin
  799. vCF.Init(sNoPassedHint1, 0);
  800. if vCF.ShowModal = mrCancel then
  801. Exit
  802. else
  803. sCheckerMemo := vCF.Memo;
  804. if Application.MessageBox(PChar(sNoPassedHint2), '询问', MB_OKCANCEL + MB_ICONQUESTION) = ID_CANCEL then
  805. Exit;
  806. end;
  807. ProgressProCreate(100, '本地数据文件上传到云端');
  808. ProjectData.Save;
  809. ProgressProRun('保存本地数据。OK');
  810. ProgressProRun('生成检验文件...', 0);
  811. if not ProjectData.SubmitProject(sAppFile) then
  812. if not ProjectData.SubmitProject(sAppFile) then
  813. begin
  814. bNeedFreeEarlier := True;
  815. WarningMessage('Sorry!待审核文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
  816. Exit;
  817. end;
  818. ProgressProRun('生成检验文件。OK', 10, pmtEdit);
  819. end
  820. else if ProjectData.CurUserIsOwner then
  821. begin
  822. if ACheckPassed then
  823. begin
  824. vCF.Init(sPassedHint2, 1);
  825. if vCF.ShowModal = mrCancel then
  826. Exit
  827. else
  828. sCheckerMemo := vCF.Memo;
  829. end
  830. else
  831. begin
  832. vCF.Init(sNoPassedHint1, 0);
  833. if vCF.ShowModal = mrCancel then
  834. Exit
  835. else
  836. sCheckerMemo := vCF.Memo;
  837. if not QuestMessage(sNoPassedHint2) then
  838. Exit;
  839. end;
  840. ProgressProCreate(100, '本地数据文件上传到云端');
  841. ProgressProRun('保存本地数据...', 0);
  842. ProjectData.Save;
  843. ProgressProRun('保存本地数据。OK', 10, pmtEdit);
  844. ProgressProRun('生成检验文件...', 0);
  845. if not ProjectData.ReplyProject(sAppFile) then
  846. if not ProjectData.ReplyProject(sAppFile) then
  847. begin
  848. bNeedFreeEarlier := True;
  849. WarningMessage('Sorry!批复文件连续2次生成失败!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
  850. Exit;
  851. end;
  852. ProgressProRun('生成检验文件。OK', 10, pmtEdit);
  853. end;
  854. finally
  855. vCF.Free;
  856. if bNeedFreeEarlier then
  857. ProgressProFree;
  858. end;
  859. try
  860. ProgressProRun('生成汇总数据...', 0);
  861. sJsonFile_Bills := ExtractFilePath(sAppFile) + 'JsonFile_Bills.json';
  862. sJsonFile_Common := ExtractFilePath(sAppFile) + 'JsonFile_Common.json';
  863. sMD5_JL := MD5_File(sAppFile);
  864. // 上传清单,每期都传,可覆盖旧的。
  865. ProjectData.ExportJson_Bills(sJsonFile_Bills);
  866. ProjectData.ExportJson_Common(sJsonFile_Common);
  867. ProgressProRun('生成汇总数据。OK', 10, pmtEdit);
  868. ProgressProRun('校验数据包...', 0);
  869. if FileExists(sAppFile_UnLock) then // 要在压缩前判断,压缩完会删除
  870. iFile := 4
  871. else
  872. iFile := 3;
  873. sZipFile := PHPWeb.zip([sAppFile, sJsonFile_Bills, sJsonFile_Common, sAppFile_UnLock]);
  874. if not PHPWeb.CheckZip(sZipFile, iFile) then
  875. begin
  876. WarningMessage('up数据包文件无法通过检验请重试!如果重试后仍不能解决该问题,请联系纵横客服。', ProgressProHandle);
  877. Exit;
  878. end;
  879. ProgressProRun('校验数据包。OK', 10, pmtEdit);
  880. try
  881. ProgressProRun('上传数据包到云端...(温馨提示:请不要乱点哦,Windows容易死机)', 0);
  882. if PHPWeb.UpDataFile(PHPWeb.UserID, ProjectData.WebID, ProjectData.PhaseIndex,
  883. sZipFile, sMD5_JL, bSubmit, sResult, ACheckPassed, sCheckerMemo) then
  884. begin
  885. DeleteFile(sAppFile);
  886. ProgressProRun('上传数据包到云端。OK', 100, pmtEdit, pptSet);
  887. if ProjectData.CurUserIsChecker then
  888. ProjectData.Checkers.FindByID(PHPWeb.UserID).Memo := sCheckerMemo;
  889. if ProjectData.PhaseIndex = 0 then // 0号台账,现已废弃
  890. begin
  891. MainForm.ProjectManagerFrame.ShowProjWebInfoTop(0);
  892. end
  893. else
  894. Begin
  895. vRec := MainForm.ProjectManagerFrame.Rec(ProjectData.ProjectID);
  896. vRec.BeginUpdate;
  897. vRec.ValueByName('WebMD5').AsString := sMD5_JL;
  898. vRec.EndUpdate;
  899. MainForm.ProjectManagerFrame.ShowProjWebInfoTop;
  900. if ProjectData.CurUserIsAuthor then
  901. begin
  902. CheckerFrame.FirstChecker.CheckStatus := csChecking;
  903. CheckerFrame.AddFrame.Visible := False;
  904. end
  905. else if ProjectData.CurUserIsChecker then
  906. begin
  907. if ACheckPassed then
  908. begin
  909. CheckerFrame.Me.CheckStatus := csFinished;
  910. CheckerFrame.NextChecker.CheckStatus := csChecking;
  911. end
  912. else
  913. CheckerFrame.Me.CheckStatus := csNotPass;
  914. CheckerFrame.Me.CheckerMemo := sCheckerMemo;
  915. end
  916. else if ProjectData.CurUserIsOwner then
  917. begin
  918. if ACheckPassed then
  919. CheckerFrame.Me.CheckStatus := csFinished
  920. else
  921. CheckerFrame.Me.CheckStatus := csNotPass;
  922. end;
  923. end;
  924. btnSubmit.Enabled := False;
  925. FCheckerFrame.RepairDelete(False);
  926. btnPass.Enabled := False;
  927. btnNotPass.Enabled := btnPass.Enabled;
  928. ShowPhaseHint;
  929. TipMessage('^_^ 恭喜!数据已成功上传到云端服务器。', ProgressProHandle);
  930. end
  931. else
  932. WarningMessage(PChar('数据上传失败请重试!服务器故障:' + sResult), ProgressProHandle);
  933. except
  934. WarningMessage(PChar('数据上传失败请重试!网络较差,数据文件无法送达云端:' + sResult), ProgressProHandle);
  935. end;
  936. finally
  937. ProgressProFree;
  938. end;
  939. end;
  940. procedure TProjectFrame.btnNotPassClick(Sender: TObject);
  941. begin
  942. Screen.Cursor := crHourGlass;
  943. try
  944. UpToWeb(False);
  945. finally
  946. Screen.Cursor := crDefault;
  947. end;
  948. end;
  949. function TProjectFrame.CheckersHint: string;
  950. var vSL: TStringList;
  951. i: Integer;
  952. sChecker, sChar: string;
  953. Rec: TsdDataRecord;
  954. begin
  955. vSL := TStringList.Create;
  956. try
  957. CheckerFrame.CheckerNameList(vSL);
  958. for i := 0 to vSL.Count - 1 do
  959. begin
  960. if i = 0 then
  961. sChar := ''
  962. else
  963. sChar := ' > ';
  964. sChecker := sChecker + sChar + vSL[i];
  965. end;
  966. while Length(sChecker) < 38 do // 保证提示框的大小达到最佳效果
  967. sChecker := sChecker + ' ';
  968. Rec := ProjectData.MainListData.GetPhaseMainRecord(FProjectData.PhaseIndex);
  969. Result := Format('本期计量:%m元。%s审批流程:%s%s上报后将不可更改,确定要上报吗?',
  970. [Rec.ValueByName('GatherTotalPrice').AsFloat, #10#13#10#13, sChecker, #10#13#10#13]);
  971. finally
  972. vSL.Free;
  973. end;
  974. end;
  975. procedure TProjectFrame.btnNewPhaseClick(Sender: TObject);
  976. begin
  977. dxsbViewControl.SelectedItem := dxsbViewControl.Groups[0].Items[1];
  978. dxsbViewControl.OnItemClick(Sender, dxsbViewControl.Groups[0].Items[1]);
  979. CreateNewPhase;
  980. end;
  981. procedure TProjectFrame.ButtonControl_NewPhase;
  982. var b1, b2, b3: Boolean;
  983. begin
  984. // “新建一期计量”按钮的显示隐藏
  985. // 计量界面,且是原报才显示
  986. b1 := (dxsbViewControl.SelectedItem.Index = 0) and ProjectData.CurUserIsAuthor;
  987. // ①尚无审核人列表 ②当前期已审核完成
  988. b2 := (not Assigned(CheckerFrame)) or (Assigned(CheckerFrame) and CheckerFrame.OwnerFrame.IsFinished);
  989. // 当前查看的是最新期。查看历史期不显示。
  990. b3 := (FProjectData.ProjProperties.PhaseCount = FProjectData.PhaseIndex);
  991. pnlNewPhase.Visible := b1 and b2 and b3;
  992. end;
  993. procedure TProjectFrame.actnCurPhaseExecute(Sender: TObject);
  994. begin
  995. ExpandCurPhase;
  996. end;
  997. procedure TProjectFrame.RepairAudits;
  998. var i, iSel: Integer;
  999. UserArr: array of string;
  1000. sURL: string;
  1001. begin
  1002. jcbAudit.ItemHeight := 20;
  1003. jcbAudit.Font.Name := '微软雅黑';
  1004. jcbAudit.Font.Size := 10;
  1005. jcbAudit.DropDownBox.Height := jcbAudit.Items.Count * jcbAudit.ItemHeight + 35;
  1006. iSel := jcbAudit.ItemIndex;
  1007. for i := 0 to jcbAudit.Items.Count - 1 do
  1008. begin
  1009. if i = 0 then
  1010. begin
  1011. // 原报:编制人。没有跟审核人一个表,另外查询。个人觉得这里设计得不好。
  1012. // 打开软件时自动扫描,杰哥那头返回不了编制人的项目,也是这个原因。
  1013. // 说服不了特工,先这样吧。
  1014. sURL := Format('%suser/get/%d/info', [PHPWeb.MeasureURL, FProjectData.WebAuthorID]);
  1015. UserArr := VarArrayOf(['avatar', 'name', 'jobs', 'company']);
  1016. if PHPWeb.Search(sURL, [], [], UserArr) = 1 then
  1017. jcbAudit.Items[i] := jcbAudit.Items[i] + ' ' + UserArr[1] + '-' + UserArr[2];
  1018. end
  1019. else
  1020. begin
  1021. // 某种漏洞的操作下,文件中记载的审核人数和审核人列表中的审核人数不一致,
  1022. // 匹配时会溢出。这里要加判断。
  1023. if i > CheckerFrame.List.Count then Break;
  1024. if TOrderCheckerFrame(CheckerFrame.List[i - 1]) = FCheckerFrame.OwnerFrame then
  1025. begin
  1026. jcbAudit.Items[i] := ' 终审 ' +
  1027. TOrderCheckerFrame(CheckerFrame.List[i - 1]).UserName + '-' +
  1028. TOrderCheckerFrame(CheckerFrame.List[i - 1]).UserRole
  1029. end
  1030. else
  1031. begin
  1032. jcbAudit.Items[i] := jcbAudit.Items[i] + ' ' +
  1033. TOrderCheckerFrame(CheckerFrame.List[i - 1]).UserName + '-' +
  1034. TOrderCheckerFrame(CheckerFrame.List[i - 1]).UserRole;
  1035. end;
  1036. end;
  1037. end;
  1038. jcbAudit.ItemIndex := iSel;
  1039. end;
  1040. procedure TProjectFrame.CreateFrames;
  1041. begin
  1042. UpdateSysProgress(10, '正在解析数据');
  1043. CreateBillsFrame;
  1044. UpdateSysProgress(130, '正在解析数据');
  1045. CreateDealPaymentFrame;
  1046. UpdateSysProgress(140, '正在解析数据');
  1047. CreateBillsGatherFrame;
  1048. UpdateSysProgress(150, '正在解析数据');
  1049. CreatePriceMarginFrame;
  1050. FZJJLFrame := TZJJLFrame.Create(Self, FProjectData.PhaseData.ZJJLData);
  1051. FZJJLFrame.DataReadOnly := FProjectData.PhaseData.StageDataReadOnly;
  1052. AlignControl(FZJJLFrame, jpsAssistantZJJL, alClient);
  1053. UpdateSysProgress(160, '正在解析数据');
  1054. FBGLFrame := TBGLFrame.Create(Self, FProjectData.BGLData);
  1055. AlignControl(FBGLFrame, jpsAssistantBGL, alClient);
  1056. UpdateSysProgress(170, '正在解析数据');
  1057. FSearchFrame := TSearchFrame.Create(Self, FProjectData.SearchData);
  1058. AlignControl(FSearchFrame, jpsAssistantSearch, alClient);
  1059. UpdateSysProgress(180, '正在解析数据');
  1060. FBookmarkFrame := TBookmarkFrame.Create(Self, FProjectData);
  1061. AlignControl(FBookmarkFrame, jpsAssistantBookmark, alClient);
  1062. UpdateSysProgress(190, '正在解析数据');
  1063. FDealBillsFrame := TDealBillsFrame.Create(Self, FProjectData.DealBillsData);
  1064. AlignControl(FDealBillsFrame, jpsAssistantDealBills, alClient);
  1065. UpdateSysProgress(200, '就绪');
  1066. end;
  1067. procedure TProjectFrame.InitialForVersions;
  1068. begin
  1069. if _ModuleType = mtCompile then
  1070. begin
  1071. // 去掉审核比较
  1072. dxsbViewControl.Groups.Items[0].Items.Delete(3);
  1073. // 去掉计量台账
  1074. dxsbViewControl.Groups.Items[0].Items.Delete(1);
  1075. end;
  1076. end;
  1077. procedure TProjectFrame.ExpandBookmarkFrame(AExpandFrame: Boolean);
  1078. begin
  1079. // 展开书签
  1080. if AExpandFrame then
  1081. begin
  1082. jpsAssistant.ActivePageIndex := tobtnBookmark.Tag;
  1083. sbtnExpend.Tag := tobtnBookmark.Tag;
  1084. ControlAssistantButtonsDown(tobtnBookmark.Tag);
  1085. jpsMain.ActivePage.Tag := tobtnBookmark.Tag;
  1086. SetAssistantViewVisible(True);
  1087. SetImageOfsbtnExpend(True);
  1088. end;
  1089. // 刷新书签批注
  1090. FBookmarkFrame.RefreshMarkMemo;
  1091. end;
  1092. {
  1093. 在意外情况下,文件中记录的审核人与云端记录的审核人不一致,文件中的审核表有时
  1094. 被多创建,有时少创建。这时不允许继续操作,需强制关闭:
  1095. 1、如果第x个人为审核中,则:
  1096. ①当前登录用户,如果非工作中,无论编制人、审核人还是业主,审核表个数应为x。
  1097. ②当前登录用户,如果工作中,必是审核人或业主,审核表个数应为x + 1。
  1098. 2、如果找不到审核中,找到了第x个人为审核不通过,则:
  1099. ①当前登录用户为编制人:
  1100. a.重新开始:审核表个数应为1。
  1101. b.仅查看不通过项目:审核表个数应为x + 1。
  1102. ②当前登录用户为审核人或业主:一定是非工作中(编制人工作中),审核表个数应为x + 1。
  1103. 3、如果找不到审核中,也找不到审核不通过,如果最后一个人是审核完成,则:
  1104. ①当前登录用户为编制人,此时编制人尚末开始新的一期,下拉还是上一期的,审核表个数亦为x+1。
  1105. ②当前登录用户为审核人或业主,审核表个数为x+1。
  1106. 4、如果找不到审核中,也找不到审核不通过,如果第一个人是末审核,则:
  1107. ①当前登录用户为编制人,审核表个数应为1。 }
  1108. function TProjectFrame.CheckFileAndCloudChekerList: Boolean;
  1109. var iNo, iC: Integer;
  1110. begin
  1111. Result := False;
  1112. iC := jcbAudit.Items.Count;
  1113. if not Assigned(FCheckerFrame) then // 0号台帐阶段还没有审核人业务
  1114. begin
  1115. Result := True;
  1116. Exit;
  1117. end;
  1118. iNo := FCheckerFrame.CheckNo(csChecking);
  1119. if iNo <> -1 then // 审核中
  1120. begin
  1121. // FCheckerFrame.Me = nil :编制 (这里体现出编制人不在审核人列表中极不合理!)
  1122. if (FCheckerFrame.Me <> nil) and FCheckerFrame.Me.IsChecking then
  1123. Result := (iC = iNo + 1)
  1124. else
  1125. Result := (iC = iNo);
  1126. end
  1127. else // 三种情况:①原报阶段,一个状态都没有 ②审核完成 ③审核不通过
  1128. begin
  1129. iNo := FCheckerFrame.CheckNo(csNotPass);
  1130. if iNo <> -1 then // 情况③,审核不通过
  1131. begin
  1132. if ProjectData.CurUserIsAuthor then
  1133. Result := ((iC = 1) or (iC = iNo + 1))
  1134. else if FCheckerFrame.InCheckerList(PHPWeb.UserID) then
  1135. Result := (iC = iNo + 1);
  1136. end
  1137. else
  1138. begin
  1139. // 情况②,审核完成
  1140. if FCheckerFrame.LastChecker.CheckStatus = csFinished then // 最后一个人是审核完成
  1141. Result := (iC = FCheckerFrame.List.Count + 1)
  1142. else
  1143. // 情况①,原报阶段,一个状态都没有
  1144. begin
  1145. if ProjectData.CurUserIsAuthor then // 如果是原报,则只有一张表
  1146. Result := (iC = 1)
  1147. else
  1148. // 其它人时,原报尚末上传,表的数量是上一期的。
  1149. // 如果是打回,上一期的数量也是不固定的(中途打回)。反正这里只看不改,不限制。
  1150. Result := True;
  1151. end;
  1152. end;
  1153. end;
  1154. end;
  1155. procedure TProjectFrame.tobtnUpFileClick(Sender: TObject);
  1156. begin
  1157. with TToolButton(Sender) do
  1158. begin
  1159. if Down then
  1160. begin
  1161. jpsAssistant.ActivePageIndex := Tag;
  1162. sbtnExpend.Tag := Tag;
  1163. ControlAssistantButtonsDown(Tag);
  1164. jpsMain.ActivePage.Tag := Tag;
  1165. end;
  1166. SetAssistantViewVisible(Down);
  1167. SetImageOfsbtnExpend(Down);
  1168. end;
  1169. CheckUpFile;
  1170. end;
  1171. procedure TProjectFrame.CreateUpFile;
  1172. begin
  1173. FUpFileManageView := TUpFileManageView.Create(nil);
  1174. FUpFileManageView.Owner := Self;
  1175. FUpFileManageView.ProjectData := FProjectData;
  1176. FUpFileManageView.Datas := FProjectData.AttachmentData;
  1177. FUpFileManageView.Parent := jpsAssistantUpFile;
  1178. FUpFileManageView.Align := alClient;
  1179. end;
  1180. procedure TProjectFrame.SetUpFileManageView(
  1181. const Value: TUpFileManageView);
  1182. begin
  1183. FUpFileManageView := Value;
  1184. end;
  1185. procedure TProjectFrame.jpsAssistantActivePageChanged(Sender: TObject);
  1186. begin
  1187. if G_IsCloud then
  1188. CheckUpFile;
  1189. end;
  1190. procedure TProjectFrame.CheckUpFile;
  1191. var vRec: TsdDataRecord;
  1192. begin
  1193. if jpsAssistant.Visible and (jpsAssistant.ActivePage = jpsAssistantUpFile) then
  1194. begin
  1195. if jpsMain.ActivePage = jpsMainBillsCompile then
  1196. begin
  1197. vRec := FBillsCompileFrame.BillsCompileData.sdvBillsCompile.Current;
  1198. if vRec = nil then
  1199. vRec := FBillsCompileFrame.stdBillsCompile.IDTree.Items[0].Rec;
  1200. end
  1201. else if jpsMain.ActivePage = jpsMainBillsMeasure then
  1202. begin
  1203. vRec := FBillsMeasureFrame.BillsMeasureData.sdvBillsMeasure.Current;
  1204. if vRec = nil then
  1205. vRec := FBillsMeasureFrame.stdBillsMeasure.IDTree.Items[0].Rec;
  1206. end;
  1207. FUpFileManageView.DoOnBillChange(vRec);
  1208. end;
  1209. end;
  1210. procedure TProjectFrame.SaveLog(AStr: string);
  1211. var
  1212. sFileName: string;
  1213. F: TextFile;
  1214. begin
  1215. sFileName := GetAppFilePath + 'TimeLog.txt';
  1216. AssignFile(F, sFileName);
  1217. if FileExists(sFileName) then
  1218. Append(F)
  1219. else
  1220. Rewrite(F);
  1221. Writeln(F, AStr);
  1222. CloseFile(F);
  1223. end;
  1224. procedure TProjectFrame.ReLockData;
  1225. begin
  1226. FProjectData.CanUnlockInfo := False;
  1227. FBillsCompileFrame.stdBillsCompile.Column('LockedInfo').ReadOnly := True;
  1228. end;
  1229. procedure TProjectFrame.CloseCompare;
  1230. begin
  1231. FPhaseCompareFrame.Free;
  1232. FProjectData.PhaseCompareData.Close;
  1233. FProjectData.PhaseData.StageCompareData.Close;
  1234. end;
  1235. procedure TProjectFrame.OpenCompare;
  1236. begin
  1237. FProjectData.PhaseData.Save;
  1238. FProjectData.PhaseData.StageCompareData.Open;
  1239. FProjectData.PhaseCompareData.Open;
  1240. FPhaseCompareFrame := TPhaseCompareFrame.Create(Self, FProjectData.PhaseCompareData);
  1241. AlignControl(FPhaseCompareFrame, jpsMainStageCompare, alClient);
  1242. end;
  1243. procedure TProjectFrame.RefreshColumnDisplay;
  1244. begin
  1245. BillsCompileFrame.ShowDesignQuantity := FProjectData.ProjProperties.ShowDesignQuantity;
  1246. BillsCompileFrame.ShowAlias := FProjectData.ProjProperties.ShowAlias;
  1247. BillsMeasureFrame.ShowPriceChange := FProjectData.ProjProperties.ShowPriceChange;
  1248. BillsMeasureFrame.ShowBGLCode := FProjectData.ProjProperties.ShowBGLCode;
  1249. BillsMeasureFrame.ShowDesignQuantity := FProjectData.ProjProperties.ShowDesignQuantity;
  1250. BillsMeasureFrame.ShowAlias := FProjectData.ProjProperties.ShowAlias;
  1251. BillsGatherFrame.ShowPriceChange := FProjectData.ProjProperties.ShowPriceChange;
  1252. end;
  1253. procedure TProjectFrame.RefreshProjectState;
  1254. begin
  1255. FBillsCompileFrame.RefreshPhase_Stage;
  1256. FBillsMeasureFrame.RefreshPhase_Stage;
  1257. FDealPaymentFrame.RefreshPhase_Stage;
  1258. FPriceMarginFrame.ResetViewControl;
  1259. end;
  1260. procedure TProjectFrame.ExpandCurPhase;
  1261. begin
  1262. Screen.Cursor := crHourGlass;
  1263. UpdateSysProgress(0, '正在显示至本期');
  1264. try
  1265. case jpsMain.ActivePageIndex of
  1266. 1: FBillsMeasureFrame.ExpandCurPhase;
  1267. 4: FPhaseCompareFrame.ExpandCurPhase;
  1268. end;
  1269. finally
  1270. UpdateSysProgress(0, '就绪');
  1271. Screen.Cursor := crDefault;
  1272. end;
  1273. end;
  1274. function TProjectFrame.CheckCanReport: Boolean;
  1275. begin
  1276. Result := QuestMessageYesNo('请确定已生成中间计量数据?');
  1277. // 使用控件点击进行定位,重新定义方法太复杂
  1278. if not Result then
  1279. begin
  1280. // 先定位至计量台账界面
  1281. dxsbViewControl.SelectedItem := dxsbViewControl.ActiveGroup.Items[1];
  1282. dxsbViewControlItemClick(dxsbViewControl, dxsbViewControl.ActiveGroup.Items[1]);
  1283. // 再定位至中间计量界面
  1284. tobtnZJJL.Down := True;
  1285. tobtnZJJL.Click;
  1286. end;
  1287. end;
  1288. procedure TProjectFrame.actnAllPegExecute(Sender: TObject);
  1289. begin
  1290. Screen.Cursor := crHourGlass;
  1291. UpdateSysProgress(0, '正在显示至桩号(项目节)');
  1292. try
  1293. case jpsMain.ActivePageIndex of
  1294. 0: FBillsCompileFrame.ExpandPegXmjNode;
  1295. end;
  1296. finally
  1297. UpdateSysProgress(0, '就绪');
  1298. Screen.Cursor := crDefault;
  1299. end;
  1300. end;
  1301. procedure TProjectFrame.CreatePriceMarginFrame;
  1302. begin
  1303. FPriceMarginFrame := TPriceMarginFrame.Create(FProjectData);
  1304. AlignControl(FPriceMarginFrame, jpsMainPriceMargin, alClient);
  1305. end;
  1306. procedure TProjectFrame.ShowPhaseHint;
  1307. begin
  1308. pnlProjectCheckStatus.Caption := '';
  1309. if Assigned(CheckerFrame) then
  1310. begin
  1311. if CheckerFrame.FirstChecker.CheckStatus = csNotBegin then
  1312. begin
  1313. // 对于原报,要区分新建项目和打回重新开始两种情况。前者不能显示。
  1314. // 为了区分需要去服务器查询,势必影响速度。简单点,原报干脆不显示。
  1315. if not FProjectData.CurUserIsAuthor then
  1316. begin
  1317. pnlProjectCheckStatus.Caption := '本期重新开始';
  1318. pnlProjectCheckStatus.Font.Color := clRed;
  1319. end;
  1320. end
  1321. else if CheckerFrame.OwnerFrame.CheckStatus = csFinished then
  1322. begin
  1323. pnlProjectCheckStatus.Caption := '本期已完成';
  1324. pnlProjectCheckStatus.Font.Color := clGreen;
  1325. end;
  1326. end;
  1327. pnlProjectCheckStatus.Update;
  1328. end;
  1329. end.