264 lines
10 KiB
C#
264 lines
10 KiB
C#
using Infrastructure.Attribute;
|
|
using JinianNet.JNTemplate.Dynamic;
|
|
using Newtonsoft.Json.Linq;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using System.Xml.Linq;
|
|
using ZR.Model.Dto;
|
|
using ZR.Model;
|
|
using ZR.Model.MES.andon;
|
|
using ZR.Model.MES.andon.Dto;
|
|
using ZR.Model.MES.dev;
|
|
using ZR.Repository;
|
|
using ZR.Service.MES.andon.IService;
|
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
|
using System.Security.Claims;
|
|
|
|
namespace ZR.Service.MES.andon
|
|
{
|
|
[AppService(ServiceType = typeof(IAndonDataAnalysisServcie), ServiceLifetime = LifeTime.Transient)]
|
|
public class AndonDataAnalysisServcie : BaseService<AndonFaultRecord>, IAndonDataAnalysisServcie
|
|
{
|
|
/// <summary>
|
|
/// 查询故障记录表列表 今日全部 和以前未签到异常
|
|
/// </summary>
|
|
/// <param name="parm"></param>
|
|
/// <returns></returns>
|
|
public PagedInfo<AndonFaultRecordDto> GetList(AndonFaultRecordQueryDto parm)
|
|
{
|
|
var predicate = Expressionable.Create<AndonFaultRecord>()
|
|
.AndIF(parm.DateTimeRange.Count() == 2 && parm.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= parm.DateTimeRange[0])
|
|
.AndIF(parm.DateTimeRange.Count() == 2 && parm.DateTimeRange[1] > DateTime.MinValue, it => it.StartTime <= parm.DateTimeRange[1])
|
|
.OrIF(parm.DateTimeRange.Count() == 2 , it => it.StartTime < parm.DateTimeRange[0] && it.Status == 1)
|
|
;
|
|
|
|
var response = Queryable()
|
|
.Where(predicate.ToExpression())
|
|
.ToPage<AndonFaultRecord, AndonFaultRecordDto>(parm);
|
|
if (response.Result.Count > 0)
|
|
{
|
|
foreach (var item in response.Result)
|
|
{
|
|
if (item.Duration <= 0)
|
|
{
|
|
|
|
item.Duration= (decimal)Math.Round((DateTime.Now-item.StartTime.Value).TotalHours,2);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
return response;
|
|
}
|
|
/// <summary>
|
|
/// 1.获取安灯报警类型字典
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
public List<AndonFaultDict> GetListFault()
|
|
{
|
|
|
|
return Context.Queryable<AndonFaultDict>().Where(it => it.Status == 1).ToList();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取各异常时长占比饼图
|
|
/// </summary>
|
|
/// <param name="query"></param>
|
|
/// <returns></returns>
|
|
public List<AbnormalDurationRatioResult> AbnormalDurationRatio(AndonAnalysisQueryDto query)
|
|
{
|
|
List<AbnormalDurationRatioResult> abnormalDurationRatioResults = new List<AbnormalDurationRatioResult>();
|
|
var predicate = Expressionable.Create<AndonFaultRecord>()
|
|
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= query.DateTimeRange[0])
|
|
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime <= query.DateTimeRange[1]);
|
|
|
|
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).Sum(it => it.Duration).ToString();
|
|
ItemStyle_ itemStyle = new ItemStyle_();
|
|
itemStyle.color = fault.color;
|
|
result_Item.itemStyle = itemStyle;
|
|
abnormalDurationRatioResults.Add(result_Item);
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
return abnormalDurationRatioResults;
|
|
}
|
|
|
|
|
|
|
|
/// <summary>
|
|
/// 获取异常数量汇总比例分析饼图
|
|
/// </summary>
|
|
/// <param name="query"></param>
|
|
/// <returns></returns>
|
|
public List<AbnormalDurationRatioResult> AbnormalNumDurationRatio(AndonAnalysisQueryDto query)
|
|
{
|
|
List<AbnormalDurationRatioResult> abnormalDurationRatioResults = new List<AbnormalDurationRatioResult>();
|
|
var predicate = Expressionable.Create<AndonFaultRecord>()
|
|
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= query.DateTimeRange[0])
|
|
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime <= query.DateTimeRange[1]);
|
|
|
|
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>
|
|
/// <param name="query"></param>
|
|
/// <returns></returns>
|
|
public ExceptionDistributionResult ExceptionDistribution(AndonAnalysisQueryDto query)
|
|
{
|
|
ExceptionDistributionResult exceptionDistributionResult = new ExceptionDistributionResult();
|
|
var predicate = Expressionable.Create<AndonFaultRecord>()
|
|
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime >= query.DateTimeRange[0])
|
|
.AndIF(query.DateTimeRange.Count() == 2 && query.DateTimeRange[0] > DateTime.MinValue, it => it.StartTime <= query.DateTimeRange[1]);
|
|
|
|
List<AndonFaultRecord> InitData = Context.Queryable<AndonFaultRecord>().Where(predicate.ToExpression()).ToList();
|
|
List<DateTime> Xdata = GetOccupiedDates(query.DateTimeRange[0], query.DateTimeRange[1]);
|
|
|
|
|
|
|
|
|
|
exceptionDistributionResult.xData = Xdata.Select(it => it.ToString()).ToArray();
|
|
|
|
SeriesData_ EveTIME = new SeriesData_();
|
|
EveTIME.Name = "异常时长";
|
|
EveTIME.Type = "bar";
|
|
EveTIME.YAxisIndex = 0;
|
|
EveTIME.ShowBackground = true;
|
|
|
|
if (Xdata.Count > 0)
|
|
{
|
|
decimal[] Data= new decimal[Xdata.Count];
|
|
foreach (var xdata in Xdata)
|
|
{
|
|
DateTime midnight = GetMidnightTime(xdata);
|
|
DateTime noon = GetNoonTime(xdata);
|
|
var temp= InitData.Where(it => it.StartTime >= midnight && it.StartTime <= noon).Sum(it => it.Duration);
|
|
Data[Xdata.IndexOf(xdata)] = Math.Round(temp.Value, 2);
|
|
|
|
|
|
|
|
exceptionDistributionResult.ExceptionTimeTotal = exceptionDistributionResult.ExceptionTimeTotal+ Data[Xdata.IndexOf(xdata)];
|
|
}
|
|
EveTIME.Data = Data;
|
|
}
|
|
|
|
|
|
SeriesData_ EveTNUM = new SeriesData_();
|
|
EveTNUM.Name = "异常次数";
|
|
EveTNUM.Type = "bar";
|
|
EveTNUM.YAxisIndex = 1;
|
|
EveTNUM.ShowBackground = true;
|
|
|
|
if (Xdata.Count > 0)
|
|
{
|
|
decimal[] Data = new decimal[Xdata.Count];
|
|
foreach (var xdata in Xdata)
|
|
{
|
|
DateTime midnight = GetMidnightTime(xdata);
|
|
DateTime noon = GetNoonTime(xdata);
|
|
decimal temp= InitData.Where(it => it.StartTime >= midnight && it.StartTime <= noon).Count();
|
|
Data[Xdata.IndexOf(xdata)] = temp;
|
|
|
|
exceptionDistributionResult.ExceptionNumTotal = exceptionDistributionResult.ExceptionNumTotal+Data[Xdata.IndexOf(xdata)];
|
|
}
|
|
EveTNUM.Data = Data;
|
|
}
|
|
SeriesData_ ResponseTime = new SeriesData_();
|
|
ResponseTime.Name = "响应时间";
|
|
ResponseTime.Type = "line";
|
|
ResponseTime.YAxisIndex = 2;
|
|
ResponseTime.ShowBackground = true;
|
|
|
|
if (Xdata.Count > 0)
|
|
{
|
|
decimal[] Data = new decimal[Xdata.Count];
|
|
foreach (var xdata in Xdata)
|
|
{
|
|
DateTime midnight = GetMidnightTime(xdata);
|
|
DateTime noon = GetNoonTime(xdata);
|
|
decimal temp = InitData.Where(it => it.StartTime >= midnight && it.StartTime <= noon).Sum(it=>it.Duration).Value;
|
|
Data[Xdata.IndexOf(xdata)] = Math.Round(temp, 2);
|
|
|
|
|
|
}
|
|
ResponseTime.Data = Data;
|
|
}
|
|
exceptionDistributionResult.seriesData = new SeriesData_[] { EveTIME, EveTNUM, ResponseTime };
|
|
|
|
return exceptionDistributionResult;
|
|
}
|
|
|
|
private static List<DateTime> GetOccupiedDates(DateTime startDate, DateTime endDate)
|
|
{
|
|
List<DateTime> occupiedDates = new List<DateTime>();
|
|
|
|
DateTime currentDate = startDate;
|
|
while (currentDate <= endDate)
|
|
{
|
|
occupiedDates.Add(currentDate);
|
|
currentDate = currentDate.AddDays(1);
|
|
}
|
|
|
|
return occupiedDates;
|
|
}
|
|
private static DateTime GetMidnightTime(DateTime inputTime)
|
|
{
|
|
return new DateTime(inputTime.Year, inputTime.Month, inputTime.Day, 0, 0, 0);
|
|
}
|
|
|
|
private static DateTime GetNoonTime(DateTime inputTime)
|
|
{
|
|
return new DateTime(inputTime.Year, inputTime.Month, inputTime.Day, 23, 59, 59);
|
|
}
|
|
}
|
|
|
|
|
|
}
|