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