wangxinhui
2025-10-14 0705cb6170a9ba77ba48bbb6dcebb9cf3d73cbea
Merge branch 'master' of http://115.159.85.185:8098/r/MeiRuiAn/HuaiAn
已修改4个文件
168 ■■■■ 文件已修改
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/UpdateExpirationlabelJob.cs 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/辅料仓/ConveyorLineJob_FL.cs 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockInfoService.cs 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
代码管理/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
´úÂë¹ÜÀí/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("未找到WMSApi地址");
                string responseStr2 = HttpHelper.Get($"{address}/api/StockInfo/T0DingTalkText");
                WebResponseContent? responseContent2 = JsonConvert.DeserializeObject<WebResponseContent>(responseStr);
                if (responseContent2.Status)
                {
                    return Task.CompletedTask;
                }
´úÂë¹ÜÀí/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/¸¨ÁϲÖ/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)
        {
´úÂë¹ÜÀí/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");
                // å‘送POST请求
                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 å¤„理仓库名称显示:优先用映射名称,无映射时显示原始ID
                        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>
´úÂë¹ÜÀí/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)
                {