using CMS.Plugin.HIAWms.Application.Contracts.Dtos.BindInstockDto; using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsMaterialStocks; using CMS.Plugin.HIAWms.Application.Contracts.Dtos.WmsTask; using CMS.Plugin.HIAWms.Application.Contracts.Services; using CMS.Plugin.HIAWms.Domain.Shared.Enums; using CMS.Plugin.HIAWms.Domain.WmsContainerPlace; using CMS.Plugin.HIAWms.Domain.WmsContainers; using CMS.Plugin.HIAWms.Domain.WmsMaterialContainer; using CMS.Plugin.HIAWms.Domain.WmsMaterialInfos; using CMS.Plugin.HIAWms.Domain.WmsMaterials; using CMS.Plugin.HIAWms.Domain.WmsPlaces; using CMS.Plugin.HIAWms.Domain.WmsTask; using Microsoft.Extensions.DependencyInjection; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Volo.Abp; using Volo.Abp.Uow; namespace CMS.Plugin.HIAWms.Application.Implements { /// /// 组盘入库 /// public class WmsBindInStockAppService : CMSPluginAppService, IWmsBindInStockAppService { private readonly IWmsMaterialRepository _wmsMaterialRepository; private readonly IWmsContainerRepository _wmsContainerRepository; private readonly IWmsPlaceRepository _wmsPlaceRepository; private readonly IWmsMaterialContainerRepository _wmsMaterialContainerRepository; private readonly IWmsContainerPlaceRepository _wmsContainerPlaceRepository; private readonly IWmsMaterialInfoRepository _wmsMaterialInfoRepository; private readonly IWmsMaterialStockAppService _wmsMaterialStockAppService; private readonly IWmsCommonAppService _wmsCommonAppService; private readonly IWmsTaskRepository _wmsTaskRepository; private readonly IWmsTaskAppService _wmsTaskAppService; private readonly IServiceProvider _serviceProvider; public WmsBindInStockAppService(IWmsMaterialRepository wmsMaterialRepository, IWmsContainerRepository wmsContainerRepository, IWmsPlaceRepository wmsPlaceRepository , IWmsMaterialContainerRepository wmsMaterialContainerRepository, IWmsContainerPlaceRepository wmsContainerPlaceRepository, IWmsMaterialInfoRepository wmsMaterialInfoRepository, IWmsMaterialStockAppService wmsMaterialStockAppService, IWmsCommonAppService wmsCommonAppService, IWmsTaskRepository wmsTaskRepository, IWmsTaskAppService wmsTaskAppService, IServiceProvider serviceProvider) { _wmsMaterialRepository = wmsMaterialRepository; _wmsContainerRepository = wmsContainerRepository; _wmsPlaceRepository = wmsPlaceRepository; _wmsMaterialContainerRepository = wmsMaterialContainerRepository; _wmsContainerPlaceRepository = wmsContainerPlaceRepository; _wmsMaterialInfoRepository = wmsMaterialInfoRepository; _wmsMaterialStockAppService = wmsMaterialStockAppService; _wmsCommonAppService = wmsCommonAppService; _wmsTaskRepository = wmsTaskRepository; _wmsTaskAppService = wmsTaskAppService; _serviceProvider = serviceProvider; } public async Task BindMaterialContaienrAsync(BindInstockInput input) { using var scope = _serviceProvider.CreateScope(); var unitOfWorkManager = scope.ServiceProvider.GetRequiredService(); using var uow = unitOfWorkManager.Begin(requiresNew: true); if (string.IsNullOrEmpty(input.MaterialModel)) { throw new UserFriendlyException("请选择库位编号"); } if (string.IsNullOrEmpty(input.MaterialBatch)) { throw new UserFriendlyException("请输入批次号"); } if (input.StockNumber <= 0) { throw new UserFriendlyException("入库数量必须大于0"); } #region 废弃 //string containerNo = DateTime.Now.ToString("yyMMddHHmmss") + new Random(Guid.NewGuid().GetHashCode()).Next(100, 9999).ToString(); //// 5. 创建托盘 //var container = new WmsContainer //{ // ContainerNo = containerNo, // ContainerType = Domain.Shared.Enums.ContainerTypeEnum.XUNI, // ContainerStatus = Domain.Shared.Enums.ContainerStatusEnum.ZUPANG, //}; //await _wmsContainerRepository.InsertAsync(container); //var materialContainerList = new List(); //var materialInfoList = new List(); //for (int i = 0; i < input.MaterialStockNumber; i++) //{ // string materialId = Guid.NewGuid().ToString("N"); // var materialContainer = new WmsMaterialContainer // { // MaterialId = materialId, // ContainerNo = containerNo, // }; // materialContainerList.Add(materialContainer); // var materialInfo = new WmsMaterialInfo // { // }; // materialInfoList.Add(materialInfo); //} //await _wmsMaterialContainerRepository.InsertManyAsync(materialContainerList); //await _wmsMaterialInfoRepository.InsertManyAsync(materialInfoList); #endregion var material = await _wmsMaterialRepository.FindByModelAsync(input.MaterialModel); if (material == null) { throw new UserFriendlyException($"物料型号 {input.MaterialModel} 不存在!"); } // 5. 创建托盘 var containerNo = input.ContainerNo; if (string.IsNullOrEmpty(containerNo)) { containerNo = DateTime.Now.ToString("yyMMddHHmmss") + new Random(Guid.NewGuid().GetHashCode()).Next(100, 9999).ToString(); } //var container = new WmsContainer //{ // ContainerNo = containerNo, // ContainerType = Domain.Shared.Enums.ContainerTypeEnum.XUNI, // ContainerStatus = Domain.Shared.Enums.ContainerStatusEnum.ZUPANG, //}; //var result = await _wmsContainerRepository.InsertAsync(container); var materialStock = new WmsMaterialStockCreateDto { MaterialNo = material.MaterialNo, MaterialName = material.MaterialName, MaterialBatch = input.MaterialBatch, StockNumber = input.StockNumber, CheckStatus = Domain.Shared.Enums.MaterialCheckStatusEnum.HEGE, IsLock = Domain.Shared.Enums.YesNoEnum.N, PlaceNo = input.PlaceNo, ContainerNo = containerNo, EmptyContainer = Domain.Shared.Enums.YesNoEnum.N, }; await _wmsMaterialStockAppService.CreateAsync(materialStock); await uow.SaveChangesAsync(); await uow.CompleteAsync(); } /// /// 组盘入库 /// /// /// /// public async Task BindInStockAsync(BindInstockInput input) { if (string.IsNullOrEmpty(input.PlaceNo)) { throw new UserFriendlyException("请选择库位编号"); } using var scope = _serviceProvider.CreateScope(); var unitOfWorkManager = scope.ServiceProvider.GetRequiredService(); using var uow = unitOfWorkManager.Begin(requiresNew: true); input.ContainerNo = DateTime.Now.ToString("yyMMddHHmmss") + new Random(Guid.NewGuid().GetHashCode()).Next(100, 9999).ToString(); await BindMaterialContaienrAsync(input); // 生成任务 var plactDict = await _wmsCommonAppService.FindAvailablePlacesAsync(input.MaterialNo, input.StockNumber); var taskList = new List(); foreach (var kvp in plactDict) { var place = kvp.Key; // WmsPlace对象 var quantity = kvp.Value; // 分配数量 for (int i = 0; i < quantity; i++) { var task = new WmsTask { TaskNo = $"RK_{DateTime.Now:yyyyMMddHHmmss}_{Guid.NewGuid().ToString("N").Substring(0, 6)}", ContainerNo = input.ContainerNo, SourcePlace = input.PlaceNo, ToPlace = place.PlaceNo, TaskType = TaskTypeEnum.RUKU, SonTaskType = SonTaskTypeEnum.RGRUKU, TaskStatus = WmsTaskStatus.WEIZHIXING, TaskLevel = 999, Aisle = 1, DodeviceId = 0, TaskDodeviceStatus = TaskDodeviceStatus.SrmNoStart, IsNextTask = (int)YesNoEnum.Y, IsRead = true, MutableParam1 = input.MaterialModel, }; taskList.Add(task); } } await _wmsTaskRepository.InsertManyAsync(taskList); await uow.SaveChangesAsync(); await uow.CompleteAsync(); } } }