BillsMeasureFme.pas 26 KB

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