using DataEntity.Sockets.TakePhoto;
using HxModel.Sockets.HxHotel;
using HxSocket;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data;
using System.Xml;
using XCommon.Log;
using XCoreBLL.Resource;
using XImagingXhandler.XDAL;
namespace XCore
{
public class TakePhotoBll
{
public HxSocketClient socketTcpListener = null;
public BacteriaBll bacteriaBll = new BacteriaBll();
private const string EQUIPMENT_ID = "ID2023";
string strCurrentCulture = "";
public TakePhotoBll()
{
strCurrentCulture = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
}
#region 检查所有属性设置是否满足要求
///
/// 检查所有属性设置是否满足要求
///
/// 拍照属性对象
/// 检查所有属性设置是否满足要求
public MethodPropertyInfo CheckProperty(MethodTakePhoto methodTakePhoto)
{
MethodPropertyInfo methodPropertyInfo = new MethodPropertyInfo();
if (strCurrentCulture == "zh-CN")
{
methodPropertyInfo.property_tips_info = TakePhotoResourceCHS.tipsInfo.ToString();
if (methodTakePhoto.ismanualconfig == 1)
{
if (methodTakePhoto.bacteriaids == null || methodTakePhoto.bacteriaids == "")
{
methodPropertyInfo.property_name_info = TakePhotoResourceCHS.bacteriaids.ToString();
}
if (methodTakePhoto.gapValue == null || methodTakePhoto.gapValue == "")
{
methodPropertyInfo.property_name_info = TakePhotoResourceCHS.gapValue.ToString();
}
}
}
else if (strCurrentCulture == "en-US")
{
methodPropertyInfo.property_tips_info = TakePhotoResourceENU.tipsInfo.ToString();
if (methodTakePhoto.ismanualconfig == 1)
{
if (methodTakePhoto.bacteriaids == null || methodTakePhoto.bacteriaids == "")
{
methodPropertyInfo.property_name_info = TakePhotoResourceENU.bacteriaids.ToString();
}
if (methodTakePhoto.gapValue == null || methodTakePhoto.gapValue == "")
{
methodPropertyInfo.property_name_info = TakePhotoResourceENU.gapValue.ToString();
}
}
}
return methodPropertyInfo;
}
#endregion
#region 执行拍照,返回结果字符串
///
/// 执行拍照,返回结果字符串
///
/// 拍照节点
/// 拍照参数
///
///
///
/// 结果实体对象
public List ExecuteTakePhoto(XmlNode xmlNode, DataTable dtChoiceParams, string softwareDeviceNumber,
Bacteria bacteriaInfo, bool isSimulator = false)
{
//调用Socket,下发拍照参数命令
List strResult = new List();
LoggerHelper.InfoLog("[TakePhotoBll][ExecuteTakePhoto] Start");
if (!isSimulator)
{
// 发送拍照请求
strResult = socketTcpListener.SendMessage(GenerateTakePhotoReq(xmlNode, dtChoiceParams, softwareDeviceNumber, bacteriaInfo), true);
}
else
{
strResult.Add("{ \"message_id\": \"02bb3628-0a29-48d7-8614-3412f4258797\", \"message_type\": 4, \"method\": \"Run\", \"equipment_id\": \"ID2023\", \"workflow_id\": \"\", \"experiment_id\": \"60b75190-b9ef-4936-935c-f8d824d0b166\", \"process_info\": {}, \"timestamp\": \"2023-09-25T13:52:27.8776083+08:00\"}#!HxSEP!#\r\n");
strResult.Add("{ \"message_id\": \"02bb3628-0a29-48d7-8614-3412f4258797\", \"message_type\": 5, \"method\": \"Run\", \"equipment_id\": \"ID2023\", \"workflow_id\": \"\", \"experiment_id\": \"60b75190-b9ef-4936-935c-f8d824d0b166\", \"data\": { \"json\": \"http://192.168.0.238:8099/upload/20230926_143909_238_000005_38_GUID_YS12.json\", \"image\": \"http://192.168.0.238:8099/upload/20230926_143909_238_000005_38_GUID_YS12.jpg\" }, \"process_info\": {}, \"method_status\": 2, \"error\": { \"error_code\": \"\", \"error_text\": \"\", \"troubleshoot\": 0 }, \"timestamp\": \"2023-09-25T13:53:12.2100249+08:00\"}#!HxSEP!#\r\n");
}
return strResult;
}
#endregion
///
/// 获取拍照请求字符串
///
///
///
///
///
///
public string GenerateTakePhotoReq(XmlNode xmlNode, DataTable dtChoiceParams, string softwareDeviceNumber, Bacteria bacteriaInfo)
{
string strCommand = string.Empty;
try
{
if (xmlNode != null && dtChoiceParams != null)
{
string experimentid = dtChoiceParams.Rows[0]["属性值"].ToString();
string barcode = dtChoiceParams.Rows[1]["属性值"].ToString();
string bacterias = dtChoiceParams.Rows[2]["属性值"].ToString();
string shape = dtChoiceParams.Rows[3]["属性值"].ToString();
string edge = dtChoiceParams.Rows[4]["属性值"].ToString();
string color = dtChoiceParams.Rows[5]["属性值"].ToString();
float min_diam = float.Parse(dtChoiceParams.Rows[6]["属性值"].ToString());
float max_diam = float.Parse(dtChoiceParams.Rows[7]["属性值"].ToString());
float prox = float.Parse(dtChoiceParams.Rows[8]["属性值"].ToString());
string choicemode = dtChoiceParams.Rows[9]["属性值"].ToString();
string choice_distance_mode = dtChoiceParams.Rows[10]["属性值"].ToString();
string choicebottomdistance = dtChoiceParams.Rows[11]["属性值"].ToString();
string choicexAxisoffsite = dtChoiceParams.Rows[12]["属性值"].ToString();
string choiceyAxisoffsite = dtChoiceParams.Rows[13]["属性值"].ToString();
string coatingbottomdistance = dtChoiceParams.Rows[14]["属性值"].ToString();
string coatingxAxisoffsite = dtChoiceParams.Rows[15]["属性值"].ToString();
string coatingyAxisoffsite = dtChoiceParams.Rows[16]["属性值"].ToString();
string coating_mode = dtChoiceParams.Rows[17]["属性值"].ToString();
string coating_speed = dtChoiceParams.Rows[18]["属性值"].ToString();
int model_type = Convert.ToInt32(dtChoiceParams.Rows[19]["属性值"].ToString());
string merge_masks = dtChoiceParams.Rows[20]["属性值"].ToString();
float ds_ratio = float.Parse(dtChoiceParams.Rows[21]["属性值"].ToString());
float mean_diam = float.Parse(dtChoiceParams.Rows[22]["属性值"].ToString());
float dist_to_edge = float.Parse(dtChoiceParams.Rows[23]["属性值"].ToString());
string mark_color = dtChoiceParams.Rows[24]["属性值"].ToString();
string draw_label = dtChoiceParams.Rows[25]["属性值"].ToString();
string fontsize = dtChoiceParams.Rows[26]["属性值"].ToString();
string top_light = dtChoiceParams.Rows[27]["属性值"].ToString();
string bottom_light = dtChoiceParams.Rows[28]["属性值"].ToString();
int Ismanualconfig = Convert.ToInt32(xmlNode.SelectSingleNode("ismanualconfig").InnerText);
string strBacteriaids = xmlNode.SelectSingleNode("bacteriaids").InnerText; // 挑菌的种类
string strGuid = Guid.NewGuid().ToString();
if (Ismanualconfig == 1)//手动配置,从数据库中读取本次拍照已选中菌落的数据信息
{
string[] bacteria = strBacteriaids.Split(',');
if (bacteria.Length > 1) //多个菌落 TODO暂未实现
{
#region Del
//string strJson = "";
//string strSubJson = "";
//for (int i = 0; i < bacteria.Length; i++)
//{
// Bacteria bacteria1 = bacteriaBll.GetABacteria(bacteria[i]);
// strSubJson += "{" + "orgType:\"" + bacteria1.bacteria_name +
// "\",mindiameterSize:" + bacteria1.bacteria_min_size.ToString() +
// ",maxdiameterSize:" + bacteria1.bacteria_max_size.ToString() +
// ",proximity:" + prox.ToString() +
// ",shape:\"" + bacteria1.bacteria_shape.ToString() +
// "\",edge:\"" + bacteria1.bacteria_edge.ToString() +
// "\",color:\"" + bacteria1.bacteria_color.ToString() +
// "\"}";
//}
//strJson = "{" + "message_id:\"" + strGuid +
// "\",message_type:2" +
// ",method:\"Run\"" +
// ",equipment_id:\"ID2023\"" +
// ",\"workflow_id\":\"" + "workflow_id_" + strGuid + "\"" +
// ",\"experiment_id\":\"" + "experiment_id_" + strGuid + "\"" +
// "\",parameters:" +
// strSubJson +
// ",process_info:{}" +
// ",estimate_time:5" +
// ",timeout:60" +
// ",description:\"NO DESC\"" +
// ",timestamp:\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\"}#!HxSEP!#";
//strCommand = strJson;
#endregion
}
else if (bacteria.Length == 1)//单个菌落
{
string strBottomLight = string.Empty;
#region Del
//string strJson = "{" + "\"message_id\":\"" + strGuid +
// "\",\"message_type\":2" +
// ",\"method\":\"Run\"" +
// ",\"equipment_id\":\"ID2023\"" +
// ",\"workflow_id\":\"" + "workflow_id_" + strGuid + "\"" +
// ",\"experiment_id\":\"" + "experiment_id_" + strGuid + "\"" +
// ",\"parameters\":" +
// "{" +
// "\"model\":{" + "\"model_type\":" + model_type.ToString() +
// "}," +
// "\"params\":{" +
// "\"merge_masks\":\"" + merge_masks.ToString()+ "\"" +
// ",\"ds_ratio\":" + ds_ratio.ToString() +
// ",\"mean_diam\":" + mean_diam.ToString() +
// //",prox:" + dtChoiceParams.Rows[8]["属性值"].ToString() + // 临近度
// ",\"prox\":" + prox + // 临近度
// ",\"max_diam\":" + max_diam.ToString() +
// ",\"min_diam\":" + min_diam.ToString() +
// ",\"dist_to_edge\":" + dist_to_edge.ToString() +
// ",\"segments\":" + 1 +
// ",\"barcode\":\"" + barcode + "\"" +
// "}," +
// "\"filter\":{" + "\"check_prox\":\"" + "True" +
// "\",\"check_diam_range\":\"" + "True" +
// "\",\"check_roundness\":\"" + (model_type.Equals("7") ? "False" : "True") +
// "\",\"check_near_edge\":\"" + "True" +
// "\"}," +
// "\"paint\":{" + "\"draw_dish_edge\":\"" + "True" +
// "\",\"draw_mark\":\"" + "True" +
// //"\",\"fontsize\":" + fontsize +
// //",\"mark_color\":\"" + mark_color +
// //"\",\"draw_label\":\"" + draw_label +
// "\",\"draw_cell_edge\":\"" + "True" +
// "\",\"cell_edge_color\":\"" + "(0,255,0)" +
// "\"}," +
// "\"optional\":{" + "\"channel_1\" :\"" + "True" +
// "\"}," +
// "\"light\":{" +
// //"\"top_light\":" + top_light +
// //strBottomLight +
// "}" +
// "}" +
// ",\"process_info\":{}" +
// ",\"estimate_time\":5" +
// ",\"timeout\":60" +
// ",\"description\":\"NO DESC\"" +
// ",\"timestamp\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\"}";
//strCommand = strJson;
#endregion
#region 拍照参数
TakePhotoRequestObject req = new TakePhotoRequestObject();
req.SetBaseVal(EQUIPMENT_ID, "Run");
TakePhotoParameter parameters = new TakePhotoParameter();
#region Model
Model model = new Model();
model.model_type = model_type;
parameters.model = model;
#endregion
#region Params
Params param = new Params();
param.merge_masks = merge_masks;
param.ds_ratio = ds_ratio;
param.mean_diam = mean_diam;
param.prox = prox;
param.max_diam = max_diam;
param.min_diam = min_diam;
param.dist_to_edge = dist_to_edge;
//param.segments = 1;
param.barcode = barcode;
parameters.param = param;
#endregion
#region filter
//Filter filter = new Filter();
//filter.check_prox = "True";
//filter.check_diam_range = "True";
//filter.check_roundness = (model_type.Equals("7") ? "False" : "True");
//filter.check_near_edge = "True";
//parameters.filter = filter;
#endregion
#region paint
//Paint paint = new Paint();
//paint.draw_dish_edge = "True";
//paint.draw_mark = "True";
//paint.draw_cell_edge = "True";
//paint.cell_edge_color = "(0,255,0)";
//parameters.paint = paint;
#endregion
#region optional
Optional optional = new Optional();
optional.channel_1 = bacteriaInfo.chanel1_color;
optional.channel_2 = bacteriaInfo.chanel2_color;
parameters.optional = optional;
#endregion
#region light
Light light = new Light();
parameters.light = light;
#endregion
req.parameters = parameters;
#endregion
strCommand = JsonConvert.SerializeObject(req);
}
}
else if (Ismanualconfig == 2) //自动配置,从固定目录的文件中读取数据
{
string strJson = "";
//if (dtChoiceParams != null)
{
strJson = "{" + "message_id:\"" + Guid.NewGuid().ToString() +
"\",message_type:2" +
",method:\"Run\"" +
",equipment_id:\"ID2023\"" +
",workflow_id:\"\"" +
",experiment_id:\"" + experimentid +
"\",parameters:" +
"{" +
"model:{" + "model_type:" + model_type +
",model_name:\"" + "YS12" +
"\",flow_threshold:" + "0.4" +
",batch_size:" + "16" +
",min_size:" + "1" +
",merge_masks:\"" + merge_masks +
"\"}," +
"params:{" + "ds_ratio:" + ds_ratio +
",mean_diam:" + mean_diam +
",prox:" + prox +
",max_diam:" + max_diam +
",min_diam:" + min_diam +
",dist_to_edge:" + dist_to_edge +
",barcode:\"" + barcode +
"\"}," +
"filter:{" + "check_prox:\"" + "True" +
"\",check_diam_range:\"" + "True" +
"\",check_roundness:\"" + (model_type.Equals("7") ? "False" : "True") +
"\",check_near_edge:\"" + "True" +
"\"}," +
"paint:{" + "draw_dish_edge:\"" + "True" +
"\",draw_mark:\"" + "True" +
//"\",fontsize:" + fontsize +
//",mark_color:\"" + mark_color +
//"\",draw_label:\"" + draw_label +
"\",draw_cell_edge:\"" + "True" +
"\",cell_edge_color:\"" + "(0,255,0)" +
"\"}," +
//"optional:{" + "save_last_setting :\"" + "True" +
//"\"}," +
"light:{" +
//"top_light:" + top_light +
// ",bottom_light:" + bottom_light +
"}" +
"}" +
",process_info:{}" +
",estimate_time:5" +
",timeout:60" +
",description:\"NO DESC\"" +
",timestamp:\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\"}";
}
strCommand = strJson;
}
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
return strCommand;
}
#region 从命令文件的xml节点构建拍照命令属性集合对象
///
/// 从命令文件的xml节点构建拍照命令属性集合对象
///
/// 拍照xml节点
/// 拍照命令属性集合对象
public MethodTakePhoto GenerateMethodTakePhotoDataByXmlNode(XmlNode xmlNode)
{
MethodTakePhoto methodTakePhoto = new MethodTakePhoto();
methodTakePhoto.isrun = xmlNode.SelectSingleNode("isrun").InnerText;
methodTakePhoto.status = xmlNode.SelectSingleNode("status").InnerText;
methodTakePhoto.name = xmlNode.SelectSingleNode("name").InnerText;
methodTakePhoto.label = xmlNode.SelectSingleNode("label").InnerText;
methodTakePhoto.strIndex = xmlNode.SelectSingleNode("strIndex").InnerText;
methodTakePhoto.ismanualconfig = Convert.ToInt32(xmlNode.SelectSingleNode("ismanualconfig").InnerText);
methodTakePhoto.bacteriaids = xmlNode.SelectSingleNode("bacteriaids").InnerText;
methodTakePhoto.gapValue = xmlNode.SelectSingleNode("gapValue").InnerText;
methodTakePhoto.colorText = xmlNode.SelectSingleNode("bacteriacolor/text").InnerText;
methodTakePhoto.colorValue = xmlNode.SelectSingleNode("bacteriacolor/value").InnerText;
methodTakePhoto.identification = Convert.ToInt32(xmlNode.SelectSingleNode("identification").InnerText);
methodTakePhoto.choiceTimes = Convert.ToInt32(xmlNode.SelectSingleNode("choiceTimes").InnerText);
//methodTakePhoto.barcode = xmlNode.SelectSingleNode("barcode").InnerText;
if (xmlNode.SelectSingleNode("labware/text") != null)
{
methodTakePhoto.coatingLabwareText = xmlNode.SelectSingleNode("labware/text").InnerText;
methodTakePhoto.coatingLabwareValue = xmlNode.SelectSingleNode("labware/value").InnerText;
}
return methodTakePhoto;
}
///
/// 从命令文件的xml节点构建拍照电泳命令属性集合对象
///
/// 拍照xml节点
/// 拍照命令属性集合对象
public MethodTakePhotoForElectro GenerateMethodTakePhotoForElectroDataByXmlNode(XmlNode xmlNode)
{
MethodTakePhotoForElectro methodTakePhotoForElectro = new MethodTakePhotoForElectro();
methodTakePhotoForElectro.isrun = xmlNode.SelectSingleNode("isrun").InnerText;
methodTakePhotoForElectro.status = xmlNode.SelectSingleNode("status").InnerText;
methodTakePhotoForElectro.name = xmlNode.SelectSingleNode("name").InnerText;
methodTakePhotoForElectro.label = xmlNode.SelectSingleNode("label").InnerText;
methodTakePhotoForElectro.strIndex = xmlNode.SelectSingleNode("strIndex").InnerText;
methodTakePhotoForElectro.identification = Convert.ToInt32(xmlNode.SelectSingleNode("identification").InnerText);
if (xmlNode.SelectSingleNode("labware/text") != null)
{
methodTakePhotoForElectro.gumLabwareText = xmlNode.SelectSingleNode("labware/text").InnerText;
methodTakePhotoForElectro.gumLabwareValue = xmlNode.SelectSingleNode("labware/value").InnerText;
}
return methodTakePhotoForElectro;
}
#endregion
#region 检查成像点位是否已有板
///
/// 检查成像点位是否已有板
///
///
public bool DoCheckSafe()
{
LoggerHelper.InfoLog("[TakePhotoBll][DoCheckSafe] Start");
bool bIsError = false;
try
{
// 发送请求
List strResult = socketTcpListener.SendMessage(GetCheckSafeReq());
string rtnData = socketTcpListener.CheckData(strResult);
if (string.IsNullOrEmpty(rtnData))
{
bIsError = false;
}
else
{
CheckSafeResponseObject rtData = JsonConvert.DeserializeObject(rtnData);
bIsError = CheckSafeResponseData.SAFE.Equals(rtData.data.result) ? false : true;
}
}
catch (Exception ex)
{
LoggerHelper.ErrorLog("ERROR:", ex);
}
finally
{
LoggerHelper.InfoLog("[TakePhotoBll][DoCheckSafe] End");
}
return bIsError;
}
///
/// 获取检查成像点位是否已有板的请求
///
///
private string GetCheckSafeReq()
{
CheckSafeRequestObject req = new CheckSafeRequestObject();
req.SetBaseVal(EQUIPMENT_ID, "CheckSafe");
return JsonConvert.SerializeObject(req);
}
#endregion
}
}