ProjectFme.pas 41 KB

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