using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Helper; using WIDESEA_DTO.Stock; using WIDESEA_IStockService; using WIDESEA_Model.Models; namespace WIDESEA_StockService { public class StockDetailByMaterielService :IStockDetailByMaterielService { private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly SqlSugarClient _dbBase; private readonly IRepository _stockInfoDetailRepository; public StockDetailByMaterielService(IUnitOfWorkManage unitOfWorkManage, IRepository stockInfoDetailRepository) { _unitOfWorkManage = unitOfWorkManage; _dbBase = unitOfWorkManage.GetDbClient(); _stockInfoDetailRepository = stockInfoDetailRepository; } public virtual PageGridData GetPageGridData(PageDataOptions options) { try { List materielnfoStatistics = new List(); ISugarQueryable sugarQueryable1 = _dbBase.Queryable(); ISugarQueryable sugarQueryable = _dbBase.Queryable(); ISugarQueryable sugarQueryable3 = _dbBase.Queryable(); if (!string.IsNullOrEmpty(options.Wheres)) { try { List searchParametersList = options.Wheres.DeserializeObject>(); if (searchParametersList.Count > 0) { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielCode).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.MaterielCode.Contains(searchParameters.Value)); } searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.WarehouseCode).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.WarehouseCode.Contains(searchParameters.Value)); } searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielName).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.MaterielName.Contains(searchParameters.Value)); } searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.BatchNo).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.BatchNo.Contains(searchParameters.Value)); } searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.SupplyCode).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.SupplyCode.Contains(searchParameters.Value)); } } } catch (Exception ex) { } } ISugarQueryable sugarQueryable2 = sugarQueryable1 .InnerJoin(sugarQueryable, (detail, stock) => detail.StockId == stock.Id) .LeftJoin(sugarQueryable3, (detail, stock, materiel) => detail.MaterielCode == materiel.MaterielCode) .Where((detail, stock, materiel) => !string.IsNullOrEmpty(stock.LocationCode)) .Select((detail, stock, materiel) => new StockDetailByMateriel { StockId = detail.StockId, MaterielCode = detail.MaterielCode, MaterielName = materiel.MaterielName ==null ?detail.MaterielName:materiel.MaterielName, StockQuantity = (decimal)detail.StockQuantity, OutboundQuantity = (decimal)detail.OutboundQuantity, OrderNo = detail.OrderNo, BatchNo = detail.BatchNo, SerialNumber = detail.SerialNumber, SupplyCode = detail.SupplyCode, WarehouseCode = detail.WarehouseCode, Barcode = detail.Barcode, Unit = detail.Unit, Creater = detail.Creater, CreateDate = detail.CreateDate, Modifier = detail.Modifier, ModifyDate = detail.ModifyDate, Remark = stock.Remark }); var allData = sugarQueryable2.ToList(); var groupedData = new Dictionary(); foreach (var item in allData) { string groupKey = $"{item.MaterielCode}|{item.SupplyCode}|{item.BatchNo}|{item.WarehouseCode}"; if (groupedData.ContainsKey(groupKey)) { groupedData[groupKey].StockQuantity += Convert.ToDecimal(item.StockQuantity); groupedData[groupKey].OutboundQuantity += Convert.ToDecimal(item.OutboundQuantity); } else { groupedData[groupKey] = new StockDetailByMateriel { StockId = item.StockId, MaterielCode = item.MaterielCode, MaterielName = item.MaterielName, StockQuantity = Convert.ToDecimal(item.StockQuantity), OutboundQuantity = Convert.ToDecimal(item.OutboundQuantity), OrderNo = item.OrderNo, BatchNo = item.BatchNo, SerialNumber = item.SerialNumber, SupplyCode = item.SupplyCode, WarehouseCode = item.WarehouseCode, Barcode = item.Barcode, Creater = item.Creater, CreateDate = item.CreateDate, Modifier = item.Modifier, ModifyDate = item.ModifyDate, Unit = item.Unit, Remark = item.Remark }; } } decimal totalStockQuantity = 0; if (groupedData.Count > 0) { totalStockQuantity = groupedData.Values.Sum(x => x.StockQuantity); } materielnfoStatistics = groupedData.Values.ToList(); int startIndex = (options.Page - 1) * options.Rows; int endIndex = Math.Min(startIndex + options.Rows, materielnfoStatistics.Count); if (startIndex < materielnfoStatistics.Count) { materielnfoStatistics = materielnfoStatistics.GetRange(startIndex, endIndex - startIndex); } else { materielnfoStatistics = new List(); } int count = groupedData.Count; return new PageGridData(count, materielnfoStatistics) { TotalStockQuantity = totalStockQuantity }; } catch (Exception ex) { return new PageGridData(); } } public WebResponseContent CalculateStock(string warehouseCode,string materielCode) { var calculateStock =_stockInfoDetailRepository.QueryData(x => x.WarehouseCode == warehouseCode && x.MaterielCode == materielCode).Sum(x => x.StockQuantity); if(calculateStock == 0) { return WebResponseContent.Instance.Error("未找到库存"); } return WebResponseContent.Instance.OK(data: calculateStock); } } }