ProjectFme.pas 42 KB

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