using Autofac;
using DotNetty.Transport.Channels;
using Entity.DbModel.Station;
using HybirdFrameworkCore.Autofac;
using HybirdFrameworkCore.Autofac.Attribute;
using HybirdFrameworkCore.Entity;
using HybirdFrameworkDriver.Session;
using log4net;
using Repository.Station;
using Service.Charger.Common;
using Service.Equipment;
namespace Service.Charger.Client;
///
/// 示例程序
///
[Scope("SingleInstance")]
public static class ClientMgr
{
private static readonly ILog Log = LogManager.GetLogger(typeof(ClientMgr));
private static readonly Dictionary Dictionary = new();
private static bool AutoChargeWorking { get; set; }
public static ChargerClient? GetBySn(string sn)
{
Dictionary.TryGetValue(sn, out var o);
return o;
}
public static bool TryGetClient(IChannel channel, out string sn, out ChargerClient? client)
{
string? snt = ChannelUtils.GetAttr(channel, ChargerConst.ChargerSn);
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, ChargerClient client)
{
Dictionary[sn] = client;
}
//TODO 连接、鉴权,开始充电,结束充电,设置尖峰平谷,读取尖峰平谷,发送功率调节指令,发送辅助源控制指令,下发掉线停止充电,
public static void InitClient()
{
EquipInfoRepository equipInfoRepository = AppInfo.Container.Resolve();
EquipNetInfoRepository netInfoRepository = AppInfo.Container.Resolve();
List equipInfos = equipInfoRepository.QueryListByClause(it => it.TypeCode == (int)EquipmentType.Charger);
if (equipInfos.Count > 0)
{
Dictionary set = equipInfos.ToDictionary(it => it.Code, it => it);
List equipNetInfos = netInfoRepository.QueryListByClause(it => set.Keys.Contains(it.Code));
foreach (EquipNetInfo netInfo in equipNetInfos)
{
Task.Run(() =>
{
ConnClient(netInfo);
});
}
StartAutoChargeThread();
}
}
///
///
///
public static void StartAutoChargeThread()
{
if (!AutoChargeWorking)
{
Thread thread = new Thread(AutoChargeThread)
{
Name = @"auto-charge"
};
thread.Start();
AutoChargeWorking = true;
}
}
///
///
///
private static void AutoChargeThread()
{
ElecPriceModelVersionRepository elecPriceModelVersionRepository =
AppInfo.Container.Resolve();
ElecPriceModelVersionDetailRepository elecPriceModelVersionDetailRepository =
AppInfo.Container.Resolve();
while (true)
{
Thread.Sleep(1000 * 30);
try
{
DateTime now = DateTime.Now;
ElecPriceModelVersion elecPriceModelVersion = elecPriceModelVersionRepository.QueryByClause(i => i.StartTime >= now && i.EndTime < now);
if (elecPriceModelVersion == null)
{
Log.Info("lack of effective elec price model");
continue;
}
List elecPriceModelVersionDetails = elecPriceModelVersionDetailRepository.QueryListByClause(it => it.Version == elecPriceModelVersion.Version);
ElecPriceModelVersionDetail? elecPriceModelVersionDetail = elecPriceModelVersionDetails.Where(i => i.StartHour <= now.Hour && i.StartMinute <= now.Minute
&& i.EndHour > now.Hour &&
i.EndMinute > now.Minute).FirstOrDefault();
if (elecPriceModelVersionDetail == null)
{
Log.Info("lack of effective elec price model detail");
continue;
}
//int batteryCount = elecPriceModelVersionDetail.BatteryCount;
foreach (KeyValuePair pair in Dictionary)
{
Result result = pair.Value.StartCharge();
Log.Info($"start {pair.Key} charge {result.IsSuccess}:{result.Msg}");
}
}
catch (Exception e)
{
Log.Error("AutoChargeThread error", e);
}
}
}
private static void ConnClient(EquipNetInfo netInfo)
{
Log.Info($"begin to connect {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
ChargerClient client = AppInfo.Container.Resolve();
client.InitBootstrap(netInfo.NetAddr, int.Parse(netInfo.NetPort));
client.Connect();
client.SessionAttr(netInfo.Code, netInfo.DestAddr);
AddBySn(netInfo.Code, client);
Log.Info($"connected {netInfo.Code} {netInfo.NetAddr}:{netInfo.NetPort}");
}
}