BillsMeasureFme.pas 28 KB

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