| using AngleSharp.Dom; | 
| using Mapster; | 
| using Masuit.Tools; | 
| using SqlSugar; | 
| using System.Collections.Generic; | 
| using System.Drawing.Printing; | 
| using System.Linq.Expressions; | 
| using WIDESEA_Core; | 
|   | 
| namespace WIDESEA_StorageBasicService; | 
|   | 
| public class StockInfoService : ServiceBase<DtStockInfo, IStockInfoRepository>, IStockInfoService | 
| { | 
|     public StockInfoService(IStockInfoRepository BaseDal) : base(BaseDal) | 
|     { | 
|     } | 
|   | 
|     /// <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; | 
|         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); | 
|             } | 
|         } | 
|   | 
|         var data = BaseDal.Db.Queryable<DtStockInfo>().IncludesAllFirstLayer().WhereIF(!wheres.IsNullOrEmpty(), wheres).WhereIF(locationStatus != null, locationStatus).WhereIF(roadwayNo != null, roadwayNo).OrderBy(orderByModels).ToPageList(options.Page, options.Rows, ref totalCount); | 
|         new PageGridData<DtStockInfo>(totalCount, data); | 
|         return new PageGridData<DtStockInfo>(totalCount, data); | 
|         //var data = base.GetPageData(options); | 
|         //foreach (var item in data.Rows) | 
|         //{ | 
|         //    if (item.IsFull) | 
|         //        item.Remark = item.StockInfoDetails.Count().ToString(); | 
|         //    else | 
|         //        item.Remark = "0"; | 
|         //} | 
|         //return 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>(); | 
|             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; | 
|                 location.LocationStatus = (int)LocationEnum.Free; | 
|                 locationInfos.Add(location); | 
|             } | 
|   | 
|             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; | 
|     } | 
| } |