17 changed files with 607 additions and 438 deletions
@ -1,174 +1,194 @@ |
|||||
using System; |
|
||||
using System.Collections.Generic; |
using System.Collections.Generic; |
||||
using System.Linq; |
|
||||
using System.Threading.Tasks; |
using System.Threading.Tasks; |
||||
using Microsoft.AspNetCore.Mvc; |
using Microsoft.AspNetCore.Mvc; |
||||
using Serilog; |
|
||||
using Volo.Abp.AspNetCore.Mvc; |
using Volo.Abp.AspNetCore.Mvc; |
||||
using Win_in.Sfs.Basedata.Application.Contracts; |
|
||||
using Win_in.Sfs.Wms.Dashboard.Host.Models; |
using Win_in.Sfs.Wms.Dashboard.Host.Models; |
||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using Win_in.Sfs.Basedata.Application.Contracts; |
||||
|
using Win_in.Sfs.Shared.Domain.Shared; |
||||
using Win_in.Sfs.Wms.Store.Application.Contracts; |
using Win_in.Sfs.Wms.Store.Application.Contracts; |
||||
|
|
||||
namespace Win_in.Sfs.Wms.Dashboard.Host.Controllers; |
namespace Win_in.Sfs.Wms.Dashboard.Host.Controllers |
||||
|
|
||||
[ApiController] |
|
||||
[Route($"{PdaHostConst.ROOT_ROUTE}plan-and-actual")] |
|
||||
|
|
||||
public class PlanAndActualController : AbpController |
|
||||
{ |
{ |
||||
private readonly ISupplierAsnAppService _supplierAsnApp; |
|
||||
private readonly IPurchaseReceiptNoteAppService _purchaseReceiptNoteApp; |
|
||||
private readonly IPutawayNoteAppService _putawayNoteApp; |
|
||||
private readonly ISupplierAppService _supplierApp; |
|
||||
private readonly IItemSafetyStockAppService _itemSafetyStockApp; |
|
||||
|
|
||||
public PlanAndActualController(ISupplierAsnAppService supplierAsnApp, IPurchaseReceiptNoteAppService purchaseReceiptNoteApp, IPutawayNoteAppService putawayNoteApp, ISupplierAppService supplierApp, IItemSafetyStockAppService itemSafetyStockApp) |
[ApiController] |
||||
{ |
[Route($"{PdaHostConst.ROOT_ROUTE}plan-and-actual")] |
||||
_supplierAsnApp = supplierAsnApp; |
|
||||
_purchaseReceiptNoteApp = purchaseReceiptNoteApp; |
|
||||
_putawayNoteApp = putawayNoteApp; |
|
||||
_supplierApp = supplierApp; |
|
||||
_itemSafetyStockApp = itemSafetyStockApp; |
|
||||
} |
|
||||
|
|
||||
[HttpGet("plan-actual-list")] |
public class PlanAndActualController : AbpController |
||||
public virtual async Task<List<PlanAndActualDashboardDto>> GetPlanAndActualListAsync() |
|
||||
{ |
{ |
||||
return await GetPlanAndActualDashboardsAsync().ConfigureAwait(false); |
private readonly ISupplierAsnAppService _supplierAsnApp; |
||||
} |
private readonly IPurchaseReceiptNoteAppService _purchaseReceiptNoteApp; |
||||
|
private readonly IPutawayNoteAppService _putawayNoteApp; |
||||
|
private readonly ISupplierAppService _supplierApp; |
||||
|
private readonly IItemSafetyStockAppService _itemSafetyStockApp; |
||||
|
private readonly IPurchaseOrderAppService _purchaseOrderApp; |
||||
|
private readonly IPurchaseReceiptJobAppService _purchaseReceiptJobApp; |
||||
|
|
||||
|
public PlanAndActualController(ISupplierAsnAppService supplierAsnApp, IPurchaseReceiptNoteAppService purchaseReceiptNoteApp, IPutawayNoteAppService putawayNoteApp, ISupplierAppService supplierApp, IItemSafetyStockAppService itemSafetyStockApp, IPurchaseOrderAppService purchaseOrderApp, IPurchaseReceiptJobAppService purchaseReceiptJobApp) |
||||
|
{ |
||||
|
_supplierAsnApp = supplierAsnApp; |
||||
|
_purchaseReceiptNoteApp = purchaseReceiptNoteApp; |
||||
|
_putawayNoteApp = putawayNoteApp; |
||||
|
_supplierApp = supplierApp; |
||||
|
_itemSafetyStockApp = itemSafetyStockApp; |
||||
|
_purchaseOrderApp = purchaseOrderApp; |
||||
|
_purchaseReceiptJobApp = purchaseReceiptJobApp; |
||||
|
} |
||||
|
|
||||
private async Task<List<PlanAndActualDashboardDto>> GetPlanAndActualDashboardsAsync() |
|
||||
{ |
|
||||
var supplierAsns = await GetSupplierAsnsAsync().ConfigureAwait(false); |
|
||||
|
|
||||
var supplierCodes = supplierAsns.Select(t => t.SupplierCode).Distinct(); |
[HttpGet("plan-actual-list")] |
||||
|
public virtual async Task<List<PlanAndActualDashboardDto>> GetPlanAndActualListAsync() |
||||
|
{ |
||||
|
return await GetPlanAndActualDashboardsAsync(); |
||||
|
} |
||||
|
|
||||
var suppliers = await GetSuppliersAsync(supplierCodes).ConfigureAwait(false); |
private async Task<List<PlanAndActualDashboardDto>> GetPlanAndActualDashboardsAsync() |
||||
|
{ |
||||
|
var supplierAsns = await this.GetSupplierAsnsAsync(); |
||||
|
|
||||
var asnNumbers = supplierAsns.Select(t => t.Number); |
var supplierCodes = supplierAsns.Select(t => t.SupplierCode).Distinct(); |
||||
|
|
||||
var purchaseReceiptNotes = await GetPurchaseReceiptNotesAsync(asnNumbers).ConfigureAwait(false); |
var suppliers = await GetSuppliersAsync(supplierCodes); |
||||
|
|
||||
var putawayNotes = await GetPutawayNotesAsync(asnNumbers).ConfigureAwait(false); |
var asnNumbers = supplierAsns.Select(t => t.Number); |
||||
|
|
||||
var itemSafetyStorks = await GetItemSafetyStocksAsync(supplierAsns).ConfigureAwait(false); |
var purchaseReceiptNotes = await GetPurchaseReceiptNotesAsync(asnNumbers); |
||||
|
|
||||
return ConvertToPlanAndActualDashboards( |
var putawayNotes = await this.GetPutawayNotesAsync(asnNumbers); |
||||
supplierAsns, |
|
||||
suppliers, |
|
||||
purchaseReceiptNotes, |
|
||||
putawayNotes, |
|
||||
itemSafetyStorks); |
|
||||
} |
|
||||
|
|
||||
private static List<PlanAndActualDashboardDto> ConvertToPlanAndActualDashboards(List<SupplierAsnDTO> supplierAsns, List<SupplierDTO> suppliers, List<PurchaseReceiptNoteDTO> purchaseReceiptNotes, List<PutawayNoteDTO> putawayNotes, List<ItemSafetyStockDTO> itemSafetyStorks) |
var itemSafetyStorks = await this.GetItemSafetyStocksAsync(supplierAsns); |
||||
{ |
|
||||
var dtos = new List<PlanAndActualDashboardDto>(); |
return await this.ConvertToPlanAndActualDashboards( |
||||
|
supplierAsns, |
||||
|
suppliers, |
||||
|
purchaseReceiptNotes, |
||||
|
putawayNotes, |
||||
|
itemSafetyStorks); |
||||
|
} |
||||
|
|
||||
foreach (var supplierAsn in supplierAsns) |
private async Task<List<PlanAndActualDashboardDto>> ConvertToPlanAndActualDashboards(List<SupplierAsnDTO> supplierAsns, List<SupplierDTO> suppliers, List<PurchaseReceiptNoteDTO> purchaseReceiptNotes, List<PutawayNoteDTO> putawayNotes, List<ItemSafetyStockDTO> itemSafetyStorks) |
||||
{ |
{ |
||||
var purchaseReceipts = purchaseReceiptNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); |
var dtos = new List<PlanAndActualDashboardDto>(); |
||||
var putaways = putawayNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); |
|
||||
|
|
||||
var supplierShortName = string.Empty; |
foreach (var supplierAsn in supplierAsns) |
||||
|
{ |
||||
|
var purchaseReceipts = purchaseReceiptNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); |
||||
|
var putaways = putawayNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); |
||||
|
|
||||
var supplier = suppliers.FirstOrDefault(t => t.Code == supplierAsn.SupplierCode); |
var supplierShortName = string.Empty; |
||||
|
|
||||
if (supplier == null) |
var supplier = suppliers.FirstOrDefault(t => t.Code == supplierAsn.SupplierCode); |
||||
{ |
|
||||
continue; |
|
||||
} |
|
||||
|
|
||||
supplierShortName = supplier.ShortName; |
if (supplier == null) |
||||
|
continue; |
||||
|
|
||||
foreach (var detail in supplierAsn.Details) |
supplierShortName = supplier.ShortName; |
||||
{ |
|
||||
var dto = dtos.FirstOrDefault(t => t.SupplierShortName == supplierShortName && t.ItemCode == detail.ItemCode); |
|
||||
|
|
||||
if (dto == null) |
foreach (var detail in supplierAsn.Details) |
||||
{ |
{ |
||||
dto = new PlanAndActualDashboardDto(); |
var dto = dtos.FirstOrDefault(t => t.SupplierShortName == supplierShortName && t.ItemCode == detail.ItemCode); |
||||
|
|
||||
dto.SupplierShortName = supplierShortName; |
if (dto == null) |
||||
dto.ItemCode = detail.ItemCode; |
{ |
||||
dto.ItemDesc1 = detail.ItemDesc1; |
dto = new PlanAndActualDashboardDto(); |
||||
dto.ItemName = detail.ItemName; |
|
||||
|
|
||||
var itemSafetyStork = itemSafetyStorks.FirstOrDefault(t => t.ItemCode == detail.ItemCode); |
dto.SupplierShortName = supplierShortName; |
||||
|
dto.ItemCode = detail.ItemCode; |
||||
|
dto.ItemDesc1 = detail.ItemDesc1; |
||||
|
dto.ItemName = detail.ItemName; |
||||
|
|
||||
if (itemSafetyStork != null) |
var itemSafetyStork = itemSafetyStorks.FirstOrDefault(t => t.ItemCode == detail.ItemCode); |
||||
{ |
|
||||
dto.MaxQty = itemSafetyStork.MaxStock; |
|
||||
dto.MinQty = itemSafetyStork.MinStock; |
|
||||
} |
|
||||
|
|
||||
dto.ReceiptNoteCount = CountReceiptNoteCount(purchaseReceipts, detail.ItemCode, detail.Lot); |
if (itemSafetyStork != null) |
||||
dto.ReceiptQty = CountReceiptQty(purchaseReceipts, detail.ItemCode, detail.Lot); |
{ |
||||
dto.PutawayQty = CountPutawayQty(putawayNotes, detail.ItemCode, detail.Lot); |
dto.MaxQty = itemSafetyStork.MaxStock; |
||||
|
dto.MinQty = itemSafetyStork.MinStock; |
||||
|
} |
||||
|
|
||||
dtos.Add(dto); |
var purchaseOrderDtos = await _purchaseOrderApp.GetListBySupplierCodeAsync(supplierAsn.SupplierCode, detail.ItemCode); |
||||
} |
var supllierAsn = await _supplierAsnApp.GetForTodayListAsync(); |
||||
|
var poNumberList = supllierAsn.Select(p => p.PoNumber).ToList(); |
||||
|
|
||||
dto.SupplierAsnCount += 1; |
purchaseOrderDtos = purchaseOrderDtos.Where(p => poNumberList.Contains(p.Number)).ToList(); |
||||
|
|
||||
dto.PlanArriveQty += detail.Qty; |
|
||||
} |
|
||||
} |
|
||||
|
|
||||
return dtos.OrderBy(t => t.SupplierShortName).ToList(); |
decimal allPutawayQty = 0; |
||||
} |
decimal allReceiptQty = 0; |
||||
|
decimal allPlanArriveQty = 0; |
||||
|
|
||||
private static decimal CountPutawayQty(List<PutawayNoteDTO> putawayNotes, string itemCode, string lot) |
foreach (var purchaseOrderDTO in purchaseOrderDtos) |
||||
{ |
{ |
||||
return putawayNotes.Sum(t => t.Details.Where(t => t.ItemCode == itemCode && t.ToLot == lot).Sum(t => t.Qty)); |
allPutawayQty += purchaseOrderDTO.Details.Where(p => p.ItemCode == detail.ItemCode).Sum(p => p.PutAwayQty); |
||||
} |
allReceiptQty += purchaseOrderDTO.Details.Where(p => p.ItemCode == detail.ItemCode).Sum(p => p.ReceivedQty); |
||||
|
allPlanArriveQty += purchaseOrderDTO.Details.Where(p => p.ItemCode == detail.ItemCode).Sum(p => p.ShippedQty); |
||||
|
} |
||||
|
|
||||
private static decimal CountReceiptQty(List<PurchaseReceiptNoteDTO> purchaseReceipts, string itemCode, string lot) |
dto.PutawayQty = allPutawayQty; |
||||
{ |
dto.PlanArriveQty = allPlanArriveQty; |
||||
return purchaseReceipts.Sum(t => t.Details.Where(t => t.ItemCode == itemCode && t.HandledLot == lot).Sum(t => t.Qty)); |
dto.ReceiptQty = allReceiptQty; |
||||
} |
|
||||
|
|
||||
private static int CountReceiptNoteCount(List<PurchaseReceiptNoteDTO> purchaseReceipts, string itemCode, string lot) |
dtos.Add(dto); |
||||
{ |
} |
||||
return purchaseReceipts.Sum(t => t.Details.Count(t => t.ItemCode == itemCode && t.Lot == lot)); |
|
||||
} |
|
||||
|
|
||||
private async Task<List<SupplierAsnDTO>> GetSupplierAsnsAsync() |
var purchaseReceiptJobDtos = await _purchaseReceiptJobApp.GetListBySupplierCodeOnTodayAsync(supplierAsn.SupplierCode); |
||||
{ |
|
||||
var startTime = DateTime.Today.AddHours(DashboardConst.AsnReceiptTimeLimitHour); |
dto.ReceiptNoteCount = purchaseReceiptJobDtos.Count(p => p.JobStatus == EnumJobStatus.Done); |
||||
|
|
||||
var endTime = startTime.AddDays(1).AddSeconds(-1); |
dto.SupplierAsnCount = purchaseReceiptJobDtos.Count(); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return dtos.OrderBy(t => t.SupplierShortName).ToList(); |
||||
|
} |
||||
|
|
||||
if (DateTime.Now.Hour < DashboardConst.AsnReceiptTimeLimitHour) |
private decimal CountReceiptQty(List<PurchaseReceiptNoteDTO> purchaseReceipts, string itemCode) |
||||
{ |
{ |
||||
startTime.AddDays(-1); |
return purchaseReceipts.Sum(t => t.Details.Where(t => t.ItemCode == itemCode).Sum(t => t.Qty)); |
||||
endTime.AddDays(-1); |
|
||||
} |
} |
||||
|
|
||||
return await _supplierAsnApp.GetByStartTimeEndTimeAsync(startTime, endTime).ConfigureAwait(false); |
private int CountReceiptNoteCount(List<PurchaseReceiptNoteDTO> purchaseReceipts, string itemCode) |
||||
} |
{ |
||||
|
return purchaseReceipts.Sum(t => t.Details.Count(t => t.ItemCode == itemCode)); |
||||
|
} |
||||
|
|
||||
private async Task<List<SupplierDTO>> GetSuppliersAsync(IEnumerable<string> codes) |
private async Task<List<SupplierAsnDTO>> GetSupplierAsnsAsync() |
||||
{ |
{ |
||||
return await _supplierApp.GetByCodesAsync(codes).ConfigureAwait(false); |
var startTime = DateTime.Today.AddHours(DashboardConst.AsnReceiptTimeLimitHour); |
||||
} |
|
||||
|
|
||||
private async Task<List<PurchaseReceiptNoteDTO>> GetPurchaseReceiptNotesAsync(IEnumerable<string> asnNumbers) |
var endTime = startTime.AddDays(1).AddSeconds(-1); |
||||
{ |
|
||||
return await _purchaseReceiptNoteApp.GetListByAsnNumbers(asnNumbers).ConfigureAwait(false); |
|
||||
} |
|
||||
|
|
||||
private async Task<List<PutawayNoteDTO>> GetPutawayNotesAsync(IEnumerable<string> asnNumbers) |
if (DateTime.Now.Hour < DashboardConst.AsnReceiptTimeLimitHour) |
||||
{ |
{ |
||||
return await _putawayNoteApp.GetListByAsnNumbers(asnNumbers).ConfigureAwait(false); |
startTime.AddDays(-1); |
||||
} |
endTime.AddDays(-1); |
||||
private async Task<List<ItemSafetyStockDTO>> GetItemSafetyStocksAsync(List<SupplierAsnDTO> supplierAsns) |
} |
||||
{ |
|
||||
var itemCodes = new List<string>(); |
|
||||
|
|
||||
supplierAsns.ForEach(t => { itemCodes.AddRange(t.Details.Select(t => t.ItemCode).ToList()); }); |
return await this._supplierAsnApp.GetByStartTimeEndTimeAsync(startTime, endTime); |
||||
|
} |
||||
|
|
||||
var itemSafetyStorks = await _itemSafetyStockApp.GetByItemCodesAsync(itemCodes).ConfigureAwait(false); |
private async Task<List<SupplierDTO>> GetSuppliersAsync(IEnumerable<string> codes) |
||||
return itemSafetyStorks; |
{ |
||||
|
return await this._supplierApp.GetByCodesAsync(codes); |
||||
|
} |
||||
|
|
||||
|
private async Task<List<PurchaseReceiptNoteDTO>> GetPurchaseReceiptNotesAsync(IEnumerable<string> asnNumbers) |
||||
|
{ |
||||
|
return await this._purchaseReceiptNoteApp.GetListByAsnNumbers(asnNumbers); |
||||
|
} |
||||
|
|
||||
|
private async Task<List<PutawayNoteDTO>> GetPutawayNotesAsync(IEnumerable<string> asnNumbers) |
||||
|
{ |
||||
|
return await this._putawayNoteApp.GetListByAsnNumbers(asnNumbers); |
||||
|
} |
||||
|
private async Task<List<ItemSafetyStockDTO>> GetItemSafetyStocksAsync(List<SupplierAsnDTO> supplierAsns) |
||||
|
{ |
||||
|
var itemCodes = new List<string>(); |
||||
|
|
||||
|
supplierAsns.ForEach(t => { itemCodes.AddRange(t.Details.Select(t => t.ItemCode).ToList()); }); |
||||
|
|
||||
|
var itemSafetyStorks = await this._itemSafetyStockApp.GetByItemCodesAsync(itemCodes); |
||||
|
return itemSafetyStorks; |
||||
|
} |
||||
} |
} |
||||
} |
} |
||||
|
Loading…
Reference in new issue