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;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
namespace CMS.Plugin.HIAWms.Application.Implements
{
///
/// 组盘入库
///
public class WmsBindInStockAssService : CMSPluginAppService
{
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.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,
};
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);
}
///
/// 组盘入库
///
///
///
///
public async Task BindInStockAsync(BindInstockInput input)
{
if (string.IsNullOrEmpty(input.PlaceNo)) { throw new UserFriendlyException("请选择库位编号"); }
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);
}
}
}