| | |
| | | var r when r.Contains("CW") => DateTime.Now.AddHours(1), |
| | | _ => DateTime.Now |
| | | }; |
| | | stockInfo.StockStatus = StockStatusEmun.入库完成.GetHashCode(); |
| | | |
| | | location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); |
| | | |
| | |
| | | { |
| | | // 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()) |
| | |
| | | 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]; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | // 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(); |
| | | |
| | |
| | | TaskType = TaskTypeEnum.Outbound.GetHashCode(), |
| | | TaskStatus = TaskStatusEnum.New.GetHashCode(), |
| | | Grade = 1, |
| | | TaskNum = await Repository.GetTaskNo(), |
| | | TaskNum = 0, // 使用 0 让数据库自动生成任务号 |
| | | Creater = "system_auto" |
| | | }; |
| | | taskList.Add(task); |
| | |
| | | } |
| | | |
| | | // 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)); |
| | | } |