using System.Collections.Concurrent;
using Autofac;
using Common.Const;
using DotNetty.Transport.Channels;
using Entity.DbModel.Station;
using HybirdFrameworkCore.Autofac;
using HybirdFrameworkCore.Autofac.Attribute;
using HybirdFrameworkDriver.Session;
using log4net;
using Repository.Station;
using Service.Charger.Common;
namespace Service.WaterCool.Client;
///
/// 水冷连接管理
///
[Scope]
public class WaterCoolClientMgr
{
public static readonly ConcurrentDictionary Dictionary = new();
private static readonly ILog Log = LogManager.GetLogger(typeof(WaterCoolClientMgr));
///
///
///
///
///
public static WaterCoolClient? GetBySn(string sn)
{
Dictionary.TryGetValue(sn, out var o);
return o;
}
///
/// 通过channel获取client
///
///
///
/// 获取不到,client则为空
///
public static bool TryGetClient(IChannel channel, out string sn, out WaterCoolClient? client)
{
string? snt = ChannelUtils.GetAttr(channel, WaterCoolerConst.WaterCoolSn);
if (!string.IsNullOrWhiteSpace(snt))
{
var chargerClient = GetBySn(snt);
if (chargerClient != null)
{
sn = snt;
client = chargerClient;
return true;
}
}
sn = string.Empty;
client = null;
return false;
}
public static void AddBySn(string sn, WaterCoolClient client)
{
Dictionary[sn] = client;
}
public static void InitClient()
{
EquipInfoRepository equipInfoRepository = AppInfo.Container.Resolve();
EquipNetInfoRepository netInfoRepository = AppInfo.Container.Resolve();
BinInfoRepository binInfoRepository = AppInfo.Container.Resolve();
List equipInfos =
equipInfoRepository.QueryListByClause(it => it.TypeCode == (int)EquipmentType.WaterCool);
if (equipInfos.Count > 0)
{
Dictionary set = equipInfos.ToDictionary(it => it.Code, it => it);
List equipNetInfos = netInfoRepository.QueryListByClause(it => set.Keys.Contains(it.Code));
Dictionary binInfoMap = binInfoRepository
.QueryListByClause(it => set.Keys.Contains(it.ChargerNo))
.ToDictionary(it => it.ChargerNo, it => it);
foreach (EquipNetInfo netInfo in equipNetInfos)
{
Task.Run(() =>
{
binInfoMap.TryGetValue(netInfo.Code, out var binInfo);
ConnClient(netInfo, binInfo);
});
}
}
}
private static void ConnClient(EquipNetInfo netInfo, BinInfo? binInfo)
{
Log.Info($"begin to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
WaterCoolClient client = AppInfo.Container.Resolve();
client.AutoReconnect = true;
client.Sn = netInfo.Code;
client.LogName = "WaterCool" + netInfo.Code;
client.ConnectedEventHandler += (sender, b) => { client.SessionAttr(netInfo.Code, netInfo.DestAddr); };
client.InitBootstrap(netInfo.NetAddr, int.Parse(netInfo.NetPort));
Task.Run(() =>
{
client.Connect();
client.SessionAttr(netInfo.Code, netInfo.DestAddr);
Log.Info($"succeed to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
});
AddBySn(netInfo.Code, client);
Log.Info($"begin to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
}
}