zhuangpei-mesbackend/DOAN.Service/MES/BI/AndonDataAnalysisService.cs
qianhao.xu a219d106b9 1
2025-03-17 13:27:44 +08:00

283 lines
11 KiB
C#

using Aliyun.OSS;
using DOAN.Model.Dto;
using DOAN.Model.mes.echarts;
using DOAN.Model.MES.andon;
using DOAN.Model.MES.andon.Dto;
using DOAN.Model.MES.base_;
using DOAN.Model.MES.dev;
using DOAN.Repository;
using DOAN.Service.MES.BI.IService;
using DOAN.Service.MES.BI.IService;
using Infrastructure.Attribute;
using Mapster;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DOAN.Service.MES.BI
{
[AppService(ServiceType = typeof(IAndonDataAnalysisService), ServiceLifetime = LifeTime.Transient)]
public class AndonDataAnalysisService : BaseService<AndonFaultRecord>, IAndonDataAnalysisService
{
/// <summary>
/// 获取今天的异常记录
/// </summary>
/// <returns></returns>
public List<AndonFaultRecordDto> QueryTodayAndonFaultRecord()
{
var predicate = Expressionable.Create<AndonFaultRecord>()
.And(it => it.CreatedTime >= DateTime.Now.Date)
.Or(it => it.Status == 0)
;
var response = Queryable()
.Where(predicate.ToExpression())
.ToList().Adapt<List<AndonFaultRecordDto>>();
if (response.Count > 0)
{
foreach (var item in response)
{
if (item.Duration <= 0)
{
item.Duration = (decimal)Math.Round((DateTime.Now - item.StartTime.Value).TotalMinutes, 2);
}
}
}
return response;
}
/// <summary>
/// 本月异常次数占比统计
/// </summary>
/// <returns></returns>
public List<AbnormalDurationRatioResult> AbnormalDurationRatio()
{
List<AbnormalDurationRatioResult> abnormalDurationRatioResults = new List<AbnormalDurationRatioResult>();
// 获取当前日期和时间
DateTime now = DateTime.Now;
// 获取本月的最开始时间(本月的第一天的午夜时间)
DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
var predicate = Expressionable.Create<AndonFaultRecord>()
.And(it => it.StartTime >= firstDayOfMonth);
List<AndonFaultRecord> InitData = Context.Queryable<AndonFaultRecord>().Where(predicate.ToExpression()).ToList();
//获取全部异常
List<AndonFaultDict> AllAndonFaultDict = Context.Queryable<AndonFaultDict>().Where(it => it.Status == 1).ToList();
if (InitData.Count > 0)
{
foreach (var fault in AllAndonFaultDict)
{
AbnormalDurationRatioResult result_Item = new AbnormalDurationRatioResult();
result_Item.Name = fault.Name;
result_Item.value = InitData.Where(it => it.FaultDict == fault.Name).Count().ToString();
ItemStyle_ itemStyle = new ItemStyle_();
itemStyle.color = fault.color;
result_Item.itemStyle = itemStyle;
abnormalDurationRatioResults.Add(result_Item);
}
}
return abnormalDurationRatioResults;
}
/// <summary>
/// 本月停机时间统计柱状图,一个折线图,多个柱状图
/// </summary>
/// <returns></returns>
public EchartsOptions ShutdownBar()
{
EchartsOptions echartsOptions = new EchartsOptions();
echartsOptions.Title = new EchartsTitle { Text = "本月异常停机时间统计", SubText = "本月异常停机时间统计" };
// 获取当前日期和时间
DateTime now = DateTime.Now;
// 获取本月的最开始时间(本月的第一天的午夜时间)
DateTime firstDayOfMonth = new DateTime(now.Year, now.Month, 1, 0, 0, 0);
// 获取本月的最后一天
DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddDays(-1);
// 创建一个列表来存储本月的每一天
List<string> daysOfMonth = new List<string>();
// 循环从本月的第一天到最后一天,并将每一天添加到列表中
for (DateTime date = firstDayOfMonth; date <= lastDayOfMonth; date = date.AddDays(1))
{
daysOfMonth.Add(date.ToString("MM-dd"));
}
List<EchartsSeries> echartsOptionsSeries = new List<EchartsSeries>();
EchartsXAxis XAxis = new EchartsXAxis();
XAxis.Data = daysOfMonth;
echartsOptions.XAxis = XAxis;
#region 线
EchartsSeries seriesLine = new EchartsSeries();
seriesLine.Name = "累计停机时间";
seriesLine.Type = "line";
List<EchartsSeriesData> seriesLine_data = null;
var result = Context.Queryable<AndonFaultRecord>()
.Where(x => x.CreatedTime >= firstDayOfMonth && x.CreatedTime <= lastDayOfMonth)
.GroupBy(x => x.CreatedTime.Value.Date) // 按日期分组
.Select(x => new
{
Date = x.CreatedTime.Value.Date,
TotalDuration = SqlFunc.AggregateSum(x.Duration) // 计算每日累计的 Duration
})
.ToList();
// 如果某天没有数据,填充默认值
var allDaysInMonth = Enumerable.Range(0, (lastDayOfMonth - firstDayOfMonth).Days + 1)
.Select(offset => firstDayOfMonth.AddDays(offset).Date)
.ToList();
seriesLine_data = allDaysInMonth
.GroupJoin(result,
date => date,
summary => summary.Date,
(date, summaries) => new EchartsSeriesData
{
Name = date.ToString("MM-dd"),
Value = summaries.FirstOrDefault()?.TotalDuration ?? 0
})
.OrderBy(x => x.Name)
.ToList();
seriesLine.Data = seriesLine_data;
echartsOptionsSeries.Add(seriesLine);
#endregion
#region
//获取故障字典
List<AndonFaultDict> andonFaults = Context.Queryable<AndonFaultDict>().ToList();
foreach (var andonFault in andonFaults)
{
EchartsSeries seriesBar = new EchartsSeries();
seriesBar.Name = andonFault.Name + "停机时间";
seriesBar.Type = "bar";
List<EchartsSeriesData> seriesLine_data_bar = null;
var result01 = Context.Queryable<AndonFaultRecord>()
.Where(x => x.CreatedTime >= firstDayOfMonth && x.CreatedTime <= lastDayOfMonth)
.Where(x => x.FaultDict == andonFault.Name)
.GroupBy(x => x.CreatedTime.Value.Date) // 按日期分组
.Select(x => new
{
Date = x.CreatedTime.Value.Date,
TotalDuration = SqlFunc.AggregateSum(x.Duration) // 计算每日累计的 Duration
})
.ToList();
// 如果某天没有数据,填充默认值
var allDaysInMonth01 = Enumerable.Range(0, (lastDayOfMonth - firstDayOfMonth).Days + 1)
.Select(offset => firstDayOfMonth.AddDays(offset).Date)
.ToList();
seriesLine_data_bar = allDaysInMonth
.GroupJoin(result01,
date => date,
summary => summary.Date,
(date, summaries) => new EchartsSeriesData
{
Name = date.ToString("MM-dd"),
Value = summaries.FirstOrDefault()?.TotalDuration ?? 0
})
.OrderBy(x => x.Name)
.ToList();
seriesBar.Data = seriesLine_data_bar;
echartsOptionsSeries.Add(seriesBar);
}
#endregion
echartsOptions.Series = echartsOptionsSeries;
return echartsOptions;
}
/// <summary>
/// 当前各产线实时状态
/// </summary>
/// <returns></returns>
public Dictionary<string, bool> LineRealTimeStatus()
{
return Context.Queryable<BaseWorkRoute>()
.LeftJoin<AndonFaultRecord>((r, a) => r.Code == a.LineCode && a.Status == 1)
.Select((r, a) => new
{
Code = r.Code,
IsAndonFaultRecordNotNull = SqlFunc.IsNullOrEmpty(a.Id)
})
.ToList() // 将查询结果转换为列表
.ToDictionary(
x => x.Code, // 字典的 key 是 r.Code
x => x.IsAndonFaultRecordNotNull // 字典的 value 是判断 a 是否为空
);
}
/// <summary>
/// 本月各组异常时间统计
/// </summary>
/// <returns></returns>
public EchartsOptions MonthLineShutDown()
{
EchartsOptions echartsOptions = new EchartsOptions();
echartsOptions.Title = new EchartsTitle { Text = "本月各组异常时间统计", SubText = "本月各组异常时间统计" };
// X轴
EchartsXAxis echartsXAxis = new EchartsXAxis();
//系列
EchartsSeries echartsSeries = new EchartsSeries();
echartsSeries.Name = "各组异常时间";
echartsSeries.Type = "bar";
List<EchartsSeriesData> seriesData = new List<EchartsSeriesData>();
Context.Queryable<AndonFaultRecord>().GroupBy(it => it.LineCode)
.Select(it => new
{
LineCode = it.LineCode,
TotalDuration = SqlFunc.AggregateSum(it.Duration)
}).MergeTable().OrderByDescending(it => it.TotalDuration)
.ForEach(it =>
{
seriesData.Add(new EchartsSeriesData
{
Name = it.LineCode,
Value = it.TotalDuration ?? 0
});
});
echartsSeries.Data = seriesData;
echartsXAxis.Data = seriesData.Select(it => it.Name).ToList();
echartsOptions.XAxis = echartsXAxis;
echartsOptions.Series = new List<EchartsSeries> { echartsSeries };
return echartsOptions;
}
}
}