| | |
| | | using AngleSharp.Dom; |
| | | using Dm; |
| | | using Mapster; |
| | | using Masuit.Tools; |
| | | using NewLife.Reflection; |
| | |
| | | using WIDESEA_Cache; |
| | | using WIDESEA_Common; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_DTO; |
| | | using WIDESEA_DTO.Basic; |
| | | using WIDESEA_DTO.Order; |
| | | using WIDESEA_DTO.Stock; |
| | | using WIDESEA_DTO.WMS; |
| | | using WIDESEA_IOrderRepository; |
| | | using WIDESEA_Model.Models; |
| | | using WIDESEA_Model.Models.Order; |
| | | using WIDESEA_OrderRepository; |
| | | using WIDESEA_StorageTaskRepository; |
| | | |
| | | namespace WIDESEA_StorageBasicService; |
| | | |
| | |
| | | private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository; |
| | | private readonly IDt_InboundOrderRepository _inboundOrderRepository; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IDt_OutboundOrderRepository _outorderRepository; |
| | | private readonly IDt_OutboundOrderDetailRepository _outorderdetailRepository; |
| | | private readonly IStockInfoDetailRepository _stockInfoDetailRepository; |
| | | private readonly IDt_TaskService _taskService; |
| | | private readonly ILocationInfoRepository _locationRepository; |
| | | private readonly IDt_TaskRepository _taskRepository; |
| | | private readonly IDt_OrderOutDetailsRepository _outDetailsRepository; |
| | | |
| | | public StockInfoService(IStockInfoRepository BaseDal, |
| | | ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository, |
| | | IDt_InboundOrderRepository inboundOrderRepository, |
| | | IUnitOfWorkManage unitOfWorkManage, |
| | | IDt_OutboundOrderRepository outorderRepository, |
| | | IDt_OutboundOrderDetailRepository outorderdetailRepository) : base(BaseDal) |
| | | IStockInfoDetailRepository stockInfoDetailRepository, |
| | | IDt_TaskService taskService, |
| | | ILocationInfoRepository locationRepository, |
| | | IDt_TaskRepository taskRepository, |
| | | IDt_OrderOutDetailsRepository outDetailsRepository) : base(BaseDal) |
| | | { |
| | | _locationStatusChangeRecordRepository = locationStatusChangeRecordRepository; |
| | | _inboundOrderRepository = inboundOrderRepository; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _outorderRepository = outorderRepository; |
| | | _outorderdetailRepository = outorderdetailRepository; |
| | | _stockInfoDetailRepository = stockInfoDetailRepository; |
| | | _taskService = taskService; |
| | | _locationRepository = locationRepository; |
| | | _taskRepository = taskRepository; |
| | | _outDetailsRepository = outDetailsRepository; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | return new PageGridData<DtStockInfo>(totalCount, data); |
| | | } |
| | | |
| | | public List<StockSelectViewDTO> GetStockSelectViews(string materielCode) |
| | | public List<DtLocationInfo> GetStockLocations(List<DtLocationInfo>? locations) |
| | | { |
| | | var stock = BaseDal.Db.Queryable<DtStockInfo>() |
| | | List<DtLocationInfo> locationsNew = new List<DtLocationInfo>(); |
| | | foreach (var item in locations) |
| | | { |
| | | if (item.AreaId == 1) |
| | | { |
| | | if (item.Depth == 2) |
| | | { |
| | | var locationLateral = _locationRepository.QueryFirst(x => x.Row == 1 && x.Column == item.Column && x.Layer == item.Layer); |
| | | |
| | | if (locationLateral.LocationStatus == (int)LocationEnum.Lock && locationLateral.EnalbeStatus == 1) |
| | | { |
| | | locationsNew.Remove(item); |
| | | continue; |
| | | } |
| | | } |
| | | locationsNew.Add(item); |
| | | } |
| | | else if (item.AreaId == 2) |
| | | { |
| | | var locationLateral = _locationRepository.QueryData(x => x.Row == item.Row && x.Column > item.Column && x.Remark == item.Remark); |
| | | |
| | | foreach (var Lateral in locationLateral) |
| | | { |
| | | if (Lateral.LocationStatus == (int)LocationEnum.Lock && Lateral.EnalbeStatus == 1) |
| | | { |
| | | locationsNew.Remove(item); |
| | | continue; |
| | | } |
| | | locationsNew.Add(item); |
| | | } |
| | | } |
| | | |
| | | else if (item.AreaId == 5 || item.AreaId == 6) |
| | | { |
| | | var locationLateral = _locationRepository.QueryData(x => x.Row == item.Row && x.Column < item.Column && x.Remark == item.Remark); |
| | | |
| | | foreach (var lateral in locationLateral) |
| | | { |
| | | if (lateral.LocationStatus == (int)LocationEnum.Lock && lateral.EnalbeStatus == 1) |
| | | { |
| | | locationsNew.Remove(item); |
| | | continue; |
| | | } |
| | | locationsNew.Add(item); |
| | | } |
| | | } |
| | | } |
| | | return locationsNew; |
| | | } |
| | | |
| | | #region åºåè§å¾ |
| | | public List<StockSelectViewDTO> GetStockSelectViews(GetStockSelectViewDto viewDto) |
| | | { |
| | | var stocks = BaseDal.Db.Queryable<DtStockInfo>() |
| | | .Includes(x => x.StockInfoDetails) |
| | | .Includes(x => x.LocationInfo) |
| | | .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) |
| | | .Where(x => x.StockInfoDetails.Any(d => d.MaterielCode == materielCode && d.Quantity > 0)).ToList().OrderBy(x=>x.CreateDate); |
| | | .Where(x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0 && d.Quantity > d.OutboundQuantity)).ToList().OrderBy(x => x.CreateDate); |
| | | |
| | | var result = stock.Select(s => new StockSelectViewDTO |
| | | List<DtLocationInfo> locationInfos = new List<DtLocationInfo>(); |
| | | List<DtStockInfo> stockNew = new List<DtStockInfo>(); |
| | | if (stocks != null || stocks.Count() > 0) |
| | | { |
| | | var locations = stocks.Select(s => s.LocationInfo).ToList(); |
| | | locationInfos = GetStockLocations(locations).Distinct().ToList(); |
| | | stockNew = stocks.Where(s => s.LocationInfo != null && locationInfos.Contains(s.LocationInfo)).ToList(); |
| | | } |
| | | |
| | | var result = stockNew.Select(s => new StockSelectViewDTO |
| | | { |
| | | MaterielCode = s.StockInfoDetails |
| | | .FirstOrDefault(d => d.MaterielCode == materielCode)?.MaterielCode ?? string.Empty, |
| | | .FirstOrDefault(d => d.MaterielCode == viewDto.materielCode)?.MaterielCode ?? string.Empty, |
| | | |
| | | MaterielName = s.StockInfoDetails |
| | | .FirstOrDefault(d => d.MaterielCode == materielCode)?.MaterielName ?? string.Empty, |
| | | .FirstOrDefault(d => d.MaterielCode == viewDto.materielCode)?.MaterielName ?? string.Empty, |
| | | |
| | | UseableQuantity = s.StockInfoDetails |
| | | .Where(d => d.MaterielCode == materielCode && d.Quantity > 0) |
| | | .Sum(d => (decimal?)d.Quantity) ?? 0, // å¤çç©ºå¼æ
åµ |
| | | .Where(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0 && d.Quantity > d.OutboundQuantity) |
| | | .Sum(d => (decimal?)d.Quantity - d.OutboundQuantity) ?? 0, // å¤çç©ºå¼æ
åµ |
| | | |
| | | PalletCode = s.PalletCode ?? string.Empty, |
| | | LocationCode = s.LocationInfo?.LocationCode ?? string.Empty |
| | |
| | | return result; |
| | | } |
| | | |
| | | #region æ ¹æ®åæ®æç»çæåºåºä»»å¡ |
| | | |
| | | public WebResponseContent GenerateOutboundTask(GenerateOutTaskDto requestOut) |
| | | public WebResponseContent GetStockView(GetStockSelectViewDto viewDto) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | List<RequestTaskDto> taskDtos = new List<RequestTaskDto>(); |
| | | Dt_OutboundOrder outboundOrder = _outorderRepository.QueryFirst(x => x.Id == requestOut.orderId); |
| | | |
| | | if (outboundOrder == null) |
| | | Expression<Func<DtStockInfoDetail, bool>> expressionOrder = x => true; |
| | | if (!string.IsNullOrEmpty(viewDto.materielCode)) |
| | | { |
| | | throw new Exception("æªæ¾å°åºåºåæç»ä¿¡æ¯!"); |
| | | expressionOrder = x => x.MaterielCode.Contains(viewDto.materielCode); |
| | | } |
| | | List<DtStockInfo>? stockInfos = null; |
| | | Dt_OutboundOrderDetail? orderDetail = null; |
| | | List<DtLocationInfo>? locationInfos = null; |
| | | if (outboundOrder.OrderStatus != OrderStateEmun.已宿.ObjToInt()) |
| | | int count = 0; |
| | | count = BaseDal.Db.Queryable<DtStockInfo>() |
| | | .Includes(x => x.StockInfoDetails) |
| | | .Includes(x => x.LocationInfo) |
| | | .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) |
| | | .WhereIF(!viewDto.materielCode.IsNullOrEmpty(), x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0)).ToList().OrderBy(x => x.CreateDate).Count(); |
| | | |
| | | |
| | | int maxPage = Convert.ToInt32(Math.Ceiling(count / 10.0)); |
| | | if (viewDto.pageNo <= maxPage) |
| | | { |
| | | return content.Error("该åºåºåå·²å®æï¼æ æ³çæåºåºä»»å¡"); |
| | | var stocks = BaseDal.Db.Queryable<DtStockInfo>() |
| | | .Includes(x => x.StockInfoDetails) |
| | | .Includes(x => x.LocationInfo) |
| | | .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock |
| | | && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) |
| | | .WhereIF(!viewDto.materielCode.IsNullOrEmpty(), |
| | | x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0)) |
| | | .Select(x => new DtStockInfo |
| | | { |
| | | Id = x.Id, |
| | | PalletCode = x.PalletCode, |
| | | LocationCode = x.LocationCode, |
| | | StockInfoDetails = x.StockInfoDetails |
| | | .OrderByDescending(d => d.CreateDate) |
| | | .Take(1) |
| | | .ToList(), |
| | | LocationInfo = x.LocationInfo |
| | | }) |
| | | .OrderBy(x => x.CreateDate) |
| | | .ToList(); |
| | | |
| | | List<DtLocationInfo> locationInfos = new List<DtLocationInfo>(); |
| | | List<DtStockInfo> stockNew = new List<DtStockInfo>(); |
| | | if (stocks != null || stocks.Count() > 0) |
| | | { |
| | | var locations = stocks.Select(s => s.LocationInfo).ToList(); |
| | | locationInfos = GetStockLocations(locations).Distinct().ToList(); |
| | | stockNew = stocks.Where(s => s.LocationInfo != null && locationInfos.Contains(s.LocationInfo)).ToList(); |
| | | } |
| | | |
| | | var result = stockNew.Skip((maxPage-1) * 10).Take(10).Select(s => new StockSelectViewDTO |
| | | { |
| | | Id =s.Id, |
| | | |
| | | MaterielCode = s.StockInfoDetails |
| | | .FirstOrDefault()?.MaterielCode ?? string.Empty, |
| | | |
| | | MaterielName = s.StockInfoDetails |
| | | .FirstOrDefault()?.MaterielName ?? string.Empty, |
| | | |
| | | Quantity = s.StockInfoDetails |
| | | .FirstOrDefault()?.Quantity ?? 0, // å¤çç©ºå¼æ
åµ |
| | | |
| | | PalletCode = s.PalletCode ?? string.Empty, |
| | | |
| | | LocationCode = s.LocationInfo?.LocationCode ?? string.Empty |
| | | }).ToList(); |
| | | |
| | | content = WebResponseContent.Instance.OK(data: result); |
| | | } |
| | | else |
| | | { |
| | | if (requestOut.stockViews.Count == 0) |
| | | { |
| | | var stocks = BaseDal.Db.Queryable<DtStockInfo>() |
| | | .Includes(x => x.StockInfoDetails) |
| | | .Includes(x => x.LocationInfo) |
| | | .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock |
| | | && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable) |
| | | .WhereIF(!viewDto.materielCode.IsNullOrEmpty(), |
| | | x => x.StockInfoDetails.Any(d => d.MaterielCode == viewDto.materielCode && d.Quantity > 0)) |
| | | .Select(x => new DtStockInfo |
| | | { |
| | | Id = x.Id, |
| | | PalletCode = x.PalletCode, |
| | | LocationCode = x.LocationCode, |
| | | StockInfoDetails = x.StockInfoDetails |
| | | .OrderByDescending(d => d.CreateDate) |
| | | .Take(1) |
| | | .ToList(), |
| | | LocationInfo = x.LocationInfo |
| | | }) |
| | | .OrderBy(x => x.CreateDate) |
| | | .ToList(); |
| | | |
| | | } |
| | | else |
| | | List<DtLocationInfo> locationInfos = new List<DtLocationInfo>(); |
| | | List<DtStockInfo> stockNew = new List<DtStockInfo>(); |
| | | if (stocks != null || stocks.Count() > 0) |
| | | { |
| | | foreach (var item in requestOut.stockViews) |
| | | { |
| | | decimal availableQuantity = item.UseableQuantity; |
| | | if (availableQuantity <= 0) |
| | | { |
| | | continue; // æ å¯ç¨åºåï¼ç»§ç»ä¸ä¸ä¸ª |
| | | } |
| | | var stock = BaseDal.QueryFirst(x => x.LocationCode == item.LocationCode && x.PalletCode == item.PalletCode); |
| | | // åå»ºä»»å¡ |
| | | RequestTaskDto task = new RequestTaskDto |
| | | { |
| | | TaskType = outboundOrder.OrderStatus, |
| | | OrderNo = outboundOrder.OrderNo, |
| | | MaterielCode = item.MaterielCode, |
| | | Position = item.LocationCode, |
| | | }; |
| | | taskDtos.Add(task); |
| | | } |
| | | var locations = stocks.Select(s => s.LocationInfo).ToList(); |
| | | locationInfos = GetStockLocations(locations).Distinct().ToList(); |
| | | stockNew = stocks.Where(s => s.LocationInfo != null && locationInfos.Contains(s.LocationInfo)).ToList(); |
| | | } |
| | | |
| | | var result = stockNew.Skip(0 * 10).Take(10).Select(s => new StockSelectViewDTO |
| | | { |
| | | Id = s.Id, |
| | | |
| | | MaterielCode = s.StockInfoDetails |
| | | .FirstOrDefault()?.MaterielCode ?? string.Empty, |
| | | |
| | | MaterielName = s.StockInfoDetails |
| | | .FirstOrDefault()?.MaterielName ?? string.Empty, |
| | | |
| | | Quantity = s.StockInfoDetails |
| | | .FirstOrDefault()?.Quantity ?? 0, // å¤çç©ºå¼æ
åµ |
| | | |
| | | PalletCode = s.PalletCode ?? string.Empty, |
| | | |
| | | LocationCode = s.LocationInfo?.LocationCode ?? string.Empty |
| | | }).ToList(); |
| | | |
| | | content = WebResponseContent.Instance.OK(data: result); |
| | | } |
| | | return content.OK("åºåºä»»å¡çææå"); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return content.Error(ex.Message); |
| | | content = WebResponseContent.Instance.Error($"æ¥è¯¢åºåºåæ®é误,é误信æ¯:{ex.Message}"); |
| | | } |
| | | |
| | | return content; |
| | | } |
| | | |
| | | #endregion æ ¹æ®åæ®æç»çæåºåºä»»å¡ |
| | | #endregion |
| | | |
| | | #region å
¶ä»åºåºè§å¾ |
| | | public List<StockSelectViewDTO> GetOtherOutBoundView(int id) |
| | | { |
| | | DtStockInfo stock = BaseDal.Db.Queryable<DtStockInfo>() |
| | | .Includes(x => x.StockInfoDetails) |
| | | .Includes(x => x.LocationInfo) |
| | | .Where(x => x.Id == id) |
| | | .Where(x => x.LocationInfo.LocationStatus == (int)LocationEnum.InStock && x.LocationInfo.EnalbeStatus == (int)EnableEnum.Enable).First(); |
| | | |
| | | List<DtLocationInfo> locationInfos = new List<DtLocationInfo>(); |
| | | List<DtStockInfo> stockNew = new List<DtStockInfo>(); |
| | | if (stock != null) |
| | | { |
| | | if (_taskService.LocationIsOutBound(stock.LocationInfo)) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | var result = stock.StockInfoDetails.Select(s => new StockSelectViewDTO |
| | | { |
| | | MaterielCode = s.MaterielCode ?? string.Empty, |
| | | |
| | | MaterielName = s.MaterielName ?? string.Empty, |
| | | |
| | | Quantity = s.Quantity, // å¤çç©ºå¼æ
åµ |
| | | |
| | | PalletCode = stock.PalletCode ?? string.Empty, |
| | | |
| | | LocationCode = stock.LocationCode ?? string.Empty |
| | | }).ToList(); |
| | | |
| | | return result; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region ç»ç |
| | | public async Task<WebResponseContent> AddGroupPlateAsync(GroupPlate groupPlate) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | |
| | | return content.Error(ex.Message); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region è§£ç |
| | | public async Task<WebResponseContent> DeleteGroupPlateAsync(GroupPlate groupPlate) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | #endregion |
| | | } |