using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Xml;
using XImagingXhandler.XDAL;
using System.Collections.ObjectModel;
using XCommon;
using DataRWDAL;
namespace XImagingXhandler.XDAL
{
///
/// 文件中孔位的计算排序等
///
public class WellFileCalc
{
#region 重新排序文件移液表格中的数据,使得数据为同一板内一列一列显示
///
/// 重新排序文件移液表格中的数据,使得数据为同一板内一列一列显示
///
/// 移液表
/// 待排序的列名
/// 排序方式:asc;desc
/// 某一列排序后的移液表
public DataTable SortFileData(DataTable dataTable, string sortColumn, string sortType)
{
DataTable dt = new DataTable();
if (dataTable != null)
{
DataView dv = dataTable.DefaultView;
dv.Sort = sortColumn + " " + sortType;
dt = dv.ToTable();
}
return dt;
}
#endregion
#region 重新排序文件移液表格中的数据,使得数据为同一板内一列一列显示A1~H1 A2~H2 ... A12~H12
///
/// 重新排序文件移液表格中的数据,使得数据为同一板内一列一列显示A1~H1 A2~H2 ... A12~H12
///
/// 移液表
/// 台面布局xmlnode
/// 移液方法xmlnode
/// 输出参数,数据中不包含的孔位集合
/// 同一列体积是否相同
/// 目标孔是否是完整的列
/// 更换Tip列是否完整
/// 所有列排序后的移液表
public DataTable SortFileData(DataTable dataTable, XmlNode plateNode, XmlNode methodNode, out List excludeWell, out bool bSameVolume, out bool bfullDecWell, out bool bfullChangeTips)
{
excludeWell = new List();
DataTable dt = dataTable.Clone();
bSameVolume = true;//同一列体积是否相同
bfullDecWell = true;//目标孔是否是完整的列
bfullChangeTips = true;//更换Tip列是否完整
if (dataTable != null)
{
//DataView dv = dataTable.DefaultView;
//dv.Sort = sortColumn + " " + sortType;
string colSrcName = methodNode.SelectSingleNode("sourceLabware").InnerText;
string colSrcWellName = methodNode.SelectSingleNode("sourceWell").InnerText;
string colVolumeName = methodNode.SelectSingleNode("destVolume").InnerText;
string colTipSet = methodNode.SelectSingleNode("tipSet").InnerText;
//把数据表中所有的来源板的行列数获取
List labwares = this.GetLabwaresByDataTable(dataTable, colSrcName, colSrcWellName, plateNode);
string wellName = "";//保存当前的孔名称
//来源孔位排序之后,看看目标板位是否完整
string colDecName = methodNode.SelectSingleNode("destinationLabware").InnerText;
string colDecWellName = methodNode.SelectSingleNode("destinationWell").InnerText;
List decLabwares = new List();
decLabwares = this.GetLabwaresByDataTable(dataTable, colDecName, colDecWellName, plateNode);
for (int m = 0; m < labwares.Count; m++)// Labware labware in labwares)
{
ObservableCollection labware01 = LabwareDB.GetLabware(1, labwares[m].labware_id);
if (labware01.Count == 0)
{
labware01 = LabwareDB.GetLabware(0, labwares[m].labware_id);
}
for (int i = 1; i < (int)labware01[0].number_column + 1; i++)// 列
{
float destVolume = 0.0f;//目标体积
int countlabware = 0;//目标板位被统计的次数
int countwell = 0;//目标板的孔位被统计的次数
int counttip = 0;//目标板的Tips设置被统计的次数
string declabwarename = "";
string decwellname = "";
string decTip = "";
for (int j = 1; j < labware01[0].number_row + 1; j++)//行
{
string rowName = ComUtility.GetRowChar(j - 1);
wellName = rowName + i.ToString();
//拿着该孔到datatable中查询数据,如果存在,则把它添加到dt中,如果不存在就跳过
var a = dataTable.Select(colSrcName + "='" + labwares[m].labware_name + "' and " + colSrcWellName + "='" + wellName + "'");
DataRow am = null;
if (a.Length > 1)
{
//查询比当前m小的同类型板的个数
int vId = 0;
for (int im = 0; im < (m); im++)
{
if (labwares[im].labware_name == labwares[m].labware_name)
{
vId++;
}
}
am = a[vId];
}
else if (a.Length == 1)
{
am = a[0];
}
if (a.Length != 0)
{
DataRow ndr = dt.NewRow();
for (int q = 0; q < am.ItemArray.Length; q++)
{
ndr[q] = am.ItemArray[q];
}
dt.Rows.Add(ndr);
if (j == 1)
{
destVolume = (float)Convert.ToDouble(am[colVolumeName]);
//获取此条记录的目标板和目标孔位
declabwarename = am[colDecName].ToString();
decwellname = am[colDecWellName].ToString();
countlabware++;
countwell++;
if (dataTable.Columns.Contains(colTipSet))//如果包含Tip列的话,可以判断
{
decTip = am[colTipSet].ToString();
counttip++;
}
}
else
{
if ((float)Convert.ToDouble(am[colVolumeName]) != destVolume)
{
bSameVolume = false;
}
if (am[colDecName].ToString() == declabwarename)
{
countlabware++;
string index1 = decwellname.Substring(1, decwellname.Length - 1);
string s = am[colDecWellName].ToString();
string index2 = s.Substring(1, s.Length - 1);
if (index1 == index2)
{
countwell++;
}
}
if (dataTable.Columns.Contains(colTipSet))//如果包含Tip列的话,可以判断
{
if (am[colTipSet].ToString() == decTip)
{
counttip++;
}
}
}
//判断每列最后一个行结束时,总个数是否能被行数整除,如果能则表示完整,否则记录不完整的数据
if (j == labware01[0].number_row)
{
if (countlabware != countwell || countwell != labware01[0].number_row)
{
bfullDecWell = false;
}
if (counttip != labware01[0].number_row)
{
bfullChangeTips = false;
}
}
}
else//有没有的列
{
if (j != 1)
{
string index3 = wellName.Substring(0, 1);
//查询看看本列的第一个孔在不在
var b = dt.Select(colSrcName + "='" + labwares[m].labware_name + "' and " + colSrcWellName + "='" + index3 + "1'");
if (b.Length == 0)//不在的话,就不添加进入dt,在的话就添加进入dt
{
//DropdownName dropdownName = new DropdownName();
//dropdownName.dropdown_id = labwares[m].labware_name;
//dropdownName.dropdown_name = wellName;
//excludeWell.Add(dropdownName);
}
else
{
}
}
}
}
}
}
}
return dt;
}
#endregion
#region 从指定的数据列中获取labware数据集合
///
/// 从指定的数据列中获取labware数据集合
///
/// 移液数据
/// 指定的列名
/// 指定的来源孔列名
/// 当前台面布局
/// labware数据集合
public List GetLabwaresByDataTable(DataTable dt, string colName, string colWellName, XmlNode xmlNode)
{
List labwares = new List();
if (dt != null)
{
foreach (DataRow dr in dt.Rows)
{
var labname = xmlNode.SelectSingleNode("platform[labware_sname='" + dr[colName] + "']");
if (labname != null)
{
var labid = labname.SelectSingleNode("labware_id");
var labsname = labname.SelectSingleNode("labware_sname");
if (labwares.Count != 0)
{
var hasLabwares = labwares.FindAll(x => x.labware_id == labid.InnerText && x.labware_name == labsname.InnerText && x.labware_well_id == dr[colWellName].ToString());
if (hasLabwares.Count > 1)
{
Labware labware = new Labware();
labware.labware_id = labid.InnerText;
labware.labware_name = dr[colName].ToString();
labware.labware_well_id = dr[colWellName].ToString();
labwares.Add(labware);
continue;
}
else if (hasLabwares.Count == 1)
{
Labware labware = new Labware();
labware.labware_id = labid.InnerText;
labware.labware_name = dr[colName].ToString();
labware.labware_well_id = dr[colWellName].ToString();
labwares.Add(labware);
}
else
{
if (labwares.FindAll(x => x.labware_id == labid.InnerText && x.labware_name == labsname.InnerText).Count == 0)
{
Labware labware = new Labware();
labware.labware_id = labid.InnerText;
labware.labware_name = dr[colName].ToString();
labware.labware_well_id = dr[colWellName].ToString();
labwares.Add(labware);
}
else
{
}
}
}
else
{
Labware labware = new Labware();
labware.labware_id = labid.InnerText;
labware.labware_name = dr[colName].ToString();
labware.labware_well_id = dr[colWellName].ToString();
labwares.Add(labware);
}
}
}
}
return labwares;
}
#endregion
}
}