using DataVApi.Order;
using DataVAPI.Controllers;
using DataVAPI.Model;
using DataVAPI.ModelDataBus;
using DataVAPI.Tool;
using DataVAPI.Tool.IOT;
using DataVAPI.Tool.控制台显示;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
namespace DataVAPI.UpAndDown
{
///
/// 上下线通知
///
public class ProcessServer
{
///
/// 上报大屏总Model
///
public ScreenMonitorModel devModel { get; set; }
public DeviceController deviceController { get; set; }
public LogController logController { get; set; }
public ScreenController screenController { get; set; }
public AlarmController alarmController { get; set; }
public OrderProvider orderProvider { get; set; }
#region 不需要监听
private static ProcessServer _instance;
public static ProcessServer Instance
{
get
{
if (_instance == null)
_instance = new ProcessServer();
return _instance;
}
}
public ProcessServer()
{
deviceController = new DeviceController();
logController = new LogController();
alarmController = new AlarmController();
screenController = new ScreenController();
orderProvider = new OrderProvider();
}
#endregion
///
/// 初始化
///
public void Initialize()
{
devModel = new ScreenMonitorModel();
devModel.operatingDeviceStatus = new OperatingDeviceStatus(); devModel.operatingDeviceStatus.data = new List();//现场设备于状态
devModel.infoMessage = new InfoMessage(); devModel.infoMessage.data = new List();//通知消息
//加载店铺信息 //加载店铺信息
LoadingShopInformation();
//MQTT 数据接收处理
ConsoleHelper.WriteInfoLine("尝试连接阿里云.");
if (IOTDevServer.GetInstance().CreateLinks(DataBus.ProductKey, DataBus.DeviceName, DataBus.DeviceSecret))
{
ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接成功");
}
else
{
ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接失败");
}
//属性状态变xin
//Subscribe(IOTDevServer.TargetStatusSubTopic);
//订阅上下线
Subscribe(IOTDevServer.HeartbeatSubTopic);
//订阅主播消息
Subscribe(IOTDevServer.BroadcastTopic);
IOTDevServer.UNConnectMqtt += new Action((o) => { ConsoleHelper.WriteSuccessLine(o); });
IOTDevServer.DevIOTAction += DevIOTActionHandler;
QueueTask();
ConsoleHelper.WriteSuccessLine("开始接收数据,执行队列任务!");
}
///
/// 队列任务
///
private void QueueTask()
{
Executer.GetInstance().Start(new Action(() =>
{
while (true)
{
try
{
if (!IOTDevServer.GetInstance().GetIsConnected())
{
if (IOTDevServer.GetInstance().CreateLinks(DataBus.ProductKey, DataBus.DeviceName, DataBus.DeviceSecret))
{
ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接成功");
//订阅上下线
Subscribe(IOTDevServer.HeartbeatSubTopic);
//订阅主播消息
Subscribe(IOTDevServer.BroadcastTopic);
}
else
{
ConsoleHelper.WriteSuccessLine($"阿里云【Transit】连接失败");
}
Thread.Sleep(10000);
}
}
catch (Exception ex)
{
ConsoleHelper.WriteErrorLine(ex.Message);
}
}
}), "阿里云重新连接");
Executer.GetInstance().Start(new Action(() =>
{
while (true)
{
try
{
if (IOTDevServer.GetInstance().GetIsConnected())
{
SentData(null);
FindDataAlarm();
Thread.Sleep(3000);
}
}
catch (Exception ex)
{
ConsoleHelper.WriteErrorLine(ex.Message);
}
}
}), "队列任务执行");
}
public void FindDataAlarm()
{
devModel?.operatingDeviceStatus.data?.ForEach(par =>
{
if (!string.IsNullOrEmpty(par.clientId))
{
JsonMsg> jsonMsg = alarmController.QueryClientId(par.clientId);
par.IsAlarm = (jsonMsg.obj != null && jsonMsg.obj.data != null && jsonMsg.obj.data.Count > 0)?true:false;
}
});
}
///
/// 加载店铺信息
///
///
public void LoadingShopInformation(string clientId = "")
{
try
{
ConsoleHelper.WriteSuccessLine("加载店铺集合中.");
JsonMsg> jsonMsg = deviceController.Query("", "",DateTime.MinValue,DateTime.MinValue);
jsonMsg?.obj?.data?.ForEach(par =>
{
int chid = 0;
try
{
chid = int.Parse(par.ClientId);
}
catch (Exception ex)
{
chid = 0;
}
if (chid>0)
{
DevStatus devStatus = new DevStatus()
{
deviceName = par.devicename,
gmtCreate = par.devicesecret,
productKey = par.productkey,
DeviceMC = par.devtype,
DeviceMS = par.remark,
DeviceSJ = par.CreateTime.ToString("yyyy-MM-dd HH:mm:ss"),
DeviceZT = "离线",
clientId = par.ClientId,
deviceId = par.DeviceId
};
if (devModel.operatingDeviceStatus.data.Find(o => o.gmtCreate == par.devicesecret) == null)
{
ConsoleHelper.WriteSuccessLine($"加载设备.{par.devtype} {par.remark}");
devModel.operatingDeviceStatus.data.Insert(0,devStatus);
}
}
});
ConsoleHelper.WriteSuccessLine($"加载设备数[ {jsonMsg?.obj?.data?.Count} ]台...");
}
catch (Exception ex)
{
ConsoleHelper.WriteErrorLine($"错误{ex.Message}");
}
}
///
/// 订阅主题
///
///
public void Subscribe(string subscribe)
{
IOTDevServer.GetInstance().IOT_Subscribe(subscribe);
ConsoleHelper.WriteSuccessLine("订阅主题: " + subscribe);
}
public void Publish(string PubTopic, CommandModel command)
{
ConsoleHelper.WriteWarningLine("发送数据 " + PubTopic + Tools.JsonConvertTools(command));
IOTDevServer.GetInstance().IOT_Publish(PubTopic, Tools.JsonConvertTools(command));
}
///
/// 更新内存集合
///
///
public void SentData(ReceiveModel receiveModel)
{
try
{
if (receiveModel?.deviceContext != null && receiveModel?.status != null)//状态变更消息
{
devModel?.operatingDeviceStatus.data?.Find(par => par.deviceName == receiveModel.deviceContext.deviceName)?.SetStatus(receiveModel.status.value);
devModel?.infoMessage?.data?.Add(new DeviceBase { DeviceMC = receiveModel.deviceContext.deviceName, DeviceMS = $"设备{receiveModel.status.value}了!", DeviceSJ = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") });
DevStatus dev = devModel?.operatingDeviceStatus.data?.Find(par => par.deviceName == receiveModel.deviceContext.deviceName);
if (dev != null) { LoadingShopInformation(); }
dev = devModel?.operatingDeviceStatus.data?.Find(par => par.deviceName == receiveModel.deviceContext.deviceName);
if (dev != null)
{
logController.Create(new LogTable
{
devicename = receiveModel.deviceContext.deviceName,
ClientId = dev.clientId,
LogTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
LogType = "提示",
LogMessage = $"设备{receiveModel.status.value}了!",
LogVla = "通知"
});
int index = 0;
if (receiveModel.status.value == "离线")
{
//离线移除并添加到最后一位
devModel.operatingDeviceStatus.data.Remove(dev);
devModel.operatingDeviceStatus.data.Add(dev);
}
else
{
//在线 往上一点
index = devModel.operatingDeviceStatus.data.FindIndex(0, ar => ar.DeviceZT.Contains("离线"));
if (index > devModel.operatingDeviceStatus.data.Count - 1) index = devModel.operatingDeviceStatus.data.Count - 1;
int now = devModel.operatingDeviceStatus.data.IndexOf(dev);
Swap(devModel.operatingDeviceStatus.data, index, now);
}
}
else
{
LoadingShopInformation();
}
}
devModel.OrderLine = orderProvider.OrderLine(new DataVApi.Order.RequestModel.FullScreenBasic());
devModel.OrderDataState = orderProvider.GetAllOrderDataState(new DataVApi.Order.RequestModel.FullScreenInput());
devModel.LocSale = orderProvider.GetLocSale();
object obj = orderProvider.OrderNumber(new DataVApi.Order.RequestModel.FullScreenBasic());
devModel.OrderNumber = Tools.JsonToObjectTools(Tools.JsonConvertTools(obj));
ScreenMonitorModel screen1Monitor = Tools.JsonToObjectTools(devModel.ToJSON());
#region 1.设置data默认值
if (screen1Monitor.operatingDeviceStatus.data.Count == 0)
{
screen1Monitor.operatingDeviceStatus.data.Add(new DevStatus { DeviceMC = "", DeviceMS = "", DeviceSJ = "", deviceName = "", DeviceZT = "", gmtCreate = "" });
}
if (screen1Monitor.infoMessage.data.Count == 0)
{
screen1Monitor.infoMessage.data.Add(new DeviceBase { DeviceMC = "", DeviceMS = "", DeviceSJ = "" });
}
#endregion
string JSON = screen1Monitor.ToJSON();
if (!string.IsNullOrEmpty(JSON))
{
screenController.CreateOrUpdate(new LargeScreenTable() { json = JSON, devicename = "Transit",ClientId = "-10",DeviceId="-10" });
IOTDevServer.GetInstance().IOT_Publish(IOTDevServer.ScreenShowPubTopic, JSON);
}
if (devModel.infoMessage.data != null && devModel.infoMessage.data.Count > 0)
{
List bases = devModel.infoMessage.data.ToList();
bases?.ForEach(par =>
{
if (string.IsNullOrEmpty(par.DeviceMC)) devModel.infoMessage.data.Remove(par);
if (!string.IsNullOrEmpty(par.DeviceSJ) && DateTime.Now.AddSeconds(-5) > DateTime.Parse(par.DeviceSJ))
{
devModel.infoMessage.data.Remove(par);
}
});
}
}
catch (Exception ex)
{
ConsoleHelper.WriteErrorLine($"错误{ex.Message}");
}
}
///
/// list 位置交换
///
///
///
///
///
///
private static List Swap(List list, int index1, int index2)
{
var temp = list[index1];
list[index1] = list[index2];
list[index2] = temp;
return list;
}
///
/// MQTT 消息
///
///
///
private void DevIOTActionHandler(string topic, string message)
{
if (string.IsNullOrEmpty(topic)) return;
if (topic == IOTDevServer.HeartbeatSubTopic)//上下线订阅主题
{
ReceiveModel receiveModel = Tools.JsonToObjectTools(message);
if (receiveModel != null && receiveModel.status != null)//上下线通知
{
if (receiveModel.deviceContext.deviceName != "Transit" && receiveModel.deviceContext.deviceName != "Transit_Test")
{
ConsoleHelper.WriteWarningLine("接收数据 " + topic + " 数据 " + message);
SentData(receiveModel);
}
}
}
else if (topic == IOTDevServer.BroadcastTopic)//广播主题
{
if (message.Contains("AlarmType"))
{
AlarmTable alarm= Tools.JsonToObjectTools(message);
if (alarm.State == "n")
{
AlarmTable al = alarmController.mg.QueryKeyID(alarm.KeyID);
if (al != null)
{
alarmController.mg.Modify(al.Id, "State", "n");
}
}
else
{
alarmController.Create(alarm);
}
}
else if (message.Contains("LogType"))
{
logController.Create(Tools.JsonToObjectTools(message));
}
}
//else if (topic == IOTDevServer.TargetStatusSubTopic)//属性变更
//{
// ReceiveModel rEmodel = Tools.JsonToObjectTools(message);
// string name= rEmodel.deviceContext.deviceName;
// string status = rEmodel.props.NodeStatus.value;
// string id = deviceController.QueryDeviceName(name)?.obj?.data?.ClientId;
// screenController.CreateOrUpdate(new LargeScreenTable() { json = status, devicename = name, ClientId = id, DeviceId = "" });
//}
}
}
}