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
|
{
|
/// <summary>
|
/// 文件移液业务逻辑类
|
/// </summary>
|
public class TransferFileBll
|
{
|
WellFileCalc wellFileCalc = new WellFileCalc();
|
|
#region 获取DataTable的表头名称数据集合
|
/// <summary>
|
/// 获取DataTable的表头名称数据集合
|
/// </summary>
|
/// <param name="dataTable"></param>
|
/// <returns></returns>
|
public List<TransferFileHeader> GetTransferFileHeaders(DataTable dataTable)
|
{
|
List<TransferFileHeader> transferFileHeaders = new List<TransferFileHeader>();
|
|
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 检查所有属性设置是否满足要求
|
/// <summary>
|
/// 检查所有属性设置是否满足要求
|
/// </summary>
|
/// <param name="methodTransferFile">文件移液属性对象</param>
|
/// <returns>检查所有属性设置是否满足要求</returns>
|
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 检查数据中的板子名称是否在台面存在
|
/// <summary>
|
/// 检查数据中的板子名称是否在台面存在
|
/// </summary>
|
/// <param name="methodTransferFile">文件方法属性对象</param>
|
/// <param name="xmlEnv">台面板位xmlNode</param>
|
/// <param name="labwareName">耗材名称</param>
|
/// <returns>true:存在;false:不存在</returns>
|
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 检查数据中的板子孔位是否完整(同一列,孔位指定的体积是否相同等)
|
/// <summary>
|
/// 检查数据中的板子孔位是否完整
|
/// </summary>
|
/// <param name="methodTransferFile">文件方法属性对象</param>
|
/// <param name="plateNode">台面板位xmlNode</param>
|
/// <param name="methodNode">文件方法属性xmlNode</param>
|
/// <param name="dt">移液文件数据表</param>
|
/// <param name="excludeWell">输出参数,数据中不包含的孔位集合</param>
|
/// <param name="bSameVolume">同一列体积是否相同</param>
|
/// <param name="bfullDecWell">目标孔是否是完整的列</param>
|
/// <param name="bfullChangeTips">更换Tip列是否完整</param>
|
/// <returns>true:数据完整;false:数据不完整</returns>
|
public bool CheckDataIsIntegrity(MethodTransferFile methodTransferFile, XmlNode plateNode, XmlNode methodNode, out DataTable dt, out List<DropdownName> excludeWells, out bool bSameVolume, out bool bfullDecWell, out bool bfullChangeTips)
|
{
|
bool bResult = true;
|
dt = new DataTable();
|
excludeWells = new List<DropdownName>();
|
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<LabwareRSLattice> GetLabwareEntities(MethodTransferFile methodTransferFile, XmlNode plateNode)
|
{
|
List<LabwareRSLattice> labwares = new List<LabwareRSLattice>();
|
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查找到对应唯一板位节点
|
/// <summary>
|
/// 根据板位别名和台面信息xml查找到对应唯一板位
|
/// </summary>
|
/// <param name="platformList"></param>
|
/// <param name="boardName"></param>
|
/// <returns></returns>
|
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通道在某个板位耗材上,是否存在孔位数据不全的问题
|
/// <summary>
|
/// 检查固定8通道在某个板位耗材上,是否村存在孔位数据不全的问题
|
/// </summary>
|
/// <param name="methodTransferFile">移液表对象</param>
|
/// <param name="labwareRSLattice">板位与耗材实体对象</param>
|
/// <returns>true:存在孔位不全情况;false:不存在孔位不全情况</returns>
|
public bool IsEntire8ChannelsSolidWells(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
|
{
|
bool bResult = false;
|
List<string> sortWellName = new List<string>();
|
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<DataRow> 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<DataRow> 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 删除存在的同一列的孔位,如果该列孔位不全,则报告返回
|
/// <summary>
|
/// 删除存在的同一列的孔位(全部),如果该列孔位列不全,则报告返回
|
/// </summary>
|
/// <param name="dataRows"></param>
|
/// <param name="colName"></param>
|
/// <param name="wellName"></param>
|
/// <returns>true:孔位不全;false:孔位全</returns>
|
public bool DeleteColWellByAWellName(List<DataRow> 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 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回
|
/// <summary>
|
/// 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回
|
/// </summary>
|
/// <param name="methodTransferFile"></param>
|
/// <param name="labwareRSLattice"></param>
|
/// <returns>null:移液数据错误;</returns>
|
public DataTable SortALabwareData(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
|
{
|
DataTable bResult = null;
|
List<string> sortWellName = new List<string>();
|
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<DataRow> 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通道在某个板位耗材上,是否存在孔位数据不全的问题
|
/// <summary>
|
/// 检查固定6通道在某个板位耗材上,是否存在孔位数据不全的问题
|
/// </summary>
|
/// <param name="methodTransferFile">移液表对象</param>
|
/// <param name="labwareRSLattice">板位与耗材实体对象</param>
|
/// <returns>true:存在孔位不全情况;false:不存在孔位不全情况</returns>
|
public bool IsEntire6ChannelsSolidWells(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
|
{
|
bool bResult = false;
|
List<string> sortWellName = new List<string>();
|
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<DataRow> 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<DataRow> 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 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回---武汉专用
|
/// <summary>
|
/// 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回--武汉专用
|
/// </summary>
|
/// <param name="methodTransferFile"></param>
|
/// <param name="labwareRSLattice"></param>
|
/// <returns>null:移液数据错误;</returns>
|
public DataTable SortALabwareDataForChoice(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
|
{
|
DataTable bResult = null;
|
List<string> sortWellName = new List<string>();
|
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<string> oddSortWellNames = new List<string>();
|
List<string> evenSortWellNames = new List<string>();
|
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<DataRow> 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 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回---多通道专用
|
/// <summary>
|
/// 给来源板孔位数据排序,找出来源板到目标板孔位不对应的数据,返回--多通道专用
|
/// </summary>
|
/// <param name="methodTransferFile"></param>
|
/// <param name="labwareRSLattice"></param>
|
/// <returns>null:移液数据错误;</returns>
|
public DataTable SortALabwareDataForChoiceSH(MethodTransferFile methodTransferFile, LabwareRSLattice labwareRSLattice)
|
{
|
DataTable bResult = null;
|
List<string> sortWellName = new List<string>();
|
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<DataRow> 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
|
}
|
}
|