ProjectFme.pas 40 KB

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