using AngleSharp.Dom; 
 | 
using Mapster; 
 | 
using Masuit.Tools; 
 | 
using SqlSugar; 
 | 
using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using System.Drawing.Printing; 
 | 
using System.Linq.Expressions; 
 | 
using System.Threading.Tasks; 
 | 
using WIDESEA_Cache; 
 | 
using WIDESEA_Common; 
 | 
using WIDESEA_Core; 
 | 
  
 | 
namespace WIDESEA_StorageBasicService; 
 | 
  
 | 
public class StockInfoService : ServiceBase<DtStockInfo, IStockInfoRepository>, IStockInfoService 
 | 
{ 
 | 
  
 | 
    private readonly ISimpleCacheService _simpleCacheService; 
 | 
    private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository; 
 | 
    public StockInfoService(IStockInfoRepository BaseDal, ISimpleCacheService simpleCacheService, ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository) : base(BaseDal) 
 | 
    { 
 | 
        _simpleCacheService = simpleCacheService; 
 | 
        _locationStatusChangeRecordRepository = locationStatusChangeRecordRepository; 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 分页 
 | 
    /// </summary> 
 | 
    /// <param name="options"></param> 
 | 
    /// <returns></returns> 
 | 
    public override PageGridData<DtStockInfo> GetPageData(PageDataOptions options) 
 | 
    { 
 | 
        string wheres = ValidatePageOptions(options); 
 | 
        //获取排序字段 
 | 
        Dictionary<string, SqlSugar.OrderByType> orderbyDic = GetPageDataSort(options, TProperties); 
 | 
        List<OrderByModel> orderByModels = new List<OrderByModel>(); 
 | 
        foreach (var item in orderbyDic) 
 | 
        { 
 | 
            OrderByModel orderByModel = new() 
 | 
            { 
 | 
                FieldName = item.Key, 
 | 
                OrderByType = item.Value 
 | 
            }; 
 | 
            orderByModels.Add(orderByModel); 
 | 
        } 
 | 
  
 | 
  
 | 
        int totalCount = 0; 
 | 
        List<SearchParameters> searchParametersList = new List<SearchParameters>(); 
 | 
        if (!string.IsNullOrEmpty(options.Wheres)) 
 | 
        { 
 | 
            try 
 | 
            { 
 | 
                searchParametersList = options.Wheres.DeserializeObject<List<SearchParameters>>(); 
 | 
                options.Filter = searchParametersList; 
 | 
            } 
 | 
            catch { } 
 | 
        } 
 | 
  
 | 
        Expression<Func<DtStockInfo, bool>> locationStatus = null; 
 | 
        Expression<Func<DtStockInfo, bool>> roadwayNo = null; 
 | 
        Expression<Func<DtStockInfo, bool>> materielCode = null; 
 | 
        foreach (var item in searchParametersList) 
 | 
        { 
 | 
            if (item.Name.Contains("locationStatus")) 
 | 
            { 
 | 
                locationStatus = x => x.LocationInfo.LocationStatus == Convert.ToInt32(item.Value); 
 | 
            } 
 | 
            else if (item.Name.Contains("roadwayNo")) 
 | 
            { 
 | 
                roadwayNo = x => x.LocationInfo.RoadwayNo.Contains(item.Value); 
 | 
            } 
 | 
            else if (item.Name.Contains("materielCode")) 
 | 
            { 
 | 
                materielCode = x => x.StockInfoDetails.Any(d => d.MaterielCode.Contains(item.Value)); 
 | 
            } 
 | 
        } 
 | 
        //.IncludesAllFirstLayer() 
 | 
        var data = BaseDal.Db.Queryable<DtStockInfo>() 
 | 
            .Includes(x => x.StockInfoDetails) 
 | 
            .Includes(x => x.LocationInfo) 
 | 
            .WhereIF(!wheres.IsNullOrEmpty(), wheres) 
 | 
            .WhereIF(locationStatus != null, locationStatus) 
 | 
            .WhereIF(roadwayNo != null, roadwayNo) 
 | 
            .WhereIF(materielCode != null, materielCode) 
 | 
            .OrderBy(orderByModels) 
 | 
            .ToPageList(options.Page, options.Rows, ref totalCount); 
 | 
        new PageGridData<DtStockInfo>(totalCount, data); 
 | 
        return new PageGridData<DtStockInfo>(totalCount, data); 
 | 
    } 
 | 
  
 | 
    /// <summary> 
 | 
    /// 批量删除 
 | 
    /// </summary> 
 | 
    /// <param name="keys"></param> 
 | 
    /// <returns></returns> 
 | 
    public override WebResponseContent DeleteData(object[] keys) 
 | 
    { 
 | 
        try 
 | 
        { 
 | 
            List<DtStockInfo_Hty> stockInfos = new List<DtStockInfo_Hty>(); 
 | 
            List<DtLocationInfo> locationInfos = new List<DtLocationInfo>(); 
 | 
  
 | 
  
 | 
            var stocks = new List<string>(); 
 | 
  
 | 
            foreach (var item in keys) 
 | 
            { 
 | 
                var stock = BaseDal.QueryFirstNavAsync(x => x.Id == item.ObjToInt()).Result; 
 | 
                var stockHty = stock.Adapt<DtStockInfo_Hty>(); 
 | 
                stockInfos.Add(stockHty); 
 | 
  
 | 
                var location = SqlSugarHelper.DbWMS.Queryable<DtLocationInfo>().FirstAsync(x => x.Id == stock.LocationId).Result; 
 | 
                var lastStatus = location.LocationStatus; 
 | 
                location.LocationStatus = (int)LocationEnum.Free; 
 | 
                locationInfos.Add(location); 
 | 
                stocks.Add(stock.PalletCode); 
 | 
                _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, lastStatus, (int)StatusChangeTypeEnum.ManualOperation, 0); 
 | 
            } 
 | 
  
 | 
            var hty = BaseDal.Db.InsertNav(stockInfos) 
 | 
                .Include(x => x.StockInfoDetails) 
 | 
                .ExecuteCommand(); 
 | 
  
 | 
            var locationd = SqlSugarHelper.DbWMS.Updateable(locationInfos).ExecuteCommandHasChange(); 
 | 
            return base.DeleteData(keys); 
 | 
        } 
 | 
        catch (Exception ex) 
 | 
        { 
 | 
            return WebResponseContent.Instance.Error(ex.Message); 
 | 
        } 
 | 
    } 
 | 
  
 | 
    // 根据传入库存类型获取不同巷道的库存 
 | 
    public async Task<Dictionary<string, int>> GetLocationByStockType(bool stockType, string areaCode) 
 | 
    { 
 | 
        var stockInfos = await BaseDal.Db.Queryable<DtStockInfo>().Where(x => x.IsFull == stockType && x.AreaCode == areaCode) 
 | 
            .Includes(x => x.LocationInfo).ToListAsync(); 
 | 
  
 | 
        var result = stockInfos 
 | 
            .GroupBy(x => x.LocationInfo.RoadwayNo) 
 | 
            .ToDictionary(x => x.Key, x => x.Count()); 
 | 
        return result; 
 | 
    } 
 | 
} 
 |