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 第一板块统计图,未使用
|
/// <summary>
|
/// 月,日出入库数量统计
|
/// </summary>
|
/// <returns></returns>
|
[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<Tuple<string, int, string, int>> responseData = new List<Tuple<string, int, string, int>>(); // 获取被占用的数据
|
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 第一板块
|
/// <summary>
|
/// 月,日出入库数量统计
|
/// </summary>
|
/// <returns></returns>
|
[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 第二板块
|
/// <summary>
|
/// 具体出入库数据
|
/// </summary>
|
/// <returns></returns>
|
[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 第三板块
|
/// <summary>
|
/// 展示库区数据
|
/// </summary>
|
/// <returns></returns>
|
[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<dynamic>();
|
|
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 第四板块
|
/// <summary>
|
/// 5日内的出入库
|
/// </summary>
|
/// <returns></returns>
|
[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 第六板块
|
/// <summary>
|
/// 当前agv任务
|
/// </summary>
|
/// <returns></returns>
|
[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 第七板块(新增内容)
|
/// <summary>
|
/// 工单信息VV_Workinfo
|
/// </summary>
|
/// <returns></returns>
|
/*[HttpPost("Workinfo_information")]
|
public object Workinfo_information()
|
{
|
|
}*/
|
#endregion
|
}
|
}
|