BillsMeasureFme.pas 23 KB

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