using OTSCommon.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 OTSIncAReportApp.OTSReport_Export;
namespace OTSIncAReportApp._1_UI.OTSReportExport.DataIntegration
{
///
/// 元素分析
///
class ElementalAnalysis
{
///
/// 元素分析表(表头、表数据、全数据)
///
///
///
///
public List GetElementData(c_TemplateClass m_mbszclass, OTSReport_Export m_otsreport_export,string ComputeMode)
{
DataTable data = GetDBData(m_mbszclass, m_otsreport_export, ComputeMode);
//根据sql条件,查询获取颗粒信息数据
ParticleData fielddata = new ParticleData(m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.getSelectedIndex()].FilePath);
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 = fielddata.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
{
//if (getClass_dt.Rows[i]["GroupName"].ToString() != "Default")
//{
ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString());
//}
}
}
//统计元素物质大类的元素信息和面积占比
DataTable dt_ElementalSubstance = ElementalSubstance(AllAnalysisDetails, ClassName, fielddata);
//统计元素并按照Class Name自定义列表进行排序,大类中的小类元素信息按照面积从大到小排序
DataTable dt_ElementSorting = ElementSorting(AllAnalysisDetails, ClassName, fielddata);
//生成最后导出时物质元素成分表
DataTable dt = MaterialElementComposition(dt_ElementalSubstance, 13, m_otsreport_export);//导出14个元素成分信息
//生成最后导出时物质元素细分表
DataTable dtname = new DataTable();
DataTable dtData = new DataTable();
SubdivisionOfMaterialElements(dt_ElementSorting, 13, ClassName, dt, out dtname, out dtData);
//allElement_dt = dt_ElementSorting.Copy();
List datas = new List();
datas.Add(dtname);
datas.Add(dtData);
datas.Add(dt_ElementSorting);
return datas;
}
private DataTable GetDBData(c_TemplateClass m_mbszclass, OTSReport_Export m_otsreport_export,string ComputeMode)
{
DataTable m_bt_DBData = new DataTable();
ParticleData fielddata = new ParticleData(m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.getSelectedIndex()].FilePath);
List colid = new List() { "TypeName", "ar", "TypeId", "Largest", "Class", "con" };
//获取粒级表
string path1 = m_otsreport_export.m_ReportApp.m_rstDataMgr.m_RptConfigFile.PartSizeFileFolder +
m_otsreport_export.m_ReportApp.m_rstDataMgr.m_RptConfigFile.PartSizeFile;
DataSet ds = OTSIncAReportApp.DataOperation.DataAccess.XMLoperate.GetXml(path1);
string sizestr = ds.Tables[0].Rows[0]["Sizes"].ToString();
for (int i = 0; i < sizestr.Split(',').Length - 1; i++)
{
if (sizestr.Split(',')[i].Length > 0)
{
double d1 = Convert.ToDouble(sizestr.Split(',')[i]);
double d2 = Convert.ToDouble(sizestr.Split(',')[i + 1]);
colid.Add(d1.ToString() + "~" + d2.ToString());
}
}
double d = Convert.ToDouble(sizestr.Split(',')[sizestr.Split(',').Length - 1]);
colid.Add(d.ToString() + "~MAX");
for (int i = 0; i < colid.Count; i++)
{
m_bt_DBData.Columns.Add(colid[i].ToString());
}
DataTable dt = InvalidRemoval(fielddata.GetParticleListForParticlSize("area", ""));
DataTable AreaInformationOfAllElements = InvalidRemoval(fielddata.GetAreaByAllIncA(""));
DataTable dtp = InvalidRemoval(fielddata.GetParticleAll(""));
string po = ComputeMode;
for (int i = 0; i < dt.Rows.Count; i++)
{
DataRow dr = m_bt_DBData.NewRow();
dr["TypeName"] = dt.Rows[i]["TypeName"].ToString();
dr["TypeId"] = dt.Rows[i]["TypeId"].ToString();
dr["con"] = dt.Rows[i]["con"].ToString();
if (dt.Rows[i]["GroupName"].ToString() == "")
dr["Class"] = "Default";
else
dr["Class"] = dt.Rows[i]["GroupName"].ToString();
//continue;
dr["Largest"] = Math.Round(Convert.ToDouble(dt.Rows[i]["max"]), 2);
for (int a = 6; a < colid.Count; a++)
{
string d1 = colid[a].Split('~')[0];
string d2 = colid[a].Split('~')[1];
if (d2 == "MAX")
{
d2 = "999";
}
DataRow[] datas = dtp.Select(getWhere(d2, d1, po, dt.Rows[i]["TypeId"].ToString()));
dr[colid[a]] = datas.Count();
}
for (int a = 0; a < AreaInformationOfAllElements.Rows.Count; a++)
{
if (dt.Rows[i]["TypeId"].ToString() == AreaInformationOfAllElements.Rows[a]["TypeId"].ToString())
{
dr["ar"] = AreaInformationOfAllElements.Rows[a]["ar"];
}
}
m_bt_DBData.Rows.Add(dr);
}
//去除物质分类(非夹杂物分类)
for (int a = 0; a < m_mbszclass.M_KLLBXX.list_str_kllb_DeleteClass.Count; a++)
{
for (int i = m_bt_DBData.Rows.Count - 1; i >= 0; i--)
{
if (m_bt_DBData.Rows[i]["TypeName"].ToString() == m_mbszclass.M_KLLBXX.list_str_kllb_DeleteClass[a].ToString())
{
m_bt_DBData.Rows.RemoveAt(i);
}
}
}
if (m_mbszclass.list_str_MainPriority.Count==0)
{
return m_bt_DBData;
}
DataTable datass = m_bt_DBData.Clone();
for (int i = 0; i < m_mbszclass.list_str_MainPriority.Count; i++)
{
bool bl = false;
for (int a = 0; a < m_bt_DBData.Rows.Count; a++)
{
if (m_bt_DBData.Rows[a]["TypeName"].ToString() == m_mbszclass.list_str_MainPriority[i])
{
datass.Rows.Add(m_bt_DBData.Rows[a].ItemArray);
bl = true;
continue;
}
}
if (!bl)
{
DataTable dta = m_bt_DBData.Clone();
if (m_bt_DBData.Rows.Count!=0)
{
dta.Rows.Add(m_bt_DBData.Rows[0].ItemArray);
for (int b = 0; b < dta.Columns.Count; b++)
{
if (dta.Columns[b].ColumnName == "TypeName")
{
dta.Rows[0][b] = m_mbszclass.list_str_MainPriority[i];
}
else if (dta.Columns[b].ColumnName == "Class")
{
dta.Rows[0][b] = "Default";
}
else
{
dta.Rows[0][b] = 0;
}
}
datass.Rows.Add(dta.Rows[0].ItemArray);
}
}
}
return datass;
}
private DataTable GetParticleListForParticlSize(DataTable data, DataTable table)
{
DataTable dt_Partick = new DataTable();
dt_Partick.Columns.Add("TypeId");
dt_Partick.Columns.Add("TypeName");
dt_Partick.Columns.Add("TypeColor");
dt_Partick.Columns.Add("con");
dt_Partick.Columns.Add("ar");
dt_Partick.Columns.Add("max");
dt_Partick.Columns.Add("Area", typeof(double));
dt_Partick.Columns.Add("GroupName");
List typeName = new List();
for (int i = 0; i < data.Rows.Count; i++)
{
typeName.Add(data.Rows[i]["TypeId"].ToString());
}
typeName = typeName.Distinct().ToList();
for (int i = 0; i < typeName.Count; i++)
{
DataTable dt = dt_Partick.Clone();
for (int j = 0; j < data.Rows.Count; j++)
{
if (typeName[i].ToString() == data.Rows[j]["TypeId"].ToString())
{
DataRow row = dt.NewRow();
row["TypeId"] = data.Rows[j]["TypeId"];
row["TypeName"] = data.Rows[j]["TypeName"];
row["TypeColor"] = data.Rows[j]["TypeColor"];
row["Area"] = data.Rows[j]["Area"];
dt.Rows.Add(row);
}
}
DataRow dr = dt_Partick.NewRow();
dr["TypeId"] = dt.Rows[0]["TypeId"].ToString();
dr["TypeName"] = dt.Rows[0]["TypeName"].ToString();
dr["TypeColor"] = dt.Rows[0]["TypeColor"].ToString();
dr["con"] = dt.Rows.Count;
dr["ar"] = dt.Compute("min(Area)", "");
dr["max"] = dt.Compute("Max(Area)", "");
dr["Area"] = dt.Compute("SUM(Area)", "");
dt_Partick.Rows.Add(dr);
}
for (int i = 0; i < dt_Partick.Rows.Count; i++)
{
for (int j = 0; j < table.Rows.Count; j++)
{
if (dt_Partick.Rows[i]["TypeId"].ToString() == table.Rows[j]["TypeId"].ToString())
{
dt_Partick.Rows[i]["GroupName"] = table.Rows[j]["GroupName"];
break;
}
}
}
return dt_Partick;
}
private DataTable InvalidRemoval(DataTable dt)
{
DataTable dataTable = dt.Copy();
dataTable.Clear();
for (int i = 0; i < dt.Rows.Count; i++)
{
if (Convert.ToInt32(dt.Rows[i]["TypeId"]) > 10)
{
dataTable.Rows.Add(dt.Rows[i].ItemArray);
}
}
return dataTable;
}
private string getWhere(string max, string min, string col, string partic)
{
return col + ">=" + min + " and " + col + "<" + max + " and TypeId=" + partic;
}
///
/// 判断是否有大分类,有为true
///
///
///
public bool IsThereAMajorClassification(OTSReport_Export m_otsreport_export)
{
ParticleData fielddata = new ParticleData(m_otsreport_export.m_ReportApp.m_rstDataMgr.ResultFilesList[m_otsreport_export.m_ReportApp.m_rstDataMgr.getSelectedIndex()].FilePath);
DataTable getClass_dt = fielddata.GetAllClass();
List ClassName = new List();
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
{
if (getClass_dt.Rows[i]["GroupName"].ToString() != "Default")
{
ClassName.Add(getClass_dt.Rows[i]["GroupName"].ToString());
}
}
}
if (ClassName.Count < 2)
{
return false;
}
else
{
return true;
}
}
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[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 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;
}
///
/// 参数归一化
///
/// 总数
/// 传参
///
public string ParameterNormalization(double a_mi, double m)
{
double ColVal = Convert.ToDouble(m / a_mi * 100);
if (ColVal == 0)
{
return "";
}
else
{
return Math.Round(ColVal, 2).ToString();
}
}
}
}