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;
}
}
}