From 3cd89b88edd913530062e13e20e7d6b866fd190f Mon Sep 17 00:00:00 2001
From: helongyang <647556386@qq.com>
Date: 星期五, 19 九月 2025 10:02:43 +0800
Subject: [PATCH] 更新

---
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs |  159 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 159 insertions(+), 0 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
index 1d75b62..ac08ba2 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs"
@@ -1,10 +1,12 @@
 锘縰sing AutoMapper;
 using MailKit.Search;
+using Newtonsoft.Json;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Net.Http;
 using System.Text;
 using System.Threading.Tasks;
 using WIDESEA_Common.StockEnum;
@@ -289,5 +291,162 @@
             return BaseDal.GetStockInfos(materielCode, batchNo, locationCodes);
         }
 
+        public WebResponseContent UpdateExpirationlabel()
+        {
+            try
+            {
+                var today = DateTime.Today;
+                int batchSize = 1000;
+                int totalUpdated = 0;
+                int skipCount = 0;
+
+                // 鍙煡璇㈤渶瑕佺殑瀛楁锛屽噺灏戞暟鎹紶杈撳拰鍐呭瓨鍗犵敤
+                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
+                    });
+
+                while (true)
+                {
+                    var batchData = query.Skip(skipCount).Take(batchSize).ToList();
+                    if (!batchData.Any()) break;
+                    var groupedData = batchData.GroupBy(item => item.MasterId)
+                        .Select(g => new
+                        {
+                            MasterId = g.Key,
+                            WarehouseId = g.First().WarehouseId,
+                            // 鍙栨渶鏃╃殑鏈夋晥鏃ユ湡
+                            EarliestEffectiveDate = g.Min(item =>
+                            {
+                                DateTime.TryParse(item.EffectiveDate, out DateTime date);
+                                return date;
+                            }),
+                            CurrentExpirationlabel = g.First().CurrentExpirationlabel
+                        })
+                        .ToList();
+
+                    var updateDic = new Dictionary<long, int>();
+
+                    foreach (var group in groupedData)
+                    {
+                        DateTime effectiveDate = group.EarliestEffectiveDate;
+                        if (effectiveDate == default(DateTime)) // 澶勭悊瑙f瀽澶辫触鐨勬儏鍐�
+                        {
+                            Console.WriteLine($"涓昏〃ID {group.MasterId} 涓嬫棤鏈夋晥鏃ユ湡锛岃烦杩�");
+                            continue;
+                        }
+
+                        int newLabel;
+                        if (effectiveDate < today)
+                        {
+                            newLabel = ExpirationlabelEnum.杩囨湡.ObjToInt();
+                        }
+                        else if (group.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 != group.CurrentExpirationlabel && !updateDic.ContainsKey(group.MasterId))
+                        {
+                            updateDic[group.MasterId] = newLabel;
+                        }
+                    }
+
+                    if (updateDic.Any())
+                    {
+                        var updateBuilder = BaseDal.Db.Updateable<Dt_StockInfo>();
+                        var idsToUpdate = updateDic.Keys.ToList();
+                        int updateValue = updateDic.First().Value;
+                        updateBuilder.SetColumns(m => m.Expirationlabel == updateValue)
+                                     .Where(m => idsToUpdate.Contains(m.Id));
+
+                        int batchUpdated = updateBuilder.ExecuteCommand();
+                        totalUpdated += batchUpdated;
+
+                        Console.WriteLine($"鎵规鏇存柊锛歿batchUpdated} 鏉★紝绱鏇存柊锛歿totalUpdated} 鏉★紝鏇存柊鏉′欢锛歿JsonConvert.SerializeObject(idsToUpdate)}");
+                    }
+
+                    skipCount += batchSize;
+                }
+
+                return WebResponseContent.Instance.OK($"鏇存柊鎴愬姛锛屽叡鏇存柊 {totalUpdated} 鏉¤褰�");
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error("鏇存柊澶辫触锛岃鑱旂郴绠$悊鍛�");
+            }
+        }
+        /// <summary>
+        /// 閽夐拤鏈哄櫒浜烘秷鎭帹閫佹祴璇�
+        /// </summary>
+        /// <returns></returns>
+        public async Task T0DingTalkText(string webhookUrl, string secret)
+        {
+            try
+            {
+                if (webhookUrl == null || secret == null)
+                {
+                    webhookUrl = "https://oapi.dingtalk.com/robot/send?access_token=fbc3aaf4133ea650d8116fb86b3ebfd0c5e0d46775966ce87893a41886bdf9dc";
+                    secret = "SECf221842b26356f22ccac84c4e60714e5287408ee8332a8f63503791382c3f5fb";
+                }
+                HttpClient httpClient = new HttpClient();
+                ///鑾峰彇鏃堕棿鎴�
+                var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+                ///鐢熸垚绛惧悕
+                var sign = GenerateSign(timestamp,secret);
+                // 鏋勫缓璇锋眰URL
+                var url = $"{webhookUrl.Split('?')[0]}?access_token={new Uri(webhookUrl).Query.Split('=')[1]}&timestamp={timestamp}&sign={sign}";
+                var requestBody = new
+                {
+                    msgtype = "text",
+                    text = new { content = "灏忔磱涓讳汉璇�: 灏忔磱瑕佸拰灏忓澶╀笅绗竴鏈�鏈�濂�" },
+                };
+                var jsonBody = JsonConvert.SerializeObject(requestBody);
+                var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
+
+                // 鍙戦�丳OST璇锋眰
+                var response = await httpClient.PostAsync(url, content);
+                if (!response.IsSuccessStatusCode)
+                {
+                    // 澶勭悊璇锋眰澶辫触鐨勬儏鍐�
+                    var errorContent = await response.Content.ReadAsStringAsync();
+                    throw new Exception($"閽夐拤娑堟伅鍙戦�佸け璐ワ紝鐘舵�佺爜: {response.StatusCode}锛岄敊璇唴瀹�: {errorContent}");
+                }
+            }
+            catch(Exception ex)
+            {
+                throw new Exception($"閽夐拤娑堟伅鍙戦�佸け璐ワ紝閿欒鍐呭: {ex.Message}");
+            }
+        }
+
+        /// <summary>
+        /// 鐢熸垚鍔犵绛惧悕
+        /// </summary>
+        /// <param name="timestamp">鏃堕棿鎴�</param>
+        /// <returns>绛惧悕</returns>
+        private string GenerateSign(long timestamp,string secret)
+        {
+            var stringToSign = $"{timestamp}\n{secret}";
+            using (var hmacsha256 = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(secret)))
+            {
+                var hashBytes = hmacsha256.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));
+                return Convert.ToBase64String(hashBytes).Replace("+", "%2B").Replace("/", "%2F");
+            }
+        }
     }
 }

--
Gitblit v1.9.3