From 0705cb6170a9ba77ba48bbb6dcebb9cf3d73cbea Mon Sep 17 00:00:00 2001
From: wangxinhui <wangxinhui@hnkhzn.com>
Date: 星期二, 14 十月 2025 02:12:25 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn

---
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/辅料仓/ConveyorLineJob_FL.cs   |    3 
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs       |   15 +++-
 代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs |   11 +++
 代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs     |  139 +++++++++++++++++++++++++++++++++++++++------
 4 files changed, 142 insertions(+), 26 deletions(-)

diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs"
index ccd23bc..cdf42e4 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs"
@@ -24,7 +24,16 @@
                 string responseStr = HttpHelper.Get($"{address}/api/StockInfo/UpdateExpirationlabel");
 
                 WebResponseContent? responseContent = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
-                if (responseContent.Status)
+                
+
+                Thread.Sleep(2000);
+
+                string address2 = AppSettings.Get("WMSApiAddress");
+                if (string.IsNullOrEmpty(address)) throw new Exception("鏈壘鍒癢MSApi鍦板潃");
+                string responseStr2 = HttpHelper.Get($"{address}/api/StockInfo/T0DingTalkText");
+
+                WebResponseContent? responseContent2 = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
+                if (responseContent2.Status)
                 {
                     return Task.CompletedTask;
                 }
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs"
index fd1917e..56424a7 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/\350\276\205\346\226\231\344\273\223/ConveyorLineJob_FL.cs"
@@ -33,13 +33,14 @@
         private readonly ITaskService _taskService;
         private readonly ITaskExecuteDetailService _taskExecuteDetailService;
         private readonly ITaskRepository _taskRepository;
-        public static FLReadData fLReadData = new FLReadData();
+        
         private readonly IStationMangerRepository _stationMangerRepository;
         private readonly IRouterRepository _routerRepository;
         private readonly IRouterService _routerService;
         private readonly IRouterExtension _routerExtension;
         private readonly List<Dt_WarehouseDevice> warehouseDevices;
         private WebSocketServer _webSocketServer;
