helongyang
2 天以前 cb25acc46bf41863e068b6f968f1592b7a14d1c9
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -267,36 +267,7 @@
            }
            else
            {
                for (int i = 0; i < stockInfos.Count; i++)
                {
                    Dt_StockInfo stockInfo = stockInfos[i];
                    float useableStockQuantity = stockInfo.Details.Where(x => x.MaterielCode == materielCode).Sum(x => x.StockQuantity - x.OutboundQuantity);
                    if (useableStockQuantity < needQuantity)
                    {
                        stockInfo.Details.ForEach(x => x.OutboundQuantity = x.StockQuantity);
                        needQuantity -= useableStockQuantity;
                    }
                    else
                    {
                        stockInfo.Details.ForEach(x =>
                        {
                            if (x.StockQuantity > x.OutboundQuantity && x.MaterielCode == materielCode)
                            {
                                if (x.StockQuantity - x.OutboundQuantity >= needQuantity)
                                {
                                    x.OutboundQuantity += needQuantity;
                                    needQuantity = 0;
                                }
                                else
                                {
                                    needQuantity -= (x.StockQuantity - x.OutboundQuantity);
                                    x.OutboundQuantity = x.StockQuantity;
                                }
                            }
                        });
                    }
                    outStocks.Add(stockInfo);
                }
                throw new Exception("库存不足");
            }
            residueQuantity = needQuantity;
            return outStocks;
@@ -318,5 +289,81 @@
            return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
        }
        public WebResponseContent UpdateExpirationlabel()
        {
            try
            {
                var today = DateTime.Today;
                int batchSize = 1000; // æ‰¹æ¬¡å¤„理大小
                var query = BaseDal.Db.Queryable<Dt_StockInfoDetail>()
                    .InnerJoin<Dt_StockInfo>((detail, master) => detail.StockId == master.Id)
                    .Select((detail, master) => new
                    {
                        MasterId = master.Id,
                        master.WarehouseId,
                        detail.EffectiveDate,
                        CurrentExpirationlabel = master.Expirationlabel // ç”¨äºŽåˆ¤æ–­æ˜¯å¦éœ€è¦æ›´æ–°
                    });
                // åˆ†æ‰¹å¤„理,使用Take和Skip实现分页
                var totalUpdated = 0;
                int skipCount = 0;
                while (true)
                {
                    // ä½¿ç”¨Skip和Take实现分页获取数据
                    var batchData = query.Skip(skipCount).Take(batchSize).ToList();
                    if (!batchData.Any()) break; // æ²¡æœ‰æ›´å¤šæ•°æ®æ—¶é€€å‡ºå¾ªçޝ
                    var updateDic = new Dictionary<long, int>();
                    foreach (var item in batchData)
                    {
                        if (!DateTime.TryParse(item.EffectiveDate, out DateTime effectiveDate))
                            continue;
                        int newLabel;
                        if (effectiveDate < today)
                        {
                            newLabel = ExpirationlabelEnum.过期.ObjToInt();
                        }
                        else if (item.WarehouseId == 3)
                        {
                            int daysDiff = (effectiveDate - today).Days;
                            newLabel = daysDiff <= 60 ? ExpirationlabelEnum.临期预警.ObjToInt() : ExpirationlabelEnum.未临期.ObjToInt();
                        }
                        else
                        {
                            int daysDiff = (effectiveDate - today).Days;
                            newLabel = daysDiff <= 30 ? ExpirationlabelEnum.临期预警.ObjToInt() : ExpirationlabelEnum.未临期.ObjToInt();
                        }
                        // åªæ›´æ–°æœ‰å˜åŒ–的值,并且去重
                        if (newLabel != item.CurrentExpirationlabel && !updateDic.ContainsKey(item.MasterId))
                        {
                            updateDic[item.MasterId] = newLabel;
                        }
                    }
                    if (updateDic.Any())
                    {
                        // æž„建批量更新语句
                        var updateBuilder = BaseDal.Db.Updateable<Dt_StockInfo>();
                        foreach (var kvp in updateDic)
                        {
                            updateBuilder.SetColumns(m => m.Expirationlabel == kvp.Value)
                                         .Where(m => m.Id == kvp.Key);
                        }
                        totalUpdated += updateBuilder.ExecuteCommand();
                    }
                    skipCount += batchSize; // å‡†å¤‡èŽ·å–ä¸‹ä¸€æ‰¹æ•°æ®
                }
                return WebResponseContent.Instance.OK($"更新成功,共更新 {totalUpdated} æ¡è®°å½•");
            }
            catch (Exception ex)
            {
                return WebResponseContent.Instance.Error("更新失败,请联系管理员");
            }
        }
    }
}