using DevExpress.CodeParser; using DevExpress.Utils.Gesture; using OTSCommon.DBOperate; using OTSCommon.DBOperate.Model; using OTSIncAReportApp.DataOperation.DataAccess; using OTSIncAReportApp.OTSSampleReportInfo; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using static OTSDataType.otsdataconst; using static OTSIncAReportApp.OTSReport_Export; namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration { /// /// 元素分析 /// class ElementalAnalysis { /// /// 元素分析表(表头、表数据、全数据) /// /// /// /// public List GetElementData(BasicData basicData, OTSReport_Export m_otsreport_export) { List data = basicData.GetDBData(); //按照list列表进行物质类排序,物质类中的元素分类按照面积的大小进行排序 List ClassName = ObtainParticleCategory(m_otsreport_export, basicData); //统计元素物质大类的元素信息和面积占比 DataTable dt_ElementalSubstance = ElementalSubstance_cleanliness(data, ClassName, basicData.getParticleData()); List dataTables=new List(); dataTables = ElementSorting(data, ClassName, basicData.getParticleData()); ////生成最后导出时物质元素成分表 List dt2 = MaterialElementComposition(dataTables, 13, m_otsreport_export);//导出14个元素成分信息 DataTable dtname = new DataTable(); DataTable dtData = new DataTable(); SubdivisionOfMaterialElements(dataTables, 13, ClassName, dt2, out dtname, out dtData); List datas = new List(); datas.Add(dtname); datas.Add(dtData); //datas.Add(dt_ElementSorting); return datas; } /// /// 获得颗粒类别 /// /// private List ObtainParticleCategory(OTSReport_Export m_otsreport_export ,BasicData basicData) { List ClassName = new List(); if (m_otsreport_export.m_ReportApp.m_RptConfigFile.Systype != OTS_SysType_ID.IncA) { DataTable get_dt = ReadClassification(basicData); DataTable getClass_dt = get_dt.Clone(); DataRow[] dataRow = get_dt.Select("", "iorder ASC"); foreach (DataRow row in dataRow) { if (row.ItemArray[1].ToString() != "Default") { getClass_dt.ImportRow(row); } } for (int i = 0; i < getClass_dt.Rows.Count; i++) { ClassName.Add(getClass_dt.Rows[i][1].ToString()); } ClassName.Add("Default"); } else { ClassName = basicData.GetGroupInformation(); } return ClassName; } private DataTable ReadClassification(BasicData basicData) { DataTable dt_stl = new DataTable(); SqLiteHelper sh = new SqLiteHelper("data source='" + basicData.GetFilePath() + "\\" + basicData.GetResfile() + "'"); dt_stl = sh.ExecuteQuery("select * from STDGroups"); return dt_stl; } private void SubdivisionOfMaterialElements(List a_ElementalSubstance, int NumberOfColumns, List ClassName, List data, out DataTable dt1, out DataTable dt2) { DataTable dt_ElementalSubstance = new DataTable(); dt_ElementalSubstance.Columns.Add("Class"); dt_ElementalSubstance.Columns.Add("Area"); dt_ElementalSubstance.Columns.Add("TypeId"); dt_ElementalSubstance.Columns.Add("Name"); for (int i = 4; i < data[0].Columns.Count; i++) { dt_ElementalSubstance.Columns.Add(data[0].Columns[i].ColumnName); } DataTable dtName = dt_ElementalSubstance.Clone(); DataRow row1 = dtName.NewRow(); for (int i = 0; i < dt_ElementalSubstance.Columns.Count; i++) { row1[i] = dt_ElementalSubstance.Columns[i].ColumnName; } dtName.Rows.Add(row1); dt1 = dtName.Copy(); for (int i = 0; i < a_ElementalSubstance.Count; i++) { DataRow row = dt_ElementalSubstance.NewRow(); row["Class"] = a_ElementalSubstance[i].Rows[0]["Class"].ToString(); double dlArea = CalculationTableColumn(a_ElementalSubstance[i], "Area"); row["Area"] = Math.Round(dlArea,2); double ELEtotal = 0; for (int a = 4; a < data[0].Columns.Count; a++) { ELEtotal= ELEtotal+ CalculationTableColumn(a_ElementalSubstance[i], data[0].Columns[a].ColumnName); } for (int a = 4; a < data[0].Columns.Count; a++) { double dlData = CalculationTableColumn(a_ElementalSubstance[i], data[0].Columns[a].ColumnName); // row[data[0].Columns[a].ColumnName] = Math.Round(dlData, 2); if (dlData == 0.0) { row[data[0].Columns[a].ColumnName] = 0; } else { double ColVal = Convert.ToDouble(dlData / ELEtotal * 100); row[data[0].Columns[a].ColumnName] = Math.Round(ColVal, 2); } } dt_ElementalSubstance.Rows.Add(row); for (int a = 0; a < data[i].Rows.Count; a++) { DataRow dr = dt_ElementalSubstance.NewRow(); dr["Area"] = Math.Round(Convert.ToDouble(data[i].Rows[a]["Area"]), 2); dr["TypeId"] = data[i].Rows[a]["TypeId"].ToString(); dr["Name"]= data[i].Rows[a]["TypeName"].ToString(); double datotal = 0; for (int j = 4; j < data[0].Columns.Count; j++) { datotal= datotal+ Convert.ToDouble(data[i].Rows[a][data[0].Columns[j].ColumnName]); } for (int j = 4; j < data[0].Columns.Count; j++) { double dlData = Convert.ToDouble(data[i].Rows[a][data[0].Columns[j].ColumnName]); if (dlData == 0) { dr[data[0].Columns[j].ColumnName] = 0; } else { double ColVal = Convert.ToDouble(dlData / datotal * 100); dr[data[0].Columns[j].ColumnName] = Math.Round(ColVal, 2); } //dr[data[0].Columns[j].ColumnName] = Math.Round(dlData, 2); } dt_ElementalSubstance.Rows.Add(dr); } } dt2 = dt_ElementalSubstance.Copy(); } private List MaterialElementComposition( List a_ElementalSubstance, int NumberOfColumns, OTSReport_Export m_otsreport_export) { List dataTables = new List(); DataTable dt_ElementalSubstance = new DataTable(); dt_ElementalSubstance.TableName = "ElementalSubstance_Value"; dt_ElementalSubstance.Columns.Add("TypeName"); dt_ElementalSubstance.Columns.Add("TypeId"); dt_ElementalSubstance.Columns.Add("Area"); dt_ElementalSubstance.Columns.Add("Class"); for (int i = 0; i < m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys.Count; i++) { dt_ElementalSubstance.Columns.Add(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]); } for (int i = 0; i < a_ElementalSubstance.Count; i++) { DataTable data = dt_ElementalSubstance.Clone(); for (int a = 0; a < a_ElementalSubstance[i].Rows.Count; a++) { DataRow data1 = data.NewRow(); data1["TypeName"] = a_ElementalSubstance[i].Rows[a]["TypeName"].ToString(); data1["TypeId"]= a_ElementalSubstance[i].Rows[a]["TypeId"].ToString(); data1["Area"]= a_ElementalSubstance[i].Rows[a]["Area"].ToString(); data1["Class"]= a_ElementalSubstance[i].Rows[a]["Class"].ToString(); int intt = 4; for (int j = 0; j < m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys.Count; j++) { if (a_ElementalSubstance[i].Columns.Contains(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[j])) { data1[m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[j]] = a_ElementalSubstance[i].Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[j]]; } else { data1[m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[j]] = 0; } } data.Rows.Add(data1); } dataTables.Add(data); } //DataTable dt_ElementalSubstance = new DataTable(); //dt_ElementalSubstance.TableName = "ElementalSubstance_Value"; //dt_ElementalSubstance.Columns.Add("Name"); //dt_ElementalSubstance.Columns.Add("Area"); //for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++) //{ // dt_ElementalSubstance.Rows.Add(a_ElementalSubstance.Rows[i]["Name"]); // dt_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"]), 2); //} //int cunt = 1; //for (int i = 0; i < NumberOfColumns; i++) //{ // if (i < m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys.Count()) // { // dt_ElementalSubstance.Columns.Add(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]); // for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++) // { // if (a_ElementalSubstance.Columns.Contains(m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i])) // { // if (a_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]].ToString() == "") // { // dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0; // } // else // { // 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]]; // } // } // else // { // dt_ElementalSubstance.Rows[a][m_otsreport_export.m_mbszclass.M_YSFXJG.list_str_tb_ysfx_xsys[i]] = 0; // } // } // } // else // { // dt_ElementalSubstance.Columns.Add("Null" + cunt.ToString()); // cunt = cunt + 1; // for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++) // { // dt_ElementalSubstance.Rows[a][i + 2] = "-"; // } // } //} //DataTable dataTable = new DataTable(); //dataTable = dt_ElementalSubstance.Copy(); //dataTable.Clear(); //DataRow row = dataTable.NewRow(); //dataTable.Rows.Add(row); //dataTable.TableName = "ElementalSubstance_Name"; //for (int i = 0; i < dataTable.Columns.Count; i++) //{ // dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString(); //} //m_list_dt.Add(dataTable); //m_list_dt.Add(dt_ElementalSubstance); return dataTables; } private List ElementSorting(List AllAnalysisDetails, List ClassName, ParticleData fielddata) { List dataTables = new List(); //当前元素物质类面积的总和 DataTable dte = fielddata.GetAllElement(); DataTable dt_Class = new DataTable(); dt_Class.Columns.Add("TypeName"); dt_Class.Columns.Add("TypeId"); dt_Class.Columns.Add("Area"); dt_Class.Columns.Add("Class"); //循环创建元素列(类型定义为double,为以后计算做准备) for (int a = 0; a < dte.Rows.Count; a++) { dt_Class.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double)); } //循环组列表 for (int i = 0; i < AllAnalysisDetails.Count; i++) { if (AllAnalysisDetails[i].Rows.Count == 0) { continue; } DataTable data = dt_Class.Clone(); for (int a = 0; a < AllAnalysisDetails[i].Rows.Count; a++) { data.TableName = AllAnalysisDetails[i].TableName; DataTable ClassificationDetails = fielddata.GetAreaByIncA(AllAnalysisDetails[i].Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息 DataRow dr2 = data.NewRow(); if (ClassificationDetails.Rows.Count == 0) { for (int j = 4; j < data.Columns.Count; j++) { double doe = Convert.ToDouble(0); dr2[data.Columns[j].ColumnName] = doe; dr2["TypeName"] = AllAnalysisDetails[i].Rows[a]["TypeName"].ToString(); dr2["TypeId"] = AllAnalysisDetails[i].Rows[a]["TypeId"].ToString(); dr2["Area"] = AllAnalysisDetails[i].Rows[a]["ar"].ToString(); dr2["Class"] = AllAnalysisDetails[i].Rows[a]["Class"].ToString(); } } foreach (DataRow dr in ClassificationDetails.Rows) { double doe = Convert.ToDouble(dr["pc"]); dr2[dr["Name"].ToString()] = doe; dr2["TypeName"] = AllAnalysisDetails[i].Rows[a]["TypeName"].ToString(); dr2["TypeId"]=AllAnalysisDetails[i].Rows[a]["TypeId"].ToString(); dr2["Area"]=AllAnalysisDetails[i].Rows[a]["ar"].ToString(); dr2["Class"]= AllAnalysisDetails[i].Rows[a]["Class"].ToString(); } data.Rows.Add(dr2); for (int j = 4; j < data.Columns.Count; j++) { if (data.Rows[data.Rows.Count - 1][j].ToString() == "") { data.Rows[data.Rows.Count - 1][j] = 0; } } } dataTables.Add(data); } //DataTable dte = fielddata.GetAllElement(); //DataTable ElementSorting_dt = AllAnalysisDetails.Copy(); //ElementSorting_dt.Clear(); //for (int i = 0; i < ClassName.Count; i++) //{ // DataTable dt = AllAnalysisDetails.Copy(); // dt.Clear(); // for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++) // { // if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString()) // { // dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray); // } // } // //将颗粒大小排序(从大到小) // DataView dv = dt.DefaultView; // dv.Sort = "Area DESC"; // DataTable dt_Element = dv.ToTable(); // for (int a = 0; a < dt_Element.Rows.Count; a++) // { // ElementSorting_dt.Rows.Add(dt_Element.Rows[a].ItemArray); // } //} ////循环创建元素列(类型定义为double,为以后计算做准备) //for (int a = 0; a < dte.Rows.Count; a++) //{ // ElementSorting_dt.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double)); //} //for (int a = 0; a < ElementSorting_dt.Rows.Count; a++) //{ // DataTable ClassificationDetails = fielddata.GetAreaByIncA(ElementSorting_dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息 // //DataRow dr2 = ElementSorting_dt.NewRow(); // foreach (DataRow dr in ClassificationDetails.Rows) // { // double doe = Convert.ToDouble(dr["pc"]); // ElementSorting_dt.Rows[a][dr["Name"].ToString()] = Math.Round(doe / Convert.ToDouble(ElementSorting_dt.Rows[a]["Area"]), 2); // } //} return dataTables; } private DataTable ElementalSubstance_cleanliness(List AllAnalysisDetails, List ClassName, ParticleData fielddata) { //当前元素物质类面积的总和 DataTable dte = fielddata.GetAllElement(); DataTable dt_Class = new DataTable(); dt_Class.Columns.Add("Name"); dt_Class.Columns.Add("Area"); //循环创建元素列(类型定义为double,为以后计算做准备) for (int a = 0; a < dte.Rows.Count; a++) { dt_Class.Columns.Add(dte.Rows[a]["Name"].ToString(), typeof(double)); } //循环组列表 for (int i = 0; i < AllAnalysisDetails.Count; i++) { if (AllAnalysisDetails[i].Rows.Count == 0) { // DataRow row = dt_Class.NewRow(); // row["Name"] = ClassName[i].ToString(); // row["Area"] = 0; // for (int a = 4; a < dt_Class.Columns.Count; a++) // { // row[a] = 0; //} // dt_Class.Rows.Add(row); continue; } double del = CalculationTableColumn(AllAnalysisDetails[i], "ar"); DataTable data = dt_Class.Clone(); for (int a = 0; a < AllAnalysisDetails[i].Rows.Count; a++) { DataTable ClassificationDetails = fielddata.GetAreaByIncA(AllAnalysisDetails[i].Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息 DataRow dr2 = data.NewRow(); if (ClassificationDetails.Rows.Count == 0) { for (int j = 4; j < data.Columns.Count; j++) { double doe = Convert.ToDouble(0); dr2[data.Columns[j].ColumnName] = doe; } } foreach (DataRow dr in ClassificationDetails.Rows) { double doe = Convert.ToDouble(dr["pc"]); dr2[dr["Name"].ToString()] = doe; } data.Rows.Add(dr2); } DataRow row1 = dt_Class.NewRow(); row1["Name"] = ClassName[i].ToString(); row1["Area"] = del; for (int a = 4; a < data.Columns.Count; a++) { row1[a] = CalculationTableColumn(data, data.Columns[a].ColumnName); } dt_Class.Rows.Add(row1); } //for (int i = 0; i < ClassName.Count; i++) //{ ////保留当前循环中大类物质,去除其他物质 //DataTable dt = AllAnalysisDetails[0].Copy(); //dt.Clear(); //for (int a = 0; a < AllAnalysisDetails.Rows.Count; a++) //{ // if (AllAnalysisDetails.Rows[a]["Class"].ToString() == ClassName[i].ToString()) // { // dt.Rows.Add(AllAnalysisDetails.Rows[a].ItemArray); // } //} //if (dt.Rows.Count == 0) // continue; //if (dt.Rows.Count == 0) //{ // DataRow dataRow = dt.NewRow(); // dataRow["Area"] = 0; // dt.Rows.Add(dataRow); // DataRow dataRow2 = dt_Class.NewRow(); // dataRow2["Name"] = ClassName[i].ToString(); // double ar0 = 0; // dataRow2["Area"] = ar0; // dt_Class.Rows.Add(dataRow2); // continue; //} //计算出当前循环中大类物质的面积 // ElementalSubstance = Convert.ToDouble(decimal.Parse(dt.Compute("sum(Area)", "").ToString())); //DataTable ta = new DataTable(); //ta = dt_Class.Copy(); //ta.Clear(); //for (int a = 0; a < dt.Rows.Count; a++) //{ // DataTable ClassificationDetails = fielddata.GetAreaByIncA(dt.Rows[a]["TypeId"].ToString(), "");//获取单个分类的元素信息 // DataRow dr2 = ta.NewRow(); // foreach (DataRow dr in ClassificationDetails.Rows) // { // double doe = Convert.ToDouble(dr["pc"]); // dr2[dr["Name"].ToString()] = doe; // } // ta.Rows.Add(dr2); //} //DataTable dataTable = ta.Copy(); //dataTable.Clear(); //DataRow row = dataTable.NewRow(); //dataTable.Rows.Add(row); //for (int a = 0; a < ta.Columns.Count; a++) //{ // if (ta.Columns[a].ToString() != "Name" && ta.Columns[a].ToString() != "Class") // { // bool bl = false; // for (int b = 0; b < ta.Rows.Count; b++) // { // if (!ta.Rows[b].IsNull(ta.Columns[a].ToString())) // { // bl = true; // } // } // if (bl) // //datatSuncolumn(ta, ta.Columns[a].ToString()); // dataTable.Rows[0][ta.Columns[a].ToString()] = Math.Round(datatSuncolumn(ta, ta.Columns[a].ToString()) / ElementalSubstance, 2); // } //} //dataTable.Rows[0]["Name"] = ClassName[i].ToString(); //dataTable.Rows[0]["Area"] = ElementalSubstance; //dt_Class.Rows.Add(dataTable.Rows[0].ItemArray); //} return dt_Class; } private double CalculationTableColumn(DataTable a_data , string a_str) { double dl = 0; if (a_data.Columns.Contains(a_str)) { for (int i = 0; i < a_data.Rows.Count; i++) { if (a_data.Rows[i][a_str].ToString() != "") { dl = dl + Convert.ToDouble(a_data.Rows[i][a_str]); } } } return dl; } } }