rmWeiWuZjjlGatherDm.pas 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. unit rmWeiWuZjjlGatherDm;
  2. interface
  3. uses
  4. SysUtils, Classes, ProjectData, DB, sdDB, DBClient, sdIDTree, BillsTree;
  5. type
  6. TZjjl = class
  7. private
  8. FCode: string;
  9. FCertificateCode: string;
  10. FBGLCode: string;
  11. FPegName: string;
  12. FBeginPeg: string;
  13. FEndPeg: string;
  14. FFBFXName: string;
  15. FUnitName: string;
  16. FDrawingCode: string;
  17. FFormulaMemo: string;
  18. FRelaFile: string;
  19. FBillsCode: string;
  20. FBillsName: string;
  21. FBillsUnits: string;
  22. FBillsPrice: Double;
  23. FFilterDrawingCode: string;
  24. FBillsCurDealQuantity: Double;
  25. FBillsCurDealTotalPrice: Double;
  26. FBillsCurQcQuantity: Double;
  27. FBillsCurQcTotalPrice: Double;
  28. FBillsCurGatherQuantity: Double;
  29. FBillsCurGatherTotalPrice: Double;
  30. FBillsEndDealQuantity: Double;
  31. FBillsEndDealTotalPrice: Double;
  32. FBillsEndQcQuantity: Double;
  33. FBillsEndQcTotalPrice: Double;
  34. FBillsEndGatherQuantity: Double;
  35. FBillsEndGatherTotalPrice: Double;
  36. FBillsOrgQuantity: Double;
  37. FBillsOrgTotalPrice: Double;
  38. FBillsMisQuantity: Double;
  39. FBillsMisTotalPrice: Double;
  40. FBillsOthQuantity: Double;
  41. FBillsOthTotalPrice: Double;
  42. FBillsQuantity: Double;
  43. FBillsTotalPrice: Double;
  44. FFenBuName: string;
  45. FDanWeiName: string;
  46. function MergeStr(AStr1, AStr2: string): string;
  47. public
  48. constructor Create(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);
  49. procedure Merge(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);
  50. end;
  51. TrmWeiWuZjjlGatherData = class(TDataModule)
  52. cdsZjjl: TClientDataSet;
  53. cdsZjjlCode: TWideStringField;
  54. cdsZjjlCertificateCode: TWideStringField;
  55. cdsZjjlBGLCode: TMemoField;
  56. cdsZjjlPegName: TWideStringField;
  57. cdsZjjlBeginPeg: TWideStringField;
  58. cdsZjjlEndPeg: TWideStringField;
  59. cdsZjjlFBFXName: TWideStringField;
  60. cdsZjjlUnitName: TWideStringField;
  61. cdsZjjlDrawingCode: TWideStringField;
  62. cdsZjjlFormulaMemo: TMemoField;
  63. cdsZjjlRelaFile: TMemoField;
  64. cdsZjjlBillsCode: TStringField;
  65. cdsZjjlBillsName: TWideStringField;
  66. cdsZjjlBillsUnits: TWideStringField;
  67. cdsZjjlBillsPrice: TFloatField;
  68. cdsZjjlFilterDrawingCode: TWideStringField;
  69. cdsZjjlBillsCurDealQuantity: TFloatField;
  70. cdsZjjlBillsCurDealTotalPrice: TFloatField;
  71. cdsZjjlBillsCurQcQuantity: TFloatField;
  72. cdsZjjlBillsCurQcTotalPrice: TFloatField;
  73. cdsZjjlBillsCurGatherQuantity: TFloatField;
  74. cdsZjjlBillsCurGatherTotalPrice: TFloatField;
  75. cdsZjjlBillsEndDealQuantity: TFloatField;
  76. cdsZjjlBillsEndDealTotalPrice: TFloatField;
  77. cdsZjjlBillsEndQcQuantity: TFloatField;
  78. cdsZjjlBillsEndQcTotalPrice: TFloatField;
  79. cdsZjjlBillsEndGatherQuantity: TFloatField;
  80. cdsZjjlBillsEndGatherTotalPrice: TFloatField;
  81. cdsZjjlBillsOrgQuantity: TFloatField;
  82. cdsZjjlBillsOrgTotalPrice: TFloatField;
  83. cdsZjjlBillsMisQuantity: TFloatField;
  84. cdsZjjlBillsMisTotalPrice: TFloatField;
  85. cdsZjjlBillsOthQuantity: TFloatField;
  86. cdsZjjlBillsOthTotalPrice: TFloatField;
  87. cdsZjjlBillsQuantity: TFloatField;
  88. cdsZjjlBillsTotalPrice: TFloatField;
  89. cdsZjjlFenBuName: TWideStringField;
  90. cdsZjjlDanWeiName: TWideStringField;
  91. private
  92. FZjjlList: TList;
  93. function FindZjjl(ARec: TsdDataRecord; ANode: TBillsIDTreeNode): TZjjl;
  94. procedure GatherZjjl(AProjectData: TProjectData);
  95. procedure WriteData;
  96. public
  97. function AssignData(AProjectData: TProjectData): TDataSet;
  98. end;
  99. implementation
  100. uses
  101. ZhAPI, PhaseData, UtilMethods, BillsMeasureDm;
  102. {$R *.dfm}
  103. function GetThirdPartString(const AStr: string; AFilter: Char = '-'): string;
  104. var
  105. sgs: TStringList;
  106. begin
  107. sgs := TStringList.Create;
  108. try
  109. sgs.Delimiter := AFilter;
  110. sgs.DelimitedText := AStr;
  111. while sgs.Count > 2 do
  112. sgs.Delete(sgs.Count - 1);
  113. Result := sgs.DelimitedText;
  114. finally
  115. sgs.Free;
  116. end;
  117. end;
  118. function GetLeafXmj(ANode: TBillsIDTreeNode): TBillsIDTreeNode;
  119. begin
  120. Result := ANode;
  121. while Assigned(Result) and (Result.Rec.B_Code.AsString <> '') do
  122. Result := TBillsIDTreeNode(Result.Parent);
  123. end;
  124. function GetLeafXmjDrawingCode(ANode: TBillsIDTreeNode): String;
  125. var
  126. vLeafXmj: TsdIDTreeNode;
  127. begin
  128. Result := '';
  129. vLeafXmj := GetLeafXmj(ANode);
  130. if Assigned(vLeafXmj) then
  131. Result := vLeafXmj.Rec.ValueByName('DrawingCode').AsString;
  132. end;
  133. { TZjjl }
  134. constructor TZjjl.Create(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);
  135. // 取树结构的第ALevel层节点的名称(level从0开始)
  136. function GetNameByLevel(ANode: TBillsIDTreeNode; ALevel: Integer): string;
  137. begin
  138. Result := '';
  139. if not Assigned(ANode) then Exit;
  140. if ANode.Level = ALevel then
  141. Result := ANode.Rec.Name.AsString
  142. else if ANode.Level > ALevel then
  143. Result := GetNameByLevel(TBillsIDTreeNode(ANode.Parent), ALevel);
  144. end;
  145. function GetNameDanWei(ANode: TBillsIDTreeNode): string;
  146. begin
  147. // 取树结构的第二层节点的名称
  148. Result := GetNameByLevel(ANode, 1);
  149. end;
  150. // ANode为计量单元节点,APegNode为桩号节点
  151. function GetNameFenBu(ANode, APegNode: TBillsIDTreeNode): string;
  152. var
  153. vCurNode: TBillsIDTreeNode;
  154. begin
  155. // 如果计量单元节点的名称为桩号(转化为判断计量单元节点与桩号节点为同一个)
  156. if not Assigned(APegNode) or (ANode.ID = APegNode.ID) then
  157. // 取树结构的第三层节点的名称
  158. Result := GetNameByLevel(ANode, 2)
  159. // 否则,取桩号节点的子节点的名称
  160. else
  161. begin
  162. vCurNode := ANode;
  163. while vCurNode.Level > APegNode.Level + 1 do
  164. vCurNode := TBillsIDTreeNode(vCurNode.Parent);
  165. Result := vCurNode.Rec.Name.AsString;
  166. end;
  167. end;
  168. function GetPegNode(ANode: TBillsIDTreeNode): TBillsIDTreeNode;
  169. begin
  170. Result := nil;
  171. if not Assigned(ANode) then Exit;
  172. if CheckPeg(ANode.Rec.Name.AsString) then
  173. Result := ANode
  174. else
  175. Result := GetPegNode(TBillsIDTreeNode(ANode.Parent));
  176. end;
  177. var
  178. vLeafXmj, vPegNode: TBillsIDTreeNode;
  179. begin
  180. FCode := ARec.ValueByName('Code').AsString;
  181. FCertificateCode := ARec.ValueByName('CertificateCode').AsString;
  182. FBGLCode := ARec.ValueByName('BGLCode').AsString;
  183. FPegName := ARec.ValueByName('PegName').AsString;
  184. FBeginPeg := ARec.ValueByName('BeginPeg').AsString;
  185. FEndPeg := ARec.ValueByName('EndPeg').AsString;
  186. FFBFXName := ARec.ValueByName('FBFXName').AsString;
  187. FUnitName := ARec.ValueByName('UnitName').AsString;
  188. FDrawingCode := ARec.ValueByName('DrawingCode').AsString;
  189. FFormulaMemo := ARec.ValueByName('FormulaMemo').AsString;
  190. FRelaFile := ARec.ValueByName('RelaFile').AsString;
  191. FBillsCode := ANode.Rec.ValueByName('B_Code').AsString;
  192. FBillsName := ANode.Rec.ValueByName('Name').AsString;
  193. FBillsUnits := ANode.Rec.ValueByName('Units').AsString;
  194. FBillsPrice := ANode.Rec.ValueByName('Price').AsFloat;
  195. FFilterDrawingCode := GetThirdPartString(GetLeafXmjDrawingCode(ANode));
  196. if Assigned(AStageRec) then
  197. begin
  198. FBillsCurDealQuantity := AStageRec.ValueByName('DealQuantity').AsFloat;
  199. FBillsCurDealTotalPrice := AStageRec.ValueByName('DealTotalPrice').AsFloat;
  200. FBillsCurQcQuantity := AStageRec.ValueByName('QcQuantity').AsFloat;
  201. FBillsCurQcTotalPrice := AStageRec.ValueByName('QcTotalPrice').AsFloat;
  202. FBillsCurGatherQuantity := AStageRec.ValueByName('GatherQuantity').AsFloat;
  203. FBillsCurGatherTotalPrice := AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  204. FBillsEndDealQuantity := AStageRec.ValueByName('DealQuantity').AsFloat;
  205. FBillsEndDealTotalPrice := AStageRec.ValueByName('DealTotalPrice').AsFloat;
  206. FBillsEndQcQuantity := AStageRec.ValueByName('QcQuantity').AsFloat;
  207. FBillsEndQcTotalPrice := AStageRec.ValueByName('QcTotalPrice').AsFloat;
  208. FBillsEndGatherQuantity := AStageRec.ValueByName('GatherQuantity').AsFloat;
  209. FBillsEndGatherTotalPrice := AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  210. end;
  211. FBillsOrgQuantity := ANode.Rec.OrgQuantity.AsFloat;
  212. FBillsOrgTotalPrice := ANode.Rec.OrgTotalPrice.AsFloat;
  213. FBillsMisQuantity := ANode.Rec.MisQuantity.AsFloat;
  214. FBillsMisTotalPrice := ANode.Rec.MisTotalPrice.AsFloat;
  215. FBillsOthQuantity := ANode.Rec.OthQuantity.AsFloat;
  216. FBillsOthTotalPrice := ANode.Rec.OthTotalPrice.AsFloat;
  217. FBillsQuantity := ANode.Rec.Quantity.AsFloat;
  218. FBillsTotalPrice := ANode.Rec.TotalPrice.AsFloat;
  219. vLeafXmj := GetLeafXmj(ANode);
  220. vPegNode := GetPegNode(ANode);
  221. FFenBuName := GetNameFenBu(vLeafXmj, vPegNode);
  222. FDanWeiName := GetNameDanWei(vLeafXmj);
  223. end;
  224. procedure TZjjl.Merge(ARec, AStageRec: TsdDataRecord; ANode: TBillsIDTreeNode);
  225. begin
  226. FCertificateCode := MergeStr(FCertificateCode, ARec.ValueByName('CertificateCode').AsString);
  227. FBGLCode := MergeRelaBGL(FBGLCode, ARec.ValueByName('BGLCode').AsString);
  228. FDrawingCode := MergeStr(FDrawingCode, ARec.ValueByName('DrawingCode').AsString);
  229. FFormulaMemo := MergeStr(FFormulaMemo, ARec.ValueByName('FormulaMemo').AsString);
  230. FRelaFile := MergeStr(FRelaFile, ARec.ValueByName('RelaFile').AsString);
  231. if Assigned(AStageRec) then
  232. begin
  233. FBillsCurDealQuantity := FBillsCurDealQuantity + AStageRec.ValueByName('DealQuantity').AsFloat;
  234. FBillsCurDealTotalPrice := FBillsCurDealTotalPrice + AStageRec.ValueByName('DealTotalPrice').AsFloat;
  235. FBillsCurQcQuantity := FBillsCurQcQuantity + AStageRec.ValueByName('QcQuantity').AsFloat;
  236. FBillsCurQcTotalPrice := FBillsCurQcTotalPrice + AStageRec.ValueByName('QcTotalPrice').AsFloat;
  237. FBillsCurGatherQuantity := FBillsCurGatherQuantity + AStageRec.ValueByName('GatherQuantity').AsFloat;
  238. FBillsCurGatherTotalPrice := FBillsCurGatherTotalPrice + AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  239. FBillsEndDealQuantity := FBillsEndDealQuantity + AStageRec.ValueByName('DealQuantity').AsFloat;
  240. FBillsEndDealTotalPrice := FBillsEndDealTotalPrice + AStageRec.ValueByName('DealTotalPrice').AsFloat;
  241. FBillsEndQcQuantity := FBillsEndQcQuantity + AStageRec.ValueByName('QcQuantity').AsFloat;
  242. FBillsEndQcTotalPrice := FBillsEndQcTotalPrice + AStageRec.ValueByName('QcTotalPrice').AsFloat;
  243. FBillsEndGatherQuantity := FBillsEndGatherQuantity + AStageRec.ValueByName('GatherQuantity').AsFloat;
  244. FBillsEndGatherTotalPrice := FBillsEndGatherTotalPrice + AStageRec.ValueByName('GatherTotalPrice').AsFloat;
  245. end;
  246. FBillsOrgQuantity := FBillsOrgQuantity + ANode.Rec.OrgQuantity.AsFloat;
  247. FBillsOrgTotalPrice := FBillsOrgTotalPrice + ANode.Rec.OrgTotalPrice.AsFloat;
  248. FBillsMisQuantity := FBillsMisQuantity + ANode.Rec.MisQuantity.AsFloat;
  249. FBillsMisTotalPrice := FBillsMisTotalPrice + ANode.Rec.MisTotalPrice.AsFloat;
  250. FBillsOthQuantity := FBillsOthQuantity + ANode.Rec.OthQuantity.AsFloat;
  251. FBillsOthTotalPrice := FBillsOthTotalPrice + ANode.Rec.OthTotalPrice.AsFloat;
  252. FBillsQuantity := FBillsQuantity + ANode.Rec.Quantity.AsFloat;
  253. FBillsTotalPrice := FBillsTotalPrice + ANode.Rec.TotalPrice.AsFloat;
  254. end;
  255. function TZjjl.MergeStr(AStr1, AStr2: string): string;
  256. begin
  257. if (AStr1 <> '') then
  258. begin
  259. if (AStr2 <> '') then
  260. Result := AStr1 + ';' + AStr2
  261. else
  262. Result := AStr1;
  263. end
  264. else
  265. begin
  266. if (AStr2 <> '') then
  267. Result := AStr2
  268. else
  269. Result := '';
  270. end;
  271. end;
  272. { TrmWeiWuZjjlGatherData }
  273. function TrmWeiWuZjjlGatherData.AssignData(
  274. AProjectData: TProjectData): TDataSet;
  275. begin
  276. FZjjlList := TList.Create;
  277. try
  278. if AProjectData.PhaseData.Active then
  279. begin
  280. GatherZjjl(AProjectData);
  281. WriteData;
  282. end;
  283. Result := cdsZjjl;
  284. finally
  285. ClearObjects(FZjjlList);
  286. FZjjlList.Free;
  287. end;
  288. end;
  289. function TrmWeiWuZjjlGatherData.FindZjjl(ARec: TsdDataRecord; ANode: TBillsIDTreeNode): TZjjl;
  290. var
  291. sCode, sName, sUnits, sDrawingCode: string;
  292. fPrice: Double;
  293. i: Integer;
  294. vZ: TZjjl;
  295. begin
  296. sCode := ANode.Rec.ValueByName('B_Code').AsString;
  297. sName := ANode.Rec.ValueByName('Name').AsString;
  298. sUnits := ANode.Rec.ValueByName('Units').AsString;
  299. sDrawingCode := GetThirdPartString(GetLeafXmjDrawingCode(ANode));
  300. fPrice := ANode.Rec.valueByName('Price').AsFloat;
  301. Result := nil;
  302. for i := 0 to FZjjlList.Count - 1 do
  303. begin
  304. vZ := TZjjl(FZjjlList.Items[i]);
  305. if SameText(vZ.FBillsCode, sCode) and SameText(vZ.FBillsName, sName) and SameText(vZ.FBillsUnits, sUnits) and
  306. (PriceRoundTo(fPrice - vZ.FBillsPrice) < 0.00001) and
  307. SameText(sDrawingCode, vZ.FFilterDrawingCode) then
  308. begin
  309. Result := vZ;
  310. Break;
  311. end;
  312. end;
  313. end;
  314. procedure TrmWeiWuZjjlGatherData.GatherZjjl(AProjectData: TProjectData);
  315. var
  316. i: Integer;
  317. vNode: TBillsIDTreeNode;
  318. Rec, BillsRec, StageRec: TsdDataRecord;
  319. vZ: TZjjl;
  320. begin
  321. for i := 0 to AProjectData.PhaseData.ZJJLData.sddZJJL.RecordCount - 1 do
  322. begin
  323. Rec := AProjectData.PhaseData.ZJJLData.sddZJJL.Records[I];
  324. vNode := TBillsIDTreeNode(AProjectData.BillsMeasureData.BillsMeasureTree.FindNode(Rec.ValueByName('BillsID').AsInteger));
  325. StageRec := AProjectData.PhaseData.StageData.StageRecord(Rec.ValueByName('BillsID').AsInteger);
  326. if Assigned(Rec) and Assigned(vNode) then
  327. begin
  328. vZ := FindZjjl(Rec, vNode);
  329. if not Assigned(vZ) then
  330. begin
  331. vZ := TZjjl.Create(Rec, StageRec, vNode);
  332. FZjjlList.Add(vZ);
  333. end
  334. else
  335. vZ.Merge(Rec, StageRec, vNode);
  336. end;
  337. end;
  338. end;
  339. procedure TrmWeiWuZjjlGatherData.WriteData;
  340. var
  341. i: Integer;
  342. vZ: TZjjl;
  343. begin
  344. cdsZjjl.Active := True;
  345. cdsZjjl.EmptyDataSet;
  346. for i := 0 to FZjjlList.Count - 1 do
  347. begin
  348. vZ := TZjjl(FZjjlList.Items[i]);
  349. cdsZjjl.Append;
  350. cdsZjjlCode.AsString := vZ.FCode;
  351. cdsZjjlCertificateCode.AsString := vZ.FCertificateCode;
  352. cdsZjjlBGLCode.AsString := vZ.FBGLCode;
  353. cdsZjjlPegName.AsString := vZ.FPegName;
  354. cdsZjjlBeginPeg.AsString := vZ.FBeginPeg;
  355. cdsZjjlEndPeg.AsString := vZ.FEndPeg;
  356. cdsZjjlFBFXName.AsString := vZ.FFBFXName;
  357. cdsZjjlUnitName.AsString := vZ.FUnitName;
  358. cdsZjjlDrawingCode.AsString := vZ.FDrawingCode;
  359. cdsZjjlFormulaMemo.AsString := vZ.FFormulaMemo;
  360. cdsZjjlRelaFile.AsString := vZ.FRelaFile;
  361. cdsZjjlBillsCode.AsString := vZ.FBillsCode;
  362. cdsZjjlBillsName.AsString := vZ.FBillsName;
  363. cdsZjjlBillsUnits.AsString := vZ.FBillsUnits;
  364. cdsZjjlBillsPrice.AsFloat := vZ.FBillsPrice;
  365. cdsZjjlFilterDrawingCode.AsString := vZ.FFilterDrawingCode;
  366. cdsZjjlBillsCurDealQuantity.AsFloat := vZ.FBillsCurDealQuantity;
  367. cdsZjjlBillsCurDealTotalPrice.AsFloat := vZ.FBillsCurDealTotalPrice;
  368. cdsZjjlBillsCurQcQuantity.AsFloat := vZ.FBillsCurQcQuantity;
  369. cdsZjjlBillsCurQcTotalPrice.AsFloat := vZ.FBillsCurQcTotalPrice;
  370. cdsZjjlBillsCurGatherQuantity.AsFloat := vZ.FBillsCurGatherQuantity;
  371. cdsZjjlBillsCurGatherTotalPrice.AsFloat := vZ.FBillsCurGatherTotalPrice;
  372. cdsZjjlBillsEndDealQuantity.AsFloat := vZ.FBillsEndDealQuantity;
  373. cdsZjjlBillsEndDealTotalPrice.AsFloat := vZ.FBillsEndDealTotalPrice;
  374. cdsZjjlBillsEndQcQuantity.AsFloat := vZ.FBillsEndQcQuantity;
  375. cdsZjjlBillsEndQcTotalPrice.AsFloat := vZ.FBillsEndQcTotalPrice;
  376. cdsZjjlBillsEndGatherQuantity.AsFloat := vZ.FBillsEndGatherQuantity;
  377. cdsZjjlBillsEndGatherTotalPrice.AsFloat := vZ.FBillsEndGatherTotalPrice;
  378. cdsZjjlBillsOrgQuantity.AsFloat := vZ.FBillsOrgQuantity;
  379. cdsZjjlBillsOrgTotalPrice.AsFloat := vZ.FBillsOrgTotalPrice;
  380. cdsZjjlBillsMisQuantity.AsFloat := vZ.FBillsMisQuantity;
  381. cdsZjjlBillsMisTotalPrice.AsFloat := vZ.FBillsMisTotalPrice;
  382. cdsZjjlBillsOthQuantity.AsFloat := vZ.FBillsOthQuantity;
  383. cdsZjjlBillsOthTotalPrice.AsFloat := vZ.FBillsOthTotalPrice;
  384. cdsZjjlBillsQuantity.AsFloat := vZ.FBillsQuantity;
  385. cdsZjjlBillsTotalPrice.AsFloat := vZ.FBillsTotalPrice;
  386. cdsZjjlFenBuName.AsString := vZ.FFenBuName;
  387. cdsZjjlDanWeiName.AsString := vZ.FDanWeiName;
  388. cdsZjjl.Post;
  389. end;
  390. end;
  391. end.