ElementalAnalysis.cs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. 
  2. using OTSIncAReportApp.DataOperation.DataAccess;
  3. using OTSIncAReportApp.OTSSampleReportInfo;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using static OTSIncAReportApp.OTSReport_Export;
  11. namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
  12. {
  13. /// <summary>
  14. /// 元素分析
  15. /// </summary>
  16. class ElementalAnalysis
  17. {
  18. /// <summary>
  19. /// 元素分析表(表头、表数据、全数据)
  20. /// </summary>
  21. /// <param name="m_mbszclass"></param>
  22. /// <param name="m_otsreport_export"></param>
  23. /// <returns></returns>
  24. public List<DataTable> GetElementData(BasicData basicData, OTSReport_Export m_otsreport_export,bool lingge)
  25. {
  26. DataTable data = basicData.GetDBData();
  27. //根据sql条件,查询获取颗粒信息数据
  28. DataTable AllAnalysisDetails = new DataTable();
  29. AllAnalysisDetails.TableName = "ElementValue";
  30. AllAnalysisDetails.Columns.Add("Name");
  31. AllAnalysisDetails.Columns.Add("TypeId");
  32. AllAnalysisDetails.Columns.Add("Area", typeof(double));
  33. AllAnalysisDetails.Columns.Add("Class");
  34. for (int i = 0; i < data.Rows.Count; i++)
  35. {
  36. DataRow dr2 = AllAnalysisDetails.NewRow();
  37. dr2["Name"] = data.Rows[i]["TypeName"].ToString();
  38. dr2["Area"] = Convert.ToDouble(data.Rows[i]["ar"]);
  39. dr2["TypeId"] = data.Rows[i]["TypeId"].ToString();
  40. dr2["Class"] = data.Rows[i]["Class"].ToString();
  41. AllAnalysisDetails.Rows.Add(dr2);
  42. }
  43. //按照list列表进行物质类排序,物质类中的元素分类按照面积的大小进行排序
  44. List<string> ClassName = new List<string>();
  45. DataTable getClass_dt = basicData.GetAllClass();
  46. bool bl = false;
  47. for (int i = 0; i < getClass_dt.Rows.Count; i++)
  48. {
  49. if (getClass_dt.Rows[i]["GroupName"].ToString() != "NOT_INCLUTION" && getClass_dt.Rows[i]["GroupName"].ToString() != "Invalid"
  50. && getClass_dt.Rows[i]["GroupName"].ToString() != "Not Identified")
  51. if (getClass_dt.Rows[i]["GroupName"].ToString() == "")
  52. {
  53. if (!bl)
  54. {
  55. ClassName.Add("Default");
  56. bl = true;
  57. }
  58. }
  59. else
  60. {
  61. ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString());
  62. }
  63. }
  64. //统计元素物质大类的元素信息和面积占比
  65. DataTable dt_ElementalSubstance = ElementalSubstance(AllAnalysisDetails, ClassName, basicData.getParticleData());
  66. DataTable dt_ElementSorting;
  67. //统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序
  68. if (lingge)
  69. {
  70. //单个大类
  71. dt_ElementSorting = ElementSortingSS(AllAnalysisDetails, ClassName, basicData.getParticleData());
  72. }
  73. else
  74. {
  75. dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, basicData.getParticleData());
  76. }
  77. //统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序
  78. //DataTable dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, basicData.getParticleData());
  79. ////生成最后导出时物质元素成分表
  80. DataTable dt = MaterialElementComposition(dt_ElementalSubstance, 13, m_otsreport_export);//导出14个元素成分信息
  81. dt.Columns.Add("TypeId"); //生成最后导出时物质元素细分表
  82. DataTable dtname = new DataTable();
  83. DataTable dtData = new DataTable();
  84. SubdivisionOfMaterialElements(dt_ElementSorting, 13, ClassName, dt, out dtname, out dtData);
  85. List<DataTable> datas = new List<DataTable>();
  86. datas.Add(dtname);
  87. datas.Add(dtData);
  88. datas.Add(dt_ElementSorting);
  89. return datas;
  90. }
  91. private bool SubdivisionOfMaterialElements(DataTable a_ElementalSubstance, int NumberOfColumns, List<string> ClassName, DataTable data, out DataTable dt1, out DataTable dt2)
  92. {
  93. DataTable dt_ElementalSubstance = new DataTable();
  94. dt_ElementalSubstance = data.Copy();
  95. dt_ElementalSubstance.Clear();
  96. dt_ElementalSubstance.TableName = "ElementSubdivision_Value";
  97. dt_ElementalSubstance.Columns["Name"].ColumnName = "Class";
  98. dt_ElementalSubstance.Columns.Add("Name");
  99. //处理元素面积保留小数点后两位
  100. for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++)
  101. {
  102. a_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"].ToString()), 2);
  103. }
  104. //循环元素物质大类
  105. for (int i = 0; i < ClassName.Count; i++)
  106. {
  107. DataTable dt_1 = new DataTable();
  108. dt_1 = data.Copy();
  109. dt_1.Clear();
  110. for (int a = 0; a < data.Rows.Count; a++)
  111. {
  112. if (data.Rows[a]["Name"].ToString() == ClassName[i].ToString())
  113. {
  114. dt_1.Rows.Add(data.Rows[a].ItemArray);
  115. }
  116. }
  117. dt_1.Columns["Name"].ColumnName = "Class";
  118. dt_1.Columns.Add("Name");
  119. DataTable dt_2 = new DataTable();
  120. dt_2 = dt_1.Copy();
  121. dt_2.Clear();
  122. dt_2.Rows.Add();
  123. //循环整个表筛选出当前的物质
  124. for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++)
  125. {
  126. if(ClassName.Count==1)
  127. {
  128. for (int b = 0; b < dt_1.Columns.Count; b++)
  129. {
  130. if (dt_2.Columns[b].ToString() != "Class")
  131. {
  132. if (a_ElementalSubstance.Columns.Contains(dt_2.Columns[b].ToString()))
  133. {
  134. if (a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()].ToString() == "")
  135. {
  136. dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
  137. }
  138. else
  139. {
  140. dt_2.Rows[0][dt_2.Columns[b].ToString()] = a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()];
  141. }
  142. }
  143. else
  144. {
  145. dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
  146. }
  147. }
  148. }
  149. dt_1.Rows.Add(dt_2.Rows[0].ItemArray);
  150. }
  151. else
  152. if (ClassName[i].ToString() == a_ElementalSubstance.Rows[a]["Class"].ToString())
  153. {
  154. for (int b = 0; b < dt_1.Columns.Count; b++)
  155. {
  156. if (dt_2.Columns[b].ToString() != "Class")
  157. {
  158. if (a_ElementalSubstance.Columns.Contains(dt_2.Columns[b].ToString()))
  159. {
  160. if (a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()].ToString() == "")
  161. {
  162. dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
  163. }
  164. else
  165. {
  166. dt_2.Rows[0][dt_2.Columns[b].ToString()] = a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()];
  167. }
  168. }
  169. else
  170. {
  171. dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
  172. }
  173. }
  174. }
  175. dt_1.Rows.Add(dt_2.Rows[0].ItemArray);
  176. }
  177. }
  178. for (int a = 0; a < dt_1.Rows.Count; a++)
  179. {
  180. dt_ElementalSubstance.Rows.Add(dt_1.Rows[a].ItemArray);
  181. }
  182. }
  183. DataTable dataTable = new DataTable();
  184. dataTable = dt_ElementalSubstance.Copy();
  185. dataTable.Clear();
  186. DataRow row = dataTable.NewRow();
  187. dataTable.Rows.Add(row);
  188. dataTable.TableName = "ElementSubdivision_Name";
  189. for (int i = 0; i < dataTable.Columns.Count; i++)
  190. {
  191. dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString();
  192. }
  193. dt1 = dataTable.Copy();
  194. dt2 = dt_ElementalSubstance.Copy();
  195. return true;
  196. }
  197. private DataTable MaterialElementComposition(DataTable a_ElementalSubstance, int NumberOfColumns,OTSReport_Export m_otsreport_export)
  198. {
  199. DataTable dt_ElementalSubstance = new DataTable();
  200. dt_ElementalSubstance.TableName = "ElementalSubstance_Value";
  201. dt_ElementalSubstance.Columns.Add("Name");
  202. dt_ElementalSubstance.Columns.Add("Area");
  203. for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++)
  204. {
  205. dt_ElementalSubstance.Rows.Add(a_ElementalSubstance.Rows[i]["Name"]);
  206. dt_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"]), 2);
  207. }
  208. int cunt = 1;
  209. for (int i = 0; i < NumberOfColumns; i++)
  210. {
  211. if (i < m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys.Count())
  212. {
  213. dt_ElementalSubstance.Columns.Add(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]);
  214. for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++)
  215. {
  216. if (a_ElementalSubstance.Columns.Contains(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]))
  217. {
  218. if (a_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]].ToString() == "")
  219. {
  220. dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0;
  221. }
  222. else
  223. {
  224. dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = a_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]];
  225. }
  226. }
  227. else
  228. {
  229. dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0;
  230. }
  231. }
  232. }
  233. else
  234. {
  235. dt_ElementalSubstance.Columns.Add("Null" + cunt.ToString());
  236. cunt = cunt + 1;
  237. for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++)
  238. {
  239. dt_ElementalSubstance.Rows[a][i + 2] = "-";
  240. }
  241. }
  242. }
  243. DataTable dataTable = new DataTable();
  244. dataTable = dt_ElementalSubstance.Copy();
  245. dataTable.Clear();
  246. DataRow row = dataTable.NewRow();
  247. dataTable.Rows.Add(row);
  248. dataTable.TableName = "ElementalSubstance_Name";
  249. for (int i = 0; i < dataTable.Columns.Count; i++)
  250. {
  251. dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString();
  252. }
  253. //m_list_dt.Add(dataTable);
  254. //m_list_dt.Add(dt_ElementalSubstance);
  255. return dt_ElementalSubstance;
  256. }
  257. private DataTable ElementSorting(DataTable AllAnalysisDetails, List<string> ClassName, ParticleData fielddata)
  258. {
  259. DataTable dte = fielddata.GetAllElement();
  260. DataTable ElementSorting_dt = AllAnalysisDetails.Copy();
  261. ElementSorting_dt.Clear();
  262. for (int i = 0; i < ClassName.Count; i++)
  263. {
  264. DataTable dt = AllAnalysisDetails.Copy();
  265. dt.Clear();
  266. for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++)
  267. {
  268. if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString())
  269. {
  270. dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray);
  271. }
  272. }
  273. //将颗粒大小排序(从大到小)
  274. DataView dv = dt.DefaultView;
  275. dv.Sort = "Area DESC";
  276. DataTable dt_Element = dv.ToTable();
  277. for (int a = 0; a < dt_Element.Rows.Count; a++)
  278. {
  279. ElementSorting_dt.Rows.Add(dt_Element.Rows[a].ItemArray);
  280. }
  281. }
  282. //循环创建元素列(类型定义为double,为以后计算做准备)
  283. for (int a = 0; a < dte.Rows.Count; a++)
  284. {
  285. ElementSorting_dt.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double));
  286. }
  287. for (int a = 0; a < ElementSorting_dt.Rows.Count; a++)
  288. {
  289. DataTable ClassificationDetails = fielddata.GetAreaByIncA(ElementSorting_dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息
  290. //DataRow dr2 = ElementSorting_dt.NewRow();
  291. foreach (DataRow dr in ClassificationDetails.Rows)
  292. {
  293. double doe = Convert.ToDouble(dr["pc"]);
  294. ElementSorting_dt.Rows[a][dr["Name"].ToString()] = Math.Round(doe / Convert.ToDouble(ElementSorting_dt.Rows[a]["Area"]), 2);
  295. }
  296. }
  297. return ElementSorting_dt;
  298. }
  299. private DataTable ElementSortingSS(DataTable AllAnalysisDetails, List<string> ClassName, ParticleData fielddata)
  300. {
  301. DataTable dte = fielddata.GetAllElement();
  302. DataTable ElementSorting_dt = AllAnalysisDetails.Copy();
  303. ElementSorting_dt.Clear();
  304. for (int i = 0; i < ClassName.Count; i++)
  305. {
  306. DataTable dt = AllAnalysisDetails.Copy();
  307. //dt.Clear();
  308. //for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++)
  309. //{
  310. // if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString())
  311. // {
  312. // dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray);
  313. // }
  314. //}
  315. //将颗粒大小排序(从大到小)
  316. //DataView dv = dt.DefaultView;
  317. //dv.Sort = "Area DESC";
  318. //DataTable dt_Element = dv.ToTable();
  319. DataTable dt_Element = dt.Copy();
  320. for (int a = 0; a < dt_Element.Rows.Count; a++)
  321. {
  322. ElementSorting_dt.Rows.Add(dt_Element.Rows[a].ItemArray);
  323. }
  324. }
  325. //循环创建元素列(类型定义为double,为以后计算做准备)
  326. for (int a = 0; a < dte.Rows.Count; a++)
  327. {
  328. ElementSorting_dt.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double));
  329. }
  330. for (int a = 0; a < ElementSorting_dt.Rows.Count; a++)
  331. {
  332. DataTable ClassificationDetails = fielddata.GetAreaByIncA(ElementSorting_dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息
  333. //DataRow dr2 = ElementSorting_dt.NewRow();
  334. foreach (DataRow dr in ClassificationDetails.Rows)
  335. {
  336. double doe = Convert.ToDouble(dr["pc"]);
  337. ElementSorting_dt.Rows[a][dr["Name"].ToString()] = Math.Round(doe / Convert.ToDouble(ElementSorting_dt.Rows[a]["Area"]), 2);
  338. }
  339. }
  340. return ElementSorting_dt;
  341. }
  342. private DataTable ElementalSubstance(DataTable AllAnalysisDetails, List<string> ClassName, ParticleData fielddata)
  343. {
  344. //当前元素物质类面积的总和
  345. double ElementalSubstance = 0;
  346. DataTable dte = fielddata.GetAllElement();
  347. DataTable dt_Class = new DataTable();
  348. dt_Class.Columns.Add("Name");
  349. dt_Class.Columns.Add("Area");
  350. //循环创建元素列(类型定义为double,为以后计算做准备)
  351. for (int a = 0; a < dte.Rows.Count; a++)
  352. {
  353. dt_Class.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double));
  354. }
  355. //循环大类物质列表
  356. for (int i = 0; i < ClassName.Count; i++)
  357. {
  358. //保留当前循环中大类物质,去除其他物质
  359. DataTable dt = AllAnalysisDetails.Copy();
  360. dt.Clear();
  361. for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++)
  362. {
  363. if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString())
  364. {
  365. dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray);
  366. }
  367. }
  368. if (dt.Rows.Count == 0)
  369. continue;
  370. //计算出当前循环中大类物质的面积
  371. ElementalSubstance = Convert.ToDouble(decimal.Parse(dt.Compute("sum(Area)", "").ToString()));
  372. DataTable ta = new DataTable();
  373. ta = dt_Class.Copy();
  374. ta.Clear();
  375. for (int a = 0; a < dt.Rows.Count; a++)
  376. {
  377. DataTable ClassificationDetails = fielddata.GetAreaByIncA(dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息
  378. DataRow dr2 = ta.NewRow();
  379. foreach (DataRow dr in ClassificationDetails.Rows)
  380. {
  381. double doe = Convert.ToDouble(dr["pc"]);
  382. dr2[dr["Name"].ToString()] = doe;
  383. }
  384. ta.Rows.Add(dr2);
  385. }
  386. DataTable dataTable = ta.Copy();
  387. dataTable.Clear();
  388. DataRow row = dataTable.NewRow();
  389. dataTable.Rows.Add(row);
  390. for (int a = 0; a < ta.Columns.Count; a++)
  391. {
  392. if (ta.Columns[a].ToString() != "Name" && ta.Columns[a].ToString() != "Class")
  393. {
  394. bool bl = false;
  395. for (int b = 0; b < ta.Rows.Count; b++)
  396. {
  397. if (!ta.Rows[b].IsNull(ta.Columns[a].ToString()))
  398. {
  399. bl = true;
  400. }
  401. }
  402. if (bl)
  403. //datatSuncolumn(ta, ta.Columns[a].ToString());
  404. dataTable.Rows[0][ta.Columns[a].ToString()] = Math.Round(datatSuncolumn(ta, ta.Columns[a].ToString()) / ElementalSubstance, 2);
  405. }
  406. }
  407. dataTable.Rows[0]["Name"] = ClassName[i].ToString();
  408. dataTable.Rows[0]["Area"] = ElementalSubstance;
  409. dt_Class.Rows.Add(dataTable.Rows[0].ItemArray);
  410. }
  411. return dt_Class;
  412. }
  413. private double datatSuncolumn(DataTable dt, string str)
  414. {
  415. double sum = 0;
  416. for (int i = 0; i < dt.Rows.Count; i++)
  417. {
  418. if (dt.Rows[i][str].ToString() == "")
  419. {
  420. dt.Rows[i][str] = 0;
  421. }
  422. sum = sum + Convert.ToDouble(dt.Rows[i][str].ToString());
  423. }
  424. return sum;
  425. }
  426. }
  427. }