| | |
| | | using WIDESEA_Core; |
| | | using WIDESEA_Core.BaseRepository; |
| | | using WIDESEA_Core.BaseServices; |
| | | using WIDESEA_Core.Core; |
| | | using WIDESEA_DTO; |
| | | using WIDESEA_DTO.Task; |
| | | using WIDESEA_IBasicService; |
| | |
| | | private readonly ILocationInfoService _locationInfoService; |
| | | private readonly HttpClientHelper _httpClientHelper; |
| | | private readonly IConfiguration _configuration; |
| | | private readonly RoundRobinService _roundRobinService; |
| | | |
| | | public IRepository<Dt_Task> Repository => BaseDal; |
| | | |
| | |
| | | IStockInfoService stockInfoService, |
| | | ILocationInfoService locationInfoService, |
| | | HttpClientHelper httpClientHelper, |
| | | IConfiguration configuration) : base(BaseDal) |
| | | IConfiguration configuration, |
| | | RoundRobinService roundRobinService) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _stockInfoService = stockInfoService; |
| | | _locationInfoService = locationInfoService; |
| | | _httpClientHelper = httpClientHelper; |
| | | _configuration = configuration; |
| | | _roundRobinService = roundRobinService; |
| | | } |
| | | |
| | | #region WCS逻辑处理 |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 根据巷道确定目标地址 |
| | | /// 根据巷道确定目标地址(支持多出库口轮询) |
| | | /// </summary> |
| | | private string DetermineTargetAddress(string roadway, Dictionary<string, string> addressMap) |
| | | private string DetermineTargetAddress(string roadway, Dictionary<string, List<string>> addressMap) |
| | | { |
| | | if (string.IsNullOrWhiteSpace(roadway)) |
| | | return "10080"; // 默认地址 |
| | | return "10080"; |
| | | |
| | | // 查找匹配的巷道前缀 |
| | | string matchedPrefix = null; |
| | | foreach (var kvp in addressMap) |
| | | { |
| | | if (roadway.Contains(kvp.Key)) |
| | | return kvp.Value; |
| | | { |
| | | matchedPrefix = kvp.Key; |
| | | break; |
| | | } |
| | | } |
| | | |
| | | return "10080"; // 默认地址 |
| | | if (matchedPrefix == null) |
| | | return "10080"; |
| | | |
| | | var addresses = addressMap[matchedPrefix]; |
| | | if (addresses == null || addresses.Count == 0) |
| | | return "10080"; |
| | | |
| | | // 单个地址,直接返回 |
| | | if (addresses.Count == 1) |
| | | return addresses[0]; |
| | | |
| | | // 多个地址,使用轮询服务 |
| | | return _roundRobinService.GetNextAddress(matchedPrefix, addresses); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | 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 |
| | | .QueryFirstAsync(s => s.Id == stock.LocationId); |
| | | if (stock.LocationId > 0 && locationDict.ContainsKey(stock.LocationId)) |
| | | { |
| | | stock.LocationDetails = locationDict[stock.LocationId]; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | // 4. 获取配置的目标地址映射 |
| | | var targetAddressMap = _configuration.GetSection("AutoOutboundTask:TargetAddresses") |
| | | .Get<Dictionary<string, string>>() |
| | | ?? new Dictionary<string, string>(); |
| | | .Get<Dictionary<string, List<string>>>() |
| | | ?? new Dictionary<string, List<string>>(); |
| | | |
| | | // 5. 批量创建任务 |
| | | var taskList = new List<Dt_Task>(); |
| | |
| | | TaskType = TaskTypeEnum.Outbound.GetHashCode(), |
| | | TaskStatus = TaskStatusEnum.New.GetHashCode(), |
| | | Grade = 1, |
| | | TaskNum = await Repository.GetTaskNo(), |
| | | TaskNum = 0, // 使用 0 让数据库自动生成任务号 |
| | | Creater = "system_auto" |
| | | }; |
| | | taskList.Add(task); |