283 lines
11 KiB
C#
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;
|
|
}
|
|
|
|
}
|
|
}
|