using Admin.NET.Application.Common.FindEmptyLocationFactory; using Admin.NET.Application.Common; using Furion; using Furion.DatabaseAccessor; using Furion.DatabaseAccessor.Extensions; using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using iWare.Wms.Core; using iWare.Wms.Core.Enum; using Mapster; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using System.Linq.Dynamic.Core; using System.Transactions; using Microsoft.CodeAnalysis; using System.Threading.Tasks; 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; private readonly IRepository _sysUser; private readonly IRepository _wareSite; private readonly IRepository _wareTask; private readonly IRepository _wareTaskSub; private readonly IRepository _wareTaskBak; private readonly IRepository _wareTaskSubBak; private readonly IRepository _v_EmptyLocationRep; private readonly IRepository _inventoryByContainer; private readonly IRepository _wmsContainerType; private readonly IRepository _wareLocationVsContainer; private readonly IRepository _wmsPart; public WmsTaskService( IRepository wmsContainerRep, IRepository wmsMaterialRep, IRepository wmsMaterialContainerRep, IRepository wmsAreaRep, IRepository wmsPlaceRep, IRepository wmsTaskRep, IRepository wmsMaterialStockRep, IRepository wmsContainerPlaceRep, IRepository sysUser, IRepository wareSite, IRepository wareTask, IRepository wareTaskSub, IRepository wareTaskBak, IRepository wareTaskSubBak, IRepository v_EmptyLocationRep, IRepository v_ware_inventory_by_container, IRepository wmsContainerType, IRepository wareLocationVsContainer, IRepository wmsPart ) { _wmsContainerRep = wmsContainerRep; _wmsMaterialRep = wmsMaterialRep; _wmsMaterialContainerRep = wmsMaterialContainerRep; _wmsAreaRep = wmsAreaRep; _wmsPlaceRep = wmsPlaceRep; _wmsTaskRep = wmsTaskRep; _wmsMaterialStockRep = wmsMaterialStockRep; _wmsContainerPlaceRep = wmsContainerPlaceRep; _sysUser = sysUser; _wareSite = wareSite; _wareTask = wareTask; _wareTaskSub = wareTaskSub; _wareTaskBak = wareTaskBak; _wareTaskSubBak = wareTaskSubBak; _v_EmptyLocationRep = v_EmptyLocationRep; _inventoryByContainer = v_ware_inventory_by_container; _wmsContainerType = wmsContainerType; _wareLocationVsContainer = wareLocationVsContainer; _wmsPart = wmsPart; } /// /// 分页查询任务管理 /// /// /// [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); var wmsTasks = await _wareTask.DetachedEntities .Where(!string.IsNullOrEmpty(input.TaskNo), u => EF.Functions.Like(u.TaskNo, $"%{input.TaskNo.Trim()}%")) .Where(input.TaskCategory != null, u => u.TaskCategory == input.TaskCategory) .Where(input.TaskState != null, u => u.TaskState == input.TaskState) .Where(!string.IsNullOrEmpty(input.ContainerCode), u => EF.Functions.Like(u.ContainerCode, $"%{input.ContainerCode.Trim()}%")) .OrderBy(PageInputOrder.OrderBuilder(input)) .ProjectToType() .ToADPagedListAsync(input.PageNo, input.PageSize); return wmsTasks; } /// /// 查看详情 /// /// /// [HttpGet("detail")] public async Task> ManualWare([FromQuery] WmsTaskDetailSearch input) { return await _wareTaskSub.Where(n => n.TaskId == input.Id).ToListAsync(); } /// /// 强制完成 /// /// /// [HttpGet("FinishWare")] public async Task FinishWare([FromQuery] UpdateFinishTaskDto input) { var taskModel = await _wareTask.FirstOrDefaultAsync(p => p.Id == input.Id); if (taskModel == null) { throw Oops.Oh("查询异常"); } taskModel.TaskState = TaskStateEnum.已完成; using (var tran = await _wareTask.Database.BeginTransactionAsync()) { try { await _wareTask.UpdateAsync(taskModel); await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } } /// /// 更改优先级别 /// /// /// [HttpGet("UpdateTasklevel")] [UnifyResult(typeof(object))] public async Task UpdateTasklevel([FromQuery] UpdateTasklevelDto input) { var taskModel = await _wareTask.FirstOrDefaultAsync(p => p.Id == input.Id); if (taskModel.TaskState != TaskStateEnum.未执行) throw Oops.Oh("只有未执行的任务能进行更改优先级别!"); taskModel.TaskPriority = input.TaskPriority; await _wareTask.UpdateAsync(taskModel); return XnRestfulResultProvider.RESTfulResult(); } /// /// 删除任务 /// /// /// [HttpGet("DeleteTask")] public async Task DeleteTask([FromQuery] DeleteTaskDto input) { var taskModel = await _wareTask.FirstOrDefaultAsync(p => p.Id == input.Id); if (taskModel == null) { throw Oops.Oh("查询失败"); } var taskbak = taskModel.Adapt(); var taskSub = await _wareTaskSub.Where(u => u.TaskId == taskModel.Id).ToListAsync(); var tasksubbak = taskSub.Adapt>(); List upcvm = new List(); List upc = new List(); if (taskModel.TaskCategory == TaskCategoryEnum.入库任务) { //更新组盘表 var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync(); if (cvm != null) { cvm.IsLocked = false; cvm.StockStatus = StockStatusEnum.新建; upcvm.Add(cvm); } } else { //更新组盘表 var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync(); if (cvm != null) { cvm.IsLocked = false; cvm.StockStatus = StockStatusEnum.在库; upcvm.Add(cvm); } if (taskModel.MoveFlag == 1) { var cvmMove = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == taskModel.MoveContainerCode).FirstOrDefaultAsync(); if (cvmMove != null) { cvmMove.IsLocked = false; cvmMove.StockStatus = StockStatusEnum.在库; upcvm.Add(cvmMove); } var lvc = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync(); var lvcMove = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareContainerCode == taskModel.MoveContainerCode).FirstOrDefaultAsync(); var container = await _wmsContainerRep.Where(u => u.ContainerCode == taskModel.ContainerCode).FirstOrDefaultAsync(); var containerMove = await _wmsContainerRep.Where(u => u.ContainerCode == taskModel.MoveContainerCode).FirstOrDefaultAsync(); if (lvc != null && container != null) { container.RealLocationCode = lvc.WareLocationCode; upc.Add(container); } if (lvcMove != null && containerMove != null) { containerMove.RealLocationCode = lvcMove.WareLocationCode; upc.Add(containerMove); } } } using (var tran = await _wareTask.Database.BeginTransactionAsync()) { try { await _wareTask.DeleteAsync(taskModel); if (upcvm != null && upcvm.Count > 0) { await _wmsContainerPlaceRep.UpdateAsync(upcvm); } if (taskSub != null && taskSub.Count > 0) { await _wareTaskSub.DeleteAsync(taskSub); } if (taskbak != null) { await _wareTaskBak.InsertAsync(taskbak); } if (tasksubbak != null && tasksubbak.Count > 0) { await _wareTaskSubBak.InsertAsync(tasksubbak); } if (upc != null && upc.Count > 0) { await _wmsContainerRep.UpdateAsync(upc); } await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } //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); } /// /// AGV前置任务创建 /// /// [HttpPost("fronttaskcreate")] [DisableOpLog] public async Task FrontTaskCreate([FromBody] WMSAgvTAskInput input) { if (string.IsNullOrEmpty(input.WareContainerCode)) { throw Oops.Oh("小车号不能为空"); } if (string.IsNullOrEmpty(input.WareLocationCode)) { //throw Oops.Oh("目标库位不能为空"); //如果库位是空的,重新找一下库位 FindEmptyLocationServiceHandle handle = null; handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.物料, _v_EmptyLocationRep, _wmsPlaceRep, _wareTask, _wmsContainerPlaceRep, _wmsContainerRep, _wmsContainerType, _inventoryByContainer, input.WareContainerCode, ""); var emtpyLocation = handle.MainFindEmptyLocation(); if (emtpyLocation == null) { throw Oops.Oh("目前没有空库位存放!"); } input.WareLocationCode = emtpyLocation.PlaceCode; } else { var place = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == input.WareLocationCode).FirstOrDefaultAsync(); if (place == null) { throw Oops.Oh("目标库位不能是" + input.WareLocationCode); } if (place.Islock == YesOrNot.Y) { throw Oops.Oh("目标库位被锁定" + input.WareLocationCode); } var lvc = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareLocationCode == input.WareLocationCode).FirstOrDefaultAsync(); if (lvc != null)//目标有货 { if (lvc.IsEmptyContainer == true) { throw Oops.Oh("配置的目标库位需要移库,请稍等"); } else { throw Oops.Oh("目标库位有货,请处理"); } } //else//目标无货 //{ // if (place.DeepcellNo == (int)DeepcellNoEnum.近伸) // { // //近伸无货看远伸 // var nearplace = await _wmsPlaceRep.Where(u => u.UnionCode == place.UnionCode && u.DeepcellNo == (int)DeepcellNoEnum.远伸).FirstOrDefaultAsync(); // if (nearplace == null)//无远伸 // { // //throw Oops.Oh("目标库位不能是" + input.WareLocationCode); // input.WareLocationCode = place.PlaceCode; // } // else // { // var lvctemp = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareLocationCode == input.WareLocationCode).FirstOrDefaultAsync(); // if (lvctemp != null)//远伸有货就不改 // { // if (lvctemp.IsEmptyContainer == true) // { // throw Oops.Oh("配置的目标库位需要移库,请稍后下发"); // } // input.WareLocationCode = place.PlaceCode; // } // else//远伸无货就修改 // { // input.WareLocationCode = nearplace.PlaceCode; // } // } // } // else // { // //远伸无货也不改 // input.WareLocationCode = place.PlaceCode; // } //} input.WareLocationCode = place.PlaceCode; } ////获取登录用户 //var contextUser = App.User; //var userName = contextUser.Claims.Single(x => x.Type == "Account").Value; ////获取登录用户所属线别 //var lineType = await _sysUser.DetachedEntities.Where(u => u.Account == userName).Select(u => u.LineType).FirstOrDefaultAsync(); //if (lineType == null) //{ // lineType = input.LineType; //} //if (lineType == null) //{ // throw Oops.Oh("该登录用户没有配置线别"); //} //验证目标库位是否有货 //通过零件号查找线别 var lineType = await _wmsPart.DetachedEntities.Where(u => u.PartCode == input.PartCode).Select(u => u.LineType).FirstOrDefaultAsync(); var site = await _wareSite.Where(u => u.LineType == lineType).FirstOrDefaultAsync(); if (site == null) { throw Oops.Oh($"线别{lineType}没有配置站台信息"); } var isExist = await _wareTask.AnyAsync(u => /*u.FromLocationCode == site.Code*/u.ContainerCode == input.WareContainerCode); if (isExist) { throw Oops.Oh($"小车{input.WareContainerCode}存在未处理的任务"); } var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == input.WareContainerCode).FirstOrDefaultAsync(); if (cvm == null) { throw Oops.Oh($"小车{input.WareContainerCode}没有组盘"); } if (cvm.StockStatus != StockStatusEnum.新建 && cvm.StockStatus != StockStatusEnum.出库中) { throw Oops.Oh($"小车{input.WareContainerCode}库存状态不对"); } cvm.StockStatus = StockStatusEnum.入库中; var container = await _wmsContainerRep.Where(u => u.ContainerCode == input.WareContainerCode).FirstOrDefaultAsync(); container.RealLocationCode = input.WareLocationCode; WareTask wareTask = new WareTask() { //OrderNo = orderno, TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), TaskCategory = TaskCategoryEnum.入库任务, TaskDescribe = "", TaskPriority = 1, TaskState = (int)TaskStateEnum.未执行, ContainerCode = input.WareContainerCode, //TaskType = (int)TaskTypeEnum.前置输送线任务, FromLocationCode = site.Code, ToLocationCode = input.WareLocationCode, PartCode = input.PartCode //ToLocationCode = "102", //ContainerCode = input.containercode, }; using (var tran = await _wareTask.Database.BeginTransactionAsync()) { try { await _wareTask.InsertAsync(wareTask); await _wmsContainerPlaceRep.UpdateAsync(cvm); await _wmsContainerRep.UpdateAsync(container); await tran.CommitAsync(); } catch (Exception ex) { await tran.RollbackAsync(); throw Oops.Oh(ex.Message); } } return ""; } /// /// AGV前置任务创建,新方法 /// /// [HttpPost("newfronttaskcreate")] [DisableOpLog] [AllowAnonymous] public async Task FrontTaskCreateNew([FromBody] WMSAgvTAskInput input) { if (input.LineType == null) { throw Oops.Oh("用户没有配置线别"); } var site = await _wareSite.Where(u => u.LineType == input.LineType).FirstOrDefaultAsync(); if (site == null) { throw Oops.Oh($"线别{input.LineType}没有配置站台信息"); } //验证该线别是否有任务 var isExist = await _wareTask.DetachedEntities.AnyAsync(u => u.FromLocationCode == site.Code && u.CreatedTime > DateTimeOffset.Now.AddSeconds(-60)); if (isExist) { throw Oops.Oh("60秒内不允许重复下发任务"); } WareTask wareTask = new WareTask() { //OrderNo = orderno, TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), TaskCategory = TaskCategoryEnum.入库任务, TaskDescribe = "", TaskPriority = 1, TaskState = (int)TaskStateEnum.未执行, ContainerCode = "等待识别", FromLocationCode = site.Code, ToLocationCode = "等待识别", PartCode = "等待识别", BeginTime = DateTimeOffset.Now, }; using (var tran = await _wareTask.Database.BeginTransactionAsync()) { try { await _wareTask.InsertAsync(wareTask); await tran.CommitAsync(); } catch (Exception ex) { await tran.RollbackAsync(); throw Oops.Oh(ex.Message); } } return ""; } /// /// 获取移库目标库位 /// /// [HttpGet("getlocation")] [AllowAnonymous] public async Task GetMoveToLocation(string location) { #region //var lvc = await _wareLocationVsContainer.DetachedEntities.Where(x => x.WareLocationCode == location && x.IsDeleted == false).FirstOrDefaultAsync(); ////如果出库库位是远伸,近伸有货,移库操作 //int moveflag = 0; //string movefromlocation = ""; //string movetolocation = ""; //string movecontainercode = ""; //WmsPlace emtpyLocation = null; //List locationsList = new List(); //if (lvc != null) //{ // if (lvc.IsEmptyContainer != null)//查询到有库位与托盘关系 // { // var tempcvms = _wmsContainerPlaceRep.Where(u => u.WareContainerCode == lvc.WareContainerCode).ToList(); // moveflag = 1; // movecontainercode = lvc.WareContainerCode; // movefromlocation = lvc.WareLocationCode; // var locationinfo = _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == lvc.WareLocationCode).FirstOrDefault(); // FindEmptyLocationServiceHandle handle = null; // if ((bool)lvc.IsEmptyContainer) // { // handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.托盘, _v_EmptyLocationRep, // _wmsPlaceRep, // _wareTask, // _wmsContainerPlaceRep, // _wmsContainerRep, // _wmsContainerType, // _inventoryByContainer, // lvc.WareContainerCode, // "HMAX"); // } // else // { // handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.物料, _v_EmptyLocationRep, // _wmsPlaceRep, // _wareTask, // _wmsContainerPlaceRep, // _wmsContainerRep, // _wmsContainerType, // _inventoryByContainer, // lvc.WareContainerCode, // "HMAX"); // } // emtpyLocation = handle.MainFindEmptyLocation(); // if (emtpyLocation == null) // { // throw Oops.Oh("移库任务找不到空库位存放!"); // } // movetolocation = emtpyLocation.PlaceCode; // } // //emtpyLocation.IsLocked = 1; // locationsList.Add(emtpyLocation); // var source = _wmsPlaceRep.Where(u => u.PlaceCode == lvc.WareLocationCode).FirstOrDefault(); // if (source != null) // { // //source.IsLocked = 1; // locationsList.Add(source); // } //} //else //{ // throw Oops.Oh("库位为空,没有需要移库的库存"); //} //using (var scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) //{ // if (locationsList != null && locationsList.Count > 0) // { // await _wmsPlaceRep.UpdateAsync(locationsList); // } // scope.Complete(); //} //return movetolocation; #endregion var vs = await _v_EmptyLocationRep.DetachedEntities.Where(u => u.WareLocationTypeCode == "HMAX").OrderByDescending(u => u.ColumnNo).FirstOrDefaultAsync(); return vs?.PlaceCode; } /// /// 任务完成确认 /// /// [HttpPost("taskcomplete")] [AllowAnonymous] [DisableOpLog] public async Task TaskComplete([FromBody] WMSConfirmInput input) { var taskbak = new WareTaskBak(); var tasksubbaks = new List(); var locations = new List(); var upcvms = new List(); var deletecvms = new List(); var uplvcs = new List(); var deletelvcs = new List(); //var flowRecords = new List(); var insertlvc = new List(); var tasknews = new List(); var task = _wareTask.Where(u => u.Id == input.TaskId).FirstOrDefault(); if (task == null) { throw Oops.Oh($"{input.TaskId},不是正确的任务ID"); } if (task.TaskState != TaskStateEnum.已完成 && task.TaskState != TaskStateEnum.已取消) { throw Oops.Oh("任务状态不是已完成或已取消"); } //保存到历史主任务 taskbak = task.Adapt(); taskbak.FinishedTime = DateTimeOffset.Now; var tasksubs = _wareTaskSub.Where(u => u.TaskId == task.Id).ToList(); foreach (var item in tasksubs) { //保存到历史子任务 var temp = item.Adapt(); tasksubbaks.Add(temp); } if (task.TaskCategory == TaskCategoryEnum.前置AGV任务) { var container = await _wmsContainerRep.DetachedEntities.Where(u => u.ContainerCode == input.ContainerCode).FirstOrDefaultAsync(); if (container == null) { throw Oops.Oh("托盘没有配置基础信息"); } var containerType = await _wmsContainerType.DetachedEntities.Where(u => u.WareContainerTypeCode == container.ContainerTypeCode).FirstOrDefaultAsync(); if (containerType == null) { throw Oops.Oh("托盘类型没有配置基础信息"); } bool isEmptyContainer = await _wmsContainerPlaceRep.DetachedEntities.AnyAsync(u => u.WareContainerCode == input.ContainerCode); #region 入库查找入库的空库位 var WareLocationCode = ""; WmsPlace emtpyLocation = null; FindEmptyLocationServiceHandle handle = null; if (isEmptyContainer) { handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.物料, _v_EmptyLocationRep, _wmsPlaceRep, _wareTask, _wmsContainerPlaceRep, _wmsContainerRep, _wmsContainerType, _inventoryByContainer, input.ContainerCode, ""); } else { handle = FindEmptyLocationServiceFactory.GetHandle(MeterialType.托盘, _v_EmptyLocationRep, _wmsPlaceRep, _wareTask, _wmsContainerPlaceRep, _wmsContainerRep, _wmsContainerType, _inventoryByContainer, input.ContainerCode, ""); } emtpyLocation = handle.MainFindEmptyLocation(); if (emtpyLocation == null) { throw Oops.Oh("目前没有空库位存放!"); } WareLocationCode = emtpyLocation.PlaceCode; #endregion //创建库位与托盘关系表记录 var lvcnew = new WareLocationVsContainer() { WareStorehouseCode = "CK001", //WareRegionCode = wareShelves.RegId, WareLocationCode = WareLocationCode, WareContainerCode = input.ContainerCode, IsEmptyContainer = isEmptyContainer, Status = 0, //Remarks = Enum.Parse(typeof(OrderTypeEnum), orders[0].OrderType).ToString() + "入库" Row = emtpyLocation.RowNo, Lane = emtpyLocation.Line, DeepcellNo = (DeepcellNoEnum)Enum.Parse(typeof(DeepcellNoEnum), emtpyLocation.DeepcellNo.ToString()), UnionCode = emtpyLocation.UnionCode, LocTypeCode = emtpyLocation.WareLocationTypeCode, }; insertlvc.Add(lvcnew); // 创建任务 var tasknew = new WareTask { //OrderNo = input.OrderNo, TaskNo = Yitter.IdGenerator.YitIdHelper.NextId().ToString(), //TaskName = wcsTask.TaskName, //TaskCategory = wcsTask.TaskType, TaskCategory = TaskCategoryEnum.入库任务, TaskDescribe = "", TaskPriority = 99, //TaskState = 0, TaskState = (int)TaskStateEnum.未执行, //TaskType = wcsTask.TaskType, FromLocationCode = "102", ToLocationCode = WareLocationCode, ContainerCode = input.ContainerCode, Lane = emtpyLocation.Line, ContainerType = containerType.PLCTypeId, }; tasknews.Add(tasknew); } else if (task.TaskCategory == TaskCategoryEnum.入库任务) { var emtpyLocation = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == task.ToLocationCode).FirstOrDefaultAsync(); //创建库位与托盘关系表记录 var lvcnew = new WareLocationVsContainer() { WareStorehouseCode = "CK001", //WareRegionCode = wareShelves.RegId, WareLocationCode = emtpyLocation.PlaceCode, WareContainerCode = input.ContainerCode, IsEmptyContainer = false, Status = 0, //Remarks = Enum.Parse(typeof(OrderTypeEnum), orders[0].OrderType).ToString() + "入库" Row = emtpyLocation.RowNo, Lane = emtpyLocation.Line, DeepcellNo = (DeepcellNoEnum)Enum.Parse(typeof(DeepcellNoEnum), emtpyLocation.DeepcellNo.ToString()), UnionCode = emtpyLocation.UnionCode, LocTypeCode = emtpyLocation.WareLocationTypeCode, }; insertlvc.Add(lvcnew); upcvms = _wmsContainerPlaceRep.Where(u => u.WareContainerCode == task.ContainerCode).ToList(); foreach (var cvm in upcvms) { cvm.StockStatus = StockStatusEnum.在库; cvm.IsLocked = false; } } else if (task.TaskCategory == TaskCategoryEnum.出库任务) { foreach (var tasksub in tasksubs) { if (tasksub.TaskType == (int)TaskCategoryEnum.移库任务 && tasksub.TaskSequence == 3) { var lvc = _wareLocationVsContainer.Where(x => x.WareContainerCode == tasksub.ContainerCode && x.WareLocationCode == task.MoveFromLocation).FirstOrDefault(); if (lvc == null) { throw Oops.Oh($"移库任务,托盘{task.ContainerCode},库位{tasksub.SourcePlace},不是正确的库存"); } lvc.WareLocationCode = tasksub.ToPlace; lvc.IsEmptyContainer = true; uplvcs.Add(lvc); var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == tasksub.ContainerCode).FirstOrDefaultAsync(); cvm.StockStatus = StockStatusEnum.在库; upcvms.Add(cvm); } } var dlvc = _wareLocationVsContainer.Where(u => u.WareContainerCode == task.ContainerCode).FirstOrDefault(); if (dlvc == null) { throw Oops.Oh($"出库任务,托盘{task.ContainerCode},库位{task.FromLocationCode},不是正确的库存"); } deletelvcs.Add(dlvc); } else if (task.TaskCategory == TaskCategoryEnum.移库任务) { foreach (var tasksub in tasksubs) { if (tasksub.TaskType == (int)TaskCategoryEnum.移库任务) { var lvc = _wareLocationVsContainer.Where(x => x.WareContainerCode == tasksub.ContainerCode && x.WareLocationCode == tasksub.SourcePlace).FirstOrDefault(); if (lvc == null) { throw Oops.Oh($"移库任务,托盘{task.ContainerCode},库位{tasksub.SourcePlace},不是正确的库存"); } lvc.WareLocationCode = tasksub.ToPlace; lvc.IsEmptyContainer = false; uplvcs.Add(lvc); var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == tasksub.ContainerCode).FirstOrDefaultAsync(); cvm.StockStatus = StockStatusEnum.在库; upcvms.Add(cvm); } } //var dlvc = _wareLocationVsContainer.Where(u => u.WareContainerCode == task.ContainerCode).FirstOrDefault(); //if (dlvc == null) //{ // throw Oops.Oh($"移库任务,托盘{task.ContainerCode},库位{task.FromLocationCode},不是正确的库存"); //} //deletelvcs.Add(dlvc); } using (var tran = await _wmsContainerPlaceRep.Database.BeginTransactionAsync()) { try { //删除任务表 await _wareTask.DeleteAsync(task); foreach (var item in tasksubs) { await _wareTaskSub.DeleteAsync(item); } //新增历史任务表 await _wareTaskBak.InsertAsync(taskbak); if (tasksubbaks != null && tasksubbaks.Count > 0) { await _wareTaskSubBak.InsertAsync(tasksubbaks); } if (upcvms != null && upcvms.Count > 0) { await _wmsContainerPlaceRep.UpdateAsync(upcvms); } if (deletecvms != null && deletecvms.Count > 0) { await _wmsContainerPlaceRep.DeleteAsync(deletecvms); } if (deletelvcs != null && deletelvcs.Count > 0) { await _wareLocationVsContainer.DeleteAsync(deletelvcs); } if (uplvcs != null && uplvcs.Count > 0) { await _wareLocationVsContainer.UpdateAsync(uplvcs); } if (insertlvc != null && insertlvc.Count > 0) { await _wareLocationVsContainer.InsertAsync(insertlvc); } if (tasknews != null && tasknews.Count > 0) { await _wareTask.InsertAsync(tasknews); } await tran.CommitAsync(); } catch { await tran.RollbackAsync(); } } return 1; } /// /// /// /// /// [HttpPost("deletebalance")] [DisableOpLog] public async Task DeleteBalance(WMSConfirmInput input) { var dlvc = await _wareLocationVsContainer.Where(u => u.WareContainerCode == input.ContainerCode && u.WareLocationCode == input.FromLocationCode).FirstOrDefaultAsync(); var cvm = await _wmsContainerPlaceRep.Where(u => u.WareContainerCode == input.ContainerCode).FirstOrDefaultAsync(); if (dlvc != null) { await _wareLocationVsContainer.DeleteAsync(dlvc); } if (cvm != null) { cvm.StockStatus = StockStatusEnum.出库中; cvm.IsLocked = false; await _wmsContainerPlaceRep.UpdateAsync(cvm); } } /// /// /// /// /// [HttpPost("addBalance")] [DisableOpLog] public async Task AddBalance(WMSConfirmInput input) { var loc = await _wmsPlaceRep.DetachedEntities.Where(u => u.PlaceCode == input.FromLocationCode).FirstOrDefaultAsync(); if (loc == null) { throw Oops.Oh($"库位{input.FromLocationCode}没有查询到基础数据"); } var temp = await _wareLocationVsContainer.DetachedEntities.Where(u => u.WareContainerCode == input.ContainerCode || u.WareLocationCode == input.FromLocationCode).FirstOrDefaultAsync(); if (temp != null) { throw Oops.Oh($"库位{temp.WareLocationCode}小车{temp.WareContainerCode}已有库存"); } var container = await _wmsContainerRep.DetachedEntities.Where(u => u.ContainerCode == input.ContainerCode).FirstOrDefaultAsync(); if (container == null) { throw Oops.Oh($"小车{input.ContainerCode}没有查询到基础数据"); } var lvcnew = new WareLocationVsContainer() { WareStorehouseCode = "CK001", //WareRegionCode = wareShelves.RegId, WareLocationCode = input.FromLocationCode, WareContainerCode = input.ContainerCode, IsEmptyContainer = false, Status = 0, //Remarks = Enum.Parse(typeof(OrderTypeEnum), orders[0].OrderType).ToString() + "入库" Row = loc.RowNo, Lane = loc.Line, DeepcellNo = (DeepcellNoEnum)Enum.Parse(typeof(DeepcellNoEnum), loc.DeepcellNo.ToString()), UnionCode = loc.UnionCode, LocTypeCode = loc.WareLocationTypeCode, }; var vs = _wmsContainerPlaceRep.Where(u => u.WareContainerCode == input.ContainerCode).ToList(); foreach (var cvm in vs) { cvm.StockStatus = StockStatusEnum.在库; cvm.IsLocked = false; } await _wareLocationVsContainer.InsertAsync(lvcnew); await _wmsContainerPlaceRep.UpdateAsync(vs); } } }