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().ConfigureAwait(false); } private async Task> GetPlanAndActualDashboardsAsync() { var supplierAsns = await this.GetSupplierAsnsAsync().ConfigureAwait(false); var supplierCodes = supplierAsns.Select(t => t.SupplierCode).Distinct(); var suppliers = await GetSuppliersAsync(supplierCodes).ConfigureAwait(false); var asnNumbers = supplierAsns.Select(t => t.Number); var purchaseReceiptNotes = await GetPurchaseReceiptNotesAsync(asnNumbers).ConfigureAwait(false); var putawayNotes = await this.GetPutawayNotesAsync(asnNumbers).ConfigureAwait(false); var itemSafetyStorks = await this.GetItemSafetyStocksAsync(supplierAsns).ConfigureAwait(false); return await this.ConvertToPlanAndActualDashboards( supplierAsns, suppliers, purchaseReceiptNotes, putawayNotes, itemSafetyStorks).ConfigureAwait(false); } private async Task> ConvertToPlanAndActualDashboards(List supplierAsns, List suppliers, List purchaseReceiptNotes, List putawayNotes, List itemSafetyStorks) { var dtos = new List(); var poNumberList = supplierAsns.Select(p => p.PoNumber).ToList(); foreach (var supplierAsn in supplierAsns) { var purchaseReceipts = purchaseReceiptNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); var putaways = putawayNotes.FindAll(t => t.AsnNumber == supplierAsn.Number); var supplierName = string.Empty; var supplierShortName = string.Empty; var supplier = suppliers.FirstOrDefault(t => t.Code == supplierAsn.SupplierCode); if (supplier == null) { continue; } supplierName = supplier.Name; supplierShortName = supplier.ShortName; foreach (var detail in supplierAsn.Details) { var dto = dtos.FirstOrDefault(t => t.SupplierName == supplierName && t.ItemCode == detail.ItemCode); if (dto == null) { dto = new PlanAndActualDashboardDto(); dto.SupplierName = supplier.Name; 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).ConfigureAwait(false); //var supllierAsn = await _supplierAsnApp.GetForTodayListAsync().ConfigureAwait(false); //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; decimal allArriveQty = 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.PutAwayQty); allPlanArriveQty += purchaseOrderDTO.Details.Where(p => p.ItemCode == detail.ItemCode).Sum(p => p.Qty); allArriveQty += purchaseOrderDTO.Details.Where(p => p.ItemCode == detail.ItemCode).Sum(p => p.ShippedQty); } dto.PutawayQty = allPutawayQty; dto.PlanArriveQty = allPlanArriveQty; dto.ReceiptQty = allReceiptQty; dto.ArriveQty = allArriveQty; dto.DifferQty = dto.PlanArriveQty - dto.ReceiptQty; dtos.Add(dto); } var purchaseReceiptJobDtos = await _purchaseReceiptJobApp.GetListBySupplierCodeOnTodayAsync(supplierAsn.SupplierCode).ConfigureAwait(false); dto.ReceiptNoteCount = purchaseReceiptJobDtos.Count(p => p.JobStatus == EnumJobStatus.Done); dto.SupplierAsnCount = purchaseReceiptJobDtos.Count(); } } return dtos.OrderBy(t => t.SupplierName).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)); } /// /// 显示7天数据 /// /// private async Task> GetSupplierAsnsAsync() { var startTime = DateTime.Today.AddDays(-6).AddHours(DashboardConst.AsnReceiptTimeLimitHour); var endTime = startTime.AddDays(7).AddSeconds(-1); if (DateTime.Now.Hour < DashboardConst.AsnReceiptTimeLimitHour) { startTime.AddDays(-1); endTime.AddDays(-1); } return await this._supplierAsnApp.GetByStartTimeEndTimeAsync(startTime, endTime).ConfigureAwait(false); } private async Task> GetSuppliersAsync(IEnumerable codes) { return await this._supplierApp.GetByCodesAsync(codes).ConfigureAwait(false); } private async Task> GetPurchaseReceiptNotesAsync(IEnumerable asnNumbers) { return await this._purchaseReceiptNoteApp.GetListByAsnNumbers(asnNumbers).ConfigureAwait(false); } 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; } } }