ProjectFme.pas 40 KB

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