wanshenmean
2026-03-09 1181f9f764b14abd6e9f598f89f8507b4bbfad0d
Code/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -206,6 +206,7 @@
                    var r when r.Contains("CW") => DateTime.Now.AddHours(1),
                    _ => DateTime.Now
                };
                stockInfo.StockStatus = StockStatusEmun.入库完成.GetHashCode();
                location.LocationStatus = LocationStatusEnum.InStock.GetHashCode();
@@ -405,7 +406,7 @@
            {
                // 1. 查询到期库存
                var expiredStocks = await _stockInfoService.Repository
                    .QueryAsync(s => s.OutboundDate <= DateTime.Now
                    .QueryDataAsync(s => s.OutboundDate <= DateTime.Now
                        && s.StockStatus == StockStatusEmun.入库完成.GetHashCode());
                if (expiredStocks == null || !expiredStocks.Any())
@@ -413,13 +414,29 @@
                    return WebResponseContent.Instance.OK("无到期库存需要处理");
                }
                // 加载位置详情
                foreach (var stock in expiredStocks)
                // 批量加载位置详情(优化 N+1 查询问题)
                var locationIds = expiredStocks
                    .Where(s => s.LocationId > 0)
                    .Select(s => s.LocationId)
                    .Distinct()
                    .Cast<object>()
                    .ToList();
                if (locationIds.Any())
                {
                    if (stock.LocationId > 0)
                    var locations = await _locationInfoService.Repository
                        .QureyDataByIdsAsync(locationIds);
                    // 创建位置字典以便快速查找
                    var locationDict = locations.ToDictionary(l => l.Id, l => l);
                    // 为每个库存关联位置详情
                    foreach (var stock in expiredStocks)
                    {
                        stock.LocationDetails = await _locationInfoService.Repository
                            .GetFirstAsync(s => s.Id == stock.LocationId);
                        if (stock.LocationId > 0 && locationDict.ContainsKey(stock.LocationId))
                        {
                            stock.LocationDetails = locationDict[stock.LocationId];
                        }
                    }
                }
@@ -436,11 +453,11 @@
                // 2. 检查已存在的任务
                var palletCodes = expiredStocks.Select(s => s.PalletCode).ToList();
                var existingTasks = await Repository.QueryAsync(t =>
                var existingTasks = await Repository.QueryDataAsync(t =>
                    palletCodes.Contains(t.PalletCode)
                    && (t.TaskStatus == TaskStatusEnum.New.GetHashCode()
                        || t.TaskStatus == TaskStatusEnum.Executing.GetHashCode()
                        || t.TaskInStatus == TaskInStatusEnum.InNew.GetHashCode()));
                        || t.TaskStatus == TaskStatusEnum.SC_Executing.GetHashCode()
                        || t.TaskStatus == TaskInStatusEnum.InNew.GetHashCode()));
                var processedPallets = existingTasks.Select(t => t.PalletCode).ToHashSet();
@@ -481,7 +498,7 @@
                        TaskType = TaskTypeEnum.Outbound.GetHashCode(),
                        TaskStatus = TaskStatusEnum.New.GetHashCode(),
                        Grade = 1,
                        TaskNum = await Repository.GetTaskNo(),
                        TaskNum = 0,  // 使用 0 让数据库自动生成任务号
                        Creater = "system_auto"
                    };
                    taskList.Add(task);
@@ -494,14 +511,14 @@
                }
                // 6. 通知 WCS(异步,不影响主流程)
                _ = Task.Run(async () =>
                _ = Task.Run(() =>
                {
                    foreach (var task in taskList)
                    {
                        try
                        {
                            var wmstaskDto = _mapper.Map<WMSTaskDTO>(task);
                            await _httpClientHelper.Post<WebResponseContent>(
                            _httpClientHelper.Post<WebResponseContent>(
                                "http://logistics-service/api/logistics/notifyoutbound",
                                JsonSerializer.Serialize(wmstaskDto));
                        }