zhuangpei-mesbackend/ZR.Service/MES/dev/DeviceDataAnalysisService.cs
2024-06-14 15:11:44 +08:00

180 lines
7.7 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
{
/// <summary>
/// 设备数据分析
/// </summary>
[AppService(ServiceType = typeof(IDeviceDataAnalysisServcie), ServiceLifetime = LifeTime.Transient)]
public class DeviceDataAnalysisService : BaseService<DeviceAccount>, IDeviceDataAnalysisServcie
{
public static List<DeviceType> FindAllLeafNodes(List<DeviceType> nodeList, int targetId)
{
List<int> childIds = new List<int> { targetId };
List<DeviceType> result = new List<DeviceType>();
while (childIds.Any())
{
int parentId = childIds.First();
childIds.RemoveAt(0);
List<int> 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;
}
/// <summary>
/// 故障类型 pie
/// </summary>
/// <param name="devicedefault"></param>
/// <returns></returns>
public List<DeviceStatusAnalysisResultDto> DefaultTypePie(DeviceDefaultDto devicedefault)
{
List<DeviceStatusAnalysisResultDto> resultList = new List<DeviceStatusAnalysisResultDto>();
int[] all_device_type_array = null;
if (devicedefault.DevicetTypeId > 0)
{
List<DeviceType> all_device_type_list = FindAllLeafNodes(Context.Queryable<DeviceType>().ToList(), devicedefault.DevicetTypeId ?? 0);
all_device_type_array = all_device_type_list.Select(it => it.Id).ToArray();
}
var predicate = Expressionable.Create<DeviceRepair, DeviceAccount, SysDictData>()
.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_chart> deviceRepair_list = Context.Queryable<DeviceRepair>()
.LeftJoin<DeviceAccount>((r, a) => r.FkDeviceId == a.Id)
.LeftJoin<SysDictData>((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;
}
/// <summary>
/// 每日故障数量统计
/// </summary>
/// <param name="devicedefault"></param>
/// <returns></returns>
public DeviceFaultBarResultDto FaultTypeBar(DeviceDefaultDto devicedefault)
{
DeviceFaultBarResultDto result = new DeviceFaultBarResultDto();
int[] all_device_type_array = null;
if (devicedefault.DevicetTypeId > 0)
{
List<DeviceType> all_device_type_list = FindAllLeafNodes(Context.Queryable<DeviceType>().ToList(), devicedefault.DevicetTypeId ?? 0);
all_device_type_array = all_device_type_list.Select(it => it.Id).ToArray();
}
var predicate = Expressionable.Create<DeviceRepair, DeviceAccount, SysDictData>()
.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_chart> deviceRepair_list = Context.Queryable<DeviceRepair>()
.LeftJoin<DeviceAccount>((r, a) => r.FkDeviceId == a.Id)
.LeftJoin<SysDictData>((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<SysDictData> all_fault_type = Context.Queryable<SysDictData>().Where(it => it.DictType == "mes_device_fault_type").ToList();
// 先按照天进行上卷聚合,然后按照故障种类进行上卷聚合
var first_groups = deviceRepair_list.GroupBy(it => it.CreatedTime.Date);
DateTime[] Xdata = new DateTime[first_groups.Count()];
int index = 0;
foreach (var group in first_groups)
{
Xdata[index] = group.Key;
index++;
}
List<SeriesData_Item> SeriesData=new List<SeriesData_Item>();
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;
}
}
}