using SqlSugar; using System.Reflection; using wms.sqlsugar.model.sx; using WMS.BZModels; using WMS.BZModels.Dto; using WMS.BZModels.Dto.SX.SXQuestDB; using WMS.BZModels.Models.FJQuestDB; using WMS.BZSqlSugar; using WMS.Info; using WMS.Util; namespace WMS.BZServices.SX.SXQuestDB { public class SXDevRunInfoService { private readonly Repository _wcstaskoldrepository; private readonly QuestDBRepository _sxDevRunInfoRepository; private static readonly Dictionary> SRMStation = new Dictionary>() { {"1",new List{"SRM101", "SRM102" , "SRM103" , "SRM104" , "SRM105" , "SRM106" , "SRM107" , "SRM108" } }, {"2",new List{"SRM201", "SRM202" , "SRM203" , "SRM204" , "SRM205" , "SRM206" , "SRM207" , "SRM208" } }, {"3",new List{"SRM301", "SRM302" , "SRM303" , "SRM304" , "SRM305" , "SRM306" , "SRM307" , "SRM308" } }, }; private static readonly List SRMLists = new List() { "SRM101", "SRM102" , "SRM103" , "SRM104" , "SRM105" , "SRM106" , "SRM107" , "SRM108" ,"SRM201", "SRM202" , "SRM203" , "SRM204" , "SRM205" , "SRM206" , "SRM207" , "SRM208" ,"SRM301", "SRM302" , "SRM303" , "SRM304" , "SRM305" , "SRM306" , "SRM307" , "SRM308" }; private readonly string[] Names = new string[] { "手动", "半自动", "自动", "报警", "空闲", "维护" }; public SXDevRunInfoService(QuestDBRepository sxDevRunInfoRepository, Repository wcstaskoldrepository) { _sxDevRunInfoRepository = sxDevRunInfoRepository; _wcstaskoldrepository = wcstaskoldrepository; } public List GetDataList(SXDevRunInfoQueryDto queryDto) { var predicate = Expressionable.Create().And(m => m.runmode != null && m.runstatus != null); predicate = predicate.AndIF(queryDto.BeginTime.HasValue, m => m.starttime >= queryDto.BeginTime); predicate = predicate.AndIF(queryDto.EndTime.HasValue, m => m.endtime <= queryDto.EndTime); predicate = predicate.AndIF(queryDto.DevType.HasValue, m => m.type.Equals((int)queryDto.DevType)); var lists = _sxDevRunInfoRepository.Queryable().GroupBy(o => new { o.runmode, o.runstatus, o.code }).Where(predicate.ToExpression()) .Select(it => new SXDevRunInfoDto { runmode = it.runmode, runstatus = it.runstatus, code = it.code, duration = SqlFunc.AggregateSum(it.duration), }).ToList(); return lists; } public SXDevRunInfoDto GetTotalDataTime(SXDevRunInfoQueryDto queryDto) { var predicate = Expressionable.Create().And(m => m.runmode != null && m.runstatus != null); predicate = predicate.AndIF(queryDto.BeginTime.HasValue, m => m.starttime >= queryDto.BeginTime); predicate = predicate.AndIF(queryDto.EndTime.HasValue, m => m.endtime <= queryDto.EndTime); predicate = predicate.AndIF(queryDto.DevType.HasValue, m => m.type.Equals((int)queryDto.DevType)); var model = _sxDevRunInfoRepository.Queryable().Where(predicate.ToExpression()) .Select(it => new SXDevRunInfoDto { starttime = SqlFunc.AggregateMin(it.starttime), endtime = SqlFunc.AggregateMax(it.endtime), }).First(); return model; } public Dictionary> GetSRMTimeRateList(SXDevRunInfoQueryDto queryDto) { var lists = GetDataList(queryDto); var tasklists = TaskInOutQueryable(queryDto.BeginTime, queryDto.EndTime).ToList(); Dictionary> dic = new Dictionary>(); foreach (var srms in SRMStation) { List runTimeRatesList = new List(); foreach (var item in srms.Value) { var totalduration = lists.Where(o => o.code == item).Sum(o => o.duration); var runtimerates = new RunTimeRates { code = item }; foreach (var namedesc in Names) { RunTimeRate timeRate = new RunTimeRate() { name = namedesc }; if (namedesc == "手动" || namedesc == "自动" || namedesc == "报警" || namedesc == "半自动") { timeRate.value = lists.Where(o => o.runmode == namedesc && o.code == item).Sum(o => o.duration); timeRate.rate = totalduration > 0 ? timeRate.value / (decimal)totalduration * 100 : 0; runtimerates.rates.Add(timeRate); } else if (namedesc == "空闲" || namedesc == "维护") { timeRate.value = lists.Where(o => o.runstatus == namedesc && o.code == item).Sum(o => o.duration); timeRate.rate = totalduration > 0 ? timeRate.value / (decimal)totalduration * 100 : 0; runtimerates.rates.Add(timeRate); } } var normal = new RunTimeRate() { name = "正常运行", value = lists.Where(o => o.runmode == "自动" && !Names.Contains(o.runstatus) && o.code == item).Sum(o => o.duration) }; normal.rate = totalduration > 0 ? normal.value / (decimal)totalduration * 100 : 0; runtimerates.rates.Add(normal); runtimerates.utilizationrate = normal.rate == 0 ? "0.00%" : Math.Round(normal.rate, 2) + "%"; runtimerates.OutDepot = tasklists.FirstOrDefault(o => o.BusType == item && o.Type == 2)?.Count ?? 0; runtimerates.EnterDepot = tasklists.FirstOrDefault(o => o.BusType == item && o.Type == 1)?.Count ?? 0; runtimerates.TransferDepot = tasklists.FirstOrDefault(o => o.BusType == item && o.Type == 3)?.Count ?? 0; runTimeRatesList.Add(runtimerates); } dic.Add(srms.Key, runTimeRatesList); } return dic; } public Dictionary> GetRobotTimeRateList(SXDevRunInfoQueryDto queryDto) { var lists = GetDataList(queryDto); var tasklists = TaskRobotInOutQueryable(queryDto.BeginTime, queryDto.EndTime).ToList(); Dictionary> dic = new Dictionary>(); foreach (var item in new string[] { "Robot1", "Robot2" }) { List runTimeRatesList = new List(); var totalduration = lists.Where(o => o.code == item).Sum(o => o.duration); var runtimerates = new RunTimeRates { code = item }; foreach (var namedesc in Names) { RunTimeRate timeRate = new RunTimeRate() { name = namedesc }; if (namedesc == "手动" || namedesc == "自动" || namedesc == "报警" || namedesc == "半自动") { timeRate.value = lists.Where(o => o.runmode == namedesc && o.code == item).Sum(o => o.duration); timeRate.rate = totalduration > 0 ? timeRate.value / (decimal)totalduration * 100 : 0; runtimerates.rates.Add(timeRate); } else if (namedesc == "空闲" || namedesc == "维护") { timeRate.value = lists.Where(o => o.runstatus == namedesc && o.code == item).Sum(o => o.duration); timeRate.rate = totalduration > 0 ? timeRate.value / (decimal)totalduration * 100 : 0; runtimerates.rates.Add(timeRate); } } var normal = new RunTimeRate() { name = "正常运行", value = lists.Where(o => o.runmode == "自动" && !Names.Contains(o.runstatus) && o.code == item).Sum(o => o.duration) }; normal.rate = totalduration > 0 ? normal.value / (decimal)totalduration * 100 : 0; runtimerates.rates.Add(normal); runtimerates.utilizationrate = normal.rate == 0 ? "0.00%" : Math.Round(normal.rate, 2) + "%"; runtimerates.OutDepot = tasklists.FirstOrDefault(o => o.BusType == item && o.Type == 2)?.Count ?? 0; runTimeRatesList.Add(runtimerates); dic.Add(item, runTimeRatesList); } return dic; } public ISugarQueryable TaskInOutQueryable(DateTime? start, DateTime? end) { var predicate = Expressionable.Create(); predicate = predicate.And(m => m.Status == (int)BZModels.TaskStatus.Finish); predicate = predicate.AndIF(start.HasValue && start.Value != DateTime.MinValue, m => m.EditTime >= start.Value); predicate = predicate.AndIF(end.HasValue && end.Value != DateTime.MinValue, m => m.EditTime <= end.Value); var sugarQueryable = _wcstaskoldrepository.Queryable().With(SqlWith.NoLock).Where(predicate.ToExpression()).SplitTable(tabs => tabs.Take(3)) .MergeTable()//将查询结果转成一个表 .GroupBy(o => new { o.Type, o.Device }) .Select(it => new TaskInOutDto { Count = SqlFunc.AggregateCount(it.Type), Type = it.Type, BusType = it.Device }); return sugarQueryable; } public ISugarQueryable TaskRobotInOutQueryable(DateTime? start, DateTime? end) { var predicate = Expressionable.Create(); predicate = predicate.And(m => m.Status == (int)BZModels.TaskStatus.Finish).And(m => m.BusType == "装箱码垛"); predicate = predicate.AndIF(start!=null && start.HasValue && start.Value != DateTime.MinValue, m => m.EditTime >= start.Value); predicate = predicate.AndIF(end != null && end.HasValue && end.Value != DateTime.MinValue, m => m.EditTime <= end.Value); var sugarQueryable = _wcstaskoldrepository.Queryable().With(SqlWith.NoLock).Where(predicate.ToExpression()).SplitTable(tabs => tabs.Take(3)) .MergeTable()//将查询结果转成一个表 .GroupBy(o => new { o.Type, o.Robot }) .Select(it => new TaskInOutDto { Count = SqlFunc.AggregateCount(it.Type), Type = it.Type, BusType = it.Robot }); return sugarQueryable; } public PagedInfo GetSRMPageList(Pagination pagination, SXDevRunInfoQueryDto queryDto) { var tasklists = TaskInOutQueryable(queryDto.BeginTime, queryDto.EndTime).ToList(); var lists = GetDataList(queryDto); var RunListModellists = new List(); foreach (var srmcode in SRMLists) { var runListModel = new RunListModel() { Code=srmcode}; runListModel.OutDepot = tasklists.FirstOrDefault(o => o.BusType == srmcode && o.Type == 2)?.Count ?? 0; runListModel.EnterDepot = tasklists.FirstOrDefault(o => o.BusType == srmcode && o.Type == 1)?.Count ?? 0; runListModel.TransferDepot = tasklists.FirstOrDefault(o => o.BusType == srmcode && o.Type == 3)?.Count ?? 0; var totalduration = lists.Where(o => o.code == srmcode).Sum(o => o.duration); var Free = lists.Where(o => o.runstatus == "空闲" && o.code == srmcode).Sum(o => o.duration); runListModel.Free = TimeSpan.FromMilliseconds(Free).TotalMinutes; runListModel.State[0] = totalduration > 0 ? Math.Round(Free / (decimal)totalduration * 100,2) : 0; var Manual = lists.Where(o => o.runmode == "手动" && o.code == srmcode).Sum(o => o.duration); runListModel.Manual = TimeSpan.FromMilliseconds(Manual).TotalMinutes; runListModel.State[1] = totalduration > 0 ? Math.Round(Manual / (decimal)totalduration * 100 ,2): 0; var Automatic = lists.Where(o => o.runmode == "自动" && o.code == srmcode).Sum(o => o.duration); runListModel.Automatic = TimeSpan.FromMilliseconds(Automatic).TotalMinutes; runListModel.State[2] = totalduration > 0 ? Math.Round(Automatic / (decimal)totalduration * 100, 2) : 0; var Alarm = lists.Where(o => o.runmode == "报警" && o.code == srmcode).Sum(o => o.duration); runListModel.Alarm = TimeSpan.FromMilliseconds(Alarm).TotalMinutes; runListModel.State[3] = totalduration > 0 ? Math.Round(Alarm / (decimal)totalduration * 100,2) : 0; var Working = lists.Where(o => o.runmode == "自动" && !new string[] { "手动", "半自动", "自动", "报警", "空闲", "维护" }.Contains(o.runstatus) && o.code == srmcode).Sum(o => o.duration); runListModel.Working = TimeSpan.FromMilliseconds(Working).TotalMinutes; runListModel.State[4] = totalduration > 0 ? Math.Round(Working / (decimal)totalduration * 100, 2) : 0; RunListModellists.Add(runListModel); } PagedInfo resultlists = new PagedInfo() { Result = RunListModellists }; if (!pagination.sidx.IsEmpty()) { pagination.sidx = pagination.sidx.Replace("DESC", "").Replace("ASC", ""); if (pagination.sidx != "No") { resultlists.Result.Sort( delegate (RunListModel info1, RunListModel info2) { Type t = typeof(RunListModel); PropertyInfo pro = t.GetProperty(pagination.sidx); if (pagination.sidx == "Code") { return pagination.sord.ToLower().Contains("asc") ? pro.GetValue(info1, null).ToString().CompareTo(pro.GetValue(info2, null).ToString()) : pro.GetValue(info2, null).ToString().CompareTo(pro.GetValue(info1, null).ToString()); } else return pagination.sord.ToLower().Contains("asc") ? pro.GetValue(info1, null).ToDouble().CompareTo(pro.GetValue(info2, null).ToDouble()) : pro.GetValue(info2, null).ToDouble().CompareTo(pro.GetValue(info1, null).ToDouble()); }); } } resultlists.PageIndex = 1; resultlists.PageSize = resultlists.Result.Count; resultlists.TotalNum = resultlists.Result.Count; var total= lists.Sum(o => o.duration); resultlists.Extra.Add("total",total / 1000.0 / 60.0 ); return resultlists; } public PagedInfo GetRobotPageList(Pagination pagination, SXDevRunInfoQueryDto queryDto) { var tasklists = TaskRobotInOutQueryable(queryDto.BeginTime, queryDto.EndTime).ToList(); var lists = GetDataList(queryDto); var RunListModellists = new List(); foreach (var robotcode in new string[] { "Robot1", "Robot2" }) { var runListModel = new RunListModel() { Code = robotcode }; runListModel.OutDepot = tasklists.FirstOrDefault(o => o.BusType == robotcode && o.Type == 2)?.Count ?? 0; //runListModel.EnterDepot = tasklists.FirstOrDefault(o => o.BusType == robotcode && o.Type == 1)?.Count ?? 0; //runListModel.TransferDepot = tasklists.FirstOrDefault(o => o.BusType == robotcode && o.Type == 3)?.Count ?? 0; var totalduration = lists.Where(o => o.code == robotcode).Sum(o => o.duration); var Free = lists.Where(o => o.runstatus == "空闲" && o.code == robotcode).Sum(o => o.duration); runListModel.Free = TimeSpan.FromMilliseconds(Free).TotalMinutes; runListModel.State[0] = totalduration > 0 ? Math.Round(Free / (decimal)totalduration * 100, 2) : 0; var Manual = lists.Where(o => o.runmode == "手动" && o.code == robotcode).Sum(o => o.duration); runListModel.Manual = TimeSpan.FromMilliseconds(Manual).TotalMinutes; runListModel.State[1] = totalduration > 0 ? Math.Round(Manual / (decimal)totalduration * 100, 2) : 0; var Automatic = lists.Where(o => o.runmode == "自动" && o.code == robotcode).Sum(o => o.duration); runListModel.Automatic = TimeSpan.FromMilliseconds(Automatic).TotalMinutes; runListModel.State[2] = totalduration > 0 ? Math.Round(Automatic / (decimal)totalduration * 100, 2) : 0; var Alarm = lists.Where(o => o.runmode == "报警" && o.code == robotcode).Sum(o => o.duration); runListModel.Alarm = TimeSpan.FromMilliseconds(Alarm).TotalMinutes; runListModel.State[3] = totalduration > 0 ? Math.Round(Alarm / (decimal)totalduration * 100, 2) : 0; var Working = lists.Where(o => o.runmode == "自动" && !new string[] { "手动", "半自动", "自动", "报警", "空闲", "维护" }.Contains(o.runstatus) && o.code == robotcode).Sum(o => o.duration); runListModel.Working = TimeSpan.FromMilliseconds(Working).TotalMinutes; runListModel.State[4] = totalduration > 0 ? Math.Round(Working / (decimal)totalduration * 100, 2) : 0; RunListModellists.Add(runListModel); } PagedInfo resultlists = new PagedInfo() { Result = RunListModellists }; if (!pagination.sidx.IsEmpty()) { pagination.sidx = pagination.sidx.Replace("DESC", "").Replace("ASC", ""); if (pagination.sidx != "No") { resultlists.Result.Sort( delegate (RunListModel info1, RunListModel info2) { Type t = typeof(RunListModel); PropertyInfo pro = t.GetProperty(pagination.sidx); if (pagination.sidx == "Code") { return pagination.sord.ToLower().Contains("asc") ? pro.GetValue(info1, null).ToString().CompareTo(pro.GetValue(info2, null).ToString()) : pro.GetValue(info2, null).ToString().CompareTo(pro.GetValue(info1, null).ToString()); } else return pagination.sord.ToLower().Contains("asc") ? pro.GetValue(info1, null).ToDouble().CompareTo(pro.GetValue(info2, null).ToDouble()) : pro.GetValue(info2, null).ToDouble().CompareTo(pro.GetValue(info1, null).ToDouble()); }); } } resultlists.PageIndex = 1; resultlists.PageSize = resultlists.Result.Count; resultlists.TotalNum = resultlists.Result.Count; var total = lists.Sum(o => o.duration); resultlists.Extra.Add("total", total / 1000.0 / 60.0); return resultlists; } } }