using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using iWare.Wms.Core; using Mapster; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; namespace iWare.Wms.Application { /// /// 任务管理 /// //[ApiDescriptionSettings("仓库作业", Name = "WmsTask", Order = 100)] //[Route("api/[Controller]")] public class WmsTaskService : IWmsTaskService, IDynamicApiController, ITransient { private readonly IRepository _wmsContainerRep; private readonly IRepository _wmsMaterialRep; private readonly IRepository _wmsMaterialContainerRep; private readonly IRepository _wmsAreaRep; private readonly IRepository _wmsPlaceRep; private readonly IRepository _wmsTaskRep; private readonly IRepository _wmsMaterialStockRep; private readonly IRepository _wmsContainerPlaceRep; public WmsTaskService( IRepository wmsContainerRep, IRepository wmsMaterialRep, IRepository wmsMaterialContainerRep, IRepository wmsAreaRep, IRepository wmsPlaceRep, IRepository wmsTaskRep, IRepository wmsMaterialStockRep, IRepository wmsContainerPlaceRep ) { _wmsContainerRep = wmsContainerRep; _wmsMaterialRep = wmsMaterialRep; _wmsMaterialContainerRep = wmsMaterialContainerRep; _wmsAreaRep = wmsAreaRep; _wmsPlaceRep = wmsPlaceRep; _wmsTaskRep = wmsTaskRep; _wmsMaterialStockRep = wmsMaterialStockRep; _wmsContainerPlaceRep = wmsContainerPlaceRep; } /// /// 分页查询任务管理 /// /// /// [HttpGet("page")] public async Task> Page([FromQuery] WmsTaskSearch input) { var wmsTasks = await _wmsTaskRep.DetachedEntities .Where(!string.IsNullOrEmpty(input.Taskno), u => EF.Functions.Like(u.TaskNo, $"%{input.Taskno.Trim()}%")) .Where(input.Taskmodel != null, u => u.TaskModel == input.Taskmodel) .Where(input.Tasktype != null, u => u.TaskType == input.Tasktype) .Where(input.Taskstatus != null, u => u.TaskStatus == input.Taskstatus) .Where(!string.IsNullOrEmpty(input.ContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{input.ContainerCode.Trim()}%")) .Where(!string.IsNullOrEmpty(input.Sourceplace), u => EF.Functions.Like(u.SourcePlace, $"%{input.Sourceplace.Trim()}%")) .Where(!string.IsNullOrEmpty(input.Toplace), u => EF.Functions.Like(u.ToPlace, $"%{input.Toplace.Trim()}%")) .Where(input.Aisle != null, u => u.Aisle == input.Aisle) .Where(!string.IsNullOrEmpty(input.AreaName), u => u.AreaName == input.AreaName) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsTasks; } /// /// 查看详情 /// /// /// [HttpGet("detail")] public async Task> ManualWare([FromQuery] WmsTaskDetailSearch input) { return await _wmsMaterialContainerRep.Where(n => n.OrderNo == input.Orderno).ToListAsync(); } /// /// 强制完成 /// /// /// [HttpGet("FinishWare")] [UnitOfWork] public async Task FinishWare([FromQuery] UpdateFinishTaskDto input) { var taskModel = await _wmsTaskRep.FirstOrDefaultAsync(p => p.Id == input.Id); if (taskModel.TaskStatus == Core.Enum.TaskStatus.WANCHENG) throw Oops.Oh("任务已完成!"); if (taskModel.TaskType == Core.Enum.TaskType.RUKU) //入库 { //检查容器 var containerModel = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == taskModel.ContainerCode); if (taskModel.OrderNo != "N/A" && containerModel.ContainerStatus != Core.Enum.ContainerStatus.ZUPANG) throw Oops.Oh("托盘未进行组盘!"); if (taskModel.OrderNo == "N/A" && containerModel.ContainerStatus != Core.Enum.ContainerStatus.KOUXIAN) throw Oops.Oh("托盘信息不存在!"); //检查库位 var placeModel = await _wmsPlaceRep.DetachedEntities.Where(p => p.PlaceCode == taskModel.ToPlace).ProjectToType().FirstOrDefaultAsync(); if (placeModel == null) throw Oops.Oh("库位不存在!"); if (placeModel.PlaceStatus != Core.Enum.PlaceStatus.DAIRU) throw Oops.Oh("库位异常货!"); //物料托盘关系表 var wmsMaterialContainerList = await _wmsMaterialContainerRep.DetachedEntities .Where(p => p.OrderNo == taskModel.OrderNo).ProjectToType().ToListAsync(); //创建托盘库位关系表 var wmsContainerPlaceModel = new WmsContainerPlace() { PlaceId = placeModel.Id, PlaceCode = placeModel.PlaceCode, ContainerId = containerModel.Id, ContainerCode = containerModel.ContainerCode, ContainerPlaceStatus = CommonStatus.ENABLE }; await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlaceModel); //托盘状态 containerModel.ContainerStatus = Core.Enum.ContainerStatus.KUWEI; await _wmsContainerRep.UpdateAsync(containerModel); //更新库位 placeModel.PlaceStatus = Core.Enum.PlaceStatus.CUNHUO; if (taskModel.OrderNo == "N/A") placeModel.EmptyContainer = YesOrNot.Y; else placeModel.EmptyContainer = YesOrNot.N; await _wmsPlaceRep.UpdateAsync(placeModel); //更新任务 taskModel.TaskStatus = Core.Enum.TaskStatus.WANCHENG; await _wmsTaskRep.UpdateAsync(taskModel); //更新库存 foreach (var item in wmsMaterialContainerList) { var StockModel = await _wmsMaterialStockRep .Where(p => p.ContainerCode == taskModel.ContainerCode && p.MaterialName == item.MaterialName && p.MaterialNo == item.MaterialNo && p.MaterialBatch == item.MaterialBatch).FirstOrDefaultAsync(); if (StockModel != null) { StockModel.PlaceCode = taskModel.ToPlace; StockModel.AreaId = placeModel.WmsArea.Id; StockModel.StockNumber = item.BindQuantity; await _wmsMaterialStockRep.UpdateAsync(StockModel); } else { StockModel = new WmsMaterialStock() { MaterialNo = item.WmsMaterial.MaterialNo, MaterialType = item.WmsMaterial.MaterialType, MaterialName = item.WmsMaterial.MaterialName, MaterialSpec = item.WmsMaterial.MaterialSpec, MaterialBatch = item.WmsMaterial.MaterialBatch, InspectionMethod = item.WmsMaterial.InspectionMethod, UnitType = item.WmsMaterial.UnitType, UnitNo = item.WmsMaterial.UnitNo, StockNumber = item.BindQuantity, PlaceCode = taskModel.ToPlace, ContainerCode = taskModel.ContainerCode, AreaId = placeModel.WmsArea.Id, }; await _wmsMaterialStockRep.InsertAsync(StockModel); } } //空托 if (taskModel.OrderNo == "N/A") { var StockModel = new WmsMaterialStock() { MaterialNo = "N/A", MaterialType = Core.Enum.MaterialType.KONGTUO, MaterialName = "N/A", MaterialSpec = "N/A", MaterialBatch = "N/A", InspectionMethod = Core.Enum.MaterialInspection.MIANJIAN, UnitType = Core.Enum.UnitType.ZHONGLIANG, UnitNo = Core.Enum.UnitnoType.T, StockNumber = 1, PlaceCode = placeModel.PlaceCode, ContainerCode = containerModel.ContainerCode, AreaId = placeModel.AreaId, }; await _wmsMaterialStockRep.InsertAsync(StockModel); } } else //出库操作 { //库位信息 var placeModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.SourcePlace); if (placeModel == null) throw Oops.Oh("库位不存在!"); if (placeModel.PlaceStatus != Core.Enum.PlaceStatus.DAICHU) throw Oops.Oh("库位异常货!"); //容器信息 var containerModel = await _wmsContainerRep.FirstOrDefaultAsync(n => n.ContainerCode == taskModel.ContainerCode && n.ContainerStatus == Core.Enum.ContainerStatus.KUWEI); if (containerModel == null) throw Oops.Oh("托盘信息不存在!"); //库位容器关系 var containerPlaceModel = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == containerModel.ContainerCode && p.ContainerId == containerModel.Id && p.PlaceCode == placeModel.PlaceCode && p.PlaceId == placeModel.Id && p.ContainerPlaceStatus == CommonStatus.ENABLE); if (containerPlaceModel == null) throw Oops.Oh("库位容器关系不存在!"); //关系对应出库的物料 var materialContainersList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == taskModel.ContainerCode && p.BindStatus == CommonStatus.ENABLE && p.OrderNo == taskModel.OrderNo).ToListAsync(); var materialContainersListold = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == taskModel.ContainerCode && p.BindStatus == CommonStatus.DISABLE).ToListAsync(); //库存 var materialStockList = await _wmsMaterialStockRep.Where(n => n.ContainerCode == taskModel.ContainerCode && n.PlaceCode == taskModel.SourcePlace).ToListAsync(); //库位 placeModel.PlaceStatus = Core.Enum.PlaceStatus.KONGXIAN; placeModel.EmptyContainer = YesOrNot.N; await _wmsPlaceRep.UpdateAsync(placeModel); //构建出库物料和托盘关系 var orderNo = "N/A"; if (materialContainersList.Count > 0) orderNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(); foreach (var item in materialContainersListold) { //修改 item.BindStatus = CommonStatus.DELETED; await _wmsMaterialContainerRep.UpdateAsync(item); } foreach (var item in materialContainersList) { //修改 item.BindStatus = CommonStatus.DISABLE; await _wmsMaterialContainerRep.UpdateAsync(item); //新增 var bindentranceModel = new WmsMaterialContainer() { ContainerId = item.ContainerId, ContainerCode = item.ContainerCode, MaterialName = item.MaterialName, MaterialNo = item.MaterialNo, MaterialBatch = item.MaterialBatch, MaterialSpec = item.MaterialSpec, MaterialId = item.MaterialId, BindQuantity = item.BindQuantity, BindStatus = CommonStatus.ENABLE, OrderNo = orderNo, }; await _wmsMaterialContainerRep.InsertNowAsync(bindentranceModel); } //修改库存 foreach (var item in materialStockList) { item.PlaceCode = "N/A"; item.AreaId = 0; item.StockNumber = 0; await _wmsMaterialStockRep.UpdateAsync(item); } //禁用托盘库位关系 containerPlaceModel.ContainerPlaceStatus = CommonStatus.DELETED; await _wmsContainerPlaceRep.UpdateAsync(containerPlaceModel); //更新任务 taskModel.TaskStatus = Core.Enum.TaskStatus.WANCHENG; await _wmsTaskRep.UpdateAsync(taskModel); //托盘状态 if (taskModel.OrderNo == "N/A") containerModel.ContainerStatus = Core.Enum.ContainerStatus.KOUXIAN; else containerModel.ContainerStatus = Core.Enum.ContainerStatus.ZUPANG; await _wmsContainerRep.UpdateAsync(containerModel); } } /// /// 更改优先级别 /// /// /// [HttpGet("UpdateTasklevel")] [UnifyResult(typeof(object))] public async Task UpdateTasklevel([FromQuery] UpdateTasklevelDto input) { var taskModel = await _wmsTaskRep.FirstOrDefaultAsync(p => p.Id == input.Id); if (taskModel.TaskStatus != Core.Enum.TaskStatus.WEIZHIXING) throw Oops.Oh("只有未执行的任务能进行更改优先级别!"); taskModel.TaskLevel = input.Tasklevel; await _wmsTaskRep.UpdateAsync(taskModel); return XnRestfulResultProvider.RESTfulResult(); } /// /// 删除任务 /// /// /// [HttpGet("DeleteTask")] [UnitOfWork] public async Task DeleteTask([FromQuery] DeleteTaskDto input) { var taskModel = await _wmsTaskRep.FirstOrDefaultAsync(p => p.Id == input.Id); if (taskModel.TaskStatus != Core.Enum.TaskStatus.WEIZHIXING) throw Oops.Oh("只有未执行的任务才能进行删除!"); //库位信息 if (taskModel.TaskType == Core.Enum.TaskType.RUKU) { var placeModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.ToPlace); if (placeModel == null) throw Oops.Oh("库位不存在!"); if (placeModel.PlaceStatus != Core.Enum.PlaceStatus.DAIRU) throw Oops.Oh("库位异常货!"); placeModel.PlaceStatus = Core.Enum.PlaceStatus.KONGXIAN; await _wmsPlaceRep.UpdateAsync(placeModel); } else { var placeModel = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.SourcePlace); if (placeModel == null) throw Oops.Oh("库位不存在!"); if (placeModel.PlaceStatus != Core.Enum.PlaceStatus.DAICHU) throw Oops.Oh("库位异常货!"); placeModel.PlaceStatus = Core.Enum.PlaceStatus.CUNHUO; await _wmsPlaceRep.UpdateAsync(placeModel); var materialContainerOld = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == taskModel.ContainerCode && p.BindStatus == CommonStatus.DISABLE).ToListAsync(); foreach (var item in materialContainerOld) { item.BindStatus = CommonStatus.ENABLE; await _wmsMaterialContainerRep.UpdateAsync(item); } var materialContainer = await _wmsMaterialContainerRep.Where(p => p.OrderNo == taskModel.OrderNo).ToListAsync(); foreach (var item in materialContainer) { await _wmsMaterialContainerRep.DeleteNowAsync(item); } } await _wmsTaskRep.DeleteNowAsync(taskModel); } } }