ProjectFme.pas 44 KB

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