using SqlSugar; using System; using System.Collections.Generic; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.DB.Models; using WIDESEA_Core.Helper; using WIDESEA_Core.HostedService; using WIDESEA_DTO.Stock; using WIDESEA_IStockService; using WIDESEA_Model.Models; using System.Linq; using WIDESEA_Common.WareHouseEnum; using Magicodes.ExporterAndImporter.Core; using Magicodes.ExporterAndImporter.Excel; using WIDESEA_Common.LocationEnum; using WIDESEA_Core.Utilities; namespace WIDESEA_StockService { public partial class MaterielnfoStatisticsService : IMaterielnfoStatisticsService { public readonly IUnitOfWorkManage _unitOfWorkManage; public readonly SqlSugarClient _dbBase; public MaterielnfoStatisticsService(IUnitOfWorkManage unitOfWorkManage) { _unitOfWorkManage = unitOfWorkManage; _dbBase = unitOfWorkManage.GetDbClient(); } public virtual PageGridData GetPageGridData(PageDataOptions options) { try { List materielnfoStatistics = new List(); ISugarQueryable sugarQueryable1 = _dbBase.Queryable(); string whereStoDe = GetDataRole(typeof(Dt_StockInfoDetail)); sugarQueryable1 = sugarQueryable1.Where(whereStoDe); string whereSto = GetDataRole(typeof(Dt_StockInfo)); ISugarQueryable sugarQueryable = _dbBase.Queryable().Where(whereSto); 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? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfo.WarehouseId).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable = sugarQueryable.Where(x => x.WarehouseId.Equals(searchParameters.Value)); } } { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfo.StockStatus).FirstLetterToLower()); if(searchParameters!= null) { sugarQueryable = sugarQueryable.Where(x => x.StockStatus.Equals(searchParameters.Value)); } } { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielName).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.MaterielName.Contains(searchParameters.Value)); } } } } catch(Exception ex) { } } ISugarQueryable sugarQueryable2 = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => b.StockId == a.Id).Where((b,a)=>a.LocationCode!="" && a.LocationCode!=null).Select((b, a) => new MaterielnfoStatisticsDTO { WarehouseId = a.WarehouseId, MaterielCode = b.MaterielCode, MaterielName = b.MaterielName, StockQuantity =(decimal) b.StockQuantity, OutboundQuantity =(decimal) b.OutboundQuantity, StockStatus = a.StockStatus, Unit = b.Unit, Remark = a.Remark, }); // 获取所有数据 var allData = sugarQueryable2.ToList(); // 使用字典进行分组汇总 var groupedData = new Dictionary(); foreach (var item in allData) { // 确保初始值为decimal类型 if (groupedData.ContainsKey(item.MaterielCode)) { groupedData[item.MaterielCode].StockQuantity += Convert.ToDecimal(item.StockQuantity); groupedData[item.MaterielCode].OutboundQuantity += Convert.ToDecimal(item.OutboundQuantity); } else { groupedData[item.MaterielCode] = new MaterielnfoStatisticsDTO { WarehouseId = item.WarehouseId, MaterielCode = item.MaterielCode, MaterielName = item.MaterielName, StockQuantity = Convert.ToDecimal(item.StockQuantity), OutboundQuantity = Convert.ToDecimal(item.OutboundQuantity), StockStatus = item.StockStatus, Unit = item.Unit, Remark = item.Remark }; } } // 转换为列表 materielnfoStatistics = groupedData.Values.ToList(); // 分页处理 int startIndex = (options.Page - 1) * options.Rows; int endIndex = Math.Min(startIndex + options.Rows, materielnfoStatistics.Count); materielnfoStatistics = materielnfoStatistics.GetRange(startIndex, endIndex - startIndex); int count = groupedData.Count; return new PageGridData(count, materielnfoStatistics); } catch(Exception ex) { } return new PageGridData(); } public virtual WebResponseContent Export(PageDataOptions options) { WebResponseContent content = new WebResponseContent(); try { Type t = typeof(MaterielnfoStatisticsDTO); string savePath = AppDomain.CurrentDomain.BaseDirectory + $"ExcelExport"; IExporter exporter = new ExcelExporter(); options.Page = 1; options.Rows = 30; options.Order = "desc"; options.Sort = "MaterielCode"; List materielnfoStatistics = new List(); ISugarQueryable sugarQueryable1 = _dbBase.Queryable(); string whereStoDe = GetDataRole(typeof(Dt_StockInfoDetail)); sugarQueryable1 = sugarQueryable1.Where(whereStoDe); string whereSto = GetDataRole(typeof(Dt_StockInfo)); ISugarQueryable sugarQueryable = _dbBase.Queryable().Where(whereSto); 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? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfo.WarehouseId).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable = sugarQueryable.Where(x => x.WarehouseId.Equals(searchParameters.Value)); } } { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfo.StockStatus).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable = sugarQueryable.Where(x => x.StockStatus.Equals(searchParameters.Value)); } } { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_StockInfoDetail.MaterielName).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.MaterielName.Contains(searchParameters.Value)); } } } } catch (Exception ex) { } } ISugarQueryable sugarQueryable2 = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => b.StockId == a.Id).Where((b, a) => a.LocationCode != "" && a.LocationCode != null).Select((b, a) => new MaterielnfoStatisticsDTO { WarehouseId = a.WarehouseId, MaterielCode = b.MaterielCode, MaterielName = b.MaterielName, StockQuantity = (decimal)b.StockQuantity, OutboundQuantity =(decimal) b.OutboundQuantity, StockStatus = a.StockStatus, Unit = b.Unit, Remark = a.Remark, }); // 获取所有数据 var allData = sugarQueryable2.ToList(); // 使用字典进行分组汇总 var groupedData = new Dictionary(); foreach (var item in allData) { if (groupedData.ContainsKey(item.MaterielCode)) { groupedData[item.MaterielCode].StockQuantity += item.StockQuantity; groupedData[item.MaterielCode].OutboundQuantity += item.OutboundQuantity; } else { groupedData[item.MaterielCode] = new MaterielnfoStatisticsDTO { WarehouseId = item.WarehouseId, MaterielCode = item.MaterielCode, MaterielName = item.MaterielName, StockQuantity = item.StockQuantity, OutboundQuantity = item.OutboundQuantity, StockStatus = item.StockStatus, Unit = item.Unit, Remark = item.Remark }; } } // 转换为列表 materielnfoStatistics = groupedData.Values.ToList(); byte[] data = exporter.ExportAsByteArray(materielnfoStatistics).Result; string fileName = "物料分类统计.xlsx"; FileHelper.WriteFile(savePath, fileName, data); content = WebResponseContent.Instance.OK(data: savePath + "\\" + fileName); } catch (Exception ex) { content = WebResponseContent.Instance.Error(ex.Message); } return content; } private string GetDataRole(Type type) { try { UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId); if (userRole == null) throw new Exception($"无权限"); if (type.IsAssignableFrom(typeof(BaseWarehouseEntity)) || type.GetProperty(nameof(BaseWarehouseEntity.WarehouseId)) != null) { if (userRole.WarehouseIds.Count > 0) { return $"{nameof(BaseWarehouseEntity.WarehouseId)} in ({userRole.WarehouseIds.Serialize().Replace("[", "").Replace("]", "")})"; } else return $"1 != 1"; } else { return "1 = 1"; } } catch (Exception ex) { throw new Exception($"无权限,{ex.Message}"); } } } }