ProjectFme.pas 53 KB

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