BillsMeasureFme.pas 25 KB

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