using Cksoft.Data;
using Cksoft.Data.Repository;
using Cksoft.Unity;
using DllEapEntity;
using DllEapEntity.Enums;
using DllEapEntity.OFILM;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DllEapDal.OFILM
{
public class MacLastStatusDal
{
private readonly IDatabase CurrDb = null;
public MacLastStatusDal()
{
}
public MacLastStatusDal(IDatabase db)
{
CurrDb = db;
}
///
/// 新增
///
///
///
///
public async Task Insert(MacLastStatus entity, IDatabase db = null)
{
if (db == null)
{
CurrDb.InsertFor(entity, string.Empty);
}
else
{
db.InsertFor(entity, string.Empty);
}
await Task.CompletedTask;
}
///
///
///
///
///
public async Task> GetLastStatus(DateTime date, EnumShift shift)
{
string errorinfo = string.Empty;
return await CurrDb.FindListForConditionAsync($" and a.fdate='{date.ToString("yyyy-MM-dd 00:00:00")}' " +
$"and a.shift={(int)shift}",
ref errorinfo);
}
///
/// 汇总机台最后状态
///
///
public async Task SyncLastStatus()
{
var logger = AppConfigurtaionServices.MyLog;
try
{
logger.LogError("开始计算机台最后状态");
var dateNow = DateTime.Now;
string errorinfo = string.Empty;
var (shift, date) = GetShift(dateNow);
var dateStart = Convert.ToDateTime(dateNow.ToString("yyyy-MM-dd 08:30:00"));
if (shift == EnumShift.Day)
{
dateStart = Convert.ToDateTime(dateNow.ToString("yyyy-MM-dd 08:30:00"));
}
else if (shift == EnumShift.Night)
{
dateStart = Convert.ToDateTime(dateNow.AddDays(-1).ToString("yyyy-MM-dd 20:30:00"));
}
var runRates = await GetRunRates(dateStart); // 稼动率
var machines = await GetAllMachines();
using (IDatabase db = DbFactory.Base("eap"))
{
db.BeginTrans();
// var
var lastStatus = await db.FindListForConditionAsync(string.Empty, ref errorinfo);
foreach (var item in lastStatus)
{
var runTime = runRates.FirstOrDefault(c => c.Name == item.MacCode);
decimal runRate = 0;
if (runTime != null)
{
runRate = (decimal)runTime.Value / (12 * 60 * 60);
}
var tmp = new MacLastStatus
{
MacCode = item.MacCode,
Flen = Convert.ToInt32((dateNow - item.STime).TotalSeconds),
Shift = (int)shift,
StatusId = item.StatusID,
RecTime = Convert.ToDateTime(dateNow.ToString("yyyy-MM-dd HH:mm:ss")),
FDate = Convert.ToDateTime(date),
STime = item.STime,
RunRate = runRate,
Remark = item.Remark?.Replace(" ", "-").Replace("_", "-").Replace("|", "-")
.Replace(".", "-").Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries)
.FirstOrDefault() ,
FactoryId = machines.FirstOrDefault(c => c.FCode == item.MacCode)?.FactoryId,
RegionId = machines.FirstOrDefault(c => c.FCode == item.MacCode)?.RegionId
};
db.InsertFor(tmp, string.Empty);
}
db.Commit();
}
logger.LogError("计算机台最后状态完成");
}
catch (Exception ex)
{
logger.LogError("计算机台最后状态错误," + ex.ToString());
throw;
}
}
///
/// 获取所有机台
///
///
public async Task> GetAllMachines()
{
using (IDatabase db = DbFactory.Base("eap"))
{
var sql = "select * from machine";
return await db.FindListAsync(sql, null);
}
}
///
/// 获取机台稼动率
///
///
public async Task> GetRunRates(DateTime dateStart)
{
var dateEnd = dateStart.AddHours(12);
string timeFormat = "yyyy-MM-dd HH:mm:ss";
using (IDatabase db = DbFactory.Base("eap"))
{
var sql = $@"select sum(tt.flen) as Value,tt.maccode as Name from (
select sum(flen) flen,maccode from macstatus where stime>'{dateStart.ToString(timeFormat)}' and stime<'{dateEnd.ToString(timeFormat)}' and statusid=4
group by maccode
union all
select time_to_sec(timediff('{dateEnd.ToString(timeFormat)}',stime)) as flen,maccode from macstatus where
statusid=4 and etime='0001-01-01 00:00:00' and flen=0 and stime>'{dateStart.ToString(timeFormat)}' and stime<'{dateEnd.ToString(timeFormat)}'
union all
select time_to_sec(timediff(etime, '{dateStart.ToString(timeFormat)}')) as flen,
maccode from
macstatus where statusid=4 and stime<='{dateStart.ToString(timeFormat)}' and etime>'{dateStart.ToString(timeFormat)}'
) tt
group by tt.maccode";
return await db.FindListAsync(sql, null);
}
}
///
/// 获取班别
///
///
///
private (EnumShift, string) GetShift(DateTime date)
{
if (date.Hour > 9 && date.Hour < 21)
{
return (EnumShift.Day, date.ToString("yyyy-MM-dd"));
}
return (EnumShift.Night, date.AddDays(-1).ToString("yyyy-MM-dd"));
}
}
}