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;
}
}
}