using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Volo.Abp.AspNetCore.Mvc; 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; 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; 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; } [HttpGet("plan-actual-list")] public virtual async Task> GetPlanAndActualListAsync() { return await GetPlanAndActualDashboardsAsync(); } private async Task> GetPlanAndActualDashboardsAsync() { var supplierAsns = await this.GetSupplierAsnsAsync(); var supplierCodes = supplierAsns.Select(t => t.SupplierCode).Distinct(); var suppliers = await GetSuppliersAsync(supplierCodes); var asnNumbers = supplierAsns.Select(t => t.Number); var purchaseReceiptNotes = await GetPurchaseReceiptNotesAsync(asnNumbers); var putawayNotes = await this.GetPutawayNotesAsync(asnNumbers); var itemSafetyStorks = await this.GetItemSafetyStocksAsync(supplierAsns); return await this.ConvertToPlanAndActualDashboards( supplierAsns, suppliers, purchaseReceiptNotes, putawayNotes, itemSafetyStorks); } private async Task> ConvertToPlanAndActualDashboards(List supplierAsns, List suppliers, List purchaseReceiptNotes, List putawayNotes, List itemSafetyStorks) { var dtos = new List(); foreach (var supplierAsn in supplierAsns) { var purchaseReceipts = purchaseReceiptNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); var putaways = putawayNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); var supplierShortName = string.Empty; var supplier = suppliers.FirstOrDefault(t => t.Code == supplierAsn.SupplierCode); if (supplier == null) continue; supplierShortName = supplier.ShortName; foreach (var detail in supplierAsn.Details) { var dto = dtos.FirstOrDefault(t => t.SupplierShortName == supplierShortName && t.ItemCode == detail.ItemCode); if (dto == null) { dto = new PlanAndActualDashboardDto(); dto.SupplierShortName = supplierShortName; dto.ItemCode = detail.ItemCode; dto.ItemDesc1 = detail.ItemDesc1; dto.ItemName = detail.ItemName; var itemSafetyStork = itemSafetyStorks.FirstOrDefault(t => t.ItemCode == detail.ItemCode); if (itemSafetyStork != null) { dto.MaxQty = itemSafetyStork.MaxStock; dto.MinQty = itemSafetyStork.MinStock; } var purchaseOrderDtos = await _purchaseOrderApp.GetListBySupplierCodeAsync(supplierAsn.SupplierCode, detail.ItemCode); var supllierAsn = await _supplierAsnApp.GetForTodayListAsync(); var poNumberList = supllierAsn.Select(p => p.PoNumber).ToList(); purchaseOrderDtos = purchaseOrderDtos.Where(p => poNumberList.Contains(p.Number)).ToList(); decimal allPutawayQty = 0; decimal allReceiptQty = 0; decimal allPlanArriveQty = 0; foreach (var purchaseOrderDTO in purchaseOrderDtos) { 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); } dto.PutawayQty = allPutawayQty; dto.PlanArriveQty = allPlanArriveQty; dto.ReceiptQty = allReceiptQty; dtos.Add(dto); } var purchaseReceiptJobDtos = await _purchaseReceiptJobApp.GetListBySupplierCodeOnTodayAsync(supplierAsn.SupplierCode); dto.ReceiptNoteCount = purchaseReceiptJobDtos.Count(p => p.JobStatus == EnumJobStatus.Done); dto.SupplierAsnCount = purchaseReceiptJobDtos.Count(); } } return dtos.OrderBy(t => t.SupplierShortName).ToList(); } private decimal CountReceiptQty(List purchaseReceipts, string itemCode) { return purchaseReceipts.Sum(t => t.Details.Where(t => t.ItemCode == itemCode).Sum(t => t.Qty)); } private int CountReceiptNoteCount(List purchaseReceipts, string itemCode) { return purchaseReceipts.Sum(t => t.Details.Count(t => t.ItemCode == itemCode)); } private async Task> GetSupplierAsnsAsync() { var startTime = DateTime.Today.AddHours(DashboardConst.AsnReceiptTimeLimitHour); var endTime = startTime.AddDays(1).AddSeconds(-1); if (DateTime.Now.Hour < DashboardConst.AsnReceiptTimeLimitHour) { startTime.AddDays(-1); endTime.AddDays(-1); } return await this._supplierAsnApp.GetByStartTimeEndTimeAsync(startTime, endTime); } private async Task> GetSuppliersAsync(IEnumerable codes) { return await this._supplierApp.GetByCodesAsync(codes); } private async Task> GetPurchaseReceiptNotesAsync(IEnumerable asnNumbers) { return await this._purchaseReceiptNoteApp.GetListByAsnNumbers(asnNumbers); } private async Task> GetPutawayNotesAsync(IEnumerable asnNumbers) { return await this._putawayNoteApp.GetListByAsnNumbers(asnNumbers); } private async Task> GetItemSafetyStocksAsync(List supplierAsns) { var itemCodes = new List(); supplierAsns.ForEach(t => { itemCodes.AddRange(t.Details.Select(t => t.ItemCode).ToList()); }); var itemSafetyStorks = await this._itemSafetyStockApp.GetByItemCodesAsync(itemCodes); return itemSafetyStorks; } } }