zs
2025-05-09 14f9c8378bde7d9a8d8f1fcc393e0e8d49eced82
HIAWms/server/src/CMS.Plugin.HIAWms.Application/Implements/WmsBindInStockAssService.cs
@@ -1,4 +1,15 @@
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 System;
using System.Collections.Generic;
using System.Linq;
@@ -13,21 +24,161 @@
    /// </summary>
    public class WmsBindInStockAssService : CMSPluginAppService
    {
        public async Task BindMaterialContaienrAsync(BindMaterialInput input)
        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;
        public WmsBindInStockAssService(IWmsMaterialRepository wmsMaterialRepository,
            IWmsContainerRepository wmsContainerRepository,
            IWmsPlaceRepository wmsPlaceRepository
,
            IWmsMaterialContainerRepository wmsMaterialContainerRepository,
            IWmsContainerPlaceRepository wmsContainerPlaceRepository,
            IWmsMaterialInfoRepository wmsMaterialInfoRepository,
            IWmsMaterialStockAppService wmsMaterialStockAppService,
            IWmsCommonAppService wmsCommonAppService,
            IWmsTaskRepository wmsTaskRepository,
            IWmsTaskAppService wmsTaskAppService)
        {
            _wmsMaterialRepository = wmsMaterialRepository;
            _wmsContainerRepository = wmsContainerRepository;
            _wmsPlaceRepository = wmsPlaceRepository;
            _wmsMaterialContainerRepository = wmsMaterialContainerRepository;
            _wmsContainerPlaceRepository = wmsContainerPlaceRepository;
            _wmsMaterialInfoRepository = wmsMaterialInfoRepository;
            _wmsMaterialStockAppService = wmsMaterialStockAppService;
            _wmsCommonAppService = wmsCommonAppService;
            _wmsTaskRepository = wmsTaskRepository;
            _wmsTaskAppService = wmsTaskAppService;
        }
        public async Task BindMaterialContaienrAsync(BindInstockInput input)
        {
            if (string.IsNullOrEmpty(input.MaterialModel)) { throw new UserFriendlyException("请选择库位编号"); }
            if (string.IsNullOrEmpty(input.MaterialBatch)) { throw new UserFriendlyException("请输入批次号"); }
            if (input.MaterialStockNumber<=0) { throw new UserFriendlyException("入库数量必须大于0"); }
            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<WmsMaterialContainer>();
            //var materialInfoList = new List<WmsMaterialInfo>();
            //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,
            };
            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);
        }
        /// <summary>
        /// 组盘入库
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        /// <exception cref="UserFriendlyException"></exception>
        public async Task BindInStockAsync(BindInstockInput input)
        {
            if(string.IsNullOrEmpty(input.PlaceNo)) { throw new UserFriendlyException("请选择库位编号"); }
            if (string.IsNullOrEmpty(input.PlaceNo)) { throw new UserFriendlyException("请选择库位编号"); }
            var bindInput = ObjectMapper.Map<BindInstockInput, BindMaterialInput>(input);
            await BindMaterialContaienrAsync(bindInput);
            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<WmsTask>();
            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);
        }
    }
}