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 |  133 ++++++++++++++++++++++++++++++++++++--------
 1 files changed, 108 insertions(+), 25 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 0130abe..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;
@@ -294,8 +296,11 @@
             try
             {
                 var today = DateTime.Today;
-                int batchSize = 1000; // 鎵规澶勭悊澶у皬
+                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
@@ -303,61 +308,82 @@
                         MasterId = master.Id,
                         master.WarehouseId,
                         detail.EffectiveDate,
-                        CurrentExpirationlabel = master.Expirationlabel // 鐢ㄤ簬鍒ゆ柇鏄惁闇�瑕佹洿鏂�
+                        CurrentExpirationlabel = master.Expirationlabel
                     });
-
-                // 鍒嗘壒澶勭悊锛屼娇鐢═ake鍜孲kip瀹炵幇鍒嗛〉
-                var totalUpdated = 0;
-                int skipCount = 0;
 
                 while (true)
                 {
-                    // 浣跨敤Skip鍜孴ake瀹炵幇鍒嗛〉鑾峰彇鏁版嵁
                     var batchData = query.Skip(skipCount).Take(batchSize).ToList();
-                    if (!batchData.Any()) break; // 娌℃湁鏇村鏁版嵁鏃堕��鍑哄惊鐜�
+                    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 item in batchData)
+                    foreach (var group in groupedData)
                     {
-                        if (!DateTime.TryParse(item.EffectiveDate, out DateTime effectiveDate))
-                            continue; 
+                        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 (item.WarehouseId == 3)
+                        else if (group.WarehouseId == 3)
                         {
                             int daysDiff = (effectiveDate - today).Days;
-                            newLabel = daysDiff <= 60 ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
+                            newLabel = daysDiff < 60
+                                ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt()
+                                : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
                         }
                         else
                         {
                             int daysDiff = (effectiveDate - today).Days;
-                            newLabel = daysDiff <= 30 ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt() : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
+                            newLabel = daysDiff < 30
+                                ? ExpirationlabelEnum.涓存湡棰勮.ObjToInt()
+                                : ExpirationlabelEnum.鏈复鏈�.ObjToInt();
                         }
 
-                        // 鍙洿鏂版湁鍙樺寲鐨勫�硷紝骞朵笖鍘婚噸
-                        if (newLabel != item.CurrentExpirationlabel && !updateDic.ContainsKey(item.MasterId))
+                        if (newLabel != group.CurrentExpirationlabel && !updateDic.ContainsKey(group.MasterId))
                         {
-                            updateDic[item.MasterId] = newLabel;
+                            updateDic[group.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();
+                        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; // 鍑嗗鑾峰彇涓嬩竴鎵规暟鎹�
+
+                    skipCount += batchSize;
                 }
+
                 return WebResponseContent.Instance.OK($"鏇存柊鎴愬姛锛屽叡鏇存柊 {totalUpdated} 鏉¤褰�");
             }
             catch (Exception ex)
@@ -365,5 +391,62 @@
                 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