+        public static FLReadData fLReadData = new FLReadData();
 
         public ConveyorLineJob_FL(ICacheService cacheService, ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IStationMangerRepository stationMangerRepository, IRouterRepository routerRepository, IRouterService routerService, IRouterExtension routerExtension,WebSocketServer webSocketServer)
         {
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 43506f3..623df73 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"
@@ -4,6 +4,7 @@
 using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
 using SqlSugar;
 using System;
+using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using System.Net.Http;
@@ -419,36 +420,134 @@
                     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
+                var warehouseIdToName = new Dictionary<int, string>
                 {
-                    msgtype = "text",
-                    text = new { content = "閽夐拤娑堟伅鎺ㄩ��" },
+                    { 2, "娌瑰ⅷ浠�" },
+                    { 3, "鏉挎潗浠�" },
+                    { 4, "PP浠�" },
+                    { 6, "娴嬭瘯鏋朵粨" },
+                    { 11, "骞茶啘浠�" },
+                    { 12, "闃荤剨浠�" }
                 };
-                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 currentTime = DateTime.Now;
+                var ninetyDaysAgo = currentTime.AddDays(-90);
+
+                var expirationLabel3Stocks = BaseDal.Db.Queryable<Dt_StockInfo>()
+                    .Where(s => s.Expirationlabel == 3 && s.WarehouseId != 5)
+                    .ToList();
+
+                var over90DaysStocks = BaseDal.Db.Queryable<Dt_StockInfo>()
+                    .Where(s => s.ModifyDate <= ninetyDaysAgo && s.Expirationlabel != 3 && s.WarehouseId != 5)
+                    .ToList();
+
+                if (!expirationLabel3Stocks.Any() && !over90DaysStocks.Any())
                 {
-                    // 澶勭悊璇锋眰澶辫触鐨勬儏鍐�
-                    var errorContent = await response.Content.ReadAsStringAsync();
-                    throw new Exception($"閽夐拤娑堟伅鍙戦�佸け璐ワ紝鐘舵�佺爜: {response.StatusCode}锛岄敊璇唴瀹�: {errorContent}");
+                    return;
+                }
+
+                var expirationLabel3StockIds = expirationLabel3Stocks.Select(s => s.Id).ToList();
+                var over90DaysStockIds = over90DaysStocks.Select(s => s.Id).ToList();
+                var expirationLabel3Details = expirationLabel3StockIds.Any()
+                    ? BaseDal.Db.Queryable<Dt_StockInfoDetail>()
+                        .Where(d => expirationLabel3StockIds.Contains(d.StockId))
+                        .ToList()
+                    : new List<Dt_StockInfoDetail>();
+
+                var over90DaysDetails = over90DaysStockIds.Any()
+                    ? BaseDal.Db.Queryable<Dt_StockInfoDetail>()
+                        .Where(d => over90DaysStockIds.Contains(d.StockId))
+                        .ToList()
+                    : new List<Dt_StockInfoDetail>();
+
+                var stockIdToWarehouseId = expirationLabel3Stocks
+                    .Concat(over90DaysStocks)
+                    .ToDictionary(s => s.Id, s => s.WarehouseId);
+
+                var expirationLabel3Groups = expirationLabel3Details
+                    .GroupBy(d => stockIdToWarehouseId[d.StockId])
+                    .ToDictionary(g => g.Key, g => g.Select(d => new
+                    {
+                        d.MaterielCode,
+                        d.BatchNo
+                    }).ToList());
+
+                var over90DaysGroups = over90DaysDetails
+                    .GroupBy(d => stockIdToWarehouseId[d.StockId])
+                    .ToDictionary(g => g.Key, g => g.Select(d => new
+                    {
+                        d.MaterielCode,
+                        d.BatchNo
+                    }).ToList());
+
+                var allWarehouseIds = expirationLabel3Groups.Keys
+                    .Union(over90DaysGroups.Keys)
+                    .ToList();
+
+                using (HttpClient httpClient = new HttpClient())
+                {
+                    foreach (var warehouseId in allWarehouseIds)
+                    {
+                        // 9.1 澶勭悊浠撳簱鍚嶇О鏄剧ず锛氫紭鍏堢敤鏄犲皠鍚嶇О锛屾棤鏄犲皠鏃舵樉绀哄師濮婭D
+                        var warehouseName = warehouseIdToName.TryGetValue(warehouseId, out var name)
+                            ? name
+                            : $"浠撳簱{warehouseId}";
+
+                        var messageParts = new List<string>
+                {
+                    $"銆恵warehouseName}銆戠墿鏂欐彁閱�"
+                };
+
+                        // 娣诲姞杩囨湡鐗╂枡淇℃伅
+                        if (expirationLabel3Groups.TryGetValue(warehouseId, out var label3Materials) && label3Materials.Any())
+                        {
+                            var label3Details = label3Materials
+                                .Select(m => $"鈥� 鐗╂枡缂栫爜锛歿m.MaterielCode} | 鎵规鍙凤細{m.BatchNo}")
+                                .Aggregate((current, next) => $"{current}\n{next}");
+                            messageParts.Add($"涓�銆佽繃鏈熺墿鏂橽n{label3Details}");
+                        }
+
+                        // 娣诲姞瓒呰繃90澶╂湭浣跨敤鐗╂枡淇℃伅
+                        if (over90DaysGroups.TryGetValue(warehouseId, out var over90Materials) && over90Materials.Any())
+                        {
+                            var over90Details = over90Materials
+                                .Select(m => $"鈥� 鐗╂枡缂栫爜锛歿m.MaterielCode} | 鎵规鍙凤細{m.BatchNo}")
+                                .Aggregate((current, next) => $"{current}\n{next}");
+                            messageParts.Add($"浜屻�佽秴杩�90澶╂湭浣跨敤鐗╂枡\n{over90Details}");
+                        }
+
+                        var messageContent = string.Join("\n\n", messageParts);
+
+                        var timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds();
+                        var sign = GenerateSign(timestamp, secret);
+
+                        var url = $"{webhookUrl.Split('?')[0]}?access_token={new Uri(webhookUrl).Query.Split('=')[1]}&timestamp={timestamp}&sign={sign}";
+
+                        // 鏋勫缓璇锋眰浣擄紙绗﹀悎閽夐拤text绫诲瀷娑堟伅鏍煎紡锛�
+                        var requestBody = new
+                        {
+                            msgtype = "text",
+                            text = new { content = messageContent }
+                        };
+                        var jsonBody = JsonConvert.SerializeObject(requestBody);
+                        var content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
+
+                        var response = await httpClient.PostAsync(url, content);
+                        if (!response.IsSuccessStatusCode)
+                        {
+                            var errorContent = await response.Content.ReadAsStringAsync();
+                            throw new Exception($"銆恵warehouseName}銆戞秷鎭彂閫佸け璐ワ紝鐘舵�佺爜锛歿response.StatusCode}锛岄敊璇俊鎭細{errorContent}");
+                        }
+                    }
                 }
             }
