using Furion; 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 Admin.NET.Core; using Yitter.IdGenerator; using StackExchange.Redis; namespace Admin.NET.Application { /// /// WCS调用服务 /// [ApiDescriptionSettings("WCS调用服务", Name = "WareWcsToWmsService", Order = 100)] [Route("api/[Controller]")] public class WareWcsToWmsService : IDynamicApiController, ITransient { private readonly IRepository _wmsOrderRep; private readonly IRepository _wmsOrderDetailsRep; private readonly IRepository _wmsTaskRep; private readonly IRepository _wmsMaterialContainerRep; private readonly IRepository _wmsPlaceRep; private readonly IRepository _wmsContainerPlaceRep; private readonly IRepository _wmsMaterialStockRep; private readonly IRepository _wmsContainerRep; private readonly IRepository _lesPackWarehouseRep; private readonly IRepository _lesDeviceWaringRep; /// /// 构造函数 /// public WareWcsToWmsService( IRepository wmsOrderRep, IRepository wmsOrderDetailsRep, IRepository wmsTaskRep, IRepository wmsMaterialContainerRep, IRepository wmsPlaceRep, IRepository wmsContainerPlaceRep, IRepository wmsMaterialStockRep, IRepository wmsContainerRep, IRepository lesPackWarehouseRep, IRepository lesDeviceWaringRep ) { _wmsOrderRep = wmsOrderRep; _wmsOrderDetailsRep = wmsOrderDetailsRep; _wmsTaskRep = wmsTaskRep; _wmsMaterialContainerRep = wmsMaterialContainerRep; _wmsPlaceRep = wmsPlaceRep; _wmsContainerPlaceRep = wmsContainerPlaceRep; _wmsMaterialStockRep = wmsMaterialStockRep; _wmsContainerRep = wmsContainerRep; _lesPackWarehouseRep = lesPackWarehouseRep; _lesDeviceWaringRep = lesDeviceWaringRep; } /// /// 定时查询WCS可以下发的出入库任务(10条) /// /// [HttpGet("GetSendTask")] [AllowAnonymous] public async Task> GetSendTask() { var outputList = new List(); var alllist = await _wmsTaskRep.DetachedEntities .Where(z => z.IsRead == true) .Take(10) .OrderByDescending(n => n.TaskLevel) .OrderBy(p => p.CreatedTime).ToListAsync(); foreach (var item in alllist) { var sendTaskDetail = new SendTaskDetailOutput(); //任务详情 sendTaskDetail.TaskNo = item.TaskNo; if (item.TaskType == TaskType.RUKU) sendTaskDetail.SourcePlace = item.ToPlace; else sendTaskDetail.SourcePlace = item.SourcePlace; sendTaskDetail.Aisle = item.Aisle; sendTaskDetail.TaskType = item.TaskType; sendTaskDetail.TaskLevel = item.TaskLevel; sendTaskDetail.ContainerCode = item.ContainerCode; sendTaskDetail.TaskStatus = item.TaskStatus; outputList.Add(sendTaskDetail); //item.IsRead=false; //item.TaskStatus = TaskStatusEnum.DAIZHIXING; //await _wmsTaskRep.UpdateAsync(item); } return outputList; } /// /// 更新任务信息 /// /// [HttpPost("UpdateTask")] [UnitOfWork] [AllowAnonymous] public async Task UpdateTask([FromBody] UpdateTaskInput input) { //根据任务号查询任务信息 var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(z => z.TaskNo == input.TaskNo); if (wmsTask == null) throw Oops.Oh(errorMessage: "任务不存在!"); wmsTask.TaskDodeviceStatus = input.TaskDodeviceStatus; wmsTask.TaskStatus = TaskStatusEnum.ZHIXINGZHONG; wmsTask.IsRead = false; WmsPlace wmsPlace = new WmsPlace(); //判断入库还是出库 if (wmsTask.TaskType == TaskType.RUKU) { //库位信息 wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(z => z.PlaceCode == wmsTask.ToPlace); } else if (wmsTask.TaskType == TaskType.CHUKU) { //库位信息 wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(z => z.PlaceCode == wmsTask.SourcePlace); } if (wmsPlace == null) throw Oops.Oh(errorMessage: "库位不存在!"); // 查询托盘信息 var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode); if (wmsContainer == null) throw Oops.Oh("托盘不存在!"); //入库称重 //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RKCZ) //{ //} //入库输送线开始 //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RSSX) //{ //} //入库输送线结束 //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_RSSX) //{ //} //入库RGV开始 //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_RGV) //{ //} //入库RGV结束 //if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_RGV) //{ //} //入库开始 if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.ZX_DDJ) { // 更新库位状态 wmsPlace.PlaceStatus = PlaceStatus.DAIRU; await _wmsPlaceRep.UpdateAsync(wmsPlace); } //入库完成 if (wmsTask.TaskType == TaskType.RUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ) { //首先更新任务状态完成 wmsTask.TaskStatus = TaskStatusEnum.WANCHENG; //更新设备状态 wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W; // 更新托盘状态为“库位” wmsContainer.ContainerStatus = ContainerStatus.KUWEI; await _wmsContainerRep.UpdateAsync(wmsContainer); //库位信息 if (wmsPlace == null) throw Oops.Oh("库位不存在!"); if (wmsPlace.Islock == YesOrNot.Y) throw Oops.Oh("库位被锁定!"); // 更新库位状态为“存货” wmsPlace.PlaceStatus = PlaceStatus.CUNHUO; if (wmsTask.Description == "空托") wmsPlace.EmptyContainer = YesOrNot.Y; else wmsPlace.EmptyContainer = YesOrNot.N; await _wmsPlaceRep.UpdateAsync(wmsPlace); // 创建托盘号库位关系表 var wmsContainerPlaceModel = new WmsContainerPlace() { PlaceId = wmsPlace.Id, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, ContainerPlaceStatus = CommonStatus.ENABLE }; await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlaceModel); // 更新库存 var wmsMaterialContainerList = await _wmsMaterialContainerRep.DetachedEntities .Where(p => p.OrderNo == wmsTask.OrderNo && p.BindStatus == CommonStatus.ENABLE).ProjectToType().ToListAsync(); foreach (var item in wmsMaterialContainerList) { var wmsMaterialStock = await _wmsMaterialStockRep.FirstOrDefaultAsync(p => p.ContainerCode == wmsContainer.ContainerCode && p.MaterialBatch == item.MaterialBatch); if (wmsMaterialStock != null) { wmsMaterialStock.Source = RuKuSourceEnum.WULIAO; wmsMaterialStock.AreaId = wmsPlace.AreaId; wmsMaterialStock.PlaceCode = wmsPlace.PlaceCode; wmsMaterialStock.StockNumber = item.BindQuantity; await _wmsMaterialStockRep.UpdateAsync(wmsMaterialStock); } else { wmsMaterialStock = new WmsMaterialStock() { InspectionMethod = MaterialInspection.MIANJIAN, UnitType = UnitType.ZHONGLIANG, UnitNo = UnitNoType.T, MaterialNo = item.MaterialNo, MaterialType = MaterialType.CHENGPING, MaterialName = item.MaterialName, MaterialSpec = item.MaterialSpec, MaterialBatch = item.MaterialBatch, MaterialDensity = item.MaterialDensity, StockNumber = item.BindQuantity, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, AreaId = wmsPlace.AreaId, Source = RuKuSourceEnum.WULIAO }; await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock); } } // 空料箱入库 if (wmsTask.Description == "空托") { var wmsMaterialStock = new WmsMaterialStock() { InspectionMethod = MaterialInspection.MIANJIAN, UnitType = UnitType.ZHONGLIANG, UnitNo = UnitNoType.T, MaterialNo = "N/A", MaterialType = MaterialType.KONGTUO, MaterialName = "N/A", MaterialSpec = "N/A", MaterialBatch = "N/A", MaterialDensity = "N/A", StockNumber = 0, PlaceCode = wmsPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, AreaId = wmsPlace.AreaId, Source = RuKuSourceEnum.KONGTUO }; await _wmsMaterialStockRep.InsertAsync(wmsMaterialStock); } } //出库堆垛机完成,执行库存,库位,托盘对应关系进行更新 else if (wmsTask.TaskType == TaskType.CHUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ) { if (wmsPlace == null) throw Oops.Oh("库位不存在!"); if (wmsPlace.PlaceStatus != PlaceStatus.DAICHU) throw Oops.Oh("库位异常货!"); // 查询托盘与库位的关系 var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == wmsPlace.Id && z.PlaceCode == wmsPlace.PlaceCode && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE); if (wmsContainerPlace == null) throw Oops.Oh("库位容器关系不存在!"); // 查询库存信息 var wmsMaterialStockList = await _wmsMaterialStockRep.DetachedEntities.Where(u => u.ContainerCode == wmsTask.ContainerCode).ToListAsync(); if (wmsMaterialStockList.Count <= 0) throw Oops.Oh("库存数据异常!"); ////查询物料与托盘组盘关系(状态:正常) var wmsMaterialContainerList = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.BindStatus == CommonStatus.ENABLE && p.OrderNo == wmsTask.OrderNo).ToListAsync(); //判断物料是否是空托,如果是空托直接删除,不是空托查询物料 if (wmsMaterialContainerList.Count == 0) { //删除库存 foreach (var item in wmsMaterialStockList) { await _wmsMaterialStockRep.DeleteAsync(item); } // 更新托盘状态为“空闲” wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN; } else { //构建出库物料和周转箱号关系 var orderNo = "N/A"; if (wmsMaterialContainerList.Count > 0) orderNo = YitIdHelper.NextId().ToString(); foreach (var item in wmsMaterialContainerList) { //更新状态为”删除“ item.BindStatus = CommonStatus.DELETED; await _wmsMaterialContainerRep.UpdateNowAsync(item); //新增组盘绑定记录 正常 var wmsMaterialContainer = item; wmsMaterialContainer.Id = YitIdHelper.NextId(); wmsMaterialContainer.OrderNo = orderNo; wmsMaterialContainer.BindStatus = CommonStatus.ENABLE; await _wmsMaterialContainerRep.InsertNowAsync(wmsMaterialContainer); //更改库存的库位号为N/A foreach (var stock in wmsMaterialStockList) { stock.PlaceCode = "N/A"; await _wmsMaterialStockRep.UpdateAsync(stock); } } wmsContainer.ContainerStatus = ContainerStatus.FENJIAN; } await _wmsContainerRep.UpdateAsync(wmsContainer); //更新库位状态为“空闲” wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN; wmsPlace.Islock = YesOrNot.N; wmsPlace.EmptyContainer = YesOrNot.N; await _wmsPlaceRep.UpdateAsync(wmsPlace); //更新周转箱号与库位关系为“删除” wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED; await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace); } if (wmsTask.TaskType == TaskType.CHUKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_CSSX) { wmsTask.TaskStatus = TaskStatusEnum.WANCHENG; wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W; } else //移库 { if (wmsTask.TaskType == TaskType.YIKU && input.TaskDodeviceStatus == TaskDodeviceStatusEnum.WC_DDJ) { wmsTask.TaskStatus = TaskStatusEnum.WANCHENG; wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W; // 起点库位信息 var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync(); SourcePlace.PlaceStatus = PlaceStatus.KONGXIAN; await _wmsPlaceRep.UpdateAsync(SourcePlace); //目标库位信息 var ToPlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.ToPlace).FirstOrDefaultAsync(); ToPlace.PlaceStatus = PlaceStatus.CUNHUO; await _wmsPlaceRep.UpdateAsync(ToPlace); //托盘库位关系表 var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == SourcePlace.Id && z.PlaceCode == SourcePlace.PlaceCode && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE); wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED; await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace); await _wmsContainerPlaceRep.InsertAsync(new WmsContainerPlace() { PlaceId = ToPlace.Id, PlaceCode = ToPlace.PlaceCode, ContainerId = wmsContainer.Id, ContainerCode = wmsContainer.ContainerCode, ContainerPlaceStatus = CommonStatus.ENABLE }); //库存库位更新 var stockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.PlaceCode == SourcePlace.PlaceCode).FirstOrDefaultAsync(); if (stockModel != null) { stockModel.PlaceCode = ToPlace.PlaceCode; } } } await _wmsTaskRep.UpdateAsync(wmsTask); } /// /// 获取库位信息 /// /// [HttpPost("GetPlace")] [AllowAnonymous] public async Task GetPlace([FromBody] GetPlaceInput input) { //1.列 优先1排和4排 层优先从下到上 //2.保留10个内侧移库库位 var taskModel = await _wmsTaskRep.Where(p => p.TaskNo == input.TaskNo).FirstOrDefaultAsync(); if (taskModel == null) return new GetPlaceOutput() { TaskIsExist = false }; if (taskModel.TaskStatus == TaskStatusEnum.CHEHUI || taskModel.TaskStatus == TaskStatusEnum.QUXIAO || taskModel.TaskStatus == TaskStatusEnum.WANCHENG || taskModel.TaskStatus == TaskStatusEnum.ZANTING) { throw Oops.Oh("任务状态未满足获取的库位条件"); } taskModel.TaskStatus = TaskStatusEnum.ZHIXINGZHONG; //定义入库对象,移库对象 var ToPlace = new WmsPlace(); var SourcePlace = new WmsPlace(); var rowNumber = 0; //入库流程 if (taskModel.TaskType == TaskType.RUKU) { //防重操作 if (taskModel != null && !string.IsNullOrEmpty(taskModel.ToPlace)) { ToPlace = await _wmsPlaceRep.Where(p => p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && p.PlaceCode == taskModel.ToPlace).FirstOrDefaultAsync(); if (ToPlace.RowNo == GetOneRowByAisle(taskModel.Aisle) || ToPlace.RowNo == GetFourRowByAisle(taskModel.Aisle)) { if (ToPlace.RowNo == GetOneRowByAisle(taskModel.Aisle)) rowNumber = GetTwoRowByAisle(taskModel.Aisle); else rowNumber = GetThreeRowByAisle(taskModel.Aisle); SourcePlace = await _wmsPlaceRep.Where(p => p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && p.Aisle == taskModel.Aisle && p.RowNo == rowNumber && p.ColumnNo == ToPlace.ColumnNo && p.LayerNo == ToPlace.LayerNo).FirstOrDefaultAsync(); if (SourcePlace != null && SourcePlace.PlaceStatus == PlaceStatus.CUNHUO) return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode }; } return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode }; } //获取立体库可用库位 var placeList = await _wmsPlaceRep.DetachedEntities.Where(z => z.PlaceStatus == PlaceStatus.KONGXIAN && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == taskModel.Aisle).ProjectToType().ToListAsync(); //获取当前立体库需要出库库位集合 var placeCodeList = await _wmsTaskRep.DetachedEntities.Where(p => p.IsRead == true && p.TaskType == TaskType.CHUKU && p.Aisle == taskModel.Aisle).Select(n => n.SourcePlace).ToListAsync(); var ckPlaceModelList = await _wmsPlaceRep.DetachedEntities.Where(z => placeCodeList.Contains(z.PlaceCode) && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == taskModel.Aisle).ToListAsync(); //配置文件中设置是否开启指定库位入库和移库操作 //if (Convert.ToBoolean(App.Configuration["YiKuTestPalce:IsStart"])) //{ // var rukuPoint = App.Configuration["YiKuTestPalce:rukuPoint"].Split('.'); //入库起点 // var yikuPoint = App.Configuration["YiKuTestPalce:yikuPoint"].Split('.'); //移库起点 // ToPlace = placeList.Where(p => p.RowNo == Convert.ToInt32(rukuPoint[0]) // && p.ColumnNo == Convert.ToInt32(rukuPoint[1]) && p.LayerNo == Convert.ToInt32(rukuPoint[2])).FirstOrDefault(); // if (ToPlace != null) // { // ToPlace.PlaceStatus = PlaceStatus.DAIRU; // await _wmsPlaceRep.UpdateAsync(ToPlace); // taskModel.ToPlace = ToPlace.PlaceCode; // taskModel.AreaName = ToPlace.WmsArea.AreaName; // await _wmsTaskRep.UpdateAsync(taskModel); // if (yikuPoint.Length > 1) // { // SourcePlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.RowNo == Convert.ToInt32(yikuPoint[0]) // && p.ColumnNo == Convert.ToInt32(yikuPoint[1]) && p.LayerNo == Convert.ToInt32(yikuPoint[2]) // && p.Aisle == taskModel.Aisle && p.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN // && p.WmsArea.AreaType == AreaType.LITIKU // ); // } // return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode }; // } //} var maxColumn = placeList.Max(selector: n => n.ColumnNo); var maxLayerNo = 0; //先以列为进行循环判断 for (int j = 1; j <= maxColumn; j++) { //获取该列的最大层 if (placeList.Where(p => p.ColumnNo == j).Count() <= 1) continue; maxLayerNo = placeList.Where(p => p.ColumnNo == j).Max(selector: n => n.LayerNo); //循环每列每层的中列 //分配库位需要考虑外侧是否有出库任务,有的话就没有执行 for (int f = 1; f <= maxLayerNo; f++) { var model = placeList.FirstOrDefault(p => p.RowNo == GetOneRowByAisle(taskModel.Aisle) && p.ColumnNo == j && p.LayerNo == f); var ckmodel = ckPlaceModelList.FirstOrDefault(p => p.RowNo == GetTwoRowByAisle(taskModel.Aisle) && p.ColumnNo == j && p.LayerNo == f); if (model != null && ckmodel == null) { ToPlace = model; break; } } if (!string.IsNullOrEmpty(ToPlace.PlaceCode)) break; } if (string.IsNullOrEmpty(ToPlace.PlaceCode)) throw Oops.Oh("暂无可以库位!"); //进行库位和任务的更新 ToPlace.PlaceStatus = PlaceStatus.DAIRU; await _wmsPlaceRep.UpdateAsync(ToPlace); taskModel.ToPlace = ToPlace.PlaceCode; taskModel.AreaName = ToPlace.WmsArea.AreaName; await _wmsTaskRep.UpdateAsync(taskModel); if (SourcePlace == null || string.IsNullOrEmpty(SourcePlace.PlaceCode)) return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode }; else return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode }; } //出库流程 if (taskModel.TaskType == TaskType.CHUKU) { //需要判断下库位是否已经进行移库操作,需要通过托盘编号进行重新查找 var containerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(p => p.ContainerCode == taskModel.ContainerCode && p.ContainerPlaceStatus == CommonStatus.ENABLE); if (containerPlace != null && containerPlace.PlaceCode != taskModel.SourcePlace) { ToPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == containerPlace.PlaceCode); taskModel.SourcePlace = containerPlace.PlaceCode; } else { ToPlace = await _wmsPlaceRep.FirstOrDefaultAsync(p => p.PlaceCode == taskModel.SourcePlace); } //进行库位和任务的更新 ToPlace.PlaceStatus = PlaceStatus.DAICHU; await _wmsPlaceRep.UpdateAsync(ToPlace); taskModel.ToPlace = taskModel.Aisle.ToString(); await _wmsTaskRep.UpdateAsync(taskModel); if (SourcePlace == null || string.IsNullOrEmpty(SourcePlace.PlaceCode)) return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode }; else return new GetPlaceOutput() { ToPlace = ToPlace.PlaceCode, SourcePlace = SourcePlace.PlaceCode }; } else { throw Oops.Oh("任务异常" + taskModel.TaskNo); } } /// /// 创建移库任务 /// /// [HttpPost("CreateYKTask")] [UnitOfWork] [AllowAnonymous] public async Task CreateRelocation(CreateRelocationInput input) { var placeModel = await _wmsPlaceRep.Where(p => p.PlaceCode == input.SourcePlace).ProjectToType().FirstOrDefaultAsync(); if (placeModel == null) throw Oops.Oh("库位数据异常!"); placeModel.PlaceStatus = PlaceStatus.DAICHU; await _wmsPlaceRep.UpdateAsync(placeModel); //查询组盘单据 var containerPlaceModel = await _wmsContainerPlaceRep.Where(p => p.PlaceCode == input.SourcePlace && p.ContainerPlaceStatus == CommonStatus.ENABLE).FirstOrDefaultAsync(); if (containerPlaceModel == null) throw Oops.Oh("移库库位托盘数据异常!"); var materialContainer = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == containerPlaceModel.ContainerCode && p.BindStatus == CommonStatus.ENABLE).FirstOrDefaultAsync(); if (materialContainer == null) throw Oops.Oh("组盘数据异常!"); //获取空闲库位集合 var placeList = await _wmsPlaceRep.DetachedEntities.Where(z => z.PlaceStatus == PlaceStatus.KONGXIAN && z.Islock == YesOrNot.N && z.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN && z.WmsArea.AreaType == AreaType.LITIKU && z.Aisle == input.Aisle).ToListAsync(); if (placeList.Count == 0) throw Oops.Oh("无可移库库位!"); //定义目标点 var ToPlaceModel = new WmsPlace(); var rowNumber = 0; //1.推荐外侧库位 var wcPlaceList = placeList.Where(p => (p.RowNo == GetOneRowByAisle(placeModel.Aisle) || p.RowNo == GetFourRowByAisle(placeModel.Aisle))).ToList(); if (placeModel.Aisle == 11) { wcPlaceList = placeList.Where(p => (p.RowNo == GetOneRowByAisle(placeModel.Aisle) || p.RowNo == GetThreeRowByAisle(placeModel.Aisle))).ToList(); } //定义最优库位集合 var zyPlaceList = new List(); //循环判断对应的2,3是有货 foreach (var item in wcPlaceList) { if (placeModel.Aisle == 11) { if (item.RowNo == GetOneRowByAisle(placeModel.Aisle)) { zyPlaceList.Add(item); } if (item.RowNo == GetThreeRowByAisle(placeModel.Aisle)) { rowNumber = GetTwoRowByAisle(placeModel.Aisle); var dypalceModel = placeList.Where(p => p.RowNo == rowNumber && p.ColumnNo == item.ColumnNo && p.LayerNo == item.LayerNo).FirstOrDefault(); if (dypalceModel != null) zyPlaceList.Add(item); } } else { if (item.RowNo == GetOneRowByAisle(placeModel.Aisle) || item.RowNo == GetFourRowByAisle(placeModel.Aisle)) { if (item.RowNo == GetOneRowByAisle(placeModel.Aisle)) rowNumber = GetTwoRowByAisle(placeModel.Aisle); else rowNumber = GetThreeRowByAisle(placeModel.Aisle); var dypalceModel = placeList.Where(p => p.RowNo == rowNumber && p.ColumnNo == item.ColumnNo && p.LayerNo == item.LayerNo).FirstOrDefault(); if (dypalceModel != null) zyPlaceList.Add(item); } } } if (zyPlaceList.Count != 0) { //获取路径最短的库位 使用二分法 var mindModel = zyPlaceList.Where(p => p.ColumnNo == placeModel.ColumnNo).FirstOrDefault(); var leftModel = zyPlaceList.Where(p => p.ColumnNo < placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault(); var rightModel = zyPlaceList.Where(p => p.ColumnNo > placeModel.ColumnNo).OrderBy(p => p.ColumnNo).FirstOrDefault(); if (mindModel != null) ToPlaceModel = mindModel; else if (leftModel == null) ToPlaceModel = rightModel; else if (rightModel == null) ToPlaceModel = leftModel; else if ((placeModel.ColumnNo - leftModel.ColumnNo) > (rightModel.ColumnNo - placeModel.ColumnNo)) ToPlaceModel = rightModel; else ToPlaceModel = leftModel; } if (string.IsNullOrEmpty(ToPlaceModel.PlaceCode)) { //2.次优库位集合 //次优2,3排库位 var cyPlace = placeList.Where(p => (p.RowNo == GetTwoRowByAisle(placeModel.Aisle) || p.RowNo == GetThreeRowByAisle(placeModel.Aisle))).OrderByDescending(p => p.ColumnNo).OrderBy(p => p.LayerNo).ToList(); if (placeModel.Aisle == 11) { cyPlace = placeList.Where(p => p.RowNo == GetTwoRowByAisle(placeModel.Aisle)).OrderByDescending(p => p.ColumnNo).OrderBy(p => p.LayerNo).ToList(); } if (cyPlace.Count > 0) { //获取路径最短的库位 使用二分法 var mindModel = cyPlace.Where(p => p.ColumnNo == placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault(); var leftModel = cyPlace.Where(p => p.ColumnNo < placeModel.ColumnNo).OrderByDescending(p => p.ColumnNo).FirstOrDefault(); var rightModel = cyPlace.Where(p => p.ColumnNo > placeModel.ColumnNo).OrderBy(p => p.ColumnNo).FirstOrDefault(); if (mindModel != null) ToPlaceModel = mindModel; else if (leftModel == null) ToPlaceModel = rightModel; else if (rightModel == null) ToPlaceModel = leftModel; else if ((placeModel.ColumnNo - leftModel.ColumnNo) > (rightModel.ColumnNo - placeModel.ColumnNo)) ToPlaceModel = rightModel; else ToPlaceModel = leftModel; } } ToPlaceModel.PlaceStatus = PlaceStatus.DAIRU; await _wmsPlaceRep.UpdateAsync(ToPlaceModel); //创建移库任务 var newWmsTask = new WmsTask() { //TaskNo = _commonOrderServiceRep.GetFYKOrderNo(), TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), TaskModel = TaskModel.QUANZIDONG, TaskType = TaskType.YIKU, TaskLevel = 5, TaskStatus = TaskStatusEnum.WEIZHIXING, OrderNo = materialContainer.OrderNo, OrderDetailsId = materialContainer.OrderDetailsId, ContainerCode = materialContainer.ContainerCode, SourcePlace = placeModel.PlaceCode, ToPlace = ToPlaceModel.PlaceCode, AreaName = placeModel.WmsArea.AreaName, IsRead = true, //WCS是否可以读取 SendTimes = 1, //发送次数 Aisle = placeModel.Aisle, Dodevicetype = DodeviceType.AGV, TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX, }; await _wmsTaskRep.InsertAsync(newWmsTask); return new GetYiKuPlaceOutput() { ToPlace = ToPlaceModel.PlaceCode, TaskNo = newWmsTask.TaskNo, }; } ///// ///// 强制完成 ///// ///// //[HttpPost("Finish")] //[UnitOfWork] //[AllowAnonymous] //public async Task Finish([FromBody] FinishTaskInput input) //{ // var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.TaskNo == input.TaskNo); // if (wmsTask == null) throw Oops.Oh("任务不存在!"); // if (wmsTask.TaskStatus == TaskStatusEnum.WANCHENG) throw Oops.Oh("任务已完成,强制完成失败!"); // var statusList = new List { TaskStatusEnum.WEIZHIXING, TaskStatusEnum.ZHIXINGZHONG }; // if (!statusList.Contains(wmsTask.TaskStatus)) throw Oops.Oh("只有未执行和执行中的任务才能强制完成!"); // if (wmsTask.TaskType == TaskType.RUKU) // 入库任务 // { // var taskStatusList = new List { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ }; // if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!"); // //查询库位 // var wmsPlace = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == wmsTask.ToPlace // && u.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ProjectToType().FirstOrDefaultAsync(); // // 查询托盘 // var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode); // if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!"); // // 更新任务状态 // wmsTask.TaskStatus = TaskStatusEnum.WANCHENG; // wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W; // wmsTask.IsRead = false; // await _wmsTaskRep.UpdateAsync(wmsTask); // // 更新单据明细状态为完成、更新托盘编号、更新库位编号 // var wmsOrderDetails = await _wmsOrderDetailsRep.Where(z => z.Id == wmsTask.OrderDetailsId).ProjectToType().FirstOrDefaultAsync(); // if (wmsOrderDetails != null) // { // wmsOrderDetails.ContainerCode = wmsTask.ContainerCode; // wmsOrderDetails.PlaceCode = wmsPlace.PlaceCode; // wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WANCHENG; // await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails); // } // // 单据明细完成总数 // var orderDetailsCount = (await _wmsOrderDetailsRep.DetachedEntities // .Where(z => z.OrderId == wmsOrderDetails.WareOrder.Id && z.OrderStatus == OrderDetailsStatusEnum.WANCHENG).ToListAsync()).Count; // if (orderDetailsCount == wmsOrderDetails.WareOrder.OrderQuantityTotal) // { // wmsOrderDetails.WareOrder.OrderStatus = OrderStatusEnum.WANCHENG; // await _wmsOrderRep.UpdateAsync(wmsOrderDetails.WareOrder); // } // // 更新库位状态为存货 // wmsPlace.PlaceStatus = PlaceStatus.CUNHUO; // await _wmsPlaceRep.UpdateAsync(wmsPlace); // // 更新托盘状态为“库位” // wmsContainer.ContainerStatus = ContainerStatus.KUWEI; // await _wmsContainerRep.UpdateAsync(wmsContainer); // // 物料与托盘关系 // var wmsMaterialContainer = await _wmsMaterialContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode // && z.MaterialNo == wmsOrderDetails.MaterialNo && z.BindStatus == CommonStatus.ENABLE); // // 托盘与库位关系 // var wmsContainerPlace = new WmsContainerPlace() // { // PlaceId = wmsPlace.Id, // PlaceCode = wmsPlace.PlaceCode, // ContainerId = wmsContainer.Id, // ContainerCode = wmsContainer.ContainerCode, // ContainerPlaceStatus = CommonStatus.ENABLE // }; // await _wmsContainerPlaceRep.InsertAsync(wmsContainerPlace); // // 添加库存 // var StockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode // && p.MaterialNo == wmsOrderDetails.MaterialNo && p.MaterialBatch == wmsOrderDetails.Batch).FirstOrDefaultAsync(); // if (StockModel != null) // { // StockModel.MaterialDensity = wmsOrderDetails.MaterialDensity; // StockModel.PlaceCode = wmsTask.ToPlace; // StockModel.AreaId = wmsPlace.AreaId; // StockModel.StockNumber = wmsOrderDetails.OrderQuantity; // await _wmsMaterialStockRep.UpdateAsync(StockModel); // } // else // { // StockModel = new WmsMaterialStock() // { // MaterialNo = wmsOrderDetails.MaterialNo, // MaterialType = wmsOrderDetails.MaterialType, // MaterialName = "N/A", // Long = wmsOrderDetails.Long, // Wide = wmsOrderDetails.Wide, // High = wmsOrderDetails.High, // MaterialSpec = wmsOrderDetails.Long + "*" + wmsOrderDetails.Wide + "*" + wmsOrderDetails.High, // MaterialBatch = wmsOrderDetails.Batch, // MaterialDensity = wmsOrderDetails.MaterialDensity, // //InspectionMethod = item.WmsMaterial.InspectionMethod, // //UnitType = item.WmsMaterial.UnitType, // //UnitNo = item.WmsMaterial.UnitNo, // StockNumber = wmsOrderDetails.OrderQuantity, // PlaceCode = wmsTask.ToPlace, // ContainerId = wmsContainer.Id, // ContainerCode = wmsContainer.ContainerCode, // AreaId = wmsPlace.AreaId, // }; // await _wmsMaterialStockRep.InsertAsync(StockModel); // } // } // else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务 // { // var taskStatusList = new List { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ }; // if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!"); // // 查询托盘信息 // var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode); // if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!"); // // 查询库位信息 // var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace); // if (wmsPlace == null) throw Oops.Oh("库位信息不存在!"); // // 查询托盘与库位的关系 // var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == wmsPlace.Id && z.PlaceCode == wmsPlace.PlaceCode // && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE); // if (wmsContainerPlace != null) // { // // 禁用托盘库位关系 // wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED; // await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace); // } // // 根据任务表中的单据明细Id查询单据明细信息 // var wmsOrderDetails = await _wmsOrderDetailsRep.FirstOrDefaultAsync(z => z.Id == wmsTask.OrderDetailsId); // wmsTask.TaskStatus = TaskStatusEnum.ZHIXINGZHONG; // wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.ZX_RGV; // wmsTask.IsRead = false; // await _wmsTaskRep.UpdateAsync(wmsTask); // // 查询是否已存在物料与托盘关系 // var wmsMaterialContainer = await _wmsMaterialContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode // && z.MaterialNo == wmsOrderDetails.MaterialNo && z.BindStatus == CommonStatus.ENABLE); // //入库时组盘信息逻辑删除 // if (wmsMaterialContainer != null) // { // wmsMaterialContainer.BindStatus = CommonStatus.DELETED; // await _wmsMaterialContainerRep.UpdateAsync(wmsMaterialContainer); // //新增出库绑定记录 正常 // var enable = new WmsMaterialContainer() // { // ContainerId = wmsContainer.Id, // ContainerCode = wmsContainer.ContainerCode, // MaterialId = YitIdHelper.NextId(), //系统生成的Id // MaterialName = "N/A", // MaterialNo = wmsMaterialContainer.MaterialNo, // MaterialBatch = wmsMaterialContainer.MaterialBatch, // MaterialDensity = wmsMaterialContainer.MaterialDensity, // MaterialSpec = wmsOrderDetails.Long + "*" + wmsOrderDetails.Wide + "*" + wmsOrderDetails.High, // BindQuantity = 1, //一个库位只有一个物料 // OrderNo = wmsMaterialContainer.OrderNo, // OrderDetailsId = wmsMaterialContainer.OrderDetailsId, // BindStatus = CommonStatus.ENABLE // }; // await _wmsMaterialContainerRep.InsertAsync(enable); // } // //更新库存 // var stockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.PlaceCode == wmsTask.SourcePlace // && p.MaterialNo == wmsOrderDetails.MaterialNo && p.MaterialBatch == wmsOrderDetails.Batch).FirstOrDefaultAsync(); // if (stockModel != null) // { // await _wmsMaterialStockRep.DeleteAsync(stockModel); // } // // 更新库位状态为“空闲” // wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN; // await _wmsPlaceRep.UpdateAsync(wmsPlace); // //更新托盘状态为“空闲” // wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN; // await _wmsContainerRep.UpdateAsync(wmsContainer); // } // else //移库任务 // { // var taskStatusList = new List { TaskDodeviceStatusEnum.ZX_DDJ, TaskDodeviceStatusEnum.WC_DDJ }; // if (!taskStatusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行,堆垛机完成才能强制完成!"); // // 查询托盘 // var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode); // if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!"); // wmsTask.TaskStatus = TaskStatusEnum.WANCHENG; // wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.W; // wmsTask.IsRead = false; // // 起点库位信息 // var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync(); // SourcePlace.PlaceStatus = PlaceStatus.KONGXIAN; // await _wmsPlaceRep.UpdateAsync(SourcePlace); // //目标库位信息 // var ToPlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.ToPlace).FirstOrDefaultAsync(); // ToPlace.PlaceStatus = PlaceStatus.CUNHUO; // await _wmsPlaceRep.UpdateAsync(ToPlace); // //托盘库位关系表 // var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == SourcePlace.Id && z.PlaceCode == SourcePlace.PlaceCode // && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE); // wmsContainerPlace.ContainerPlaceStatus = CommonStatus.DELETED; // await _wmsContainerPlaceRep.UpdateAsync(wmsContainerPlace); // await _wmsContainerPlaceRep.InsertAsync(new WmsContainerPlace() // { // PlaceId = ToPlace.Id, // PlaceCode = ToPlace.PlaceCode, // ContainerId = wmsContainer.Id, // ContainerCode = wmsContainer.ContainerCode, // ContainerPlaceStatus = CommonStatus.ENABLE // }); // //库存库位更新 // var stockModel = await _wmsMaterialStockRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.PlaceCode == SourcePlace.PlaceCode).FirstOrDefaultAsync(); // if (stockModel != null) // { // stockModel.PlaceCode = ToPlace.PlaceCode; // } // } //} /// /// 取消任务 /// /// [HttpPost("CancelTask")] [UnitOfWork] [AllowAnonymous] public async Task CancelTask([FromBody] FinishTaskInput input) { var wmsTask = await _wmsTaskRep.FirstOrDefaultAsync(u => u.TaskNo == input.TaskNo); if (wmsTask == null) throw Oops.Oh("任务不存在!"); if (wmsTask.TaskStatus == TaskStatusEnum.WANCHENG) throw Oops.Oh("任务已完成,取消失败!"); if (wmsTask.TaskType == TaskType.RUKU) // 入库任务 { //var statusList = new List {TaskDodeviceStatusEnum.ZX_RSSX, TaskDodeviceStatusEnum.WC_RSSX,TaskDodeviceStatusEnum.WZX }; //if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有入库输送线执行,入库输送线完成或者设备未执行才能强制取消!"); //更新单据明细状态为未执行、更新托盘编号、更新库位编号 var wmsOrderDetails = await _wmsOrderDetailsRep.Where(z => z.Id == wmsTask.OrderDetailsId).ProjectToType().FirstOrDefaultAsync(); if (wmsOrderDetails != null) { wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WEIZHIXING; await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails); } //查询库位 var wmsPlace = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == wmsTask.ToPlace && u.WmsArea.WorkShopType == LesWorkShopType.FAPAOCHEJIAN).ProjectToType().FirstOrDefaultAsync(); if (wmsPlace != null) { // 更新库位状态为空闲 wmsPlace.PlaceStatus = PlaceStatus.KONGXIAN; await _wmsPlaceRep.UpdateAsync(wmsPlace); } var materialContainer = await _wmsMaterialContainerRep.Where(p => p.ContainerCode == wmsTask.ContainerCode && p.BindStatus == CommonStatus.ENABLE).FirstOrDefaultAsync(); if (materialContainer != null) { await _wmsMaterialContainerRep.DeleteNowAsync(materialContainer); } // 查询托盘 var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode); if (wmsContainer != null) { wmsContainer.ContainerStatus = ContainerStatus.KOUXIAN; await _wmsContainerRep.UpdateAsync(wmsContainer); } // 更新任务状态 wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING; wmsTask.IsRead = false; wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX; wmsTask.ToPlace = ""; await _wmsTaskRep.UpdateAsync(wmsTask); } else if (wmsTask.TaskType == TaskType.CHUKU) //出库任务 { var statusList = new List { TaskDodeviceStatusEnum.WZX, TaskDodeviceStatusEnum.ZX_DDJ }; if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行中或设备未执行才能强制取消!"); // 查询库位信息 var wmsPlace = await _wmsPlaceRep.FirstOrDefaultAsync(u => u.PlaceCode == wmsTask.SourcePlace); if (wmsPlace == null) throw Oops.Oh("库位信息不存在!"); // 查询托盘与库位的关系 var wmsContainerPlace = await _wmsContainerPlaceRep.FirstOrDefaultAsync(z => z.PlaceId == wmsPlace.Id && z.PlaceCode == wmsPlace.PlaceCode && z.ContainerCode == wmsTask.ContainerCode && z.ContainerPlaceStatus == CommonStatus.ENABLE); if (wmsContainerPlace == null) throw Oops.Oh("库位容器关系不存在!"); // 根据任务表中的单据明细Id查询单据明细信息 var wmsOrderDetails = await _wmsOrderDetailsRep.FirstOrDefaultAsync(z => z.Id == wmsTask.OrderDetailsId); //修改单据明细,任务状态,设备任务状态为未执行 wmsOrderDetails.OrderStatus = OrderDetailsStatusEnum.WEIZHIXING; await _wmsOrderDetailsRep.UpdateNowAsync(wmsOrderDetails); wmsTask.TaskStatus = TaskStatusEnum.WEIZHIXING; wmsTask.TaskDodeviceStatus = TaskDodeviceStatusEnum.WZX; await _wmsTaskRep.UpdateAsync(wmsTask); // 更新库位状态为存货 wmsPlace.PlaceStatus = PlaceStatus.CUNHUO; await _wmsPlaceRep.UpdateAsync(wmsPlace); } else //移库任务 { var statusList = new List { TaskDodeviceStatusEnum.WZX, TaskDodeviceStatusEnum.ZX_DDJ }; if (!statusList.Contains(wmsTask.TaskDodeviceStatus)) throw Oops.Oh("只有堆垛机执行中,设备未执行才能强制取消!"); // 查询托盘 var wmsContainer = await _wmsContainerRep.FirstOrDefaultAsync(z => z.ContainerCode == wmsTask.ContainerCode); if (wmsContainer == null) throw Oops.Oh("托盘信息不存在!"); //删除任务 await _wmsTaskRep.DeleteAsync(wmsTask); // 起点库位信息 var SourcePlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.SourcePlace).FirstOrDefaultAsync(); SourcePlace.PlaceStatus = PlaceStatus.CUNHUO; await _wmsPlaceRep.UpdateAsync(SourcePlace); //目标库位信息 var ToPlace = await _wmsPlaceRep.Where(z => z.PlaceCode == wmsTask.ToPlace).FirstOrDefaultAsync(); ToPlace.PlaceStatus = PlaceStatus.KONGXIAN; await _wmsPlaceRep.UpdateAsync(ToPlace); } } /// /// wcs读取接口判断物料是否组盘出库 true代表已经组盘出库 /// /// [HttpGet("CheckPack")] [AllowAnonymous] [NonAction] public async Task CheckPack() { var packList = await _lesPackWarehouseRep.Where(p => p.LesPackState == LesPackState.WEICHUKU).Select(n => n.OrderNo).Distinct().ToListAsync(); if (packList.Count >= 2) return false; else return true; } /// /// 设备报警信息 /// /// [HttpPost("AddDeviceWaring")] [AllowAnonymous] [NonAction] public async Task AddDeviceWaring(AddDeviceWaringInput input) { //判断wcsid是否存在 var lesDeviceWaring = await _lesDeviceWaringRep.FirstOrDefaultAsync(u => u.WcsId == input.WcsId); if (lesDeviceWaring != null) { await _lesDeviceWaringRep.UpdateAsync(lesDeviceWaring); } else { lesDeviceWaring = input.Adapt(); await _lesDeviceWaringRep.InsertAsync(lesDeviceWaring); } } #region 公用方法 /// /// 根据巷道获取外侧第一排 /// /// /// [NonAction] public int GetOneRowByAisle(int Aisle) { if (Aisle >= 7) { return 1; } return (Aisle - 1) * 4 + 1; } /// /// 根据巷道获取内侧第二排 /// /// /// [NonAction] public int GetTwoRowByAisle(int Aisle) { if (Aisle >= 7) { return 2; } return (Aisle - 1) * 4 + 2; } /// /// 根据巷道获取外侧第二排 /// /// /// [NonAction] public int GetThreeRowByAisle(int Aisle) { if (Aisle >= 7) { return 3; } return (Aisle - 1) * 4 + 3; } /// /// 根据巷道获取外侧第一排 /// /// /// [NonAction] public int GetFourRowByAisle(int Aisle) { if (Aisle >= 7) { return 4; } return (Aisle - 1) * 4 + 4; } #endregion } }