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 { /// /// 物料分拣服务 /// [ApiDescriptionSettings("Pda分拣", Name = "MaterialSorting", Order = 100)] [Route("api/[Controller]")] public class MaterialSortingService : IDynamicApiController, ITransient { private readonly IRepository _wmsOrderRep; private readonly IRepository _wmsOrderDetailsRep; 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; private readonly IRepository _wmsSortOrderRep; private readonly IRepository _wmsTakeMaterialOrderRep; /// /// 构造函数 /// public MaterialSortingService( IRepository wmsOrderRep, IRepository wmsOrderDetailsRep, IRepository wmsTaskRep, IRepository wmsPlaceRep, IRepository wmsAreaRep, IRepository wmsWarehouseEntranceRep, IRepository wmsMaterialContainerRep, IRepository wmsContainerRep, IRepository wmsContainerPlaceRep, IRepository wmsMaterialStockRep, IRepository wmsOrderTypeRep, IRepository wmsSortOrderRep, IRepository wmsTakeMaterialOrderRep ) { _wmsOrderRep = wmsOrderRep; _wmsOrderDetailsRep = wmsOrderDetailsRep; _wmsTaskRep = wmsTaskRep; _wmsPlaceRep = wmsPlaceRep; _wmsAreaRep = wmsAreaRep; _wmsWarehouseEntranceRep = wmsWarehouseEntranceRep; _wmsMaterialContainerRep = wmsMaterialContainerRep; _wmsContainerRep = wmsContainerRep; _wmsContainerPlaceRep = wmsContainerPlaceRep; _wmsMaterialStockRep = wmsMaterialStockRep; _wmsOrderTypeRep = wmsOrderTypeRep; _wmsSortOrderRep = wmsSortOrderRep; _wmsTakeMaterialOrderRep = wmsTakeMaterialOrderRep; } /// /// 扫描分拣托盘 /// /// /// [HttpGet("GetSortInfo")] public async Task GetSortInfo([FromQuery] GetSortInfoInput input) { //检查托盘 var wareContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == input.ContainerCode); if (wareContainer == null) throw Oops.Oh("容器信息不存在!"); if (wareContainer.ContainerStatus == ContainerStatus.JINYONG) throw Oops.Oh("容器已禁用!"); if (wareContainer.ContainerStatus == ContainerStatus.KUWEI) throw Oops.Oh("容器在库位不可使用!"); if (wareContainer.ContainerStatus != ContainerStatus.FENJIAN) throw Oops.Oh("容器不存在分拣信息!"); //判断是否在任务中 var isExit = await _wmsTaskRep.AnyAsync(n => n.TaskStatus != TaskStatusEnum.WANCHENG && n.ContainerCode == input.ContainerCode); if (isExit) throw Oops.Oh("容器存在未完成任务!"); // 查询分拣记录 var wareSortOrderList = await _wmsSortOrderRep.DetachedEntities .Where(p => p.ContainerCode == input.ContainerCode && p.SortStatus != SortStatusEnum.FENJIANWANCHENG).ToListAsync(); return new GetSortInfoOutput { WmsContainer = wareContainer.Adapt(), WmsSortOrderList = wareSortOrderList }; } /// /// 分拣确认 /// /// /// [HttpPost("SortSure")] [UnitOfWork] public async Task SortSure(GetSortInfoOutput input) { if (input.WmsContainer == null || input.WmsSortOrderList.Count == 0) throw Oops.Oh("传递参数异常!"); //检查托盘 var wareContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == input.WmsContainer.ContainerCode); if (wareContainer == null) throw Oops.Oh("容器信息不存在!"); if (wareContainer.ContainerStatus == ContainerStatus.JINYONG) throw Oops.Oh("容器已禁用!"); if (wareContainer.ContainerStatus == ContainerStatus.KUWEI) throw Oops.Oh("容器在库位不可使用!"); if (wareContainer.ContainerStatus != ContainerStatus.FENJIAN) throw Oops.Oh("容器不存在分拣信息!"); var wmsMaterialContainers = await _wmsMaterialContainerRep .Where(p => p.ContainerCode == input.WmsContainer.ContainerCode && p.BindStatus == CommonStatus.ENABLE).ToListAsync(); foreach (var item in input.WmsSortOrderList) { var wmsMaterialContainerModel = wmsMaterialContainers.FirstOrDefault(p => p.MaterialNo == item.Materialcode); if (wmsMaterialContainerModel != null) { if (wmsMaterialContainerModel.BindQuantity < item.ActualQuantity) throw Oops.Oh("分拣组盘异常!"); wmsMaterialContainerModel.BindQuantity -= item.ActualQuantity; if (wmsMaterialContainerModel.BindQuantity <= 0) { wmsMaterialContainers.Remove(wmsMaterialContainerModel); await _wmsMaterialContainerRep.DeleteAsync(wmsMaterialContainerModel); } else { await _wmsMaterialContainerRep.UpdateAsync(wmsMaterialContainerModel); } } var stockModel = await _wmsMaterialStockRep.FirstOrDefaultAsync(p => p.ContainerCode == wareContainer.ContainerCode && p.MaterialNo == item.Materialcode); if (stockModel != null) { if (stockModel.StockNumber < item.ActualQuantity) throw Oops.Oh("分拣库存异常!"); stockModel.StockNumber -= item.ActualQuantity; if (stockModel.StockNumber <= 0) await _wmsMaterialStockRep.DeleteAsync(stockModel); else await _wmsMaterialStockRep.UpdateAsync(stockModel); } // 这里还需要根据实际下发数来更新分拣状态 var wareSortOrderModel = await _wmsSortOrderRep.FirstOrDefaultAsync(p => p.ContainerCode == wareContainer.ContainerCode && p.SortStatus != SortStatusEnum.FENJIANWANCHENG && p.Materialcode == item.Materialcode); if (wareSortOrderModel != null) { wareSortOrderModel.ActualQuantity += item.ActualQuantity; if (wareSortOrderModel.ActualQuantity >= wareSortOrderModel.SortQuantity) { wareSortOrderModel.SortStatus = SortStatusEnum.FENJIANWANCHENG; _wmsSortOrderRep.UpdateNow(wareSortOrderModel); // 分拣单完成后判断出库明细是否完成 } else { wareSortOrderModel.SortStatus = SortStatusEnum.FENJIANZHONG; _wmsSortOrderRep.UpdateNow(wareSortOrderModel); } } } var wareSortOrderCount = await _wmsSortOrderRep .Where(p => p.ContainerCode == input.WmsContainer.ContainerCode && p.SortStatus != SortStatusEnum.FENJIANWANCHENG).CountAsync(); //更新托盘状态,分拣完成 if (wareSortOrderCount == 0) { if (wmsMaterialContainers.Count == 0) wareContainer.ContainerStatus = ContainerStatus.KOUXIAN; else wareContainer.ContainerStatus = ContainerStatus.ZUPANG; // 更新容器状态 await _wmsContainerRep.UpdateAsync(wareContainer); } } /// /// pda出库单查询 /// /// /// [HttpGet("SortPdaPage")] public async Task> SortPdaPage([FromQuery] SortPdaPageInput input) { var wmsTakeMaterialOrder = await _wmsTakeMaterialOrderRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.No), u => EF.Functions.Like(u.NO, $"%{input.No.Trim()}%")) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsTakeMaterialOrder; } /// /// pda根据出库单获取分拣单明细 /// /// /// [HttpGet("SortPdaDetailPage")] public async Task> SortPdaDetailPage([FromQuery] SortPdaDetailPageInput input) { var wmsTakeMaterialOrder = await _wmsSortOrderRep.DetachedEntities .Where(x=>x.OrderNo ==input.No) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsTakeMaterialOrder; } } }