| | |
| | | using AutoMapper; |
| | | using AutoMapper; |
| | | using WIDESEA_Common.LocationEnum; |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_IStockService; |
| | |
| | | _mapper = mapper; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·ååºåç»è®¡æ°æ® |
| | | /// </summary> |
| | | /// <returns></returns> |
| | | public WebResponseContent GetStockStatistics() |
| | | { |
| | | var response = new WebResponseContent(); |
| | | try |
| | | { |
| | | // å®ä¹åºåç¶æå¸¸é |
| | | const int STOCK_STATUS_INBOUND_COMPLETE = 6; // å
¥åºå®æç¶æ |
| | | const int STOCK_STATUS_OUTBOUND_COMPLETE = 8; // åºåºå®æç¶æ |
| | | |
| | | // è·åå½åæ¥ææ¶é´ |
| | | var now = DateTime.Now; |
| | | |
| | | // è·å仿¥æ¥æèå´ |
| | | var todayStart = now.Date; |
| | | var todayEnd = now.Date.AddDays(1); |
| | | |
| | | // è·åæ¬å¨æ¥æèå´ |
| | | // è®¡ç®æ¬å¨ä¸çæ¥æï¼å¦æä»å¤©æ¯å¨æ¥(0)ï¼åå»6天ï¼å¦ååå»å½åææå å1天 |
| | | var daysToSubtract = (int)now.DayOfWeek == 0 ? 6 : (int)now.DayOfWeek - 1; |
| | | var weekStart = now.Date.AddDays(-daysToSubtract); |
| | | var weekEnd = weekStart.AddDays(7); |
| | | |
| | | // è·åæ¬ææ¥æèå´ |
| | | var monthStart = new DateTime(now.Year, now.Month, 1); |
| | | var monthEnd = monthStart.AddMonths(1); |
| | | |
| | | // è·åææåºåæ°æ®ï¼ç¨äºåç»ç»è®¡ |
| | | var allStockData = Repository.Db.Queryable<Dt_StockInfo>().ToList(); |
| | | |
| | | // è°è¯ä¿¡æ¯ï¼æå°æ¥æèå´ååºåæ°æ®æ»æ° |
| | | var debugInfo = new |
| | | { |
| | | CurrentDateTime = now, |
| | | TodayRange = $"{todayStart:yyyy-MM-dd HH:mm:ss} ~ {todayEnd:yyyy-MM-dd HH:mm:ss}", |
| | | WeekRange = $"{weekStart:yyyy-MM-dd HH:mm:ss} ~ {weekEnd:yyyy-MM-dd HH:mm:ss}", |
| | | MonthRange = $"{monthStart:yyyy-MM-dd HH:mm:ss} ~ {monthEnd:yyyy-MM-dd HH:mm:ss}", |
| | | TotalStockCount = allStockData.Count, |
| | | AllStockStatus = allStockData.Select(it => new { it.Id, it.StockStatus, it.CreateDate }).ToList() |
| | | }; |
| | | |
| | | // æ»åºåæ°éï¼åºåç¶æä¸ºå
¥åºå®æçè®°å½æ°é |
| | | var totalStock = allStockData.Count(it => it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE); |
| | | |
| | | // 仿¥å
¥åºæ°éï¼ä»å¤©å建ä¸åºåç¶æä¸ºå
¥åºå®æçè®°å½æ°é |
| | | var todayInbound = allStockData.Count(it => |
| | | it.CreateDate >= todayStart && it.CreateDate < todayEnd && |
| | | it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE); |
| | | |
| | | // 仿¥åºåºæ°éï¼ä»å¤©å建ä¸åºåç¶æä¸ºåºåºå®æçè®°å½æ°é |
| | | var todayOutbound = allStockData.Count(it => |
| | | it.CreateDate >= todayStart && it.CreateDate < todayEnd && |
| | | it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE); |
| | | |
| | | // æ¬å¨å
¥åºæ°éï¼æ¬å¨å建ä¸åºåç¶æä¸ºå
¥åºå®æçè®°å½æ°é |
| | | var weekInbound = allStockData.Count(it => |
| | | it.CreateDate >= weekStart && it.CreateDate < weekEnd && |
| | | it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE); |
| | | |
| | | // æ¬å¨åºåºæ°éï¼æ¬å¨å建ä¸åºåç¶æä¸ºåºåºå®æçè®°å½æ°é |
| | | var weekOutbound = allStockData.Count(it => |
| | | it.CreateDate >= weekStart && it.CreateDate < weekEnd && |
| | | it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE); |
| | | |
| | | // æ¬æå
¥åºæ°éï¼æ¬æå建ä¸åºåç¶æä¸ºå
¥åºå®æçè®°å½æ°é |
| | | var monthInbound = allStockData.Count(it => |
| | | it.CreateDate >= monthStart && it.CreateDate < monthEnd && |
| | | it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE); |
| | | |
| | | // æ¬æåºåºæ°éï¼æ¬æå建ä¸åºåç¶æä¸ºåºåºå®æçè®°å½æ°é |
| | | var monthOutbound = allStockData.Count(it => |
| | | it.CreateDate >= monthStart && it.CreateDate < monthEnd && |
| | | it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE); |
| | | |
| | | // å¾
å¤çè®¢åæ°éï¼ç±äºåªæDt_StockInfoè¡¨ï¼ææ¶è¿å0 |
| | | var pendingOrders = 0; |
| | | |
| | | // åºåç¶æåå¸ï¼ç»è®¡ä¸ååºåç¶æçæ°é |
| | | var stockStatusDistribution = allStockData |
| | | .GroupBy(it => it.StockStatus) |
| | | .Select(g => new { Status = g.Key, Count = g.Count() }) |
| | | .ToList(); |
| | | |
| | | // è´§ä½åå¸ï¼ç»è®¡ä¸åè´§ä½çåºåæ°é |
| | | var locationDistribution = allStockData |
| | | .Where(it => !string.IsNullOrEmpty(it.LocationCode)) |
| | | .GroupBy(it => it.LocationCode) |
| | | .Select(g => new { Location = g.Key, Count = g.Count() }) |
| | | .OrderByDescending(g => g.Count) |
| | | .Take(10) // åªåå10ä¸ªè´§ä½ |
| | | .ToList(); |
| | | |
| | | // è´§ä½å©ç¨çï¼ä»æ°æ®åºè·åè´§ä½ä¿¡æ¯ |
| | | // è·åææè´§ä½ |
| | | var allLocations = Repository.Db.Queryable<Dt_LocationInfo>().ToList(); |
| | | var totalLocations = allLocations.Count; |
| | | |
| | | // ç»è®¡ä¸åç¶æçè´§ä½æ° |
| | | var freeLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Free); |
| | | var inStockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStock); |
| | | var inStockLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.InStockLock); |
| | | var lockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.Lock); |
| | | var freeLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.FreeLock); |
| | | var palletLockLocations = allLocations.Count(it => it.LocationStatus == (int)LocationStatusEnum.PalletLock); |
| | | |
| | | // 计ç®å·²ä½¿ç¨åæªä½¿ç¨çè´§ä½æ° |
| | | // 已使ç¨ï¼æè´§ãæè´§éå® |
| | | var usedLocations = inStockLocations + inStockLockLocations; |
| | | // æªä½¿ç¨ï¼ç©ºé²ã空é²éå® |
| | | var unusedLocations = freeLocations + freeLockLocations; |
| | | |
| | | // åºåååè¶å¿ï¼æ¨¡ææè¿7å¤©çæ°æ® |
| | | // å®é
åºæ ¹æ®æ°æ®åºä¸çåå²è®°å½çæ |
| | | var stockTrend = Enumerable.Range(0, 7) |
| | | .Select(i => { |
| | | var date = now.AddDays(-6 + i).Date; |
| | | var count = allStockData.Count(it => |
| | | it.CreateDate.Date <= date && |
| | | it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE && |
| | | (it.StockStatus != STOCK_STATUS_OUTBOUND_COMPLETE || it.CreateDate.Date > date)); |
| | | return new { Date = date.ToString("MM-dd"), Count = count }; |
| | | }) |
| | | .ToList(); |
| | | |
| | | // æ¥åºå
¥åºæç»ï¼æå°æ¶ç»è®¡ |
| | | var dailyInout = new { |
| | | inbound = Enumerable.Range(8, 10).Select(hour => |
| | | allStockData.Count(it => |
| | | it.CreateDate >= todayStart.AddHours(hour) && |
| | | it.CreateDate < todayStart.AddHours(hour + 1) && |
| | | it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE)) |
| | | .ToList(), |
| | | outbound = Enumerable.Range(8, 10).Select(hour => |
| | | allStockData.Count(it => |
| | | it.CreateDate >= todayStart.AddHours(hour) && |
| | | it.CreateDate < todayStart.AddHours(hour + 1) && |
| | | it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE)) |
| | | .ToList() |
| | | }; |
| | | |
| | | // å¨åºå
¥åºç»è®¡ï¼æå¤©ç»è®¡ |
| | | var weekInout = new { |
| | | inbound = Enumerable.Range(0, 7).Select(day => |
| | | allStockData.Count(it => |
| | | it.CreateDate >= weekStart.AddDays(day) && |
| | | it.CreateDate < weekStart.AddDays(day + 1) && |
| | | it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE)) |
| | | .ToList(), |
| | | outbound = Enumerable.Range(0, 7).Select(day => |
| | | allStockData.Count(it => |
| | | it.CreateDate >= weekStart.AddDays(day) && |
| | | it.CreateDate < weekStart.AddDays(day + 1) && |
| | | it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE)) |
| | | .ToList() |
| | | }; |
| | | |
| | | // æåºå
¥åºè¶å¿ï¼æ5天ç»è®¡ |
| | | var monthInout = new { |
| | | inbound = Enumerable.Range(0, 7).Select(i => |
| | | allStockData.Count(it => |
| | | it.CreateDate >= monthStart.AddDays(i * 5) && |
| | | it.CreateDate < monthStart.AddDays((i + 1) * 5) && |
| | | it.StockStatus == STOCK_STATUS_INBOUND_COMPLETE)) |
| | | .ToList(), |
| | | outbound = Enumerable.Range(0, 7).Select(i => |
| | | allStockData.Count(it => |
| | | it.CreateDate >= monthStart.AddDays(i * 5) && |
| | | it.CreateDate < monthStart.AddDays((i + 1) * 5) && |
| | | it.StockStatus == STOCK_STATUS_OUTBOUND_COMPLETE)) |
| | | .ToList() |
| | | }; |
| | | |
| | | // ç»è£
è¿åæ°æ®ï¼å
å«è°è¯ä¿¡æ¯åå¾è¡¨æ°æ® |
| | | var data = new |
| | | { |
| | | totalLocations, |
| | | todayInbound, |
| | | todayOutbound, |
| | | weekInbound, |
| | | weekOutbound, |
| | | monthInbound, |
| | | monthOutbound, |
| | | pendingOrders, |
| | | |
| | | // å¾è¡¨æ°æ® |
| | | stockStatus = stockStatusDistribution.Select(item => new { name = $"ç¶æ{item.Status}", value = item.Count }).ToList(), |
| | | locationDistribution = locationDistribution.Select(item => new { name = item.Location, value = item.Count }).ToList(), |
| | | // è´§ä½å©ç¨çï¼å
å«ä¸åç¶æçè´§ä½æ°é |
| | | warehouseUtilization = new { |
| | | total = totalLocations, |
| | | free = freeLocations, |
| | | inStock = inStockLocations, |
| | | inStockLock = inStockLockLocations, |
| | | lockLocations = lockLocations, |
| | | freeLock = freeLockLocations, |
| | | palletLock = palletLockLocations, |
| | | used = usedLocations, |
| | | unused = unusedLocations |
| | | }, |
| | | stockTrend = stockTrend.Select(item => item.Count).ToList(), |
| | | dailyInout, |
| | | weekInout, |
| | | monthInout, |
| | | |
| | | debugInfo |
| | | }; |
| | | |
| | | response.Status = true; |
| | | response.Data = data; |
| | | response.Message = "è·åæå"; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | response.Status = false; |
| | | response.Message = ex.Message; |
| | | response.Data = new |
| | | { |
| | | Exception = ex.ToString(), |
| | | StackTrace = ex.StackTrace |
| | | }; |
| | | } |
| | | return response; |
| | | } |
| | | } |
| | | } |