using Admin.NET.Core.Service;
using Admin.NET.Application.Entity;
using Microsoft.AspNetCore.Http;
using System.Data;
using System.Web;
using System.Text;
using Furion.DatabaseAccessor;
using Admin.NET.Application.Service.ReportCenter.WmsOtherReport.Dto;
namespace Admin.NET.Application;
///
/// 出入库库存推移图 服务
///
[ApiDescriptionSettings(ApplicationConst.ReportCenterGroupName, Order = 100)]
public class WmsStockPassMapService : IDynamicApiController, ITransient
{
private readonly SqlSugarRepository _rep;
private readonly SqlSugarRepository _v_wms_stock_quanRep;
private readonly SqlSugarRepository _wmsRecordReceivingDelivery;
private readonly SqlSugarRepository _repWmsContainer;
private readonly SqlSugarRepository _v_wms_stock_quan_for_useRep;
private readonly SqlSugarRepository _v_WmsOrderMovementDetailsRep;
public WmsStockPassMapService(
SqlSugarRepository v_WmsOrderMovementDetailsRep,
SqlSugarRepository rep
, SqlSugarRepository v_wms_stock_quan_for_useRep
, SqlSugarRepository v_wms_stock_quanRep, SqlSugarRepository wmsRecordReceivingDelivery
, SqlSugarRepository repWmsContainer)
{
_v_WmsOrderMovementDetailsRep = v_WmsOrderMovementDetailsRep;
_rep = rep;
_v_wms_stock_quanRep = v_wms_stock_quanRep;
_v_wms_stock_quan_for_useRep = v_wms_stock_quan_for_useRep;
_wmsRecordReceivingDelivery = wmsRecordReceivingDelivery;
_repWmsContainer = repWmsContainer;
}
///
/// 上下架推移图
///
///
///
[HttpGet]
[ApiDescriptionSettings(Name = "Page")]
[Description("WmsStockPassMap/Page")]
public async Task> Page([FromQuery] WmsStockPassMapInput input)
{
List outputlist = new List();
DateTime currentDate = DateTime.Today;
//选择为12日的情况
if (input.DayOrWeekOrMonth == 1)
{
//总的数据
DateTime all_startDate = currentDate.AddDays(-11);
DateTime all_endDate = currentDate.Date.AddDays(1).AddTicks(-1);
var all_recordsOfDay = await _v_WmsOrderMovementDetailsRep.AsQueryable().Where(r => r.CreateTime >= all_startDate && r.CreateTime <= all_endDate
&& (r.OrderStatus == OrderStatusEnum.已完成)
&& (r.OrderType == OrderTypeEnum.上架单 || r.OrderType == OrderTypeEnum.下架单)
).ToListAsync();
for (int i = 0; i < 12; i++)
{
DateTime startDate = currentDate.AddDays(-i);
DateTime endDate = startDate.Date.AddDays(1).AddTicks(-1);
// 查询在这一天内的记录
var recordsOfDay = all_recordsOfDay.Where(r => r.CreateTime >= startDate && r.CreateTime <= endDate
).ToList();
var summary = new WmsStockPassMapOutput
{
Time = 12 - i,
InWare = recordsOfDay.Where(x => x.OrderType == OrderTypeEnum.上架单).ToList().Sum(x => x.Quantity),
OutWare = recordsOfDay.Where(x => x.OrderType == OrderTypeEnum.下架单).ToList().Sum(x => x.Quantity),
StockNum = 0,
AveStockNum = 0,
Date = startDate.Date.ToString("yyyy-MM-dd")
// 在这里根据 recordsOfDay 计算出入库汇总,例如求和或其他聚合操作
// summary.StockInTotal = recordsOfDay.Where(r => r.Type == "StockIn").Sum(r => r.Quantity);
// summary.StockOutTotal = recordsOfDay.Where(r => r.Type == "StockOut").Sum(r => r.Quantity);
};
outputlist.Add(summary);
}
}
//选择12周
else if (input.DayOrWeekOrMonth == 2)
{
//总的数据
DateTime all_startDate = GetStartOfWeek(currentDate).AddDays(-7 * 11);
DateTime all_endDate = GetEndOfWeek(currentDate);
var all_recordsOfDay = await _v_WmsOrderMovementDetailsRep.AsQueryable().Where(r => r.CreateTime >= all_startDate && r.CreateTime <= all_endDate
&& (r.OrderStatus == OrderStatusEnum.已完成)
&& (r.OrderType == OrderTypeEnum.上架单 || r.OrderType == OrderTypeEnum.下架单)
).ToListAsync();
for (int i = 0; i < 12; i++)
{
// 计算当前周的起始日期
DateTime startDate = GetStartOfWeek(currentDate).AddDays(-7 * i);
DateTime endDate = GetEndOfWeek(startDate);
// 查询在这一周内的出入库记录
var recordsOfWeek = all_recordsOfDay.Where(r => r.CreateTime >= startDate && r.CreateTime <= endDate).ToList();
// 汇总出入库记录
var summary = new WmsStockPassMapOutput
{
Time = 12 - i,
InWare = recordsOfWeek.Where(x => x.OrderType == OrderTypeEnum.上架单).ToList().Sum(x => x.Quantity),
OutWare = recordsOfWeek.Where(x => x.OrderType == OrderTypeEnum.下架单).ToList().Sum(x => x.Quantity),
StockNum = 0,
AveStockNum = 0,
Date = startDate.Date.ToString("MMdd") + "~" + endDate.Date.ToString("MMdd")
};
outputlist.Add(summary);
}
}
//选择12个月
else if (input.DayOrWeekOrMonth == 3)
{
//总的数据
DateTime all_startDate = currentDate.AddMonths(-11).AddDays(1 - currentDate.Day);
DateTime all_endDate = currentDate.AddMonths(1).AddDays(-1);
var all_recordsOfDay = await _v_WmsOrderMovementDetailsRep.AsQueryable().Where(r => r.CreateTime >= all_startDate && r.CreateTime <= all_endDate
&& (r.OrderStatus == OrderStatusEnum.已完成)
&& (r.OrderType == OrderTypeEnum.上架单 || r.OrderType == OrderTypeEnum.下架单)
).ToListAsync();
for (int i = 0; i < 12; i++)
{
DateTime startDate = currentDate.AddMonths(-i).AddDays(1 - currentDate.Day);
DateTime endDate = startDate.AddMonths(1).AddDays(-1);
// 查询在这个月内的出入库记录
var recordsOfMonth = all_recordsOfDay.Where(r => r.CreateTime >= startDate && r.CreateTime <= endDate).ToList();
// 汇总出入库记录
var summary = new WmsStockPassMapOutput
{
Time = 12 - i,
InWare = recordsOfMonth.Where(x => x.OrderType == OrderTypeEnum.上架单).ToList().Sum(x => x.Quantity),
OutWare = recordsOfMonth.Where(x => x.OrderType == OrderTypeEnum.下架单).ToList().Sum(x => x.Quantity),
StockNum = 0,
AveStockNum = 0,
Date = startDate.ToString("yyyy-MM")
};
outputlist.Add(summary);
}
}
//排序
outputlist = outputlist.OrderBy(x => x.Time).ToList();
return outputlist;
}
#region 私有方法
// 获取当前日期所在周的起始日期(周一)
private DateTime GetStartOfWeek(DateTime currentDate)
{
int diff = currentDate.DayOfWeek - DayOfWeek.Monday;
if (diff < 0) diff += 7; // 处理周日的情况
return currentDate.AddDays(-1 * diff).Date;
}
// 获取当前日期所在周的结束日期(周日)
private DateTime GetEndOfWeek(DateTime startDate)
{
return startDate.AddDays(6); // 因为起始日期已经是周一,所以直接加6天即可得到周日
}
///
/// 公共查询实时库存条件
///
///
///
private ISugarQueryable CommonPageFilter(WmsStockQuanInput input)
{
var query = _rep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
u.ContainerCode.Contains(input.SearchKey.Trim())
|| u.MaterialCode.Contains(input.SearchKey.Trim())
|| u.SupplierBatch.Contains(input.SearchKey.Trim())
|| u.Batch.Contains(input.SearchKey.Trim())
|| u.CreateUserName.Contains(input.SearchKey.Trim())
|| u.UpdateUserName.Contains(input.SearchKey.Trim())
|| u.SupplierCode.Contains(input.SearchKey.Trim())
|| u.SupplierName.Contains(input.SearchKey.Trim())
|| u.MaterialName.Contains(input.SearchKey.Trim())
|| u.SN_1d.Contains(input.SearchKey.Trim())
|| u.SN_2d.Contains(input.SearchKey.Trim())
|| u.SNCode.Contains(input.SearchKey.Trim())
|| u.ErpOrderNo.Contains(input.SearchKey.Trim())
|| u.ErpCode.Contains(input.SearchKey.Trim())
|| u.ErpVoucher.Contains(input.SearchKey.Trim())
)
.WhereIF(input.ContainerId > 0, u => u.ContainerId == input.ContainerId)
.WhereIF(!string.IsNullOrWhiteSpace(input.ContainerCode), u => u.ContainerCode.Contains(input.ContainerCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), u => u.MaterialCode.Contains(input.MaterialCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SupplierBatch), u => u.SupplierBatch.Contains(input.SupplierBatch.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Batch), u => u.Batch.Contains(input.Batch.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SupplierCode), u => u.SupplierCode.Contains(input.SupplierCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SupplierName), u => u.SupplierName.Contains(input.SupplierName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.MaterialName), u => u.MaterialName.Contains(input.MaterialName.Trim()))
.WhereIF(input.StockStatus.HasValue, u => u.StockStatus == input.StockStatus)
.WhereIF(!string.IsNullOrWhiteSpace(input.SN_1d), u => u.SN_1d.Contains(input.SN_1d.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SN_2d), u => u.SN_2d.Contains(input.SN_2d.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SNCode), u => u.SNCode.Contains(input.SNCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.ErpOrderNo), u => u.ErpOrderNo.Contains(input.ErpOrderNo.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.ErpCode), u => u.ErpCode.Contains(input.ErpCode.Trim()))
.WhereIF(input.QCStatus.HasValue, u => u.QCStatus == input.QCStatus)
.WhereIF(!string.IsNullOrWhiteSpace(input.ErpVoucher), u => u.ErpVoucher.Contains(input.ErpVoucher.Trim()))
.Select();
if (input.RecordInsertTimeRange != null && input.RecordInsertTimeRange.Count > 0)
{
DateTime? start = input.RecordInsertTimeRange[0].Value.AddDays(-1);
query = query.WhereIF(start.HasValue, u => u.RecordInsertTime > start);
if (input.RecordInsertTimeRange.Count > 1 && input.RecordInsertTimeRange[1].HasValue)
{
var end = input.RecordInsertTimeRange[1].Value.AddDays(1);
query = query.Where(u => u.RecordInsertTime < end);
}
}
if (input.ActionTimeRange != null && input.ActionTimeRange.Count > 0)
{
DateTime? start = input.ActionTimeRange[0].Value.AddDays(-1);
query = query.WhereIF(start.HasValue, u => u.ActionTime > start);
if (input.ActionTimeRange.Count > 1 && input.ActionTimeRange[1].HasValue)
{
var end = input.ActionTimeRange[1].Value.AddDays(1);
query = query.Where(u => u.ActionTime < end);
}
}
return query;
}
private ISugarQueryable CommonPageViewFilter(WmsStockQuanInput input)
{
var query = _v_wms_stock_quanRep.AsQueryable()
.WhereIF(!string.IsNullOrWhiteSpace(input.SearchKey), u =>
u.ContainerCode.Contains(input.SearchKey.Trim())
|| u.MaterialCode.Contains(input.SearchKey.Trim())
|| u.SupplierBatch.Contains(input.SearchKey.Trim())
|| u.Batch.Contains(input.SearchKey.Trim())
|| u.CreateUserName.Contains(input.SearchKey.Trim())
|| u.UpdateUserName.Contains(input.SearchKey.Trim())
|| u.SupplierCode.Contains(input.SearchKey.Trim())
|| u.SupplierName.Contains(input.SearchKey.Trim())
|| u.MaterialName.Contains(input.SearchKey.Trim())
|| u.SN_1d.Contains(input.SearchKey.Trim())
|| u.SN_2d.Contains(input.SearchKey.Trim())
|| u.SNCode.Contains(input.SearchKey.Trim())
|| u.ErpOrderNo.Contains(input.SearchKey.Trim())
|| u.ErpCode.Contains(input.SearchKey.Trim())
|| u.ErpVoucher.Contains(input.SearchKey.Trim())
|| u.ActionRemark.Contains(input.SearchKey.Trim())
)
.WhereIF(!string.IsNullOrWhiteSpace(input.ContainerCode), u => u.ContainerCode.Contains(input.ContainerCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.MaterialCode), u => u.MaterialCode.Contains(input.MaterialCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SupplierBatch), u => u.SupplierBatch.Contains(input.SupplierBatch.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.Batch), u => u.Batch.Contains(input.Batch.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.PlaceName), u => u.PlaceName == input.PlaceName)
.WhereIF(!string.IsNullOrWhiteSpace(input.AreaName), u => u.AreaName == input.AreaName)
.WhereIF(!string.IsNullOrWhiteSpace(input.SupplierCode), u => u.SupplierCode.Contains(input.SupplierCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SupplierName), u => u.SupplierName.Contains(input.SupplierName.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.MaterialName), u => u.MaterialName.Contains(input.MaterialName.Trim()))
.WhereIF(input.StockStatus.HasValue, u => u.StockStatus == input.StockStatus)
.WhereIF(!string.IsNullOrWhiteSpace(input.SN_1d), u => u.SN_1d.Contains(input.SN_1d.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SN_2d), u => u.SN_2d.Contains(input.SN_2d.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.SNCode), u => u.SNCode.Contains(input.SNCode.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.ErpOrderNo), u => u.ErpOrderNo.Contains(input.ErpOrderNo.Trim()))
.WhereIF(!string.IsNullOrWhiteSpace(input.ErpCode), u => u.ErpCode.Contains(input.ErpCode.Trim()))
.WhereIF(input.QCStatus.HasValue, u => u.QCStatus == input.QCStatus)
.WhereIF(!string.IsNullOrWhiteSpace(input.ErpVoucher), u => u.ErpVoucher.Contains(input.ErpVoucher.Trim()))
.Select();
if (input.RecordInsertTimeRange != null && input.RecordInsertTimeRange.Count > 0)
{
DateTime? start = input.RecordInsertTimeRange[0].Value.AddDays(-1);
query = query.WhereIF(start.HasValue, u => u.RecordInsertTime > start);
if (input.RecordInsertTimeRange.Count > 1 && input.RecordInsertTimeRange[1].HasValue)
{
var end = input.RecordInsertTimeRange[1].Value.AddDays(1);
query = query.Where(u => u.RecordInsertTime < end);
}
}
if (input.ActionTimeRange != null && input.ActionTimeRange.Count > 0)
{
DateTime? start = input.ActionTimeRange[0].Value.AddDays(-1);
query = query.WhereIF(start.HasValue, u => u.ActionTime > start);
if (input.ActionTimeRange.Count > 1 && input.ActionTimeRange[1].HasValue)
{
var end = input.ActionTimeRange[1].Value.AddDays(1);
query = query.Where(u => u.ActionTime < end);
}
}
return query;
}
///
/// 重复性验证
///
/// 验证对象
/// 是否是编辑
///
private async Task CheckExist(WmsStockQuan input, bool isEdit = false)
{
//没有配置组合校验,不需要验重
//没有配置单独校验,不需要验重
}
///
/// 根据组合校验和单独校验验证数据是否已存在-导入时验证
///
///
///
private async Task CheckExisitForImport(List inputs)
{
if (inputs?.Count <= 0)
{
throw Oops.Oh($"导入数据不能为空");
}
//根据组合校验验证表格中中是否已存在相同数据
//根据单独校验验证表格中中是否已存在相同数据
}
#endregion
}