using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XImagingXhandler.XDAL;
using System.Data;
using XCoreBLL.Resource;
using System.Xml;
using XCommon;
using DataEntity.Share;
using DataRWDAL;
using DataEntity;
namespace XCore
{
///
/// 文件移液业务逻辑类
///
public class TransferFileBll
{
WellFileCalc wellFileCalc = new WellFileCalc();
#region 获取DataTable的表头名称数据集合
///
/// 获取DataTable的表头名称数据集合
///
///
///
public List GetTransferFileHeaders(DataTable dataTable)
{
List transferFileHeaders = new List();
TransferFileHeader transferFileHeader = new TransferFileHeader();
transferFileHeader.header_id = "0";
transferFileHeader.header_name = "请选择";
transferFileHeaders.Add(transferFileHeader);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
transferFileHeader = new TransferFileHeader();
transferFileHeader.header_id = dataTable.Columns[i].ColumnName;
transferFileHeader.header_name = dataTable.Columns[i].ColumnName;
transferFileHeaders.Add(transferFileHeader);
}
return transferFileHeaders;
}
#endregion
public MethodTransferFile GenerateMethodTransferFileDataByXmlNode(XmlNode xmlNode)
{
MethodTransferFile methodTransferFile = new MethodTransferFile();
methodTransferFile.isrun = xmlNode.SelectSingleNode("isrun").InnerText;
methodTransferFile.status = xmlNode.SelectSingleNode("status").InnerText;
methodTransferFile.name = xmlNode.SelectSingleNode("name").InnerText;
methodTransferFile.label = xmlNode.SelectSingleNode("label").InnerText;
methodTransferFile.strIndex = xmlNode.SelectSingleNode("strIndex").InnerText;
methodTransferFile.armText = xmlNode.SelectSingleNode("arm/text").InnerText;
methodTransferFile.armValue = xmlNode.SelectSingleNode("arm/value").InnerText;
methodTransferFile.headType = xmlNode.SelectSingleNode("headType").InnerText;
methodTransferFile.labwaretipText = xmlNode.SelectSingleNode("labwaretip/text").InnerText;
methodTransferFile.labwaretipValue = xmlNode.SelectSingleNode("labwaretip/value").InnerText;
string strchs = xmlNode.SelectSingleNode("channels").InnerText;
methodTransferFile.channels = ComUtility.GetChannelsFromXml(strchs);
methodTransferFile.filePath = xmlNode.SelectSingleNode("filePath").InnerText;
methodTransferFile.beginLine = Convert.ToInt32(xmlNode.SelectSingleNode("beginLine").InnerText);
methodTransferFile.transferDataTable = GenerateTransferFileDataTable(xmlNode);
methodTransferFile.sourceLabware = xmlNode.SelectSingleNode("sourceLabware").InnerText;
methodTransferFile.sourceWell = xmlNode.SelectSingleNode("sourceWell").InnerText;
methodTransferFile.destinationLabware = xmlNode.SelectSingleNode("destinationLabware").InnerText;
methodTransferFile.destinationWell = xmlNode.SelectSingleNode("destinationWell").InnerText;
methodTransferFile.destVolume = xmlNode.SelectSingleNode("destVolume").InnerText;
methodTransferFile.tipSet = xmlNode.SelectSingleNode("tipSet").InnerText;
methodTransferFile.changeTipsMode = Convert.ToInt32(xmlNode.SelectSingleNode("changeTipsMode").InnerText);
methodTransferFile.changeToTipText = xmlNode.SelectSingleNode("changeToTipText").InnerText;
methodTransferFile.changeToTipValue = Convert.ToInt32(xmlNode.SelectSingleNode("changeToTipValue").InnerText);
methodTransferFile.jump0Volume = xmlNode.SelectSingleNode("jump0Volume").InnerText.ToLower() == "true" ? true : false;
methodTransferFile.liquididText = xmlNode.SelectSingleNode("liquidid/text").InnerText;
methodTransferFile.liquididValue = xmlNode.SelectSingleNode("liquidid/value").InnerText;
methodTransferFile.liquidrangeidText = xmlNode.SelectSingleNode("liquidrangeid/text").InnerText;
methodTransferFile.liquidrangeidValue = xmlNode.SelectSingleNode("liquidrangeid/value").InnerText;
methodTransferFile.liquidpidText = xmlNode.SelectSingleNode("liquidpid/text").InnerText;
methodTransferFile.liquidpidValue = xmlNode.SelectSingleNode("liquidpid/value").InnerText;
methodTransferFile.bMix = xmlNode.SelectSingleNode("enableMix").InnerText.ToLower() == "true" ? true : false;
methodTransferFile.mixvolume = Convert.ToDouble(xmlNode.SelectSingleNode("mixvolume").InnerText);
methodTransferFile.mixcount = Convert.ToInt32(xmlNode.SelectSingleNode("mixcount").InnerText);
methodTransferFile.mixAspiratePositionText = xmlNode.SelectSingleNode("mixAspiratePosition/text").InnerText;
methodTransferFile.mixAspiratePositionValue = Convert.ToInt32(xmlNode.SelectSingleNode("mixAspiratePosition/value").InnerText);
methodTransferFile.mixAspirateDistance = Convert.ToDouble(xmlNode.SelectSingleNode("mixAspirateDistance").InnerText);
methodTransferFile.mixAspirateSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("mixAspirateSpeed").InnerText);
methodTransferFile.mixDispensePositionText = xmlNode.SelectSingleNode("mixDispensePosition/text").InnerText;
methodTransferFile.mixDispensePositionValue = Convert.ToInt32(xmlNode.SelectSingleNode("mixDispensePosition/value").InnerText);
methodTransferFile.mixDispenseDistance = Convert.ToDouble(xmlNode.SelectSingleNode("mixDispenseDistance").InnerText);
methodTransferFile.mixDispenseSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("mixDispenseSpeed").InnerText);
methodTransferFile.enableLiquidSensor = xmlNode.SelectSingleNode("enableLiquidSensor").InnerText.ToLower() == "true" ? true : false;
methodTransferFile.liquidSensorCount = Convert.ToInt32(xmlNode.SelectSingleNode("liquidSensorCount").InnerText);
methodTransferFile.liquidSensorDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorDistance").InnerText);
methodTransferFile.liquidSensorEndDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorEndDistance").InnerText);
methodTransferFile.liquidSensorSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorSpeed").InnerText);
methodTransferFile.liquidSensorRadio = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorRadio").InnerText);
methodTransferFile.liquidSensorDisIdText = xmlNode.SelectSingleNode("liquidSensorDisId/text").InnerText;
methodTransferFile.liquidSensorDisIdValue = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorDisId/value").InnerText);
methodTransferFile.enableLiquidFollow = xmlNode.SelectSingleNode("enableLiquidFollow").InnerText.ToLower() == "true" ? true : false;
methodTransferFile.liquidFollowType = Convert.ToInt32(xmlNode.SelectSingleNode("liquidFollowType/value").InnerText);
methodTransferFile.liquidFollowTypeName = xmlNode.SelectSingleNode("liquidFollowType/text").InnerText;
methodTransferFile.liquidFollowSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("liquidFollowSpeed").InnerText);
methodTransferFile.liquidFollowDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidFollowDistance").InnerText);
methodTransferFile.liquidFollowArea = Convert.ToDouble(xmlNode.SelectSingleNode("liquidFollowArea").InnerText);
methodTransferFile.enableMixFollow = xmlNode.SelectSingleNode("enableMixFollow").InnerText.ToLower() == "true" ? true : false;
methodTransferFile.enableSensorBlock = xmlNode.SelectSingleNode("enableSensorBlock").InnerText.ToLower() == "true" ? true : false;
//methodTransferFile.liquidSensorBlockDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorBlockDistance").InnerText);
methodTransferFile.aspirateBlockDisIdText = xmlNode.SelectSingleNode("aspirateBlockDisId/text").InnerText;
methodTransferFile.aspirateBlockDisIdValue = Convert.ToInt32(xmlNode.SelectSingleNode("aspirateBlockDisId/value").InnerText);
methodTransferFile.dispenseBlockDisIdText = xmlNode.SelectSingleNode("dispenseBlockDisId/text").InnerText;
methodTransferFile.dispenseBlockDisIdValue = Convert.ToInt32(xmlNode.SelectSingleNode("dispenseBlockDisId/value").InnerText);
methodTransferFile.aspirateAirDisIdText = xmlNode.SelectSingleNode("aspirateAirDisId/text").InnerText;
methodTransferFile.aspirateAirDisIdValue = Convert.ToInt32(xmlNode.SelectSingleNode("aspirateAirDisId/value").InnerText);
return methodTransferFile;
}
public DataTable GenerateTransferFileDataTable(XmlNode xmlNode)
{
XmlNode xmlNode2 = xmlNode.SelectSingleNode("transferDataTable");
DataTable dataTable = new DataTable();
foreach (XmlNode childNode in xmlNode2.ChildNodes)
{
DataColumn dataColumn = new DataColumn();
dataColumn.ColumnName = childNode.Attributes["columnname"].Value.ToString();
dataTable.Columns.Add(dataColumn);
}
if (xmlNode2.ChildNodes[0] != null)
{
for (int i = 0; i < xmlNode2.ChildNodes[0].ChildNodes.Count; i++)
{
DataRow dataRow = dataTable.NewRow();
for (int j = 0; j < xmlNode2.ChildNodes.Count; j++)
{
dataRow[j] = xmlNode2.ChildNodes[j].ChildNodes[i].InnerText;
}
dataTable.Rows.Add(dataRow);
}
}
return dataTable;
}
#region 当前系统语言
string strCurrentCulture = "";
#endregion
#region 构造函数
public TransferFileBll()
{
strCurrentCulture = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
}
#endregion
#region 检查所有属性设置是否满足要求
///
/// 检查所有属性设置是否满足要求
///
/// 文件移液属性对象
/// 检查所有属性设置是否满足要求
public MethodPropertyInfo CheckProperty(MethodTransferFile methodTransferFile)
{
MethodPropertyInfo methodPropertyInfo = new MethodPropertyInfo();
if (strCurrentCulture == "zh-CN")
{
methodPropertyInfo.property_tips_info = TransferFileResourceCHS.tipsInfo.ToString();
if (methodTransferFile.armText == null || methodTransferFile.armText == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.armText.ToString();
}
//if (methodTransferFile.aspirateMixCount != null || methodTransferFile.aspirateMixCount != "")
//{
// if (methodTransferFile.aspirateMixVolume == null || methodTransferFile.aspirateMixVolume == "")
// {
// methodPropertyInfo.property_name_info = TransferFileResourceCHS.aspirateMixVolume.ToString();
// }
//}
//if (methodTransferFile.dispenseMixCount != null || methodTransferFile.dispenseMixCount != "")
//{
// if (methodTransferFile.dispenseMixVolume == null || methodTransferFile.dispenseMixVolume == "")
// {
// methodPropertyInfo.property_name_info = TransferFileResourceCHS.dispenseMixVolume.ToString();
// }
//}
//if (methodTransferFile.ChannelText == null || methodTransferFile.ChannelText == "")
//{
// methodPropertyInfo.property_name_info = TransferFileResourceCHS.ChannelText.ToString();
//}
if (methodTransferFile.destinationLabware == null || methodTransferFile.destinationLabware == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.destinationLabware.ToString();
}
if (methodTransferFile.destinationWell == null || methodTransferFile.destinationWell == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.destinationWell.ToString();
}
if (methodTransferFile.destVolume == null || methodTransferFile.destVolume == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.destVolume.ToString();
}
if (methodTransferFile.filePath == null || methodTransferFile.filePath == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.filePath.ToString();
}
if (methodTransferFile.labwaretipText == null || methodTransferFile.labwaretipText == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.labwaretipText.ToString();
}
if (methodTransferFile.liquididText == null || methodTransferFile.liquididText == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.liquididText.ToString();
}
if (methodTransferFile.sourceLabware == null || methodTransferFile.sourceLabware == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.sourceLabware.ToString();
}
if (methodTransferFile.sourceWell == null || methodTransferFile.sourceWell == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.sourceWell.ToString();
}
if (methodTransferFile.transferDataTable == null || methodTransferFile.transferDataTable.Rows.Count == 0)
{
methodPropertyInfo.property_name_info = TransferFileResourceCHS.transferDataTable.ToString();
}
}
else if (strCurrentCulture == "en-US")
{
methodPropertyInfo.property_tips_info = TransferFileResourceENU.tipsInfo.ToString();
if (methodTransferFile.armText == null || methodTransferFile.armText == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.armText.ToString();
}
//if (methodTransferFile.aspirateMixCount != null || methodTransferFile.aspirateMixCount != "")
//{
// if (methodTransferFile.aspirateMixVolume == null || methodTransferFile.aspirateMixVolume == "")
// {
// methodPropertyInfo.property_name_info = TransferFileResourceENU.aspirateMixVolume.ToString();
// }
//}
//if (methodTransferFile.dispenseMixCount != null || methodTransferFile.dispenseMixCount != "")
//{
// if (methodTransferFile.dispenseMixVolume == null || methodTransferFile.dispenseMixVolume == "")
// {
// methodPropertyInfo.property_name_info = TransferFileResourceENU.dispenseMixVolume.ToString();
// }
//}
//if (methodTransferFile.ChannelText == null || methodTransferFile.ChannelText == "")
//{
// methodPropertyInfo.property_name_info = TransferFileResourceENU.ChannelText.ToString();
//}
if (methodTransferFile.destinationLabware == null || methodTransferFile.destinationLabware == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.destinationLabware.ToString();
}
if (methodTransferFile.destinationWell == null || methodTransferFile.destinationWell == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.destinationWell.ToString();
}
if (methodTransferFile.destVolume == null || methodTransferFile.destVolume == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.destVolume.ToString();
}
if (methodTransferFile.filePath == null || methodTransferFile.filePath == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.filePath.ToString();
}
if (methodTransferFile.labwaretipText == null || methodTransferFile.labwaretipText == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.labwaretipText.ToString();
}
if (methodTransferFile.liquididText == null || methodTransferFile.liquididText == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.liquididText.ToString();
}
if (methodTransferFile.sourceLabware == null || methodTransferFile.sourceLabware == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.sourceLabware.ToString();
}
if (methodTransferFile.sourceWell == null || methodTransferFile.sourceWell == "")
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.sourceWell.ToString();
}
if (methodTransferFile.transferDataTable == null || methodTransferFile.transferDataTable.Rows.Count == 0)
{
methodPropertyInfo.property_name_info = TransferFileResourceENU.transferDataTable.ToString();
}
}
return methodPropertyInfo;
}
#endregion
#region 检查数据中的板子名称是否在台面存在
///
/// 检查数据中的板子名称是否在台面存在
///
/// 文件方法属性对象
/// 台面板位xmlNode
/// 耗材名称
/// true:存在;false:不存在
public bool CheckDataExist(MethodTransferFile methodTransferFile, XmlNode xmlEnv, out string labwareName)
{
bool bResult = true;
labwareName = "";
try
{
if (methodTransferFile.transferDataTable != null)
{
DataTable dt = methodTransferFile.transferDataTable;
string colSrcName = methodTransferFile.sourceLabware;//来源板列名
string colDesName = methodTransferFile.destinationLabware;//目标板列名
foreach (DataRow dr in dt.Rows)
{
XmlNodeList platformNode = xmlEnv.SelectNodes("platform");
bool isExistSource = false;//存在来源板
bool isExistDestination = false;//存在目标板
for (int i = 0; i < platformNode.Count; i++)
{
XmlNodeList labwareNodeList = platformNode[i].SelectNodes("labware");
var labwareSrcNode = labwareNodeList[0].SelectSingleNode("labware_sname[text()='" + dr[colSrcName].ToString() + "']");//='" + dr[colSrcName].ToString() + "'");
if (labwareSrcNode != null)
{
isExistSource = true;
break;
}
}
for (int i = 0; i < platformNode.Count; i++)
{
XmlNodeList labwareNodeList = platformNode[i].SelectNodes("labware");
var labwareDesNode = labwareNodeList[0].SelectSingleNode("labware_sname[text()='" + dr[colDesName].ToString() + "']");
if (labwareDesNode != null)
{
isExistDestination = true;
break;
}
}
if(!isExistSource)
{
bResult = false;
labwareName = dr[colSrcName].ToString();
return bResult;
}
if(!isExistDestination)
{
bResult = false;
labwareName = dr[colDesName].ToString();
return bResult;
}
}
}
}
catch
{
}
return bResult;
}
#endregion
#region 检查数据中的板子孔位是否完整(同一列,孔位指定的体积是否相同等)
///
/// 检查数据中的板子孔位是否完整
///
/// 文件方法属性对象
/// 台面板位xmlNode
/// 文件方法属性xmlNode
/// 移液文件数据表
/// 输出参数,数据中不包含的孔位集合
/// 同一列体积是否相同
/// 目标孔是否是完整的列
/// 更换Tip列是否完整
/// true:数据完整;false:数据不完整
public bool CheckDataIsIntegrity(MethodTransferFile methodTransferFile, XmlNode plateNode, XmlNode methodNode, out DataTable dt, out List excludeWells, out bool bSameVolume, out bool bfullDecWell, out bool bfullChangeTips)
{
bool bResult = true;
dt = new DataTable();
excludeWells = new List();
bSameVolume = true;
bfullDecWell = true;//目标孔是否是完整的列
bfullChangeTips = true;//更换Tip列是否完整
try
{
if (methodTransferFile.transferDataTable != null)
{
//调用排序方法排序
dt = wellFileCalc.SortFileData(methodTransferFile.transferDataTable, plateNode, methodNode, out excludeWells, out bSameVolume, out bfullDecWell, out bfullChangeTips);
if (excludeWells.Count > 0)
{
bResult = false;
}
}
}
catch
{
}
return bResult;
}
#endregion
#region 获取移液表中的来源板和目标板的耗材对象实体
public List GetLabwareEntities(MethodTransferFile methodTransferFile, XmlNode plateNode)
{
List labwares = new List();
try
{
if (methodTransferFile.transferDataTable != null)
{
DataTable dt = methodTransferFile.transferDataTable;
string colSrcName = methodTransferFile.sourceLabware;//来源板列名
string colDesName = methodTransferFile.destinationLabware;//目标板列名
foreach (DataRow dr in dt.Rows)
{
XmlNode srcPlatformNode = GetXmlNodeByBoardName(plateNode.SelectNodes("platform"), dr[colSrcName].ToString());//plateNode.SelectSingleNode("platform/labware[@id=max(../labware/@id)]");///labware_sname[text()='" + dr[colSrcName].ToString() + "']").ParentNode;
int num = srcPlatformNode.SelectNodes("labware").Count;
XmlNode srcLabwareNode = srcPlatformNode.SelectSingleNode("labware[@id='" + num.ToString()+ "']");
//var a = plateNode.SelectSingleNode("platform[labware_sname='" + dr[colSrcName] + "']");
if (srcLabwareNode != null)
{
LabwareRSLattice labwareRSLattice = new LabwareRSLattice();
Labware labware = LabwareDB.GetLabware(srcLabwareNode.SelectSingleNode("labware_id").InnerText);
labware.labware_sname = dr[colSrcName].ToString();
Lattice lattice = null;// ControlCom.GetLatticeId(srcPlatformNode.SelectSingleNode("lattice_id").InnerText,true);
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断
if (tabletopTemplate == null)
{
string latticeNumber = "P" + srcPlatformNode.SelectSingleNode("lattice_id").InnerText;
lattice = LatticeDB.GetLatticeDataByIdFromdb(latticeNumber, Convert.ToInt32(Shared.DeviceArmList.SingleOrDefault(x => x.arm_type.Equals(1)).device_arm_id), Shared.SoftwareInformation.software_device_number);//arm1
}
else
{
string latticeNumber = "P" + srcPlatformNode.SelectSingleNode("lattice_id").InnerText;
lattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb(latticeNumber, Convert.ToInt32(Shared.DeviceArmList.SingleOrDefault(x=>x.arm_type.Equals(1)).device_arm_id), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid);
}
labwareRSLattice.lattice = lattice;
labwareRSLattice.labware = labware;
if (labwares.FirstOrDefault(x => x.lattice.lattice_id.Equals(lattice.lattice_id)) == null)
{
labwares.Add(labwareRSLattice);
}
}
XmlNode desPlatformNode = GetXmlNodeByBoardName(plateNode.SelectNodes("platform"), dr[colDesName].ToString());//plateNode.SelectSingleNode("platform/labware[@id=max(../labware/@id)]");///labware_sname[text()='" + dr[colSrcName].ToString() + "']").ParentNode;
XmlNode desLabwareNode = srcPlatformNode.SelectSingleNode("labware[@id='" + desPlatformNode.SelectNodes("labware").Count + "']");
//var b = plateNode.SelectSingleNode("platform[labware_sname='" + dr[colDesName] + "']");
if (desLabwareNode != null)
{
LabwareRSLattice labwareRSLattice = new LabwareRSLattice();
Labware labware = LabwareDB.GetLabware(desLabwareNode.SelectSingleNode("labware_id").InnerText);
labware.labware_sname = dr[colDesName].ToString();
//Lattice lattice = LatticeDB.GetLatticeDataByIdFromdb(desPlatformNode.SelectSingleNode("lattice_id").InnerText);
Lattice lattice = null;// ControlCom.GetLatticeId(srcPlatformNode.SelectSingleNode("lattice_id").InnerText,true);
TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断
if (tabletopTemplate == null)
{
string latticeNumber = "P" + desPlatformNode.SelectSingleNode("lattice_id").InnerText;
lattice = LatticeDB.GetLatticeDataByIdFromdb(latticeNumber, Convert.ToInt32(Shared.DeviceArmList.SingleOrDefault(x => x.arm_type.Equals(1)).device_arm_id), Shared.SoftwareInformation.software_device_number);//arm1
}
else
{
string latticeNumber = "P" + desPlatformNode.SelectSingleNode("lattice_id").InnerText;
lattice = LatticeDB.GetLatticeDataByLatticeNumAndTempIdFromdb(latticeNumber, Convert.ToInt32(Shared.DeviceArmList.SingleOrDefault(x => x.arm_type.Equals(1)).device_arm_id), Shared.SoftwareInformation.software_device_number, tabletopTemplate.tabletopid);
}
labwareRSLattice.lattice = lattice;
labwareRSLattice.labware = labware;
if (labwares.FirstOrDefault(x => x.lattice.lattice_id.Equals(lattice.lattice_id)) == null)
{
labwares.Add(labwareRSLattice);
}
}
}
}
}
catch
{
}
return labwares;
}
#endregion
#region 根据板位别名和台面信息xml查找到对应唯一板位节点
///
/// 根据板位别名和台面信息xml查找到对应唯一板位
///
///
///
///
public XmlNode GetXmlNodeByBoardName(XmlNodeList platformList,string boardName)
{
XmlNode result = null;
for (int i = 0; i < platformList.Count; i++)
{
XmlNodeList labwareNodeList = platformList[i].SelectNodes("labware");
var labwareSrcNode = labwareNodeList[0].SelectSingleNode("labware_sname[text()='" + boardName + "']");
if (labwareSrcNode != null)
{
result = platformList[i];
break;
}
}
return result;
}
#endregion
#region 8个固定通道特有的方法
#region 检查固定8通道在某个板位耗材上,是否存在孔位数据不全的问题
///
/// 检查固定8通道在某个板位耗材上,是否村存在孔位数据不全的问题
///
/// 移液表对象
/// 板位与耗材实体对象
/// true:存在孔位不全情况;false:不存在孔位不全情况
public bool IsEntire8ChannelsSolidWells(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
{
bool bResult = false;
List sortWellName = new List();
Labware labware = labwareRSLattice.labware;
for (int j = 1; j <= labware.number_column; j++)
{
for (int i = 0; i < labware.number_row; i++)
{
string rowName = ComUtility.GetRowChar(i);
string rowWellName = rowName + j;
sortWellName.Add(rowWellName);
}
}
DataTable dt = methodTransferFile.transferDataTable;
string colSrcName = methodTransferFile.sourceLabware;//来源板列名
string colSrcWellName = methodTransferFile.sourceWell;//来源板孔位列名
string colDesName = methodTransferFile.destinationLabware;//目标板列名
string colDesWellName = methodTransferFile.destinationWell;//目标板孔位列名
if (dt != null)
{
//查询出所有该类板子的孔位数据
#region 来源板
DataRow[] dataRowSrc = dt.Select(colSrcName + @"='" + labware.labware_sname + @"'");
List dataRows1 = dataRowSrc.ToList();
for (int i = 0; i < sortWellName.Count; i++)
{
var d = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]));
if (d != null)
{
bool b = DeleteColWellByAWellName(dataRows1, colSrcWellName, sortWellName[i]);
if (b)
{
bResult = true;
return bResult;
}
}
else
{
i = i + 6;
}
}
#endregion
#region 目标板
DataRow[] dataRowDes = dt.Select(colDesName + @"='" + labware.labware_sname + @"'");
List dataRows2 = dataRowDes.ToList();
for (int i = 0; i < sortWellName.Count; i++)
{
var d = dataRows2.FirstOrDefault(x => x[colDesWellName].Equals(sortWellName[i]));
if (d != null)
{
bool b = DeleteColWellByAWellName(dataRows2, colDesWellName, sortWellName[i]);
if (b)
{
bResult = true;
return bResult;
}
}
else
{
i = i + 6;
}
}
#endregion
}
return bResult;
}
#endregion
#region 删除存在的同一列的孔位,如果该列孔位不全,则报告返回
///
/// 删除存在的同一列的孔位(全部),如果该列孔位列不全,则报告返回
///
///
///
///
/// true:孔位不全;false:孔位全
public bool DeleteColWellByAWellName(List dataRows, string colName, string wellName)
{
bool bResult = false;
//string[] strWells = new string[Shared.ChannelCount];
string[] strWells = new string[8];
int suffix = Convert.ToInt32(wellName.Substring(1, wellName.Length - 1));
//for (int i = 0; i < strWells.Length; i++)
//{
// strWells[i] = ComUtility.GetRowChar(i) + suffix.ToString();
//}
strWells[0] = "A" + suffix.ToString();
strWells[1] = "B" + suffix.ToString();
strWells[2] = "C" + suffix.ToString();
strWells[3] = "D" + suffix.ToString();
strWells[4] = "E" + suffix.ToString();
strWells[5] = "F" + suffix.ToString();
strWells[6] = "G" + suffix.ToString();
strWells[7] = "H" + suffix.ToString();
var d = dataRows.FirstOrDefault(x => x[colName].Equals(wellName));
do
{
for (int i = 0; i < strWells.Length; i++)
{
d = dataRows.FirstOrDefault(x => x[colName].Equals(strWells[i]));
if (d != null)
{
dataRows.Remove(d);
}
}
d = dataRows.FirstOrDefault(x => x[colName].Equals(wellName));
}
while (d != null);
//再次检查看看有没有其他的孔位
for (int i = 0; i < strWells.Length; i++)
{
d = dataRows.FirstOrDefault(x => x[colName].Equals(strWells[i]));
if (d != null)
{
bResult = true;
}
}
return bResult;
}
#endregion
#region 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回
///
/// 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回
///
///
///
/// null:移液数据错误;
public DataTable SortALabwareData(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
{
DataTable bResult = null;
List sortWellName = new List();
Labware labware = labwareRSLattice.labware;
for (int j = 1; j <= labware.number_column; j++)
{
for (int i = 0; i < labware.number_row; i++)
{
string rowName = ComUtility.GetRowChar(i);
string rowWellName = rowName + j;
sortWellName.Add(rowWellName);
}
}
DataTable dt = methodTransferFile.transferDataTable;
string colSrcName = methodTransferFile.sourceLabware;//来源板列名
string colSrcWellName = methodTransferFile.sourceWell;//来源板孔位列名
string colDesName = methodTransferFile.destinationLabware;//目标板列名
string colDesWellName = methodTransferFile.destinationWell;//目标板孔位列名
if (dt != null)
{
bResult = dt.Clone();
DataRow[] dataRowSrc = dt.Select(colSrcName + @"='" + labware.labware_sname + @"'");
List dataRows1 = dataRowSrc.ToList();
while (dataRows1.Count > 0)
{
int firstIndex = 0;//保存为某一列的第一个通道
for (int i = 0; i < sortWellName.Count; i++)
{
var d1 = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]));
if (d1 != null)
{
//再加上目标板孔查询
var d2 = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]) && x[colDesName].Equals(d1[colDesName]) && x[colDesWellName].Equals(d1[colDesWellName]));
if (d2 != null)
{
int suffix = Convert.ToInt32(d2[colDesWellName].ToString().Substring(1, d2[colDesWellName].ToString().Length - 1));
//int sortSuffix= Convert.ToInt32(sortWellName[i].ToString().Substring(1, sortWellName[i].ToString().Length - 1));
//if (suffix == 1)//&& firstIndex)//&& suffix== sortSuffix)
//{
bResult.ImportRow(d2);
dataRows1.Remove(d2);
//}
//else
//{
// bResult = null;
// return bResult;
//}
}
else
{
bResult = null;
return bResult;
}
}
else
{
i = i + 7;
}
}
}
}
return bResult;
}
#endregion
#endregion
#region 6个固定通道特有的方法——武汉设备专用
#region 检查固定6通道在某个板位耗材上,是否存在孔位数据不全的问题
///
/// 检查固定6通道在某个板位耗材上,是否存在孔位数据不全的问题
///
/// 移液表对象
/// 板位与耗材实体对象
/// true:存在孔位不全情况;false:不存在孔位不全情况
public bool IsEntire6ChannelsSolidWells(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
{
bool bResult = false;
List sortWellName = new List();
Labware labware = labwareRSLattice.labware;
for (int j = 1; j <= labware.number_column; j++)
{
for (int i = 0; i < labware.number_row; i++)
{
string rowName = ComUtility.GetRowChar(i);
string rowWellName = rowName + j;
sortWellName.Add(rowWellName);
}
}
DataTable dt = methodTransferFile.transferDataTable;
string colSrcName = methodTransferFile.sourceLabware;//来源板列名
string colSrcWellName = methodTransferFile.sourceWell;//来源板孔位列名
string colDesName = methodTransferFile.destinationLabware;//目标板列名
string colDesWellName = methodTransferFile.destinationWell;//目标板孔位列名
if (dt != null)
{
//查询出所有该类板子的孔位数据
#region 来源板
DataRow[] dataRowSrc = dt.Select(colSrcName + @"='" + labware.labware_sname + @"'");
List dataRows1 = dataRowSrc.ToList();
for (int i = 0; i < sortWellName.Count; i++)
{
var d = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]));
if (d != null)
{
bool b = DeleteColWellByAWellName(dataRows1, colSrcWellName, sortWellName[i]);
if (b)
{
bResult = true;
return bResult;
}
}
else
{
i = i + 6;
}
}
#endregion
#region 目标板
DataRow[] dataRowDes = dt.Select(colDesName + @"='" + labware.labware_sname + @"'");
List dataRows2 = dataRowDes.ToList();
for (int i = 0; i < sortWellName.Count; i++)
{
var d = dataRows2.FirstOrDefault(x => x[colDesWellName].Equals(sortWellName[i]));
if (d != null)
{
bool b = DeleteColWellByAWellName(dataRows2, colDesWellName, sortWellName[i]);
if (b)
{
bResult = true;
return bResult;
}
}
else
{
i = i + 6;
}
}
#endregion
}
return bResult;
}
#endregion
#region 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回---武汉专用
///
/// 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回--武汉专用
///
///
///
/// null:移液数据错误;
public DataTable SortALabwareDataForChoice(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
{
DataTable bResult = null;
List sortWellName = new List();
Labware labware = labwareRSLattice.labware;
for (int i = 0; i < labware.number_row; i++)
{
string rowName = ComUtility.GetRowChar(i);
for (int j = 1; j <= labware.number_column; j++)
{
string rowWellName = rowName + j;
sortWellName.Add(rowWellName);
}
if (labware.number_column == 12)//重新排孔位为 A1,A3,A5,A7,A9,A11,A2,A4,A6,A8,A10,A12
{
List oddSortWellNames = new List();
List evenSortWellNames = new List();
bool isOdd = false;
int countOfsortWellName = sortWellName.Count;
for (int j = countOfsortWellName - 1; j >= countOfsortWellName - labware.number_column; j--)
{
if (isOdd)
{
oddSortWellNames.Add(sortWellName[j]);
isOdd = false;
}
else
{
evenSortWellNames.Add(sortWellName[j]);
isOdd = true;
}
sortWellName.RemoveAt(j);
}
for (int j = oddSortWellNames.Count - 1; j >= 0; j--)
{
sortWellName.Add(oddSortWellNames[j]);
}
for (int j = evenSortWellNames.Count - 1; j >= 0; j--)
{
sortWellName.Add(evenSortWellNames[j]);
}
}
}
DataTable dt = methodTransferFile.transferDataTable;
string colSrcName = methodTransferFile.sourceLabware;//来源板列名
string colSrcWellName = methodTransferFile.sourceWell;//来源板孔位列名
string colDesName = methodTransferFile.destinationLabware;//目标板列名
string colDesWellName = methodTransferFile.destinationWell;//目标板孔位列名
if (dt != null)
{
bResult = dt.Clone();
DataRow[] dataRowSrc = dt.Select(colSrcName + @"='" + labware.labware_sname + @"'");
List dataRows1 = dataRowSrc.ToList();
while (dataRows1.Count > 0)
{
int firstIndex = 0;//保存为某一列的第一个通道
for (int i = 0; i < sortWellName.Count; i++)
{
var d1 = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]));
if (d1 != null)
{
//再加上目标板孔查询
var d2 = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]) && x[colDesName].Equals(d1[colDesName]) && x[colDesWellName].Equals(d1[colDesWellName]));
if (d2 != null)
{
int suffix = Convert.ToInt32(d2[colDesWellName].ToString().Substring(1, d2[colDesWellName].ToString().Length - 1));
//int sortSuffix= Convert.ToInt32(sortWellName[i].ToString().Substring(1, sortWellName[i].ToString().Length - 1));
//if (suffix == 1)//&& firstIndex)//&& suffix== sortSuffix)
//{
bResult.ImportRow(d2);
dataRows1.Remove(d2);
//}
//else
//{
// bResult = null;
// return bResult;
//}
}
else
{
bResult = null;
return bResult;
}
}
else
{
//if (labware.number_column == 12)//重新排孔位为 A1,A3,A5,A7,A9,A11,A2,A4,A6,A8,A10,A12
//{
// i = i + 5;
//}
//else
//{
//i = i + 5;
//}
}
}
}
}
return bResult;
}
#endregion
#endregion
#region 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回---多通道专用
///
/// 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回--多通道专用
///
///
///
/// null:移液数据错误;
public DataTable SortALabwareDataForChoiceSH(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
{
DataTable bResult = null;
List sortWellName = new List();
Labware labware = labwareRSLattice.labware;
for (int j = 1; j <= labware.number_column; j++)
{
for (int i = 0; i < labware.number_row; i++)
{
string rowName = ComUtility.GetRowChar(i);
string rowWellName = rowName + j;
sortWellName.Add(rowWellName);
}
if (labware.number_row == 8)//重新排孔位为 A1,B1,C1,D1,E1,F1,G1,H1
{
}
}
DataTable dt = methodTransferFile.transferDataTable;
string colSrcName = methodTransferFile.sourceLabware;//来源板列名
string colSrcWellName = methodTransferFile.sourceWell;//来源板孔位列名
string colDesName = methodTransferFile.destinationLabware;//目标板列名
string colDesWellName = methodTransferFile.destinationWell;//目标板孔位列名
if (dt != null)
{
bResult = dt.Clone();
DataRow[] dataRowSrc = dt.Select(colSrcName + @"='" + labware.labware_sname + @"'");
List dataRows1 = dataRowSrc.ToList();
while (dataRows1.Count > 0)
{
for (int i = 0; i < sortWellName.Count; i++)
{
var d1 = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]));
if (d1 != null)
{
//再加上目标板孔查询
var d2 = dataRows1.FirstOrDefault(x => x[colSrcWellName].Equals(sortWellName[i]) && x[colDesName].Equals(d1[colDesName]) && x[colDesWellName].Equals(d1[colDesWellName]));
if (d2 != null)
{
int suffix = Convert.ToInt32(d2[colDesWellName].ToString().Substring(1, d2[colDesWellName].ToString().Length - 1));
bResult.ImportRow(d2);
dataRows1.Remove(d2);
}
else
{
bResult = null;
return bResult;
}
}
else
{
}
}
}
}
return bResult;
}
#endregion
}
}