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 OTSIncAReportApp.OTSReport_Export;
namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
{
///
/// 元素分析
///
class ElementalAnalysis
{
///
/// 元素分析表(表头、表数据、全数据)
///
///
///
///
public List GetElementData(BasicData basicData, OTSReport_Export m_otsreport_export,bool lingge)
{
DataTable data = basicData.GetDBData();
//根据sql条件,查询获取颗粒信息数据
DataTable AllAnalysisDetails = new DataTable();
AllAnalysisDetails.TableName = "ElementValue";
AllAnalysisDetails.Columns.Add("Name");
AllAnalysisDetails.Columns.Add("TypeId");
AllAnalysisDetails.Columns.Add("Area", typeof(double));
AllAnalysisDetails.Columns.Add("Class");
for (int i = 0; i < data.Rows.Count; i++)
{
DataRow dr2 = AllAnalysisDetails.NewRow();
dr2["Name"] = data.Rows[i]["TypeName"].ToString();
dr2["Area"] = Convert.ToDouble(data.Rows[i]["ar"]);
dr2["TypeId"] = data.Rows[i]["TypeId"].ToString();
dr2["Class"] = data.Rows[i]["Class"].ToString();
AllAnalysisDetails.Rows.Add(dr2);
}
//按照list列表进行物质类排序,物质类中的元素分类按照面积的大小进行排序
List ClassName = new List();
DataTable getClass_dt = basicData.GetAllClass();
bool bl = false;
for (int i = 0; i < getClass_dt.Rows.Count; i++)
{
if (getClass_dt.Rows[i]["GroupName"].ToString() != "NOT_INCLUTION" && getClass_dt.Rows[i]["GroupName"].ToString() != "Invalid"
&& getClass_dt.Rows[i]["GroupName"].ToString() != "Not Identified")
if (getClass_dt.Rows[i]["GroupName"].ToString() == "")
{
if (!bl)
{
ClassName.Add("Default");
bl = true;
}
}
else
{
ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString());
}
}
//统计元素物质大类的元素信息和面积占比
DataTable dt_ElementalSubstance = ElementalSubstance(AllAnalysisDetails, ClassName, basicData.getParticleData());
DataTable dt_ElementSorting;
//统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序
if (lingge)
{
//单个大类
dt_ElementSorting = ElementSortingSS(AllAnalysisDetails, ClassName, basicData.getParticleData());
}
else
{
dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, basicData.getParticleData());
}
//统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序
//DataTable dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, basicData.getParticleData());
////生成最后导出时物质元素成分表
DataTable dt = MaterialElementComposition(dt_ElementalSubstance, 13, m_otsreport_export);//导出14个元素成分信息
dt.Columns.Add("TypeId"); //生成最后导出时物质元素细分表
DataTable dtname = new DataTable();
DataTable dtData = new DataTable();
SubdivisionOfMaterialElements(dt_ElementSorting, 13, ClassName, dt, out dtname, out dtData);
List datas = new List();
datas.Add(dtname);
datas.Add(dtData);
datas.Add(dt_ElementSorting);
return datas;
}
private bool SubdivisionOfMaterialElements(DataTable a_ElementalSubstance, int NumberOfColumns, List ClassName, DataTable data, out DataTable dt1, out DataTable dt2)
{
DataTable dt_ElementalSubstance = new DataTable();
dt_ElementalSubstance = data.Copy();
dt_ElementalSubstance.Clear();
dt_ElementalSubstance.TableName = "ElementSubdivision_Value";
dt_ElementalSubstance.Columns["Name"].ColumnName = "Class";
dt_ElementalSubstance.Columns.Add("Name");
//处理元素面积保留小数点后两位
for (int i = 0; i < a_ElementalSubstance.Rows.Count; i++)
{
a_ElementalSubstance.Rows[i]["Area"] = Math.Round(Convert.ToDouble(a_ElementalSubstance.Rows[i]["Area"].ToString()), 2);
}
//循环元素物质大类
for (int i = 0; i < ClassName.Count; i++)
{
DataTable dt_1 = new DataTable();
dt_1 = data.Copy();
dt_1.Clear();
for (int a = 0; a < data.Rows.Count; a++)
{
if (data.Rows[a]["Name"].ToString() == ClassName[i].ToString())
{
dt_1.Rows.Add(data.Rows[a].ItemArray);
}
}
dt_1.Columns["Name"].ColumnName = "Class";
dt_1.Columns.Add("Name");
DataTable dt_2 = new DataTable();
dt_2 = dt_1.Copy();
dt_2.Clear();
dt_2.Rows.Add();
//循环整个表筛选出当前的物质
for (int a = 0; a < a_ElementalSubstance.Rows.Count; a++)
{
if(ClassName.Count==1)
{
for (int b = 0; b < dt_1.Columns.Count; b++)
{
if (dt_2.Columns[b].ToString() != "Class")
{
if (a_ElementalSubstance.Columns.Contains(dt_2.Columns[b].ToString()))
{
if (a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()].ToString() == "")
{
dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
}
else
{
dt_2.Rows[0][dt_2.Columns[b].ToString()] = a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()];
}
}
else
{
dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
}
}
}
dt_1.Rows.Add(dt_2.Rows[0].ItemArray);
}
else
if (ClassName[i].ToString() == a_ElementalSubstance.Rows[a]["Class"].ToString())
{
for (int b = 0; b < dt_1.Columns.Count; b++)
{
if (dt_2.Columns[b].ToString() != "Class")
{
if (a_ElementalSubstance.Columns.Contains(dt_2.Columns[b].ToString()))
{
if (a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()].ToString() == "")
{
dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
}
else
{
dt_2.Rows[0][dt_2.Columns[b].ToString()] = a_ElementalSubstance.Rows[a][dt_2.Columns[b].ToString()];
}
}
else
{
dt_2.Rows[0][dt_2.Columns[b].ToString()] = 0;
}
}
}
dt_1.Rows.Add(dt_2.Rows[0].ItemArray);
}
}
for (int a = 0; a < dt_1.Rows.Count; a++)
{
dt_ElementalSubstance.Rows.Add(dt_1.Rows[a].ItemArray);
}
}
DataTable dataTable = new DataTable();
dataTable = dt_ElementalSubstance.Copy();
dataTable.Clear();
DataRow row = dataTable.NewRow();
dataTable.Rows.Add(row);
dataTable.TableName = "ElementSubdivision_Name";
for (int i = 0; i < dataTable.Columns.Count; i++)
{
dataTable.Rows[0][dataTable.Columns[i].ToString()] = dataTable.Columns[i].ToString();
}
dt1 = dataTable.Copy();
dt2 = dt_ElementalSubstance.Copy();
return true;
}
private DataTable MaterialElementComposition(DataTable a_ElementalSubstance, int NumberOfColumns,OTSReport_Export m_otsreport_export)
{
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 dt_ElementalSubstance;
}
private DataTable ElementSorting(DataTable AllAnalysisDetails, List ClassName, ParticleData fielddata)
{
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 ElementSorting_dt;
}
private DataTable ElementSortingSS(DataTable AllAnalysisDetails, List ClassName, ParticleData fielddata)
{
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();
DataTable dt_Element = dt.Copy();
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 ElementSorting_dt;
}
private DataTable ElementalSubstance(DataTable AllAnalysisDetails, List ClassName, ParticleData fielddata)
{
//当前元素物质类面积的总和
double ElementalSubstance = 0;
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 < 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);
}
}
if (dt.Rows.Count == 0)
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 datatSuncolumn(DataTable dt, string str)
{
double sum = 0;
for (int i = 0; i < dt.Rows.Count; i++)
{
if (dt.Rows[i][str].ToString() == "")
{
dt.Rows[i][str] = 0;
}
sum = sum + Convert.ToDouble(dt.Rows[i][str].ToString());
}
return sum;
}
}
}