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
|
{
|
/// <summary>
|
/// 文件中孔位的计算排序等
|
/// </summary>
|
public class WellFileCalc
|
{
|
|
#region 重新排序文件移液表格中的数据,使得数据为同一板内一列一列显示
|
/// <summary>
|
/// 重新排序文件移液表格中的数据,使得数据为同一板内一列一列显示
|
/// </summary>
|
/// <param name="dataTable">移液表</param>
|
/// <param name="sortColumn">待排序的列名</param>
|
/// <param name="sortType">排序方式:asc;desc</param>
|
/// <returns>某一列排序后的移液表</returns>
|
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
|
/// <summary>
|
/// 重新排序文件移液表格中的数据,使得数据为同一板内一列一列显示A1~H1 A2~H2 ... A12~H12
|
/// </summary>
|
/// <param name="dataTable">移液表</param>
|
/// <param name="plateNode">台面布局xmlnode</param>
|
/// <param name="methodNode">移液方法xmlnode</param>
|
/// <param name="excludeWell">输出参数,数据中不包含的孔位集合</param>
|
/// <param name="bSameVolume">同一列体积是否相同</param>
|
/// <param name="bfullDecWell">目标孔是否是完整的列</param>
|
/// <param name="bfullChangeTips">更换Tip列是否完整</param>
|
/// <returns>所有列排序后的移液表</returns>
|
public DataTable SortFileData(DataTable dataTable, XmlNode plateNode, XmlNode methodNode, out List<DropdownName> excludeWell, out bool bSameVolume, out bool bfullDecWell, out bool bfullChangeTips)
|
{
|
excludeWell = new List<DropdownName>();
|
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<Labware> labwares = this.GetLabwaresByDataTable(dataTable, colSrcName, colSrcWellName, plateNode);
|
|
string wellName = "";//保存当前的孔名称
|
|
//来源孔位排序之后,看看目标板位是否完整
|
string colDecName = methodNode.SelectSingleNode("destinationLabware").InnerText;
|
string colDecWellName = methodNode.SelectSingleNode("destinationWell").InnerText;
|
List<Labware> decLabwares = new List<Labware>();
|
decLabwares = this.GetLabwaresByDataTable(dataTable, colDecName, colDecWellName, plateNode);
|
|
for (int m = 0; m < labwares.Count; m++)// Labware labware in labwares)
|
{
|
ObservableCollection<XImagingXhandler.XDAL.Labware> 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数据集合
|
/// <summary>
|
/// 从指定的数据列中获取labware数据集合
|
/// </summary>
|
/// <param name="dt">移液数据</param>
|
/// <param name="colName">指定的列名</param>
|
/// <param name="colWellName">指定的来源孔列名</param>
|
/// <param name="xmlNode">当前台面布局</param>
|
/// <returns>labware数据集合</returns>
|
public List<Labware> GetLabwaresByDataTable(DataTable dt, string colName, string colWellName, XmlNode xmlNode)
|
{
|
|
List<Labware> labwares = new List<Labware>();
|
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
|
|
}
|
}
|