| | |
| | | using AngleSharp.Dom; |
| | | using Dm; |
| | | using Mapster; |
| | | using Masuit.Tools; |
| | | using NewLife.Reflection; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Math; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; |
| | | using SqlSugar; |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using System.Drawing.Printing; |
| | | using System.Linq.Expressions; |
| | | using System.Threading.Tasks; |
| | | using System.Xml.Linq; |
| | | using WIDESEA_Cache; |
| | | using WIDESEA_Common; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.Enums; |
| | | using WIDESEA_Core.Helper; |
| | | using WIDESEA_DTO; |
| | | using WIDESEA_DTO.Basic; |
| | | using WIDESEA_DTO.Order; |
| | | using WIDESEA_DTO.Stock; |
| | | using WIDESEA_DTO.WMS; |
| | | using WIDESEA_IOrderRepository; |
| | | using WIDESEA_IOrderServices; |
| | | using WIDESEA_Model.Models; |
| | | using WIDESEA_Model.Models.Order; |
| | | using WIDESEA_OrderRepository; |
| | | using WIDESEA_StorageTaskRepository; |
| | | using JsonSerializer = System.Text.Json.JsonSerializer; |
| | | |
| | | namespace WIDESEA_StorageBasicService; |
| | | |
| | | public class StockInfoService : ServiceBase<DtStockInfo, IStockInfoRepository>, IStockInfoService |
| | | { |
| | | private readonly ILocationStatusChangeRecordRepository _locationStatusChangeRecordRepository; |
| | | public StockInfoService(IStockInfoRepository BaseDal, ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository) : base(BaseDal) |
| | | private readonly IDt_InboundOrderRepository _inboundOrderRepository; |
| | | private readonly IDt_InboundOrderService _inboundOrderService; |
| | | private readonly IUnitOfWorkManage _unitOfWorkManage; |
| | | private readonly IStockInfoDetailRepository _stockInfoDetailRepository; |
| | | private readonly IDt_TaskService _taskService; |
| | | private readonly ILocationInfoRepository _locationRepository; |
| | | private readonly IDt_TaskRepository _taskRepository; |
| | | private readonly IDt_Task_HtyRepository _task_HtyRepository; |
| | | private readonly IDt_OrderOutDetailsRepository _outDetailsRepository; |
| | | |
| | | public StockInfoService(IStockInfoRepository BaseDal, |
| | | ILocationStatusChangeRecordRepository locationStatusChangeRecordRepository, |
| | | IDt_InboundOrderRepository inboundOrderRepository, |
| | | IUnitOfWorkManage unitOfWorkManage, |
| | | IStockInfoDetailRepository stockInfoDetailRepository, |
| | | IDt_TaskService taskService, |
| | | ILocationInfoRepository locationRepository, |
| | | IDt_TaskRepository taskRepository, |
| | | IDt_OrderOutDetailsRepository outDetailsRepository, |
| | | IDt_Task_HtyRepository task_HtyRepository, |
| | | IDt_InboundOrderService inboundOrderService) : base(BaseDal) |
| | | { |
| | | _locationStatusChangeRecordRepository = locationStatusChangeRecordRepository; |
| | | _inboundOrderRepository = inboundOrderRepository; |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoDetailRepository = stockInfoDetailRepository; |
| | | _taskService = taskService; |
| | | _locationRepository = locationRepository; |
| | | _taskRepository = taskRepository; |
| | | _outDetailsRepository = outDetailsRepository; |
| | | _task_HtyRepository = task_HtyRepository; |
| | | _inboundOrderService = inboundOrderService; |
| | | } |
| | | |
| | | #region æ¹æ³éå |
| | | /// <summary> |
| | | /// å页 |
| | | /// </summary> |
| | |
| | | |
| | | Expression<Func<DtStockInfo, bool>> locationStatus = null; |
| | | Expression<Func<DtStockInfo, bool>> floor = null; |
| | | Expression<Func<DtStockInfo, bool>> areaId = null; |
| | | Expression<Func<DtStockInfo, bool>> materielCode = null; |
| | | Expression<Func<DtStockInfo, bool>> materielName = null; |
| | | foreach (var item in searchParametersList) |
| | | { |
| | | if (item.Name.Contains("locationStatus")) |
| | |
| | | { |
| | | floor = x => x.LocationInfo.Floor.Contains(item.Value); |
| | | } |
| | | else if (item.Name.Contains("areaId")) |
| | | { |
| | | areaId = x => x.LocationInfo.AreaId == Convert.ToInt32(item.Value); |
| | | } |
| | | else if (item.Name.Contains("materielCode")) |
| | | { |
| | | materielCode = x => x.StockInfoDetails.Any(d => d.MaterielCode.Contains(item.Value)); |
| | | } |
| | | else if (item.Name.Contains("materielName")) |
| | | { |
| | | materielName = x => x.StockInfoDetails.Any(d => d.MaterielName.Contains(item.Value)); |
| | | } |
| | | } |
| | | //.IncludesAllFirstLayer() |
| | | var data = BaseDal.Db.Queryable<DtStockInfo>() |
| | |
| | | .WhereIF(!wheres.IsNullOrEmpty(), wheres) |
| | | .WhereIF(locationStatus != null, locationStatus) |
| | | .WhereIF(floor != null, floor) |
| | | .WhereIF(areaId != null, areaId) |
| | | .WhereIF(materielCode != null, materielCode) |
| | | .WhereIF(materielName != null, materielName) |
| | | .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) |
| | | public override WebResponseContent UpdateData(SaveModel saveModel) |
| | | { |
| | | var remark = saveModel.MainData["remark"].ToString(); |
| | | var palletCode = saveModel.MainData["palletCode"].ToString(); |
| | | List<DtStockInfoDetail> details = DeserializeList<DtStockInfoDetail>(saveModel.DetailData); |
| | | if (remark == "è°æ¨åºåº") |
| | | { |
| | | return _taskService.HandAllocateOutBoundTaskAsync(details).Result; |
| | | } |
| | | else if (remark == "å
¶ä»åºåº") |
| | | { |
| | | return _taskService.OtherOutBoundTaskAsync(details).Result; |
| | | } |
| | | else |
| | | { |
| | | return WebResponseContent.Instance.Error("ç³»ç»å¼å¸¸"); |
| | | } |
| | | } |
| | | public List<T> DeserializeList<T>(List<Dictionary<string, object>> rawData) |
| | | { |
| | | if (rawData == null) return new List<T>(); |
| | | var processedData = rawData.Select(dict => |
| | | { |
| | | var newDict = new Dictionary<string, object>(); |
| | | foreach (var kvp in dict) |
| | | { |
| | | var newKey = char.ToUpper(kvp.Key[0]) + kvp.Key.Substring(1); |
| | | newDict[newKey] = kvp.Value; |
| | | } |
| | | return newDict; |
| | | }).ToList(); |
| | | var json = JsonSerializer.Serialize(processedData); |
| | | return JsonSerializer.Deserialize<List<T>>(json); |
| | | } |
| | | |
| | | public List<DtLocationInfo> GetStockLocations(List<DtLocationInfo>? locations) |
| | | { |
| | | 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 || item.AreaId == 7) |
| | | { |
| | | 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; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #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 == viewDto.materielCode && d.Quantity > 0 && d.Quantity > d.OutboundQuantity)).ToList().OrderBy(x => x.CreateDate); |
| | | |
| | | 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 == viewDto.materielCode)?.MaterielCode ?? string.Empty, |
| | | |
| | | MaterielName = s.StockInfoDetails |
| | | .FirstOrDefault(d => d.MaterielCode == viewDto.materielCode)?.MaterielName ?? string.Empty, |
| | | |
| | | UseableQuantity = s.StockInfoDetails |
| | | .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 |
| | | }).ToList(); |
| | | |
| | | return result; |
| | | } |
| | | |
| | | public WebResponseContent GetStockView(GetStockSelectViewDto viewDto) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | List<DtStockInfo_Hty> stockInfos = new List<DtStockInfo_Hty>(); |
| | | List<DtLocationInfo> locationInfos = new List<DtLocationInfo>(); |
| | | |
| | | foreach (var item in keys) |
| | | Expression<Func<DtStockInfoDetail, bool>> expressionOrder = x => true; |
| | | if (!string.IsNullOrEmpty(viewDto.materielCode)) |
| | | { |
| | | 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.LocationCode == stock.LocationCode).Result; |
| | | var lastStatus = location.LocationStatus; |
| | | location.LocationStatus = (int)LocationEnum.Free; |
| | | locationInfos.Add(location); |
| | | _locationStatusChangeRecordRepository.AddLocationStatusChangeRecord(location, lastStatus, (int)StatusChangeTypeEnum.ManualOperation, 0); |
| | | expressionOrder = x => x.MaterielCode.Contains(viewDto.materielCode); |
| | | } |
| | | //var hty = BaseDal.Db.InsertNav(stockInfos) |
| | | // .Include(x => x.StockInfoDetails) |
| | | // .ExecuteCommand(); |
| | | var isStockAdd = SqlSugarHelper.DbWMS.InsertNav(stockInfos).IncludesAllFirstLayer().ExecuteCommandAsync(); |
| | | 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(); |
| | | |
| | | var locationd = SqlSugarHelper.DbWMS.Updateable(locationInfos).ExecuteCommandHasChange(); |
| | | return base.DeleteData(keys); |
| | | |
| | | int maxPage = Convert.ToInt32(Math.Ceiling(count / 10.0)); |
| | | if (viewDto.pageNo <= maxPage) |
| | | { |
| | | 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 |
| | | { |
| | | 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(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); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | content = WebResponseContent.Instance.Error($"æ¥è¯¢åºåºåæ®é误,é误信æ¯:{ex.Message}"); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | #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> GetStockData() |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | var stocks = await _stockInfoDetailRepository.QueryDataAsync(x => true); |
| | | var orderdetail = SqlSugarHelper.DbWMS.Queryable<Dt_OrderOutDetails_Hty>().Where(x => true).ToList(); |
| | | var task = _taskRepository.QueryData(x => true).ToList(); |
| | | |
| | | // è·åUTCå½åæ¶é´ |
| | | DateTime utcNow = DateTime.UtcNow; |
| | | |
| | | // 计ç®å½ææ¶é´èå´ |
| | | DateTime firstDayOfMonth = new DateTime(utcNow.Year, utcNow.Month, 1); |
| | | DateTime lastDayOfMonth = firstDayOfMonth.AddMonths(1).AddSeconds(-1); |
| | | |
| | | // 计ç®ä¸ææ¶é´èå´ |
| | | DateTime firstDayOfLastMonth = new DateTime(utcNow.Year, utcNow.Month, 1).AddMonths(-1); |
| | | DateTime lastDayOfLastMonth = firstDayOfLastMonth.AddMonths(1).AddSeconds(-1); |
| | | |
| | | // 计ç®å½å¤©æ¶é´èå´ |
| | | DateTime todayStart = utcNow.Date; |
| | | DateTime todayEnd = todayStart.AddDays(1).AddTicks(-1); |
| | | |
| | | // è®¡ç®æ¨æ¥æ¶é´èå´ |
| | | DateTime startOfPreviousDay = utcNow.AddDays(-1).Date; // åä¸å¤©ç 00:00:00 |
| | | DateTime endOfPreviousDay = startOfPreviousDay.AddDays(1).AddSeconds(-1); |
| | | |
| | | // æ¥è¯¢å½ææ°æ® |
| | | var currentMonthInStocks = stocks.Where(x => x.CreateDate >= firstDayOfMonth && x.CreateDate <= lastDayOfMonth).Sum(x => x.Quantity); |
| | | var currentMonthOutStocks = orderdetail.Where(x => x.CreateDate >= firstDayOfMonth && x.CreateDate <= lastDayOfMonth).Sum(x => x.OutboundQuantity); |
| | | |
| | | //æ¥è¯¢ä¸ææ°æ® |
| | | var currentMonthInStocksLastMonth = stocks.Where(x => x.CreateDate >= firstDayOfLastMonth && x.CreateDate <= lastDayOfLastMonth).Sum(x => x.Quantity); |
| | | var currentMonthOutStocksLastMonth = orderdetail.Where(x => x.CreateDate >= firstDayOfLastMonth && x.CreateDate <= lastDayOfLastMonth).Sum(x => x.OutboundQuantity); |
| | | |
| | | // æ¥è¯¢ä»æ¥æ°æ® |
| | | var currentDayInStocks = stocks.Where(x => x.CreateDate >= todayStart && x.CreateDate <= todayEnd).Sum(x => x.Quantity); |
| | | var currentDayOutStocks = orderdetail.Where(x => x.CreateDate >= todayStart && x.CreateDate <= todayEnd).Sum(x => x.OutboundQuantity); |
| | | |
| | | // æ¥è¯¢æ¨å¤©æ¥æ°æ® |
| | | var currentDayInStocksLast = stocks.Where(x => x.CreateDate >= startOfPreviousDay && x.CreateDate <= endOfPreviousDay).Sum(x => x.Quantity); |
| | | var currentDayOutStocksLast = orderdetail.Where(x => x.CreateDate >= startOfPreviousDay && x.CreateDate <= endOfPreviousDay).Sum(x => x.OutboundQuantity); |
| | | |
| | | // çææè¿7天çåºå
¥åºæ°æ® |
| | | var last7Days = Enumerable.Range(0, 7) |
| | | .Select(i => utcNow.Date.AddDays(-i)) |
| | | .OrderBy(x => x) |
| | | .ToList(); |
| | | |
| | | var monthDays = Enumerable.Range(1, DateTime.DaysInMonth(utcNow.Year, utcNow.Month)) |
| | | .Select(day => new DateTime(utcNow.Year, utcNow.Month, day)) |
| | | .Where(date => date <= utcNow.Date) // åªå
å«å°ä»å¤©ä¸ºæ¢çæ¥æ |
| | | .ToList(); |
| | | |
| | | var inboundData = last7Days.Select(date => new |
| | | { |
| | | Date = date.ToString("MM-dd"), |
| | | Value = stocks.Where(x => x.CreateDate.Date == date).Sum(x => x.Quantity), |
| | | }).ToList(); |
| | | |
| | | var outboundData = last7Days.Select(date => new |
| | | { |
| | | Date = date.ToString("MM-dd"), |
| | | Value = orderdetail.Where(x => x.CreateDate.Date == date).Sum(x => x.OutboundQuantity) |
| | | }).ToList(); |
| | | |
| | | var MonthSumData = monthDays.Select(date => new |
| | | { |
| | | Date = date.ToString("MM-dd"), |
| | | InValue = stocks.Where(x => x.CreateDate.Date == date).Sum(x => x.Quantity), |
| | | OutValue = orderdetail.Where(x => x.CreateDate.Date == date).Sum(x => x.OutboundQuantity) |
| | | }).ToList(); |
| | | |
| | | object obj = new |
| | | { |
| | | metrics = new List<object>{ |
| | | new { |
| | | name = "仿¥è¿åºé", |
| | | value = currentDayInStocks, |
| | | compare =currentDayInStocks-currentDayInStocksLast, |
| | | }, |
| | | new { |
| | | name = "仿¥åºåºé", |
| | | value = currentDayOutStocks, |
| | | compare =currentDayOutStocks-currentDayOutStocksLast, |
| | | }, |
| | | new { |
| | | name = "æ¬æè¿åºé", |
| | | value = currentMonthInStocks, |
| | | compare =currentMonthInStocks-currentMonthInStocksLastMonth, |
| | | }, |
| | | new { |
| | | name = "æ¬æåºåºé", |
| | | value = currentMonthOutStocks, |
| | | compare = currentMonthOutStocks - currentMonthOutStocksLastMonth, |
| | | }, |
| | | new { |
| | | name = "åºåæ»é", |
| | | value = stocks.Sum(x => x.Quantity) |
| | | } |
| | | }, |
| | | outbound = new |
| | | { |
| | | dates = outboundData.Select(x => x.Date).ToArray(), |
| | | values = outboundData.Select(x => x.Value).ToArray() |
| | | }, |
| | | inbound = new |
| | | { |
| | | dates = inboundData.Select(x => x.Date).ToArray(), |
| | | values = inboundData.Select(x => x.Value).ToArray() |
| | | }, |
| | | monthData = new |
| | | { |
| | | dates = MonthSumData.Select(x => x.Date).ToArray(), |
| | | inValue = MonthSumData.Select(x => x.InValue).ToArray(), |
| | | outValue = MonthSumData.Select(x => x.OutValue).ToArray(), |
| | | }, |
| | | newTask = task.Select(x => new |
| | | { |
| | | x.PalletCode, |
| | | x.Roadway, |
| | | x.SourceAddress, |
| | | x.TargetAddress, |
| | | x.ErrorMessage, |
| | | x.CreateDate, |
| | | TaskType = EnumHelper.GetDescriptionFromEnums(x.TaskType, typeof(TaskOutboundTypeEnum), typeof(TaskInboundTypeEnum), typeof(TaskAcrossFloorTypeEnum), typeof(TaskRelocationTypeEnum), typeof(TaskAGVCarryTypeEnum)), |
| | | TaskState = EnumHelper.GetDescriptionFromEnums(x.TaskState, typeof(TaskInStatusEnum), typeof(TaskOutStatusEnum), typeof(TaskAcrossFloorStatusEnum), typeof(TaskRelocationStatusEnum), typeof(TaskAGVCarryStatusEnum)) |
| | | }).ToList() |
| | | }; |
| | | return content.OK(data: obj); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return content.Error("ç³»ç»é误ï¼è¯·è系管çå"); |
| | | } |
| | | } |
| | | #endregion |
| | | |
| | | #region æå°åºååä¸ªç©æäºç»´ç |
| | | public async Task<WebResponseContent> PrintOrder(object[] key) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | List<Dt_InboundOrder> inboundOrders = new List<Dt_InboundOrder>(); |
| | | foreach (var item in key) |
| | | { |
| | | var order = _inboundOrderRepository.QueryFirst(x => x.OrderNo == item.ToString()); |
| | | if (order != null) |
| | | { |
| | | inboundOrders.Add(order); |
| | | } |
| | | } |
| | | return _inboundOrderService.PrintInbound(inboundOrders); ; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return content.Error("æªç¥é误ï¼è¯·è系管çå"); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | } |