using System;
using System.Reflection;
using SHJX.Service.Common.Proxy;
using System.Collections.Generic;
using SHJX.Service.Common.ReadXML;
using SHJX.Service.Control.Modules;
using SHJX.Service.Common.Interface;
using SHJX.Service.Control.Interface;
using SHJX.Service.Common.UserDelegate;
using SHJX.Service.Common.Logging;
using Microsoft.Extensions.Logging;
namespace SHJX.Service.Control.ControlProxy
{
///
/// 路由代理
///
public class ProxyRouteContext : InterceptorImp
{
private readonly Dictionary _responsibilities = new();
private static ReadConfigUtil _config;
private static readonly ILogger logger = LogFactory.BuildLogger(typeof(ProxyRouteContext));
///
/// 无参构造
///
public ProxyRouteContext() { }
///
/// 有参构造
///
///
public ProxyRouteContext(ReadConfigUtil config)
{
var proxies = config.GetResponsibility;
_config = config;
foreach (var item in proxies)
{
var operate = SetProxy(Assembly.GetExecutingAssembly().CreateInstance(item.Proxy));
_responsibilities.Add(item.Name, operate);
}
}
///
/// 调用代理方法
///
///
///
public void InvokeProxyMethod(string proxyName, DataEventArgs data) =>
_responsibilities[proxyName]?.Operate(_config, data);
private FlowControlOperateImp SetProxy(T type) where T : class =>
(FlowControlOperateImp)Proxy.NewProxyInstance(type.GetType(), this);
///
/// 代理调用
///
/// 被代理对象
/// 调用方法
/// 参数
///
public object Invoke(object @object, string method, object[] parameters)
{
var type = @object.GetType();
var retObj = type.GetMethod(method)?.Invoke(@object, parameters);
return AfterInvoke(method, parameters, retObj);
}
///
/// 调用之后的处理
///
///
///
///
///
private static object AfterInvoke(string method, object[] parameters, object retObj)
{
if (parameters[1] is not DataEventArgs data) return retObj;
try
{
if (!method.Equals("Operate"))
return retObj;
if (!Convert.ToBoolean(retObj))
return retObj;
if (Convert.ToBoolean(retObj) == true)
{
logger.LogInformation("任务Local:{0} -> RouteID:{1},RouteStepID:{2},RouteStep:{3},下发成功!", data.Task.OriginLocalName, data.Task.RouteId, data.Task.RouteStepId, data.Task.RouteStep);
UpdateStateInEquipment(data);
ChangeMainElement(data);
MakeMotorChangeZero(data);
UpdateRoute(data);
NotExistTask(data);
}
return retObj;
}
catch (Exception ex)
{
logger.LogError(ex.ToString());
return retObj;
}
}
///
/// 路由更新
///
///
private static void UpdateRoute(DataEventArgs data)
{
switch (data.Task.RouteUpdateType)
{
case "Single":
data.Task.UpdateRouteStep();
break;
case "ALL":
data.Task.UpdateStepToTask();
break;
}
}
///
/// 改变主界面元素
///
///
private static void ChangeMainElement(DataEventArgs data)
{
var changeElementArgs = new Dictionary
{
{"localName",data.Task.OriginLocalName.Replace("A",string.Empty)},
{"to", data.Task.To},
{"from", data.Task.From},
{"level", data.Task.SampleConcentration}
};
(string keyName, string type) = (data.Task.RouteType, data.Task.RouteId, data.Task.RouteStepId, data.Task.TaskType) switch
{
("SY", 2, 8, "水样" or "空白" or "补杯" ) or ("BD", 2, 8, "标定") or ("Wash", 1, 8, "润洗") or ("Wash", 1, 8, "清洗") => ("type", "IC"),//进入消解位
("SY", 7, 6, "水样" or "空白" or "补杯" ) or ("BD", 5, 6, "标定") or ("Wash", 4, 6, "润洗") or ("Wash", 4, 6, "清洗") => ("type", "OC"),//离开消解位
("SY", 7, 8, "水样" or "空白" ) or ("BD", 5, 8, "标定") => ("type", "IS"), //进入搅拌位
("SY", 8, 8, "水样" or "空白" ) or ("BD", 6, 8, "标定") => ("type", "OS"), //离开搅拌位
("SY", 10, 8, "水样" or "空白" or "补杯") or ("BD", 8, 8, "标定") or ("Wash", 4, 8, "润洗") or ("Wash", 4, 8, "清洗") => ("type", "IT"), //进入滴定位
("SY", 11, 6, "水样" or "空白" or "补杯") or ("BD", 9, 6, "标定") or ("Wash", 5, 6, "润洗") or ("Wash", 5, 6, "清洗") => ("type", "OT"), //离开滴定位
("SY", 11, 8, "水样" or "空白" or "补杯") or ("BD", 9, 8, "标定") => ("type", "TtS"), //任务结束
("SY", 7, 8, "补杯") => ("type", "TtS"), //任务结束
_ => (null, null)
};
if (keyName is not null ) changeElementArgs.Add(keyName, type);
if (changeElementArgs.ContainsKey("type")) Messager.Send("changeElement", changeElementArgs);
}
///
/// 更新位置状态
///
///
private static void UpdateStateInEquipment(DataEventArgs data)
{
switch (data.Task.RouteType, data.Task.RouteId, data.Task.RouteStepId)
{
case ("SY", 7, 8) or ("SY", 8, 8) or ("SY", 11, 8) or ("Wash", 4, 19) or ("Wash", 5, 8) or ("BD", 5, 8) or ("BD", 6, 8) or ("BD", 9, 8):
data.Task.From.UpdateAreaPointState();
break;
}
}
///
/// 不存在任务
///
///
private static void NotExistTask(DataEventArgs data)
{
switch (data.Task.RouteType, data.Task.RouteId, data.Task.RouteStepId)
{
case ("SY", 11, 8) or ("BD", 9, 8) or ("Wash", 5, 8):
if (!data.DataManager.GetTaskIsDoingOrNew())
{
Messager.Send("TaskOver"); //任务结束
if (data.Task.RouteType!="Wash")
{
Messager.Send("ScreenShot"); //截屏
Messager.Send("ExportResultWord", data.Task.WaveKey); //导出Word
}
}
if (data.Task.RouteType == "BD" && !data.DataManager.GetEquipmentTasksBD(data.Task.WaveKey))//所有标定执行完毕
{
Messager.Send("BD", data.Task.WaveKey); //标定任务结束后补杯
}
break;
}
}
///
/// 将电机点位置为零
///
///
private static void MakeMotorChangeZero(DataEventArgs data)
{
try
{
var motorName = data.Task.RouteStepId switch
{
6 or 8 => "MotorZ",
10 or 29 => "MotorT",
_ => null
};
if (!string.IsNullOrWhiteSpace(motorName))
{
motorName.UpdateMotorPoint();
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}