Sic.Framework-Nanjing-Baishi/MECF.Framework.Common/MECF/Framework/Common/MultiProcess/MultiProcessManager.cs

154 lines
4.9 KiB
C#

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
{
/// <summary>
/// 用于限制同一区域的机台同时进行工艺的数量
/// </summary>
public class MultiProcessManager : Singleton<MultiProcessManager>
{
#region Variables
/// <summary>
/// 加热基数上限
/// </summary>
private const int Max_Heart_Num = 4;
private const int Max_Heart_Bater_Time = 15;//秒
private PeriodicJob _thread;
protected readonly R_TRIG _connectionFailed = new();
private readonly List<PMProcessData> _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<WcfServiceManager>.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<string> QueryAllProcessInformation()
{
return PMProcessStateManager.GetProcessInformation(_processStateList);
}
public string QueryMyProcessInformation(string sicMachineName, string pmName)
{
return PMProcessStateManager.QueryMyProcessInformation(_processStateList, sicMachineName, pmName);
}
public List<PMProcessData> QueryAllProcessData()
{
List<PMProcessData> processDataList = new List<PMProcessData>();
foreach (var item in _processStateList)
{
processDataList.Add((PMProcessData)item.Clone());
}
return processDataList;
}
public bool CanEnterProcessNow(string sicMachineName, string pmName, out string result)
{
lock (_lock)
{
int heartBase = 2 + GetAllHeatBaseNum(out string infor);//添加初始基数1
if (heartBase <= Max_Heart_Num)
{
result = "OK";
return true;
}
result = $"加热基数超上限:{Max_Heart_Num} " + infor;
return false;
}
}
public bool CanEnterProcessIdleNow(string sicMachineName, string pmName, out string result)
{
lock (_lock)
{
int heartBase = 1 + GetAllHeatBaseNum(out string infor);//添加初始基数2
if (heartBase <= Max_Heart_Num)
{
result = "OK";
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);
}
}
private int GetAllHeatBaseNum(out string infor)
{
int heartBase = 0;
StringBuilder sb = new StringBuilder();
foreach (var pmProcessData in _processStateList)
{
heartBase += PMProcessStateManager.GetHeatBaseNum(pmProcessData);
if (pmProcessData.Heat == 2)
sb.Append($"{pmProcessData.SicMachineID} is Process ; ");
if (pmProcessData.Heat == 1)
sb.Append($"{pmProcessData.SicMachineID} is ProcessIdle ; ");
}
infor = sb.ToString();
return heartBase;
}
#endregion Methods
}
}