-            catch(Exception ex)
+            catch (Exception ex)
             {
-                throw new Exception($"閽夐拤娑堟伅鍙戦�佸け璐ワ紝閿欒鍐呭: {ex.Message}");
+                throw new Exception($"閽夐拤娑堟伅鎺ㄩ�佹暣浣撳け璐ワ紝閿欒璇︽儏锛歿ex.Message}", ex);
             }
         }
 
+
         /// <summary>
         /// 鐢熸垚鍔犵绛惧悕
         /// </summary>
diff --git "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs" "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
index bd1d916..92cd76c 100644
--- "a/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
+++ "b/\344\273\243\347\240\201\347\256\241\347\220\206/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs"
@@ -1271,7 +1271,7 @@
                 Dt_InboundOrderDetail? inboundOrderDetail = null;
                 Dt_ReturnOrder? returnOrder = null;
                 //鏍囧噯鍏ュ簱娴佺▼鏌ユ壘鍏ュ簱鍗曟嵁
-                if (inboundOrder != null && stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt()&&(task.WarehouseId == WarehouseEnum.HA152.ObjToInt()|| task.WarehouseId == WarehouseEnum.HA58.ObjToInt()))
+                if (inboundOrder != null && stockInfo.StockStatus == StockStatusEmun.鍏ュ簱纭.ObjToInt()&&(task.WarehouseId == 11 || task.WarehouseId == 4))
                 {
                     inboundOrderDetail = inboundOrder.Details.FirstOrDefault(x => x.RowNo == stockInfo.Details.FirstOrDefault()?.InboundOrderRowNo);
                     foreach (var item in stockInfo.Details)
@@ -1297,11 +1297,15 @@
                         }
                     }
                 }
-                if(task.WarehouseId == WarehouseEnum.HA154.ObjToInt()|| task.WarehouseId == WarehouseEnum.HA152.ObjToInt() || task.WarehouseId == WarehouseEnum.HA58.ObjToInt())
+                if(task.WarehouseId == 11 || task.WarehouseId == 4||task.WarehouseId == 13)
                 {
                     _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩鍒犻櫎 : OperateTypeEnum.浜哄伐鍒犻櫎);
                     _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.鑷姩鍒犻櫎 : OperateTypeEnum.浜哄伐鍒犻櫎);
-                }else
+                }else if(task.WarehouseId == 6 && task.TaskType == TaskTypeEnum.ProductionReturn.ObjToInt())
+                {
+                    stockInfo.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+                }
+                else
                 {
                     stockInfo.StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt();
                 }
@@ -1310,7 +1314,10 @@
                 FeedBackWCSTaskHandCancel(taskNum);
                 _unitOfWorkManage.BeginTran();
                 BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId > 0 ? OperateTypeEnum.浜哄伐鍒犻櫎 : OperateTypeEnum.浜哄伐鍒犻櫎);
-                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
+                if(locationInfo != null)
+                {
+                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
+                }
                 _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                 if (inboundOrder != null && inboundOrderDetail != null)
                 {

--
Gitblit v1.9.3