BillsMeasureFme.pas 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. unit BillsMeasureFme;
  2. interface
  3. uses
  4. BillsMeasureDm, UtilMethods, BillsClipboard, sdIDTreeCells,
  5. ColVisibleManager,
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, ZJGrid, ComCtrls, ToolWin, StdCtrls, ExtCtrls, sdGridDBA,
  8. sdGridTreeDBA, sdDB, ActnList, dxBar, sdIDTree, JimLabels;
  9. type
  10. TBillsMeasureFrame = class(TFrame)
  11. pnlExprs: TPanel;
  12. laEdtExprs: TLabeledEdit;
  13. pnlBills: TPanel;
  14. zgBillsMeasure: TZJGrid;
  15. stdBillsMeasure: TsdGridTreeDBA;
  16. dxpmBills: TdxBarPopupMenu;
  17. alBills: TActionList;
  18. actnCalculateAll: TAction;
  19. actnExportGridToExcel: TAction;
  20. actnSetStageBookmark: TAction;
  21. pnlNodeDetail: TPanel;
  22. pnlDealProperty: TPanel;
  23. labDealPropertyTitle: TJimGradLabel;
  24. zgDealProperty: TZJGrid;
  25. dxpmBillsCol: TdxBarPopupMenu;
  26. actnHiddenCol: TAction;
  27. actnCancelHiddenCol: TAction;
  28. actnLocateZJJL: TAction;
  29. procedure dxpmBillsPopup(Sender: TObject);
  30. procedure zgBillsMeasureMouseDown(Sender: TObject; Button: TMouseButton;
  31. Shift: TShiftState; X, Y: Integer);
  32. procedure laEdtExprsKeyDown(Sender: TObject; var Key: Word;
  33. Shift: TShiftState);
  34. procedure laEdtExprsExit(Sender: TObject);
  35. procedure actnCalculateAllExecute(Sender: TObject);
  36. procedure zgBillsMeasureCellGetColor(Sender: TObject; ACoord: TPoint;
  37. var AColor: TColor);
  38. procedure actnExportGridToExcelExecute(Sender: TObject);
  39. procedure zgBillsMeasureCellButtonClick(Sender: TObject; Col,
  40. Row: Integer);
  41. procedure zgBillsMeasureCustomPaste(Sender: TObject; ABounds: TRect;
  42. ASourSheet: TZjSheet);
  43. procedure zgBillsMeasureKeyDown(Sender: TObject; var Key: Word;
  44. Shift: TShiftState);
  45. procedure actnSetStageBookmarkExecute(Sender: TObject);
  46. procedure zgBillsMeasureCurrentChanged(Sender: TObject; Col,
  47. Row: Integer);
  48. procedure zgDealPropertyCellGetFont(Sender: TObject; ACoord: TPoint;
  49. AFont: TFont);
  50. procedure zgDealPropertyCellTextChanged(Sender: TObject; Col,
  51. Row: Integer);
  52. procedure zgDealPropertyCellCanEdit(Sender: TObject;
  53. const ACoord: TPoint; var Allow: Boolean);
  54. procedure actnSetStageBookmarkUpdate(Sender: TObject);
  55. procedure dxpmBillsColPopup(Sender: TObject);
  56. procedure actnHiddenColExecute(Sender: TObject);
  57. procedure actnCancelHiddenColExecute(Sender: TObject);
  58. procedure actnLocateZJJLExecute(Sender: TObject);
  59. procedure actnLocateZJJLUpdate(Sender: TObject);
  60. procedure actnCalculateAllUpdate(Sender: TObject);
  61. private
  62. FBillsMeasureData: TBillsMeasureData;
  63. FShowPriceChange: Boolean;
  64. FShowBGLCode: Boolean;
  65. FShowDesignQuantity: Boolean;
  66. FShowAddField: Boolean; // For Inner Test
  67. FShowPMField: Boolean; // For Inner Test
  68. FOnAfterSetBookmark: TBookmarkRefreshEvent;
  69. FShowAlias: Boolean;
  70. FShowApprovalCode: Boolean;
  71. FShowIsGather: Boolean;
  72. FColVisibleManager: TBM_ColVisibleManager;
  73. FOnLocateZJJL: TLocateZJJLEvent;
  74. procedure ExpandMouseDown(AGridCell: TzjCell);
  75. function GridColToDBACol(AGridCol: Integer): Integer;
  76. procedure ShowGridCols(AShow: Boolean; ALeft, ARight: Integer);
  77. function CheckExprsColumn: Boolean;
  78. function CheckMemoStrColumn: Boolean;
  79. procedure SetColumnVisible(const AColumn: string; AVisible: Boolean);
  80. procedure SetAddFieldVisible(AValue: Boolean);
  81. procedure SetPMFieldVisible(AValue: Boolean);
  82. procedure LoadDealProperty(ARec: TsdDataRecord);
  83. procedure BeginExpandNode;
  84. procedure EndExpandNode;
  85. procedure ResetPhaseDataReadOnly(AReadOnly: Boolean);
  86. procedure ResetBaseDataReadOnly(AReadOnly: Boolean);
  87. procedure ResetAllowInsert(AAllow: Boolean);
  88. procedure SetShowPriceChange(const Value: Boolean);
  89. procedure SetShowBGLCode(const Value: Boolean);
  90. procedure SetShowDesignQuantity(const Value: Boolean);
  91. procedure SetShowAlias(const Value: Boolean);
  92. procedure SetShowApprovalCode(const Value: Boolean);
  93. procedure SetShowIsGather(const Value: Boolean);
  94. public
  95. constructor Create(AProjectFrame: TFrame; ABillsMeasureData: TBillsMeasureData);
  96. destructor Destroy; override;
  97. procedure ExpandNodeTo(ALevel: Integer);
  98. procedure ExpandXmjNode;
  99. procedure ExpandCurPhase;
  100. procedure RefreshPhase_Stage;
  101. property ShowPriceChange: Boolean read FShowPriceChange write SetShowPriceChange;
  102. property ShowBGLCode: Boolean read FShowBGLCode write SetShowBGLCode;
  103. property ShowDesignQuantity: Boolean read FShowDesignQuantity write SetShowDesignQuantity;
  104. property ShowAlias: Boolean read FShowAlias write SetShowAlias;
  105. property ShowApprovalCode: Boolean read FShowApprovalCode write SetShowApprovalCode;
  106. property ShowIsGather: Boolean read FShowIsGather write SetShowIsGather;
  107. property OnAfterSetBookmark: TBookmarkRefreshEvent read FOnAfterSetBookmark write FOnAfterSetBookmark;
  108. property OnLocateZJJL: TLocateZJJLEvent read FOnLocateZJJL write FOnLocateZJJL;
  109. property BillsMeasureData: TBillsMeasureData read FBillsMeasureData;
  110. end;
  111. implementation
  112. {$R *.dfm}
  113. uses
  114. MainFrm, ProjectFme, ProjectData, ExportExcel, BGLDm, BGLSelectFrm,
  115. Types, ZhAPI, BillsTree, mDataRecord, ConditionalDefines;
  116. { TBillsFrame }
  117. constructor TBillsMeasureFrame.Create(AProjectFrame: TFrame;
  118. ABillsMeasureData: TBillsMeasureData);
  119. begin
  120. inherited Create(AProjectFrame);
  121. FBillsMeasureData := ABillsMeasureData;
  122. stdBillsMeasure.IDTree := FBillsMeasureData.BillsMeasureTree;
  123. zgBillsMeasure.OnExpandMouseDown := ExpandMouseDown;
  124. FColVisibleManager := TBM_ColVisibleManager.Create(stdBillsMeasure);
  125. if not _IsDebugView then
  126. zgBillsMeasure.OnKeyDown := nil;
  127. end;
  128. destructor TBillsMeasureFrame.Destroy;
  129. begin
  130. FColVisibleManager.Free;
  131. inherited;
  132. end;
  133. procedure TBillsMeasureFrame.dxpmBillsPopup(Sender: TObject);
  134. begin
  135. SetDxBtnAction(actnCalculateAll, MainForm.dxbtnCalculateAll);
  136. SetDxBtnAction(actnExportGridToExcel, MainForm.dxbtnExportGridToExcel);
  137. SetDxBtnAction(actnSetStageBookmark, MainForm.dxbtnSetBookmark);
  138. SetDxBtnAction(actnLocateZJJL, MainForm.dxbtnLocateZJJL);
  139. end;
  140. procedure TBillsMeasureFrame.zgBillsMeasureMouseDown(Sender: TObject;
  141. Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
  142. var
  143. vCol: TsdGridColumn;
  144. vViewCol: TsdViewColumn;
  145. begin
  146. if Button = mbRight then
  147. begin
  148. if _IsDebugView and (zgBillsMeasure.Selection.SelectType = stCol) and (Y < (zgBillsMeasure.RowHeights[0] + zgBillsMeasure.RowHeights[1])) then
  149. dxpmBillsCol.PopupFromCursorPos
  150. else
  151. dxpmBills.PopupFromCursorPos;
  152. end
  153. else
  154. begin
  155. if CheckExprsColumn or CheckMemoStrColumn then
  156. laEdtExprs.Text := zgBillsMeasure.CurCell.EditText
  157. else
  158. laEdtExprs.Text := '';
  159. stdBillsMeasure.FindColumn(zgBillsMeasure.CurCol, vCol);
  160. laEdtExprs.ReadOnly := vCol.ReadOnly;
  161. end;
  162. end;
  163. procedure TBillsMeasureFrame.SetShowPriceChange(const Value: Boolean);
  164. begin
  165. FShowPriceChange := Value;
  166. FColVisibleManager.ShowPriceChange(FShowPriceChange);
  167. end;
  168. procedure TBillsMeasureFrame.laEdtExprsKeyDown(Sender: TObject; var Key: Word;
  169. Shift: TShiftState);
  170. begin
  171. if Key = VK_Return then
  172. begin
  173. zgBillsMeasure.SetFocus;
  174. if not TLabeledEdit(Sender).ReadOnly then
  175. if CheckExprsColumn or CheckMemoStrColumn then
  176. zgBillsMeasure.CurCell.Text := laEdtExprs.Text;
  177. end;
  178. end;
  179. procedure TBillsMeasureFrame.laEdtExprsExit(Sender: TObject);
  180. begin
  181. if not TLabeledEdit(Sender).ReadOnly then
  182. if CheckExprsColumn or CheckMemoStrColumn then
  183. zgBillsMeasure.CurCell.Text := laEdtExprs.Text;
  184. end;
  185. procedure TBillsMeasureFrame.actnCalculateAllExecute(Sender: TObject);
  186. begin
  187. TProjectData(FBillsMeasureData.ProjectData).CalculateAll;
  188. end;
  189. procedure TBillsMeasureFrame.zgBillsMeasureCellGetColor(Sender: TObject; ACoord: TPoint;
  190. var AColor: TColor);
  191. var
  192. stnNode: TMeasureBillsIDTreeNode;
  193. iCreatePhaseID: Integer;
  194. StageRec: TStageRecord;
  195. fDiffer, fCompare: Double;
  196. begin
  197. AColor := clWindow;
  198. if ACoord.Y > stdBillsMeasure.IDTree.Count + 1 then Exit;
  199. stnNode := TMeasureBillsIDTreeNode(stdBillsMeasure.IDTree.Items[ACoord.Y - 2]);
  200. if not Assigned(stnNode) then Exit;
  201. iCreatePhaseID := stnNode.Rec.CreatePhaseID.AsInteger;
  202. // 根据层次底色不同
  203. if stnNode.ParentID = 1 then
  204. AColor := $00FBCAC4
  205. else if (stnNode.Rec.B_Code.AsString = '') and (stnNode.Level > 0) then
  206. AColor := $00F9E8DF;
  207. // 书签
  208. if TProjectData(FBillsMeasureData.ProjectData).ProjProperties.PhaseCount > 0 then
  209. begin
  210. StageRec := stnNode.StageRec;
  211. if Assigned(StageRec) and StageRec.HasBookmark.AsBoolean then
  212. AColor := $00CFE2F9;
  213. end;
  214. // 根据节点创建期数底色不同
  215. if iCreatePhaseID > 0 then
  216. begin
  217. // 当前期不存在节点,底色为灰色提示用户
  218. if iCreatePhaseID > TProjectData(FBillsMeasureData.ProjectData).PhaseIndex then
  219. AColor := $00D5D5D5
  220. // 当前期新增节点,底色为黄色提示用户
  221. else if iCreatePhaseID = TProjectData(FBillsMeasureData.ProjectData).PhaseIndex then
  222. AColor := $00A7FDFD;
  223. end;
  224. // 叶子节点,累计合同计量超过0号台账,整行数据的底色变为暗红提示用户
  225. if TProjectData(FBillsMeasureData.ProjectData).ProjProperties.ShowOverRange and not stnNode.HasChildren then
  226. begin
  227. with stnNode.Rec do
  228. begin
  229. if CalcType.AsInteger = 0 then
  230. begin
  231. fDiffer := QuantityRoundTo(AddDealQuantity.AsFloat - Quantity.AsFloat);
  232. fCompare := TProjectData(FBillsMeasureData.ProjectData).ProjProperties.DecimalManager.Common.Quantity.CompareValue;
  233. end
  234. else
  235. begin
  236. fDiffer := TotalPriceRoundTo(AddDealTotalPrice.AsFloat - TotalPrice.AsFloat);
  237. fCompare := TProjectData(FBillsMeasureData.ProjectData).ProjProperties.DecimalManager.Common.TotalPrice.CompareValue;
  238. end;
  239. if fDiffer > fCompare then
  240. AColor := $00646AFE;
  241. end;
  242. end;
  243. end;
  244. procedure TBillsMeasureFrame.SetColumnVisible(const AColumn: string;
  245. AVisible: Boolean);
  246. begin
  247. if AVisible then
  248. stdBillsMeasure.Column(AColumn).Width := 60
  249. else
  250. stdBillsMeasure.Column(AColumn).Width := 0;
  251. end;
  252. procedure TBillsMeasureFrame.SetShowBGLCode(const Value: Boolean);
  253. begin
  254. FShowBGLCode := Value;
  255. FColVisibleManager.ShowBGLCode(FShowBGLCode);
  256. end;
  257. procedure TBillsMeasureFrame.actnExportGridToExcelExecute(Sender: TObject);
  258. var
  259. sFileName: string;
  260. ExcelExportor: TExcelExportor;
  261. begin
  262. if SaveExcelFile(sFileName) then
  263. begin
  264. ExcelExportor := TExcelExportor.Create;
  265. try
  266. ExcelExportor.ExportToFile(zgBillsMeasure, sFileName);
  267. finally
  268. ExcelExportor.Free;
  269. end;
  270. end;
  271. end;
  272. function TBillsMeasureFrame.CheckExprsColumn: Boolean;
  273. var
  274. iCol: Integer;
  275. begin
  276. iCol := zgBillsMeasure.CurCol - zgBillsMeasure.FixedColCount;
  277. Result := (iCol = stdBillsMeasure.VisibleCol('CurDealQuantity'))
  278. or (iCol = stdBillsMeasure.VisibleCol('CurDealTotalPrice'))
  279. or (iCol = stdBillsMeasure.VisibleCol('CurQcQuantity'))
  280. or (iCol = stdBillsMeasure.VisibleCol('CurQcTotalPrice'))
  281. or (iCol = stdBillsMeasure.VisibleCol('CurPcQuantity'))
  282. or (iCol = stdBillsMeasure.VisibleCol('CurPcTotalPrice'));
  283. end;
  284. procedure TBillsMeasureFrame.zgBillsMeasureCellButtonClick(Sender: TObject;
  285. Col, Row: Integer);
  286. procedure SelectAndUpdateBGL(const AType, AField: string; ANode: TsdIDTreeNode);
  287. var
  288. vOrgBGL, vNewBGL: TBGLSelectInfo;
  289. StageRec: TStageRecord;
  290. begin
  291. if not Assigned(ANode) then Exit;
  292. StageRec := TMeasureBillsIDTreeNode(ANode).StageRec;
  293. try
  294. if Assigned(StageRec) then
  295. begin
  296. vOrgBGL := TBGLSelectInfo.Create(ANode.Rec,
  297. StageRec.ValueByName(AType + AField).AsFloat, True);
  298. vOrgBGL.MergedCode := StageRec.ValueByName(AType + 'BGLCode').AsString;
  299. vOrgBGL.MergedNum := StageRec.ValueByName(AType + 'BGLNum').AsString;
  300. end
  301. else
  302. vOrgBGL := TBGLSelectInfo.Create(ANode.Rec, 0, True);
  303. vNewBGL := TBGLSelectInfo.Create(ANode.Rec, 0, False);
  304. if SelectBGLAndBGNum(vOrgBGL, vNewBGL, FBillsMeasureData.ProjectData) then
  305. begin
  306. if not Assigned(StageRec) then
  307. begin
  308. StageRec := FBillsMeasureData.StageData.AddStageRecord(ANode.ID);
  309. TMeasureBillsIDTreeNode(ANode).StageRec := StageRec;
  310. end;
  311. StageRec.ValueByName(AType + AField).AsFloat := vNewBGL.TotalNum;
  312. StageRec.ValueByName(AType + 'BGLCode').AsString := vNewBGL.MergedCode;
  313. StageRec.ValueByName(AType + 'BGLNum').AsString := vNewBGL.MergedNum;
  314. FBillsMeasureData.StageData.UpdateBGLInfo(StageRec, AType);
  315. FBillsMeasureData.UpdateBGLInfo(ANode.ID, StageRec, AType);
  316. TProjectData(FBillsMeasureData.ProjectData).BGLData.ApplyBGL(vOrgBGL, vNewBGL);
  317. // 重新计算合同支付所有数据
  318. TProjectData(FBillsMeasureData.ProjectData).PhaseData.PhasePayData.CalculateAll;
  319. end;
  320. finally
  321. vOrgBGL.Free;
  322. vNewBGL.Free;
  323. end;
  324. end;
  325. procedure GetTypeAndField(var AType, AField: string);
  326. begin
  327. if (Col = stdBillsMeasure.VisibleCol('CurQcQuantity') + 1) then
  328. begin
  329. AType := 'Qc';
  330. AField := 'Quantity';
  331. end
  332. else if (Col = stdBillsMeasure.VisibleCol('CurPcQuantity') + 1) then
  333. begin
  334. AType := 'Pc';
  335. AField := 'Quantity';
  336. end;
  337. end;
  338. var
  339. stnCurNode: TBillsIDTreeNode;
  340. sType, sField: string;
  341. begin
  342. stnCurNode := TBillsIDTreeNode(stdBillsMeasure.IDTree.Selected);
  343. if stnCurNode.HasChildren then Exit;
  344. with TProjectData(FBillsMeasureData.ProjectData) do
  345. if PhaseData.StageDataReadOnly then Exit;
  346. GetTypeAndField(sType, sField);
  347. if (sType = '') or (sField = '') then Exit;
  348. if stnCurNode.Rec.CalcType.AsInteger = 1 then
  349. begin
  350. WarningMessage('该清单不可输入数量单价,如需使用数量×单价计算,请先清空所有直接输入的金额!');
  351. Exit;
  352. end;
  353. SelectAndUpdateBGL(sType, sField, stnCurNode);
  354. end;
  355. procedure TBillsMeasureFrame.zgBillsMeasureCustomPaste(Sender: TObject;
  356. ABounds: TRect; ASourSheet: TZjSheet);
  357. var
  358. iRow, iCol: Integer;
  359. begin
  360. for iRow := ABounds.Top to ABounds.Bottom - 1 do
  361. begin
  362. if not zgBillsMeasure.RowVisible[iRow] then Continue;
  363. for iCol := ABounds.Left to ABounds.Right - 1 do
  364. with TZJGrid(Sender).Cells[iCol, iRow] do
  365. if CanEdit then Text := ASourSheet.Values[iCol - ABounds.Left, iRow - ABounds.Top];
  366. end;
  367. end;
  368. procedure TBillsMeasureFrame.SetShowDesignQuantity(const Value: Boolean);
  369. begin
  370. FShowDesignQuantity := Value;
  371. FColVisibleManager.ShowDesign(FShowDesignQuantity);
  372. end;
  373. procedure TBillsMeasureFrame.SetAddFieldVisible(AValue: Boolean);
  374. begin
  375. FShowAddField := AValue;
  376. stdBillsMeasure.Column('AddDealQuantity').Visible := AValue;
  377. stdBillsMeasure.Column('AddDealTotalPrice').Visible := AValue;
  378. stdBillsMeasure.Column('AddQcQuantity').Visible := AValue;
  379. stdBillsMeasure.Column('AddQcTotalPrice').Visible := AValue;
  380. stdBillsMeasure.Column('AddPcQuantity').Visible := AValue;
  381. stdBillsMeasure.Column('AddPcTotalPrice').Visible := AValue;
  382. stdBillsMeasure.Column('AddGatherQuantity').Visible := AValue;
  383. stdBillsMeasure.Column('AddGatherTotalPrice').Visible := AValue;
  384. end;
  385. procedure TBillsMeasureFrame.zgBillsMeasureKeyDown(Sender: TObject;
  386. var Key: Word; Shift: TShiftState);
  387. begin
  388. // For Inner Test
  389. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  390. and (Key in [65, 97]) // 'a', 'A'
  391. and (zgBillsMeasure.CurCol = 4) then
  392. SetAddFieldVisible(not FShowAddField);
  393. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  394. and (Key in [80, 112]) // 'p', 'P' - Parent
  395. and (zgBillsMeasure.CurCol = 5) then
  396. begin
  397. FBillsMeasureData.ShowParentData := not FBillsMeasureData.ShowParentData;
  398. zgBillsMeasure.Invalidate;
  399. end;
  400. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  401. and (Key in [77, 109]) // 'm', 'M' - PriceMargin
  402. and (zgBillsMeasure.CurCol = 5) then
  403. begin
  404. SetPMFieldVisible(not FShowPMField);
  405. end;
  406. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  407. and (Key in [67, 99]) then // 'c', 'C'
  408. actnCalculateAll.Execute;
  409. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  410. and (Key in [66, 98]) then
  411. ShowIsGather := not ShowIsGather;
  412. end;
  413. procedure TBillsMeasureFrame.actnSetStageBookmarkExecute(Sender: TObject);
  414. var
  415. vNode: TMeasureBillsIDTreeNode;
  416. StageRec: TStageRecord;
  417. begin
  418. vNode := TMeasureBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.Selected);
  419. StageRec := vNode.StageRec;
  420. if not Assigned(StageRec) then
  421. begin
  422. StageRec := FBillsMeasureData.StageData.AddStageRecord(stdBillsMeasure.IDTree.Selected.ID);
  423. vNode.StageRec := StageRec;
  424. end;
  425. if StageRec.HasBookMark.AsBoolean then
  426. begin
  427. StageRec.HasBookMark.AsBoolean := False;
  428. StageRec.MarkMemo.AsString := '';
  429. end
  430. else
  431. StageRec.HasBookMark.AsBoolean := True;
  432. TProjectData(FBillsMeasureData.ProjectData).BillsBookmarkData.RefreshStageBookmark;
  433. if Assigned(FOnAfterSetBookmark) then
  434. FOnAfterSetBookmark(StageRec.HasBookMark.AsBoolean);
  435. zgBillsMeasure.InvalidateRow(zgBillsMeasure.CurRow);
  436. end;
  437. procedure TBillsMeasureFrame.zgBillsMeasureCurrentChanged(Sender: TObject;
  438. Col, Row: Integer);
  439. var
  440. stnNode: TsdIDTreeNode;
  441. bShowDealProperty: Boolean;
  442. begin
  443. stnNode := stdBillsMeasure.IDTree.Selected;
  444. bShowDealProperty := False;
  445. if Assigned(stnNode) then
  446. begin
  447. bShowDealProperty := stnNode.Rec.ValueByName('DealCode').AsString <> '';
  448. pnlNodeDetail.Visible := bShowDealProperty;
  449. LoadDealProperty(stnNode.Rec);
  450. end;
  451. end;
  452. procedure TBillsMeasureFrame.LoadDealProperty(ARec: TsdDataRecord);
  453. var
  454. fHasPay, fNotPay: Double;
  455. begin
  456. zgDealProperty.OnCellTextChanged := nil;
  457. zgDealProperty.Cells[0, 0].Text := '合同类别';
  458. zgDealProperty.Cells[0, 1].Text := ARec.ValueByName('DealType').AsString;
  459. zgDealProperty.Cells[0, 1].Align := gaCenterLeft;
  460. zgDealProperty.ColWidths[0] := 80;
  461. zgDealProperty.Cells[1, 0].Text := '累计应扣款';
  462. zgDealProperty.Cells[1, 1].Text := ARec.ValueByName('AddCutTotalPrice').AsString;
  463. zgDealProperty.Cells[1, 1].Align := gaCenterRight;
  464. zgDealProperty.ColWidths[1] := 80;
  465. zgDealProperty.Cells[2, 0].Text := '累计应支付';
  466. fHasPay := TotalPriceRoundTo(
  467. ARec.ValueByName('AddGatherTotalPrice').AsFloat - ARec.ValueByName('AddCutTotalPrice').AsFloat);
  468. zgDealProperty.Cells[2, 1].Text := FloatToStr(fHasPay);
  469. zgDealProperty.Cells[2, 1].Align := gaCenterRight;
  470. zgDealProperty.ColWidths[2] := 80;
  471. zgDealProperty.Cells[3, 0].Text := '累计已支付';
  472. zgDealProperty.Cells[3, 1].Text := ARec.ValueByName('AddPayTotalPrice').AsString;
  473. zgDealProperty.Cells[3, 1].Align := gaCenterRight;
  474. zgDealProperty.ColWidths[3] := 80;
  475. zgDealProperty.Cells[4, 0].Text := '待支付';
  476. fNotPay := TotalPriceRoundTo(fHasPay - ARec.ValueByName('AddPayTotalPrice').AsFloat);
  477. zgDealProperty.Cells[4, 1].Text := FloatToStr(fNotPay);
  478. zgDealProperty.Cells[4, 1].Align := gaCenterRight;
  479. zgDealProperty.ColWidths[4] := 80;
  480. zgDealProperty.OnCellTextChanged := zgDealPropertyCellTextChanged;
  481. end;
  482. procedure TBillsMeasureFrame.zgDealPropertyCellGetFont(Sender: TObject;
  483. ACoord: TPoint; AFont: TFont);
  484. begin
  485. if ((ACoord.X = 2) or (ACoord.X = 4)) and (ACoord.Y = 1) then
  486. AFont.Color := clGrayText;
  487. end;
  488. procedure TBillsMeasureFrame.zgDealPropertyCellTextChanged(Sender: TObject;
  489. Col, Row: Integer);
  490. procedure ModifyField(ARec: TsdDataRecord; const AField: string; ACell: TzjCell);
  491. var
  492. fValue, fHasPay, fNotPay: Double;
  493. begin
  494. if (ACell.Text = '') or TryStrToFloat(ACell.Text, fValue) then
  495. begin
  496. ARec.ValueByName(AField).AsString := ACell.Text;
  497. // 更新显示应支付&待支付数据
  498. fHasPay := TotalPriceRoundTo(
  499. ARec.ValueByName('AddGatherTotalPrice').AsFloat - ARec.ValueByName('AddCutTotalPrice').AsFloat);
  500. zgDealProperty.Cells[2, 1].Text := FloatToStr(fHasPay);
  501. fNotPay := TotalPriceRoundTo(fHasPay - ARec.ValueByName('AddPayTotalPrice').AsFloat);
  502. zgDealProperty.Cells[4, 1].Text := FloatToStr(fNotPay);
  503. end
  504. else
  505. begin
  506. ErrorMessage('只允许输入数字!!');
  507. ACell.Text := ARec.ValueByName(AField).AsString;
  508. end;
  509. end;
  510. var
  511. Rec: TsdDataRecord;
  512. begin
  513. Rec := stdBillsMeasure.IDTree.Selected.Rec;
  514. case Col of
  515. 0: Rec.ValueByName('DealType').AsString := zgDealProperty.Cells[Col, Row].Text;
  516. 1: ModifyField(Rec, 'AddCutTotalPrice', zgDealProperty.Cells[Col, Row]);
  517. 3: ModifyField(Rec, 'AddPayTotalPrice', zgDealProperty.Cells[Col, Row]);
  518. end;
  519. end;
  520. procedure TBillsMeasureFrame.zgDealPropertyCellCanEdit(Sender: TObject;
  521. const ACoord: TPoint; var Allow: Boolean);
  522. begin
  523. Allow := (ACoord.X = 0) or (ACoord.X = 1) or (ACoord.X = 3);
  524. end;
  525. procedure TBillsMeasureFrame.SetShowAlias(const Value: Boolean);
  526. begin
  527. FShowAlias := Value;
  528. FColVisibleManager.ShowAlias(FShowAlias);
  529. end;
  530. procedure TBillsMeasureFrame.actnSetStageBookmarkUpdate(Sender: TObject);
  531. begin
  532. TAction(Sender).Enabled := TProjectData(FBillsMeasureData.ProjectData).ProjProperties.PhaseCount > 0;
  533. end;
  534. procedure TBillsMeasureFrame.ExpandNodeTo(ALevel: Integer);
  535. begin
  536. BeginExpandNode;
  537. try
  538. FBillsMeasureData.ExpandNodeTo(ALevel);
  539. finally
  540. EndExpandNode;
  541. end;
  542. end;
  543. procedure TBillsMeasureFrame.ExpandXmjNode;
  544. begin
  545. BeginExpandNode;
  546. try
  547. FBillsMeasureData.ExpandXmjNode;
  548. finally
  549. EndExpandNode;
  550. end;
  551. end;
  552. procedure TBillsMeasureFrame.BeginExpandNode;
  553. begin
  554. zgBillsMeasure.BeginUpdate;
  555. zgBillsMeasure.OnCellGetColor := nil;
  556. BeginUpdateWindow(zgBillsMeasure.Handle);
  557. stdBillsMeasure.DisableControl;
  558. end;
  559. procedure TBillsMeasureFrame.EndExpandNode;
  560. begin
  561. stdBillsMeasure.EnableControl;
  562. EndUpdateWindow(zgBillsMeasure.Handle);
  563. zgBillsMeasure.OnCellGetColor := zgBillsMeasureCellGetColor;
  564. zgBillsMeasure.EndUpdate;
  565. end;
  566. procedure TBillsMeasureFrame.ExpandCurPhase;
  567. begin
  568. BeginExpandNode;
  569. try
  570. FBillsMeasureData.ExpandCurPhase;
  571. finally
  572. EndExpandNode;
  573. end;
  574. end;
  575. procedure TBillsMeasureFrame.RefreshPhase_Stage;
  576. begin
  577. with TProjectData(FBillsMeasureData.ProjectData) do
  578. begin
  579. ResetPhaseDataReadOnly(StageDataReadOnly);
  580. ResetBaseDataReadOnly(BaseDataReadOnly);
  581. ResetAllowInsert(AllowInsert);
  582. end;
  583. zgBillsMeasure.Invalidate;
  584. end;
  585. procedure TBillsMeasureFrame.ResetPhaseDataReadOnly(AReadOnly: Boolean);
  586. begin
  587. stdBillsMeasure.Column('CurDealQuantity').ReadOnly := AReadOnly;
  588. stdBillsMeasure.Column('CurDealTotalPrice').ReadOnly := AReadOnly;
  589. stdBillsMeasure.Column('CurQcQuantity').ReadOnly := AReadOnly;
  590. stdBillsMeasure.Column('CurPcQuantity').ReadOnly := AReadOnly;
  591. end;
  592. procedure TBillsMeasureFrame.ResetBaseDataReadOnly(AReadOnly: Boolean);
  593. begin
  594. stdBillsMeasure.Column('Code').ReadOnly := AReadOnly;
  595. stdBillsMeasure.Column('B_Code').ReadOnly := AReadOnly;
  596. stdBillsMeasure.Column('Name').ReadOnly := AReadOnly;
  597. stdBillsMeasure.Column('Units').ReadOnly := AReadOnly;
  598. stdBillsMeasure.Column('Price').ReadOnly := AReadOnly;
  599. stdBillsMeasure.Column('NewPrice').ReadOnly := AReadOnly;
  600. stdBillsMeasure.Column('DrawingCode').ReadOnly := AReadOnly;
  601. end;
  602. procedure TBillsMeasureFrame.ResetAllowInsert(AAllow: Boolean);
  603. begin
  604. if AAllow then
  605. stdBillsMeasure.Options := stdBillsMeasure.Options + [aoAllowInsert]
  606. else
  607. stdBillsMeasure.Options := stdBillsMeasure.Options - [aoAllowInsert];
  608. end;
  609. procedure TBillsMeasureFrame.SetPMFieldVisible(AValue: Boolean);
  610. begin
  611. FShowAddField := AValue;
  612. stdBillsMeasure.Column('PM_PreTotalPrice').Visible := AValue;
  613. stdBillsMeasure.Column('PM_TotalPrice').Visible := AValue;
  614. stdBillsMeasure.Column('PM_AddTotalPrice').Visible := AValue;
  615. end;
  616. procedure TBillsMeasureFrame.ExpandMouseDown(AGridCell: TzjCell);
  617. procedure CommonExpand(vNode: TsdIDTreeNode);
  618. begin
  619. AGridCell.Grid.BeginUpdate;
  620. vNode.Expanded := not vNode.Expanded;
  621. AGridCell.Grid.EndUpdate;
  622. AGridCell.Grid.InvalidateView(AGridCell.ViewRect);
  623. end;
  624. procedure QuikExpand(vNode: TsdIDTreeNode);
  625. begin
  626. Screen.Cursor := crHourGlass;
  627. BeginExpandNode;
  628. try
  629. vNode.Expanded := not vNode.Expanded;
  630. finally
  631. EndExpandNode;
  632. Screen.Cursor := crDefault;
  633. end;
  634. end;
  635. var
  636. stnNode: TsdIDTreeNode;
  637. begin
  638. stnNode := TsdIDTreeCell(AGridCell).TreeNode;
  639. if stnNode.PosterityCount > 10000 then
  640. QuikExpand(stnNode)
  641. else
  642. CommonExpand(stnNode);
  643. end;
  644. procedure TBillsMeasureFrame.dxpmBillsColPopup(Sender: TObject);
  645. begin
  646. SetDxBtnAction(actnHiddenCol, MainForm.dxbtnHidden);
  647. SetDxBtnAction(actnCancelHiddenCol, MainForm.dxbtnCancelHidden);
  648. end;
  649. procedure TBillsMeasureFrame.actnHiddenColExecute(Sender: TObject);
  650. begin
  651. ShowGridCols(False, zgBillsMeasure.Selection.Left, zgBillsMeasure.Selection.Right-1);
  652. end;
  653. function TBillsMeasureFrame.GridColToDBACol(AGridCol: Integer): Integer;
  654. var
  655. iCol, iVisibleCount: Integer;
  656. begin
  657. Result := -1;
  658. if AGridCol > stdBillsMeasure.VisibleColCount then Exit;
  659. iVisibleCount := 0;
  660. for iCol := 0 to stdBillsMeasure.Columns.Count - 1 do
  661. begin
  662. if stdBillsMeasure.Columns.Items[iCol].Visible then
  663. begin
  664. Inc(iVisibleCount);
  665. if iVisibleCount = AGridCol then
  666. begin
  667. Result := iCol;
  668. Break;
  669. end;
  670. end;
  671. end;
  672. end;
  673. procedure TBillsMeasureFrame.actnCancelHiddenColExecute(Sender: TObject);
  674. begin
  675. ShowGridCols(True, zgBillsMeasure.Selection.Left, zgBillsMeasure.Selection.Right-1);
  676. end;
  677. procedure TBillsMeasureFrame.ShowGridCols(AShow: Boolean; ALeft,
  678. ARight: Integer);
  679. var
  680. iCol, iBegin, iEnd: Integer;
  681. begin
  682. iBegin := GridColToDBACol(ALeft);
  683. iEnd := GridColToDBACol(ARight);
  684. FColVisibleManager.ShowGridCol(AShow, iBegin, iEnd);
  685. end;
  686. function TBillsMeasureFrame.CheckMemoStrColumn: Boolean;
  687. var
  688. iCol: Integer;
  689. begin
  690. iCol := zgBillsMeasure.CurCol - zgBillsMeasure.FixedColCount;
  691. Result := (iCol = stdBillsMeasure.VisibleCol('MemoStr'));
  692. end;
  693. procedure TBillsMeasureFrame.actnLocateZJJLExecute(Sender: TObject);
  694. var
  695. vNode: TsdIDTreeNode;
  696. begin
  697. vNode := FBillsMeasureData.FindNodeWithZJJL(FBillsMeasureData.BillsMeasureTree.Selected);
  698. if Assigned(vNode) then
  699. begin
  700. if Assigned(OnLocateZJJL) then
  701. FOnLocateZJJL(vNode.ID);
  702. end
  703. else
  704. WarningMessage('该节点及相关节点,均无中间计量数据');
  705. end;
  706. procedure TBillsMeasureFrame.actnLocateZJJLUpdate(Sender: TObject);
  707. begin
  708. TAction(Sender).Enabled := TProjectData(FBillsMeasureData.ProjectData).PhaseData.Active;
  709. end;
  710. procedure TBillsMeasureFrame.SetShowApprovalCode(const Value: Boolean);
  711. begin
  712. FShowApprovalCode := Value;
  713. FColVisibleManager.ShowApprovalCode(FShowApprovalCode);
  714. end;
  715. procedure TBillsMeasureFrame.SetShowIsGather(const Value: Boolean);
  716. begin
  717. FShowIsGather := Value;
  718. FColVisibleManager.ShowIsGather(FShowIsGather);
  719. end;
  720. procedure TBillsMeasureFrame.actnCalculateAllUpdate(Sender: TObject);
  721. begin
  722. with TProjectData(FBillsMeasureData.ProjectData) do
  723. TAction(Sender).Enabled := PhaseData.Active and not PhaseData.StageDataReadOnly;
  724. end;
  725. end.