BillsMeasureFme.pas 24 KB

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