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; 
 | 
using WIDESEA_Core.Enums; 
 | 
  
 | 
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<ProStockViewDTO> GetPageData(PageDataOptions options) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                List<ProStockViewDTO> stockViewDTOs = new List<ProStockViewDTO>(); 
 | 
  
 | 
                string where = string.Empty; 
 | 
                ISugarQueryable<Dt_ProStockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_ProStockInfo>().Includes(x => x.proStockInfoDetails); 
 | 
                if (!string.IsNullOrEmpty(options.Wheres)) 
 | 
                { 
 | 
                    try 
 | 
                    { 
 | 
                        List<SearchParameters> searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>(); 
 | 
                        if (searchParametersList?.Any() == true) 
 | 
                        { 
 | 
                            foreach (var param in searchParametersList) 
 | 
                            { 
 | 
                                switch (param.Name) 
 | 
                                { 
 | 
                                    case var name when name == nameof(Dt_ProStockInfoDetail.ProductCode).FirstLetterToLower(): 
 | 
                                        if (!string.IsNullOrEmpty(param.Value?.ToString())) 
 | 
                                        { 
 | 
                                            sugarQueryable1 = sugarQueryable1 
 | 
                                                .Where(x => x.proStockInfoDetails.Any(v => v.ProductCode.Contains(param.Value.ToString()))); 
 | 
                                        } 
 | 
                                        break; 
 | 
                                    case var name when name == nameof(Dt_ProStockInfoDetail.LotNumber).FirstLetterToLower(): 
 | 
                                        if (!string.IsNullOrEmpty(param.Value?.ToString())) 
 | 
                                        { 
 | 
                                            sugarQueryable1 = sugarQueryable1 
 | 
                                                .Where(x => x.proStockInfoDetails.Any(v => v.LotNumber.Contains(param.Value.ToString()))); 
 | 
                                        } 
 | 
                                        break; 
 | 
  
 | 
                                    case var name when name == nameof(Dt_ProStockInfo.LocationCode).FirstLetterToLower(): 
 | 
                                        if (!string.IsNullOrEmpty(param.Value?.ToString())) 
 | 
                                        { 
 | 
                                            sugarQueryable1 = sugarQueryable1 
 | 
                                                .Where(x => x.LocationCode == param.Value.ToString()); 
 | 
                                        } 
 | 
                                        break; 
 | 
                                    case var name when name == nameof(Dt_ProStockInfoDetail.ProductVersion).FirstLetterToLower(): 
 | 
                                        if (!string.IsNullOrEmpty(param.Value?.ToString())) 
 | 
                                        { 
 | 
                                            sugarQueryable1 = sugarQueryable1 
 | 
                                                .Where(x => x.proStockInfoDetails.Any(v => v.ProductVersion.Contains(param.Value.ToString()))); 
 | 
                                        } 
 | 
                                        break; 
 | 
                                    case var name when name == nameof(Dt_ProStockInfoDetail.SpecifyVer).FirstLetterToLower(): 
 | 
                                        if (!string.IsNullOrEmpty(param.Value?.ToString())) 
 | 
                                        { 
 | 
                                            sugarQueryable1 = sugarQueryable1 
 | 
                                                .Where(x => x.proStockInfoDetails.Any(v => v.SpecifyVer.Contains(param.Value.ToString()))); 
 | 
                                        } 
 | 
                                        break; 
 | 
  
 | 
                                    case var name when name == nameof(Dt_ProStockInfo.CreateDate).FirstLetterToLower(): 
 | 
                                        if (DateTime.TryParse(param.Value?.ToString(), out DateTime minDate)) 
 | 
                                        { 
 | 
                                            LinqExpressionType expressionType = param.DisplayType.GetLinqCondition(); 
 | 
                                            if (expressionType == LinqExpressionType.ThanOrEqual) 
 | 
                                            { 
 | 
                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate >= minDate); 
 | 
                                            } 
 | 
                                            else if (expressionType == LinqExpressionType.LessThanOrEqual) 
 | 
                                            { 
 | 
                                                sugarQueryable1 = sugarQueryable1.Where(x => x.CreateDate <= minDate); 
 | 
                                            } 
 | 
                                        } 
 | 
                                        break; 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                    } 
 | 
                    catch (Exception ex) 
 | 
                    { 
 | 
                    } 
 | 
                } 
 | 
                string whereSto = GetDataRole(typeof(Dt_ProStockInfo)); 
 | 
                sugarQueryable1 = sugarQueryable1.Where(whereSto); 
 | 
                EntityProperties.ValidatePageOptions(options, ref sugarQueryable1); 
 | 
  
 | 
                string whereLo = GetDataRole(typeof(Dt_LocationInfo)); 
 | 
                ISugarQueryable<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>().Where(whereLo); 
 | 
  
 | 
                EntityProperties.ValidatePageOptions(options, ref sugarQueryable); 
 | 
  
 | 
                ISugarQueryable<ProStockViewDTO> list = sugarQueryable1.InnerJoin(sugarQueryable, (b, a) => a.LocationCode == b.LocationCode).OrderByDescending(b => b.CreateDate).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<ProStockViewDTO>(totalCount + pktotalCount, stockViewDTOs.OrderByDescending(x=>x.CreateDate).ToList()); 
 | 
            } 
 | 
            catch (Exception ex) 
 | 
            { 
 | 
  
 | 
            } 
 | 
            return new PageGridData<ProStockViewDTO>(); 
 | 
        } 
 | 
  
 | 
        public virtual object GetDetailPage(PageDataOptions pageData) 
 | 
        { 
 | 
            Type t = typeof(ProStockViewDTO); 
 | 
  
 | 
            if (pageData.Value == null) return new PageGridData<object>(total: 0, null); 
 | 
            string keyName = t.GetKeyName(); 
 | 
            ////生成查询条件 
 | 
            //Expression<Func<TEntity, bool>> whereExpression = keyName.CreateExpression<TEntity>(pageData.Value, LinqExpressionType.Equal); 
 | 
            int totalCount = 0; 
 | 
            PropertyInfo? propertyInfo = t.GetProperties().FirstOrDefault(x => x.GetCustomAttribute<Navigate>() != null); 
 | 
            if (propertyInfo != null) 
 | 
            { 
 | 
                Type detailType = propertyInfo.PropertyType.GetGenericArguments()[0]; 
 | 
                Navigate? navigate = propertyInfo.GetCustomAttribute<Navigate>(); 
 | 
                if (navigate != null) 
 | 
                { 
 | 
                    List<ExpandoObject> list = _dbBase.Queryable(detailType.Name, "detail").Where(navigate.GetName(), "=", pageData.Value).ToPageList(pageData.Page, pageData.Rows, ref totalCount); 
 | 
                    return new PageGridData<ExpandoObject>(totalCount, list); 
 | 
                } 
 | 
            } 
 | 
            return new PageGridData<object>(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<ProStockViewDTO> stockViewDTOs = new List<ProStockViewDTO>(); 
 | 
                List<Dt_Warehouse> warehouses = _basicRepository.WarehouseRepository.QueryData(x => x.WarehouseType == WarehouseTypEnum.成品.ToString()); 
 | 
                string where = string.Empty; 
 | 
                ISugarQueryable<Dt_ProStockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_ProStockInfo>().Includes(x => x.proStockInfoDetails); 
 | 
                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_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<Dt_LocationInfo> sugarQueryable = _dbBase.Queryable<Dt_LocationInfo>().Where(whereLo); 
 | 
  
 | 
                EntityProperties.ValidatePageOptions(options, ref sugarQueryable); 
 | 
  
 | 
                ISugarQueryable<ProStockViewDTO> 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<int> 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<ProStockViewDTO> GetProPKSelectStocks(int orderId) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                Dt_ProOutOrderDetail outOrderDetail = _outboundRepository.ProOutOrderDetailRepository.QueryFirst(x => x.Id == orderId); 
 | 
                if (outOrderDetail == null) 
 | 
                { 
 | 
                    throw new Exception($"未找到出库单明细"); 
 | 
                } 
 | 
                List<ProStockViewDTO> stockViewDTOs = new List<ProStockViewDTO>(); 
 | 
                ISugarQueryable<Dt_ProStockInfo> sugarQueryable1 = _dbBase.Queryable<Dt_ProStockInfo>().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<Dt_ProStockInfo, Dt_ProStockInfoDetail, ProStockViewDTO>((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); 
 | 
            } 
 | 
        } 
 | 
    } 
 | 
} 
 |