BillsMeasureFme.pas 26 KB

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