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<Dt_Task_Hty, IRepository<Dt_Task_Hty>>, IHomeService
|
{
|
public HomeService(IRepository<Dt_Task_Hty> BaseDal) : base(BaseDal)
|
{
|
}
|
|
public IRepository<Dt_Task_Hty> Repository => BaseDal;
|
/// <summary>
|
/// 获取历史任务信息出入库存数据
|
/// </summary>
|
/// <returns></returns>
|
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<Dt_StockInfo>().ToList();
|
var allTask_HtyData = Repository.Db.Queryable<Dt_Task_Hty>().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<Dt_LocationInfo>().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;
|
}
|
}
|
}
|