using Newtonsoft.Json;
using ServiceCenter;
using ServiceCenter.Extensions;
using ServiceCenter.Redis;
using ServiceCenter.SqlSugars;
using System.ComponentModel;
using WCS.Core;
using WCS.Entity;
using WCS.Entity.Protocol.BCR;
using WCS.Entity.Protocol.DataStructure;
using WCS.Entity.Protocol.SRM;
using WCS.Entity.Protocol.Station;
using WCS.Service.Worlds;
using WCS.WorkEngineering.Extensions;
namespace WCS.Service.Systems
{
///
/// 数据采集系统
///
[BelongTo(typeof(DataCollectionWorld))]
[Description("数据采集系统")]
public class DataCollectionSysyem : DeviceSystem
{
public List ConvList;
public List> Conv91List;
public List> Bcrs;
public List Srms;
public DataCollectionSysyem()
{
ConvList = Device.All.Where(v => v.HasProtocol(typeof(IStation523))).Select(v => new Station(v, this.World)).ToList();
Conv91List = Device.All.Where(v => v.HasProtocol(typeof(IStation91))).Select(v => new Device(v, this.World)).ToList();
Bcrs = Device.All.Where(v => v.HasProtocol(typeof(IBCR81))).Select(v => new Device(v, this.World)).ToList();
Srms = Device.All.Where(v => v.HasProtocol(typeof(ISRM520))).Select(v => new SRM(v, this.World)).ToList();
}
protected override bool ParallelDo => true;
protected override bool SaveLogsToFile => true;
public override bool Select(Device dev)
{
return dev.Code == "SRM1";
}
public override void Do(SRM obj)
{
SqlSugarHelper.Do(db =>
{
DeviceDataPack pack = new DeviceDataPack();
List DevList = new List();
foreach (var item in ConvList)
{
var dev = new StationData()
{
Code = item.Entity.Code,
Frame = DateTime.Now,
D520 = TypeExtension.Mapper(item.Data),
D521 = TypeExtension.Mapper(item.Data2),
D523 = TypeExtension.Mapper(item.Data3),
D90 = new WCS_Station90(),
D91 = new WCS_Station91(),
D80 = new WCS_BCR80(),
D81 = new WCS_BCR81()
};
if (Conv91List.Any(v => v.Entity.Code == item.Entity.Code))
{
var d91 = Conv91List.First(v => v.Entity.Code == item.Entity.Code);
dev.D91 = TypeExtension.Mapper(d91.Data);
}
if (Bcrs.Any(v => v.Entity.Code == item.Entity.Code))
{
var d81 = Bcrs.First(v => v.Entity.Code == item.Entity.Code);
dev.D81 = TypeExtension.Mapper(d81.Data);
}
RedisHub.WMS.Set(item.Entity.Code, item.Data2.Mode);
RedisHub.WMS.Set($"{nameof(EquipmentAlarm)}:{item.Entity.Code}", JsonConvert.SerializeObject(new EquipmentAlarm()
{
Code = item.Entity.Code,
Msg = item.Data3.Alarm.ToString(),
Time = DateTime.Now
}));
DevList.Add(dev);
}
pack.StationDatas = new DeviceDataCollection(DateTime.Now, DevList.ToArray());
List srmList = new List();
foreach (var item in Srms)
{
var dev = new SRMData()
{
Code = item.Entity.Code,
Frame = DateTime.Now,
D520 = TypeExtension.Mapper(item.Data),
D521 = TypeExtension.Mapper(item.Data2),
D537 = TypeExtension.Mapper(item.Data3),
};
RedisHub.WMS.Set(item.Entity.Code, item.Data2.AutoStatus);
RedisHub.WMS.Set($"{nameof(EquipmentAlarm)}:{item.Entity.Code}", JsonConvert.SerializeObject(new EquipmentAlarm()
{
Code = item.Entity.Code,
Msg = item.Data3.Alarm.ToString(),
Time = DateTime.Now
}));
srmList.Add(dev);
}
pack.SRMDatas = new DeviceDataCollection(DateTime.Now, srmList.ToArray());
pack.Frame = DateTime.Now;
var plcData = new WCS_PlcData()
{
AddWho = "WCS",
WAREHOUSE = ServiceHub.WarehouseName,
CONTENT = JsonConvert.SerializeObject(pack, null, new JsonSerializerSettings { ReferenceLoopHandling = ReferenceLoopHandling.Ignore }),
};
RedisHub.Monitor.RPush("Packs", pack);
RedisHub.Monitor.Set(nameof(DeviceDataPack), pack);
if (RedisHub.Monitor.LLen("Packs") > 500000)
{
RedisHub.Monitor.LTrim("Packs", 5000, -1);
}
db.Default.Insertable(plcData).ExecuteCommand();
});
}
}
///
/// 设备报警
///
public class EquipmentAlarm
{
///
/// 设备号
///
public string Code { get; set; }
///
/// 内容
///
public string Msg { get; set; }
///
/// 时间
///
public DateTime Time { get; set; }
}
}