helongyang
昨天 cb25acc46bf41863e068b6f968f1592b7a14d1c9
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs
@@ -289,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("更新失败,请联系管理员");
            }
        }
    }
}