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