using Furion.DatabaseAccessor; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using Admin.NET.Core; using Yitter.IdGenerator; using Microsoft.Extensions.Logging; using Microsoft.AspNetCore.Mvc.RazorPages; namespace Admin.NET.Application { /// /// Pda物料退库 /// [ApiDescriptionSettings("Pda物料退库", Name = "WmsStockReturnWarehouse", Order = 100)] [Route("api/[Controller]")] public class WmsStockReturnWarehouseService : IDynamicApiController, ITransient { private readonly IRepository _wmsStockReturnOrderRep; private readonly IRepository _wmsStockReturnOrderDetailsRep; private readonly IRepository _wmsTaskRep; private readonly IRepository _wmsPlaceRep; private readonly IRepository _wmsAreaRep; private readonly IRepository _wmsWarehouseEntranceRep; private readonly IRepository _wmsMaterialContainerRep; private readonly IRepository _wmsContainerRep; private readonly IRepository _wmsContainerPlaceRep; private readonly IRepository _wmsMaterialStockRep; private readonly IRepository _wmsOrderTypeRep; /// /// 构造函数 /// public WmsStockReturnWarehouseService( IRepository wmsStockReturnOrderRep, IRepository wmsStockReturnOrderDetailsRep, IRepository wmsTaskRep, IRepository wmsPlaceRep, IRepository wmsAreaRep, IRepository wmsWarehouseEntranceRep, IRepository wmsMaterialContainerRep, IRepository wmsContainerRep, IRepository wmsContainerPlaceRep, IRepository wmsMaterialStockRep, IRepository wmsOrderTypeRep ) { _wmsStockReturnOrderRep = wmsStockReturnOrderRep; _wmsStockReturnOrderDetailsRep = wmsStockReturnOrderDetailsRep; _wmsTaskRep = wmsTaskRep; _wmsPlaceRep = wmsPlaceRep; _wmsAreaRep = wmsAreaRep; _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep; _wmsMaterialContainerRep = wmsMaterialContainerRep; _wmsContainerRep = wmsContainerRep; _wmsContainerPlaceRep = wmsContainerPlaceRep; _wmsMaterialStockRep = wmsMaterialStockRep; _wmsOrderTypeRep = wmsOrderTypeRep; } /// /// 获取托盘 /// /// [HttpGet("GetContainer")] [UnifyResult(typeof(StockReturnGetContainerOutput))] public async Task CheckTray([FromQuery] StockReturnGetContainerInput input) { var containerModel = await _wmsContainerRep.DetachedEntities.Where(z => z.ContainerCode == input.ContainerCode).FirstOrDefaultAsync(); //如果托盘不存在则添加一个 if (containerModel == null) { var ContainerInfo = input.Adapt(); ContainerInfo.ContainerStatus = ContainerStatus.KOUXIAN; ContainerInfo.AssetNo = "N/A"; ContainerInfo.ContainerCategory = ContainerCategory.GZP; ContainerInfo.ErpNo = "N/A"; ContainerInfo.IsVirtually = YesOrNot.N; ContainerInfo.WorkShopType = LesWorkShopType.FAPAOCHEJIAN; await _wmsContainerRep.InsertNowAsync(ContainerInfo); containerModel = ContainerInfo; } var isExit = await _wmsTaskRep.AnyAsync(p => p.ContainerCode == containerModel.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG && p.TaskStatus != TaskStatusEnum.QUXIAO); if (isExit) return XnRestfulResultProvider.RESTfulMesaage("托盘存在未完成任务!"); isExit = await _wmsContainerPlaceRep.AnyAsync(p => p.ContainerCode == containerModel.ContainerCode && p.ContainerPlaceStatus == CommonStatus.ENABLE); if (isExit) return XnRestfulResultProvider.RESTfulMesaage("托盘存在库位中!"); var GetContainerOutputModel = new GetContainerOutput() { WmsContainer = containerModel.Adapt(), ContainerCode = containerModel.ContainerCode, }; //获取组盘数据 GetContainerOutputModel.WmsMaterials = await _wmsMaterialContainerRep .Where(p => p.ContainerCode == containerModel.ContainerCode && p.BindStatus == CommonStatus.ENABLE) .OrderByDescending(p => p.CreatedTime) .ProjectToType().ToListAsync(); return XnRestfulResultProvider.RESTfulResult(GetContainerOutputModel); } /// /// 通过单据号获取明细 /// /// [HttpGet("PadGetMaterial")] [UnifyResult(typeof(List))] public async Task PadGetMaterial([FromQuery] StockReturnPadGetMaterialInput input) { // 查询单据小类是“物料退库”的Id var wmsOrderType = await _wmsOrderTypeRep.FirstOrDefaultAsync(z => z.Name.Contains("物料退库")); //获取主表 var wmsOrders = await _wmsStockReturnOrderRep.DetachedEntities .Where(u => u.NO == input.NO && u.OrderStatus == OrderStatusEnum.YIXIAFA && u.OrderLargeCategory == wmsOrderType.Pid && u.OrderSubclass == wmsOrderType.Id) .FirstOrDefaultAsync(); if (wmsOrders == null) return XnRestfulResultProvider.RESTfulMesaage("单据不存在或未下发!"); var wmsOrderDetailList =await _wmsStockReturnOrderDetailsRep.Where(x=>x.OrderId == wmsOrders.Id) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return XnRestfulResultProvider.RESTfulResult(wmsOrderDetailList); } /// /// 执行仅收货操作(组盘) /// /// /// [HttpPost("GroupDisk")] [UnitOfWork] public async Task GroupDisk(StockReturnGroupDiskInput input) { //托盘信息 var containerModel = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == input.ContainerCode && n.ContainerStatus != ContainerStatus.JINYONG); if (containerModel == null) throw Oops.Oh("托盘信息不存在!"); if (containerModel.ContainerStatus == ContainerStatus.FENJIAN) throw Oops.Oh("容器存在分拣信息!"); if (containerModel.ContainerStatus == ContainerStatus.KUWEI) throw Oops.Oh("托盘存在库位中!"); var isExit = await _wmsTaskRep.AnyAsync(p => p.ContainerCode == containerModel.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG && p.TaskStatus != TaskStatusEnum.QUXIAO); if (isExit) throw Oops.Oh("托盘存在未完成任务中!"); isExit = await _wmsContainerPlaceRep.AnyAsync(p => p.ContainerCode == containerModel.ContainerCode && p.ContainerPlaceStatus == CommonStatus.ENABLE); if (isExit) throw Oops.Oh("托盘存在库位中!"); //组盘信息 var WmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == input.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync(); if (WmsMaterialContainerList.Count > 0) await _wmsMaterialContainerRep.DeleteAsync(WmsMaterialContainerList); //修改托盘状态 containerModel.ContainerStatus = ContainerStatus.ZUPANG; await _wmsContainerRep.UpdateAsync(containerModel); //组盘单据 var orderNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); if (input.WmsMaterials.Count >0)//有物料的情况 { foreach (var item in input.WmsMaterials) { var bindentranceModel = item.Adapt(); bindentranceModel.MaterialName = item.Materialname; bindentranceModel.MaterialNo = item.Materialcode; bindentranceModel.MaterialId = 4567;//暂定 bindentranceModel.ContainerId = containerModel.Id; bindentranceModel.ContainerCode = containerModel.ContainerCode; bindentranceModel.MaterialBatch = "N/A"; bindentranceModel.MaterialSpec = "N/A"; bindentranceModel.BindQuantity = item.Qty; bindentranceModel.BindStatus = CommonStatus.ENABLE; bindentranceModel.OrderNo = orderNo; bindentranceModel.MaterialDensity = "N/A"; bindentranceModel.Id = Yitter.IdGenerator.YitIdHelper.NextId(); await _wmsMaterialContainerRep.InsertAsync(bindentranceModel); } } //else//空托入库的情况 //{ // // 创建新组盘记录 // var bindentranceModel = new WmsMaterialContainer(); // bindentranceModel.MaterialName = "空托"; // bindentranceModel.MaterialNo = containerModel.ContainerCode; // bindentranceModel.MaterialId = 55555;//暂定 // bindentranceModel.ContainerId = containerModel.Id; // bindentranceModel.ContainerCode = containerModel.ContainerCode; // bindentranceModel.MaterialBatch = "N/A"; // bindentranceModel.MaterialSpec = containerModel.SpecLength + "*" + containerModel.SpecWidth; // bindentranceModel.BindQuantity = 1; // bindentranceModel.BindStatus = CommonStatus.ENABLE; // bindentranceModel.OrderNo = orderNo; // bindentranceModel.MaterialDensity = "N/A"; // bindentranceModel.Id = YitIdHelper.NextId(); // await _wmsMaterialContainerRep.InsertNowAsync(bindentranceModel); //} return new StockReturnGroupDiskOutput() { Containercode = input.ContainerCode, OrderNo = orderNo }; } /// /// 提交入库 /// /// [HttpPost("PdaInWarehouse")] [UnitOfWork] public async Task PdaInWarehouse([FromBody] StockReturnPdaInWarehouseInput input) { //检查托盘 var containerModel = await _wmsContainerRep.FirstOrDefaultAsync(p => p.ContainerCode == input.ContainerCode && p.ContainerStatus != ContainerStatus.JINYONG); if (containerModel == null) throw Oops.Oh("托盘不存在!"); if (containerModel.ContainerStatus == ContainerStatus.FENJIAN) throw Oops.Oh("容器存在分拣信息!"); var isExit = await _wmsTaskRep.AnyAsync(p => p.ContainerCode == containerModel.ContainerCode && p.TaskStatus != TaskStatusEnum.WANCHENG && p.TaskStatus != TaskStatusEnum.QUXIAO); if (isExit) throw Oops.Oh("托盘存在未完成任务中!"); var isInPlace = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == input.ContainerCode && n.ContainerStatus == ContainerStatus.KUWEI); if (isInPlace != null) throw Oops.Oh("托盘存在库位中!"); isExit = await _wmsContainerPlaceRep.AnyAsync(p => p.ContainerCode == containerModel.ContainerCode && p.ContainerPlaceStatus == CommonStatus.ENABLE); if (isExit) throw Oops.Oh("托盘存在库位中!"); //删除组盘信息 var oldwmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == input.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync(); if (oldwmsMaterialContainerList.Count > 0) await _wmsMaterialContainerRep.DeleteAsync(oldwmsMaterialContainerList); //组盘单据号 var orderNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); if (input.WmsMaterials!=null || input.WmsMaterials.Count <= 0)//有物料的情况 { foreach (var item in input.WmsMaterials) { var bindentranceModel = item.Adapt(); bindentranceModel.MaterialName = item.Materialname; bindentranceModel.MaterialNo = item.Materialcode; bindentranceModel.MaterialId = 4567; bindentranceModel.ContainerId = containerModel.Id; bindentranceModel.ContainerCode = containerModel.ContainerCode; bindentranceModel.MaterialBatch = "N/A"; bindentranceModel.MaterialSpec = "N/A"; bindentranceModel.BindQuantity = item.Qty; bindentranceModel.BindStatus = CommonStatus.ENABLE; bindentranceModel.OrderNo = orderNo; bindentranceModel.MaterialDensity = "N/A"; bindentranceModel.Id = Yitter.IdGenerator.YitIdHelper.NextId(); await _wmsMaterialContainerRep.InsertAsync(bindentranceModel); ////更改明细入库数量 //var wmsOrderDetailsModal = await _wmsOrderDetailsRep.FirstOrDefaultAsync(x => x.Id == item.Id); //wmsOrderDetailsModal.InventoryQty += item.Qty; } } //else//空托入库的情况 //{ // // 创建新组盘记录 // var bindentranceModel = new WmsMaterialContainer(); // bindentranceModel.MaterialName = "空托"; // bindentranceModel.MaterialNo = containerModel.ContainerCode; // bindentranceModel.MaterialId = 55555;//暂定 // bindentranceModel.ContainerId = containerModel.Id; // bindentranceModel.ContainerCode = containerModel.ContainerCode; // bindentranceModel.MaterialBatch = "N/A";//根据物料码解析 // bindentranceModel.MaterialSpec = containerModel.SpecLength + "*" + containerModel.SpecWidth; // bindentranceModel.BindQuantity = 1; // bindentranceModel.BindStatus = CommonStatus.ENABLE; // bindentranceModel.OrderNo = orderNo; // bindentranceModel.MaterialDensity = "N/A";//根据物料码解析 // bindentranceModel.Id = YitIdHelper.NextId(); // await _wmsMaterialContainerRep.InsertNowAsync(bindentranceModel); //} ////修改托盘状态 //containerModel.ContainerStatus = ContainerStatus.ZUPANG; //await _wmsContainerRep.UpdateAsync(containerModel); //分配巷道 var Aisle = 1; //任务 var takmodel = new WmsTask() { TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), TaskModel = TaskModel.QUANZIDONG, TaskType = TaskType.RUKU, TaskLevel = 1, TaskStatus = TaskStatusEnum.ZHIXINGZHONG, OrderNo = orderNo, OrderDetailsId = 0, ContainerCode = input.ContainerCode, SourcePlace = "入库口",//现场情况为空 ToPlace = "", //目标位 AreaName = "绝缘立库", IsRead = true, //WCS是否可以读取 SendTimes = 1, //发送次数 Aisle = Aisle,// 根据库区id获取几号提升机,测试使用一号 TaskDodeviceStatus = TaskDodeviceStatusEnum.W }; if (input.WmsMaterials == null || input.WmsMaterials.Count <= 0) { takmodel.Description = "空托"; } else { takmodel.Description = "物料"; }; await _wmsTaskRep.InsertAsync(takmodel); } } }