BillsMeasureFme.pas 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676
  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(ACol: Integer): 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. begin
  115. if Button = mbRight then
  116. dxpmBills.PopupFromCursorPos
  117. else
  118. begin
  119. if zgBillsMeasure.CurCell.Col >= stdBillsMeasure.VisibleCol('Quantity') then
  120. laEdtExprs.Text := zgBillsMeasure.CurCell.EditText
  121. else
  122. laEdtExprs.Text := '';
  123. laEdtExprs.ReadOnly := stdBillsMeasure.Columns.Items[zgBillsMeasure.CurCol].ReadOnly;
  124. end;
  125. end;
  126. procedure TBillsMeasureFrame.SetShowPriceChange(const Value: Boolean);
  127. begin
  128. FShowPriceChange := Value;
  129. stdBillsMeasure.Column('NewPrice').Visible := FShowPriceChange;
  130. stdBillsMeasure.Column('CurPcQuantity').Visible := FShowPriceChange;
  131. stdBillsMeasure.Column('CurPcTotalPrice').Visible := FShowPriceChange;
  132. stdBillsMeasure.Column('CurPcBGLCode').Visible := FShowBGLCode and FShowPriceChange;
  133. stdBillsMeasure.Column('EndPcQuantity').Visible := FShowPriceChange;
  134. stdBillsMeasure.Column('EndPcTotalPrice').Visible := FShowPriceChange;
  135. stdBillsMeasure.Column('AddPcQuantity').Visible := FShowPriceChange;
  136. stdBillsMeasure.Column('AddPcTotalPrice').Visible := FShowPriceChange;
  137. end;
  138. procedure TBillsMeasureFrame.laEdtExprsKeyDown(Sender: TObject; var Key: Word;
  139. Shift: TShiftState);
  140. begin
  141. if Key = VK_Return then
  142. begin
  143. zgBillsMeasure.SetFocus;
  144. if not TLabeledEdit(Sender).ReadOnly then
  145. if CheckExprsColumn(zgBillsMeasure.CurCol) then
  146. zgBillsMeasure.CurCell.Text := laEdtExprs.Text;
  147. end;
  148. end;
  149. procedure TBillsMeasureFrame.laEdtExprsExit(Sender: TObject);
  150. begin
  151. if not TLabeledEdit(Sender).ReadOnly then
  152. if CheckExprsColumn(zgBillsMeasure.CurCol) then
  153. zgBillsMeasure.CurCell.Text := laEdtExprs.Text;
  154. end;
  155. procedure TBillsMeasureFrame.actnCalculateAllExecute(Sender: TObject);
  156. begin
  157. TProjectData(FBillsMeasureData.ProjectData).CalculateAll;
  158. end;
  159. procedure TBillsMeasureFrame.zgBillsMeasureCellGetColor(Sender: TObject; ACoord: TPoint;
  160. var AColor: TColor);
  161. var
  162. stnNode: TBillsIDTreeNode;
  163. iCreatePhaseID: Integer;
  164. StageRec: TStageRecord;
  165. fQtyDiffer: Double;
  166. begin
  167. AColor := clWindow;
  168. if ACoord.Y > stdBillsMeasure.IDTree.Count + 1 then Exit;
  169. stnNode := TBillsIDTreeNode(stdBillsMeasure.IDTree.Items[ACoord.Y - 2]);
  170. if not Assigned(stnNode) then Exit;
  171. iCreatePhaseID := stnNode.Rec.CreatePhaseID.AsInteger;
  172. // 根据层次底色不同
  173. if stnNode.ParentID = 1 then
  174. AColor := $00FBCAC4
  175. else if (stnNode.Rec.B_Code.AsString = '') and (stnNode.Level > 0) then
  176. AColor := $00F9E8DF;
  177. // 书签
  178. if TProjectData(FBillsMeasureData.ProjectData).ProjProperties.PhaseCount > 0 then
  179. begin
  180. StageRec := stnNode.StageRec;
  181. if Assigned(StageRec) and StageRec.HasBookmark.AsBoolean then
  182. AColor := $00CFE2F9;
  183. end;
  184. // 根据节点创建期数底色不同
  185. if iCreatePhaseID > 0 then
  186. begin
  187. // 当前期不存在节点,底色为灰色提示用户
  188. if iCreatePhaseID > TProjectData(FBillsMeasureData.ProjectData).PhaseIndex then
  189. AColor := $00D5D5D5
  190. // 当前期新增节点,底色为黄色提示用户
  191. else if iCreatePhaseID = TProjectData(FBillsMeasureData.ProjectData).PhaseIndex then
  192. AColor := $00A7FDFD;
  193. end;
  194. // 叶子节点,累计合同计量超过0号台账,整行数据的底色变为暗红提示用户
  195. if not stnNode.HasChildren then
  196. begin
  197. with stnNode.Rec do
  198. fQtyDiffer := QuantityRoundTo(AddDealQuantity.AsFloat - Quantity.AsFloat);
  199. if fQtyDiffer > 0 then
  200. AColor := $00646AFE;
  201. end;
  202. end;
  203. procedure TBillsMeasureFrame.SetColumnVisible(const AColumn: string;
  204. AVisible: Boolean);
  205. begin
  206. if AVisible then
  207. stdBillsMeasure.Column(AColumn).Width := 60
  208. else
  209. stdBillsMeasure.Column(AColumn).Width := 0;
  210. end;
  211. procedure TBillsMeasureFrame.SetShowBGLCode(const Value: Boolean);
  212. begin
  213. FShowBGLCode := Value;
  214. if FShowBGLCode then
  215. stdBillsMeasure.Column('CurQcQuantity').Title.CaptionAcrossCols := '3'
  216. else
  217. stdBillsMeasure.Column('CurQcQuantity').Title.CaptionAcrossCols := '2';
  218. stdBillsMeasure.Column('CurQcBGLCode').Visible := FShowBGLCode;
  219. if FShowBGLCode then
  220. stdBillsMeasure.Column('CurPcQuantity').Title.CaptionAcrossCols := '3'
  221. else
  222. stdBillsMeasure.Column('CurPcQuantity').Title.CaptionAcrossCols := '2';
  223. stdBillsMeasure.Column('CurPcBGLCode').Visible := FShowBGLCode and FShowPriceChange;
  224. end;
  225. procedure TBillsMeasureFrame.actnExportGridToExcelExecute(Sender: TObject);
  226. var
  227. sFileName: string;
  228. ExcelExportor: TExcelExportor;
  229. begin
  230. if SaveFile(sFileName, '.xls') then
  231. begin
  232. ExcelExportor := TExcelExportor.Create;
  233. try
  234. ExcelExportor.ExportToFile(zgBillsMeasure, sFileName);
  235. finally
  236. ExcelExportor.Free;
  237. end;
  238. end;
  239. end;
  240. function TBillsMeasureFrame.CheckExprsColumn(ACol: Integer): Boolean;
  241. begin
  242. Result := (ACol = stdBillsMeasure.VisibleCol('CurDealQuantity')) or
  243. (ACol = stdBillsMeasure.VisibleCol('CurDealTotalPrice')) or
  244. (ACol = stdBillsMeasure.VisibleCol('CurQcQuantity')) or
  245. (ACol = stdBillsMeasure.VisibleCol('CurQcTotalPrice')) or
  246. (ACol = stdBillsMeasure.VisibleCol('CurPcQuantity')) or
  247. (ACol = stdBillsMeasure.VisibleCol('CurPcTotalPrice'));
  248. end;
  249. procedure TBillsMeasureFrame.zgBillsMeasureCellButtonClick(Sender: TObject;
  250. Col, Row: Integer);
  251. procedure SelectAndUpdateBGL(const AType, AField: string; ANode: TsdIDTreeNode);
  252. var
  253. vOrgBGL, vNewBGL: TBGLSelectInfo;
  254. StageRec: TStageRecord;
  255. begin
  256. if not Assigned(ANode) then Exit;
  257. StageRec := TBillsIDTreeNode(ANode).StageRec;
  258. try
  259. if Assigned(StageRec) then
  260. begin
  261. vOrgBGL := TBGLSelectInfo.Create(ANode.Rec,
  262. StageRec.ValueByName(AType + AField).AsFloat, True);
  263. vOrgBGL.MergedCode := StageRec.ValueByName(AType + 'BGLCode').AsString;
  264. vOrgBGL.MergedNum := StageRec.ValueByName(AType + 'BGLNum').AsString;
  265. end
  266. else
  267. vOrgBGL := TBGLSelectInfo.Create(ANode.Rec, 0, True);
  268. vNewBGL := TBGLSelectInfo.Create(ANode.Rec, 0, False);
  269. if SelectBGLAndBGNum(vOrgBGL, vNewBGL, FBillsMeasureData.ProjectData) then
  270. begin
  271. if not Assigned(StageRec) then
  272. begin
  273. StageRec := FBillsMeasureData.StageData.AddStageRecord(ANode.ID);
  274. TBillsIDTreeNode(ANode).StageRec := StageRec;
  275. end;
  276. StageRec.ValueByName(AType + AField).AsFloat := vNewBGL.TotalNum;
  277. StageRec.ValueByName(AType + 'BGLCode').AsString := vNewBGL.MergedCode;
  278. StageRec.ValueByName(AType + 'BGLNum').AsString := vNewBGL.MergedNum;
  279. FBillsMeasureData.StageData.UpdateBGLInfo(StageRec, AType);
  280. FBillsMeasureData.UpdateBGLInfo(ANode.ID, StageRec, AType);
  281. TProjectData(FBillsMeasureData.ProjectData).BGLData.ApplyBGL(vOrgBGL, vNewBGL);
  282. // 重新计算合同支付所有数据
  283. TProjectData(FBillsMeasureData.ProjectData).PhaseData.PhasePayData.CalculateAll;
  284. end;
  285. finally
  286. vOrgBGL.Free;
  287. vNewBGL.Free;
  288. end;
  289. end;
  290. procedure GetTypeAndField(var AType, AField: string);
  291. begin
  292. if (Col = stdBillsMeasure.VisibleCol('CurQcQuantity') + 1) then
  293. begin
  294. AType := 'Qc';
  295. AField := 'Quantity';
  296. end
  297. else if (Col = stdBillsMeasure.VisibleCol('CurPcQuantity') + 1) then
  298. begin
  299. AType := 'Pc';
  300. AField := 'Quantity';
  301. end;
  302. end;
  303. var
  304. stnCurNode: TsdIDTreeNode;
  305. sType, sField: string;
  306. begin
  307. stnCurNode := stdBillsMeasure.IDTree.Selected;
  308. if stnCurNode.HasChildren then Exit;
  309. with TProjectData(FBillsMeasureData.ProjectData) do
  310. if PhaseData.StageDataReadOnly then Exit;
  311. GetTypeAndField(sType, sField);
  312. if (sType = '') or (sField = '') then Exit;
  313. SelectAndUpdateBGL(sType, sField, stnCurNode);
  314. end;
  315. procedure TBillsMeasureFrame.zgBillsMeasureCustomPaste(Sender: TObject;
  316. ABounds: TRect; ASourSheet: TZjSheet);
  317. var
  318. iRow, iCol: Integer;
  319. begin
  320. for iRow := ABounds.Top to ABounds.Bottom - 1 do
  321. begin
  322. if not zgBillsMeasure.RowVisible[iRow] then Continue;
  323. for iCol := ABounds.Left to ABounds.Right - 1 do
  324. with TZJGrid(Sender).Cells[iCol, iRow] do
  325. if CanEdit then Text := ASourSheet.Values[iCol - ABounds.Left, iRow - ABounds.Top];
  326. end;
  327. end;
  328. procedure TBillsMeasureFrame.SetShowDesignQuantity(const Value: Boolean);
  329. begin
  330. FShowDesignQuantity := Value;
  331. stdBillsMeasure.Column('DealDgnQuantity1').Visible := FShowDesignQuantity;
  332. stdBillsMeasure.Column('DealDgnQuantity2').Visible := FShowDesignQuantity;
  333. stdBillsMeasure.Column('CDgnQuantity1').Visible := FShowDesignQuantity;
  334. stdBillsMeasure.Column('CDgnQuantity2').Visible := FShowDesignQuantity;
  335. stdBillsMeasure.Column('AddDgnPrice').Visible := FShowDesignQuantity;
  336. end;
  337. procedure TBillsMeasureFrame.SetAddFieldVisible(AValue: Boolean);
  338. begin
  339. FShowAddField := AValue;
  340. stdBillsMeasure.Column('AddDealQuantity').Visible := AValue;
  341. stdBillsMeasure.Column('AddDealTotalPrice').Visible := AValue;
  342. stdBillsMeasure.Column('AddQcQuantity').Visible := AValue;
  343. stdBillsMeasure.Column('AddQcTotalPrice').Visible := AValue;
  344. stdBillsMeasure.Column('AddPcQuantity').Visible := AValue;
  345. stdBillsMeasure.Column('AddPcTotalPrice').Visible := AValue;
  346. stdBillsMeasure.Column('AddGatherQuantity').Visible := AValue;
  347. stdBillsMeasure.Column('AddGatherTotalPrice').Visible := AValue;
  348. end;
  349. procedure TBillsMeasureFrame.zgBillsMeasureKeyDown(Sender: TObject;
  350. var Key: Word; Shift: TShiftState);
  351. begin
  352. // For Inner Test
  353. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  354. and (Key in [65, 97]) // 'a', 'A'
  355. and (zgBillsMeasure.CurCol = 4) then
  356. SetAddFieldVisible(not FShowAddField);
  357. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  358. and (Key in [80, 112]) // 'p', 'P' - Parent
  359. and (zgBillsMeasure.CurCol = 5) then
  360. begin
  361. FBillsMeasureData.ShowParentData := not FBillsMeasureData.ShowParentData;
  362. zgBillsMeasure.Invalidate;
  363. end;
  364. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  365. and (Key in [77, 109]) // 'm', 'M' - PriceMargin
  366. and (zgBillsMeasure.CurCol = 5) then
  367. begin
  368. SetPMFieldVisible(not FShowPMField);
  369. end;
  370. if (ssCtrl in Shift) and (ssShift in Shift) and (ssAlt in Shift)
  371. and (Key in [67, 99]) then // 'c', 'C'
  372. actnCalculateAll.Execute;
  373. end;
  374. procedure TBillsMeasureFrame.actnSetStageBookmarkExecute(Sender: TObject);
  375. var
  376. vNode: TBillsIDTreeNode;
  377. StageRec: TStageRecord;
  378. begin
  379. vNode := TBillsIDTreeNode(FBillsMeasureData.BillsMeasureTree.Selected);
  380. StageRec := vNode.StageRec;
  381. if not Assigned(StageRec) then
  382. begin
  383. StageRec := FBillsMeasureData.StageData.AddStageRecord(stdBillsMeasure.IDTree.Selected.ID);
  384. vNode.StageRec := StageRec;
  385. end;
  386. if StageRec.ValueByName('HasBookmark').AsBoolean then
  387. begin
  388. StageRec.ValueByName('HasBookmark').AsBoolean := False;
  389. StageRec.ValueByName('MarkMemo').AsString := '';
  390. end
  391. else
  392. StageRec.ValueByName('HasBookmark').AsBoolean := True;
  393. TProjectData(FBillsMeasureData.ProjectData).BillsBookmarkData.RefreshStageBookmark;
  394. if Assigned(FOnAfterSetBookmark) then
  395. FOnAfterSetBookmark(StageRec.ValueByName('HasBookmark').AsBoolean);
  396. zgBillsMeasure.InvalidateRow(zgBillsMeasure.CurRow);
  397. end;
  398. procedure TBillsMeasureFrame.zgBillsMeasureCurrentChanged(Sender: TObject;
  399. Col, Row: Integer);
  400. var
  401. stnNode: TsdIDTreeNode;
  402. bShowDealProperty: Boolean;
  403. begin
  404. stnNode := stdBillsMeasure.IDTree.Selected;
  405. bShowDealProperty := False;
  406. if Assigned(stnNode) then
  407. begin
  408. bShowDealProperty := stnNode.Rec.ValueByName('DealCode').AsString <> '';
  409. pnlNodeDetail.Visible := bShowDealProperty;
  410. LoadDealProperty(stnNode.Rec);
  411. end;
  412. end;
  413. procedure TBillsMeasureFrame.LoadDealProperty(ARec: TsdDataRecord);
  414. var
  415. fHasPay, fNotPay: Double;
  416. begin
  417. zgDealProperty.OnCellTextChanged := nil;
  418. zgDealProperty.Cells[0, 0].Text := '合同类别';
  419. zgDealProperty.Cells[0, 1].Text := ARec.ValueByName('DealType').AsString;
  420. zgDealProperty.Cells[0, 1].Align := gaCenterLeft;
  421. zgDealProperty.ColWidths[0] := 80;
  422. zgDealProperty.Cells[1, 0].Text := '累计应扣款';
  423. zgDealProperty.Cells[1, 1].Text := ARec.ValueByName('AddCutTotalPrice').AsString;
  424. zgDealProperty.Cells[1, 1].Align := gaCenterRight;
  425. zgDealProperty.ColWidths[1] := 80;
  426. zgDealProperty.Cells[2, 0].Text := '累计应支付';
  427. fHasPay := TotalPriceRoundTo(
  428. ARec.ValueByName('AddGatherTotalPrice').AsFloat - ARec.ValueByName('AddCutTotalPrice').AsFloat);
  429. zgDealProperty.Cells[2, 1].Text := FloatToStr(fHasPay);
  430. zgDealProperty.Cells[2, 1].Align := gaCenterRight;
  431. zgDealProperty.ColWidths[2] := 80;
  432. zgDealProperty.Cells[3, 0].Text := '累计已支付';
  433. zgDealProperty.Cells[3, 1].Text := ARec.ValueByName('AddPayTotalPrice').AsString;
  434. zgDealProperty.Cells[3, 1].Align := gaCenterRight;
  435. zgDealProperty.ColWidths[3] := 80;
  436. zgDealProperty.Cells[4, 0].Text := '待支付';
  437. fNotPay := TotalPriceRoundTo(fHasPay - ARec.ValueByName('AddPayTotalPrice').AsFloat);
  438. zgDealProperty.Cells[4, 1].Text := FloatToStr(fNotPay);
  439. zgDealProperty.Cells[4, 1].Align := gaCenterRight;
  440. zgDealProperty.ColWidths[4] := 80;
  441. zgDealProperty.OnCellTextChanged := zgDealPropertyCellTextChanged;
  442. end;
  443. procedure TBillsMeasureFrame.zgDealPropertyCellGetFont(Sender: TObject;
  444. ACoord: TPoint; AFont: TFont);
  445. begin
  446. if ((ACoord.X = 2) or (ACoord.X = 4)) and (ACoord.Y = 1) then
  447. AFont.Color := clGrayText;
  448. end;
  449. procedure TBillsMeasureFrame.zgDealPropertyCellTextChanged(Sender: TObject;
  450. Col, Row: Integer);
  451. procedure ModifyField(ARec: TsdDataRecord; const AField: string; ACell: TzjCell);
  452. var
  453. fValue, fHasPay, fNotPay: Double;
  454. begin
  455. if (ACell.Text = '') or TryStrToFloat(ACell.Text, fValue) then
  456. begin
  457. ARec.ValueByName(AField).AsString := ACell.Text;
  458. // 更新显示应支付&待支付数据
  459. fHasPay := TotalPriceRoundTo(
  460. ARec.ValueByName('AddGatherTotalPrice').AsFloat - ARec.ValueByName('AddCutTotalPrice').AsFloat);
  461. zgDealProperty.Cells[2, 1].Text := FloatToStr(fHasPay);
  462. fNotPay := TotalPriceRoundTo(fHasPay - ARec.ValueByName('AddPayTotalPrice').AsFloat);
  463. zgDealProperty.Cells[4, 1].Text := FloatToStr(fNotPay);
  464. end
  465. else
  466. begin
  467. ErrorMessage('只允许输入数字!!');
  468. ACell.Text := ARec.ValueByName(AField).AsString;
  469. end;
  470. end;
  471. var
  472. Rec: TsdDataRecord;
  473. begin
  474. Rec := stdBillsMeasure.IDTree.Selected.Rec;
  475. case Col of
  476. 0: Rec.ValueByName('DealType').AsString := zgDealProperty.Cells[Col, Row].Text;
  477. 1: ModifyField(Rec, 'AddCutTotalPrice', zgDealProperty.Cells[Col, Row]);
  478. 3: ModifyField(Rec, 'AddPayTotalPrice', zgDealProperty.Cells[Col, Row]);
  479. end;
  480. end;
  481. procedure TBillsMeasureFrame.zgDealPropertyCellCanEdit(Sender: TObject;
  482. const ACoord: TPoint; var Allow: Boolean);
  483. begin
  484. Allow := (ACoord.X = 0) or (ACoord.X = 1) or (ACoord.X = 3);
  485. end;
  486. procedure TBillsMeasureFrame.SetShowAlias(const Value: Boolean);
  487. begin
  488. FShowAlias := Value;
  489. stdBillsMeasure.Column('Alias').Visible := FShowAlias;
  490. end;
  491. procedure TBillsMeasureFrame.actnSetStageBookmarkUpdate(Sender: TObject);
  492. begin
  493. TAction(Sender).Enabled := TProjectData(FBillsMeasureData.ProjectData).ProjProperties.PhaseCount > 0;
  494. end;
  495. procedure TBillsMeasureFrame.ExpandNodeTo(ALevel: Integer);
  496. begin
  497. BeginExpandNode;
  498. try
  499. FBillsMeasureData.ExpandNodeTo(ALevel);
  500. finally
  501. EndExpandNode;
  502. end;
  503. end;
  504. procedure TBillsMeasureFrame.ExpandXmjNode;
  505. begin
  506. BeginExpandNode;
  507. try
  508. FBillsMeasureData.ExpandXmjNode;
  509. finally
  510. EndExpandNode;
  511. end;
  512. end;
  513. procedure TBillsMeasureFrame.BeginExpandNode;
  514. begin
  515. zgBillsMeasure.BeginUpdate;
  516. zgBillsMeasure.OnCellGetColor := nil;
  517. BeginUpdateWindow(zgBillsMeasure.Handle);
  518. stdBillsMeasure.DisableControl;
  519. end;
  520. procedure TBillsMeasureFrame.EndExpandNode;
  521. begin
  522. stdBillsMeasure.EnableControl;
  523. EndUpdateWindow(zgBillsMeasure.Handle);
  524. zgBillsMeasure.OnCellGetColor := zgBillsMeasureCellGetColor;
  525. zgBillsMeasure.EndUpdate;
  526. end;
  527. procedure TBillsMeasureFrame.ExpandCurPhase;
  528. begin
  529. BeginExpandNode;
  530. try
  531. FBillsMeasureData.ExpandCurPhase;
  532. finally
  533. EndExpandNode;
  534. end;
  535. end;
  536. procedure TBillsMeasureFrame.RefreshPhase_Stage;
  537. begin
  538. with TProjectData(FBillsMeasureData.ProjectData) do
  539. begin
  540. ResetPhaseDataReadOnly(StageDataReadOnly);
  541. ResetBaseDataReadOnly(BaseDataReadOnly);
  542. ResetAllowInsert(AllowInsert);
  543. end;
  544. zgBillsMeasure.Invalidate;
  545. end;
  546. procedure TBillsMeasureFrame.ResetPhaseDataReadOnly(AReadOnly: Boolean);
  547. begin
  548. stdBillsMeasure.Column('CurDealQuantity').ReadOnly := AReadOnly;
  549. stdBillsMeasure.Column('CurQcQuantity').ReadOnly := AReadOnly;
  550. stdBillsMeasure.Column('CurPcQuantity').ReadOnly := AReadOnly;
  551. end;
  552. procedure TBillsMeasureFrame.ResetBaseDataReadOnly(AReadOnly: Boolean);
  553. begin
  554. stdBillsMeasure.Column('Code').ReadOnly := AReadOnly;
  555. stdBillsMeasure.Column('B_Code').ReadOnly := AReadOnly;
  556. stdBillsMeasure.Column('Name').ReadOnly := AReadOnly;
  557. stdBillsMeasure.Column('Units').ReadOnly := AReadOnly;
  558. stdBillsMeasure.Column('Price').ReadOnly := AReadOnly;
  559. stdBillsMeasure.Column('NewPrice').ReadOnly := AReadOnly;
  560. stdBillsMeasure.Column('DrawingCode').ReadOnly := AReadOnly;
  561. end;
  562. procedure TBillsMeasureFrame.ResetAllowInsert(AAllow: Boolean);
  563. begin
  564. if AAllow then
  565. stdBillsMeasure.Options := stdBillsMeasure.Options + [aoAllowInsert]
  566. else
  567. stdBillsMeasure.Options := stdBillsMeasure.Options - [aoAllowInsert];
  568. end;
  569. procedure TBillsMeasureFrame.SetPMFieldVisible(AValue: Boolean);
  570. begin
  571. FShowAddField := AValue;
  572. stdBillsMeasure.Column('PM_PreTotalPrice').Visible := AValue;
  573. stdBillsMeasure.Column('PM_TotalPrice').Visible := AValue;
  574. stdBillsMeasure.Column('PM_AddTotalPrice').Visible := AValue;
  575. end;
  576. procedure TBillsMeasureFrame.ExpandMouseDown(AGridCell: TzjCell);
  577. procedure CommonExpand(vNode: TsdIDTreeNode);
  578. begin
  579. AGridCell.Grid.BeginUpdate;
  580. vNode.Expanded := not vNode.Expanded;
  581. AGridCell.Grid.EndUpdate;
  582. AGridCell.Grid.InvalidateView(AGridCell.ViewRect);
  583. end;
  584. procedure QuikExpand(vNode: TsdIDTreeNode);
  585. begin
  586. Screen.Cursor := crHourGlass;
  587. BeginExpandNode;
  588. try
  589. vNode.Expanded := not vNode.Expanded;
  590. finally
  591. EndExpandNode;
  592. Screen.Cursor := crDefault;
  593. end;
  594. end;
  595. var
  596. stnNode: TsdIDTreeNode;
  597. begin
  598. stnNode := TsdIDTreeCell(AGridCell).TreeNode;
  599. if stnNode.PosterityCount > 10000 then
  600. QuikExpand(stnNode)
  601. else
  602. CommonExpand(stnNode);
  603. end;
  604. end.