using MessagePack;
using Newtonsoft.Json;
using ServiceCenter;
using ServiceCenter.Redis;
using System.Text;
using ServiceCenter.Extensions;
using ServiceCenter.Logs;
using ServiceCenter.SqlSugars;
using SqlSugar;
using WCS.Core;
using WCS.WorkEngineering;
namespace WCS.Service
{
///
/// 工作服务
///
public class Worker : BackgroundService
{
///
/// 记录器
///
private readonly ILogger _logger;
///
/// 构造函数
///
/// 记录器
public Worker(ILogger logger)
{
_logger = logger;
}
public static readonly string WcsDlog = "WCSDlog";
public static readonly string Wcsdb = "WCSDB";
///
/// 执行
///
/// 停止令牌
///
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
if (stoppingToken.IsCancellationRequested)
return;
#region 初始化Redis连接
var redisConnectionStrings = RedisHub.Default.Check("RedisConnectionStrings") ?? throw new Exception("请在Redis中配置RedisConnectionStrings");
var configs = JsonConvert.DeserializeObject>(redisConnectionStrings);
if (configs != null)
{
if (configs.All(v => v.Key != "Monitor")) throw new Exception("请在RedisConnectionStrings中配置监控RedisDB库连接字符串");
}
foreach (var redisConnection in configs!)
{
RedisHub.CreateContext(redisConnection.ConnectionString, redisConnection.Key);
switch (redisConnection.Key)
{
case "Monitor":
RedisHub.SetMonitorContextType(redisConnection.Key);
RedisHub.Monitor.Serialize = obj =>
{
var bytes = MessagePackSerializer.Serialize(obj);
return bytes;
};
RedisHub.Monitor.DeserializeRaw = (bytes, type) =>
{
var obj = MessagePackSerializer.Deserialize(type, bytes);
return obj;
};
break;
case "DebugRedisUrl":
RedisHub.SetDebugContextType(redisConnection.Key);
Configs.DebugRedisUrl = redisConnection.ConnectionString;
break;
case "WMS":
RedisHub.SetWMSContextType(redisConnection.Key);
break;
}
}
#endregion 初始化Redis连接
#region 启用日志
//var logConfigText = RedisHub.Default.Check("LogConfigText") ?? throw new Exception("请在Redis中配置log4net相关内容");
//var logConfig = JsonConvert.DeserializeObject(logConfigText);
//LogHub.SetConfigInfo(logConfig!);
#endregion 启用日志
_logger.LogInformation("WCS开始启动");
Configs.ProtocolProxyBaseType = typeof(ProtocolProxy);
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
Configs.StringEncoding = Encoding.UTF8;
//var warehouseName = RedisHub.Default.Check("WarehouseName") ?? throw new Exception("请在Redis中配置仓库名称");
//if (string.IsNullOrEmpty(warehouseName)) throw new Exception("请在Redis中配置仓库名称");
//ServiceHub.SetWarehouseName(warehouseName);
#region 初始化数据库连接
var dbConnectionStrings = RedisHub.Default.Check("DbConnectionStrings") ?? throw new Exception("请在Redis中配置数据库连接相关内容");
ServiceHub.DbConnectionStrings = JsonConvert.DeserializeObject>(dbConnectionStrings);
if (ServiceHub.DbConnectionStrings != null)
{
if (ServiceHub.DbConnectionStrings.All(v => v.Key != Wcsdb)) throw new Exception("请在DbConnectionStrings中配置WCS基础数据库连接字符串");
if (ServiceHub.DbConnectionStrings.All(v => v.Key == Wcsdb && !v.IsDefault)) throw new Exception("请在DbConnectionStrings中配置WCS基础数据库为默认数据库");
// if (ServiceHub.DbConnectionStrings.All(v => v.Key != WcsDlog)) throw new Exception("请在DbConnectionStrings中配置WCS日志数据库连接字符串");
}
//设置连接信息
List connectionConfigs = new List();
foreach (var connectionString in ServiceHub.DbConnectionStrings!)
{
connectionConfigs.Add(new ConnectionConfig()
{
ConfigId = connectionString.Key,
ConnectionString = connectionString.ConnectionString,//连接符字串
DbType = connectionString.DbType,//数据库类型
IsAutoCloseConnection = true,//不设成true要手动close
LanguageType = LanguageType.Chinese,
MoreSettings = new ConnMoreSettings()
{
IsNoReadXmlDescription = true
}
});
};
SqlSugarHelper.SetDb(new SqlSugarScope(connectionConfigs));
ServiceHub.DbConnectionStrings.InitDB();
#endregion 初始化数据库连接
#region 初始化设备信息
WorkStart.InitializeDeviceInfo();
#endregion 初始化设备信息
#region 初始化PLC访问器及PLC读取协议
//创建PLC访问器
Configs.PLCAccessorCreater = new PLCAccessors.PLCAccessorsCreater();
try
{
#region 唤醒所有的世界
World.StartAll();
#endregion 唤醒所有的世界
_logger.LogInformation("WCS启动成功");
}
catch (Exception ex)
{
_logger.LogError("WCS启动失败{0}", ex.Message);
}
#endregion 初始化PLC访问器及PLC读取协议
LogHub.init();
}
}
}