using Infrastructure.Attribute; using Infrastructure.Extensions; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using ZR.Model.MES.dev; using ZR.Model.MES.dev.Dto; using ZR.Model.System; using ZR.Service.MES.dev.IService; namespace ZR.Service.MES.dev { /// /// 设备数据分析 /// [AppService(ServiceType = typeof(IDeviceDataAnalysisServcie), ServiceLifetime = LifeTime.Transient)] public class DeviceDataAnalysisService : BaseService, IDeviceDataAnalysisServcie { public static List FindAllLeafNodes(List nodeList, int targetId) { List childIds = new List { targetId }; List result = new List(); while (childIds.Any()) { int parentId = childIds.First(); childIds.RemoveAt(0); List children = nodeList.Where(n => n.ParentId == parentId).Select(n => n.Id).ToList(); if (children.Any()) { childIds.AddRange(children); } else { result.Add(nodeList.First(n => n.Id == parentId)); } } return result; } /// /// 故障类型 pie /// /// /// public List DefaultTypePie(DeviceDefaultDto devicedefault) { List resultList = new List(); int[] all_device_type_array = null; if (devicedefault.DevicetTypeId > 0) { List all_device_type_list = FindAllLeafNodes(Context.Queryable().ToList(), devicedefault.DevicetTypeId ?? 0); all_device_type_array = all_device_type_list.Select(it => it.Id).ToArray(); } var predicate = Expressionable.Create() .AndIF(all_device_type_array != null && all_device_type_array.Length > 0, (r, a, d) => all_device_type_array.Contains(a.FkDeviceType)) .AndIF(!string.IsNullOrEmpty(devicedefault.DeviceName), (r, a, d) => a.DeviceName.Contains(devicedefault.DeviceName)) .AndIF(!string.IsNullOrEmpty(devicedefault.DeviceCode), (r, a, d) => a.DeviceCode.Contains(devicedefault.DeviceCode)) .AndIF(devicedefault.searchTime[0] > new DateTime(1991, 1, 1), (r, a, d) => r.CreatedTime >= devicedefault.searchTime[0]) .AndIF(devicedefault.searchTime[1] > new DateTime(1991, 1, 1), (r, a, d) => r.CreatedTime <= devicedefault.searchTime[1]) .And((r, a, d) => d.DictType == "mes_device_fault_type") ; List deviceRepair_list = Context.Queryable() .LeftJoin((r, a) => r.FkDeviceId == a.Id) .LeftJoin((r, a, d) => r.Type == d.DictValue) .Where(predicate.ToExpression()) .Select((r, a, d) => new DeviceRepair_chart { Type = r.Type, TypeName = d.DictLabel, }).ToList(); if (deviceRepair_list.Count > 0) { var TypeGroups = deviceRepair_list.GroupBy(it => it.TypeName); foreach (var group in TypeGroups) { DeviceStatusAnalysisResultDto result = new DeviceStatusAnalysisResultDto(); result.name = group.Key; result.value = group.Count(); resultList.Add(result); } } return resultList; } /// /// 每日故障数量统计 /// /// /// public DeviceFaultBarResultDto FaultTypeBar(DeviceDefaultDto devicedefault) { DeviceFaultBarResultDto result = new DeviceFaultBarResultDto(); int[] all_device_type_array = null; if (devicedefault.DevicetTypeId > 0) { List all_device_type_list = FindAllLeafNodes(Context.Queryable().ToList(), devicedefault.DevicetTypeId ?? 0); all_device_type_array = all_device_type_list.Select(it => it.Id).ToArray(); } var predicate = Expressionable.Create() .AndIF(all_device_type_array != null && all_device_type_array.Length > 0, (r, a, d) => all_device_type_array.Contains(a.FkDeviceType)) .AndIF(!string.IsNullOrEmpty(devicedefault.DeviceName), (r, a, d) => a.DeviceName.Contains(devicedefault.DeviceName)) .AndIF(!string.IsNullOrEmpty(devicedefault.DeviceCode), (r, a, d) => a.DeviceCode.Contains(devicedefault.DeviceCode)) .AndIF(devicedefault.searchTime[0] > new DateTime(1991, 1, 1), (r, a, d) => r.CreatedTime >= devicedefault.searchTime[0]) .AndIF(devicedefault.searchTime[1] > new DateTime(1991, 1, 1), (r, a, d) => r.CreatedTime <= devicedefault.searchTime[1]) .And((r, a, d) => d.DictType == "mes_device_fault_type") ; List deviceRepair_list = Context.Queryable() .LeftJoin((r, a) => r.FkDeviceId == a.Id) .LeftJoin((r, a, d) => r.Type == d.DictValue) .Where(predicate.ToExpression()) .Select((r, a, d) => new DeviceRepair_chart { Type = r.Type, TypeName = d.DictLabel, CreatedTime = (DateTime)r.CreatedTime }).ToList(); //获取所有故障类型 List all_fault_type = Context.Queryable().Where(it => it.DictType == "mes_device_fault_type").ToList(); // 先按照天进行上卷聚合,然后按照故障种类进行上卷聚合 var first_groups = deviceRepair_list.GroupBy(it => it.CreatedTime.Date); string[] Xdata = new string[first_groups.Count()]; int index = 0; foreach (var group in first_groups) { Xdata[index] = group.Key.ToString("yyyy-MM-dd"); index++; } List SeriesData=new List(); foreach (SysDictData dict in all_fault_type) { SeriesData_Item seriesData_Item = new SeriesData_Item(); seriesData_Item.Name = dict.DictLabel; //这种故障在每天的值 int[] values = new int[first_groups.Count()]; int index2 = 0; foreach (var group in first_groups) { //凌晨 DateTime startOfDay = group.Key; //午夜(23:59:59) DateTime endOfDay = group.Key.AddDays(1).AddSeconds(-1); values[index2]= deviceRepair_list .Where(it => it.CreatedTime >= startOfDay && it.CreatedTime <= endOfDay) .Where(it => it.Type == dict.DictValue).Count(); index2++; } seriesData_Item.Data = values; SeriesData.Add(seriesData_Item); } result.XData = Xdata; result.SeriesData=SeriesData; return result; } } }