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_DTO.Stock; using WIDESEA_IStockService; using WIDESEA_Model.Models; using WIDESEA_Core.Helper; using WIDESEA_Core.Utilities; using System.Reflection; using System.Dynamic; using Magicodes.ExporterAndImporter.Excel; using Magicodes.ExporterAndImporter.Core; using WIDESEA_Core.HostedService; using WIDESEA_Core.DB.Models; using WIDESEA_IOutboundRepository; using WIDESEA_IStockRepository; using WIDESEA_Common.StockEnum; using WIDESEA_IBasicRepository; using WIDESEA_Common.WareHouseEnum; namespace WIDESEA_StockService { public partial class ProStockViewService : IProStockViewService { private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly SqlSugarClient _dbBase; private readonly IOutboundRepository _outboundRepository; private readonly IStockRepository _stockRepository; private readonly IBasicRepository _basicRepository; public ProStockViewService(IUnitOfWorkManage unitOfWorkManage, IOutboundRepository outboundRepository, IStockRepository stockRepository,IBasicRepository basicRepository) { _unitOfWorkManage = unitOfWorkManage; _dbBase = unitOfWorkManage.GetDbClient(); _outboundRepository = outboundRepository; _stockRepository = stockRepository; _basicRepository = basicRepository; } public virtual PageGridData GetPageData(PageDataOptions options) { try { List stockViewDTOs = new List(); string where = string.Empty; ISugarQueryable sugarQueryable1 = _dbBase.Queryable().Includes(x => x.proStockInfoDetails); if (!string.IsNullOrEmpty(options.Wheres)) { try { List searchParametersList = options.Wheres.DeserializeObject>(); if (searchParametersList.Count > 0) { { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(searchParameters.Value))); } } { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductVersion).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductVersion.Contains(searchParameters.Value))); } } { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.SpecifyVer).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.SpecifyVer.Contains(searchParameters.Value))); } } } } catch { } } string whereSto = GetDataRole(typeof(Dt_ProStockInfo)); sugarQueryable1 = sugarQueryable1.Where(whereSto); EntityProperties.ValidatePageOptions(options, ref sugarQueryable1); string whereLo = GetDataRole(typeof(Dt_LocationInfo)); ISugarQueryable sugarQueryable = _dbBase.Queryable().Where(whereLo); EntityProperties.ValidatePageOptions(options, ref sugarQueryable); ISugarQueryable list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a) => new ProStockViewDTO { ProStockAttribute=b.ProStockAttribute, LocationCode = b.LocationCode, Column = a.Column, WarehouseId = b.WarehouseId, CreateDate = b.CreateDate, Creater = b.Creater, EnalbeStatus = a.EnableStatus, Layer = a.Layer, LocationName = a.LocationName, LocationStatus = a.LocationStatus, Modifier = b.Modifier, ModifyDate = b.ModifyDate, PalletCode = b.PalletCode, StockRemark = b.Remark, Row = a.Row, ProStockId = b.Id, StockStatus = b.StockStatus, Details = b.proStockInfoDetails, SumStocks=b.proStockInfoDetails.Sum(x=>x.StockPcsQty) }); var pklist = sugarQueryable1.Where(b => b.LocationCode == "成品待发货区" || b.LocationCode == "成品包装拣货区").Select(b => new ProStockViewDTO { ProStockAttribute = b.ProStockAttribute, LocationCode = b.LocationCode, WarehouseId = b.WarehouseId, CreateDate = b.CreateDate, Creater = b.Creater, LocationName = b.LocationCode, Modifier = b.Modifier, ModifyDate = b.ModifyDate, PalletCode = b.PalletCode, StockRemark = b.Remark, ProStockId = b.Id, StockStatus = b.StockStatus, Details = b.proStockInfoDetails, SumStocks = b.proStockInfoDetails.Sum(x => x.StockPcsQty) }); int totalCount = 0; int pktotalCount = 0; stockViewDTOs = list.ToPageList(options.Page, options.Rows, ref totalCount); stockViewDTOs.AddRange(pklist.ToPageList(options.Page, options.Rows, ref pktotalCount)); stockViewDTOs.ForEach(x => { x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct()); x.ProductVersion = string.Join(",", x.Details.Select(x => x.ProductVersion).Distinct()); x.SpecifyVer = string.Join(",", x.Details.Select(x => x.SpecifyVer).Distinct()); x.DateCode = x.Details.FirstOrDefault()?.DateCode ?? ""; x.LotNumber = x.Details.FirstOrDefault()?.LotNumber ?? ""; x.ERPOrder = x.Details.FirstOrDefault()?.ERPOrder ?? ""; x.SaleOrder= x.Details.FirstOrDefault()?.SaleOrder ?? ""; x.MoNumber = x.Details.FirstOrDefault()?.MoNumber ?? ""; } ); return new PageGridData(totalCount + pktotalCount, stockViewDTOs.OrderByDescending(x=>x.CreateDate).ToList()); } catch (Exception ex) { } return new PageGridData(); } public virtual object GetDetailPage(PageDataOptions pageData) { Type t = typeof(ProStockViewDTO); if (pageData.Value == null) return new PageGridData(total: 0, null); string keyName = t.GetKeyName(); ////生成查询条件 //Expression> whereExpression = keyName.CreateExpression(pageData.Value, LinqExpressionType.Equal); int totalCount = 0; PropertyInfo? propertyInfo = t.GetProperties().FirstOrDefault(x => x.GetCustomAttribute() != null); if (propertyInfo != null) { Type detailType = propertyInfo.PropertyType.GetGenericArguments()[0]; Navigate? navigate = propertyInfo.GetCustomAttribute(); if (navigate != null) { List list = _dbBase.Queryable(detailType.Name, "detail").Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount); return new PageGridData(totalCount, list); } } return new PageGridData(total: 0, null); } public virtual WebResponseContent Export(PageDataOptions options) { WebResponseContent content = new WebResponseContent(); try { Type t = typeof(ProStockViewDTO); string savePath = AppDomain.CurrentDomain.BaseDirectory + $"ExcelExport"; IExporter exporter = new ExcelExporter(); options.Page = 1; options.Rows = 30; options.Order = "desc"; options.Sort = "proStockId"; List stockViewDTOs = new List(); List warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.成品.ToString()); string where = string.Empty; ISugarQueryable sugarQueryable1 = _dbBase.Queryable().Includes(x => x.proStockInfoDetails); if (!string.IsNullOrEmpty(options.Wheres)) { try { List searchParametersList = options.Wheres.DeserializeObject>(); if (searchParametersList.Count > 0) { { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(searchParameters.Value))); } } { SearchParameters? searchParameters = searchParametersList.FirstOrDefault(x => x.Name == nameof(Dt_ProStockInfoDetail.ProductVersion).FirstLetterToLower()); if (searchParameters != null) { sugarQueryable1 = sugarQueryable1.Where(x => x.proStockInfoDetails.Any(v => v.ProductVersion.Contains(searchParameters.Value))); } } } } catch { } } string whereSto = GetDataRole(typeof(Dt_ProStockInfo)); sugarQueryable1 = sugarQueryable1.Where(whereSto); EntityProperties.ValidatePageOptions(options, ref sugarQueryable1); string whereLo = GetDataRole(typeof(Dt_LocationInfo)); ISugarQueryable sugarQueryable = _dbBase.Queryable().Where(whereLo); EntityProperties.ValidatePageOptions(options, ref sugarQueryable); ISugarQueryable list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).Select((b, a) => new ProStockViewDTO { ProStockAttribute = b.ProStockAttribute, LocationCode = b.LocationCode, Column = a.Column, WarehouseId = b.WarehouseId, CreateDate = b.CreateDate, Creater = b.Creater, EnalbeStatus = a.EnableStatus, Layer = a.Layer, LocationName = a.LocationName, LocationStatus = a.LocationStatus, Modifier = b.Modifier, ModifyDate = b.ModifyDate, PalletCode = b.PalletCode, StockRemark = b.Remark, Row = a.Row, ProStockId = b.Id, StockStatus = b.StockStatus, Details = b.proStockInfoDetails, SumStocks = b.proStockInfoDetails.Sum(x => x.StockPcsQty), }); //var pklist = sugarQueryable1.Where(b => b.LocationCode == "平库位").Select(b => new StockViewDTO //{ // LocationCode = b.LocationCode, // Column = 0, // WarehouseId = b.WarehouseId, // CreateDate = b.CreateDate, // Creater = b.Creater, // Depth = 0, // EnalbeStatus = EnableStatusEnum.Normal.ObjToInt(), // Layer = 0, // LocationName = "平库位", // LocationStatus = LocationStatusEnum.InStock.ObjToInt(), // LocationType = LocationTypeEnum.Undefined.ObjToInt(), // Modifier = b.Modifier, // ModifyDate = b.ModifyDate, // PalletCode = b.PalletCode, // StockRemark = b.Remark, // RoadwayNo = "平库", // Row = 0, // StockId = b.Id, // StockStatus = b.StockStatus, // Details = b.Details, //}); stockViewDTOs = list.ToList(); //stockViewDTOs.AddRange(pklist.ToList()); stockViewDTOs.ForEach(x => { x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct()); x.ProductVersion = string.Join(",", x.Details.Select(x => x.ProductVersion).Distinct()); x.SpecifyVer = string.Join(",", x.Details.Select(x => x.SpecifyVer).Distinct()); x.DateCode = x.Details.FirstOrDefault()?.DateCode ?? ""; x.LotNumber = x.Details.FirstOrDefault()?.LotNumber ?? ""; x.ERPOrder = x.Details.FirstOrDefault()?.ERPOrder ?? ""; x.SaleOrder = x.Details.FirstOrDefault()?.SaleOrder ?? ""; x.MoNumber = x.Details.FirstOrDefault()?.MoNumber ?? ""; x.StockRemark = warehouses.FirstOrDefault(v => v.WarehouseId == x.WarehouseId).WarehouseName; } ); byte[] data = exporter.ExportAsByteArray(stockViewDTOs).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"; } //UserRole? userRole = PermissionDataHostService.UserRoles.FirstOrDefault(x => x.UserId == App.User.UserId); //if (userRole == null) // throw new Exception($"无权限"); //if (userRole.AuthorityScope == (int)AuthorityScopeEnum.CurrentRole) //{ // List userId = PermissionDataHostService.UserRoles.Where(x => x.RoleId == userRole.RoleId).Select(x => x.UserId).ToList(); // return $"creater in ({userId.Serialize()})"; //} //else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.OnlySelf) //{ // return $"creater = '{userRole.UserName}'"; //} //else if (userRole.AuthorityScope == (int)AuthorityScopeEnum.None) //{ // return $"1 != 1"; //} //return ""; } catch (Exception ex) { throw new Exception($"无权限,{ex.Message}"); } } public List GetProPKSelectStocks(int orderId) { try { Dt_ProOutOrderDetail outOrderDetail = _outboundRepository.ProOutOrderDetailRepository.QueryFirst(x => x.Id == orderId); if (outOrderDetail == null) { throw new Exception($"未找到出库单明细"); } List stockViewDTOs = new List(); ISugarQueryable sugarQueryable1 = _dbBase.Queryable().Includes(x => x.proStockInfoDetails); var pklist = sugarQueryable1.Where(b => b.LocationCode == "成品待发货区" && b.StockStatus==StockStatusEmun.平库入库完成.ObjToInt() && (b.ShipmentOrder==null|| b.ShipmentOrder =="")).Where(x=>x.proStockInfoDetails.Any(v=>v.ProductCode== outOrderDetail.PCode)).Select(b => new ProStockViewDTO { ProStockAttribute = b.ProStockAttribute, LocationCode = b.LocationCode, WarehouseId = b.WarehouseId, CreateDate = b.CreateDate, Creater = b.Creater, LocationName = b.LocationCode, Modifier = b.Modifier, ModifyDate = b.ModifyDate, PalletCode = b.PalletCode, StockRemark = b.Remark, ProStockId = b.Id, StockStatus = b.StockStatus, Details = b.proStockInfoDetails, }); stockViewDTOs.AddRange(pklist.ToList()); stockViewDTOs.ForEach(x => { x.ProductCode = string.Join(",", x.Details.Select(x => x.ProductCode).Distinct()); x.ProductVersion = string.Join(",", x.Details.Select(x => x.ProductVersion).Distinct()); x.SpecifyVer = string.Join(",", x.Details.Select(x => x.SpecifyVer).Distinct()); x.DateCode = x.Details.FirstOrDefault()?.DateCode ?? ""; x.LotNumber = x.Details.FirstOrDefault()?.LotNumber ?? ""; x.ERPOrder = x.Details.FirstOrDefault()?.ERPOrder ?? ""; x.SaleOrder = x.Details.FirstOrDefault()?.SaleOrder ?? ""; x.MoNumber = x.Details.FirstOrDefault()?.MoNumber ?? ""; x.SumStocks = x.Details.Sum(x => x.StockPcsQty); } ); return stockViewDTOs.OrderBy(x => x.DateCode).ThenBy(x => x.CreateDate).ToList(); //return _stockRepository.ProStockInfoRepository.QueryTabs((a, b) => a.Id == b.ProStockId, (a, b) => new ProStockViewDTO //{ // LocationCode = a.LocationCode, // ProductCode = b.ProductCode, // ProStockAttribute = a.ProStockAttribute, // ProductVersion=b.ProductVersion, // DateCode=b.DateCode, // ProStockId=a.Id, // SumStocks=b.StockPcsQty, // SaleOrder=b.SaleOrder, // PalletCode = a.PalletCode, // CreateDate=a.CreateDate, // ERPOrder=b.ERPOrder, // MoNumber=b.MoNumber //}, a => a.LocationCode == "成品待发货区", b => b.ProductCode == outOrderDetail.PCode, x => true).GroupBy(x => x.PalletCode).Select(x => new ProStockViewDTO //{ // LocationCode = x.FirstOrDefault()?.LocationCode ?? "", // ProductCode = x.FirstOrDefault()?.ProductCode ?? "", // ProductVersion = x.FirstOrDefault()?.ProductVersion ?? "", // DateCode = x.FirstOrDefault()?.DateCode ?? "", // ProStockId = x.FirstOrDefault().ProStockId, // SumStocks=x.FirstOrDefault().SumStocks, // SaleOrder = x.FirstOrDefault()?.SaleOrder ?? "", // ProStockAttribute=x.FirstOrDefault()?.ProStockAttribute ?? 0, // PalletCode = x.Key, // ERPOrder=x.FirstOrDefault()?.ERPOrder ?? "", // MoNumber=x.FirstOrDefault()?.MoNumber ?? "", // CreateDate=x.FirstOrDefault()?.CreateDate ?? new DateTime() //}).ToList(); } catch (Exception ex) { throw new Exception(ex.Message); } } } }