using Microsoft.AspNetCore.Mvc; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric; using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Xml.Linq; using WIDESEA_Core.EFDbContext; using WIDESEA_Entity.DomainModels; using WIDESEA_WMS.IRepositories; using WIDESEA_WMS.Repositories; namespace WIDESEA_WebApi.Controllers { [Route("api/[controller]")] [ApiController] public class LargescreenController : Controller //大屏幕数据 { #region 第一板块统计图,未使用 /// /// 月,日出入库数量统计 /// /// [HttpPost("Statistical_chart")] public object Statistical_chart() { VOLContext volContext = new VOLContext(); Idt_stationinfoRepository db = new dt_stationinfoRepository(volContext); string[] stationCodes = { "A", "B", "C", "D01" }; var query = db.Find(a => a.stationCode.Contains("A") || a.stationCode.Contains("B") || a.stationCode.Contains("C") || a.stationCode.Contains("D01")).ToList(); List> responseData = new List>(); // 获取被占用的数据 string[] stationCodes2 = { "A01001", "A01002", "B", "C", "D01" }; var sum = query.Count(); foreach (string code in stationCodes2) { int totalCount = query.Count(a => a.stationCode.Contains(code)); string percentage = ((double)totalCount / sum).ToString("P0"); int occupiedCount = query.Count(a => a.stationCode.Contains(code) && a.location_state == "Stroge"); string name = ""; switch (code) { case "A01001": name = "小托盘叠放区"; break; case "A01002": name = "大托盘叠放区"; break; case "B": name = "库区2"; break; case "C": name = "库区3"; break; case "D01": name = "库区4"; break; default: break; } responseData.Add(Tuple.Create(name, totalCount, percentage, occupiedCount)); } var data = new { responseData, }; return Ok(data); } #endregion #region 第一板块 /// /// 月,日出入库数量统计 /// /// [HttpPost("Total_quantityndex")] public object Total_quantityndex() { VOLContext volContext = new VOLContext(); Idt_agvtask_htyRepository db = new dt_agvtask_htyRepository(volContext); var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var endDate = startDate.AddMonths(1).AddDays(-1); var today = DateTime.Today; var data2 = db.Find(x => x.agv_createtime >= startDate && x.agv_createtime <= endDate); var data3 = db.Find(x => x.agv_createtime >= today && x.agv_createtime < today.AddDays(1)).ToList(); // 统计这月的入库数量 var monthlyInventory = data2.Where(x => x.agv_tasktype == "TaskType_Inbound").Sum(x => x.agv_qty); // 统计这月的出库数量 var monthlyOutbound = data2.Where(x => x.agv_tasktype == "TaskType_Outbound").Sum(x => x.agv_qty); // 统计今日入库数量 var dayInventory = data3.Where(x => x.agv_tasktype == "TaskType_Inbound").Sum(x => x.agv_qty); // 统计今日出库数量 var dayOutbound = data3.Where(x => x.agv_tasktype == "TaskType_Outbound").Sum(x => x.agv_qty); var data = new { monthlyInventory, monthlyOutbound, dayInventory, dayOutbound }; return Ok(data); } #endregion #region 第二板块 /// /// 具体出入库数据 /// /// [HttpPost("Outbound_inventory")] public object Outbound_inventory() { #region 使用中的内容 VOLContext volContext = new VOLContext(); Idt_agvtask_htyRepository db = new dt_agvtask_htyRepository(volContext); Idt_stationinfoRepository db2 = new dt_stationinfoRepository(volContext); var today = DateTime.Today; var data2 = db.Find(x => x.agv_createtime >= today && x.agv_createtime < today.AddDays(1)).ToList(); //今日待检测入库 var dayTaskType_Inbound = data2.Where(x => x.agv_tasktype == "TaskType_Inbound").Sum(x => x.agv_qty); //待检测出库 var dayTaskType_Outbound = data2.Where(x => x.agv_tasktype == "TaskType_Outbound").Sum(x => x.agv_qty); //外协库入库 var dayTaskType_OutsourceInbound = data2.Where(x => x.agv_tasktype == "TaskType_OutsourceInbound").Sum(x => x.agv_qty); //外协库出库 var dayTaskType_OutsourceOutbound = data2.Where(x => x.agv_tasktype == "TaskType_OutsourceOutbound").Sum(x => x.agv_qty); //待检移库外协 var dayTaskType_OutsourceCarry = data2.Where(x => x.agv_tasktype == "TaskType_OutsourceCarry").Sum(x => x.agv_qty); //空托数量 var dayTaskType_EmptyPallet = data2.Where(x => x.agv_tasktype == "TaskType_EmptyPallet").Sum(x => x.agv_qty); //统计月入库总量 var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1); var endDate = startDate.AddMonths(1).AddDays(-1); var data4 = db.Find(x => x.agv_createtime >= startDate && x.agv_createtime <= endDate); // 统计这月的入库数量 var monthlyInventory = data4.Where(x => x.agv_tasktype == "TaskType_Inbound").Sum(x => x.agv_qty); // 统计这月的出库数量 var monthlyOutbound = data4.Where(x => x.agv_tasktype == "TaskType_Outbound").Sum(x => x.agv_qty); // 统计今日入库数量 var dayInventory = data2.Where(x => x.agv_tasktype == "TaskType_Inbound").Sum(x => x.agv_qty); // 统计今日出库数量 var dayOutbound = data2.Where(x => x.agv_tasktype == "TaskType_Outbound").Sum(x => x.agv_qty); var data3 = db2.Find(_ => true).Where(x => x.stationCode.Contains("A") || x.stationCode.Contains("B") || x.stationCode.Contains("C") || x.stationCode.Contains("D01")).ToList(); //库区图号数量,外加空托数量 var Number_wheels1 = data3.Where(_ => true) .GroupBy(s => new { stationType = string.IsNullOrEmpty(s.stationType) ? s.tray_type : s.stationType, s.tray_type }).Select(g => new { stationType = g.Key.stationType, totalQuantity = g.Sum(s => s.quantity), tray_type = g.Key.tray_type }).ToList(); var Number_wheels = Number_wheels1.Where(x => x.stationType != "LargeTray" && x.stationType != "SmallTray").ToList(); #endregion #region 未使用的内容 //统计下料口合格率与不合格率1单元 var dayTaskType_Inbound2 = data2.Where(x => x.agv_tasktype == "TaskType_Inbound" && (x.agv_fromaddress == "X01001001" || x.agv_fromaddress == "X01001002") && x.agv_createtime >= today && x.agv_createtime < today.AddDays(1)).Sum(x => x.agv_qty); //外协库入库1单元 var dayTaskType_OutsourceInbound2 = data2.Where(x => x.agv_tasktype == "TaskType_OutsourceInbound" && x.agv_fromaddress == "X01001003" && x.agv_createtime >= today && x.agv_createtime < today.AddDays(1)).Sum(x => x.agv_qty); //统计下料口合格率与不合格率2单元 var dayTaskType_Inbound3 = data2.Where(x => x.agv_tasktype == "TaskType_Inbound" && (x.agv_fromaddress == "X02001001" || x.agv_fromaddress == "X02001002") && x.agv_createtime >= today && x.agv_createtime < today.AddDays(1)).Sum(x => x.agv_qty); //外协库入库2单元 var dayTaskType_OutsourceInbound3 = data2.Where(x => x.agv_tasktype == "TaskType_OutsourceInbound" && x.agv_fromaddress == "X02001003" && x.agv_createtime >= today && x.agv_createtime < today.AddDays(1)).Sum(x => x.agv_qty); var sumkq = dayTaskType_Inbound2 + dayTaskType_OutsourceInbound2; var sumkq2 = dayTaskType_Inbound3 + dayTaskType_OutsourceInbound3; var qualified1 = ((float)dayTaskType_Inbound2 / (float)sumkq).ToString("P0"); var qualified2 = ((float)dayTaskType_Inbound3 / (float)sumkq2).ToString("P0"); //统计库区占用百分比 var sumkw = data3.Where(a => a.stationCode.Contains("B") || a.stationCode.Contains("C") || a.stationCode.Contains("D01")).Count(); //获取库区库位 var sumzy = data3.Where(a => (a.stationCode.Contains("B") || a.stationCode.Contains("C") || a.stationCode.Contains("D01")) && a.location_state == "Stroge").Count(); //获取被占用的 var areaper = ((double)sumzy / sumkw).ToString("P0"); #endregion var data = new { dayTaskType_Inbound, dayTaskType_Outbound, dayTaskType_OutsourceInbound, dayTaskType_OutsourceOutbound, dayTaskType_OutsourceCarry, dayTaskType_EmptyPallet, qualified1, qualified2, areaper, Number_wheels, monthlyInventory, monthlyOutbound, dayInventory, dayOutbound, }; return Ok(data); } #endregion #region 第三板块 /// /// 展示库区数据 /// /// [HttpPost("Warehouse_area")] public object Warehouse_area() { VOLContext volContext = new VOLContext(); Idt_stationinfoRepository db = new dt_stationinfoRepository(volContext); string[] areas = { "2", "3", "4" }; var data2 = db.Find(a => areas.Contains(a.area)).ToList(); var dataList = new List(); foreach (string area in areas) { var data = data2.Where(x => x.area == area) .GroupBy(x => new { x.area, x.line, x.stationType }) .Select(x => new { Area = x.Key.area, x.Key.line, x.Key.stationType, combined_heatNumber = string.Join(", ", x.Select(y => y.heatNumber).Distinct()) }) .OrderBy(x => x.Area) .ThenBy(x => x.line) .GroupBy(x => x.line) // 使用 GroupBy 按 Line 字段分组 .Select(group => { // 找到每个分组中第一个 stationType 不为空的元素 var firstWithStationType = group.FirstOrDefault(x => !string.IsNullOrEmpty(x.stationType)); if (firstWithStationType != null) { return firstWithStationType; } else { // 如果分组中都是 stationType 为空,则返回第一个元素(此时即为 stationType 为空的) return group.First(); } }) .ToList(); dataList = dataList.Concat(data).ToList(); } return Ok(dataList); } #endregion #region 第四板块 /// /// 5日内的出入库 /// /// [HttpPost("fifteenTotal_quantityndex")] public object fifteenTotal_quantityndex() { VOLContext volContext = new VOLContext(); Idt_agvtask_htyRepository db = new dt_agvtask_htyRepository(volContext); var startDate = DateTime.Today.AddDays(-5); // 获取当前日期之前15天的日期 var today = DateTime.Today; var dateRange = Enumerable.Range(0, 5).Select(offset => today.AddDays(-offset)); // 获取最近15天的日期范围 var data2 = db.Find(x => x.agv_createtime >= startDate && x.agv_createtime < today.AddDays(1)).ToList(); var result = dateRange.Reverse().Select(date => { // 统计当日入库数量 var dayInventory = data2.Where(x => x.agv_createtime >= date && x.agv_createtime < date.AddDays(1) && x.agv_tasktype == "TaskType_Inbound").Sum(x => x.agv_qty); // 统计当日出库数量 var dayOutbound = data2.Where(x => x.agv_createtime >= date && x.agv_createtime < date.AddDays(1) && x.agv_tasktype == "TaskType_Outbound").Sum(x => x.agv_qty); return new { Date = date.ToString("MM-dd"), Day_inventory = dayInventory, Day_outbound = dayOutbound }; }); var data = new { Daily_statistics = result.ToList(), }; return Ok(data); } #endregion #region 第六板块 /// /// 当前agv任务 /// /// [HttpPost("Current_agvtask")] public object Current_agvtask() { VOLContext volContext = new VOLContext(); Idt_agvtaskRepository db = new dt_agvtaskRepository(volContext); var dataList = db.Find(_ => true).OrderByDescending(x => x.agv_createtime).ToList(); var data = dataList.Where(x => x.agv_taskstate != "队列" && x.agv_taskstate != "Queue" && x.agv_taskstate != "暂停" && x.agv_taskstate != "Pause").ToList(); if (data.Count <= 15) { data = dataList.Take(15).ToList(); } foreach (var item in data) { switch (item.agv_tasktype) { case "TaskType_OutsourceCarry": item.agv_tasktype = "待检移库外协"; break; case "TaskType_OutsourceOutbound": item.agv_tasktype = "外协库出库"; break; case "TaskType_EmptyPallet": item.agv_tasktype = "空托任务"; break; case "TaskType_OutsourceInbound": item.agv_tasktype = "外协库入库"; break; case "TaskType_Inbound": item.agv_tasktype = "待检库入库"; break; case "TaskType_Outbound": item.agv_tasktype = "待检库出库"; break; case "TaskType_Carry": item.agv_tasktype = "待检库内移库"; break; default: return "未知任务类型"; } switch (item.agv_taskstate) { case "Create": item.agv_taskstate = "新建"; break; case "Complete": item.agv_taskstate = "起点已完成"; break; case "Complete1": item.agv_taskstate = "终点已完成"; break; case "Executing1": item.agv_taskstate = "终点执行中"; break; case "Executing": item.agv_taskstate = "起点执行中"; break; case "Queue": item.agv_taskstate = "队列"; break; case "SendOut": item.agv_taskstate = "已下发"; break; case "Pause": item.agv_taskstate = "暂停"; break; default: return "未知任务状态"; } } return Ok(data); } #endregion #region 第七板块(新增内容) /// /// 工单信息VV_Workinfo /// /// /*[HttpPost("Workinfo_information")] public object Workinfo_information() { }*/ #endregion } }