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