PriceMarginBillsDm.pas 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. unit PriceMarginBillsDm;
  2. interface
  3. uses
  4. SysUtils, Classes, sdDB, sdProvider, BillsTree, mDataRecord,
  5. GclBillsGatherModel, DB, CalcDecimal;
  6. type
  7. TPriceMarginBillsData = class(TDataModule)
  8. sdmpGclBills: TsdMemoryProvider;
  9. sddGclBills: TsdDataSet;
  10. sdmpDetailGclBills: TsdMemoryProvider;
  11. sddDetailGclBills: TsdDataSet;
  12. sdvGclBills: TsdDataView;
  13. sdvDetailGclBills: TsdDataView;
  14. sdvDetailGL: TsdDataView;
  15. procedure sdvGclBillsCurrentChanged(ARecord: TsdDataRecord);
  16. procedure sdvDetailGclBillsFilterRecord(ARecord: TsdDataRecord;
  17. var Allow: Boolean);
  18. procedure sdvDetailGLFilterRecord(ARecord: TsdDataRecord;
  19. var Allow: Boolean);
  20. procedure sdvDetailGclBillsCurrentChanged(ARecord: TsdDataRecord);
  21. procedure sdvDetailGLAfterValueChanged(AValue: TsdValue);
  22. procedure sdvDetailGclBillsGetText(var Text: String;
  23. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  24. DisplayText: Boolean);
  25. procedure sdvDetailGLAfterDeleteRecord(ARecord: TsdDataRecord);
  26. procedure sdvGclBillsGetText(var Text: String; ARecord: TsdDataRecord;
  27. AValue: TsdValue; AColumn: TsdViewColumn; DisplayText: Boolean);
  28. procedure sdvDetailGLSetText(var Text: String; ARecord: TsdDataRecord;
  29. AValue: TsdValue; AColumn: TsdViewColumn; var Allow: Boolean);
  30. private
  31. FProjectData: TObject;
  32. procedure WriteGclBillsData(AGcls, AXmjs: TList);
  33. procedure CalculateRela(ARec: TDetailGLRecord);
  34. function GetMainBillsTree: TBillsIDTree;
  35. function GetDecimal: TCalcDecimal;
  36. public
  37. constructor Create(AProjectData: TObject);
  38. destructor Destroy; override;
  39. procedure RefreshBills;
  40. procedure AddDetailGLs(AGls: TList);
  41. procedure RefreshDetailBills(ABillsID: Integer);
  42. procedure RefreshAllDetailBills;
  43. property ProjectData: TObject read FProjectData;
  44. property MainBillsTree: TBillsIDTree read GetMainBillsTree;
  45. property Decimal: TCalcDecimal read GetDecimal;
  46. end;
  47. implementation
  48. uses
  49. ZhAPI, ProjectData, UtilMethods, sdIDTree, StageDm;
  50. {$R *.dfm}
  51. { TPriceMarginBillsData }
  52. constructor TPriceMarginBillsData.Create(AProjectData: TObject);
  53. begin
  54. inherited Create(nil);
  55. FProjectData := AProjectData;
  56. sddGclBills.Open;
  57. if not Assigned(sddGclBills.FindIndex('idxIndexCode')) then
  58. sddGclBills.AddIndex('idxIndexCode', 'IndexCode');
  59. sdvGclBills.Open;
  60. sdvGclBills.IndexName := 'idxIndexCode';
  61. sddDetailGclBills.Open;
  62. if not Assigned(sddDetailGclBills.FindIndex('idxSerialNo')) then
  63. sddDetailGclBills.AddIndex('idxSerialNo', 'BillsID;TreeSerialNo');
  64. if not Assigned(sddDetailGclBills.FindIndex('idxRelaBills')) then
  65. sddDetailGclBills.AddIndex('idxRelaBills', 'RelaBillsID');
  66. sdvDetailGclBills.Open;
  67. sdvDetailGclBills.IndexName := 'idxSerialNo';
  68. sdvDetailGL.DataSet := TProjectData(FProjectData).DetailGLData.sddDetailGL;
  69. sdvDetailGL.IndexName := 'idxView';
  70. sdvDetailGL.Columns.FindColumn('Name').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  71. sdvDetailGL.Columns.FindColumn('Units').LookupDataSet := TProjectData(FProjectData).ProjectGLData.sddProjectGL;
  72. end;
  73. destructor TPriceMarginBillsData.Destroy;
  74. begin
  75. inherited;
  76. end;
  77. procedure TPriceMarginBillsData.RefreshBills;
  78. var
  79. vGather: TGclGatherModel;
  80. begin
  81. vGather := TGclGatherModel.Create(FProjectData);
  82. try
  83. vGather.WriteGatherData := WriteGclBillsData;
  84. vGather.Execute;
  85. finally
  86. vGather.Free;
  87. end;
  88. end;
  89. procedure TPriceMarginBillsData.WriteGclBillsData(AGcls, AXmjs: TList);
  90. procedure BeforeWrite;
  91. begin
  92. sdvDetailGclBills.Filtered := False;
  93. sdvDetailGL.Filtered := False;
  94. sddGclBills.DisableControls;
  95. sddGclBills.BeginUpdate;
  96. sddGclBills.DeleteAll;
  97. sddDetailGclBills.DisableControls;
  98. sddDetailGclBills.BeginUpdate;
  99. sddDetailGclBills.DeleteAll;
  100. end;
  101. procedure AfterWrite;
  102. var
  103. idx: TsdIndex;
  104. begin
  105. sddDetailGclBills.EndUpdate;
  106. sddDetailGclBills.EnableControls;
  107. sddGclBills.EndUpdate;
  108. sddGclBills.EnableControls;
  109. if not sdvDetailGL.Active then
  110. sdvDetailGL.Open;
  111. idx := sddGclBills.FindIndex('idxIndexCode');
  112. sdvGclBills.LocateInControl(sdvGclBills.Records[0]);
  113. sdvDetailGclBills.Filtered := True;
  114. sdvDetailGclBills.LocateInControl(sdvDetailGclBills.Records[0]);
  115. sdvDetailGL.Filtered := True;
  116. sdvDetailGclBills.LocateInControl(sdvDetailGclBills.Records[0]);
  117. end;
  118. procedure WriteDetailGclNode(AGclNode: TGclNode);
  119. var
  120. iDetailGcl: Integer;
  121. vDetailGcl: TDetailGclNode;
  122. Rec: TsdDataRecord;
  123. begin
  124. for iDetailGcl := 0 to AGclNode.DetailGclCount -1 do
  125. begin
  126. vDetailGcl := AGclNode.DetailGcl[iDetailGcl];
  127. Rec := sddDetailGclBills.Add;
  128. Rec.ValueByName('ID').AsInteger := vDetailGcl.ID;
  129. Rec.ValueByName('BillsID').AsInteger := AGclNode.ID;
  130. Rec.ValueByName('TreeSerialNo').AsInteger := vDetailGcl.TreeSerialNo;
  131. Rec.ValueByName('RelaBillsID').AsInteger := vDetailGcl.BillsID;
  132. if Assigned(vDetailGcl.LeafXmj) then
  133. begin
  134. Rec.ValueByName('LeafXmjID').AsInteger := vDetailGcl.LeafXmj.ID;
  135. Rec.ValueByName('XmjCode').AsString := vDetailGcl.LeafXmj.XmjCode;
  136. Rec.ValueByName('XmjName').AsString := vDetailGcl.LeafXmj.XmjName;
  137. Rec.ValueByName('XmjUnits').AsString := vDetailGcl.LeafXmj.XmjUnits;
  138. Rec.ValueByName('NameDanWei').AsString := vDetailGcl.LeafXmj.NameDanWei;
  139. Rec.ValueByName('NameFenXiang').AsString := vDetailGcl.LeafXmj.NameFenXiang;
  140. Rec.ValueByName('NameFenBu').AsString := vDetailGcl.LeafXmj.NameFenBu;
  141. Rec.ValueByName('NameUnit').AsString := vDetailGcl.LeafXmj.NameUnit;
  142. Rec.ValueByName('Peg').AsString := vDetailGcl.LeafXmj.Peg;
  143. Rec.ValueByName('Position').AsString := vDetailGcl.LeafXmj.Position;
  144. Rec.ValueByName('DrawingCode').AsString := vDetailGcl.LeafXmj.DrawingCode;
  145. end;
  146. Rec.ValueByName('CurDealQuantity').AsFloat := vDetailGcl.CurDealQuantity;
  147. Rec.ValueByName('CurQcQuantity').AsFloat := vDetailGcl.CurQcQuantity;
  148. Rec.ValueByName('CurGatherQuantity').AsFloat := vDetailGcl.CurGatherQuantity;
  149. Rec.ValueByName('PM_PreTotalPrice').AsFloat := vDetailGcl.PM_PreTotalPrice;
  150. Rec.ValueByName('PM_TotalPrice').AsFloat := vDetailGcl.PM_TotalPrice;
  151. end;
  152. end;
  153. procedure WriteGclNode(AGclNode: TGclNode);
  154. var
  155. Rec: TsdDataRecord;
  156. begin
  157. Rec := sddGclBills.Add;
  158. Rec.ValueByName('ID').AsInteger := AGclNode.ID;
  159. Rec.ValueByName('B_Code').AsString := AGclNode.B_Code;
  160. Rec.ValueByName('IndexCode').AsString := AGclNode.IndexCode;
  161. Rec.ValueByName('Name').AsString := AGclNode.Name;
  162. Rec.ValueByName('Units').AsString := AGclNode.Units;
  163. Rec.ValueByName('Price').AsFloat := AGclNode.Price;
  164. Rec.ValueByName('CurDealQuantity').AsFloat := AGclNode.CurDealQuantity;
  165. Rec.ValueByName('CurQcQuantity').AsFloat := AGclNode.CurQcQuantity;
  166. Rec.ValueByName('CurGatherQuantity').AsFloat := AGclNode.CurGatherQuantity;
  167. WriteDetailGclNode(AGclNode);
  168. end;
  169. var
  170. iGcl: Integer;
  171. vGclNode: TGclNode;
  172. begin
  173. BeforeWrite;
  174. try
  175. for iGcl := 0 to AGcls.Count - 1 do
  176. begin
  177. vGclNode := TGclNode(AGcls.Items[iGcl]);
  178. WriteGclNode(vGclNode);
  179. end;
  180. finally
  181. AfterWrite;
  182. end;
  183. end;
  184. procedure TPriceMarginBillsData.sdvGclBillsCurrentChanged(
  185. ARecord: TsdDataRecord);
  186. begin
  187. sdvDetailGclBills.RefreshFilter;
  188. sdvDetailGclBills.LocateInControl(sdvDetailGclBills.Records[0]);
  189. end;
  190. procedure TPriceMarginBillsData.sdvDetailGclBillsFilterRecord(
  191. ARecord: TsdDataRecord; var Allow: Boolean);
  192. begin
  193. if Assigned(sdvGclBills.Current) and Assigned(ARecord) then
  194. Allow := ARecord.ValueByName('BillsID').AsInteger = sdvGclBills.Current.ValueByName('ID').AsInteger
  195. else
  196. Allow := False;
  197. end;
  198. procedure TPriceMarginBillsData.sdvDetailGLFilterRecord(
  199. ARecord: TsdDataRecord; var Allow: Boolean);
  200. begin
  201. if Assigned(sdvDetailGclBills.Current) and Assigned(ARecord) then
  202. Allow := ARecord.ValueByName('BillsID').AsInteger = sdvDetailGclBills.Current.ValueByName('RelaBillsID').AsInteger
  203. else
  204. Allow := False;
  205. end;
  206. function TPriceMarginBillsData.GetMainBillsTree: TBillsIDTree;
  207. begin
  208. Result := TProjectData(FProjectData).BillsMeasureData.BillsMeasureTree;
  209. end;
  210. procedure TPriceMarginBillsData.AddDetailGLs(AGls: TList);
  211. begin
  212. TProjectData(FProjectData).DetailGLData.AddDetailGLs(
  213. sdvDetailGclBills.Current.ValueByName('RelaBillsID').AsInteger, AGls);
  214. sdvDetailGL.RefreshFilter;
  215. end;
  216. procedure TPriceMarginBillsData.sdvDetailGclBillsCurrentChanged(
  217. ARecord: TsdDataRecord);
  218. begin
  219. sdvDetailGL.RefreshFilter;
  220. end;
  221. procedure TPriceMarginBillsData.RefreshDetailBills(ABillsID: Integer);
  222. var
  223. Rec: TsdDataRecord;
  224. StageRec: TStageRecord;
  225. begin
  226. Rec := sddDetailGclBills.FindKey('idxRelaBills', ABillsID);
  227. if not Assigned(Rec) then Exit;
  228. StageRec := TProjectData(FProjectData).PhaseData.StageData.StageRecord(ABillsID);
  229. if Assigned(StageRec) then
  230. Rec.ValueByName('PM_TotalPrice').AsFloat := StageRec.PM_TotalPrice.AsFloat
  231. else
  232. Rec.ValueByName('PM_TotalPrice').AsFloat := 0;
  233. end;
  234. procedure TPriceMarginBillsData.sdvDetailGLAfterValueChanged(
  235. AValue: TsdValue);
  236. var
  237. Rec: TDetailGLRecord;
  238. begin
  239. if SameText(AValue.FieldName, 'Quantity') then
  240. begin
  241. Rec := TDetailGLRecord(AValue.Owner);
  242. CalculateRela(Rec);
  243. end;
  244. end;
  245. procedure TPriceMarginBillsData.sdvDetailGclBillsGetText(var Text: String;
  246. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  247. DisplayText: Boolean);
  248. procedure GetDisplayText;
  249. begin
  250. if ((Pos('Price', AColumn.FieldName) > 0) or
  251. (Pos('Quantity', AColumn.FieldName) > 0)) then
  252. begin
  253. if AValue.AsFloat = 0 then
  254. Text := '';
  255. end;
  256. end;
  257. begin
  258. if DisplayText then
  259. GetDisplayText;
  260. end;
  261. procedure TPriceMarginBillsData.sdvDetailGLAfterDeleteRecord(
  262. ARecord: TsdDataRecord);
  263. var
  264. Rec: TDetailGLRecord;
  265. iLeafXmjID: Integer;
  266. begin
  267. Rec := TDetailGLRecord(ARecord);
  268. with TProjectData(FProjectData) do
  269. begin
  270. iLeafXmjID := BillsCompileData.GetLeafXmjParentID(Rec.BillsID.AsInteger);
  271. if not DetailGLData.HasXmjDetailGL(iLeafXmjID, Rec.GLID.AsInteger) then
  272. LeafXmjGlData.DeleteLeafXmjGl(iLeafXmjID, Rec.GLID.AsInteger);
  273. end;
  274. if Rec.Quantity.AsFloat <> 0 then
  275. CalculateRela(Rec);
  276. end;
  277. procedure TPriceMarginBillsData.sdvGclBillsGetText(var Text: String;
  278. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  279. DisplayText: Boolean);
  280. procedure GetDisplayText;
  281. begin
  282. if ((Pos('Price', AColumn.FieldName) > 0) or
  283. (Pos('Quantity', AColumn.FieldName) > 0)) then
  284. begin
  285. if AValue.AsFloat = 0 then
  286. Text := '';
  287. end;
  288. end;
  289. begin
  290. if DisplayText then
  291. GetDisplayText;
  292. end;
  293. procedure TPriceMarginBillsData.RefreshAllDetailBills;
  294. var
  295. i: Integer;
  296. Rec: TsdDataRecord;
  297. StageRec: TStageRecord;
  298. begin
  299. for i := 0 to sddDetailGclBills.RecordCount - 1 do
  300. begin
  301. Rec := sddDetailGclBills.Records[i];
  302. with TProjectData(FProjectData).PhaseData.StageData do
  303. StageRec := StageRecord(Rec.ValueByName('RelaBillsID').AsInteger);
  304. if Assigned(StageRec) then
  305. Rec.ValueByName('PM_TotalPrice').AsFloat := StageRec.PM_TotalPrice.AsFloat
  306. else
  307. Rec. ValueByName('PM_TotalPrice').AsFloat := 0;
  308. end;
  309. end;
  310. procedure TPriceMarginBillsData.sdvDetailGLSetText(var Text: String;
  311. ARecord: TsdDataRecord; AValue: TsdValue; AColumn: TsdViewColumn;
  312. var Allow: Boolean);
  313. begin
  314. if AValue.DataType in [ftInteger, ftFloat] then
  315. if not CheckNumeric(Text) then
  316. Text := '';
  317. if SameText(AValue.FieldName, 'Quantity') then
  318. Text := Decimal.Quantity.StrRoundTo(Text);
  319. end;
  320. function TPriceMarginBillsData.GetDecimal: TCalcDecimal;
  321. begin
  322. Result := TProjectData(FProjectData).ProjProperties.DecimalManager.PriceMargin;
  323. end;
  324. procedure TPriceMarginBillsData.CalculateRela(ARec: TDetailGLRecord);
  325. var
  326. iLeafXmjID: Integer;
  327. begin
  328. with TProjectData(FProjectData) do
  329. begin
  330. // 更新最底层项目节
  331. iLeafXmjID := BillsCompileData.GetLeafXmjParentID(ARec.BillsID.AsInteger);
  332. LeafXmjGlData.CalculateLeafXmjGL(iLeafXmjID, ARec.GLID.AsInteger);
  333. end;
  334. // 更新调差工料--本期价差
  335. with TProjectData(FProjectData).ProjectGLData do
  336. CalculateGL_PM(ARec.GLID.AsInteger);
  337. // 更新清单调差数据,材料调差节点数据
  338. with TProjectData(FProjectData).PhaseData.StageData do
  339. begin
  340. CalculatePriceMargin(ARec.BillsID.AsInteger);
  341. //CalculatePriceMarginNode;
  342. CalculateMaterialNode;
  343. end;
  344. // 更新价差清单内存表信息
  345. with TProjectData(FProjectData).PriceMarginBillsData do
  346. RefreshDetailBills(ARec.BillsID.AsInteger);
  347. // 更新合同支付
  348. //TProjectData(FProjectData).PhaseData.PhasePayData.CalculateAll;
  349. // 更新合计值
  350. TProjectData(FProjectData).ProjectGLData.RefreshGatherData;
  351. end;
  352. end.