using Aitex.Core.Util;
using Aitex.Core.WCF;
using MECF.Framework.Common.MultiProcess.ProcessCenter;
using System;
using System.Collections.Generic;
using System.Text;
namespace MECF.Framework.Common.MultiProcess
{
///
/// 用于限制同一区域的机台同时进行工艺的数量;
/// 客户端首先问询服务端位置是否充足,若条件合适则向服务端进行预定操作;
///
///
public class MultiProcessManager : Singleton
{
#region Variables
///
/// 加热基数上限
///
private const int Max_Heart_Num = 4;
private const int Max_Heart_Bater_Time = 15;//秒
private PeriodicJob _thread;
protected readonly R_TRIG _connectionFailed = new();
///
/// 腔体列表;预加热与加热状态基数和不能大于4
///
private readonly List _processStateList = [];
private static readonly object _lock = new object();
#endregion Variables
#region Constructors
public MultiProcessManager()
{
var _thread = new PeriodicJob(15000, OnTimer, $"MultiProcessManager", true);
}
#endregion Constructors
#region Methods
public void Initialize(bool enableService)
{
MULTIPROCESS._multiprocessmanager = this;
if (enableService)
{
Singleton.Instance.Initialize(new Type[1] { typeof(MultiProcessService) });
}
}
private bool OnTimer()
{
foreach (var item in _processStateList)
{
if (IsClientTimeOut(item.HeartBeatTime))
item.IsOnline = false;
}
return true;
}
private bool IsClientTimeOut(DateTime heartBeatTime)
{
//timeA 表示需要计算
DateTime timeB = DateTime.Now; //获取当前时间
TimeSpan ts = timeB - heartBeatTime; //计算时间差
return ts.TotalSeconds <= Max_Heart_Bater_Time ? false : true;
}
public List QueryAllProcessInformation()
{
return PMProcessStateManager.GetProcessInformation(_processStateList);
}
public string QueryMyProcessInformation(string sicMachineName, string pmName)
{
return PMProcessStateManager.QueryMyProcessInformation(_processStateList, sicMachineName, pmName);
}
public List QueryAllProcessData()
{
List processDataList = new List();
foreach (var item in _processStateList)
{
processDataList.Add((PMProcessData)item.Clone());
}
return processDataList;
}
public bool CanEnterProcessNow(string clientInformation, string sicMachineName, string pmName, out string result)
{
lock (_lock)
{
var info = QueryMyProcessInformation(sicMachineName,pmName);
if (string.IsNullOrEmpty(info))
{
result = $"不存在{sicMachineName}.{pmName}";
return false;
}
else if (info != "1")
{
result = $"{sicMachineName}.{pmName}当前状态不为ProcessIdle";
return false;
}
int heartBase = 1 + GetAllHeatBaseNum(out string infor);
if (heartBase <= Max_Heart_Num)
{
result = "OK";
UpdateChamberEnterState(clientInformation, sicMachineName, pmName, "2");
return true;
}
result = $"加热基数超上限:{Max_Heart_Num} " + infor;
return false;
}
}
public bool CanEnterProcessIdleNow(string clientInformation, string sicMachineName, string pmName, out string result)
{
lock (_lock)
{
int heartBase = 1 + GetAllHeatBaseNum(out string infor);//添加初始基数2
if (heartBase <= Max_Heart_Num)
{
result = "OK";
UpdateChamberEnterState(clientInformation, sicMachineName, pmName, "1");
return true;
}
result = $"加热基数超上限:{Max_Heart_Num} " + infor;
return false;
}
}
public bool UpdateChamberState(string clientInformation, string sicMachineName, string pmName, string state)
{
lock (_lock)
{
PMProcessData pmProcessData = new()
{
SicMachineName = sicMachineName,
PmName = pmName,
PmState = state,
SicMachineID = clientInformation
};
return PMProcessStateManager.ProcessStateChangeUpdate(pmProcessData, _processStateList);
}
}
public bool UpdateChamberEnterState(string clientInformation, string sicMachineName, string pmName, string enterstate)
{
lock (_lock)
{
PMProcessData pmProcessData = new()
{
SicMachineName = sicMachineName,
PmName = pmName,
EnterState = enterstate,
SicMachineID = clientInformation
};
return PMProcessStateManager.ProcessEnterStateChangeUpdate(pmProcessData, _processStateList);
}
}
private int GetAllHeatBaseNum(out string infor)
{
int heatBase = 0;
StringBuilder sb = new StringBuilder();
foreach (var pmProcessData in _processStateList)
{
heatBase += PMProcessStateManager.GetHeatBaseNum(pmProcessData);
sb.Append($"{pmProcessData.SicMachineID} => {pmProcessData.ProcessState} ;");
}
infor = sb.ToString();
return heatBase;
}
#endregion Methods
}
}