| | |
| | | var now = DateTime.Now; |
| | | var startOfDay = new DateTime(now.Year, now.Month, now.Day); |
| | | var endOfDay = startOfDay.AddDays(1); |
| | | var filteredItems = _stockInfoRepository.Db.Queryable<DtStockInfo>() |
| | | .Where(x => x.OutboundTime >= startOfDay && x.OutboundTime < endOfDay && x.IsFull) |
| | | .Includes(x => x.StockInfoDetails) |
| | | .ToList(); |
| | | |
| | | var result = filteredItems |
| | | .GroupBy(x => x.AreaCode) |
| | | .Select(g => new GroupedStockInfo |
| | | { |
| | | AreaCode = g.Key, |
| | | TotalQuantity = g.Sum(item => item.StockInfoDetails?.Count ?? 0), |
| | | Items = g.ToList() |
| | | }) |
| | | .ToList(); |
| | | var result = _stockInfoRepository.Db.Queryable<DtStockInfo>().ToList(); |
| | | return content.OK(data: result); |
| | | } |
| | | catch (Exception ex) |
| | |
| | | var now = DateTime.Now; |
| | | var thirtyDaysAgo = now.AddDays(-30); |
| | | var roadwayMappings = new Dictionary<string, string> { |
| | | { "JZ", "静置库" }, |
| | | { "CH", "陈化库" }, |
| | | { "FR", "分容库" }, |
| | | { "GW", "高温库" }, |
| | | { "CW", "常温库" } |
| | | }; |
| | | |
| | | { "JZ", "静置库" }, |
| | | { "CH", "陈化库" }, |
| | | { "FR", "分容库" }, |
| | | { "GW", "高温库" }, |
| | | { "CW", "常温库" } |
| | | }; |
| | | var roadwayKeys = roadwayMappings.Keys.ToArray(); |
| | | var taskTypes = new[] { 100, 104, 200, 204 }; |
| | | |
| | | var taskHty = _task_HtyRepository.Db.Queryable<Dt_Task_Hty>() |
| | | .Where(it => |
| | | it.CreateDate >= thirtyDaysAgo && |
| | | it.CreateDate <= now && |
| | | it.TaskType == 100 && |
| | | taskTypes.Contains(it.TaskType) && |
| | | roadwayKeys.Any(rk => it.Roadway.Contains(rk))) |
| | | .ToList() |
| | | .Select(t => new { |
| | | OriginalRoadway = t.Roadway, |
| | | MatchedKey = roadwayKeys.FirstOrDefault(rk => t.Roadway.Contains(rk)), |
| | | RoadwayKey = roadwayKeys.FirstOrDefault(rk => t.Roadway.Contains(rk)), |
| | | TaskType = t.TaskType, |
| | | CreateDate = t.CreateDate |
| | | }) |
| | | .Where(t => t.MatchedKey != null) |
| | | .Where(t => t.RoadwayKey != null) |
| | | .GroupBy(t => new { |
| | | RoadwayKey = t.MatchedKey, |
| | | RoadwayKey = t.RoadwayKey, |
| | | Date = t.CreateDate.Date, |
| | | Hour = t.CreateDate.Hour |
| | | }) |
| | | .OrderByDescending(group => group.Key.Date) |
| | | .ThenByDescending(group => group.Key.Hour) |
| | | .Select(group => new { |
| | | Hour = $"{group.Key.Date:yyyy/M/d} {group.Key.Hour}:00", |
| | | Count = group.Count(), |
| | | Roadway = roadwayMappings[group.Key.RoadwayKey] // 映射为中文名称 |
| | | .Select(group => new TaskHourData |
| | | { |
| | | Hour = $"{group.Key.Date:yyyy/M/d} {(group.Key.Hour == 23 ? "23:00-24:00" : $"{group.Key.Hour}:00-{group.Key.Hour + 1}:00")}", |
| | | Roadway = roadwayMappings[group.Key.RoadwayKey], |
| | | TaskType100Count = group.Count(t => t.TaskType == 100), |
| | | TaskType104Count = group.Count(t => t.TaskType == 104), |
| | | TaskType200Count = group.Count(t => t.TaskType == 200), |
| | | TaskType204Count = group.Count(t => t.TaskType == 204) |
| | | }) |
| | | .ToList(); |
| | | |
| | | // 按日期和库位分组,找出每天的最后一个小时 |
| | | var dailyLastHours = taskHty |
| | | .GroupBy(item => new { |
| | | Date = DateTime.Parse(item.Hour.Split(' ')[0]), |
| | | item.Roadway |
| | | }) |
| | | .Select(group => new { |
| | | Date = group.Key.Date, |
| | | Roadway = group.Key.Roadway, |
| | | LastHour = group.Max(item => int.Parse(item.Hour.Split(' ')[1].Split(':')[0])) |
| | | }) |
| | | .ToList(); |
| | | |
| | | // 生成汇总数据(调整Hour格式为"日期+日汇总") |
| | | var summaryItems = dailyLastHours |
| | | .Select(dailyLastHour => { |
| | | // 找到该日期该库位的所有小时数据 |
| | | var dailyItems = taskHty |
| | | .Where(item => |
| | | DateTime.Parse(item.Hour.Split(' ')[0]) == dailyLastHour.Date && |
| | | item.Roadway == dailyLastHour.Roadway) |
| | | .ToList(); |
| | | |
| | | return new TaskHourData |
| | | { |
| | | Hour = $"{dailyLastHour.Date:yyyy/M/d}日汇总", // 修改Hour格式 |
| | | Roadway = dailyLastHour.Roadway, |
| | | TaskType100Count = dailyItems.Sum(item => item.TaskType100Count), |
| | | TaskType104Count = dailyItems.Sum(item => item.TaskType104Count), |
| | | TaskType200Count = dailyItems.Sum(item => item.TaskType200Count), |
| | | TaskType204Count = dailyItems.Sum(item => item.TaskType204Count), |
| | | IsSummary = true |
| | | }; |
| | | }) |
| | | .ToList(); |
| | | |
| | | // 将汇总数据添加到结果中 |
| | | taskHty = taskHty.Concat(summaryItems).ToList(); |
| | | |
| | | // 调整排序逻辑:先按日期降序,再按是否汇总(汇总在前),最后按小时降序 |
| | | taskHty = taskHty |
| | | .OrderByDescending(item => { |
| | | var datePart = item.Hour.Contains("日汇总") |
| | | ? item.Hour.Split("日汇总")[0] |
| | | : item.Hour.Split(' ')[0]; |
| | | return DateTime.Parse(datePart); |
| | | }) |
| | | .ThenByDescending(item => item.IsSummary) // 汇总数据排在前面 |
| | | .ThenByDescending(item => { |
| | | if (!item.IsSummary && item.Hour.Contains(' ')) |
| | | { |
| | | return int.Parse(item.Hour.Split(' ')[1].Split(':')[0]); |
| | | } |
| | | return 0; |
| | | }) |
| | | .ToList(); |
| | | return content.OK1(total1: taskHty.Count, data: taskHty); |
| | | } |
| | | catch (Exception ex) |
| | |
| | | return content.Error(ex.Message); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | internal class TaskHourData |
| | | { |
| | | public string Hour { get; set; } |
| | | public string Roadway { get; set; } |
| | | public int TaskType100Count { get; set; } |
| | | public int TaskType104Count { get; set; } |
| | | public int TaskType200Count { get; set; } |
| | | public int TaskType204Count { get; set; } |
| | | public bool IsSummary { get; set; } = false; |
| | | } |