BillsMeasureFme.pas 30 KB

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