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
}
}