|
|
|
@ -1,12 +1,15 @@
|
|
|
|
|
using AngleSharp.Css.Values;
|
|
|
|
|
using AngleSharp.Dom;
|
|
|
|
|
using Masuit.Tools;
|
|
|
|
|
using Masuit.Tools.DateTimeExt;
|
|
|
|
|
using Masuit.Tools.Models;
|
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
using NLog.LayoutRenderers.Wrappers;
|
|
|
|
|
using PVDEMCS.Common;
|
|
|
|
|
using PVDEMCS.Common.Constant;
|
|
|
|
|
using PVDEMCS.Common.DI;
|
|
|
|
|
using PVDEMCS.Common.EF;
|
|
|
|
|
using PVDEMCS.Common.Tools;
|
|
|
|
|
using PVDEMCS.Services.Models;
|
|
|
|
|
using PVDEMCS.Services.Repositories.Entities;
|
|
|
|
|
using SixLabors.ImageSharp.Processing.Processors.Transforms;
|
|
|
|
@ -192,15 +195,15 @@ namespace PVDEMCS.Services.Repositories.Impl
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
var furnaceQuy = (from q in query
|
|
|
|
|
join e in context.EquipmentInfos.Where(f => !f.IsDelete) on q.EquipmentId equals e.Id
|
|
|
|
|
where q.State == EquipmentState.Run
|
|
|
|
|
select new
|
|
|
|
|
{
|
|
|
|
|
q.EquipmentId,
|
|
|
|
|
e.EquipmentType,
|
|
|
|
|
q.StartTime,
|
|
|
|
|
q.EndTime
|
|
|
|
|
}).ToList();
|
|
|
|
|
join e in context.EquipmentInfos.Where(f => !f.IsDelete) on q.EquipmentId equals e.Id
|
|
|
|
|
where q.State == EquipmentState.Run
|
|
|
|
|
select new
|
|
|
|
|
{
|
|
|
|
|
q.EquipmentId,
|
|
|
|
|
e.EquipmentType,
|
|
|
|
|
q.StartTime,
|
|
|
|
|
q.EndTime
|
|
|
|
|
}).ToList();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//获取配置的设备的阈值
|
|
|
|
@ -240,7 +243,7 @@ namespace PVDEMCS.Services.Repositories.Impl
|
|
|
|
|
value.Create();
|
|
|
|
|
context.EquipmentRecordDayTotals.Add(value);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
value.Update();
|
|
|
|
|
}
|
|
|
|
@ -264,7 +267,7 @@ namespace PVDEMCS.Services.Repositories.Impl
|
|
|
|
|
}
|
|
|
|
|
value.FurnaceNum = 0;
|
|
|
|
|
//出炉数量
|
|
|
|
|
var furnaceList = furnaceQuy.Where(f => f.EquipmentId == value.EquipmentId && value.TotalDay.Value.ToString("yyyy-MM-dd")==f.StartTime.ToString("yyyy-MM-dd")).ToList();
|
|
|
|
|
var furnaceList = furnaceQuy.Where(f => f.EquipmentId == value.EquipmentId && value.TotalDay.Value.ToString("yyyy-MM-dd") == f.StartTime.ToString("yyyy-MM-dd")).ToList();
|
|
|
|
|
foreach (var furnace in furnaceList)
|
|
|
|
|
{
|
|
|
|
|
//计算开炉次数
|
|
|
|
@ -618,6 +621,215 @@ namespace PVDEMCS.Services.Repositories.Impl
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取设备记录OEE月统计
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public Result<List<EquipmentOEEMonthTotal>> GetEquipmentRecordOEEMonthTotal()
|
|
|
|
|
{
|
|
|
|
|
//获取今年第一天和最后一天
|
|
|
|
|
var begDate = DateTime.Now.ToString("yyyy-01-01");
|
|
|
|
|
var endDate = DateTime.Parse(begDate).AddYears(1).AddSeconds(-1).ToString("yyyy-MM-dd");
|
|
|
|
|
using (var context = new EFContext())
|
|
|
|
|
{
|
|
|
|
|
var sql = $@"SELECT
|
|
|
|
|
info.id AS EquipmentId,
|
|
|
|
|
info.equipment_type AS EquipmentType,
|
|
|
|
|
SUM( total_running_time ) AS TotalRunningTime,
|
|
|
|
|
MONTH ( total_day ) AS TotalMonth
|
|
|
|
|
|
|
|
|
|
FROM
|
|
|
|
|
equipment_record_day_total a
|
|
|
|
|
JOIN equipment_info info ON a.equipment_id = info.id
|
|
|
|
|
WHERE
|
|
|
|
|
total_day >= '{begDate}'
|
|
|
|
|
AND total_day <= '{endDate}'
|
|
|
|
|
GROUP BY
|
|
|
|
|
TotalMonth,
|
|
|
|
|
EquipmentId,
|
|
|
|
|
EquipmentType";
|
|
|
|
|
|
|
|
|
|
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordStateOEEMonthTotal>(context, sql).ToArray();
|
|
|
|
|
|
|
|
|
|
//计算OEE
|
|
|
|
|
//获取配置的设备的初尝值
|
|
|
|
|
var balzersConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.BalzersOffset).Content;
|
|
|
|
|
var cemeconConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.CemeConOffset).Content;
|
|
|
|
|
var ionbondConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.IonbondOffset).Content;
|
|
|
|
|
var balzers = 0m;
|
|
|
|
|
var cemecon = 0m;
|
|
|
|
|
var ionbond = 0m;
|
|
|
|
|
if (balzersConfig != null && !balzersConfig.ConfigValue.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
decimal.TryParse(balzersConfig.ConfigValue, out balzers);
|
|
|
|
|
}
|
|
|
|
|
if (cemeconConfig != null && !cemeconConfig.ConfigValue.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
decimal.TryParse(cemeconConfig.ConfigValue, out cemecon);
|
|
|
|
|
}
|
|
|
|
|
if (ionbondConfig != null && !ionbondConfig.ConfigValue.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
decimal.TryParse(ionbondConfig.ConfigValue, out ionbond);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
foreach (var item in list)
|
|
|
|
|
{
|
|
|
|
|
var days = 0;
|
|
|
|
|
var minutes = 0;
|
|
|
|
|
var now = DateTime.Now;
|
|
|
|
|
//如果在本月
|
|
|
|
|
if (item.TotalMonth == DateTime.Now.Month)
|
|
|
|
|
{
|
|
|
|
|
//初尝值不包括今天
|
|
|
|
|
days = now.Day - 1;
|
|
|
|
|
//获取当月到当前的分钟
|
|
|
|
|
minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
days = new DateTime(now.Year, item.TotalMonth, 1).GetDaysOfMonth();
|
|
|
|
|
minutes = days * 60 * 24;
|
|
|
|
|
}
|
|
|
|
|
var value = 0m;
|
|
|
|
|
switch (item.EquipmentType)
|
|
|
|
|
{
|
|
|
|
|
case EquipmentType.Balzers:
|
|
|
|
|
value = days * balzers;
|
|
|
|
|
break;
|
|
|
|
|
case EquipmentType.Ionbond:
|
|
|
|
|
value = days * ionbond;
|
|
|
|
|
break;
|
|
|
|
|
case EquipmentType.CemeCon:
|
|
|
|
|
value = days * cemecon;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (minutes > 0)
|
|
|
|
|
{
|
|
|
|
|
item.OEE = (item.TotalRunningTime + value) / minutes;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var result = list.GroupBy(f => f.TotalMonth).Select(f => new EquipmentOEEMonthTotal
|
|
|
|
|
{
|
|
|
|
|
TotalMonth = f.Key,
|
|
|
|
|
OEE = Math.Round(f.Sum(f => f.OEE) / f.Count(), 2)
|
|
|
|
|
}).ToList();
|
|
|
|
|
|
|
|
|
|
return new Result<List<EquipmentOEEMonthTotal>>(result);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 获取设备OEE信息
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="equipmentId">设备Id</param>
|
|
|
|
|
/// <param name="begDate">开始时间</param>
|
|
|
|
|
/// <param name="endDate">结束时间</param>
|
|
|
|
|
/// <returns></returns>
|
|
|
|
|
public Result<EquipmentOEETotal> GetEquipmentOEEMonthTotal(string equipmentId, DateTime begDate, DateTime endDate)
|
|
|
|
|
{
|
|
|
|
|
//获取今年第一天和最后一天
|
|
|
|
|
var beg = begDate.ToString("yyyy-MM-dd");
|
|
|
|
|
var end = endDate.AddDays(1).ToString("yyyy-MM-dd");
|
|
|
|
|
EquipmentOEETotal ret = null;
|
|
|
|
|
|
|
|
|
|
using (var context = new EFContext())
|
|
|
|
|
{
|
|
|
|
|
var sql = $@"SELECT
|
|
|
|
|
info.id AS EquipmentId,
|
|
|
|
|
info.equipment_type AS EquipmentType,
|
|
|
|
|
SUM( total_running_time ) AS TotalRunningTime,
|
|
|
|
|
SUM( total_alarm_time ) AS TotalAlarmTime,
|
|
|
|
|
SUM( total_stop_time ) AS TotalStopTime
|
|
|
|
|
FROM
|
|
|
|
|
equipment_record_day_total a
|
|
|
|
|
JOIN equipment_info info ON a.equipment_id = info.id
|
|
|
|
|
WHERE
|
|
|
|
|
info.id = '{equipmentId}'
|
|
|
|
|
AND total_day >= '{beg}'
|
|
|
|
|
AND total_day <= '{endDate}'
|
|
|
|
|
GROUP BY
|
|
|
|
|
EquipmentId,
|
|
|
|
|
EquipmentType";
|
|
|
|
|
|
|
|
|
|
var list = EFSqlHelper.FromSqlQuery<EquipmentRecordStateOEEMonthTotal>(context, sql).ToArray();
|
|
|
|
|
|
|
|
|
|
if (list.Length > 0)
|
|
|
|
|
{
|
|
|
|
|
var detail = list[0];
|
|
|
|
|
|
|
|
|
|
//获取配置的设备的初尝值
|
|
|
|
|
var balzersConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.BalzersOffset).Content;
|
|
|
|
|
var cemeconConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.CemeConOffset).Content;
|
|
|
|
|
var ionbondConfig = _configRepository.GetSysConfigDetailNameOrKey("", EquipmentTypeOffset.IonbondOffset).Content;
|
|
|
|
|
var balzers = 0m;
|
|
|
|
|
var cemecon = 0m;
|
|
|
|
|
var ionbond = 0m;
|
|
|
|
|
if (balzersConfig != null && !balzersConfig.ConfigValue.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
decimal.TryParse(balzersConfig.ConfigValue, out balzers);
|
|
|
|
|
}
|
|
|
|
|
if (cemeconConfig != null && !cemeconConfig.ConfigValue.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
decimal.TryParse(cemeconConfig.ConfigValue, out cemecon);
|
|
|
|
|
}
|
|
|
|
|
if (ionbondConfig != null && !ionbondConfig.ConfigValue.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
decimal.TryParse(ionbondConfig.ConfigValue, out ionbond);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var now = DateTime.Now;
|
|
|
|
|
var minutes = 0m;
|
|
|
|
|
var days = 0m;
|
|
|
|
|
if (endDate >= now)
|
|
|
|
|
{
|
|
|
|
|
days = Convert.ToDecimal((now - begDate).TotalDays);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
days = Convert.ToDecimal((endDate - begDate).TotalDays);
|
|
|
|
|
}
|
|
|
|
|
if (end == DateTime.Now.ToString("yyyy-MM-dd"))
|
|
|
|
|
{
|
|
|
|
|
days = days - 1;
|
|
|
|
|
minutes = days * 60 * 24 + (now.Hour - 1) * 60 + now.Minute;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
minutes = days * 60 * 24;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var value = 0m;
|
|
|
|
|
switch (detail.EquipmentType)
|
|
|
|
|
{
|
|
|
|
|
case EquipmentType.Balzers:
|
|
|
|
|
value = days * balzers;
|
|
|
|
|
break;
|
|
|
|
|
case EquipmentType.Ionbond:
|
|
|
|
|
value = days * ionbond;
|
|
|
|
|
break;
|
|
|
|
|
case EquipmentType.CemeCon:
|
|
|
|
|
value = days * cemecon;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
if (minutes > 0)
|
|
|
|
|
{
|
|
|
|
|
detail.OEE = Math.Round((detail.TotalRunningTime + value) / minutes,2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ret = ModelTools.PubClone<EquipmentRecordStateOEEMonthTotal, EquipmentOEETotal>.Trans(detail);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return new Result<EquipmentOEETotal>(ret);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|