| 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<MaterielnfoStatisticsDTO> GetPageGridData(PageDataOptions options) | 
|         { | 
|             try | 
|             { | 
|   | 
|                 List<MaterielnfoStatisticsDTO> materielnfoStatistics = new List<MaterielnfoStatisticsDTO>(); | 
|                 ISugarQueryable<Dt_StockInfoDetail> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfoDetail>(); | 
|   | 
|                 string whereStoDe = GetDataRole(typeof(Dt_StockInfoDetail)); | 
|                 sugarQueryable1 = sugarQueryable1.Where(whereStoDe); | 
|   | 
|   | 
|                 string whereSto = GetDataRole(typeof(Dt_StockInfo)); | 
|                 ISugarQueryable<Dt_StockInfo> sugarQueryable = _dbBase.Queryable<Dt_StockInfo>().Where(whereSto); | 
|                 if (!string.IsNullOrEmpty(options.Wheres)) | 
|                 { | 
|                     try | 
|                     { | 
|                         List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>(); | 
|                         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<MaterielnfoStatisticsDTO> 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<string, MaterielnfoStatisticsDTO>(); | 
|                 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<MaterielnfoStatisticsDTO>(count, materielnfoStatistics); | 
|                  | 
|             } | 
|             catch(Exception ex)  | 
|             { | 
|              | 
|             } | 
|             return new PageGridData<MaterielnfoStatisticsDTO>(); | 
|         } | 
|   | 
|         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<MaterielnfoStatisticsDTO> materielnfoStatistics = new List<MaterielnfoStatisticsDTO>(); | 
|                 ISugarQueryable<Dt_StockInfoDetail> sugarQueryable1 = _dbBase.Queryable<Dt_StockInfoDetail>(); | 
|   | 
|                 string whereStoDe = GetDataRole(typeof(Dt_StockInfoDetail)); | 
|                 sugarQueryable1 = sugarQueryable1.Where(whereStoDe); | 
|   | 
|   | 
|                 string whereSto = GetDataRole(typeof(Dt_StockInfo)); | 
|                 ISugarQueryable<Dt_StockInfo> sugarQueryable = _dbBase.Queryable<Dt_StockInfo>().Where(whereSto); | 
|                 if (!string.IsNullOrEmpty(options.Wheres)) | 
|                 { | 
|                     try | 
|                     { | 
|                         List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>(); | 
|                         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<MaterielnfoStatisticsDTO> 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<string, MaterielnfoStatisticsDTO>(); | 
|                 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}"); | 
|             } | 
|         } | 
|     } | 
| } |