using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_IHomeService; using WIDESEA_Model.Models; namespace WIDESEA_HomeService { public partial class HomeService : ServiceBase>, IHomeService { public HomeService(IRepository BaseDal) : base(BaseDal) { } public IRepository Repository => BaseDal; /// /// 获取历史任务信息出入库存数据 /// /// public WebResponseContent GetDt_TaskHty() { var response = new WebResponseContent(); try { // 获取当前日期时间 var now = DateTime.Now; // 获取今日日期范围 var todayStart = now.Date; var todayEnd = now.Date.AddDays(1); // 获取本周日期范围 // 计算本周一的日期:如果今天是周日(0),减去6天;否则减去当前星期几减1天 var daysToSubtract = (int)now.DayOfWeek == 0 ? 6 : (int)now.DayOfWeek - 1; var weekStart = now.Date.AddDays(-daysToSubtract); var weekEnd = weekStart.AddDays(7); // 获取本月日期范围 var monthStart = new DateTime(now.Year, now.Month, 1); var monthEnd = monthStart.AddMonths(1); // 获取所有库存数据,用于后续统计 var allStockData = Repository.Db.Queryable().ToList(); var allTask_HtyData = Repository.Db.Queryable().ToList(); // 调试信息:打印日期范围和库存数据总数 var debugInfo = new { CurrentDateTime = now, TodayRange = $"{todayStart:yyyy-MM-dd HH:mm:ss} ~ {todayEnd:yyyy-MM-dd HH:mm:ss}", WeekRange = $"{weekStart:yyyy-MM-dd HH:mm:ss} ~ {weekEnd:yyyy-MM-dd HH:mm:ss}", MonthRange = $"{monthStart:yyyy-MM-dd HH:mm:ss} ~ {monthEnd:yyyy-MM-dd HH:mm:ss}", TotalStockCount = allTask_HtyData.Count, //AllStockStatus = allStockData.Select(it => new { it.Id, it.StockStatus, it.CreateDate }).ToList() AllTask_HtyStatus = allTask_HtyData.Select(it => new { it.TaskId, it.TaskStatus, it.InsertTime }).ToList() }; var toDt_task_hty_in = allTask_HtyData.Count(it => it.TaskStatus == (int)TaskInStatusEnum.InFinish);//获取出入库存历史任务记录 var toDt_task_hty_on = allTask_HtyData.Count(it => it.TaskStatus == (int)TaskOutStatusEnum.OutFinish); // 今日入库数量:今天创建且库存状态为入库完成的记录数量 var todayInbound = allTask_HtyData.Count(it => it.CreateDate >= todayStart && it.CreateDate < todayEnd && it.TaskStatus == (int)TaskInStatusEnum.InFinish); // 今日出库数量:今天创建且库存状态为出库完成的记录数量 var todayOutbound = allTask_HtyData.Count(it => it.CreateDate >= todayStart && it.CreateDate < todayEnd && it.TaskStatus == (int)TaskOutStatusEnum.OutFinish); // 本周入库数量:本周创建且库存状态为入库完成的记录数量 var weekInbound = allTask_HtyData.Count(it => it.CreateDate >= weekStart && it.CreateDate < weekEnd && it.TaskStatus == (int)TaskInStatusEnum.InFinish); // 本周出库数量:本周创建且任务状态为出库完成的记录数量 var weekOutbound = allTask_HtyData.Count(it => it.CreateDate >= weekStart && it.CreateDate < weekEnd && it.TaskStatus == (int)TaskOutStatusEnum.OutFinish); // 本月入库数量:本月创建且库存状态为入库完成的记录数量 var monthInbound = allTask_HtyData.Count(it => it.CreateDate >= monthStart && it.CreateDate < monthEnd && it.TaskStatus == (int)TaskInStatusEnum.InFinish); // 本月出库数量:本月创建且任务状态为出库完成的记录数量 var monthOutbound = allTask_HtyData.Count(it => it.CreateDate >= monthStart && it.CreateDate < monthEnd && it.TaskStatus == (int)TaskOutStatusEnum.OutFinish); // 待处理订单数量:由于只有Dt_StockInfo表,暂时返回0 var pendingOrders = 0; // 库存状态分布:统计不同库存状态的数量 var stockStatusDistribution = allTask_HtyData .GroupBy(it => it.TaskStatus) .Select(g => new { Status = g.Key, Count = g.Count() }) .ToList(); // 货位分布:统计不同货位的库存数量 var locationDistribution = allTask_HtyData .Where(it => !string.IsNullOrEmpty(it.TargetAddress)) .GroupBy(it => it.TargetAddress) .Select(g => new { Location = g.Key, Count = g.Count() }) .OrderByDescending(g => g.Count) .Take(10) // 只取前10个货位 .ToList(); // 货位利用率:从数据库获取货位信息 // 获取所有货位 var allLocations = Repository.Db.Queryable().ToList(); var totalLocations = allLocations.Count; // 统计不同状态的货位数 var freeLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Free); var inStockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStock); var inStockLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStockLock); var lockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Lock); var freeLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.FreeLock); var palletLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.PalletLock); // 计算已使用和未使用的货位数 // 已使用:有货、有货锁定 var usedLocations = inStockLocations + inStockLockLocations; // 未使用:空闲、空闲锁定 var unusedLocations = freeLocations + freeLockLocations; // 库存变化趋势:模拟最近7天的数据 // 实际应根据数据库中的历史记录生成 var stockTrend = Enumerable.Range(0, 7) .Select(i => { var date = now.AddDays(-6 + i).Date; var count = allTask_HtyData.Count(it => it.CreateDate.Date <= date && it.TaskStatus == (int)TaskInStatusEnum.InFinish && (it.TaskStatus != (int)TaskOutStatusEnum.OutFinish || it.CreateDate.Date > date)); return new { Date = date.ToString("MM-dd"), Count = count }; }) .ToList(); // 日出入库明细:按小时统计 var dailyInout = new { inbound = Enumerable.Range(8, 10).Select(hour => allTask_HtyData.Count(it => it.CreateDate >= todayStart.AddHours(hour) && it.CreateDate < todayStart.AddHours(hour + 1) && it.TaskStatus == (int)TaskInStatusEnum.InFinish)) .ToList(), outbound = Enumerable.Range(8, 10).Select(hour => allTask_HtyData.Count(it => it.CreateDate >= todayStart.AddHours(hour) && it.CreateDate < todayStart.AddHours(hour + 1) && it.TaskStatus == (int)TaskOutStatusEnum.OutFinish)) .ToList() }; // 周出入库统计:按天统计 var weekInout = new { inbound = Enumerable.Range(0, 7).Select(day => allTask_HtyData.Count(it => it.CreateDate >= weekStart.AddDays(day) && it.CreateDate < weekStart.AddDays(day + 1) && it.TaskStatus == (int)TaskInStatusEnum.InFinish)) .ToList(), outbound = Enumerable.Range(0, 7).Select(day => allTask_HtyData.Count(it => it.CreateDate >= weekStart.AddDays(day) && it.CreateDate < weekStart.AddDays(day + 1) && it.TaskStatus == (int)TaskOutStatusEnum.OutFinish)) .ToList() }; // 月出入库趋势:按5天统计 var monthInout = new { inbound = Enumerable.Range(0, 7).Select(i => allTask_HtyData.Count(it => it.CreateDate >= monthStart.AddDays(i * 5) && it.CreateDate < monthStart.AddDays((i + 1) * 5) && it.TaskStatus == (int)TaskInStatusEnum.InFinish)) .ToList(), outbound = Enumerable.Range(0, 7).Select(i => allTask_HtyData.Count(it => it.CreateDate >= monthStart.AddDays(i * 5) && it.CreateDate < monthStart.AddDays((i + 1) * 5) && it.TaskStatus == (int)TaskOutStatusEnum.OutFinish)) .ToList() }; // 组装返回数据,包含调试信息和图表数据 var data = new { totalLocations, todayInbound, todayOutbound, weekInbound, weekOutbound, monthInbound, monthOutbound, pendingOrders, // 图表数据 stockStatus = stockStatusDistribution.Select(item => new { name = $"状态{item.Status}", value = item.Count }).ToList(), locationDistribution = locationDistribution.Select(item => new { name = item.Location, value = item.Count }).ToList(), // 货位利用率:包含不同状态的货位数量 warehouseUtilization = new { total = totalLocations, free = freeLocations, inStock = inStockLocations, inStockLock = inStockLockLocations, lockLocations = lockLocations, freeLock = freeLockLocations, palletLock = palletLockLocations, used = usedLocations, unused = unusedLocations }, stockTrend = stockTrend.Select(item => item.Count).ToList(), dailyInout, weekInout, monthInout, debugInfo }; response.Status = true; response.Data = data; response.Message = "获取成功"; } catch (Exception ex) { response.Status = false; response.Message = ex.Message; response.Data = new { Exception = ex.ToString(), StackTrace = ex.StackTrace }; } return response; } } }