using AutoMapper; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WMS.Web.Core.Dto.Inventory; using WMS.Web.Core.Internal.Results; using WMS.Web.Domain.Entitys; using WMS.Web.Domain.Infrastructure; using WMS.Web.Domain.IService; using WMS.Web.Domain.Values; namespace WMS.Web.Domain.Services { /// /// 即时库存-服务 /// public class InventoryDetailsService: IInventoryDetailsService { private readonly IMapper _mapper; private readonly IBoxRepositories _boxRepositories; private readonly ISerialNumbersRepositories _serialNumbersRepositories; private readonly IInventoryDetailsRepositories _inventoryDetailsRepositories; private readonly ILogger _logger; public InventoryDetailsService(IMapper mapper, IBoxRepositories boxRepositories, ISerialNumbersRepositories serialNumbersRepositories, ILogger logger, IInventoryDetailsRepositories inventoryDetailsRepositories) { _mapper = mapper; _logger = logger; _boxRepositories = boxRepositories; _inventoryDetailsRepositories = inventoryDetailsRepositories; _serialNumbersRepositories = serialNumbersRepositories; } /// /// 生成:即时库存明细 /// /// /// /// public async Task GenerateInventoryDetails(List dtos,bool isTransaction) { //找到物料对应的即时库存明细 var orgCodes = dtos.Select(x => x.OrgCode).ToList(); var materialIds = dtos.Select(x => x.MaterialId).ToList(); var stockCodes = dtos.GroupBy(x => x.StockCode).Select(x => x.Key).ToList(); var subStockIds = dtos.GroupBy(x => x.SubStockId).Select(x => x.Key).ToList(); var inventoryDetails = await _inventoryDetailsRepositories.GetListBy(materialIds, stockCodes, subStockIds, orgCodes); var add_entitys = new List(); var update_entitys = new List(); _logger.LogInformation(" 生成:即时库存明细:" + JsonConvert.SerializeObject(dtos)); //2.遍历 foreach (var dto in dtos) { //2.1当前的即时库存明细 var currentDetail = inventoryDetails.Where(x => x.MaterialId == dto.MaterialId && x.StockCode == dto.StockCode && x.SubStockId == dto.SubStockId && x.OrgCode==dto.OrgCode).FirstOrDefault(); if (currentDetail == null) { _logger.LogInformation(" 生成:即时库存明细-->明细NULL:" + JsonConvert.SerializeObject(dto)); //出库的时候,判断是否有库存,没有就返回错误 if (dto.InventoryInOutType == (int)InventoryInOutType.Out) return Result.ReFailure(ResultCodes.InventoryDetailsNoInventoryError); var entity = _mapper.Map(dto); add_entitys.Add(entity); } else { _logger.LogInformation(" 生成:即时库存明细-->明细HAVE:" + JsonConvert.SerializeObject(currentDetail)); var entity = currentDetail; if (dto.InventoryInOutType == (int)InventoryInOutType.In) { //加库存 entity.Qty = entity.Qty + dto.Qty; } else { //出库的时候,判断是否有库存,没有就返回错误 if (entity.Qty /// 获取即时库存明细汇总 /// /// /// /// /// public async Task> GetInventoryDetailsSummary(List mids, List stockCodes, List orgCodes) { var inventoryDetails = await _inventoryDetailsRepositories.GetListBy(mids, stockCodes, orgCodes); var resultList = inventoryDetails.GroupBy(x => new { MaterialId = x.MaterialId, StockCode = x.StockCode, OrgCode = x.OrgCode }) .Select(x => new InventoryDetailsSummaryResponse() { MaterialId=x.Key.MaterialId, StockCode=x.Key.StockCode, OrgCode=x.Key.OrgCode, Qty=x.Sum(t=>t.Qty) }).ToList(); return resultList; } } }