using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using XImagingXhandler.XDAL; using System.Resources; using XCoreBLL.Resource; using System.Xml; using System.Xml.Linq; using System.Data; using DriverManager; using DriverLibrary; using DriverLib; using DriverLib.Engine; using System.Collections.ObjectModel; using XCommon.Log; using DataCalcDAL.Com; using DataEntity.Share; using XCommon; using DataRWDAL; using DataEntity; namespace XCore { /// /// 吸液业务逻辑处理 /// public class AspirateBll { string strCurrentCulture = ""; WellCalc wellCalc = new WellCalc(); LatticeBll latticeBll = new LatticeBll(); public AspirateBll() { strCurrentCulture = System.Threading.Thread.CurrentThread.CurrentCulture.Name; } public MethodAspirate GenerateMethodAspirateDataByXmlNode(XmlNode xmlNode) { MethodAspirate methodAspirate = new MethodAspirate(); methodAspirate.isrun = xmlNode.SelectSingleNode("isrun").InnerText; methodAspirate.status = xmlNode.SelectSingleNode("status").InnerText; methodAspirate.name = xmlNode.SelectSingleNode("name").InnerText; methodAspirate.label = xmlNode.SelectSingleNode("label").InnerText; methodAspirate.strIndex = xmlNode.SelectSingleNode("strIndex").InnerText; methodAspirate.labwareText = xmlNode.SelectSingleNode("labware/text").InnerText; methodAspirate.labwareValue = xmlNode.SelectSingleNode("labware/value").InnerText; methodAspirate.positionText = xmlNode.SelectSingleNode("position/text").InnerText; methodAspirate.positionValue = xmlNode.SelectSingleNode("position/value").InnerText; methodAspirate.armText = xmlNode.SelectSingleNode("arm/text").InnerText; methodAspirate.armValue = xmlNode.SelectSingleNode("arm/value").InnerText; methodAspirate.headType= xmlNode.SelectSingleNode("headType").InnerText; //methodAspirate.labwaretipText = xmlNode.SelectSingleNode("labwaretip/text").InnerText; //methodAspirate.labwaretipValue = xmlNode.SelectSingleNode("labwaretip/value").InnerText; string strchs = xmlNode.SelectSingleNode("channels").InnerText; methodAspirate.channels = ComUtility.GetChannelsFromXml(strchs); methodAspirate.wellarray = xmlNode.SelectSingleNode("wellarray").InnerText; methodAspirate.enableSingleWellvolume = xmlNode.SelectSingleNode("enableSingleWellvolume").InnerText.ToLower() == "true" ? true : false; XmlNodeList xnList = xmlNode.SelectNodes("SingleWellvolume"); List list = new List(); foreach (XmlNode xn in xnList) { DropdownName dropdownName= new DropdownName(); dropdownName.dropdown_id = xn.SelectSingleNode("channel").InnerText; dropdownName.dropdown_name = xn.SelectSingleNode("value").InnerText; list.Add(dropdownName); } methodAspirate.singlewellvolume = list; methodAspirate.wellvolume = Convert.ToDouble(xmlNode.SelectSingleNode("wellvolume").InnerText); methodAspirate.liquididText = xmlNode.SelectSingleNode("liquidid/text").InnerText; methodAspirate.liquididValue = xmlNode.SelectSingleNode("liquidid/value").InnerText; methodAspirate.liquidrangeidText = xmlNode.SelectSingleNode("liquidrangeid/text").InnerText; methodAspirate.liquidrangeidValue = xmlNode.SelectSingleNode("liquidrangeid/value").InnerText; methodAspirate.liquidpidText = xmlNode.SelectSingleNode("liquidpid/text").InnerText; methodAspirate.liquidpidValue = xmlNode.SelectSingleNode("liquidpid/value").InnerText; methodAspirate.bMix = xmlNode.SelectSingleNode("enableMix").InnerText.ToLower() == "true" ? true : false; methodAspirate.bMultiMix = xmlNode.SelectSingleNode("enableMultiMix").InnerText.ToLower() == "true" ? true : false; methodAspirate.mixvolume = Convert.ToDouble(xmlNode.SelectSingleNode("mixvolume").InnerText); methodAspirate.mixcount = Convert.ToInt32(xmlNode.SelectSingleNode("mixcount").InnerText); methodAspirate.mixAspiratePositionText = xmlNode.SelectSingleNode("mixAspiratePosition/text").InnerText; methodAspirate.mixAspiratePositionValue = Convert.ToInt32(xmlNode.SelectSingleNode("mixAspiratePosition/value").InnerText); methodAspirate.mixAspirateDistance = Convert.ToDouble(xmlNode.SelectSingleNode("mixAspirateDistance").InnerText); methodAspirate.mixAspirateSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("mixAspirateSpeed").InnerText); methodAspirate.mixDispensePositionText = xmlNode.SelectSingleNode("mixDispensePosition/text").InnerText; methodAspirate.mixDispensePositionValue = Convert.ToInt32(xmlNode.SelectSingleNode("mixDispensePosition/value").InnerText); methodAspirate.mixDispenseDistance = Convert.ToDouble(xmlNode.SelectSingleNode("mixDispenseDistance").InnerText); methodAspirate.mixDispenseSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("mixDispenseSpeed").InnerText); methodAspirate.enableLiquidSensor = xmlNode.SelectSingleNode("enableLiquidSensor").InnerText.ToLower()=="true"?true:false; methodAspirate.liquidSensorCount= Convert.ToInt32(xmlNode.SelectSingleNode("liquidSensorCount").InnerText); methodAspirate.liquidSensorDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorDistance").InnerText); methodAspirate.liquidSensorEndDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorEndDistance").InnerText); methodAspirate.liquidSensorSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorSpeed").InnerText); methodAspirate.liquidSensorRadio = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorRadio").InnerText); methodAspirate.liquidSensorDisIdText = xmlNode.SelectSingleNode("liquidSensorDisId/text").InnerText; methodAspirate.liquidSensorDisIdValue = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorDisId/value").InnerText); methodAspirate.enableLiquidFollow = xmlNode.SelectSingleNode("enableLiquidFollow").InnerText.ToLower() == "true" ? true : false; methodAspirate.liquidFollowType = Convert.ToInt32(xmlNode.SelectSingleNode("liquidFollowType/value").InnerText); methodAspirate.liquidFollowTypeName = xmlNode.SelectSingleNode("liquidFollowType/text").InnerText; methodAspirate.liquidFollowSpeed = Convert.ToDouble(xmlNode.SelectSingleNode("liquidFollowSpeed").InnerText); methodAspirate.liquidFollowDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidFollowDistance").InnerText); methodAspirate.liquidFollowArea = Convert.ToDouble(xmlNode.SelectSingleNode("liquidFollowArea").InnerText); methodAspirate.enableMixFollow = xmlNode.SelectSingleNode("enableMixFollow").InnerText.ToLower() == "true" ? true : false; methodAspirate.enableSensorBlock = xmlNode.SelectSingleNode("enableSensorBlock").InnerText.ToLower() == "true" ? true : false; //methodAspirate.liquidSensorBlockDistance = Convert.ToDouble(xmlNode.SelectSingleNode("liquidSensorBlockDistance").InnerText); methodAspirate.aspirateBlockDisIdText = xmlNode.SelectSingleNode("aspirateBlockDisId/text").InnerText; methodAspirate.aspirateBlockDisIdValue = Convert.ToInt32(xmlNode.SelectSingleNode("aspirateBlockDisId/value").InnerText); methodAspirate.aspirateAirDisIdText = xmlNode.SelectSingleNode("aspirateAirDisId/text").InnerText; methodAspirate.aspirateAirDisIdValue = Convert.ToInt32(xmlNode.SelectSingleNode("aspirateAirDisId/value").InnerText); return methodAspirate; } #region 根据当前的设备型号获取设备台面数据信息 /// /// 根据当前的设备型号获取设备台面数据信息 /// /// 设备型号 /// 某种设备型号下的台面数据信息列表 public List ProviderLatticeList(string deviceNumber) { List lattices= new List(); try { lattices = LatticeDB.GetLatticeDataFromdb(deviceNumber); } catch(Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } return lattices; } #endregion #region 根据当前的设备型号获取设备台面数据信息 /// /// 根据当前的设备型号获取设备台面数据信息 /// /// 设备型号 /// 某种设备型号下的台面数据信息列表 public List ProviderLatticeList(string deviceNumber, int device_arm_id) { List lattices = new List(); try { TabletopTemplate tabletopTemplate = TabletopTemplateDB.GetCurrentAppTabletopTemplateCollectionFromdb(); //增加台面模板判断 if (tabletopTemplate == null) { lattices = LatticeDB.GetLatticeDataFromdb(deviceNumber, device_arm_id); } else { lattices = LatticeDB.GetLatticeDataByTabletopTemplateFromdb(tabletopTemplate.tabletopid); } } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } return lattices; } #endregion #region 根据当前的设备型号获取设备臂数据信息 /// /// 根据当前的设备型号获取设备臂数据信息 /// public List ProviderDeviceArmList() { List deviceArms = new List(); try { deviceArms = DeviceArmDB.GetDeviceArmFromdb(Shared.SoftwareInformation.software_information_id); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } return deviceArms; } #endregion #region 根据当前的设备型号获取设备臂数据信息--用于移液精度校准模块 /// /// 根据当前的设备型号获取设备臂数据信息--用于移液精度校准模块 /// public List ProviderDeviceArmListForLiquidAccuracy() { List deviceArms = new List(); try { deviceArms = DeviceArmDB.GetDeviceArmFromdb(Shared.SoftwareInformation.software_information_id); deviceArms.RemoveAt(2); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } return deviceArms; } #endregion #region 获取当前耗材下的所有吸头盒数据信息 /// /// 获取当前耗材下的所有吸头盒数据信息 /// /// 所有吸头盒数据信息列表 public ObservableCollection ProviderLabwareList() { ObservableCollection labwares = new ObservableCollection(); try { labwares = LabwareDB.GetTipLabwareFromdb(); } catch (Exception ex) { LoggerHelper.ErrorLog("ERROR:", ex); } return labwares; } #endregion #region 检查所有属性设置是否满足要求 /// /// 检查所有属性设置是否满足要求 /// /// 吸液属性对象 /// 检查所有属性设置是否满足要求 public MethodPropertyInfo CheckProperty(MethodAspirate methodAspirate) { MethodPropertyInfo methodPropertyInfo = new MethodPropertyInfo(); if (strCurrentCulture== "zh-CN") { methodPropertyInfo.property_tips_info = AspirateResourceCHS.tipsInfo.ToString(); if (methodAspirate.labwareValue == null || methodAspirate.labwaretipValue == "") { methodPropertyInfo.property_name_info = AspirateResourceCHS.labwareText.ToString(); } if (methodAspirate.positionValue == null || methodAspirate.positionValue == "") { methodPropertyInfo.property_name_info = AspirateResourceCHS.positionText.ToString(); } if (methodAspirate.armValue == null || methodAspirate.armValue == "") { methodPropertyInfo.property_name_info = AspirateResourceCHS.armText.ToString(); } else { if (methodAspirate.armValue == "arm1") { if (AspirateResourceCHS.wellarray.Contains(",")) { methodPropertyInfo.property_name_info = AspirateResourceCHS.armWithSingleChannel.ToString(); methodPropertyInfo.property_tips_info = AspirateResourceCHS.errorInfo.ToString(); } } else if (methodAspirate.armValue == "arm2") { if (!AspirateResourceCHS.wellarray.Contains(",")) { methodPropertyInfo.property_name_info = AspirateResourceCHS.armWithSingleChannel.ToString(); methodPropertyInfo.property_tips_info = AspirateResourceCHS.errorInfo.ToString(); } } } if (methodAspirate.wellarray == null || methodAspirate.wellarray == "") { methodPropertyInfo.property_name_info = AspirateResourceCHS.labwareText.ToString(); } //if (methodAspirate.mixcount != null || methodAspirate.mixcount != ) //{ // if (methodAspirate.mixvolume == null || methodAspirate.mixvolume == "") // { // methodPropertyInfo.property_name_info = AspirateResourceCHS.mixvolume.ToString(); // } //} //if (methodAspirate.wellvolume == null || methodAspirate.wellvolume == "") //{ // methodPropertyInfo.property_name_info = AspirateResourceCHS.wellvolume.ToString(); //} if (methodAspirate.liquididValue == null || methodAspirate.liquididValue == "") { methodPropertyInfo.property_name_info = AspirateResourceCHS.liquididText.ToString(); } } else if(strCurrentCulture == "en-US") { methodPropertyInfo.property_tips_info = AspirateResourceENU.tipsInfo.ToString(); if (methodAspirate.labwareValue == null || methodAspirate.labwaretipValue == "") { methodPropertyInfo.property_name_info = AspirateResourceENU.labwareText.ToString(); } if (methodAspirate.positionValue == null || methodAspirate.positionValue == "") { methodPropertyInfo.property_name_info = AspirateResourceENU.positionText.ToString(); } if (methodAspirate.armValue == null || methodAspirate.armValue == "") { methodPropertyInfo.property_name_info = AspirateResourceENU.armText.ToString(); } else { if (methodAspirate.armValue == "arm1") { if (AspirateResourceENU.wellarray.Contains(",")) { methodPropertyInfo.property_name_info = AspirateResourceENU.armWithSingleChannel.ToString(); methodPropertyInfo.property_tips_info = AspirateResourceENU.errorInfo.ToString(); } } else if (methodAspirate.armValue == "arm2") { if (!AspirateResourceENU.wellarray.Contains(",")) { methodPropertyInfo.property_name_info = AspirateResourceENU.armWithSingleChannel.ToString(); methodPropertyInfo.property_tips_info = AspirateResourceENU.errorInfo.ToString(); } } } if (methodAspirate.wellarray == null || methodAspirate.wellarray == "") { methodPropertyInfo.property_name_info = AspirateResourceENU.labwareText.ToString(); } //if (methodAspirate.mixcount != null || methodAspirate.mixcount != "") //{ // if (methodAspirate.mixvolume == null || methodAspirate.mixvolume == "") // { // methodPropertyInfo.property_name_info = AspirateResourceENU.mixvolume.ToString(); // } //} //if (methodAspirate.wellvolume == null || methodAspirate.wellvolume == "") //{ // methodPropertyInfo.property_name_info = AspirateResourceENU.wellvolume.ToString(); //} if (methodAspirate.liquididValue == null || methodAspirate.liquididValue == "") { methodPropertyInfo.property_name_info = AspirateResourceENU.liquididText.ToString(); } } return methodPropertyInfo; } #endregion #region 执行吸液,返回结果字符串 /// /// 执行吸液,返回结果字符串 /// /// 吸液的参数对象 /// /// 结果实体对象 public HxResult ExecuteAspirate(AspirateMParam aspirateMParam, bool isSimulator=false) { HxResult ret = new HxResult(); if (!isSimulator) { ret = MethodAction.Instance.Aspirate(aspirateMParam); } else { CommonBll.DoSimulateDelay(); ret.Result = ResultType.Success; } return ret; } public HxResult ExecuteAspirate(AspirateMParamSH aspirateMParam, bool isSimulator = false) { HxResult ret = new HxResult(); if (!isSimulator) { ret = MethodAction.Instance.Aspirate(aspirateMParam); } else { CommonBll.DoSimulateDelay(); ret.Result = ResultType.Success; } return ret; } #endregion #region 执行吸液,返回结果字符串 /// /// 执行吸液,返回结果字符串 /// /// 吸液的参数对象 /// /// 结果实体对象 public HxResult ExecuteAspirate(AspirateMParamWH aspirateMParam, bool isSimulator = false) { HxResult ret = new HxResult(); if (!isSimulator) { ret = MethodAction.Instance.Aspirate(aspirateMParam); } else { ret.Result = ResultType.Success; } return ret; } #endregion } }