using System; using System.Collections.Generic; using System.Linq; using Infrastructure; using WebRepository; namespace WebApp { /// <summary> /// 堆垛机运行节点接口App /// </summary> public partial class IStackerStatusApp : ApiApp { public IRepository<ReceiptHeader> _apprh; public IRepository<Container> _appc; public IRepository<ReceiptDetail> _apprd; public IRepository<Inventory> _appi; private object obj = new object(); public IStackerStatusApp(IUnitWork unitWork, IRepository<Inventory> inventory, IRepository<Container> Container, IAuth auth, BaseDBContext context, IRepository<ReceiptDetail> receiptDetail, IRepository<ReceiptHeader> receiptHeader) : base(unitWork, auth, context) { _apprd = receiptDetail; _apprh = receiptHeader; _appi = inventory; _appc = Container; //系统字段赋值 _apprd._loginInfo = _apprh._loginInfo = _loginInfo; _appi._loginInfo = _apprh._loginInfo = _loginInfo; _appc._loginInfo = _apprh._loginInfo = _loginInfo; } public Response<TaskDetail> SetStackerStatus(STKStatusModel sTKStatusModel) { using (var tran = _context.Database.BeginTransaction()) { Response<TaskDetail> Response = new Response<TaskDetail>(); try { TaskDetail td = null; if (sTKStatusModel.Status == 30) { td = _unitWork.FindSingle<TaskDetail>(u => u.TaskNo == sTKStatusModel.TaskNo && u.Status >= TaskStatus.新建任务 && u.Status < TaskStatus.已经完成); } else if (sTKStatusModel.Status == 40) { td = _unitWork.FindSingle<TaskDetail>(u => u.TaskNo == sTKStatusModel.TaskNo && u.Status >= TaskStatus.新建任务 && u.Status < TaskStatus.已经完成); } //WCS回库 货物到Rgv上给一次反馈站台占用解除 else if (sTKStatusModel.Status == 10) { td = _unitWork.FindSingle<TaskDetail>(u => u.TaskNo == sTKStatusModel.TaskNo && u.Status >= TaskStatus.新建任务 && u.Status < TaskStatus.已经完成); if (td == null) { Response.Message = "重发"; return Response; } Station station = _unitWork.Find<Station>(n => n.Code == td.SourceLocation && n.Containercode == td.ContainerCode).FirstOrDefault(); if (station != null) { station.Containercode = ""; station.UpdateBy = "wms"; station.UpdateTime = DateTime.Now; } else { Response.Message = "重发"; return Response; } _unitWork.Update(station); tran.Commit(); return Response; } //WCS回库仓位高度请求 else if (sTKStatusModel.Status == 20) { td = _unitWork.Find<TaskDetail>(u => u.TaskNo == sTKStatusModel.TaskNo && u.Status >= TaskStatus.新建任务 && u.Status < TaskStatus.已经完成 && (u.TaskType == TaskType.容器回库 || u.TaskType == TaskType.空容器入库)).FirstOrDefault(); StationRoadway stationRoadway = _unitWork.Find<StationRoadway>(n => n.StationCode == td.SourceLocation).FirstOrDefault(); if (stationRoadway == null) { Response.Code = 300; Response.Status = false; Response.Message = "未找到起始站台!"; return Response; } else if (td == null) { Response.Code = 300; Response.Status = false; Response.Message = "未找到回库任务!"; return Response; } else if (_unitWork.IsExist<Location>(n => n.ContainerCode == td.ContainerCode && n.Code == td.DestinationLocation)) { Response.Result = td; Response.Message = "已有仓位!"; return Response; } Location loc = null; while (true) { if (stationRoadway.StationPlace == StationPlace.巷道北面) { loc = _unitWork.Find<Location>(n => n.Status == ContainerStatus.空 && n.IsStop == false && n.MaxHeight >= sTKStatusModel.Height && n.Roadway == stationRoadway.RoadWay && n.ContainerCode == "").OrderBy(y => y.MaxHeight).OrderBy(a => a.Row).FirstOrDefault(); } else if (stationRoadway.StationPlace == StationPlace.巷道南面) { loc = _unitWork.Find<Location>(n => n.Status == ContainerStatus.空 && n.IsStop == false && n.MaxHeight >= sTKStatusModel.Height && n.Roadway == stationRoadway.RoadWay && n.ContainerCode == "").OrderBy(y => y.MaxHeight).OrderByDescending(a => a.Row).FirstOrDefault(); } //更新仓位对应的容器,如果回库分配的不是原仓位则更新仓位且锁定 if (loc == null) { Response.Code = 300; Response.Status = false; Response.Message = "未找到仓位!"; return Response; } else { int i = _unitWork.Update<Location>(n => n.Id == loc.Id && n.Version == loc.Version, n => new Location { Status = LocationStatus.任务锁定中, ContainerCode = td.ContainerCode, UpdateTime = DateTime.Now }); if (i == 1) { break; } } } List<Inventory> inventories = _unitWork.Find<Inventory>(n => n.ContainerCode == td.ContainerCode).ToList(); Container container = _unitWork.Find<Container>(n => n.Code == td.ContainerCode).FirstOrDefault(); if (container == null) { Response.Code = 300; Response.Status = false; Response.Message = "未找到该容器!"; return Response; } else { //更改容器 container.Height = sTKStatusModel.Height; container.LocationCode = loc.Code; container.LocationId = loc.Id; _unitWork.Update(container); } //更新同个容器中其它物料对应新的回库仓位 if (inventories.Count > 0) { foreach (Inventory inv in inventories) { if (inv.LocationCode != loc.Code) { inv.LocationCode = loc.Code; _appi.Update(inv); } } } //更改任务终点 td.DestinationLocation = loc.Code; _unitWork.Update(td); tran.Commit(); Response.Result = td; return Response; } else { Response.Code = 500; Response.Status = false; Response.Message = "不识别的任务状态!"; } if (td != null) { List<TaskDetail> taskDetails = _unitWork.Find<TaskDetail>(u => u.ContainerCode == td.ContainerCode && u.Status > TaskStatus.新建任务 && u.Status < TaskStatus.已经完成).ToList(); if (sTKStatusModel.Status == 30) //堆垛机出库完成容器到达站台 { foreach (TaskDetail t in taskDetails) { if (t.TaskType == TaskType.容器出库 || t.TaskType == TaskType.空容器出库) { t.Status = TaskStatus.已经完成; //更新托盘出库任务为已完成 t.UpdateBy = "wms"; t.UpdateTime = DateTime.Now; _unitWork.Update(t); Task pouttask = _unitWork.FindSingle<Task>(u => u.TaskNo == t.TaskNo); if (pouttask == null) { throw new Exception("任务主表:" + t.TaskNo + "不存在!"); } pouttask.FirstStatus = TaskStatus.已经完成; pouttask.LastStatus = TaskStatus.已经完成; pouttask.UpdateBy = "wms"; pouttask.UpdateTime = DateTime.Now; _unitWork.Update(pouttask); //已完成托盘出库任务迁移至历史任务表 TaskHistory taskHistory = new TaskHistory(); pouttask.CopyTo(taskHistory); taskHistory.Id = null; _unitWork.Add(taskHistory); TaskDetailHistory taskDetailHistory = new TaskDetailHistory(); t.CopyTo(taskDetailHistory); taskDetailHistory.Id = null; _unitWork.Add(taskDetailHistory); //删除已完成的托盘出库任务 _unitWork.Delete(pouttask); _unitWork.Delete(t); } else if (t.TaskType == TaskType.站台到站台) { t.Status = TaskStatus.已经完成; //更新托盘出库任务为已完成 t.UpdateBy = "wms"; t.UpdateTime = DateTime.Now; _unitWork.Update(t); Task pouttask = _unitWork.FindSingle<Task>(u => u.TaskNo == t.TaskNo); if (pouttask == null) { throw new Exception("任务主表:" + t.TaskNo + "不存在!"); } Station stationSource = _unitWork.Find<Station>(n => n.Code == t.SourceLocation).FirstOrDefault(); if (stationSource != null) { if (stationSource.Containercode == td.ContainerCode) { stationSource.Containercode = ""; _unitWork.Update(stationSource); } } pouttask.FirstStatus = TaskStatus.已经完成; pouttask.LastStatus = TaskStatus.已经完成; pouttask.UpdateBy = "wms"; pouttask.UpdateTime = DateTime.Now; _unitWork.Update(pouttask); //已完成托盘出库任务迁移至历史任务表 TaskHistory taskHistory = new TaskHistory(); pouttask.CopyTo(taskHistory); taskHistory.Id = null; _unitWork.Add(taskHistory); TaskDetailHistory taskDetailHistory = new TaskDetailHistory(); t.CopyTo(taskDetailHistory); taskDetailHistory.Id = null; _unitWork.Add(taskDetailHistory); //删除已完成的托盘出库任务 _unitWork.Delete(pouttask); _unitWork.Delete(t); } else if (t.TaskType == TaskType.直接出库) { t.Status = TaskStatus.已经完成; //更新托盘出库任务为已完成 t.UpdateBy = "wms"; t.UpdateTime = DateTime.Now; _unitWork.Update(t); //Station station = _unitWork.Find<Station>(n => n.Code == t.DestinationLocation).FirstOrDefault(); //station.Containercode = ""; //_unitWork.Update(station); //List<Inventory> inventories = _unitWork.Find<Inventory>(n => n.ContainerCode == t.ContainerCode).ToList(); //foreach (Inventory inv in inventories) //{ // _unitWork.Delete(inv); // InventoryTransaction inventoryTransaction = new InventoryTransaction(); // inventoryTransaction.Type = TransactionType.出库; // inventoryTransaction.SourceCode = "AllTaskOut"; // inventoryTransaction.ContainerCode = inv.ContainerCode; // inventoryTransaction.MaterialCode = inv.MaterialCode; // inventoryTransaction.Batch = inv.Batch; // inventoryTransaction.Qty = inv.Qty; // inventoryTransaction.Status = inv.Status; // _unitWork.Add(inventoryTransaction); //} //Container container = _unitWork.Find<Container>(n => n.Code == t.ContainerCode).FirstOrDefault(); //_unitWork.Delete(container); Task pouttask = _unitWork.FindSingle<Task>(u => u.TaskNo == t.TaskNo); if (pouttask == null) { throw new Exception("任务主表:" + t.TaskNo + "不存在!"); } pouttask.FirstStatus = TaskStatus.已经完成; pouttask.LastStatus = TaskStatus.已经完成; pouttask.UpdateBy = "wms"; pouttask.UpdateTime = DateTime.Now; _unitWork.Update(pouttask); //已完成托盘出库任务迁移至历史任务表 TaskHistory taskHistory = new TaskHistory(); pouttask.CopyTo(taskHistory); taskHistory.Id = null; _unitWork.Add(taskHistory); TaskDetailHistory taskDetailHistory = new TaskDetailHistory(); t.CopyTo(taskDetailHistory); taskDetailHistory.Id = null; _unitWork.Add(taskDetailHistory); //删除已完成的托盘出库任务 _unitWork.Delete(pouttask); _unitWork.Delete(t); } else { t.Status = TaskStatus.已经到站台; //更新任务状态为已到达站台 t.UpdateBy = "wms"; t.UpdateTime = DateTime.Now; _unitWork.Update(t); //更新主任务头尾状态 Task task = _context.Set<Task>().AsQueryable().Where(u => u.TaskNo == t.TaskNo).SingleOrDefault(); if (task == null) { throw new Exception("任务主表:" + t.TaskNo + "不存在!"); } // Task task = _unitWork.FindSingle<Task>(u => u.TaskNo == t.TaskNo); TaskDetail tdel = _unitWork.Find<TaskDetail>(u => u.TaskNo == t.TaskNo).OrderBy(a => a.Status).FirstOrDefault();//同一个任务号下面最小的任务状态,包含其它容器的任务,用于更新主任务的尾状态 if (tdel == null) { throw new Exception("任务子表:" + t.TaskNo + "不存在!"); } if (task.FirstStatus < t.Status) { task.FirstStatus = t.Status; } if (task.LastStatus < tdel.Status) { task.LastStatus = tdel.Status; } task.UpdateBy = "wms"; task.UpdateTime = DateTime.Now; _unitWork.Update(task); } } if (td.TaskType == TaskType.直接出库 || td.TaskType == TaskType.空容器出库 || td.TaskType == TaskType.容器出库 || td.TaskType == TaskType.站台到站台) { //托盘出库完成,容器占用站台 Station st = _unitWork.Find<Station>(u => u.Code == td.Station).FirstOrDefault(); Container cont = _unitWork.Find<Container>(n => n.Code == td.ContainerCode).FirstOrDefault(); if (st == null) { throw new Exception("站台:" + td.Station + "不存在!"); } else if (st.IsOccupy == 0 && td.IsOccupy != 1) { st.Containercode = ""; if (cont != null) { _appc.DeleteByTracking(cont); } } else if (st.IsOccupy == 1 && td.IsOccupy != 0) { st.Containercode = td.ContainerCode; cont.Status = "empty"; cont.Height = 0; cont.LocationCode = st.Code; _unitWork.Update(cont); } st.UpdateBy = "wms"; st.UpdateTime = DateTime.Now; _unitWork.Update(st); List<Inventory> inventories = _unitWork.Find<Inventory>(n => n.ContainerCode == td.ContainerCode).ToList(); if (st.Type == StationType.暂存区站台) { foreach (Inventory inv in inventories) { inv.LocationCode = st.Code; _appi.UpdateByTracking(inv); } } else { foreach (Inventory inv in inventories) { _unitWork.Delete(inv); InventoryTransaction inventoryTransaction = new InventoryTransaction(); inventoryTransaction.Type = TransactionType.出库; inventoryTransaction.SourceCode = "AllTaskOut"; inventoryTransaction.ContainerCode = inv.ContainerCode; inventoryTransaction.MaterialCode = inv.MaterialCode; inventoryTransaction.Batch = inv.Batch; inventoryTransaction.Qty = inv.Qty; inventoryTransaction.Status = inv.Status; _unitWork.Add(inventoryTransaction); } } //托盘出库完成,解锁并释放仓位 Location loc = _unitWork.Find<Location>(u => u.Code == td.SourceLocation).FirstOrDefault(); if (loc != null) { _unitWork.Update<Location>(n => n.Id == loc.Id && n.Version == loc.Version, n => new Location { ContainerCode = "", Status = "empty", UpdateBy = "wms", UpdateTime = DateTime.Now }); } } // Response.Result = td; //PP片InStationC03站台补给空栈板逻辑 if ((td.TaskType == TaskType.空容器出库 || td.TaskType == TaskType.站台到站台) && td.DestinationLocation.Contains("ProductStationC0") && td.DestinationLocation != "ProductStationC09") { //判断是否有正在出的InStationC03空栈板任务,InStationC03托盘号是否为空,判断成功补给 if (_unitWork.IsExist<Station>(n => n.Code == "InStationC03" && n.Containercode == "" && n.IsStop == 0) && !_unitWork.IsExist<TaskDetail>(n => n.TaskType == TaskType.空容器出库 && n.DestinationLocation.Contains("ProductStationC0") && n.DestinationLocation != "ProductStationC09")) { var container = (from con in _unitWork.Find<Container>(n => n.Status == ContainerStatus.空 && n.IsLock == 0) join loca in _unitWork.Find<Location>(n => n.Roadway == td.Roadway && n.Status == LocationStatus.空容器) on con.LocationCode equals loca.Code select con).FirstOrDefault(); if (container != null) { //建立容器出库任务 if (!_unitWork.IsExist<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == container.Code)) { int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.DestinationLocation == "InStationC03").Count(); if (ptdcount < 1) { Task ptask = new Task(); TaskDetail ptaskDetail = new TaskDetail(); var taskNo = _apprd.GetTaskNo(TaskNo.空板补充); ptask.TaskNo = taskNo; ptask.OrderCode = taskNo; ptask.BusinessType = BusinessType.出库_其他出库单; ptask.FirstStatus = TaskStatus.待下发任务; ptask.LastStatus = TaskStatus.待下发任务; ptask.CreateTime = DateTime.Now; _unitWork.Add(ptask); ptaskDetail.TaskNo = taskNo; ptaskDetail.OrderCode = taskNo; ptaskDetail.TaskType = TaskType.空容器出库; ptaskDetail.ContainerCode = container.Code; ptaskDetail.SourceLocation = container.LocationCode; ptaskDetail.DestinationLocation = "InStationC03"; ptaskDetail.OderQty = 0; ptaskDetail.ContainerQty = 0; ptaskDetail.HadQty = 0; ptaskDetail.Roadway = td.Roadway; ptaskDetail.Station = "InStationC03"; ptaskDetail.Status = TaskStatus.待下发任务; ptaskDetail.Priority = 0; ptaskDetail.CreateTime = DateTime.Now; _unitWork.Add(ptaskDetail); container.IsLock = 1; _unitWork.Update(container); Location locat = _unitWork.Find<Location>(n => n.Code == container.LocationCode).FirstOrDefault(); _unitWork.Update<Location>(n => n.Id == locat.Id && n.Version == locat.Version, n => new Location { Status = LocationStatus.任务锁定中, }); } } } } } //判断该任务是否为补给InStationC03的任务 else if (td.TaskType == TaskType.空容器出库 && td.DestinationLocation == "InStationC03") { //查询是否已经建立了补给入库站台的任务 TaskDetail tdPP = _unitWork.Find<TaskDetail>(n => n.TaskType == TaskType.站台到站台 && n.Status == TaskStatus.新建任务 && n.SourceLocation == "InStationC03").FirstOrDefault(); if (tdPP != null) { tdPP.Status = TaskStatus.待下发任务; _unitWork.Update(tdPP); } } } else if (sTKStatusModel.Status == 40) //堆垛机入库完成容器到达仓位 { string locationStatus = ContainerStatus.有; foreach (TaskDetail t in taskDetails) { if (t.TaskType == TaskType.容器回库) { //判断是否为木栈板回库 找到对应出库明细任务 if (_unitWork.IsExist<Station>(n => n.Type == StationType.木栈板补给站台w_1 || n.Type == StationType.木栈板补给站台w_2)) { ShipmentDetail shipmentDetail = _unitWork.Find<ShipmentDetail>(n => n.ShipmentCode == t.OrderCode && n.Status == ShipmentHeaderStatus.分配完成).FirstOrDefault(); if (shipmentDetail != null) { var con = (from c in _unitWork.Find<Container>(n => n.IsLock == 0) join i in _unitWork.Find<Inventory>(n => n.MaterialCode == shipmentDetail.MaterialCode && n.Status == InventoryTaskType.无盘点任务) on c.Code equals i.ContainerCode select c).FirstOrDefault(); int ptdcount = _unitWork.Find<TaskDetail>(n => (n.Status >= TaskStatus.新建任务 && n.Status < TaskStatus.已经完成) && n.ContainerCode == con.Code && n.TaskType == TaskType.容器出库).Count(); if (ptdcount < 1) { Station station = _unitWork.Find<Station>(n => n.Type == StationType.木板补给终点站台).FirstOrDefault(); Task ptask = new Task(); TaskDetail ptaskDetail = new TaskDetail(); var taskNo = _apprh.GetTaskNo(TaskNo.空板补充); ptask.TaskNo = taskNo; ptask.OrderCode = taskNo; ptask.BusinessType = BusinessType.出库_其他出库单; ptask.FirstStatus = TaskStatus.待下发任务; ptask.LastStatus = TaskStatus.待下发任务; _unitWork.Add(ptask); ptaskDetail.TaskNo = taskNo; ptaskDetail.OrderCode = taskNo; ptaskDetail.TaskType = TaskType.空容器出库; ptaskDetail.ContainerCode = con.Code; ptaskDetail.SourceLocation = con.LocationCode; if (con.Type == ContainerType.木栈板母板_1) { ptaskDetail.DestinationLocation = _unitWork.Find<Station>(n => n.Type == StationType.木栈板母板补给站台s_1).Select(n => n.Code).ToString(); } else { ptaskDetail.DestinationLocation = _unitWork.Find<Station>(n => n.Type == StationType.木栈板母板补给站台s_2).Select(n => n.Code).ToString(); } ptaskDetail.Station = ptaskDetail.DestinationLocation; ptaskDetail.OderQty = 0; ptaskDetail.ContainerQty = 0; ptaskDetail.HadQty = 0; ptaskDetail.Roadway = int.Parse(_unitWork.Find<Location>(n => n.ContainerCode == con.Code).Select(n => n.Roadway).ToString()); ptaskDetail.Status = TaskStatus.待下发任务; ptaskDetail.Priority = 0; _unitWork.Add(ptaskDetail); Inventory inventory = _unitWork.Find<Inventory>(n => n.ContainerCode == con.Code && n.MaterialCode == shipmentDetail.MaterialCode).FirstOrDefault(); inventory.Qty -= 1; _unitWork.Update(inventory); station.Containercode = con.Code; _unitWork.Update(station); Location Location = _unitWork.Find<Location>(n => n.ContainerCode == con.Code).FirstOrDefault(); _unitWork.Update<Location>(n => n.Id == Location.Id && n.Version == Location.Version, n => new Location { IsStop = true }); Container Container = _unitWork.Find<Container>(n => n.Code == con.Code).FirstOrDefault(); Container.IsLock = 1; _unitWork.Update(Container); shipmentDetail.Status = ShipmentHeaderStatus.回传; _unitWork.Update(shipmentDetail); } } } t.Status = TaskStatus.已经完成; //更新托盘入库任务为已完成 t.UpdateBy = "wms"; t.UpdateTime = DateTime.Now; _unitWork.Update(t); Task pintask = _unitWork.FindSingle<Task>(u => u.TaskNo == t.TaskNo); if (pintask == null) { throw new Exception("任务主表:" + t.TaskNo + "不存在!"); } pintask.FirstStatus = TaskStatus.已经完成; pintask.LastStatus = TaskStatus.已经完成; pintask.UpdateBy = "wms"; pintask.UpdateTime = DateTime.Now; _unitWork.Update(pintask); //已完成的托盘入库任务迁移至历史任务表 TaskHistory taskHistory = new TaskHistory(); pintask.CopyTo(taskHistory); taskHistory.Id = null; _unitWork.Add(taskHistory); TaskDetailHistory taskDetailHistory = new TaskDetailHistory(); t.CopyTo(taskDetailHistory); taskDetailHistory.Id = null; _unitWork.Add(taskDetailHistory); //删除已完成的托盘入库任务 _unitWork.Delete(pintask); _unitWork.Delete(t); } else { t.Status = TaskStatus.已经完成; //更新任务明细状态为已完成 t.UpdateBy = "wms"; t.UpdateTime = DateTime.Now; _unitWork.Update(t); //更新主任务头尾状态 Task task = _context.Set<Task>().AsQueryable().Where(u => u.TaskNo == t.TaskNo).SingleOrDefault(); if (task == null) { throw new Exception("任务主表:" + t.TaskNo + "不存在!"); } // Task task = _unitWork.FindSingle<Task>(u => u.TaskNo == t.TaskNo); TaskDetail tdel = _unitWork.Find<TaskDetail>(u => u.TaskNo == t.TaskNo).OrderBy(a => a.Status).FirstOrDefault();//同一个任务号下面最小的任务状态,包含其它容器的任务,用于更新主任务的尾状态 if (tdel == null) { throw new Exception("任务子表:" + t.TaskNo + "不存在!"); } if (task.FirstStatus < t.Status) { task.FirstStatus = t.Status; } if (task.LastStatus < tdel.Status) { task.LastStatus = tdel.Status; } task.UpdateBy = "wms"; task.UpdateTime = DateTime.Now; _unitWork.Update(task); //已完成的单据任务迁移至历史任务表 if (task.LastStatus == TaskStatus.已经完成) { TaskHistory taskhis = new TaskHistory(); task.CopyTo(taskhis); taskhis.Id = null; _unitWork.Add(taskhis); List<TaskDetail> taskdtls = _context.Set<TaskDetail>().AsQueryable().Where(u => u.TaskNo == task.TaskNo).ToList(); foreach (TaskDetail tdl in taskdtls) { TaskDetailHistory taskdthis = new TaskDetailHistory(); tdl.CopyTo(taskdthis); taskdthis.Id = null; _unitWork.Add(taskdthis); _unitWork.Delete(tdl); } _unitWork.Delete(task); } if (t.TaskType == TaskType.整盘出库 || t.TaskType == TaskType.分拣出库)//出库任务类型 { //更新出库明细状态 ShipmentDetail shipmentDetail = _context.Set<ShipmentDetail>().AsQueryable().Where(u => u.SourceCode == t.SourceCode && u.ShipmentCode == t.OrderCode && u.MaterialCode == t.MaterialCode && t.OderQty == t.HadQty).SingleOrDefault(); // ShipmentDetail shipmentDetail = _unitWork.Find<ShipmentDetail>(u => u.SourceCode == t.SourceCode && u.ShipmentCode == t.OrderCode && u.MaterialCode == t.MaterialCode).FirstOrDefault(); if (shipmentDetail != null) { shipmentDetail.Status = ShipmentHeaderStatus.过账; shipmentDetail.UpdateBy = "wms"; shipmentDetail.UpdateTime = DateTime.Now; _unitWork.Update(shipmentDetail); //更新主出库单头尾状态 // ShipmentHeader shipmentHeader = _unitWork.Find<ShipmentHeader>(u => u.Code == t.OrderCode).FirstOrDefault(); ShipmentHeader shipmentHeader = _context.Set<ShipmentHeader>().AsQueryable().Where(u => u.Code == t.OrderCode).SingleOrDefault(); ShipmentDetail shipdt = _unitWork.Find<ShipmentDetail>(u => u.ShipmentCode == t.OrderCode).OrderBy(a => a.Status).FirstOrDefault(); if (shipmentHeader.FirstStatus < shipmentDetail.Status) { shipmentHeader.FirstStatus = shipmentDetail.Status; } if (shipmentHeader.LastStatus < shipdt.Status) { shipmentHeader.LastStatus = shipdt.Status; } shipmentHeader.UpdateBy = "wms"; shipmentHeader.UpdateTime = DateTime.Now; _unitWork.Update(shipmentHeader); //已完成的出库单据迁移至历史出库单据,暂以过账状态,后期与ERP对接后以回传状态 if (shipmentHeader.LastStatus == ShipmentHeaderStatus.过账) { ShipmentHeaderHistory shipmentHeaderHistory = new ShipmentHeaderHistory(); shipmentHeader.CopyTo(shipmentHeaderHistory); shipmentHeaderHistory.Id = null; _unitWork.Add(shipmentHeaderHistory); List<ShipmentDetail> shipdtls = _context.Set<ShipmentDetail>().AsQueryable().Where(u => u.ShipmentCode == shipmentHeader.Code).ToList(); // List<ShipmentDetail> shipdtls = _unitWork.Find<ShipmentDetail>(u => u.ShipmentCode == shipmentHeader.Code).ToList(); foreach (ShipmentDetail sd in shipdtls) { ShipmentDetailHistory shipmentDetailHistory = new ShipmentDetailHistory(); sd.CopyTo(shipmentDetailHistory); shipmentDetailHistory.Id = null; shipmentDetailHistory.ShipmentId = shipmentHeaderHistory.Id; _unitWork.Add(shipmentDetailHistory); _unitWork.Delete(sd); } _unitWork.Delete(shipmentHeader); } } } else if (t.TaskType == TaskType.整盘入库 || t.TaskType == TaskType.补充入库)//入库任务类型 { //更新入库明细单据状态 ReceiptDetail receiptDetail = _unitWork.Find<ReceiptDetail>(u => u.SourceCode == t.SourceCode && u.ReceiptCode == t.OrderCode && u.MaterialCode == t.MaterialCode && t.OderQty == t.HadQty).FirstOrDefault(); if (receiptDetail != null) { receiptDetail.Status = ReceiptHeaderStatus.过账; receiptDetail.UpdateBy = "wms"; receiptDetail.UpdateTime = DateTime.Now; _apprd.UpdateByTracking(receiptDetail); //更新入库主单据头尾状态 // ReceiptHeader receiptHeader = _unitWork.Find<ReceiptHeader>(u => u.Code == t.OrderCode).FirstOrDefault(); ReceiptHeader receiptHeader = _context.Set<ReceiptHeader>().AsQueryable().Where(u => u.Code == t.OrderCode).SingleOrDefault(); ReceiptDetail recepdt = _unitWork.Find<ReceiptDetail>(u => u.ReceiptCode == t.OrderCode).OrderBy(a => a.Status).FirstOrDefault(); if (receiptHeader.FirstStatus < receiptDetail.Status) { receiptHeader.FirstStatus = receiptDetail.Status; } if (receiptHeader.LastStatus < recepdt.Status) { receiptHeader.LastStatus = recepdt.Status; } receiptHeader.UpdateBy = "wms"; receiptHeader.UpdateTime = DateTime.Now; _apprh.UpdateByTracking(receiptHeader); //已完成的入库单据迁移至历史入库单据,暂以过账状态,后期与ERP对接后以回传状态 if (receiptHeader.LastStatus == ReceiptHeaderStatus.过账) { ReceiptHeaderHistory receiptHeaderHistory = new ReceiptHeaderHistory(); receiptHeader.CopyTo(receiptHeaderHistory); receiptHeaderHistory.Id = null; _unitWork.Add(receiptHeaderHistory); List<ReceiptDetail> recepdtls = _context.Set<ReceiptDetail>().AsQueryable().Where(u => u.ReceiptCode == receiptHeader.Code).ToList(); // List<ReceiptDetail> recepdtls = _unitWork.Find<ReceiptDetail>(u => u.ReceiptCode == receiptHeader.Code).ToList(); foreach (ReceiptDetail rd in recepdtls) { ReceiptDetailHistory receiptDetailHistory = new ReceiptDetailHistory(); rd.CopyTo(receiptDetailHistory); receiptDetailHistory.Id = null; receiptDetailHistory.ReceiptId = receiptHeaderHistory.Id; _unitWork.Add(receiptDetailHistory); _unitWork.Delete(rd); } _unitWork.Delete(receiptHeader); } } } else if (t.TaskType == TaskType.空容器入库) //空容器入库任务类型 { locationStatus = LocationStatus.空容器; } else if (t.TaskType == TaskType.出库查看) { } else if (t.TaskType == TaskType.盘点) { Inventory inventory = _unitWork.Find<Inventory>(n => n.ContainerCode == t.ContainerCode).FirstOrDefault(); List<Inventory> invs = _unitWork.Find<Inventory>(n => n.ContainerCode == inventory.ContainerCode).ToList(); foreach (Inventory inv in invs) { inv.TaskStatus = "cyclecountLock"; _appi.UpdateByTracking(inv); } CyclecountHeader cycher = _unitWork.Find<CyclecountHeader>(n => n.Code == t.OrderCode).FirstOrDefault(); CyclecountDetail cycdel = _unitWork.Find<CyclecountDetail>(n => n.Status == ReceiptHeaderStatus.过账 && n.MaterialCode == t.MaterialCode && n.ContainerCode == t.ContainerCode && n.Code == t.OrderCode).FirstOrDefault(); CyclecountDetail cycdelEnd = _unitWork.Find<CyclecountDetail>(n => n.Code == t.OrderCode && n.Id != cycdel.Id).OrderBy(n => n.Status).FirstOrDefault(); if (cycdel != null) { cycdel.Status = ReceiptHeaderStatus.回传; _unitWork.Update(cycdel); if (cycdelEnd.Status >= cycdel.Status) { cycher.Status = (short)cycdel.Status; _unitWork.Update(cycher); } if (t.OderQty < t.HadQty) { //erp传数据 } else if (t.OderQty > t.HadQty) { //erp传数据 } } } else { throw new Exception("未知任务类型:" + t.TaskType); } } } //清除该托盘占用的站台 //Station s = _unitWork.Find<Station>(n => n.Code == td.SourceLocation && n.Containercode == td.ContainerCode && (td.TaskType == TaskType.容器回库 || td.TaskType == TaskType.空容器入库)).FirstOrDefault(); //if (s != null) //{ // s.Containercode = ""; // _unitWork.Update(s); //} //托盘入库完成,解锁并释放仓位 Location loc = _unitWork.Find<Location>(u => u.Code == td.DestinationLocation).FirstOrDefault(); if (loc == null) { throw new Exception("仓位:" + td.DestinationLocation + "不存在!"); } _unitWork.Update<Location>(n => n.Id == loc.Id && n.Version == loc.Version, n => new Location { ContainerCode = td.ContainerCode, Status = locationStatus, UpdateBy = "wms", UpdateTime = DateTime.Now }); List<Inventory> inventories = _unitWork.Find<Inventory>(n => n.ContainerCode == td.ContainerCode && n.Status != "cyclecountLock").ToList(); //更新同个容器中其它物料对应新的回库仓位 if (inventories.Count > 0) { foreach (Inventory inv in inventories) { if (inv.LocationCode != loc.Code) { inv.LocationCode = loc.Code; } inv.TaskStatus = LocationStatus.有货; _appi.Update(inv); } } //托盘入库完成,解锁并释放容器 Container container = _unitWork.Find<Container>(u => u.Code == td.ContainerCode).FirstOrDefault(); if (container == null) { throw new Exception("容器:" + td.ContainerCode + "不存在!"); } container.LocationCode = td.DestinationLocation; container.IsLock = ContainerLock.未锁; container.UpdateBy = "wms"; container.UpdateTime = DateTime.Now; _unitWork.Update(container); } else { Response.Code = 500; Response.Status = false; Response.Message = "不识别的任务状态!"; } } else { Response.Code = 500; Response.Status = false; Response.Message = "获取任务号错误,未找到此容器的任务!"; } tran.Commit(); } catch (Exception ex) { tran.Rollback(); Response.Code = 500; Response.Status = false; Response.Message = ex.Message; } return Response; } } } }